Full Code of kubernetes/git-sync for AI

master 143de5d90c8b cached
784 files
9.7 MB
2.6M tokens
91090 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (10,304K chars total). Download the full file to get everything.
Repository: kubernetes/git-sync
Branch: master
Commit: 143de5d90c8b
Files: 784
Total size: 9.7 MB

Directory structure:
gitextract_9jhqp98q/

├── .gitallowed
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       └── main.yml
├── .gitignore
├── .golangci.yaml
├── CONTRIBUTING.md
├── Dockerfile.in
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── RELEASING.md
├── SECURITY.md
├── SECURITY_CONTACTS
├── _test_tools/
│   ├── exechook_command.sh
│   ├── exechook_command_fail.sh
│   ├── exechook_command_fail_with_sleep.sh
│   ├── exechook_command_git_archive.sh
│   ├── exechook_command_with_sleep.sh
│   ├── git_askpass.sh
│   ├── git_slow_fetch.sh
│   ├── httpd/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── nginx.conf
│   │   └── run.sh
│   ├── ncsvr/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   └── ncsvr.sh
│   └── sshd/
│       ├── Dockerfile
│       ├── README.md
│       ├── sshd.sh
│       └── sshd_config
├── abspath.go
├── abspath_test.go
├── build/
│   ├── build.sh
│   └── test.sh
├── code-of-conduct.md
├── credential.go
├── demo/
│   ├── README.md
│   ├── deployment.yaml
│   ├── html/
│   │   └── index.html
│   └── service.yaml
├── docs/
│   ├── askpass-url.md
│   ├── cookie-file.md
│   ├── dev/
│   │   └── testing_github_app_auth.md
│   ├── kubernetes.md
│   ├── proxy.md
│   └── ssh.md
├── env.go
├── env_test.go
├── go.mod
├── go.sum
├── main.go
├── main_test.go
├── pkg/
│   ├── cmd/
│   │   └── cmd.go
│   ├── hook/
│   │   ├── exechook.go
│   │   ├── exechook_test.go
│   │   ├── hook.go
│   │   ├── hook_test.go
│   │   ├── webhook.go
│   │   └── webhook_test.go
│   ├── logging/
│   │   └── logging.go
│   ├── pid1/
│   │   └── pid1.go
│   └── version/
│       └── version.go
├── stage_binaries.sh
├── test_e2e.sh
├── test_git.sh
├── tools/
│   ├── go.mod
│   ├── go.sum
│   └── tools.go
├── v3-to-v4.md
└── vendor/
    ├── github.com/
    │   ├── beorn7/
    │   │   └── perks/
    │   │       ├── LICENSE
    │   │       └── quantile/
    │   │           ├── exampledata.txt
    │   │           └── stream.go
    │   ├── cespare/
    │   │   └── xxhash/
    │   │       └── v2/
    │   │           ├── LICENSE.txt
    │   │           ├── README.md
    │   │           ├── xxhash.go
    │   │           ├── xxhash_amd64.go
    │   │           ├── xxhash_amd64.s
    │   │           ├── xxhash_other.go
    │   │           ├── xxhash_safe.go
    │   │           └── xxhash_unsafe.go
    │   ├── go-logr/
    │   │   └── logr/
    │   │       ├── .golangci.yaml
    │   │       ├── CHANGELOG.md
    │   │       ├── CONTRIBUTING.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── discard.go
    │   │       ├── funcr/
    │   │       │   └── funcr.go
    │   │       └── logr.go
    │   ├── golang/
    │   │   └── 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
    │   │       └── ptypes/
    │   │           └── timestamp/
    │   │               └── timestamp.pb.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
    │   ├── matttproud/
    │   │   └── golang_protobuf_extensions/
    │   │       ├── LICENSE
    │   │       ├── NOTICE
    │   │       └── pbutil/
    │   │           ├── .gitignore
    │   │           ├── Makefile
    │   │           ├── decode.go
    │   │           ├── doc.go
    │   │           └── encode.go
    │   ├── prometheus/
    │   │   ├── client_golang/
    │   │   │   ├── LICENSE
    │   │   │   ├── NOTICE
    │   │   │   └── prometheus/
    │   │   │       ├── .gitignore
    │   │   │       ├── README.md
    │   │   │       ├── build_info_collector.go
    │   │   │       ├── collector.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_js.go
    │   │   │       ├── process_collector_other.go
    │   │   │       ├── process_collector_windows.go
    │   │   │       ├── promhttp/
    │   │   │       │   ├── delegator.go
    │   │   │       │   ├── http.go
    │   │   │       │   ├── instrument_client.go
    │   │   │       │   ├── instrument_server.go
    │   │   │       │   └── option.go
    │   │   │       ├── registry.go
    │   │   │       ├── summary.go
    │   │   │       ├── timer.go
    │   │   │       ├── untyped.go
    │   │   │       ├── value.go
    │   │   │       ├── vec.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
    │   │   │   ├── internal/
    │   │   │   │   └── bitbucket.org/
    │   │   │   │       └── ww/
    │   │   │   │           └── goautoneg/
    │   │   │   │               ├── README.txt
    │   │   │   │               └── autoneg.go
    │   │   │   └── model/
    │   │   │       ├── alert.go
    │   │   │       ├── fingerprinting.go
    │   │   │       ├── fnv.go
    │   │   │       ├── labels.go
    │   │   │       ├── labelset.go
    │   │   │       ├── metric.go
    │   │   │       ├── model.go
    │   │   │       ├── signature.go
    │   │   │       ├── silence.go
    │   │   │       ├── time.go
    │   │   │       └── value.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_mipsx.go
    │   │       ├── cpuinfo_others.go
    │   │       ├── cpuinfo_ppcx.go
    │   │       ├── cpuinfo_riscvx.go
    │   │       ├── cpuinfo_s390x.go
    │   │       ├── cpuinfo_x86.go
    │   │       ├── crypto.go
    │   │       ├── doc.go
    │   │       ├── fs.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_ip_socket.go
    │   │       ├── net_protocols.go
    │   │       ├── net_sockstat.go
    │   │       ├── net_softnet.go
    │   │       ├── net_tcp.go
    │   │       ├── net_udp.go
    │   │       ├── net_unix.go
    │   │       ├── net_xfrm.go
    │   │       ├── netstat.go
    │   │       ├── proc.go
    │   │       ├── proc_cgroup.go
    │   │       ├── proc_cgroups.go
    │   │       ├── proc_environ.go
    │   │       ├── proc_fdinfo.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
    │   │       ├── ttar
    │   │       ├── vm.go
    │   │       └── zoneinfo.go
    │   └── spf13/
    │       └── pflag/
    │           ├── .gitignore
    │           ├── .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
    │           ├── 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
    ├── golang.org/
    │   └── x/
    │       └── sys/
    │           ├── AUTHORS
    │           ├── CONTRIBUTORS
    │           ├── LICENSE
    │           ├── PATENTS
    │           ├── internal/
    │           │   └── unsafeheader/
    │           │       └── unsafeheader.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_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
    │           │   ├── bluetooth_linux.go
    │           │   ├── 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
    │           │   ├── epoll_zos.go
    │           │   ├── errors_freebsd_386.go
    │           │   ├── errors_freebsd_amd64.go
    │           │   ├── errors_freebsd_arm.go
    │           │   ├── errors_freebsd_arm64.go
    │           │   ├── fcntl.go
    │           │   ├── fcntl_darwin.go
    │           │   ├── fcntl_linux_32bit.go
    │           │   ├── fdset.go
    │           │   ├── fstatfs_zos.go
    │           │   ├── gccgo.go
    │           │   ├── gccgo_c.c
    │           │   ├── gccgo_linux_amd64.go
    │           │   ├── ifreq_linux.go
    │           │   ├── ioctl.go
    │           │   ├── ioctl_linux.go
    │           │   ├── ioctl_zos.go
    │           │   ├── mkall.sh
    │           │   ├── mkerrors.sh
    │           │   ├── 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
    │           │   ├── str.go
    │           │   ├── syscall.go
    │           │   ├── syscall_aix.go
    │           │   ├── syscall_aix_ppc.go
    │           │   ├── syscall_aix_ppc64.go
    │           │   ├── syscall_bsd.go
    │           │   ├── syscall_darwin.1_12.go
    │           │   ├── syscall_darwin.1_13.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_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_mips64.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
    │           │   ├── 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_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_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
    │           │   ├── zsyscall_aix_ppc.go
    │           │   ├── zsyscall_aix_ppc64.go
    │           │   ├── zsyscall_aix_ppc64_gc.go
    │           │   ├── zsyscall_aix_ppc64_gccgo.go
    │           │   ├── zsyscall_darwin_amd64.1_13.go
    │           │   ├── zsyscall_darwin_amd64.1_13.s
    │           │   ├── zsyscall_darwin_amd64.go
    │           │   ├── zsyscall_darwin_amd64.s
    │           │   ├── zsyscall_darwin_arm64.1_13.go
    │           │   ├── zsyscall_darwin_arm64.1_13.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_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_amd64.go
    │           │   ├── zsyscall_openbsd_arm.go
    │           │   ├── zsyscall_openbsd_arm64.go
    │           │   ├── zsyscall_openbsd_mips64.go
    │           │   ├── 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
    │           │   ├── 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_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_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_illumos_amd64.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_solaris_amd64.go
    │           │   └── ztypes_zos_s390x.go
    │           └── windows/
    │               ├── aliases.go
    │               ├── dll_windows.go
    │               ├── empty.s
    │               ├── env_windows.go
    │               ├── eventlog.go
    │               ├── exec_windows.go
    │               ├── memory_windows.go
    │               ├── mkerrors.bash
    │               ├── mkknownfolderids.bash
    │               ├── mksyscall.go
    │               ├── race.go
    │               ├── race0.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
    ├── google.golang.org/
    │   └── protobuf/
    │       ├── LICENSE
    │       ├── PATENTS
    │       ├── encoding/
    │       │   ├── 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
    │       │   ├── encoding/
    │       │   │   ├── defval/
    │       │   │   │   └── default.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
    │       │   │   ├── is_go112.go
    │       │   │   └── is_go113.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
    │       │   │   ├── source_context_gen.go
    │       │   │   ├── struct_gen.go
    │       │   │   ├── timestamp_gen.go
    │       │   │   ├── type_gen.go
    │       │   │   ├── wrappers.go
    │       │   │   └── wrappers_gen.go
    │       │   ├── impl/
    │       │   │   ├── api_export.go
    │       │   │   ├── checkinit.go
    │       │   │   ├── codec_extension.go
    │       │   │   ├── codec_field.go
    │       │   │   ├── codec_gen.go
    │       │   │   ├── codec_map.go
    │       │   │   ├── codec_map_go111.go
    │       │   │   ├── codec_map_go112.go
    │       │   │   ├── codec_message.go
    │       │   │   ├── codec_messageset.go
    │       │   │   ├── codec_reflect.go
    │       │   │   ├── codec_tables.go
    │       │   │   ├── codec_unsafe.go
    │       │   │   ├── convert.go
    │       │   │   ├── convert_list.go
    │       │   │   ├── convert_map.go
    │       │   │   ├── decode.go
    │       │   │   ├── encode.go
    │       │   │   ├── enum.go
    │       │   │   ├── extension.go
    │       │   │   ├── legacy_enum.go
    │       │   │   ├── legacy_export.go
    │       │   │   ├── legacy_extension.go
    │       │   │   ├── legacy_file.go
    │       │   │   ├── legacy_message.go
    │       │   │   ├── merge.go
    │       │   │   ├── merge_gen.go
    │       │   │   ├── message.go
    │       │   │   ├── message_reflect.go
    │       │   │   ├── message_reflect_field.go
    │       │   │   ├── message_reflect_gen.go
    │       │   │   ├── pointer_reflect.go
    │       │   │   ├── pointer_unsafe.go
    │       │   │   ├── validate.go
    │       │   │   └── weak.go
    │       │   ├── order/
    │       │   │   ├── order.go
    │       │   │   └── range.go
    │       │   ├── pragma/
    │       │   │   └── pragma.go
    │       │   ├── set/
    │       │   │   └── ints.go
    │       │   ├── strs/
    │       │   │   ├── strings.go
    │       │   │   ├── strings_pure.go
    │       │   │   ├── strings_unsafe_go120.go
    │       │   │   └── strings_unsafe_go121.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
    │       │   └── wrappers.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_pure.go
    │       │   │   ├── value_union.go
    │       │   │   ├── value_unsafe_go120.go
    │       │   │   └── value_unsafe_go121.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
    │           │   └── go_features.proto
    │           └── known/
    │               └── timestamppb/
    │                   └── timestamp.pb.go
    └── modules.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitallowed
================================================
xxxyyyzzz


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"


================================================
FILE: .github/workflows/main.yml
================================================
---
name: CI

'on':
  - push
  - pull_request

env:
  GOPROXY: https://proxy.golang.org
  GOPATH: ${{ github.workspace }}/go

permissions:
  contents: read

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Set up go
        uses: actions/setup-go@v6
        with:
          go-version: '1.24.1'

      - uses: actions/checkout@v6
        with:
          path: git-sync

      - name: make all-build
        working-directory: git-sync
        run: |
          make all-build

  test:
    runs-on: ubuntu-latest
    steps:
      - name: Set up go
        uses: actions/setup-go@v6
        with:
          go-version: '1.24.1'

      - uses: actions/checkout@v6
        with:
          path: git-sync

      - name: make test
        working-directory: git-sync
        env:
          SKIP_GITHUB_APP_TEST: true
          #SKIP_GITHUB_APP_TEST: false
          #TEST_GITHUB_APP_APPLICATION_ID: ${{ secrets.TEST_GITHUB_APP_APPLICATION_ID }}
          #TEST_GITHUB_APP_AUTH_TEST_REPO: ${{ secrets.TEST_GITHUB_APP_AUTH_TEST_REPO }}
          #TEST_GITHUB_APP_CLIENT_ID: ${{ secrets.TEST_GITHUB_APP_CLIENT_ID }}
          #TEST_GITHUB_APP_INSTALLATION_ID: ${{ secrets.TEST_GITHUB_APP_INSTALLATION_ID }}
          #TEST_GITHUB_APP_PRIVATE_KEY: ${{ secrets.TEST_GITHUB_APP_PRIVATE_KEY }}
        run: |
          make test

  lint:
    runs-on: ubuntu-latest
    steps:
      - name: Set up go
        uses: actions/setup-go@v6
        with:
          go-version: '1.24.1'

      - uses: actions/checkout@v6
        with:
          path: git-sync

      # We run the github action, even though this is duplicated in `make lint` below.
      # This is because the action gives easier-to-read output than the linter.
      # There is a risk of drift between the two, but this is only linting,
      # not runtime correctness!
      - name: golangci-lint
        uses: golangci/golangci-lint-action@v9
        with:
          working-directory: git-sync
          version: v2.1.0

      - name: make lint
        working-directory: git-sync
        run: |
          make lint


================================================
FILE: .gitignore
================================================
/bin
/.go
/.push-*
/.container-*
/.dockerfile-*
/.buildx-initialized
/.licenses


================================================
FILE: .golangci.yaml
================================================
# This file configures checks that all new code for Kubernetes is meant to
# pass, in contrast to .golangci.yaml which defines checks that also the
# existing code passes.

version: "2"

run:
  timeout: 30m

linters:
  default: all

  enable: # please keep this alphabetized
    - govet
    - ineffassign
    - staticcheck
    - unused
    - gocritic
    - asasalint
    - copyloopvar

  disable:
    - errcheck
    - cyclop
    - depguard
    - dupl
    - err113
    - exhaustruct
    - funcorder
    - funlen
    - gochecknoglobals
    - gochecknoinits
    - gocognit
    - goconst # TODO: turn this one on
    - gocyclo
    - gosec # TODO: turn this one on
    - lll
    - maintidx
    - mnd
    - musttag
    - nestif
    - nlreturn
    - paralleltest
    - perfsprint
    - promlinter
    - recvcheck
    - revive
    - tagliatelle
    - testpackage
    - varnamelen
    - wrapcheck
    - wsl

  settings: # please keep this alphabetized
    staticcheck:
      checks:
        - "all"


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

Welcome to git-sync!

The [Kubernetes community repo](https://github.com/kubernetes/community) contains information about how to get started, how the community organizes, and more.

## Sign the CLA

We'd love to accept your patches, but before we can do that, you must sign the CNCF [Contributor License Agreement](https://git.k8s.io/community/contributors/guide/README.md#sign-the-cla).


## Contributing A Patch

1. Submit an issue describing your proposed change.
2. If your proposal is accepted, and you haven't already done so, sign the Contributor License Agreement (see details above).
3. Fork the repo, develop and test your code changes.  Don't forget tests!
4. Submit a pull request.

## Building container images with *buildx* locally on your computer

First, please read the following article:
[Building Multi-Architecture Docker Images With Buildx](https://medium.com/@artur.klauser/building-multi-architecture-docker-images-with-buildx-27d80f7e2408).

By default the `Makefile` creates a *buildx* builder dedicated to `git-sync` with a container driver. But it won't work out-of-the-box
if you use private container images registries and *pull* private dependencies, with authentication. You can adapt the *buildx* builder
for a local build.

For example, if you've already got a `default` *buildx* builder with a docker driver (with access to the host engine) you can try
to run a build with the following call to `make`:

```sh
docker login $YOUR_PRIVATE_REGISTRY
docker pull $BUILD_IMAGE_IN_PRIVATE_REGISTRY
docker pull $BASEIMAGE_IN_PRIVATE_REGISTRY
make all-container \
       BUILDX_BUILDER_SKIP_CREATION=skip \
       BUILDX_BUILDER_NAME=default \
       BUILD_IMAGE=$BUILD_IMAGE_IN_PRIVATE_REGISTRY \
       BASEIMAGE=$BASEIMAGE_IN_PRIVATE_REGISTRY
```


================================================
FILE: Dockerfile.in
================================================
# Copyright 2016 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# HOW TO USE THIS CONTAINER:
#
# The only commandline argument (or env var) that is really required is
# `--repo` ($GITSYNC_REPO).  Everything else is optional (run this with
# `--man` for details).
#
# This container will run as UID:GID 65533:65533 by default.  For most users,
# the simplest ways to use this container are either:
#   a) use the default UID/GID and mount a volume on /git writeable by those
#   b) set your own UID/GID and mount a volume on /git writeable by those
#
# If you mount a volume anywhere else, you must set `--root` ($GITSYNC_ROOT).
# If you do not mount a volume, this will run but you can't access the results
# (which might be useful for testing, but not much else).
#
# Newly created docker volumes (the very first `docker run -v`) are initialized
# based on the in-image mountpoint's UID/GID?mode, so another solution for
# using this with docker is to set your own UID/GID and also add the default
# GID as a supplemental group (see `docker run --group-add`).
#
# Kubernetes offers `Pod.spec.securityContext.fsGroup` to manage volume
# permissions.
#
# If you set any UID other than the default and want to use git over SSH, you
# should set `--add-user` ($GITSYNC_ADD_USER).

#############################################################################
# First we prepare the image that we want, regardless of build layers.
#############################################################################
FROM {ARG_FROM} AS base

# When building, we can pass a unique value (e.g. `date +%s`) for this arg,
# which will force a rebuild from here (by invalidating docker's cache).
ARG FORCE_REBUILD=0

RUN apt-get -y -qq -o Dpkg::Use-Pty=0 update
RUN apt-get -y -qq -o Dpkg::Use-Pty=0 -y upgrade

RUN apt-get -y -qq -o Dpkg::Use-Pty=0 install --no-install-recommends bash # for the staging scripts and ldd
RUN mkdir -p {ARG_STAGING}
COPY stage_binaries.sh /
RUN /stage_binaries.sh -o {ARG_STAGING} \
	-p base-files \
	-p bash \
	-p ca-certificates \
	-p coreutils \
	-p curl \
	-p git \
	-p gzip \
	-p openssh-client \
	-p socat \
	-p tar \
	-b /bin/grep \
	-b /bin/sed \
	-f /etc/debian_version \
	-f /etc/group \
	-f /etc/nsswitch.conf \
	-f /etc/os-release \
	-f /etc/passwd \
	-f /tmp
RUN ln -s bash {ARG_STAGING}/bin/sh # Not sure why this is not set up automatically

FROM scratch AS intermediate

# Docker doesn't do vars in COPY, so we can't use a regular ARG.
COPY --from=base {ARG_STAGING} /

# This list is not generic - it is specific to git-sync on debian trixie.
RUN rm -rf \
    /usr/share/base-files \
    /usr/share/doc \
    /usr/share/man \
    /usr/lib/*-linux-gnu/gconv \
    /usr/bin/c_rehash \
    /usr/bin/git-shell \
    /usr/bin/openssl \
    /usr/bin/scalar \
    /usr/bin/scp \
    /usr/bin/sftp \
    /usr/bin/ssh-add \
    /usr/bin/ssh-agent \
    /usr/bin/ssh-keygen \
    /usr/bin/ssh-keyscan \
    /usr/lib/git-core/git-shell \
    /usr/bin/openssl \
    /usr/lib/git-core/git-daemon \
    /usr/lib/git-core/git-http-backend \
    /usr/lib/git-core/git-http-fetch \
    /usr/lib/git-core/git-http-push \
    /usr/lib/git-core/git-imap-send \
    /usr/lib/git-core/git-instaweb \
    /usr/lib/git-core/git-sh-i18n--envsubst \
    /usr/lib/git-core/scalar \
    /usr/lib/openssh/ssh-keysign \
    /usr/lib/openssh/ssh-pkcs11-helper \
    /usr/lib/openssh/ssh-sk-helper \
    /usr/share/gitweb \
    /usr/share/locale
RUN rm -f /usr/bin/git && ln -s /usr/lib/git-core/git /usr/bin/git

# Add the default UID to /etc/passwd so SSH is satisfied.
RUN echo "git-sync:x:65533:65533::/tmp:/sbin/nologin" >> /etc/passwd
# A user might choose a different UID and set the `--add-user` flag, which
# needs to be able to write to /etc/passwd.
RUN chmod 0666 /etc/passwd

# Add the default GID to /etc/group for completeness.
RUN echo "git-sync:x:65533:git-sync" >> /etc/group

# Make a directory that can be used to mount volumes.  Setting the mode to
# include group-write allows users to run this image as a different user, as
# long as they use our git-sync group.
RUN mkdir -m 02775 /git && chown 65533:65533 /git

# When building, we can pass a hash of the licenses tree, which docker checks
# against its cache and can force a rebuild from here.
ARG HASH_LICENSES=0

# Add third-party licenses.
COPY .licenses/ /LICENSES/

# When building, we can pass a hash of the binary, which docker checks against
# its cache and can force a rebuild from here.
ARG HASH_BINARY=0

# Add the platform-specific binary.
COPY bin/{ARG_OS}_{ARG_ARCH}/{ARG_BIN} /{ARG_BIN}

#############################################################################
# Now we make a "clean" final image.
#############################################################################
FROM scratch
COPY --from=intermediate / /

# Run as non-root by default.  There's simply no reason to run as root.
USER 65533:65533

# Setting HOME ensures that whatever UID this ultimately runs as can write to
# files like ~/.gitconfig.
ENV HOME=/tmp
WORKDIR /tmp

# Default values for flags.
# Git-sync itself does not default the `--root` ($GITSYNC_ROOT) flag, but we
# can set a default here, which makes the container image easier to use.  The
# permissions were set for the default git-sync UID and GID.  If the user needs
# a different group or sets `--root` ($GITSYNC_ROOT), their values will
# override this, and we assume they are handling permissions themselves.
ENV GITSYNC_ROOT=/git

ENTRYPOINT ["/{ARG_BIN}"]


================================================
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 {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: Makefile
================================================
# Copyright 2016 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# The binary to build (just the basename).
BIN := git-sync

# Where to push the docker image.
REGISTRY ?= gcr.io/k8s-staging-git-sync

# This version-strategy uses git tags to set the version string
VERSION ?= $(shell git describe --tags --always --dirty)
#
# This version-strategy uses a manual value to set the version string
#VERSION ?= 1.2.3

# Set these to cross-compile.
GOOS ?=
GOARCH ?=

# Set this to 1 to build a debugger-friendly binary.
DBG ?=

# These are passed to docker when building and testing.
HTTP_PROXY ?=
HTTPS_PROXY ?=

# Allow some buildx adaptation for local builds
BUILDX_BUILDER_NAME := git-sync
BUILDX_BUILDER_SKIP_CREATION ?=

###
### These variables should not need tweaking.
###

ALL_PLATFORMS := linux/amd64 linux/arm linux/arm64 linux/ppc64le linux/s390x

# Used internally.  Users should pass GOOS and/or GOARCH.
OS := $(if $(GOOS),$(GOOS),$(shell go env GOOS))
ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH))

BASEIMAGE ?= debian:trixie

IMAGE := $(REGISTRY)/$(BIN)
TAG := $(VERSION)
OS_ARCH_TAG := $(TAG)__$(OS)_$(ARCH)

BUILD_IMAGE ?= golang:1.25

DBG_MAKEFILE ?=
ifneq ($(DBG_MAKEFILE),1)
    # If we're not debugging the Makefile, don't echo recipes.
    MAKEFLAGS += -s
endif

# It's necessary to set this because some environments don't link sh -> bash.
SHELL := /usr/bin/env bash -o errexit -o pipefail -o nounset

# We don't need make's built-in rules.
MAKEFLAGS += --no-builtin-rules
# Be pedantic about undefined variables.
MAKEFLAGS += --warn-undefined-variables
.SUFFIXES:

# If you want to build all binaries, see the 'all-build' rule.
# If you want to build all containers, see the 'all-container' rule.
# If you want to build AND push all containers, see the 'all-push' rule.
all: build

# For the following OS/ARCH expansions, we transform OS/ARCH into OS_ARCH
# because make pattern rules don't match with embedded '/' characters.

build-%:
	$(MAKE) build                         \
	    --no-print-directory              \
	    GOOS=$(firstword $(subst _, ,$*)) \
	    GOARCH=$(lastword $(subst _, ,$*))

container-%:
	$(MAKE) container                     \
	    --no-print-directory              \
	    GOOS=$(firstword $(subst _, ,$*)) \
	    GOARCH=$(lastword $(subst _, ,$*))

push-%:
	$(MAKE) push                          \
	    --no-print-directory              \
	    GOOS=$(firstword $(subst _, ,$*)) \
	    GOARCH=$(lastword $(subst _, ,$*))

all-build: $(addprefix build-, $(subst /,_, $(ALL_PLATFORMS)))

all-container: $(addprefix container-, $(subst /,_, $(ALL_PLATFORMS)))

all-push: $(addprefix push-, $(subst /,_, $(ALL_PLATFORMS)))

build: bin/$(OS)_$(ARCH)/$(BIN)

BUILD_DIRS :=             \
    bin/$(OS)_$(ARCH)     \
    bin/tools             \
    .go/bin/$(OS)_$(ARCH) \
    .go/cache

# The following structure defeats Go's (intentional) behavior to always touch
# result files, even if they have not changed.  This will still run `go` but
# will not trigger further work if nothing has actually changed.
OUTBIN = bin/$(OS)_$(ARCH)/$(BIN)
$(OUTBIN): .go/$(OUTBIN).stamp
	true

# This will build the binary under ./.go and update the real binary iff needed.
.PHONY: .go/$(OUTBIN).stamp
.go/$(OUTBIN).stamp: $(BUILD_DIRS)
	echo "making $(OUTBIN)"
	docker run                                                 \
	    -i                                                     \
	    --rm                                                   \
	    -u $$(id -u):$$(id -g)                                 \
	    -v $$(pwd):/src                                        \
	    -w /src                                                \
	    -v $$(pwd)/.go/bin/$(OS)_$(ARCH):/go/bin               \
	    -v $$(pwd)/.go/bin/$(OS)_$(ARCH):/go/bin/$(OS)_$(ARCH) \
	    -v $$(pwd)/.go/cache:/.cache                           \
	    --env HTTP_PROXY=$(HTTP_PROXY)                         \
	    --env HTTPS_PROXY=$(HTTPS_PROXY)                       \
	    $(BUILD_IMAGE)                                         \
	    /bin/sh -c "                                           \
	        ARCH=$(ARCH)                                       \
	        OS=$(OS)                                           \
	        VERSION=$(VERSION)                                 \
	        BUILD_DEBUG=$(DBG)                                 \
	        ./build/build.sh                                   \
	    "
	if ! cmp -s .go/$(OUTBIN) $(OUTBIN); then  \
	    mv .go/$(OUTBIN) $(OUTBIN);            \
	    date >$@;                              \
	fi

# Used to track state in hidden files.
DOTFILE_IMAGE = $(subst /,_,$(IMAGE))-$(OS_ARCH_TAG)

LICENSES = .licenses

$(LICENSES):
	pushd tools >/dev/null;                                       \
	  export GOOS=$(shell go env GOHOSTOS);                       \
	  export GOARCH=$(shell go env GOHOSTARCH);                   \
	  go build -o ../bin/tools/ github.com/google/go-licenses/v2; \
	  popd >/dev/null
	rm -rf $(LICENSES)
	./bin/tools/go-licenses save ./... --save_path=$(LICENSES)
	chmod -R a+rx $(LICENSES)

# Set this to any value to skip repeating the apt-get steps.  Caution.
ALLOW_STALE_APT ?=

container: .container-$(DOTFILE_IMAGE) container-name
.container-$(DOTFILE_IMAGE): bin/$(OS)_$(ARCH)/$(BIN) $(LICENSES) Dockerfile.in .buildx-initialized
	sed                                  \
	    -e 's|{ARG_BIN}|$(BIN)|g'        \
	    -e 's|{ARG_ARCH}|$(ARCH)|g'      \
	    -e 's|{ARG_OS}|$(OS)|g'          \
	    -e 's|{ARG_FROM}|$(BASEIMAGE)|g' \
	    -e 's|{ARG_STAGING}|/staging|g' \
	    Dockerfile.in > .dockerfile-$(OS)_$(ARCH)
	HASH_LICENSES=$$(find $(LICENSES) -type f                    \
	    | xargs md5sum | md5sum | cut -f1 -d' ');                \
	HASH_BINARY=$$(md5sum bin/$(OS)_$(ARCH)/$(BIN)               \
	    | cut -f1 -d' ');                                        \
	FORCE=0;                                                     \
	if [ -z "$(ALLOW_STALE_APT)" ]; then FORCE=$$(date +%s); fi; \
	docker buildx build                                          \
	    --builder "$(BUILDX_BUILDER_NAME)"                       \
	    --build-arg FORCE_REBUILD="$$FORCE"                      \
	    --build-arg HASH_LICENSES="$$HASH_LICENSES"              \
	    --build-arg HASH_BINARY="$$HASH_BINARY"                  \
	    --progress=plain                                         \
	    --load                                                   \
	    --platform "$(OS)/$(ARCH)"                               \
	    --build-arg HTTP_PROXY=$(HTTP_PROXY)                     \
	    --build-arg HTTPS_PROXY=$(HTTPS_PROXY)                   \
	    -t $(IMAGE):$(OS_ARCH_TAG)                               \
	    -f .dockerfile-$(OS)_$(ARCH)                             \
	    .
	docker images -q $(IMAGE):$(OS_ARCH_TAG) > $@

container-name:
	echo "container: $(IMAGE):$(OS_ARCH_TAG)"
	echo

push: .push-$(DOTFILE_IMAGE) push-name
.push-$(DOTFILE_IMAGE): .container-$(DOTFILE_IMAGE)
	docker push $(IMAGE):$(OS_ARCH_TAG)
	docker images -q $(IMAGE):$(OS_ARCH_TAG) > $@

push-name:
	echo "pushed: $(IMAGE):$(OS_ARCH_TAG)"
	echo

# This depends on github.com/estesp/manifest-tool in $PATH.
manifest-list: all-push
	echo "manifest-list: $(REGISTRY)/$(BIN):$(TAG)"
	pushd tools >/dev/null;                                   \
	  export GOOS=$(shell go env GOHOSTOS);                   \
	  export GOARCH=$(shell go env GOHOSTARCH);               \
	  go build -o ../bin/tools github.com/estesp/manifest-tool/v2/cmd/manifest-tool; \
	  popd >/dev/null
	platforms=$$(echo $(ALL_PLATFORMS) | sed 's/ /,/g');  \
	./bin/tools/manifest-tool                             \
	    --username=oauth2accesstoken                      \
	    --password=$$(gcloud auth print-access-token)     \
	    push from-args                                    \
	    --platforms "$$platforms"                         \
	    --template $(REGISTRY)/$(BIN):$(TAG)__OS_ARCH \
	    --target $(REGISTRY)/$(BIN):$(TAG)

release:
	if [ -z "$(TAG)" ]; then        \
		echo "ERROR: TAG must be set"; \
		false;                  \
	fi
	docker pull "$(BUILD_IMAGE)"
	git tag -am "$(TAG)" "$(TAG)"
	make manifest-list

version:
	echo $(VERSION)

test: $(BUILD_DIRS)
	docker run                                                 \
	    -i                                                     \
	    -u $$(id -u):$$(id -g)                                 \
	    -v $$(pwd):/src                                        \
	    -w /src                                                \
	    -v $$(pwd)/.go/bin/$(OS)_$(ARCH):/go/bin               \
	    -v $$(pwd)/.go/bin/$(OS)_$(ARCH):/go/bin/$(OS)_$(ARCH) \
	    -v $$(pwd)/.go/cache:/.cache                           \
	    --env HTTP_PROXY=$(HTTP_PROXY)                         \
	    --env HTTPS_PROXY=$(HTTPS_PROXY)                       \
	    $(BUILD_IMAGE)                                         \
	    /bin/sh -c "                                           \
	        ./build/test.sh ./...                              \
	    "
	VERBOSE=1 ./test_e2e.sh

TEST_TOOLS := $(shell find _test_tools/* -type d -printf "%f ")
test-tools: $(foreach tool, $(TEST_TOOLS), .container-test_tool.$(tool))

.container-test_tool.%: _test_tools/% _test_tools/%/*
	docker build -t $(REGISTRY)/test/$$(basename $<) $<
	docker images -q $(REGISTRY)/test/$$(basename $<) > $@

# Help set up multi-arch build tools.  This assumes you have the tools
# installed.  If you already have a buildx builder available, you don't need
# this.  See https://medium.com/@artur.klauser/building-multi-architecture-docker-images-with-buildx-27d80f7e2408
# for great context.
.buildx-initialized:
	if [ -z "$(BUILDX_BUILDER_SKIP_CREATION)" ]; then docker buildx create --name "$(BUILDX_BUILDER_NAME)" --node git-sync-0 >/dev/null; fi
	docker run --rm --privileged multiarch/qemu-user-static --reset -p yes >/dev/null
	date > $@

$(BUILD_DIRS):
	mkdir -p $@

clean: container-clean bin-clean

container-clean:
	rm -rf .container-* .dockerfile-* .push-* .buildx-initialized $(LICENSES)

bin-clean:
	rm -rf .go bin

lint-golangci-lint:
	go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.1.0 run -v

lint-shellcheck:
	docker run \
	    --rm \
	    -v `pwd`:`pwd` \
	    -w `pwd` \
	    docker.io/koalaman/shellcheck-alpine:v0.9.0 \
	        shellcheck \
	        $$(git ls-files ':!:vendor' '*.sh')

lint: lint-golangci-lint lint-shellcheck


================================================
FILE: OWNERS
================================================
approvers:
- thockin
- stp-ip
- janetkuo
- sdowell


================================================
FILE: README.md
================================================
# NOTE: THIS DOCUMENT COVERS GIT-SYNC v4

This is the "master" branch, which is under development.  If you are looking 
for docs on older (v3) versions of git-sync, you probably want to use the
[v3.x branch](https://github.com/kubernetes/git-sync/tree/release-3.x).

# git-sync

git-sync is a simple command that pulls a git repository into a local
directory, waits for a while, then repeats.  As the remote repository changes,
those changes will be synced locally.  It is a perfect "sidecar" container in
Kubernetes - it can pull files down from a repository so that an application
can consume them.

git-sync can pull one time, or on a regular interval.  It can pull from the
HEAD of a branch, from a git tag, or from a specific git hash.  It will only
re-pull if the referenced target has changed in the upstream repository (e.g. a
new commit on a branch).  It "publishes" each sync through a worktree and a
named symlink.  This ensures an atomic update - consumers will not see a
partially constructed view of the local repository.

git-sync can pull over HTTP(S) (with authentication or not) or SSH.

git-sync can also be configured to make a webhook call or exec a command upon
successful git repo synchronization. The call is made after the symlink is
updated.

## What it produces and why - the contract

git-sync has two required flags: `--repo`, which specifies which remote git
repo to sync, and `--root` which specifies a working directory for git-sync,
which presents an "API" of sorts.

The `--root` directory is _not_ the synced data.

Inside the `--root` directory git-sync stores the synced git state and other
things.  That directory may or may not respond to git commands - it's an
implementation detail.

One of the things in that directory is a symlink (see the `--link` flag) to the
most recently synced data.  This is how the data is expected to be consumed,
and is considered to be the "contract" between git-sync and consumers.  The
exact target of that symlink is an implementation detail, but the leaf
component of the target (i.e. `basename "$(readlink <link>)"`) is the git hash
of the synced revision.  This is also part of the contract.

git-sync looks for changes in the remote repo periodically (see the `--period`
flag) and will attempt to transfer as little data as possible and use as little
disk space as possible (see the `--depth` and `--git-gc` flags), but this is
not part of the contract.

### Why the symlink?

git checkouts are not "atomic" operations.  If you look at the repository while
a checkout is happening, you might see data that is neither exactly the old
revision nor the new.  git-sync "publishes" updates via the symlink to present
an atomic interface to consumers.  When the remote repo has changed, git-sync
will fetch the data _without_ checking it out, then create a new worktree, then
change the symlink to point to that new worktree.

git-sync does not currently have a no-symlink mode.

## Major update: v3.x -> v4.x

git-sync has undergone many significant changes between v3.x and v4.x.  [See
here](v3-to-v4.md) for more details.

## Building it

We use [docker buildx](https://github.com/docker/buildx) to build images.

```
# build the container
make container REGISTRY=registry VERSION=tag
```

```
# build the container behind a proxy
make container REGISTRY=registry VERSION=tag \
    HTTP_PROXY=http://<proxy_address>:<proxy_port> \
    HTTPS_PROXY=https://<proxy_address>:<proxy_port>
```

```
# build the container for an OS/arch other than the current (e.g. you are on
# MacOS and want to run on Linux)
make container REGISTRY=registry VERSION=tag \
    GOOS=linux GOARCH=amd64
```

## Usage

```
# make a directory (owned by you) for the volume
export DIR="/tmp/git-data"
mkdir -p $DIR

# run the container (as your own UID)
docker run -d \
    -v $DIR:/tmp/git \
    -u$(id -u):$(id -g) \
    registry/git-sync:tag \
        --repo=https://github.com/kubernetes/git-sync \
        --root=/tmp/git/root \
        --period=30s

# run an nginx container to serve the content
docker run -d \
    -p 8080:80 \
    -v $DIR:/usr/share/nginx/html \
    nginx
```

### Flags

git-sync has many flags and optional features (see the manual below).  Most of
those flags can be configured through environment variables, but in most cases
(with the obvious exception of passwords) flags are preferred, because the
program can abort if an invalid flag is specified, but a misspelled environment
variable will just be ignored.  We've tried to stay backwards-compatible across
major versions (by accepting deprecated flags and environment variables), but
some things have evolved, and users are encouraged to use the most recent flags
for their major version.

### Volumes

The `--root` flag must indicate either a directory that either a) does not
exist (it will be created); or b) exists and is empty; or c) can be emptied by
removing all of the contents.

Why?  Git really wants an empty directory, to avoid any confusion.  If the
directory exists and is not empty, git-sync will try to empty it by removing
everything in it (we can't just `rm -rf` the dir because it might be a mounted
volume).  If that fails, git-sync will abort.

With the above example or with a Kubernetes `emptyDir`, there is usually no
problem.  The problematic case is when the volume is the root of a filesystem,
which sometimes contains metadata (e.g. ext{2,3,4} have a `lost+found` dir).
The only real solution is to use a sub-directory of the volume as the `--root`.

## More docs

More documentation on specific topics can be [found here](./docs).

## Manual

```
GIT-SYNC

NAME
    git-sync - sync a remote git repository

SYNOPSIS
    git-sync --repo=<repo> --root=<path> [OPTIONS]...

DESCRIPTION

    Fetch a remote git repository to a local directory, poll the remote for
    changes, and update the local copy.

    This is a perfect "sidecar" container in Kubernetes.  For example, it can
    periodically pull files down from a repository so that an application can
    consume them.

    git-sync can pull one time, or on a regular interval.  It can read from the
    HEAD of a branch, from a git tag, or from a specific git hash.  It will only
    re-pull if the target has changed in the remote repository.  When it
    re-pulls, it updates the destination directory atomically.  In order to do
    this, it uses a git worktree in a subdirectory of the --root and flips a
    symlink.

    git-sync can pull over HTTP(S) (with authentication or not) or SSH.

    git-sync can also be configured to make a webhook call upon successful git
    repo synchronization.  The call is made after the symlink is updated.

CONTRACT

    git-sync has two required flags:
      --repo: specifies which remote git repo to sync
      --root: specifies a working directory for git-sync

    The root directory is not the synced data.

    Inside the root directory, git-sync stores the synced git state and other
    things.  That directory may or may not respond to git commands - it's an
    implementation detail.

    One of the things in that directory is a symlink (see the --link flag) to
    the most recently synced data.  This is how the data is expected to be
    consumed, and is considered to be the "contract" between git-sync and
    consumers.  The exact target of that symlink is an implementation detail,
    but the leaf component of the target (i.e. basename "$(readlink <link>)")
    is the git hash of the synced revision.  This is also part of the contract.

    Why the symlink?  git checkouts are not "atomic" operations.  If you look
    at the repository while a checkout is happening, you might see data that is
    neither exactly the old revision nor the new.  git-sync "publishes" updates
    via the symlink to present an atomic interface to consumers.  When the
    remote repo has changed, git-sync will fetch the data _without_ checking it
    out, then create a new worktree, then change the symlink to point to that
    new worktree.

    git-sync looks for changes in the remote repo periodically (see the
    --period flag) and will attempt to transfer as little data as possible and
    use as little disk space as possible (see the --depth and --git-gc flags),
    but this is not part of the contract.

OPTIONS

    Many options can be specified as either a commandline flag or an environment
    variable, but flags are preferred because a misspelled flag is a fatal
    error while a misspelled environment variable is silently ignored.  Some
    options can only be specified as an environment variable.

    --add-user, $GITSYNC_ADD_USER
            Add a record to /etc/passwd for the current UID/GID.  This is
            needed to use SSH with an arbitrary UID.  This assumes that
            /etc/passwd is writable by the current UID.

    --askpass-url <string>, $GITSYNC_ASKPASS_URL
            A URL to query for git credentials.  The query must return success
            (200) and produce a series of key=value lines, including
            "username=<value>" and "password=<value>".

    --cookie-file <string>, $GITSYNC_COOKIE_FILE
            Use a git cookiefile (/etc/git-secret/cookie_file) for
            authentication.

    --credential <string>, $GITSYNC_CREDENTIAL
            Make one or more credentials available for authentication (see git
            help credential).  This is similar to --username and
            $GITSYNC_PASSWORD or --password-file, but for specific URLs, for
            example when using submodules.  The value for this flag is either a
            JSON-encoded object (see the schema below) or a JSON-encoded list
            of that same object type.  This flag may be specified more than
            once.

            Object schema:
              - url:            string, required
              - username:       string, required
              - password:       string, optional
              - password-file:  string, optional

            One of password or password-file must be specified.  Users should
            prefer password-file for better security.

            Example:
              --credential='{"url":"https://github.com", "username":"myname", "password-file":"/creds/mypass"}'

    --depth <int>, $GITSYNC_DEPTH
            Create a shallow clone with history truncated to the specified
            number of commits.  If not specified, this defaults to syncing a
            single commit.  Setting this to 0 will sync the full history of the
            repo.

    --error-file <string>, $GITSYNC_ERROR_FILE
            The path to an optional file into which errors will be written.
            This may be an absolute path or a relative path, in which case it
            is relative to --root.

    --exechook-backoff <duration>, $GITSYNC_EXECHOOK_BACKOFF
            The time to wait before retrying a failed --exechook-command.  If
            not specified, this defaults to 3 seconds ("3s").

    --exechook-command <string>, $GITSYNC_EXECHOOK_COMMAND
            An optional command to be executed after syncing a new hash of the
            remote repository.  This command does not take any arguments and
            executes with the synced repo as its working directory.  The
            $GITSYNC_HASH environment variable will be set to the git hash that
            was synced.  If, at startup, git-sync finds that the --root already
            has the correct hash, this hook will still be invoked.  This means
            that hooks can be invoked more than one time per hash, so they
            must be idempotent.  This flag obsoletes --sync-hook-command, but
            if sync-hook-command is specified, it will take precedence.

    --exechook-timeout <duration>, $GITSYNC_EXECHOOK_TIMEOUT
            The timeout for the --exechook-command.  If not specifid, this
            defaults to 30 seconds ("30s").

    --git <string>, $GITSYNC_GIT
            The git command to run (subject to PATH search, mostly for
            testing).  This defaults to "git".

    --git-config <string>, $GITSYNC_GIT_CONFIG
            Additional git config options in a comma-separated 'key:val'
            format.  The parsed keys and values are passed to 'git config' and
            must be valid syntax for that command.

            Both keys and values can be either quoted or unquoted strings.
            Within quoted keys and all values (quoted or not), the following
            escape sequences are supported:
                '\n' => [newline]
                '\t' => [tab]
                '\"' => '"'
                '\,' => ','
                '\\' => '\'
            To include a colon within a key (e.g. a URL) the key must be
            quoted.  Within unquoted values commas must be escaped.  Within
            quoted values commas may be escaped, but are not required to be.
            Any other escape sequence is an error.

    --git-gc <string>, $GITSYNC_GIT_GC
            The git garbage collection behavior: one of "auto", "always",
            "aggressive", or "off".  If not specified, this defaults to
            "auto".

            - auto: Run "git gc --auto" once per successful sync.  This mode
              respects git's gc.* config params.
            - always: Run "git gc" once per successful sync.
            - aggressive: Run "git gc --aggressive" once per successful sync.
              This mode can be slow and may require a longer --sync-timeout value.
            - off: Disable explicit git garbage collection, which may be a good
              fit when also using --one-time.

    --github-base-url <string>, $GITSYNC_GITHUB_BASE_URL
            The GitHub base URL to use in GitHub requests when GitHub app
            authentication is used. If not specified, defaults to
            https://api.github.com/.

    --github-app-private-key-file <string>, $GITSYNC_GITHUB_APP_PRIVATE_KEY_FILE
            The file from which the private key to use for GitHub app
            authentication will be read.

    --github-app-installation-id <int>, $GITSYNC_GITHUB_APP_INSTALLATION_ID
            The installation ID of the GitHub app used for GitHub app
            authentication.

    --github-app-application-id <int>, $GITSYNC_GITHUB_APP_APPLICATION_ID
            The app ID of the GitHub app used for GitHub app authentication.
            One of --github-app-application-id or --github-app-client-id is required
            when GitHub app authentication is used.

    --github-app-client-id <int>, $GITSYNC_GITHUB_APP_CLIENT_ID
            The client ID of the GitHub app used for GitHub app authentication.
            One of --github-app-application-id or --github-app-client-id is required
            when GitHub app authentication is used.

    --group-write, $GITSYNC_GROUP_WRITE
            Ensure that data written to disk (including the git repo metadata,
            checked out files, worktrees, and symlink) are all group writable.
            This corresponds to git's notion of a "shared repository".  This is
            useful in cases where data produced by git-sync is used by a
            different UID.  This replaces the older --change-permissions flag.

    -?, -h, --help
            Print help text and exit.

    --http-bind <string>, $GITSYNC_HTTP_BIND
            The bind address (including port) for git-sync's HTTP endpoint.
            The '/' URL of this endpoint is suitable for Kubernetes startup and
            liveness probes, returning a 5xx error until the first sync is
            complete, and a 200 status thereafter. If not specified, the HTTP
            endpoint is not enabled.

            Examples:
              ":1234": listen on any IP, port 1234
              "127.0.0.1:1234": listen on localhost, port 1234

    --http-metrics, $GITSYNC_HTTP_METRICS
            Enable metrics on git-sync's HTTP endpoint at /metrics.  Requires
            --http-bind to be specified.

    --http-pprof, $GITSYNC_HTTP_PPROF
            Enable the pprof debug endpoints on git-sync's HTTP endpoint at
            /debug/pprof.  Requires --http-bind to be specified.

    --link <string>, $GITSYNC_LINK
            The path to at which to create a symlink which points to the
            current git directory, at the currently synced hash.  This may be
            an absolute path or a relative path, in which case it is relative
            to --root.  Consumers of the synced files should always use this
            link - it is updated atomically and should always be valid.  The
            basename of the target of the link is the current hash.  If not
            specified, this defaults to the leaf dir of --repo.

    --man
            Print this manual and exit.

    --max-failures <int>, $GITSYNC_MAX_FAILURES
            The number of consecutive failures allowed before aborting.
            Setting this to a negative value will retry forever.  If not
            specified, this defaults to 0, meaning any sync failure will
            terminate git-sync.

    --one-time, $GITSYNC_ONE_TIME
            Exit after one sync.

    $GITSYNC_PASSWORD
            The password or personal access token (see github docs) to use for
            git authentication (see --username).  See also --password-file.

    --password-file <string>, $GITSYNC_PASSWORD_FILE
            The file from which the password or personal access token (see
            github docs) to use for git authentication (see --username) will be
            read.  See also $GITSYNC_PASSWORD.

    --period <duration>, $GITSYNC_PERIOD
            How long to wait between sync attempts.  This must be at least
            10ms.  This flag obsoletes --wait, but if --wait is specified, it
            will take precedence.  If not specified, this defaults to 10
            seconds ("10s").

    --ref <string>, $GITSYNC_REF
            The git revision (branch, tag, or hash) to check out.  If not
            specified, this defaults to "HEAD" (of the upstream repo's default
            branch).

    --repo <string>, $GITSYNC_REPO
            The git repository to sync.  This flag is required.

    --root <string>, $GITSYNC_ROOT
            The root directory for git-sync operations, under which --link will
            be created.  This must be a path that either a) does not exist (it
            will be created); b) is an empty directory; or c) is a directory
            which can be emptied by removing all of the contents.  This flag is
            required.

    --sparse-checkout-file <string>, $GITSYNC_SPARSE_CHECKOUT_FILE
            The path to a git sparse-checkout file (see git documentation for
            details) which controls which files and directories will be checked
            out.  If not specified, the default is to check out the entire repo.

    --ssh-key-file <string>, $GITSYNC_SSH_KEY_FILE
            The SSH key(s) to use when using git over SSH.  This flag may be
            specified more than once and the environment variable will be
            parsed like PATH - using a colon (':') to separate elements.  If
            not specified, this defaults to "/etc/git-secret/ssh".

    --ssh-known-hosts, $GITSYNC_SSH_KNOWN_HOSTS
            Enable SSH known_hosts verification when using git over SSH.  If
            not specified, this defaults to true.

    --ssh-known-hosts-file <string>, $GITSYNC_SSH_KNOWN_HOSTS_FILE
            The known_hosts file to use when --ssh-known-hosts is specified.
            If not specified, this defaults to "/etc/git-secret/known_hosts".

    --stale-worktree-timeout <duration>, $GITSYNC_STALE_WORKTREE_TIMEOUT
            The length of time to retain stale (not the current link target)
            worktrees before being removed. Once this duration has elapsed,
            a stale worktree will be removed during the next sync attempt
            (as determined by --sync-timeout). If not specified, this defaults
            to 0, meaning that stale worktrees will be removed immediately.

    --submodules <string>, $GITSYNC_SUBMODULES
            The git submodule behavior: one of "recursive", "shallow", or
            "off".  If not specified, this defaults to "recursive".

    --sync-on-signal <string>, $GITSYNC_SYNC_ON_SIGNAL
            Indicates that a sync attempt should occur upon receipt of the
            specified signal name (e.g. SIGHUP) or number (e.g. 1). If a sync
            is already in progress, another sync will be triggered as soon as
            the current one completes. If not specified, signals will not
            trigger syncs.

    --sync-timeout <duration>, $GITSYNC_SYNC_TIMEOUT
            The total time allowed for one complete sync.  This must be at least
            10ms.  This flag obsoletes --timeout, but if --timeout is specified,
            it will take precedence.  If not specified, this defaults to 120
            seconds ("120s").

    --touch-file <string>, $GITSYNC_TOUCH_FILE
            The path to an optional file which will be touched whenever a sync
            completes.  This may be an absolute path or a relative path, in
            which case it is relative to --root.

    --username <string>, $GITSYNC_USERNAME
            The username to use for git authentication (see --password-file or
            $GITSYNC_PASSWORD).  If more than one username and password is
            required (e.g. with submodules), use --credential.

    -v, --verbose <int>, $GITSYNC_VERBOSE
            Set the log verbosity level.  Logs at this level and lower will be
            printed.  Logs follow these guidelines:

            - 0: Minimal, just log updates
            - 1: More details about updates
            - 2: Log the sync loop
            - 3: More details about the sync loop
            - 4: More details
            - 5: Log all executed commands
            - 6: Log stdout/stderr of all executed commands
            - 9: Tracing and debug messages

    --version
            Print the version and exit.

    --webhook-backoff <duration>, $GITSYNC_WEBHOOK_BACKOFF
            The time to wait before retrying a failed --webhook-url.  If not
            specified, this defaults to 3 seconds ("3s").

    --webhook-method <string>, $GITSYNC_WEBHOOK_METHOD
            The HTTP method for the --webhook-url.  If not specified, this defaults to "POST".

    --webhook-success-status <int>, $GITSYNC_WEBHOOK_SUCCESS_STATUS
            The HTTP status code indicating a successful --webhook-url.  Setting
            this to 0 disables success checks, which makes webhooks
            "fire-and-forget".  If not specified, this defaults to 200.

    --webhook-timeout <duration>, $GITSYNC_WEBHOOK_TIMEOUT
            The timeout for the --webhook-url.  If not specified, this defaults
            to 1 second ("1s").

    --webhook-url <string>, $GITSYNC_WEBHOOK_URL
            A URL for optional webhook notifications when syncs complete.  The
            header 'Gitsync-Hash' will be set to the git hash that was synced.
            If, at startup, git-sync finds that the --root already has the
            correct hash, this hook will still be invoked.  This means that
            hooks can be invoked more than one time per hash, so they must be
            idempotent.

EXAMPLE USAGE

    git-sync \
        --repo=https://github.com/kubernetes/git-sync \
        --ref=HEAD \
        --period=10s \
        --root=/mnt/git

AUTHENTICATION

    Git-sync offers several authentication options to choose from.  If none of
    the following are specified, git-sync will try to access the repo in the
    "natural" manner.  For example, "https://repo" will try to use plain HTTPS
    and "git@example.com:repo" will try to use SSH.

    username/password
            The --username ($GITSYNC_USERNAME) and $GITSYNC_PASSWORD or
            --password-file ($GITSYNC_PASSWORD_FILE) flags will be used.  To
            prevent password leaks, the --password-file flag or
            $GITSYNC_PASSWORD environment variable is almost always preferred
            to the --password flag, which is deprecated.

            A variant of this is --askpass-url ($GITSYNC_ASKPASS_URL), which
            consults a URL (e.g. http://metadata) to get credentials on each
            sync.

            When using submodules it may be necessary to specify more than one
            username and password, which can be done with --credential
            ($GITSYNC_CREDENTIAL).  All of the username+password pairs, from
            both --username/$GITSYNC_PASSWORD and --credential are fed into
            'git credential approve'.

    SSH
            When an SSH transport is specified, the key(s) defined in
            --ssh-key-file ($GITSYNC_SSH_KEY_FILE) will be used.  Users are
            strongly advised to also use --ssh-known-hosts
            ($GITSYNC_SSH_KNOWN_HOSTS) and --ssh-known-hosts-file
            ($GITSYNC_SSH_KNOWN_HOSTS_FILE) when using SSH.

    cookies
            When --cookie-file ($GITSYNC_COOKIE_FILE) is specified, the
            associated cookies can contain authentication information.

    github app
           When --github-app-private-key-file ($GITSYNC_GITHUB_APP_PRIVATE_KEY_FILE),
           --github-app-application-id ($GITSYNC_GITHUB_APP_APPLICATION_ID) or
           --github-app-client-id ($GITSYNC_GITHUB_APP_CLIENT_ID)
           and --github-app-installation_id ($GITSYNC_GITHUB_APP_INSTALLATION_ID)
           are specified, GitHub app authentication will be used.

           These credentials are used to request a short-lived token which
           is used for authentication. The base URL of the GitHub request made
           to retrieve the token can also be specified via
           --github-base-url ($GITSYNC_GITHUB_BASE_URL), which defaults to
           https://api.github.com/.

           The GitHub app must have sufficient access to the repository to sync.
           It should be installed to the repository or organization containing
           the repository, and given read access (see github docs).

HOOKS

    Webhooks and exechooks are executed asynchronously from the main git-sync
    process.  If a --webhook-url or --exechook-command is configured, they will
    be invoked whenever a new hash is synced, including when git-sync starts up
    and find that the --root directory already has the correct hash.  For
    exechook, that means the command is exec()'ed, and for webhooks that means
    an HTTP request is sent using the method defined in --webhook-method.
    Git-sync will retry both forms of hooks until they succeed (exit code 0 for
    exechooks, or --webhook-success-status for webhooks).  If unsuccessful,
    git-sync will wait --exechook-backoff or --webhook-backoff (as appropriate)
    before re-trying the hook.  Git-sync does not ensure that hooks are invoked
    exactly once, so hooks must be idempotent.

    Hooks are not guaranteed to succeed on every single hash change.  For example,
    if a hook fails and a new hash is synced during the backoff period, the
    retried hook will fire for the newest hash.
```


================================================
FILE: RELEASING.md
================================================
# Cutting a release

## Tags

First, pick the new tag.  Usually this means to see what has already been
tagged, and pick the next release number.

```
git tag --sort version:refname | tail
```

## Log in

Make sure you are logged into Google Cloud (to push to GCR).

```
gcloud auth login
```

## Build and push to staging

To build git-sync you need [docker buildx](https://github.com/docker/buildx).

The following step will build for all platforms and push the container images
to our staging repo (gcr.io/k8s-staging-git-sync).

```
make release TAG="<tag you chose above>"
```

This will produce output like:

```
<...lots of output...>
Successfully tagged gcr.io/k8s-staging-git-sync/git-sync:v3.3.2__linux_amd64
<...lots of output...>
v3.3.2__linux_amd64: digest: sha256:74cd8777ba08c7b725cd2f6de34a638ba50b48cde59f829e1dc982c8c8c9959a size: 951
pushed: gcr.io/k8s-staging-git-sync/git-sync:v3.3.2__linux_amd64
<...lots of output...>
Digest: sha256:853ae812df916e59a7b27516f791ea952d503ad26bc8660deced8cd528f128ae 433
```

Take note of this final sha256.

## Promote the images

Make a PR against
https://github.com/kubernetes/k8s.io to edit the file
k8s.gcr.io/images/k8s-staging-git-sync/images.yaml and add the sha256 and tag
name from above.  For example:

```
 - name: git-sync
   dmap:
+    "sha256:853ae812df916e59a7b27516f791ea952d503ad26bc8660deced8cd528f128ae": ["v3.3.2"]
     "sha256:95bfb980d3b640f6015f0d1ec25c8c0161d0babcf83d31d4c0453dd2b59923db": ["v3.3.1"]
     "sha256:5f3d12cb753c6cd00c3ef9cc6f5ce4e584da81d5210c15653644ece675f19ec6": ["v3.3.0"]
     "sha256:6a543fb2d1e92008aad697da2672478dcfac715e3dddd33801d772da6e70cf24": ["v3.2.2"]
```

When that PR is merged, the promoter bot will copy the images from staging to
the final prod location (e.g. `registry.k8s.io/git-sync/git-sync:v3.3.2`).

## Make a GitHub release

Lastly, make a release through the [github UI](https://github.com/kubernetes/git-sync/releases).
Include all the notable changes since the last release and the final container
image location.  The "Auto-generate release notes" button is a great starting
place.


================================================
FILE: SECURITY.md
================================================
# Security Policy

## Security Announcements

Join the [kubernetes-security-announce] group for security and vulnerability announcements.

You can also subscribe to an RSS feed of the above using [this link][kubernetes-security-announce-rss].

## Reporting a Vulnerability

Instructions for reporting a vulnerability can be found on the
[Kubernetes Security and Disclosure Information] page.

## Supported Versions

Information about supported Kubernetes versions can be found on the
[Kubernetes version and version skew support policy] page on the Kubernetes website.

[kubernetes-security-announce]: https://groups.google.com/forum/#!forum/kubernetes-security-announce
[kubernetes-security-announce-rss]: https://groups.google.com/forum/feed/kubernetes-security-announce/msgs/rss_v2_0.xml?num=50
[Kubernetes version and version skew support policy]: https://kubernetes.io/docs/setup/release/version-skew-policy/#supported-versions
[Kubernetes Security and Disclosure Information]: https://kubernetes.io/docs/reference/issues-security/security/#report-a-vulnerability


================================================
FILE: SECURITY_CONTACTS
================================================
# Defined below are the security contacts for this repo.
#
# They are the contact point for the Product Security Committee to reach out
# to for triaging and handling of incoming issues.
#
# The below names agree to abide by the
# [Embargo Policy](https://git.k8s.io/security/private-distributors-list.md#embargo-policy)
# and will be removed and replaced if they violate that agreement.
#
# DO NOT REPORT SECURITY VULNERABILITIES DIRECTLY TO THESE NAMES, FOLLOW THE
# INSTRUCTIONS AT https://kubernetes.io/security/

thockin
stp-ip


================================================
FILE: _test_tools/exechook_command.sh
================================================
#!/bin/sh
#
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Use for e2e test of --exechook-command.
# This option takes no command arguments, so requires a wrapper script.

if [ -z "${GITSYNC_HASH}" ]; then
    echo "GITSYNC_HASH is not set" > exechook
    exit 1
fi
cat file > exechook
echo "ENVKEY=$ENVKEY" > exechook-env
date >> /var/log/runs


================================================
FILE: _test_tools/exechook_command_fail.sh
================================================
#!/bin/sh
#
# Copyright 2021 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Use for e2e test of --exechook-command.
# This option takes no command arguments, so requires a wrapper script.

date >> /var/log/runs
exit 1


================================================
FILE: _test_tools/exechook_command_fail_with_sleep.sh
================================================
#!/bin/sh
#
# Copyright 2021 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Use for e2e test of --exechook-command.
# This option takes no command arguments, so requires a wrapper script.

sleep 3
date >> /var/log/runs
exit 1


================================================
FILE: _test_tools/exechook_command_git_archive.sh
================================================
#!/bin/sh
#
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Use for e2e test of --exechook-command.
# This option takes no command arguments, so requires a wrapper script.

git archive --format tar.gz --output archive.tgz HEAD


================================================
FILE: _test_tools/exechook_command_with_sleep.sh
================================================
#!/bin/sh
#
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Use for e2e test of --exechook-command.
# This option takes no command arguments, so requires a wrapper script.

sleep 3
cat file > exechook
echo "ENVKEY=$ENVKEY" > exechook-env


================================================
FILE: _test_tools/git_askpass.sh
================================================
#!/bin/bash
#
# Copyright 2019 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT 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 uses the in-container shell which is limited.  For example, it
# does not support the 'pipefail' option.
set -o errexit
set -o nounset

# Ask pass some ops, fail if it mismatched the magic password.
if [[ "$1" == "clone" || "$1" == "ls-remote" || "$1" = "fetch" ]]; then
    # `git credential fill` requires the repo url match to consume the credentials stored by git-sync.
    # Askpass git only support repo started with "file://" which is used in test_e2e.sh.
    REPO=$(echo "$@" | grep -o "file://[^ ]*")
    OUTPUT=$(echo "url=${REPO}" | git credential fill)
    USERNAME=$(echo "${OUTPUT}" | grep "^username=.*")
    PASSWD=$(echo "${OUTPUT}" | grep "^password=.*")
    # Test case must match the magic username and password below.
    if [[ "${USERNAME}" != "username=my-username" || "${PASSWD}" != "password=my-password" ]]; then
        echo "invalid test username/password pair: ${USERNAME}:${PASSWD}"
        exit 1
    fi
fi

git "$@"


================================================
FILE: _test_tools/git_slow_fetch.sh
================================================
#!/bin/sh
#
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


if [ "$1" != "fetch" ]; then
  git "$@"
  exit $?
fi

sleep 2
git "$@"


================================================
FILE: _test_tools/httpd/Dockerfile
================================================
# Copyright 2023 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Stolen from https://github.com/linuxkit/linuxkit/tree/master/pkg/sshd/

FROM alpine AS base

RUN mkdir -p /out/etc/apk && cp -r /etc/apk/* /out/etc/apk/
RUN apk add --no-cache --initdb -p /out \
    alpine-baselayout \
    apk-tools \
    busybox \
    git \
    git-daemon \
    nginx \
    fcgiwrap \
    apache2-utils \
    tini \
    && true

###############

FROM scratch

ENTRYPOINT []
WORKDIR /

COPY --from=base /out/ /

RUN htpasswd -b -c /etc/htpasswd testuser testpass

# Callers should mount a directory with git repos here.
VOLUME /git
# sshd runs as root, and the repo directory might be owned by anyone.
RUN git config --system safe.directory '*'

COPY nginx.conf /etc/nginx/
COPY run.sh /

CMD ["/sbin/tini", "/run.sh"]


================================================
FILE: _test_tools/httpd/README.md
================================================
# A server for tests git-over-http

DO NOT USE THIS FOR ANYTHING BUT TESTING GIT OVER HTTP!!!

## How to use it

Build yourself a test image.  We use example.com so you can't accidentally push
it.

```
$ docker build -t example.com/test/test-httpd .
...lots of output...
Successfully tagged example.com/test/test-httpd:latest
```

Run it.

```
$ docker run -d -v /tmp/repo:/git/repo:ro example.com/test/test-httpd
60d5b41110bc669037031e3cd758763f0e4fb6c50fac33c4a8a28432b448ae
```

Find your IP.

```
$ docker inspect 60d5b41110bc669037031e3cd758763f0e4fb6c50fac33c4a8a28432b448ae7 | jq -r .[0].NetworkSettings.IPAddress
192.168.1.2
```

Now you can git clone from it.

```
$ git clone testuser:testpass@192.168.9.2/repo
```


================================================
FILE: _test_tools/httpd/nginx.conf
================================================
# /etc/nginx/nginx.conf

user root;
worker_processes 1;
daemon off;
error_log /dev/stdout info;

events {
}

http {
	access_log /dev/stdout;

	server {
		listen 80 default_server;
		listen [::]:80 default_server;

		# Everything is a 404
		location / {
			# First attempt to serve request as file, then
			# as directory, then fall back to displaying a 404.
			try_files $uri $uri/ =404;
		}

		location ~ (/.*) {
			client_max_body_size 0; # Git pushes can be massive, just to make sure nginx doesn't suddenly cut the connection add this.
			auth_basic "Git Login"; # Whatever text will do.
			auth_basic_user_file "/etc/htpasswd";
			include /etc/nginx/fastcgi_params; # Include the default fastcgi configs
			fastcgi_param SCRIPT_FILENAME /usr/libexec/git-core/git-http-backend; # Tells fastcgi to pass the request to the git http backend executable
			fastcgi_param GIT_HTTP_EXPORT_ALL "";
			fastcgi_param GIT_PROJECT_ROOT /git; # the location of all of your git repositories.
			fastcgi_param REMOTE_USER $remote_user;
			fastcgi_param PATH_INFO $1; # Takes the capture group from our location directive and gives git that.
			fastcgi_pass  unix:/var/run/fcgiwrap.socket; # Pass the request to fastcgi
		}
	}
}


================================================
FILE: _test_tools/httpd/run.sh
================================================
#!/bin/sh
#
# Copyright 2023 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

SOCKET="/var/run/fcgiwrap.socket"
rm -f "$SOCKET"
fcgiwrap -s "unix:$SOCKET" &

exec nginx


================================================
FILE: _test_tools/ncsvr/Dockerfile
================================================
# Copyright 2019 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Stolen from https://github.com/linuxkit/linuxkit/tree/master/pkg/sshd/

FROM alpine AS base

RUN mkdir -p /out/etc/apk && cp -r /etc/apk/* /out/etc/apk/
RUN apk add --no-cache --initdb -p /out \
    alpine-baselayout \
    apk-tools \
    busybox \
    util-linux \
    netcat-openbsd \
    && true

###############

FROM scratch

ENTRYPOINT []
WORKDIR /

COPY --from=base /out/ /

COPY ncsvr.sh /

ENTRYPOINT ["/ncsvr.sh"]


================================================
FILE: _test_tools/ncsvr/README.md
================================================
# A simple server for tests

DO NOT USE THIS FOR ANYTHING BUT TESTING!!!

## How to use it

Build yourself a test image.  We use example.com so you can't accidentally push
it.

```
$ docker build -t example.com/test/test-ncvsr .
...lots of output...
Successfully tagged example.com/test/test-ncsvr:latest
```

Run it.

```
$ docker run -d example.com/test/test-ncsvr 9376 "echo hello"
6d05b4111b03c66907031e3cd7587763f0e4fab6c50fac33c4a8284732b448ae
```

Find your IP.

```
$ docker inspect 6d05b4111b03c66907031e3cd7587763f0e4fab6c50fac33c4a8284732b448ae | jq -r .[0].NetworkSettings.IPAddress
192.168.1.2
```

Connect to it.

```
$ echo "" | nc 192.168.9.2 9376
hello
```

If you want to know how many times it was accessed, mount a file on
/var/log/hits.  This will log one line per hit.


================================================
FILE: _test_tools/ncsvr/ncsvr.sh
================================================
#!/bin/sh
#
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

if [ -z "$1" ] || [ -z "$2" ]; then
    echo "usage: $0 <port> <shell-command>"
    exit 1
fi

# This construction allows the passed-in command ($2) to optionally read from
# the client before responding (e.g. an HTTP request).
CMD_TO_NC=$(mktemp -u)
NC_TO_CMD=$(mktemp -u)
mkfifo "$CMD_TO_NC" "$NC_TO_CMD"
while true; do
    sh -c "$2" > "$CMD_TO_NC" 2>&1 < "$NC_TO_CMD" &
    nc -l -p "$1" -N -w1 < "$CMD_TO_NC" > "$NC_TO_CMD"
    date >> /var/log/hits
done


================================================
FILE: _test_tools/sshd/Dockerfile
================================================
# Copyright 2019 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Stolen from https://github.com/linuxkit/linuxkit/tree/master/pkg/sshd/

FROM alpine AS base

RUN mkdir -p /out/etc/apk && cp -r /etc/apk/* /out/etc/apk/
RUN apk add --no-cache --initdb -p /out \
    alpine-baselayout \
    apk-tools \
    busybox \
    ca-certificates \
    git \
    musl \
    openssh-server \
    tini \
    util-linux \
    wireguard-tools \
    && true

###############

FROM scratch

ENTRYPOINT []
WORKDIR /

COPY --from=base /out/ /

RUN mkdir -p /etc/ssh && rm /etc/motd
COPY sshd_config /etc/ssh/
COPY sshd.sh /

# Callers should mount a .ssh directory here. Our sshd.sh will copy it and
# manage permissions.
VOLUME /dot_ssh

# Callers should mount a directory with git repos here.
VOLUME /git
# sshd runs as root, and the repo directory might be owned by anyone.
RUN git config --system safe.directory '*'

# Callers can SSH as user "test"
RUN echo "test:x:65533:65533::/home/test:/usr/bin/git-shell" >> /etc/passwd

CMD ["/sbin/tini", "/sshd.sh"]


================================================
FILE: _test_tools/sshd/README.md
================================================
# An SSHD for tests git-over-ssh

DO NOT USE THIS FOR ANYTHING BUT TESTING GIT OVER SSH!!!

## How to use it

Build yourself a test image.  We use example.com so you can't accidentally push
it.

```
$ docker build -t example.com/test/test-sshd .
...lots of output...
Successfully tagged example.com/test/test-sshd:latest
```

Generate keys for a fake user named "test".

```
$ mkdir -p dot_ssh

$ ssh-keygen -f dot_ssh/id_test -P ""
Generating public/private rsa key pair.
Your identification has been saved in dot_ssh/id_test.
Your public key has been saved in dot_ssh/id_test.pub.
...lots of output...

$ cat dot_ssh/id_test.pub > dot_ssh/authorized_keys
```

Run it.

```
$ docker run -d -v $(pwd)/dot_ssh:/dot_ssh:ro example.com/test/test-sshd
6d05b4111b03c66907031e3cd7587763f0e4fab6c50fac33c4a8284732b448ae
```

Find your IP.

```
$ docker inspect 6d05b4111b03c66907031e3cd7587763f0e4fab6c50fac33c4a8284732b448ae | jq -r .[0].NetworkSettings.IPAddress
192.168.1.2
```

SSH to it.

```
$ ssh -i dot_ssh/id_test -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null test@192.168.9.2
Warning: Permanently added '192.168.9.2' (ECDSA) to the list of known hosts.
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to 192.168.9.2 closed.
```


================================================
FILE: _test_tools/sshd/sshd.sh
================================================
#!/bin/sh
#
# Copyright 2020 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


KEYS=$(find /etc/ssh -name 'ssh_host_*_key')
[ -z "$KEYS" ] && ssh-keygen -A >/dev/null 2>/dev/null

# Copy creds for the test user, so we don't have to bake them into the image
# and so users don't have to manage permissions.
mkdir -p /home/test/.ssh
cp -a /dot_ssh/* /home/test/.ssh
chown -R test /home/test/.ssh
chmod 0700 /home/test/.ssh
chmod 0600 /home/test/.ssh/*

exec /usr/sbin/sshd -D -e


================================================
FILE: _test_tools/sshd/sshd_config
================================================
# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile	.ssh/authorized_keys

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no

# Change to no to disable s/key passwords
ChallengeResponseAuthentication no


================================================
FILE: abspath.go
================================================
/*
Copyright 2014 The Kubernetes Authors 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.
*/

package main

import (
	"os"
	"path/filepath"
	"strings"
)

// absPath is an absolute path string.  This type is intended to make it clear
// when strings are absolute paths vs something else.  This does not verify or
// mutate the input, so careless callers could make instances of this type that
// are not actually absolute paths, or even "".
type absPath string

// String returns abs as a string.
func (abs absPath) String() string {
	return string(abs)
}

// Canonical returns a canonicalized form of abs, similar to filepath.Abs
// (including filepath.Clean).  Unlike filepath.Clean, this preserves "" as a
// special case.
func (abs absPath) Canonical() (absPath, error) {
	if abs == "" {
		return abs, nil
	}

	result, err := filepath.Abs(abs.String())
	if err != nil {
		return "", err
	}
	return absPath(result), nil
}

// Join appends more path elements to abs, like filepath.Join. This will clean
// the final path (e.g. resolve ".." elements).
func (abs absPath) Join(elems ...string) absPath {
	all := make([]string, 0, 1+len(elems))
	all = append(all, abs.String())
	all = append(all, elems...)
	return absPath(filepath.Join(all...))
}

// Split breaks abs into stem and leaf parts (often directory and file, but not
// necessarily), similar to filepath.Split.  Unlike filepath.Split, the
// resulting stem part does not have any trailing path separators.
func (abs absPath) Split() (absPath, string) {
	if abs == "" {
		return "", ""
	}

	// filepath.Split promises that dir+base == input, but trailing slashes on
	// the dir is confusing and ugly.
	pathSep := string(os.PathSeparator)
	dir, base := filepath.Split(strings.TrimRight(abs.String(), pathSep))
	dir = strings.TrimRight(dir, pathSep)
	if len(dir) == 0 {
		dir = string(os.PathSeparator)
	}

	return absPath(dir), base
}

// Dir returns the stem part of abs without the leaf, like filepath.Dir.
func (abs absPath) Dir() string {
	dir, _ := abs.Split()
	return string(dir)
}

// Base returns the leaf part of abs without the stem, like filepath.Base.
func (abs absPath) Base() string {
	_, base := abs.Split()
	return base
}


================================================
FILE: abspath_test.go
================================================
/*
Copyright 2015 The Kubernetes Authors 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.
*/

package main

import (
	"testing"
)

func TestAbsPathString(t *testing.T) {
	testCases := []string{
		"",
		"/",
		"//",
		"/dir",
		"/dir/",
		"/dir//",
		"/dir/sub",
		"/dir/sub/",
		"/dir//sub",
		"/dir//sub/",
		"dir",
		"dir/sub",
	}

	for _, tc := range testCases {
		if want, got := tc, absPath(tc).String(); want != got {
			t.Errorf("expected %q, got %q", want, got)
		}
	}
}

func TestAbsPathCanonical(t *testing.T) {
	testCases := []struct {
		in  absPath
		exp absPath
	}{{
		in:  "",
		exp: "",
	}, {
		in:  "/",
		exp: "/",
	}, {
		in:  "/one",
		exp: "/one",
	}, {
		in:  "/one/two",
		exp: "/one/two",
	}, {
		in:  "/one/two/",
		exp: "/one/two",
	}, {
		in:  "/one//two",
		exp: "/one/two",
	}, {
		in:  "/one/two/../three",
		exp: "/one/three",
	}}

	for _, tc := range testCases {
		want := tc.exp
		got, err := tc.in.Canonical()
		if err != nil {
			t.Errorf("%q: unexpected error: %v", tc.in, err)
		} else if want != got {
			t.Errorf("%q: expected %q, got %q", tc.in, want, got)
		}
	}
}

func TestAbsPathJoin(t *testing.T) {
	testCases := []struct {
		base   absPath
		more   []string
		expect absPath
	}{{
		base:   "/dir",
		more:   nil,
		expect: "/dir",
	}, {
		base:   "/dir",
		more:   []string{"one"},
		expect: "/dir/one",
	}, {
		base:   "/dir",
		more:   []string{"one", "two"},
		expect: "/dir/one/two",
	}, {
		base:   "/dir",
		more:   []string{"one", "two", "three"},
		expect: "/dir/one/two/three",
	}, {
		base:   "/dir",
		more:   []string{"with/slash"},
		expect: "/dir/with/slash",
	}, {
		base:   "/dir",
		more:   []string{"with/trailingslash/"},
		expect: "/dir/with/trailingslash",
	}, {
		base:   "/dir",
		more:   []string{"with//twoslash"},
		expect: "/dir/with/twoslash",
	}, {
		base:   "/dir",
		more:   []string{"one/1", "two/2", "three/3"},
		expect: "/dir/one/1/two/2/three/3",
	}}

	for _, tc := range testCases {
		if want, got := tc.expect, tc.base.Join(tc.more...); want != got {
			t.Errorf("(%q, %q): expected %q, got %q", tc.base, tc.more, want, got)
		}
	}
}

func TestAbsPathSplit(t *testing.T) {
	testCases := []struct {
		in      absPath
		expDir  absPath
		expBase string
	}{{
		in:      "",
		expDir:  "",
		expBase: "",
	}, {
		in:      "/",
		expDir:  "/",
		expBase: "",
	}, {
		in:      "//",
		expDir:  "/",
		expBase: "",
	}, {
		in:      "/one",
		expDir:  "/",
		expBase: "one",
	}, {
		in:      "/one/two",
		expDir:  "/one",
		expBase: "two",
	}, {
		in:      "/one/two/",
		expDir:  "/one",
		expBase: "two",
	}, {
		in:      "/one//two",
		expDir:  "/one",
		expBase: "two",
	}}

	for _, tc := range testCases {
		wantDir, wantBase := tc.expDir, tc.expBase
		if gotDir, gotBase := tc.in.Split(); wantDir != gotDir || wantBase != gotBase {
			t.Errorf("%q: expected (%q, %q), got (%q, %q)", tc.in, wantDir, wantBase, gotDir, gotBase)
		}
	}
}

func TestAbsPathDir(t *testing.T) {
	testCases := []struct {
		in  absPath
		exp string
	}{{
		in:  "",
		exp: "",
	}, {
		in:  "/",
		exp: "/",
	}, {
		in:  "/one",
		exp: "/",
	}, {
		in:  "/one/two",
		exp: "/one",
	}, {
		in:  "/one/two/",
		exp: "/one",
	}, {
		in:  "/one//two",
		exp: "/one",
	}}

	for _, tc := range testCases {
		if want, got := tc.exp, tc.in.Dir(); want != got {
			t.Errorf("%q: expected %q, got %q", tc.in, want, got)
		}
	}
}

func TestAbsPathBase(t *testing.T) {
	testCases := []struct {
		in  absPath
		exp string
	}{{
		in:  "",
		exp: "",
	}, {
		in:  "/",
		exp: "",
	}, {
		in:  "/one",
		exp: "one",
	}, {
		in:  "/one/two",
		exp: "two",
	}, {
		in:  "/one/two/",
		exp: "two",
	}, {
		in:  "/one//two",
		exp: "two",
	}}

	for _, tc := range testCases {
		if want, got := tc.exp, tc.in.Base(); want != got {
			t.Errorf("%q: expected %q, got %q", tc.in, want, got)
		}
	}
}


================================================
FILE: build/build.sh
================================================
#!/bin/bash
#
# Copyright 2016 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT 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 -o errexit
set -o nounset
set -o pipefail

if [ -z "${ARCH:-}" ]; then
    echo "ARCH must be set"
    exit 1
fi
if [ -z "${OS:-}" ]; then
    echo "OS must be set"
    exit 1
fi
if [ -z "${VERSION:-}" ]; then
    echo "VERSION must be set"
    exit 1
fi

export CGO_ENABLED=0
export GOARCH="${ARCH}"
export GOOS="${OS}"

if [[ "${BUILD_DEBUG:-0}" == 1 ]]; then
    # Debugging - disable optimizations and inlining
    gogcflags="all=-N -l"
    goasmflags=""
    goldflags=""
else
    # Not debugging - trim paths, disable symbols and DWARF.
    goasmflags="all=-trimpath=$(pwd)"
    gogcflags="all=-trimpath=$(pwd)"
    goldflags="-s -w"
fi

always_ldflags="-X $(go list -m)/pkg/version.VERSION=${VERSION}"
go install                                                      \
    -installsuffix "static"                                     \
    -gcflags="${gogcflags}"                                     \
    -asmflags="${goasmflags}"                                   \
    -ldflags="${always_ldflags} ${goldflags}"                   \
    ./...


================================================
FILE: build/test.sh
================================================
#!/bin/bash
#
# Copyright 2016 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT 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 -o errexit
set -o nounset
set -o pipefail

export CGO_ENABLED=0
export GOFLAGS="-mod=vendor"

echo "Running tests:"
go test -installsuffix "static" "$@"
echo

echo -n "Checking gofmt: "
ERRS="$(go fmt "$@")"
if [ -n "${ERRS}" ]; then
    echo "FAIL - the following files need to be gofmt'ed:"
    for e in ${ERRS}; do
        echo "    $e"
    done
    echo
    exit 1
fi
echo "PASS"
echo

echo -n "Checking go vet: "
ERRS="$(go vet "$@" 2>&1 || true)"
if [ -n "${ERRS}" ]; then
    echo "FAIL"
    echo "${ERRS}"
    echo
    exit 1
fi
echo "PASS"
echo


================================================
FILE: code-of-conduct.md
================================================
# Kubernetes Community Code of Conduct

Please refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/community/code-of-conduct.md)


================================================
FILE: credential.go
================================================
/*
Copyright 2014 The Kubernetes Authors 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.
*/

package main

import (
	"encoding/json"
	"fmt"
	"strings"

	"github.com/spf13/pflag"
)

type credential struct {
	URL          string `json:"url"`
	Username     string `json:"username"`
	Password     string `json:"password,omitempty"`
	PasswordFile string `json:"password-file,omitempty"`
}

func (c credential) String() string {
	jb, err := json.Marshal(c)
	if err != nil {
		return fmt.Sprintf("<encoding error: %v>", err)
	}
	return string(jb)
}

// credentialSliceValue is for flags.
type credentialSliceValue struct {
	value   []credential
	changed bool
}

var _ pflag.Value = &credentialSliceValue{}
var _ pflag.SliceValue = &credentialSliceValue{}

// pflagCredentialSlice is like pflag.StringSlice().
func pflagCredentialSlice(name, def, usage string) *[]credential {
	p := &credentialSliceValue{}
	_ = p.Set(def)
	pflag.Var(p, name, usage)
	return &p.value
}

// unmarshal is like json.Unmarshal, but fails on unknown fields.
func (cs credentialSliceValue) unmarshal(val string, out any) error {
	dec := json.NewDecoder(strings.NewReader(val))
	dec.DisallowUnknownFields()
	return dec.Decode(out)
}

// decodeList handles a string-encoded JSON object.
func (cs credentialSliceValue) decodeObject(val string) (credential, error) {
	var cred credential
	if err := cs.unmarshal(val, &cred); err != nil {
		return credential{}, err
	}
	return cred, nil
}

// decodeList handles a string-encoded JSON list.
func (cs credentialSliceValue) decodeList(val string) ([]credential, error) {
	var creds []credential
	if err := cs.unmarshal(val, &creds); err != nil {
		return nil, err
	}
	return creds, nil
}

// decode handles a string-encoded JSON object or list.
func (cs credentialSliceValue) decode(val string) ([]credential, error) {
	s := strings.TrimSpace(val)
	if s == "" {
		return nil, nil
	}
	// If it tastes like an object...
	if s[0] == '{' {
		cred, err := cs.decodeObject(s)
		return []credential{cred}, err
	}
	// If it tastes like a list...
	if s[0] == '[' {
		return cs.decodeList(s)
	}
	// Otherwise, bad
	return nil, fmt.Errorf("not a JSON object or list")
}

func (cs *credentialSliceValue) Set(val string) error {
	v, err := cs.decode(val)
	if err != nil {
		return err
	}

	if !cs.changed {
		cs.value = v
	} else {
		cs.value = append(cs.value, v...)
	}
	cs.changed = true

	return nil
}

func (cs credentialSliceValue) Type() string {
	return "credentialSlice"
}

func (cs credentialSliceValue) String() string {
	if len(cs.value) == 0 {
		return "[]"
	}
	jb, err := json.Marshal(cs.value)
	if err != nil {
		return fmt.Sprintf("<encoding error: %v>", err)
	}
	return string(jb)
}

func (cs *credentialSliceValue) Append(val string) error {
	v, err := cs.decodeObject(val)
	if err != nil {
		return err
	}
	cs.value = append(cs.value, v)
	return nil
}

func (cs *credentialSliceValue) Replace(val []string) error {
	creds := []credential{}
	for _, s := range val {
		v, err := cs.decodeObject(s)
		if err != nil {
			return err
		}
		creds = append(creds, v)
	}
	cs.value = creds
	return nil
}

func (cs credentialSliceValue) GetSlice() []string {
	if len(cs.value) == 0 {
		return nil
	}
	ret := []string{}
	for _, cred := range cs.value {
		ret = append(ret, cred.String())
	}
	return ret
}


================================================
FILE: demo/README.md
================================================
# git-sync-demo

This demo shows how to use a `git-sync` container alongside an HTTP server to
serve static content.

## How it works

The pod is composed of 2 containers that share a volume.

- The `git-sync` container clones a git repo into the `content` volume
- The `http` container serves that content

For the purposes of this demo, it's about as trivial as it can get.

## Usage

Apply the deployment and the service files:

```
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
```

Wait for the service to be assigned a LoadBalancer IP, then open that IP in
your browser.


================================================
FILE: demo/deployment.yaml
================================================
apiVersion: apps/v1
kind: Deployment
metadata:
  name: static-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: static-server
  template:
    metadata:
      labels:
        app: static-server
    spec:
      volumes:
        - name: content
          emptyDir: {}
      containers:
        # This container pulls a git repo into the "content" volume.  If this
        # were a "real" app it would probably have livenessProbe and resources,
        # and maybe a secret to get credentials for your git server.
        - name: git-sync
          image: registry.k8s.io/git-sync/git-sync:v4.2.3
          args:
            - --repo=https://github.com/kubernetes/git-sync
            - --root=/git
            - --period=60s
            - --link=head
            - --max-failures=1000000000
            - -v=2
          volumeMounts:
            - name: content
              mountPath: /git
        # This container is a trivial HTTP server for the content.
        # If this were a "real" app it would not be so trivial.  For example,
        # nginx or apache are much more robust web servers!  It's missing a
        # livenessProbe, resources, and many other things you would want for
        # running in production.  Also, you would probably have a git repo
        # dedicated to holding your content.
        - name: http
          image: python:alpine
          args:
            - python3
            - -m
            - http.server
            - -d=/git/head/demo/html
          volumeMounts:
            - name: content
              mountPath: /git
              readOnly: true


================================================
FILE: demo/html/index.html
================================================
<!DOCTYPE html>
<html>
<body>

<h1>That's it, that's the demo</h1>
<p>Impressive, right?</p>

</body>
</html>


================================================
FILE: demo/service.yaml
================================================
apiVersion: v1
kind: Service
metadata:
  name: static-server
spec:
  selector:
    app: static-server
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8000


================================================
FILE: docs/askpass-url.md
================================================
# Using an HTTP auth URL with git-sync

## Step 1: Create a GIT_ASKPASS HTTP Service

The GIT ASKPASS Service is exposed via HTTP and provide the answer to GIT_ASKPASS.

Example of the service's output, see more at <https://git-scm.com/docs/gitcredentials>

```
username=xxx@example.com
password=mysecret
```

## Step 2: Configure git-sync container

In your git-sync container configuration, specify the GIT_ASKPASS URL

The credentials will pass in plain text, so make sure the connection between
git-sync and GIT ASKPASS Service is secure.

See the askpass e2e test as an example.

```yaml
name: "git-sync"
...
env:
  - name: "GITSYNC_REPO",
    value: "https://source.developers.google.com/p/[GCP PROJECT ID]/r/[REPO NAME]"
  - name: "GITSYNC_ASKPASS_URL",
    value: "http://localhost:9102/git_askpass",
```


================================================
FILE: docs/cookie-file.md
================================================
# Using an HTTP cookie file with git-sync

Git-sync supports use of an HTTP cookie file for accessing git content.

## Step 1: Create a Secret

First, create a Kubernetes Secret from the git cookie file you wish to
use.

Example: if the cookie-file is `~/.gitcookies`:

```bash
kubectl create secret generic git-cookie-file --from-file=cookie_file=~/.gitcookies
```

Note that the key is `cookie_file`. This is the filename that git-sync will look
for.

## Step 2: Configure a Pod/Deployment volume

In your Pod or Deployment configuration, specify a volume for mounting the
cookie-file Secret. Make sure to set `secretName` to the same name you used to
create the secret (`git-cookie-file` in the example above).

```yaml
volumes:
  - name: git-secret
    secret:
      secretName: git-cookie-file
      defaultMode: 0440
```

## Step 3: Configure a git-sync container

In your git-sync container configuration, mount your volume at
"/etc/git-secret". Make sure to pass the `--cookie-file` flag or set the
environment variable `GITSYNC_COOKIE_FILE` to "true", and to use a git repo
(`--repo` or `GITSYNC_REPO`) with an HTTP URL.

```yaml
name: "git-sync"
...
env:
  - name: GITSYNC_REPO
    value: https://github.com/kubernetes/kubernetes.git
  - name: GITSYNC_COOKIE_FILE
    value: true
volumeMounts:
  - name: git-secret
    mountPath: /etc/git-secret
    readOnly: true
```


================================================
FILE: docs/dev/testing_github_app_auth.md
================================================
# Testing GitHub app auth

## Step 1: Create and install a dummy GitHub app for testing with

Go to https://github.com/settings/apps/new

1. Enter a name for the app (needs to be unique across GitHub).
2. Set the required `homepage URL` field (can be any valid URL).
3. Under `Webhook`, uncheck the `Active` checkbox.
4. Click on `Repository permissions` under `Permissions`, and set `Contents` to `Read-only`
5. Click on `Create GitHub App` at the bottom of the page.
6. You should be navigated to a new page with a `Registration successful. You must generate a private key in order to install your GitHub App.` message. Click on the `generate a private key` link, and then the `Generate a private key` button, and save it somewhere; it will be used to test the app authentication.
7. Click on the `Install App` tab on the left, and then click on `Install` on the right.
8. Select `Only select repositories`, and pick any private repository that contains a "LICENSE" file (may need to be created beforehand).

## Step 2: Export the necessary environment variables

The following environment variables are *required* to run the git-sync GitHub app auth tests:
- `TEST_GITHUB_APP_PRIVATE_KEY` or `TEST_GITHUB_APP_PRIVATE_KEY_FILE`. If both are set, `TEST_GITHUB_APP_PRIVATE_KEY` overwrites `TEST_GITHUB_APP_PRIVATE_KEY_FILE`.
- `TEST_GITHUB_APP_APPLICATION_ID`
- `TEST_GITHUB_APP_CLIENT_ID`
- `TEST_GITHUB_APP_INSTALLATION_ID`
- `TEST_GITHUB_APP_AUTH_TEST_REPO`

### TEST_GITHUB_APP_PRIVATE_KEY
The content of the GitHub app's private key file. It should have been saved when creating the app.
If `TEST_GITHUB_APP_PRIVATE_KEY_FILE` is also set, it overwrites the file with the content.
Otherwise, it saves the content to `/tmp/git-sync-e2e.random-id/github_app_private_key.pem`.

### TEST_GITHUB_APP_PRIVATE_KEY_FILE
The absolute path to the file that stores the GitHub app's private key file. It should have been saved when creating the app.

### TEST_GITHUB_APP_APPLICATION_ID
The value after "App ID" in the app's settings page.

### TEST_GITHUB_APP_CLIENT_ID
The value after "Client ID" in the app's settings page.

### TEST_GITHUB_APP_INSTALLATION_ID
Found in the URL of the app's installation page if you installed it to a repository: https://github.com/settings/installations/<installation_id>

### TEST_GITHUB_APP_AUTH_TEST_REPO.
Should be set to the repository that the GitHub app is installed to.


================================================
FILE: docs/kubernetes.md
================================================
# Using git-sync in kubernetes

This document provides a trivialized example of running a multi-container pod
in Kubernetes, with git-sync pulling data and an HTTP server serving it.

## YAML

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: git-sync-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: git-sync-example
  template:
    metadata:
      labels:
        app: git-sync-example
    spec:
      securityContext:
        # Set this to any valid GID, and two things happen:
        #   1) The volume "content-from-git" is group-owned by this GID.
        #   2) This GID is added to each container.
        fsGroup: 101
      volumes:
        - name: content-from-git
          emptyDir: {}
      containers:
        - name: git-sync
          # This container pulls git data and publishes it into volume
          # "content-from-git".  In that volume you will find a symlink
          # "current" (see -dest below) which points to a checked-out copy of
          # the master branch (see -branch) of the repo (see -repo).
          # NOTE: git-sync already runs as non-root.
          image: registry.k8s.io/git-sync/git-sync:v4.0.0
          args:
            - --repo=https://github.com/kubernetes/git-sync
            - --depth=1
            - --period=60s
            - --link=current
            - --root=/git
          volumeMounts:
            - name: content-from-git
              mountPath: /git
        - name: server
          # This container serves the data pulled from git, via the volume
          # "content-from-git".
          # NOTE: apache runs as root to expose port 80, and there's not a
          # trivial flag to change that.  Real servers should not run as root
          # when possible.
          image: httpd:alpine
          volumeMounts:
            - name: content-from-git
              mountPath: /usr/local/apache2/htdocs/
              readOnly: true # no need to ever write to the volume
```


================================================
FILE: docs/proxy.md
================================================
# Using git with proxy

Git-sync supports using a proxy through git-configuration.

## Background

See [issue 180](https://github.com/kubernetes/git-sync/issues/180) for a background.
See [Github documentation](https://docs.github.com/en/github/authenticating-to-github/using-ssh-over-the-https-port) specifically for GitHub.
Lastly, [see similar issue for FluxCD](https://github.com/fluxcd/flux/pull/3152) for configuration.

## Step 1: Create configuration

Create a Kubernetes ConfigMap to store your configuration:

```bash
cat << EOF >> /tmp/ssh-config
Host github.com
    ProxyCommand socat STDIO PROXY:<proxyIP>:%h:%p,proxyport=<proxyport>,proxyauth=<proxyAuth>
    User git
    Hostname ssh.github.com
    Port 443
    IdentityFile /etc/git-secret/ssh
EOF

kubectl create configmap ssh-config --from-file=ssh-config=/tmp/ssh-config
```

then mount this under `~/.ssh/config`, typically `/tmp/.ssh/config`:

```yaml
...
apiVersion: v1
kind: Pod
...
spec:
  containers:
    - name: git-sync
      ...
      volumeMounts:
        - name: ssh-config
          mountPath: /tmp/.ssh/config
          readOnly: true
          subPath: ssh-config
  volumes:
    - name: ssh-config
      configMap:
        name: ssh-config
```


================================================
FILE: docs/ssh.md
================================================
# Using SSH with git-sync

Git-sync supports using the SSH protocol for pulling git content.

## Step 1: Create Secret

Create a Secret to store your SSH private key, with the Secret keyed as "ssh".
This can be done one of two ways:

***Method 1:***

Obtain the host keys for your git server:

```bash
ssh-keyscan $YOUR_GIT_HOST > /tmp/known_hosts
```

Use the `kubectl create secret` command and point to the file on your
filesystem that stores the key. Ensure that the file is mapped to "ssh" as
shown (the file can be located anywhere).

```bash
kubectl create secret generic git-creds \
    --from-file=ssh=$HOME/.ssh/id_rsa \
    --from-file=known_hosts=/tmp/known_hosts
```

***Method 2:***

Write a config file for a Secret that holds your SSH private key, with the key
(pasted in base64 encoded plaintext) mapped to the "ssh" field.

```json
{
  "kind": "Secret",
  "apiVersion": "v1",
  "metadata": {
    "name": "git-creds"
  },
  "data": {
    "ssh": <base64 encoded private-key>
    "known_hosts": <base64 encoded known_hosts>
  }
}
```

Create the Secret using `kubectl create -f`.

```bash
kubectl create -f /path/to/secret-config.json
```

## Step 2: Configure Pod/Deployment volume

In your Pod or Deployment configuration, specify a volume for mounting the
Secret. Ensure that secretName matches the name you used when creating the
Secret (e.g. "git-creds" used in both above examples).

```yaml
      # ...
      volumes:
      - name: git-secret
        secret:
          secretName: git-creds
          defaultMode: 0400
      # ...
```

## Step 3: Configure git-sync container

In your git-sync container configuration, mount the Secret volume at
"/etc/git-secret". Ensure that the `--repo` flag (or the `GITSYNC_REPO`
environment variable) is set to use the SSH protocol (e.g.
git@github.com/foo/bar).  You will also need to set your container's
`securityContext` to run as user ID "65533" which is created for running
git-sync as non-root.

```yaml
      # ...
      containers:
      - name: git-sync
        image: registry.k8s.io/git-sync/git-sync:v4.2.4
        args:
         - "--repo=git@github.com:foo/bar"
         - "--link=bar"
        volumeMounts:
        - name: git-secret
          mountPath: /etc/git-secret
        securityContext:
          runAsUser: 65533 # git-sync user
      # ...
```

Lastly, you need to tell your Pod to run with the git-sync FS group.  Note
that this is a Pod-wide setting, unlike the container `securityContext` above.

```yaml
      # ...
      securityContext:
        fsGroup: 65533 # to make SSH key readable
      # ...
```

If you want git-sync to run as a different (non-root) UID and GID, you can
change these last blocks to any UID/GID you like.  SSH demands that the current
UID be present in /etc/passwd, so in this case you will need to add the
`--add-user` flag to git-sync's args array.

**Note:** Kubernetes mounts the Secret with permissions 0444 by default (not
restrictive enough to be used as an SSH key), so make sure you set the
`defaultMode`.

## Full example

In case the above YAML snippets are confusing (because whitespace matters in
YAML), here is a full example:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: git-sync
spec:
  selector:
    matchLabels:
      demo: git-sync
  template:
    metadata:
      labels:
        demo: git-sync
    spec:
      volumes:
      - name: git-secret
        secret:
          secretName: git-creds
          defaultMode: 0400
      containers:
      - name: git-sync
        image: registry.k8s.io/git-sync/git-sync:v4.2.4
        args:
         - "--repo=git@github.com:torvalds/linux"
         - "--depth=1"
        securityContext:
          runAsUser: 65533 # git-sync user
        volumeMounts:
        - name: git-secret
          mountPath: /etc/git-secret
          readOnly: true
      securityContext:
        fsGroup: 65533 # to make SSH key readable
```


================================================
FILE: env.go
================================================
/*
Copyright 2014 The Kubernetes Authors 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.
*/

package main

import (
	"cmp"
	"fmt"
	"io"
	"os"
	"slices"
	"strconv"
	"strings"
	"time"

	"github.com/spf13/pflag"
)

// Tests can set this or set it to nil.
var envWarnfOverride func(format string, args ...any)

func envWarnf(format string, args ...any) {
	if envWarnfOverride != nil {
		envWarnfOverride(format, args...)
	} else {
		fmt.Fprintf(os.Stderr, format, args...)
	}
}

func envString(def string, key string, alts ...string) string {
	found := 0
	result := ""
	resultKey := ""

	if val, ok := os.LookupEnv(key); ok {
		found++
		result = val
		resultKey = key
	}
	for _, alt := range alts {
		if val, ok := os.LookupEnv(alt); ok {
			envWarnf("env $%s has been deprecated, use $%s instead\n", alt, key)
			found++
			result = val
			resultKey = alt
		}
	}
	if found == 0 {
		return def
	}
	if found > 1 {
		envWarnf("env $%s was overridden by $%s\n", key, resultKey)
	}
	return result
}
func envFlagString(key string, def string, usage string, alts ...string) *string {
	registerEnvFlag(key, "string", usage)
	val := envString(def, key, alts...)
	// also expose it as a flag, for easier testing
	flName := "__env__" + key
	flHelp := "DO NOT SET THIS FLAG EXCEPT IN TESTS; use $" + key
	newExplicitFlag(&val, flName, flHelp, pflag.String)
	if err := pflag.CommandLine.MarkHidden(flName); err != nil {
		fmt.Fprintf(os.Stderr, "FATAL: %v\n", err)
		os.Exit(1)
	}
	return &val
}

func envStringArray(def string, key string, alts ...string) []string {
	parse := func(s string) []string {
		return strings.Split(s, ":")
	}

	found := 0
	result := ""
	resultKey := ""

	if val, ok := os.LookupEnv(key); ok {
		found++
		result = val
		resultKey = key
	}
	for _, alt := range alts {
		if val, ok := os.LookupEnv(alt); ok {
			envWarnf("env $%s has been deprecated, use $%s instead\n", alt, key)
			found++
			result = val
			resultKey = key
		}
	}
	if found == 0 {
		return parse(def)
	}
	if found > 1 {
		envWarnf("env $%s was overridden by $%s\n", key, resultKey)
	}

	return parse(result)
}

func envBoolOrError(def bool, key string, alts ...string) (bool, error) {
	parse := func(key, val string) (bool, error) {
		parsed, err := strconv.ParseBool(val)
		if err == nil {
			return parsed, nil
		}
		return false, fmt.Errorf("invalid bool env %s=%q: %w", key, val, err)
	}

	found := 0
	result := ""
	resultKey := ""

	if val, ok := os.LookupEnv(key); ok {
		found++
		result = val
		resultKey = key
	}
	for _, alt := range alts {
		if val, ok := os.LookupEnv(alt); ok {
			envWarnf("env $%s has been deprecated, use $%s instead\n", alt, key)
			found++
			result = val
			resultKey = key
		}
	}
	if found == 0 {
		return def, nil
	}
	if found > 1 {
		envWarnf("env $%s was overridden by $%s\n", key, resultKey)
	}
	return parse(resultKey, result)
}
func envBool(def bool, key string, alts ...string) bool {
	val, err := envBoolOrError(def, key, alts...)
	if err != nil {
		fmt.Fprintf(os.Stderr, "FATAL: %v\n", err)
		os.Exit(1)
		return false
	}
	return val
}

func envIntOrError(def int, key string, alts ...string) (int, error) {
	parse := func(key, val string) (int, error) {
		parsed, err := strconv.ParseInt(val, 0, 0)
		if err == nil {
			return int(parsed), nil
		}
		return 0, fmt.Errorf("invalid int env %s=%q: %w", key, val, err)
	}

	found := 0
	result := ""
	resultKey := ""

	if val, ok := os.LookupEnv(key); ok {
		found++
		result = val
		resultKey = key
	}
	for _, alt := range alts {
		if val, ok := os.LookupEnv(alt); ok {
			envWarnf("env $%s has been deprecated, use $%s instead\n", alt, key)
			found++
			result = val
			resultKey = key
		}
	}
	if found == 0 {
		return def, nil
	}
	if found > 1 {
		envWarnf("env $%s was overridden by $%s\n", key, resultKey)
	}
	return parse(resultKey, result)
}
func envInt(def int, key string, alts ...string) int {
	val, err := envIntOrError(def, key, alts...)
	if err != nil {
		fmt.Fprintf(os.Stderr, "FATAL: %v\n", err)
		os.Exit(1)
		return 0
	}
	return val
}

func envFloatOrError(def float64, key string, alts ...string) (float64, error) {
	parse := func(key, val string) (float64, error) {
		parsed, err := strconv.ParseFloat(val, 64)
		if err == nil {
			return parsed, nil
		}
		return 0, fmt.Errorf("invalid float env %s=%q: %w", key, val, err)
	}

	found := 0
	result := ""
	resultKey := ""

	if val, ok := os.LookupEnv(key); ok {
		found++
		result = val
		resultKey = key
	}
	for _, alt := range alts {
		if val, ok := os.LookupEnv(alt); ok {
			envWarnf("env $%s has been deprecated, use $%s instead\n", alt, key)
			found++
			result = val
			resultKey = key
		}
	}
	if found == 0 {
		return def, nil
	}
	if found > 1 {
		envWarnf("env $%s was overridden by $%s\n", key, resultKey)
	}
	return parse(resultKey, result)
}
func envFloat(def float64, key string, alts ...string) float64 {
	val, err := envFloatOrError(def, key, alts...)
	if err != nil {
		fmt.Fprintf(os.Stderr, "FATAL: %v\n", err)
		os.Exit(1)
		return 0
	}
	return val
}

func envDurationOrError(def time.Duration, key string, alts ...string) (time.Duration, error) {
	parse := func(key, val string) (time.Duration, error) {
		parsed, err := time.ParseDuration(val)
		if err == nil {
			return parsed, nil
		}
		return 0, fmt.Errorf("invalid duration env %s=%q: %w", key, val, err)
	}

	found := 0
	result := ""
	resultKey := ""

	if val, ok := os.LookupEnv(key); ok {
		found++
		result = val
		resultKey = key
	}
	for _, alt := range alts {
		if val, ok := os.LookupEnv(alt); ok {
			envWarnf("env $%s has been deprecated, use $%s instead\n", alt, key)
			found++
			result = val
			resultKey = key
		}
	}
	if found == 0 {
		return def, nil
	}
	if found > 1 {
		envWarnf("env $%s was overridden by $%s\n", key, resultKey)
	}
	return parse(resultKey, result)
}
func envDuration(def time.Duration, key string, alts ...string) time.Duration {
	val, err := envDurationOrError(def, key, alts...)
	if err != nil {
		fmt.Fprintf(os.Stderr, "FATAL: %v\n", err)
		os.Exit(1)
		return 0
	}
	return val
}

// explicitFlag is a pflag.Value which only sets the real value if the flag is
// set to a non-zero-value.
type explicitFlag[T comparable] struct {
	pflag.Value
	realPtr *T
	flagPtr *T
}

// newExplicitFlag allocates an explicitFlag.
func newExplicitFlag[T comparable](ptr *T, name, usage string, fn func(name string, value T, usage string) *T) {
	h := &explicitFlag[T]{
		realPtr: ptr,
	}
	var zero T
	h.flagPtr = fn(name, zero, usage)
	fl := pflag.CommandLine.Lookup(name)
	// wrap the original pflag.Value with our own
	h.Value = fl.Value
	fl.Value = h
}

func (h *explicitFlag[T]) Set(val string) error {
	if err := h.Value.Set(val); err != nil {
		return err
	}
	var zero T
	if v := *h.flagPtr; v != zero {
		*h.realPtr = v
	}
	return nil
}

// envFlag is like a flag in that it is declared with a type, validated, and
// shows up in help messages, but can only be set by env-var, not on the CLI.
// This is useful for things like passwords, which should not be on the CLI
// because it can be seen in `ps`.
type envFlag struct {
	name string
	typ  string
	help string
}

var allEnvFlags = []envFlag{}

// registerEnvFlag is internal.  Use functions like envFlagString to actually
// create envFlags.
func registerEnvFlag(name, typ, help string) {
	for _, ef := range allEnvFlags {
		if ef.name == name {
			fmt.Fprintf(os.Stderr, "FATAL: duplicate env var declared: %q\n", name)
			os.Exit(1)
		}
	}
	allEnvFlags = append(allEnvFlags, envFlag{name, typ, help})
}

// printEnvFlags prints "usage" for all registered envFlags.
func printEnvFlags(out io.Writer) {
	width := 0
	for _, ef := range allEnvFlags {
		if n := len(ef.name); n > width {
			width = n
		}
	}
	slices.SortFunc(allEnvFlags, func(l, r envFlag) int { return cmp.Compare(l.name, r.name) })

	for _, ef := range allEnvFlags {
		fmt.Fprintf(out, "% *s %s %*s%s\n", width+2, ef.name, ef.typ, max(8, 32-width), "", ef.help)
	}
}


================================================
FILE: env_test.go
================================================
/*
Copyright 2015 The Kubernetes Authors 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.
*/

package main

import (
	"os"
	"testing"
	"time"
)

const (
	testKey = "KEY"
	alt1Key = "ALT1"
	alt2Key = "ALT2"
)

func setupEnv(val, alt1, alt2 string) {
	if val != "" {
		os.Setenv(testKey, val)
	}
	if alt1 != "" {
		os.Setenv(alt1Key, alt1)
	}
	if alt2 != "" {
		os.Setenv(alt2Key, alt2)
	}
}

func resetEnv() {
	os.Unsetenv(testKey)
	os.Unsetenv(alt1Key)
	os.Unsetenv(alt2Key)
}

func TestEnvBool(t *testing.T) {
	envWarnfOverride = func(format string, args ...any) {
		t.Logf(format, args...)
	}
	defer func() { envWarnfOverride = nil }()

	cases := []struct {
		value string
		alt1  string
		alt2  string
		def   bool
		exp   bool
		err   bool
	}{
		{"true", "", "", true, true, false},
		{"true", "", "", false, true, false},
		{"", "", "", true, true, false},
		{"", "", "", false, false, false},
		{"false", "", "", true, false, false},
		{"false", "", "", false, false, false},
		{"", "", "", true, true, false},
		{"", "", "", false, false, false},
		{"invalid", "", "", false, false, true},
		{"invalid", "true", "", false, true, false},
		{"true", "invalid", "", false, false, true},
		{"invalid", "invalid", "true", false, true, false},
		{"true", "true", "invalid", false, false, true},
		{"invalid", "invalid", "invalid", false, false, true},
	}

	for i, tc := range cases {
		resetEnv()
		setupEnv(tc.value, tc.alt1, tc.alt2)
		val, err := envBoolOrError(tc.def, testKey, alt1Key, alt2Key)
		if err != nil && !tc.err {
			t.Fatalf("%d: %q: unexpected error: %v", i, tc.value, err)
		}
		if err == nil && tc.err {
			t.Fatalf("%d: %q: unexpected success", i, tc.value)
		}
		if val != tc.exp {
			t.Fatalf("%d: expected: %v, got: %v", i, tc.exp, val)
		}
	}
}

func TestEnvString(t *testing.T) {
	envWarnfOverride = func(format string, args ...any) {
		t.Logf(format, args...)
	}
	defer func() { envWarnfOverride = nil }()

	cases := []struct {
		value string
		alt1  string
		alt2  string
		def   string
		exp   string
	}{
		{"foo", "", "", "foo", "foo"},
		{"foo", "", "", "bar", "foo"},
		{"", "", "", "foo", "foo"},
		{"", "", "", "bar", "bar"},
		{"bar", "", "", "foo", "bar"},
		{"bar", "", "", "bar", "bar"},
		{"", "", "", "foo", "foo"},
		{"", "", "", "bar", "bar"},
		{"foo1", "foo2", "", "bar", "foo2"},
		{"foo1", "foo2", "foo3", "bar", "foo3"},
	}

	for i, tc := range cases {
		resetEnv()
		setupEnv(tc.value, tc.alt1, tc.alt2)
		val := envString(tc.def, testKey, alt1Key, alt2Key)
		if val != tc.exp {
			t.Fatalf("%d: expected: %q, got: %q", i, tc.exp, val)
		}
	}
}

func TestEnvInt(t *testing.T) {
	envWarnfOverride = func(format string, args ...any) {
		t.Logf(format, args...)
	}
	defer func() { envWarnfOverride = nil }()

	cases := []struct {
		value string
		alt1  string
		alt2  string
		def   int
		exp   int
		err   bool
	}{
		{"0", "", "", 1, 0, false},
		{"", "", "", 0, 0, false},
		{"-1", "", "", 0, -1, false},
		{"invalid", "", "", 0, 0, true},
		{"invalid", "0", "", 1, 0, false},
		{"0", "invalid", "", 0, 0, true},
		{"invalid", "invalid", "0", 1, 0, false},
		{"0", "0", "invalid", 0, 0, true},
		{"invalid", "invalid", "invalid", 0, 0, true},
	}

	for i, tc := range cases {
		resetEnv()
		setupEnv(tc.value, tc.alt1, tc.alt2)
		val, err := envIntOrError(tc.def, testKey, alt1Key, alt2Key)
		if err != nil && !tc.err {
			t.Fatalf("%d: %q: unexpected error: %v", i, tc.value, err)
		}
		if err == nil && tc.err {
			t.Fatalf("%d: %q: unexpected success", i, tc.value)
		}
		if val != tc.exp {
			t.Fatalf("%d: expected: %v, got: %v", i, tc.exp, val)
		}
	}
}

func TestEnvFloat(t *testing.T) {
	envWarnfOverride = func(format string, args ...any) {
		t.Logf(format, args...)
	}
	defer func() { envWarnfOverride = nil }()

	cases := []struct {
		value string
		alt1  string
		alt2  string
		def   float64
		exp   float64
		err   bool
	}{
		{"0.5", "", "", 0, 0.5, false},
		{"", "", "", 0.5, 0.5, false},
		{"-0.5", "", "", 0, -0.5, false},
		{"invalid", "", "", 0, 0, true},
		{"invalid", "0.5", "", 0, 0.5, false},
		{"0.5", "invalid", "", 0, 0, true},
		{"invalid", "invalid", "0.5", 0, 0.5, false},
		{"0.5", "0.5", "invalid", 0, 0, true},
		{"invalid", "invalid", "invalid", 0, 0, true},
	}

	for i, tc := range cases {
		resetEnv()
		setupEnv(tc.value, tc.alt1, tc.alt2)
		val, err := envFloatOrError(tc.def, testKey, alt1Key, alt2Key)
		if err != nil && !tc.err {
			t.Fatalf("%d: %q: unexpected error: %v", i, tc.value, err)
		}
		if err == nil && tc.err {
			t.Fatalf("%d: %q: unexpected success", i, tc.value)
		}
		if val != tc.exp {
			t.Fatalf("%d: expected: %v, got: %v", i, tc.exp, val)
		}
	}
}

func TestEnvDuration(t *testing.T) {
	cases := []struct {
		value string
		alt1  string
		alt2  string
		def   time.Duration
		exp   time.Duration
		err   bool
	}{
		{"1s", "", "", 0, time.Second, false},
		{"", "", "", time.Minute, time.Minute, false},
		{"1h", "", "", 0, time.Hour, false},
		{"invalid", "", "", 0, 0, true},
		{"invalid", "1s", "", 0, time.Second, false},
		{"1s", "invalid", "", 0, 0, true},
		{"invalid", "invalid", "1s", 0, time.Second, false},
		{"1s", "1s", "invalid", 0, 0, true},
		{"invalid", "invalid", "invalid", 0, 0, true},
	}

	for i, tc := range cases {
		resetEnv()
		setupEnv(tc.value, tc.alt1, tc.alt2)
		val, err := envDurationOrError(tc.def, testKey, alt1Key, alt2Key)
		if err != nil && !tc.err {
			t.Fatalf("%d: %q: unexpected error: %v", i, tc.value, err)
		}
		if err == nil && tc.err {
			t.Fatalf("%d: %q: unexpected success", i, tc.value)
		}
		if val != tc.exp {
			t.Fatalf("%d: expected: %v, got: %v", i, tc.exp, val)
		}
	}
}


================================================
FILE: go.mod
================================================
module k8s.io/git-sync

require (
	github.com/go-logr/logr v1.2.3
	github.com/golang-jwt/jwt/v4 v4.5.2
	github.com/prometheus/client_golang v1.14.0
	github.com/spf13/pflag v1.0.5
	go.uber.org/goleak v1.2.1
	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
)

require (
	github.com/beorn7/perks v1.0.1 // indirect
	github.com/cespare/xxhash/v2 v2.1.2 // indirect
	github.com/golang/protobuf v1.5.2 // indirect
	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
	github.com/prometheus/client_model v0.3.0 // indirect
	github.com/prometheus/common v0.37.0 // indirect
	github.com/prometheus/procfs v0.8.0 // indirect
	google.golang.org/protobuf v1.33.0 // indirect
)

go 1.23


================================================
FILE: go.sum
================================================
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
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-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
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/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/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
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.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
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.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
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.4.1/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.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/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/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/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
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/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/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.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
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.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=
github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
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.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
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/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.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
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-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
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/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-20190108225652-1e06a53dbb7e/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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
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-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
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-20190227155943-e225da77a7e6/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-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/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-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/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-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
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/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
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.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
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.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
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.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
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-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
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.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=


================================================
FILE: main.go
================================================
/*
Copyright 2014 The Kubernetes Authors 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.
*/

// git-sync is a command that pulls a git repository to a local directory.

package main // import "k8s.io/git-sync/cmd/git-sync"

import (
	"context"
	"crypto/md5"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"io/fs"
	"net"
	"net/http"
	"net/http/pprof"
	"net/url"
	"os"
	"os/exec"
	"os/signal"
	"os/user"
	"path/filepath"
	"strconv"
	"strings"
	"sync"
	"syscall"
	"time"

	"github.com/golang-jwt/jwt/v4"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"github.com/spf13/pflag"
	"golang.org/x/sys/unix"
	"k8s.io/git-sync/pkg/cmd"
	"k8s.io/git-sync/pkg/hook"
	"k8s.io/git-sync/pkg/logging"
	"k8s.io/git-sync/pkg/pid1"
	"k8s.io/git-sync/pkg/version"
)

var (
	metricSyncDuration = prometheus.NewSummaryVec(prometheus.SummaryOpts{
		Name: "git_sync_duration_seconds",
		Help: "Summary of git_sync durations",
	}, []string{"status"})

	metricSyncCount = prometheus.NewCounterVec(prometheus.CounterOpts{
		Name: "git_sync_count_total",
		Help: "How many git syncs completed, partitioned by state (success, error, noop)",
	}, []string{"status"})

	metricFetchCount = prometheus.NewCounter(prometheus.CounterOpts{
		Name: "git_fetch_count_total",
		Help: "How many git fetches were run",
	})

	metricAskpassCount = prometheus.NewCounterVec(prometheus.CounterOpts{
		Name: "git_sync_askpass_calls",
		Help: "How many git askpass calls completed, partitioned by state (success, error)",
	}, []string{"status"})

	metricRefreshGitHubAppTokenCount = prometheus.NewCounterVec(prometheus.CounterOpts{
		Name: "git_sync_refresh_github_app_token_count",
		Help: "How many times the GitHub app token was refreshed, partitioned by state (success, error)",
	}, []string{"status"})
)

func init() {
	prometheus.MustRegister(metricSyncDuration)
	prometheus.MustRegister(metricSyncCount)
	prometheus.MustRegister(metricFetchCount)
	prometheus.MustRegister(metricAskpassCount)
	prometheus.MustRegister(metricRefreshGitHubAppTokenCount)
}

const (
	metricKeySuccess = "success"
	metricKeyError   = "error"
	metricKeyNoOp    = "noop"
)

type submodulesMode string

const (
	submodulesRecursive submodulesMode = "recursive"
	submodulesShallow   submodulesMode = "shallow"
	submodulesOff       submodulesMode = "off"
)

type gcMode string

const (
	gcAuto       = "auto"
	gcAlways     = "always"
	gcAggressive = "aggressive"
	gcOff        = "off"
)

const defaultDirMode = os.FileMode(0775) // subject to umask

// repoSync represents the remote repo and the local sync of it.
type repoSync struct {
	cmd            string         // the git command to run
	root           absPath        // absolute path to the root directory
	repo           string         // remote repo to sync
	ref            string         // the ref to sync
	depth          int            // for shallow sync
	submodules     submodulesMode // how to handle submodules
	gc             gcMode         // garbage collection
	link           absPath        // absolute path to the symlink to publish
	authURL        string         // a URL to re-fetch credentials, or ""
	sparseFile     string         // path to a sparse-checkout file
	syncCount      int            // how many times have we synced?
	log            *logging.Logger
	run            cmd.Runner
	staleTimeout   time.Duration // time for worktrees to be cleaned up
	appTokenExpiry time.Time     // time when github app auth token expires
}

func main() {
	// In case we come up as pid 1, act as init.
	if os.Getpid() == 1 {
		fmt.Fprintf(os.Stderr, "INFO: detected pid 1, running init handler\n")
		code, err := pid1.ReRun()
		if err == nil {
			os.Exit(code)
		}
		fmt.Fprintf(os.Stderr, "FATAL: unhandled pid1 error: %v\n", err)
		os.Exit(127)
	}

	//
	// Declare flags inside main() so they are not used as global variables.
	//

	flVersion := pflag.Bool("version", false, "print the version and exit")
	flHelp := pflag.BoolP("help", "h", false, "print help text and exit")
	pflag.BoolVarP(flHelp, "__?", "?", false, "") // support -? as an alias to -h
	mustMarkHidden("__?")
	flManual := pflag.Bool("man", false, "print the full manual and exit")

	flVerbose := pflag.IntP("verbose", "v",
		envInt(0, "GITSYNC_VERBOSE"),
		"logs at this V level and lower will be printed")

	flRepo := pflag.String("repo",
		envString("", "GITSYNC_REPO", "GIT_SYNC_REPO"),
		"the git repository to sync (required)")
	flRef := pflag.String("ref",
		envString("HEAD", "GITSYNC_REF"),
		"the git revision (branch, tag, or hash) to sync")
	flDepth := pflag.Int("depth",
		envInt(1, "GITSYNC_DEPTH", "GIT_SYNC_DEPTH"),
		"create a shallow clone with history truncated to the specified number of commits")
	flSubmodules := pflag.String("submodules",
		envString("recursive", "GITSYNC_SUBMODULES", "GIT_SYNC_SUBMODULES"),
		"git submodule behavior: one of 'recursive', 'shallow', or 'off'")
	flSparseCheckoutFile := pflag.String("sparse-checkout-file",
		envString("", "GITSYNC_SPARSE_CHECKOUT_FILE", "GIT_SYNC_SPARSE_CHECKOUT_FILE"),
		"the path to a sparse-checkout file")

	flRoot := pflag.String("root",
		envString("", "GITSYNC_ROOT", "GIT_SYNC_ROOT"),
		"the root directory for git-sync operations (required)")
	flLink := pflag.String("link",
		envString("", "GITSYNC_LINK", "GIT_SYNC_LINK"),
		"the path (absolute or relative to --root) at which to create a symlink to the directory holding the checked-out files (defaults to the leaf dir of --repo)")
	flErrorFile := pflag.String("error-file",
		envString("", "GITSYNC_ERROR_FILE", "GIT_SYNC_ERROR_FILE"),
		"the path (absolute or relative to --root) to an optional file into which errors will be written (defaults to disabled)")
	flPeriod := pflag.Duration("period",
		envDuration(10*time.Second, "GITSYNC_PERIOD", "GIT_SYNC_PERIOD"),
		"how long to wait between syncs, must be >= 10ms; --wait overrides this")
	flSyncTimeout := pflag.Duration("sync-timeout",
		envDuration(120*time.Second, "GITSYNC_SYNC_TIMEOUT", "GIT_SYNC_SYNC_TIMEOUT"),
		"the total time allowed for one complete sync, must be >= 10ms; --timeout overrides this")
	flOneTime := pflag.Bool("one-time",
		envBool(false, "GITSYNC_ONE_TIME", "GIT_SYNC_ONE_TIME"),
		"exit after the first sync")
	flSyncOnSignal := pflag.String("sync-on-signal",
		envString("", "GITSYNC_SYNC_ON_SIGNAL", "GIT_SYNC_SYNC_ON_SIGNAL"),
		"sync on receipt of the specified signal (e.g. SIGHUP)")
	flMaxFailures := pflag.Int("max-failures",
		envInt(0, "GITSYNC_MAX_FAILURES", "GIT_SYNC_MAX_FAILURES"),
		"the number of consecutive failures allowed before aborting (-1 will retry forever")
	flTouchFile := pflag.String("touch-file",
		envString("", "GITSYNC_TOUCH_FILE", "GIT_SYNC_TOUCH_FILE"),
		"the path (absolute or relative to --root) to an optional file which will be touched whenever a sync completes (defaults to disabled)")
	flAddUser := pflag.Bool("add-user",
		envBool(false, "GITSYNC_ADD_USER", "GIT_SYNC_ADD_USER"),
		"add a record to /etc/passwd for the current UID/GID (needed to use SSH with an arbitrary UID)")
	flGroupWrite := pflag.Bool("group-write",
		envBool(false, "GITSYNC_GROUP_WRITE", "GIT_SYNC_GROUP_WRITE"),
		"ensure that all data (repo, worktrees, etc.) is group writable")
	flStaleWorktreeTimeout := pflag.Duration("stale-worktree-timeout", envDuration(0, "GITSYNC_STALE_WORKTREE_TIMEOUT"),
		"how long to retain non-current worktrees")

	flExechookCommand := pflag.String("exechook-command",
		envString("", "GITSYNC_EXECHOOK_COMMAND", "GIT_SYNC_EXECHOOK_COMMAND"),
		"an optional command to be run when syncs complete (must be idempotent)")
	flExechookTimeout := pflag.Duration("exechook-timeout",
		envDuration(30*time.Second, "GITSYNC_EXECHOOK_TIMEOUT", "GIT_SYNC_EXECHOOK_TIMEOUT"),
		"the timeout for the exechook")
	flExechookBackoff := pflag.Duration("exechook-backoff",
		envDuration(3*time.Second, "GITSYNC_EXECHOOK_BACKOFF", "GIT_SYNC_EXECHOOK_BACKOFF"),
		"the time to wait before retrying a failed exechook")

	flWebhookURL := pflag.String("webhook-url",
		envString("", "GITSYNC_WEBHOOK_URL", "GIT_SYNC_WEBHOOK_URL"),
		"a URL for optional webhook notifications when syncs complete (must be idempotent)")
	flWebhookMethod := pflag.String("webhook-method",
		envString("POST", "GITSYNC_WEBHOOK_METHOD", "GIT_SYNC_WEBHOOK_METHOD"),
		"the HTTP method for the webhook")
	flWebhookStatusSuccess := pflag.Int("webhook-success-status",
		envInt(200, "GITSYNC_WEBHOOK_SUCCESS_STATUS", "GIT_SYNC_WEBHOOK_SUCCESS_STATUS"),
		"the HTTP status code indicating a successful webhook (0 disables success checks")
	flWebhookTimeout := pflag.Duration("webhook-timeout",
		envDuration(1*time.Second, "GITSYNC_WEBHOOK_TIMEOUT", "GIT_SYNC_WEBHOOK_TIMEOUT"),
		"the timeout for the webhook")
	flWebhookBackoff := pflag.Duration("webhook-backoff",
		envDuration(3*time.Second, "GITSYNC_WEBHOOK_BACKOFF", "GIT_SYNC_WEBHOOK_BACKOFF"),
		"the time to wait before retrying a failed webhook")

	flUsername := pflag.String("username",
		envString("", "GITSYNC_USERNAME", "GIT_SYNC_USERNAME"),
		"the username to use for git auth")
	flPassword := envFlagString("GITSYNC_PASSWORD", "",
		"the password or personal access token to use for git auth",
		"GIT_SYNC_PASSWORD")
	flPasswordFile := pflag.String("password-file",
		envString("", "GITSYNC_PASSWORD_FILE", "GIT_SYNC_PASSWORD_FILE"),
		"the file from which the password or personal access token for git auth will be sourced")
	flCredentials := pflagCredentialSlice("credential", envString("", "GITSYNC_CREDENTIAL"), "one or more credentials (see --man for details) available for authentication")

	flSSHKeyFiles := pflag.StringArray("ssh-key-file",
		envStringArray("/etc/git-secret/ssh", "GITSYNC_SSH_KEY_FILE", "GIT_SYNC_SSH_KEY_FILE", "GIT_SSH_KEY_FILE"),
		"the SSH key(s) to use")
	flSSHKnownHosts := pflag.Bool("ssh-known-hosts",
		envBool(true, "GITSYNC_SSH_KNOWN_HOSTS", "GIT_SYNC_KNOWN_HOSTS", "GIT_KNOWN_HOSTS"),
		"enable SSH known_hosts verification")
	flSSHKnownHostsFile := pflag.String("ssh-known-hosts-file",
		envString("/etc/git-secret/known_hosts", "GITSYNC_SSH_KNOWN_HOSTS_FILE", "GIT_SYNC_SSH_KNOWN_HOSTS_FILE", "GIT_SSH_KNOWN_HOSTS_FILE"),
		"the known_hosts file to use")

	flCookieFile := pflag.Bool("cookie-file",
		envBool(false, "GITSYNC_COOKIE_FILE", "GIT_SYNC_COOKIE_FILE", "GIT_COOKIE_FILE"),
		"use a git cookiefile (/etc/git-secret/cookie_file) for authentication")

	flAskPassURL := pflag.String("askpass-url",
		envString("", "GITSYNC_ASKPASS_URL", "GIT_SYNC_ASKPASS_URL", "GIT_ASKPASS_URL"),
		"a URL to query for git credentials (username=<value> and password=<value>)")

	flGithubBaseURL := pflag.String("github-base-url",
		envString("https://api.github.com/", "GITSYNC_GITHUB_BASE_URL"),
		"the GitHub base URL to use when making requests to GitHub when using GitHub app auth")
	flGithubAppPrivateKey := envFlagString("GITSYNC_GITHUB_APP_PRIVATE_KEY", "",
		"the private key to use for GitHub app auth")
	flGithubAppPrivateKeyFile := pflag.String("github-app-private-key-file",
		envString("", "GITSYNC_GITHUB_APP_PRIVATE_KEY_FILE"),
		"the file from which the private key for GitHub app auth will be sourced")
	flGithubAppClientID := pflag.String("github-app-client-id",
		envString("", "GITSYNC_GITHUB_APP_CLIENT_ID"),
		"the GitHub app client ID to use for GitHub app auth")
	flGithubAppApplicationID := pflag.Int("github-app-application-id",
		envInt(0, "GITSYNC_GITHUB_APP_APPLICATION_ID"),
		"the GitHub app application ID to use for GitHub app auth")
	flGithubAppInstallationID := pflag.Int("github-app-installation-id",
		envInt(0, "GITSYNC_GITHUB_APP_INSTALLATION_ID"),
		"the GitHub app installation ID to use for GitHub app auth")

	flGitCmd := pflag.String("git",
		envString("git", "GITSYNC_GIT", "GIT_SYNC_GIT"),
		"the git command to run (subject to PATH search, mostly for testing)")
	flGitConfig := pflag.String("git-config",
		envString("", "GITSYNC_GIT_CONFIG", "GIT_SYNC_GIT_CONFIG"),
		"additional git config options in 'section.var1:val1,\"section.sub.var2\":\"val2\"' format")
	flGitGC := pflag.String("git-gc",
		envString("always", "GITSYNC_GIT_GC", "GIT_SYNC_GIT_GC"),
		"git garbage collection behavior: one of 'auto', 'always', 'aggressive', or 'off'")

	flHTTPBind := pflag.String("http-bind",
		envString("", "GITSYNC_HTTP_BIND", "GIT_SYNC_HTTP_BIND"),
		"the bind address (including port) for git-sync's HTTP endpoint")
	flHTTPMetrics := pflag.Bool("http-metrics",
		envBool(false, "GITSYNC_HTTP_METRICS", "GIT_SYNC_HTTP_METRICS"),
		"enable metrics on git-sync's HTTP endpoint")
	flHTTPprof := pflag.Bool("http-pprof",
		envBool(false, "GITSYNC_HTTP_PPROF", "GIT_SYNC_HTTP_PPROF"),
		"enable the pprof debug endpoints on git-sync's HTTP endpoint")

	// Obsolete flags, kept for compat.
	flDeprecatedBranch := pflag.String("branch", envString("", "GIT_SYNC_BRANCH"),
		"DEPRECATED: use --ref instead")
	mustMarkDeprecated("branch", "use --ref instead")

	flDeprecatedChmod := pflag.Int("change-permissions", envInt(0, "GIT_SYNC_PERMISSIONS"),
		"DEPRECATED: use --group-write instead")
	mustMarkDeprecated("change-permissions", "use --group-write instead")

	flDeprecatedDest := pflag.String("dest", envString("", "GIT_SYNC_DEST"),
		"DEPRECATED: use --link instead")
	mustMarkDeprecated("dest", "use --link instead")

	flDeprecatedMaxSyncFailures := pflag.Int("max-sync-failures", envInt(0, "GIT_SYNC_MAX_SYNC_FAILURES"),
		"DEPRECATED: use --max-failures instead")
	mustMarkDeprecated("max-sync-failures", "use --max-failures instead")

	flDeprecatedPassword := pflag.String("password", "", // the env vars are not deprecated
		"DEPRECATED: use --password-file or $GITSYNC_PASSWORD instead")
	mustMarkDeprecated("password", "use --password-file or $GITSYNC_PASSWORD instead")

	flDeprecatedRev := pflag.String("rev", envString("", "GIT_SYNC_REV"),
		"DEPRECATED: use --ref instead")
	mustMarkDeprecated("rev", "use --ref instead")

	_ = pflag.Bool("ssh", false,
		"DEPRECATED: this flag is no longer necessary")
	mustMarkDeprecated("ssh", "no longer necessary")

	flDeprecatedSyncHookCommand := pflag.String("sync-hook-command", envString("", "GIT_SYNC_HOOK_COMMAND"),
		"DEPRECATED: use --exechook-command instead")
	mustMarkDeprecated("sync-hook-command", "use --exechook-command instead")

	flDeprecatedTimeout := pflag.Int("timeout", envInt(0, "GIT_SYNC_TIMEOUT"),
		"DEPRECATED: use --sync-timeout instead")
	mustMarkDeprecated("timeout", "use --sync-timeout instead")

	flDeprecatedV := pflag.Int("v", -1,
		"DEPRECATED: use -v or --verbose instead")
	mustMarkDeprecated("v", "use -v or --verbose instead")

	flDeprecatedWait := pflag.Float64("wait", envFloat(0, "GIT_SYNC_WAIT"),
		"DEPRECATED: use --period instead")
	mustMarkDeprecated("wait", "use --period instead")

	// For whatever reason pflag hardcodes stderr for the "usage" line when
	// using the default FlagSet.  We tweak the output a bit anyway.
	usage := func(out io.Writer, msg string) {
		// When pflag parsing hits an error, it prints a message before and
		// after the usage, which makes for nice reading.
		if msg != "" {
			fmt.Fprintln(out, msg)
		}
		fmt.Fprintf(out, "Usage: %s [FLAGS...]\n", filepath.Base(os.Args[0]))
		fmt.Fprintln(out, "")
		fmt.Fprintln(out, " FLAGS:")
		pflag.CommandLine.SetOutput(out)
		pflag.PrintDefaults()
		fmt.Fprintln(out, "")
		fmt.Fprintln(out, " ENVIRONMENT VARIABLES:")
		printEnvFlags(out)
		if msg != "" {
			fmt.Fprintln(out, msg)
		}
	}
	pflag.Usage = func() { usage(os.Stderr, "") }

	//
	// Parse and verify flags.  Errors here are fatal.
	//

	pflag.Parse()

	// Handle print-and-exit cases.
	if *flVersion {
		fmt.Fprintln(os.Stdout, version.VERSION)
		os.Exit(0)
	}
	if *flHelp {
		usage(os.Stdout, "")
		os.Exit(0)
	}
	if *flManual {
		printManPage()
		os.Exit(0)
	}

	// Make sure we have a root dir in which to work.
	if *flRoot == "" {
		usage(os.Stderr, "required flag: --root must be specified")
		os.Exit(1)
	}
	var absRoot absPath
	if abs, err := absPath(*flRoot).Canonical(); err != nil {
		fmt.Fprintf(os.Stderr, "FATAL: can't absolutize --root: %v\n", err)
		os.Exit(1)
	} else {
		absRoot = abs
	}

	// Init logging very early, so most errors can be written to a file.
	if *flDeprecatedV >= 0 {
		// Back-compat
		*flVerbose = *flDeprecatedV
	}
	log := func() *logging.Logger {
		dir, file := makeAbsPath(*flErrorFile, absRoot).Split()
		return logging.New(dir.String(), file, *flVerbose)
	}()
	cmdRunner := cmd.NewRunner(log)

	if *flRepo == "" {
		fatalConfigErrorf(log, true, "required flag: --repo must be specified")
	}

	switch {
	case *flDeprecatedBranch != "" && (*flDeprecatedRev == "" || *flDeprecatedRev == "HEAD"):
		// Back-compat
		log.V(0).Info("setting --ref from deprecated --branch")
		*flRef = *flDeprecatedBranch
	case *flDeprecatedRev != "" && *flDeprecatedBranch == "":
		// Back-compat
		log.V(0).Info("setting --ref from deprecated --rev")
		*flRef = *flDeprecatedRev
	case *flDeprecatedBranch != "" && *flDeprecatedRev != "":
		fatalConfigErrorf(log, true, "deprecated flag combo: can't set --ref from deprecated --branch and --rev (one or the other is OK)")
	}

	if *flRef == "" {
		fatalConfigErrorf(log, true, "required flag: --ref must be specified")
	}

	if *flDepth < 0 { // 0 means "no limit"
		fatalConfigErrorf(log, true, "invalid flag: --depth must be greater than or equal to 0")
	}

	switch submodulesMode(*flSubmodules) {
	case submodulesRecursive, submodulesShallow, submodulesOff:
	default:
		fatalConfigErrorf(log, true, "invalid flag: --submodules must be one of %q, %q, or %q", submodulesRecursive, submodulesShallow, submodulesOff)
	}

	switch *flGitGC {
	case gcAuto, gcAlways, gcAggressive, gcOff:
	default:
		fatalConfigErrorf(log, true, "invalid flag: --git-gc must be one of %q, %q, %q, or %q", gcAuto, gcAlways, gcAggressive, gcOff)
	}

	if *flDeprecatedDest != "" {
		// Back-compat
		log.V(0).Info("setting --link from deprecated --dest")
		*flLink = *flDeprecatedDest
	}
	if *flLink == "" {
		parts := strings.Split(strings.Trim(*flRepo, "/"), "/")
		*flLink = parts[len(parts)-1]
	}

	if *flDeprecatedWait != 0 {
		// Back-compat
		log.V(0).Info("setting --period from deprecated --wait")
		*flPeriod = time.Duration(int(*flDeprecatedWait*1000)) * time.Millisecond
	}
	if *flPeriod < 10*time.Millisecond {
		fatalConfigErrorf(log, true, "invalid flag: --period must be at least 10ms")
	}

	if *flDeprecatedChmod != 0 {
		fatalConfigErrorf(log, true, "deprecated flag: --change-permissions is no longer supported")
	}

	var syncSig syscall.Signal
	if *flSyncOnSignal != "" {
		if num, err := strconv.ParseInt(*flSyncOnSignal, 0, 0); err == nil {
			// sync-on-signal value is a number
		
Download .txt
gitextract_9jhqp98q/

├── .gitallowed
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       └── main.yml
├── .gitignore
├── .golangci.yaml
├── CONTRIBUTING.md
├── Dockerfile.in
├── LICENSE
├── Makefile
├── OWNERS
├── README.md
├── RELEASING.md
├── SECURITY.md
├── SECURITY_CONTACTS
├── _test_tools/
│   ├── exechook_command.sh
│   ├── exechook_command_fail.sh
│   ├── exechook_command_fail_with_sleep.sh
│   ├── exechook_command_git_archive.sh
│   ├── exechook_command_with_sleep.sh
│   ├── git_askpass.sh
│   ├── git_slow_fetch.sh
│   ├── httpd/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── nginx.conf
│   │   └── run.sh
│   ├── ncsvr/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   └── ncsvr.sh
│   └── sshd/
│       ├── Dockerfile
│       ├── README.md
│       ├── sshd.sh
│       └── sshd_config
├── abspath.go
├── abspath_test.go
├── build/
│   ├── build.sh
│   └── test.sh
├── code-of-conduct.md
├── credential.go
├── demo/
│   ├── README.md
│   ├── deployment.yaml
│   ├── html/
│   │   └── index.html
│   └── service.yaml
├── docs/
│   ├── askpass-url.md
│   ├── cookie-file.md
│   ├── dev/
│   │   └── testing_github_app_auth.md
│   ├── kubernetes.md
│   ├── proxy.md
│   └── ssh.md
├── env.go
├── env_test.go
├── go.mod
├── go.sum
├── main.go
├── main_test.go
├── pkg/
│   ├── cmd/
│   │   └── cmd.go
│   ├── hook/
│   │   ├── exechook.go
│   │   ├── exechook_test.go
│   │   ├── hook.go
│   │   ├── hook_test.go
│   │   ├── webhook.go
│   │   └── webhook_test.go
│   ├── logging/
│   │   └── logging.go
│   ├── pid1/
│   │   └── pid1.go
│   └── version/
│       └── version.go
├── stage_binaries.sh
├── test_e2e.sh
├── test_git.sh
├── tools/
│   ├── go.mod
│   ├── go.sum
│   └── tools.go
├── v3-to-v4.md
└── vendor/
    ├── github.com/
    │   ├── beorn7/
    │   │   └── perks/
    │   │       ├── LICENSE
    │   │       └── quantile/
    │   │           ├── exampledata.txt
    │   │           └── stream.go
    │   ├── cespare/
    │   │   └── xxhash/
    │   │       └── v2/
    │   │           ├── LICENSE.txt
    │   │           ├── README.md
    │   │           ├── xxhash.go
    │   │           ├── xxhash_amd64.go
    │   │           ├── xxhash_amd64.s
    │   │           ├── xxhash_other.go
    │   │           ├── xxhash_safe.go
    │   │           └── xxhash_unsafe.go
    │   ├── go-logr/
    │   │   └── logr/
    │   │       ├── .golangci.yaml
    │   │       ├── CHANGELOG.md
    │   │       ├── CONTRIBUTING.md
    │   │       ├── LICENSE
    │   │       ├── README.md
    │   │       ├── discard.go
    │   │       ├── funcr/
    │   │       │   └── funcr.go
    │   │       └── logr.go
    │   ├── golang/
    │   │   └── 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
    │   │       └── ptypes/
    │   │           └── timestamp/
    │   │               └── timestamp.pb.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
    │   ├── matttproud/
    │   │   └── golang_protobuf_extensions/
    │   │       ├── LICENSE
    │   │       ├── NOTICE
    │   │       └── pbutil/
    │   │           ├── .gitignore
    │   │           ├── Makefile
    │   │           ├── decode.go
    │   │           ├── doc.go
    │   │           └── encode.go
    │   ├── prometheus/
    │   │   ├── client_golang/
    │   │   │   ├── LICENSE
    │   │   │   ├── NOTICE
    │   │   │   └── prometheus/
    │   │   │       ├── .gitignore
    │   │   │       ├── README.md
    │   │   │       ├── build_info_collector.go
    │   │   │       ├── collector.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_js.go
    │   │   │       ├── process_collector_other.go
    │   │   │       ├── process_collector_windows.go
    │   │   │       ├── promhttp/
    │   │   │       │   ├── delegator.go
    │   │   │       │   ├── http.go
    │   │   │       │   ├── instrument_client.go
    │   │   │       │   ├── instrument_server.go
    │   │   │       │   └── option.go
    │   │   │       ├── registry.go
    │   │   │       ├── summary.go
    │   │   │       ├── timer.go
    │   │   │       ├── untyped.go
    │   │   │       ├── value.go
    │   │   │       ├── vec.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
    │   │   │   ├── internal/
    │   │   │   │   └── bitbucket.org/
    │   │   │   │       └── ww/
    │   │   │   │           └── goautoneg/
    │   │   │   │               ├── README.txt
    │   │   │   │               └── autoneg.go
    │   │   │   └── model/
    │   │   │       ├── alert.go
    │   │   │       ├── fingerprinting.go
    │   │   │       ├── fnv.go
    │   │   │       ├── labels.go
    │   │   │       ├── labelset.go
    │   │   │       ├── metric.go
    │   │   │       ├── model.go
    │   │   │       ├── signature.go
    │   │   │       ├── silence.go
    │   │   │       ├── time.go
    │   │   │       └── value.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_mipsx.go
    │   │       ├── cpuinfo_others.go
    │   │       ├── cpuinfo_ppcx.go
    │   │       ├── cpuinfo_riscvx.go
    │   │       ├── cpuinfo_s390x.go
    │   │       ├── cpuinfo_x86.go
    │   │       ├── crypto.go
    │   │       ├── doc.go
    │   │       ├── fs.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_ip_socket.go
    │   │       ├── net_protocols.go
    │   │       ├── net_sockstat.go
    │   │       ├── net_softnet.go
    │   │       ├── net_tcp.go
    │   │       ├── net_udp.go
    │   │       ├── net_unix.go
    │   │       ├── net_xfrm.go
    │   │       ├── netstat.go
    │   │       ├── proc.go
    │   │       ├── proc_cgroup.go
    │   │       ├── proc_cgroups.go
    │   │       ├── proc_environ.go
    │   │       ├── proc_fdinfo.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
    │   │       ├── ttar
    │   │       ├── vm.go
    │   │       └── zoneinfo.go
    │   └── spf13/
    │       └── pflag/
    │           ├── .gitignore
    │           ├── .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
    │           ├── 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
    ├── golang.org/
    │   └── x/
    │       └── sys/
    │           ├── AUTHORS
    │           ├── CONTRIBUTORS
    │           ├── LICENSE
    │           ├── PATENTS
    │           ├── internal/
    │           │   └── unsafeheader/
    │           │       └── unsafeheader.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_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
    │           │   ├── bluetooth_linux.go
    │           │   ├── 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
    │           │   ├── epoll_zos.go
    │           │   ├── errors_freebsd_386.go
    │           │   ├── errors_freebsd_amd64.go
    │           │   ├── errors_freebsd_arm.go
    │           │   ├── errors_freebsd_arm64.go
    │           │   ├── fcntl.go
    │           │   ├── fcntl_darwin.go
    │           │   ├── fcntl_linux_32bit.go
    │           │   ├── fdset.go
    │           │   ├── fstatfs_zos.go
    │           │   ├── gccgo.go
    │           │   ├── gccgo_c.c
    │           │   ├── gccgo_linux_amd64.go
    │           │   ├── ifreq_linux.go
    │           │   ├── ioctl.go
    │           │   ├── ioctl_linux.go
    │           │   ├── ioctl_zos.go
    │           │   ├── mkall.sh
    │           │   ├── mkerrors.sh
    │           │   ├── 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
    │           │   ├── str.go
    │           │   ├── syscall.go
    │           │   ├── syscall_aix.go
    │           │   ├── syscall_aix_ppc.go
    │           │   ├── syscall_aix_ppc64.go
    │           │   ├── syscall_bsd.go
    │           │   ├── syscall_darwin.1_12.go
    │           │   ├── syscall_darwin.1_13.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_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_mips64.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
    │           │   ├── 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_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_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
    │           │   ├── zsyscall_aix_ppc.go
    │           │   ├── zsyscall_aix_ppc64.go
    │           │   ├── zsyscall_aix_ppc64_gc.go
    │           │   ├── zsyscall_aix_ppc64_gccgo.go
    │           │   ├── zsyscall_darwin_amd64.1_13.go
    │           │   ├── zsyscall_darwin_amd64.1_13.s
    │           │   ├── zsyscall_darwin_amd64.go
    │           │   ├── zsyscall_darwin_amd64.s
    │           │   ├── zsyscall_darwin_arm64.1_13.go
    │           │   ├── zsyscall_darwin_arm64.1_13.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_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_amd64.go
    │           │   ├── zsyscall_openbsd_arm.go
    │           │   ├── zsyscall_openbsd_arm64.go
    │           │   ├── zsyscall_openbsd_mips64.go
    │           │   ├── 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
    │           │   ├── 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_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_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_illumos_amd64.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_solaris_amd64.go
    │           │   └── ztypes_zos_s390x.go
    │           └── windows/
    │               ├── aliases.go
    │               ├── dll_windows.go
    │               ├── empty.s
    │               ├── env_windows.go
    │               ├── eventlog.go
    │               ├── exec_windows.go
    │               ├── memory_windows.go
    │               ├── mkerrors.bash
    │               ├── mkknownfolderids.bash
    │               ├── mksyscall.go
    │               ├── race.go
    │               ├── race0.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
    ├── google.golang.org/
    │   └── protobuf/
    │       ├── LICENSE
    │       ├── PATENTS
    │       ├── encoding/
    │       │   ├── 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
    │       │   ├── encoding/
    │       │   │   ├── defval/
    │       │   │   │   └── default.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
    │       │   │   ├── is_go112.go
    │       │   │   └── is_go113.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
    │       │   │   ├── source_context_gen.go
    │       │   │   ├── struct_gen.go
    │       │   │   ├── timestamp_gen.go
    │       │   │   ├── type_gen.go
    │       │   │   ├── wrappers.go
    │       │   │   └── wrappers_gen.go
    │       │   ├── impl/
    │       │   │   ├── api_export.go
    │       │   │   ├── checkinit.go
    │       │   │   ├── codec_extension.go
    │       │   │   ├── codec_field.go
    │       │   │   ├── codec_gen.go
    │       │   │   ├── codec_map.go
    │       │   │   ├── codec_map_go111.go
    │       │   │   ├── codec_map_go112.go
    │       │   │   ├── codec_message.go
    │       │   │   ├── codec_messageset.go
    │       │   │   ├── codec_reflect.go
    │       │   │   ├── codec_tables.go
    │       │   │   ├── codec_unsafe.go
    │       │   │   ├── convert.go
    │       │   │   ├── convert_list.go
    │       │   │   ├── convert_map.go
    │       │   │   ├── decode.go
    │       │   │   ├── encode.go
    │       │   │   ├── enum.go
    │       │   │   ├── extension.go
    │       │   │   ├── legacy_enum.go
    │       │   │   ├── legacy_export.go
    │       │   │   ├── legacy_extension.go
    │       │   │   ├── legacy_file.go
    │       │   │   ├── legacy_message.go
    │       │   │   ├── merge.go
    │       │   │   ├── merge_gen.go
    │       │   │   ├── message.go
    │       │   │   ├── message_reflect.go
    │       │   │   ├── message_reflect_field.go
    │       │   │   ├── message_reflect_gen.go
    │       │   │   ├── pointer_reflect.go
    │       │   │   ├── pointer_unsafe.go
    │       │   │   ├── validate.go
    │       │   │   └── weak.go
    │       │   ├── order/
    │       │   │   ├── order.go
    │       │   │   └── range.go
    │       │   ├── pragma/
    │       │   │   └── pragma.go
    │       │   ├── set/
    │       │   │   └── ints.go
    │       │   ├── strs/
    │       │   │   ├── strings.go
    │       │   │   ├── strings_pure.go
    │       │   │   ├── strings_unsafe_go120.go
    │       │   │   └── strings_unsafe_go121.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
    │       │   └── wrappers.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_pure.go
    │       │   │   ├── value_union.go
    │       │   │   ├── value_unsafe_go120.go
    │       │   │   └── value_unsafe_go121.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
    │           │   └── go_features.proto
    │           └── known/
    │               └── timestamppb/
    │                   └── timestamp.pb.go
    └── modules.txt
Download .txt
Showing preview only (7,821K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (91090 symbols across 619 files)

FILE: abspath.go
  type absPath (line 29) | type absPath
    method String (line 32) | func (abs absPath) String() string {
    method Canonical (line 39) | func (abs absPath) Canonical() (absPath, error) {
    method Join (line 53) | func (abs absPath) Join(elems ...string) absPath {
    method Split (line 63) | func (abs absPath) Split() (absPath, string) {
    method Dir (line 81) | func (abs absPath) Dir() string {
    method Base (line 87) | func (abs absPath) Base() string {

FILE: abspath_test.go
  function TestAbsPathString (line 23) | func TestAbsPathString(t *testing.T) {
  function TestAbsPathCanonical (line 46) | func TestAbsPathCanonical(t *testing.T) {
  function TestAbsPathJoin (line 84) | func TestAbsPathJoin(t *testing.T) {
  function TestAbsPathSplit (line 130) | func TestAbsPathSplit(t *testing.T) {
  function TestAbsPathDir (line 173) | func TestAbsPathDir(t *testing.T) {
  function TestAbsPathBase (line 204) | func TestAbsPathBase(t *testing.T) {

FILE: credential.go
  type credential (line 27) | type credential struct
    method String (line 34) | func (c credential) String() string {
  type credentialSliceValue (line 43) | type credentialSliceValue struct
    method unmarshal (line 60) | func (cs credentialSliceValue) unmarshal(val string, out any) error {
    method decodeObject (line 67) | func (cs credentialSliceValue) decodeObject(val string) (credential, e...
    method decodeList (line 76) | func (cs credentialSliceValue) decodeList(val string) ([]credential, e...
    method decode (line 85) | func (cs credentialSliceValue) decode(val string) ([]credential, error) {
    method Set (line 103) | func (cs *credentialSliceValue) Set(val string) error {
    method Type (line 119) | func (cs credentialSliceValue) Type() string {
    method String (line 123) | func (cs credentialSliceValue) String() string {
    method Append (line 134) | func (cs *credentialSliceValue) Append(val string) error {
    method Replace (line 143) | func (cs *credentialSliceValue) Replace(val []string) error {
    method GetSlice (line 156) | func (cs credentialSliceValue) GetSlice() []string {
  function pflagCredentialSlice (line 52) | func pflagCredentialSlice(name, def, usage string) *[]credential {

FILE: env.go
  function envWarnf (line 35) | func envWarnf(format string, args ...any) {
  function envString (line 43) | func envString(def string, key string, alts ...string) string {
  function envFlagString (line 69) | func envFlagString(key string, def string, usage string, alts ...string)...
  function envStringArray (line 83) | func envStringArray(def string, key string, alts ...string) []string {
  function envBoolOrError (line 115) | func envBoolOrError(def bool, key string, alts ...string) (bool, error) {
  function envBool (line 149) | func envBool(def bool, key string, alts ...string) bool {
  function envIntOrError (line 159) | func envIntOrError(def int, key string, alts ...string) (int, error) {
  function envInt (line 193) | func envInt(def int, key string, alts ...string) int {
  function envFloatOrError (line 203) | func envFloatOrError(def float64, key string, alts ...string) (float64, ...
  function envFloat (line 237) | func envFloat(def float64, key string, alts ...string) float64 {
  function envDurationOrError (line 247) | func envDurationOrError(def time.Duration, key string, alts ...string) (...
  function envDuration (line 281) | func envDuration(def time.Duration, key string, alts ...string) time.Dur...
  type explicitFlag (line 293) | type explicitFlag struct
  function newExplicitFlag (line 300) | func newExplicitFlag[T comparable](ptr *T, name, usage string, fn func(n...
  method Set (line 312) | func (h *explicitFlag[T]) Set(val string) error {
  type envFlag (line 327) | type envFlag struct
  function registerEnvFlag (line 337) | func registerEnvFlag(name, typ, help string) {
  function printEnvFlags (line 348) | func printEnvFlags(out io.Writer) {

FILE: env_test.go
  constant testKey (line 26) | testKey = "KEY"
  constant alt1Key (line 27) | alt1Key = "ALT1"
  constant alt2Key (line 28) | alt2Key = "ALT2"
  function setupEnv (line 31) | func setupEnv(val, alt1, alt2 string) {
  function resetEnv (line 43) | func resetEnv() {
  function TestEnvBool (line 49) | func TestEnvBool(t *testing.T) {
  function TestEnvString (line 95) | func TestEnvString(t *testing.T) {
  function TestEnvInt (line 130) | func TestEnvInt(t *testing.T) {
  function TestEnvFloat (line 171) | func TestEnvFloat(t *testing.T) {
  function TestEnvDuration (line 212) | func TestEnvDuration(t *testing.T) {

FILE: main.go
  function init (line 83) | func init() {
  constant metricKeySuccess (line 92) | metricKeySuccess = "success"
  constant metricKeyError (line 93) | metricKeyError   = "error"
  constant metricKeyNoOp (line 94) | metricKeyNoOp    = "noop"
  type submodulesMode (line 97) | type submodulesMode
  constant submodulesRecursive (line 100) | submodulesRecursive submodulesMode = "recursive"
  constant submodulesShallow (line 101) | submodulesShallow   submodulesMode = "shallow"
  constant submodulesOff (line 102) | submodulesOff       submodulesMode = "off"
  type gcMode (line 105) | type gcMode
  constant gcAuto (line 108) | gcAuto       = "auto"
  constant gcAlways (line 109) | gcAlways     = "always"
  constant gcAggressive (line 110) | gcAggressive = "aggressive"
  constant gcOff (line 111) | gcOff        = "off"
  constant defaultDirMode (line 114) | defaultDirMode = os.FileMode(0775)
  type repoSync (line 117) | type repoSync struct
    method Run (line 1201) | func (git *repoSync) Run(ctx context.Context, cwd absPath, args ...str...
    method RunWithStdin (line 1206) | func (git *repoSync) RunWithStdin(ctx context.Context, cwd absPath, st...
    method initRepo (line 1213) | func (git *repoSync) initRepo(ctx context.Context) error {
    method removeStaleWorktrees (line 1278) | func (git *repoSync) removeStaleWorktrees() (int, error) {
    method sanityCheckRepo (line 1316) | func (git *repoSync) sanityCheckRepo(ctx context.Context) bool {
    method sanityCheckWorktree (line 1363) | func (git *repoSync) sanityCheckWorktree(ctx context.Context, worktree...
    method publishSymlink (line 1450) | func (git *repoSync) publishSymlink(worktree worktree) error {
    method removeWorktree (line 1481) | func (git *repoSync) removeWorktree(ctx context.Context, worktree work...
    method createWorktree (line 1502) | func (git *repoSync) createWorktree(ctx context.Context, hash string) ...
    method configureWorktree (line 1525) | func (git *repoSync) configureWorktree(ctx context.Context, worktree w...
    method cleanup (line 1612) | func (git *repoSync) cleanup(ctx context.Context) error {
    method worktreeFor (line 1696) | func (git *repoSync) worktreeFor(hash string) worktree {
    method currentWorktree (line 1701) | func (git *repoSync) currentWorktree() (worktree, error) {
    method SyncRepo (line 1719) | func (git *repoSync) SyncRepo(ctx context.Context, refreshCreds func(c...
    method fetch (line 1844) | func (git *repoSync) fetch(ctx context.Context, ref string) error {
    method isShallow (line 1870) | func (git *repoSync) isShallow(ctx context.Context) (bool, error) {
    method StoreCredentials (line 1895) | func (git *repoSync) StoreCredentials(ctx context.Context, url, userna...
    method SetupGitSSH (line 1908) | func (git *repoSync) SetupGitSSH(setupKnownHosts bool, pathsToSSHSecre...
    method SetupCookieFile (line 1947) | func (git *repoSync) SetupCookieFile(ctx context.Context) error {
    method CallAskPassURL (line 1972) | func (git *repoSync) CallAskPassURL(ctx context.Context) error {
    method RefreshGitHubAppToken (line 2028) | func (git *repoSync) RefreshGitHubAppToken(ctx context.Context, github...
    method SetupDefaultGitConfigs (line 2117) | func (git *repoSync) SetupDefaultGitConfigs(ctx context.Context) error {
    method SetupExtraGitConfigs (line 2150) | func (git *repoSync) SetupExtraGitConfigs(ctx context.Context, configs...
  function main (line 135) | func main() {
  function mustMarkDeprecated (line 1010) | func mustMarkDeprecated(name string, usageMessage string) {
  function mustMarkHidden (line 1020) | func mustMarkHidden(name string) {
  function makeAbsPath (line 1031) | func makeAbsPath(path string, root absPath) absPath {
  function touch (line 1043) | func touch(path absPath) error {
  constant redactedString (line 1059) | redactedString = "REDACTED"
  function redactURL (line 1061) | func redactURL(urlstr string) string {
  function logSafeFlags (line 1078) | func logSafeFlags(v int) []string {
  function updateSyncMetrics (line 1126) | func updateSyncMetrics(key string, start time.Time) {
  function getRepoReady (line 1135) | func getRepoReady() bool {
  function setRepoReady (line 1141) | func setRepoReady() {
  function sleepForever (line 1149) | func sleepForever() {
  function fatalConfigErrorf (line 1161) | func fatalConfigErrorf(log *logging.Logger, printUsage bool, format stri...
  function addUser (line 1175) | func addUser() error {
  function hasGitLockFile (line 1301) | func hasGitLockFile(gitRoot absPath) (string, error) {
  function dirIsEmpty (line 1396) | func dirIsEmpty(dir absPath) (bool, error) {
  function removeDirContents (line 1405) | func removeDirContents(dir absPath, log *logging.Logger) error {
  function removeDirContentsIf (line 1411) | func removeDirContentsIf(dir absPath, log *logging.Logger, fn func(fi os...
  type multiError (line 1659) | type multiError
    method Error (line 1661) | func (m multiError) Error() string {
  type worktree (line 1676) | type worktree
    method Hash (line 1679) | func (wt worktree) Hash() string {
    method Path (line 1688) | func (wt worktree) Path() absPath {
  function md5sum (line 1885) | func md5sum(s string) string {
  type keyVal (line 2165) | type keyVal struct
  function parseGitConfigs (line 2170) | func parseGitConfigs(configsFlag string) ([]keyVal, error) {
  function parseGitConfigQKey (line 2231) | func parseGitConfigQKey(ch <-chan rune) (string, error) {
  function parseGitConfigKey (line 2248) | func parseGitConfigKey(r rune, ch <-chan rune) (string, error) {
  function parseGitConfigQVal (line 2263) | func parseGitConfigQVal(ch <-chan rune) (string, error) {
  function parseGitConfigVal (line 2277) | func parseGitConfigVal(r rune, ch <-chan rune) (string, error) {
  function parseQString (line 2299) | func parseQString(ch <-chan rune) (string, error) {
  function unescape (line 2320) | func unescape(ch <-chan rune) (rune, error) {
  function printManPage (line 2785) | func printManPage() {

FILE: main_test.go
  function TestMakeAbsPath (line 30) | func TestMakeAbsPath(t *testing.T) {
  function TestWorktreePath (line 57) | func TestWorktreePath(t *testing.T) {
  function TestWorktreeHash (line 80) | func TestWorktreeHash(t *testing.T) {
  function TestManualHasNoTabs (line 111) | func TestManualHasNoTabs(t *testing.T) {
  function TestParseGitConfigs (line 117) | func TestParseGitConfigs(t *testing.T) {
  function TestDirIsEmpty (line 251) | func TestDirIsEmpty(t *testing.T) {
  function TestRemoveDirContents (line 318) | func TestRemoveDirContents(t *testing.T) {
  function TestTouch (line 365) | func TestTouch(t *testing.T) {
  function TestHasGitLockFile (line 428) | func TestHasGitLockFile(t *testing.T) {

FILE: pkg/cmd/cmd.go
  type Runner (line 33) | type Runner struct
    method Run (line 51) | func (r Runner) Run(ctx context.Context, cwd string, env []string, com...
    method RunWithStdin (line 58) | func (r Runner) RunWithStdin(ctx context.Context, cwd string, env []st...
    method WithCallDepth (line 110) | func (r Runner) WithCallDepth(depth int) Runner {
  type logintf (line 38) | type logintf interface
  function NewRunner (line 46) | func NewRunner(log logintf) Runner {
  function runWithStdin (line 63) | func runWithStdin(ctx context.Context, log logintf, cwd string, env []st...
  function cmdForLog (line 96) | func cmdForLog(command string, args ...string) string {

FILE: pkg/hook/exechook.go
  type Exechook (line 29) | type Exechook struct
    method Name (line 57) | func (h *Exechook) Name() string {
    method Do (line 62) | func (h *Exechook) Do(ctx context.Context, hash string) error {
  function NewExechook (line 45) | func NewExechook(cmdrunner cmd.Runner, command string, getWorktree func(...
  function envKV (line 79) | func envKV(k, v string) string {

FILE: pkg/hook/exechook_test.go
  function TestNotZeroReturnExechookDo (line 28) | func TestNotZeroReturnExechookDo(t *testing.T) {
  function TestZeroReturnExechookDo (line 46) | func TestZeroReturnExechookDo(t *testing.T) {
  function TestTimeoutExechookDo (line 64) | func TestTimeoutExechookDo(t *testing.T) {

FILE: pkg/hook/hook.go
  function init (line 38) | func init() {
  type Hook (line 43) | type Hook interface
  type hookData (line 50) | type hookData struct
    method events (line 63) | func (d *hookData) events() chan struct{} {
    method get (line 67) | func (d *hookData) get() string {
    method set (line 73) | func (d *hookData) set(newHash string) {
    method send (line 79) | func (d *hookData) send(newHash string) {
  function NewHookData (line 57) | func NewHookData() *hookData {
  function NewHookRunner (line 92) | func NewHookRunner(hook Hook, backoff time.Duration, data *hookData, log...
  type HookRunner (line 101) | type HookRunner struct
    method Send (line 123) | func (r *HookRunner) Send(hash string) {
    method Run (line 128) | func (r *HookRunner) Run(ctx context.Context) {
    method sendOneTimeResultAndTerminate (line 164) | func (r *HookRunner) sendOneTimeResultAndTerminate(completedSuccessful...
    method WaitForCompletion (line 176) | func (r *HookRunner) WaitForCompletion() error {
  type logintf (line 116) | type logintf interface
  function updateHookRunCountMetric (line 191) | func updateHookRunCountMetric(name, status string) {

FILE: pkg/hook/hook_test.go
  constant hash1 (line 25) | hash1 = "1111111111111111111111111111111111111111"
  constant hash2 (line 26) | hash2 = "2222222222222222222222222222222222222222"
  function TestHookData (line 29) | func TestHookData(t *testing.T) {

FILE: pkg/hook/webhook.go
  type Webhook (line 28) | type Webhook struct
    method Name (line 54) | func (w *Webhook) Name() string {
    method Do (line 59) | func (w *Webhook) Do(ctx context.Context, hash string) error {
  function NewWebhook (line 43) | func NewWebhook(url, method string, success int, timeout time.Duration, ...

FILE: pkg/hook/webhook_test.go
  function TestWebhookDo (line 27) | func TestWebhookDo(t *testing.T) {

FILE: pkg/logging/logging.go
  type Logger (line 31) | type Logger struct
    method Error (line 49) | func (l *Logger) Error(err error, msg string, kvList ...interface{}) {
    method ExportError (line 86) | func (l *Logger) ExportError(content string) {
    method DeleteErrorFile (line 94) | func (l *Logger) DeleteErrorFile() {
    method writeContent (line 108) | func (l *Logger) writeContent(content []byte) {
  function New (line 38) | func New(root string, errorFile string, verbosity int) *Logger {

FILE: pkg/pid1/pid1.go
  function ReRun (line 35) | func ReRun() (int, error) {
  function runInit (line 53) | func runInit(firstborn int) (int, error) {
  function sigchld (line 84) | func sigchld(firstborn int) (bool, syscall.WaitStatus, error) {

FILE: vendor/github.com/beorn7/perks/quantile/stream.go
  type Sample (line 24) | type Sample struct
  type Samples (line 31) | type Samples
    method Len (line 33) | func (a Samples) Len() int           { return len(a) }
    method Less (line 34) | func (a Samples) Less(i, j int) bool { return a[i].Value < a[j].Value }
    method Swap (line 35) | func (a Samples) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
  type invariant (line 37) | type invariant
  function NewLowBiased (line 49) | func NewLowBiased(epsilon float64) *Stream {
  function NewHighBiased (line 66) | func NewHighBiased(epsilon float64) *Stream {
  function NewTargeted (line 80) | func NewTargeted(targetMap map[float64]float64) *Stream {
  type target (line 104) | type target struct
  function targetMapToSlice (line 109) | func targetMapToSlice(targetMap map[float64]float64) []target {
  type Stream (line 125) | type Stream struct
    method Insert (line 137) | func (s *Stream) Insert(v float64) {
    method insert (line 141) | func (s *Stream) insert(sample Sample) {
    method Query (line 152) | func (s *Stream) Query(q float64) float64 {
    method Merge (line 176) | func (s *Stream) Merge(samples Samples) {
    method Reset (line 182) | func (s *Stream) Reset() {
    method Samples (line 188) | func (s *Stream) Samples() Samples {
    method Count (line 198) | func (s *Stream) Count() int {
    method flush (line 202) | func (s *Stream) flush() {
    method maybeSort (line 208) | func (s *Stream) maybeSort() {
    method flushed (line 215) | func (s *Stream) flushed() bool {
  function newStream (line 131) | func newStream(ƒ invariant) *Stream {
  type stream (line 219) | type stream struct
    method reset (line 225) | func (s *stream) reset() {
    method insert (line 230) | func (s *stream) insert(v float64) {
    method merge (line 234) | func (s *stream) merge(samples Samples) {
    method count (line 268) | func (s *stream) count() int {
    method query (line 272) | func (s *stream) query(q float64) float64 {
    method compress (line 287) | func (s *stream) compress() {
    method samples (line 312) | func (s *stream) samples() Samples {

FILE: vendor/github.com/cespare/xxhash/v2/xxhash.go
  constant prime1 (line 12) | prime1 uint64 = 11400714785074694791
  constant prime2 (line 13) | prime2 uint64 = 14029467366897019727
  constant prime3 (line 14) | prime3 uint64 = 1609587929392839161
  constant prime4 (line 15) | prime4 uint64 = 9650029242287828579
  constant prime5 (line 16) | prime5 uint64 = 2870177450012600261
  type Digest (line 34) | type Digest struct
    method Reset (line 52) | func (d *Digest) Reset() {
    method Size (line 62) | func (d *Digest) Size() int { return 8 }
    method BlockSize (line 65) | func (d *Digest) BlockSize() int { return 32 }
    method Write (line 68) | func (d *Digest) Write(b []byte) (n int, err error) {
    method Sum (line 104) | func (d *Digest) Sum(b []byte) []byte {
    method Sum64 (line 120) | func (d *Digest) Sum64() uint64 {
    method MarshalBinary (line 168) | func (d *Digest) MarshalBinary() ([]byte, error) {
    method UnmarshalBinary (line 182) | func (d *Digest) UnmarshalBinary(b []byte) error {
  function New (line 45) | func New() *Digest {
  constant magic (line 163) | magic         = "xxh\x06"
  constant marshaledSize (line 164) | marshaledSize = len(magic) + 8*5 + 32
  function appendUint64 (line 200) | func appendUint64(b []byte, x uint64) []byte {
  function consumeUint64 (line 206) | func consumeUint64(b []byte) ([]byte, uint64) {
  function u64 (line 211) | func u64(b []byte) uint64 { return binary.LittleEndian.Uint64(b) }
  function u32 (line 212) | func u32(b []byte) uint32 { return binary.LittleEndian.Uint32(b) }
  function round (line 214) | func round(acc, input uint64) uint64 {
  function mergeRound (line 221) | func mergeRound(acc, val uint64) uint64 {
  function rol1 (line 228) | func rol1(x uint64) uint64  { return bits.RotateLeft64(x, 1) }
  function rol7 (line 229) | func rol7(x uint64) uint64  { return bits.RotateLeft64(x, 7) }
  function rol11 (line 230) | func rol11(x uint64) uint64 { return bits.RotateLeft64(x, 11) }
  function rol12 (line 231) | func rol12(x uint64) uint64 { return bits.RotateLeft64(x, 12) }
  function rol18 (line 232) | func rol18(x uint64) uint64 { return bits.RotateLeft64(x, 18) }
  function rol23 (line 233) | func rol23(x uint64) uint64 { return bits.RotateLeft64(x, 23) }
  function rol27 (line 234) | func rol27(x uint64) uint64 { return bits.RotateLeft64(x, 27) }
  function rol31 (line 235) | func rol31(x uint64) uint64 { return bits.RotateLeft64(x, 31) }

FILE: vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
  function Sum64 (line 10) | func Sum64(b []byte) uint64
  function writeBlocks (line 13) | func writeBlocks(d *Digest, b []byte) int

FILE: vendor/github.com/cespare/xxhash/v2/xxhash_other.go
  function Sum64 (line 6) | func Sum64(b []byte) uint64 {
  function writeBlocks (line 64) | func writeBlocks(d *Digest, b []byte) int {

FILE: vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
  function Sum64String (line 8) | func Sum64String(s string) uint64 {
  method WriteString (line 13) | func (d *Digest) WriteString(s string) (n int, err error) {

FILE: vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
  function Sum64String (line 37) | func Sum64String(s string) uint64 {
  method WriteString (line 44) | func (d *Digest) WriteString(s string) (n int, err error) {
  type sliceHeader (line 54) | type sliceHeader struct

FILE: vendor/github.com/go-logr/logr/discard.go
  function Discard (line 22) | func Discard() Logger {
  type discardLogSink (line 30) | type discardLogSink struct
    method Init (line 35) | func (l discardLogSink) Init(RuntimeInfo) {
    method Enabled (line 38) | func (l discardLogSink) Enabled(int) bool {
    method Info (line 42) | func (l discardLogSink) Info(int, string, ...interface{}) {
    method Error (line 45) | func (l discardLogSink) Error(error, string, ...interface{}) {
    method WithValues (line 48) | func (l discardLogSink) WithValues(...interface{}) LogSink {
    method WithName (line 52) | func (l discardLogSink) WithName(string) LogSink {

FILE: vendor/github.com/go-logr/logr/funcr/funcr.go
  function New (line 52) | func New(fn func(prefix, args string), opts Options) logr.Logger {
  function NewJSON (line 58) | func NewJSON(fn func(obj string), opts Options) logr.Logger {
  type Underlier (line 69) | type Underlier interface
  function newSink (line 73) | func newSink(fn func(prefix, args string), formatter Formatter) logr.Log...
  type Options (line 84) | type Options struct
  type MessageClass (line 140) | type MessageClass
  constant None (line 144) | None MessageClass = iota
  constant All (line 146) | All
  constant Info (line 148) | Info
  constant Error (line 150) | Error
  type fnlogger (line 155) | type fnlogger struct
    method WithName (line 160) | func (l fnlogger) WithName(name string) logr.LogSink {
    method WithValues (line 165) | func (l fnlogger) WithValues(kvList ...interface{}) logr.LogSink {
    method WithCallDepth (line 170) | func (l fnlogger) WithCallDepth(depth int) logr.LogSink {
    method Info (line 175) | func (l fnlogger) Info(level int, msg string, kvList ...interface{}) {
    method Error (line 180) | func (l fnlogger) Error(err error, msg string, kvList ...interface{}) {
    method GetUnderlying (line 185) | func (l fnlogger) GetUnderlying() func(prefix, args string) {
  function NewFormatter (line 195) | func NewFormatter(opts Options) Formatter {
  function NewFormatterJSON (line 200) | func NewFormatterJSON(opts Options) Formatter {
  constant defaultTimestampFormat (line 205) | defaultTimestampFormat = "2006-01-02 15:04:05.000000"
  constant defaultMaxLogDepth (line 206) | defaultMaxLogDepth = 16
  function newFormatter (line 208) | func newFormatter(opts Options, outfmt outputFormat) Formatter {
  type Formatter (line 228) | type Formatter struct
    method render (line 251) | func (f Formatter) render(builtins, args []interface{}) string {
    method flatten (line 294) | func (f Formatter) flatten(buf *bytes.Buffer, kvList []interface{}, co...
    method pretty (line 336) | func (f Formatter) pretty(value interface{}) string {
    method prettyWithFlags (line 345) | func (f Formatter) prettyWithFlags(value interface{}, flags uint32, de...
    method caller (line 643) | func (f Formatter) caller() Caller {
    method nonStringKey (line 661) | func (f Formatter) nonStringKey(v interface{}) string {
    method snippet (line 666) | func (f Formatter) snippet(v interface{}) string {
    method sanitize (line 679) | func (f Formatter) sanitize(kvList []interface{}) []interface{} {
    method Init (line 695) | func (f *Formatter) Init(info logr.RuntimeInfo) {
    method Enabled (line 700) | func (f Formatter) Enabled(level int) bool {
    method GetDepth (line 706) | func (f Formatter) GetDepth() int {
    method FormatInfo (line 713) | func (f Formatter) FormatInfo(level int, msg string, kvList []interfac...
    method FormatError (line 733) | func (f Formatter) FormatError(err error, msg string, kvList []interfa...
    method AddName (line 758) | func (f *Formatter) AddName(name string) {
    method AddValues (line 767) | func (f *Formatter) AddValues(kvList []interface{}) {
    method AddCallDepth (line 785) | func (f *Formatter) AddCallDepth(depth int) {
  type outputFormat (line 238) | type outputFormat
  constant outputKeyValue (line 242) | outputKeyValue outputFormat = iota
  constant outputJSON (line 244) | outputJSON
  type PseudoStruct (line 248) | type PseudoStruct
  constant flagRawStruct (line 341) | flagRawStruct = 0x1
  function prettyString (line 557) | func prettyString(s string) string {
  function needsEscape (line 571) | func needsEscape(s string) bool {
  function isEmpty (line 580) | func isEmpty(v reflect.Value) bool {
  function invokeMarshaler (line 600) | func invokeMarshaler(m logr.Marshaler) (ret interface{}) {
  function invokeStringer (line 609) | func invokeStringer(s fmt.Stringer) (ret string) {
  function invokeError (line 618) | func invokeError(e error) (ret string) {
  type Caller (line 633) | type Caller struct
  constant noValue (line 659) | noValue = "<no-value>"

FILE: vendor/github.com/go-logr/logr/logr.go
  function New (line 205) | func New(sink LogSink) Logger {
  type Logger (line 239) | type Logger struct
    method setSink (line 215) | func (l *Logger) setSink(sink LogSink) {
    method GetSink (line 220) | func (l Logger) GetSink() LogSink {
    method WithSink (line 225) | func (l Logger) WithSink(sink LogSink) Logger {
    method Enabled (line 246) | func (l Logger) Enabled() bool {
    method Info (line 256) | func (l Logger) Info(msg string, keysAndValues ...interface{}) {
    method Error (line 275) | func (l Logger) Error(err error, msg string, keysAndValues ...interfac...
    method V (line 286) | func (l Logger) V(level int) Logger {
    method WithValues (line 296) | func (l Logger) WithValues(keysAndValues ...interface{}) Logger {
    method WithName (line 306) | func (l Logger) WithName(name string) Logger {
    method WithCallDepth (line 326) | func (l Logger) WithCallDepth(depth int) Logger {
    method WithCallStackHelper (line 347) | func (l Logger) WithCallStackHelper() (func(), Logger) {
  type contextKey (line 361) | type contextKey struct
  function FromContext (line 364) | func FromContext(ctx context.Context) (Logger, error) {
  type notFoundError (line 373) | type notFoundError struct
    method Error (line 375) | func (notFoundError) Error() string {
    method IsNotFound (line 379) | func (notFoundError) IsNotFound() bool {
  function FromContextOrDiscard (line 385) | func FromContextOrDiscard(ctx context.Context) Logger {
  function NewContext (line 395) | func NewContext(ctx context.Context, logger Logger) context.Context {
  type RuntimeInfo (line 401) | type RuntimeInfo struct
  type LogSink (line 416) | type LogSink interface
  type CallDepthLogSink (line 455) | type CallDepthLogSink interface
  type CallStackHelperLogSink (line 487) | type CallStackHelperLogSink interface
  type Marshaler (line 498) | type Marshaler interface

FILE: vendor/github.com/golang-jwt/jwt/v4/claims.go
  type Claims (line 11) | type Claims interface
  type RegisteredClaims (line 24) | type RegisteredClaims struct
    method Valid (line 51) | func (c RegisteredClaims) Valid() error {
    method VerifyAudience (line 82) | func (c *RegisteredClaims) VerifyAudience(cmp string, req bool) bool {
    method VerifyExpiresAt (line 88) | func (c *RegisteredClaims) VerifyExpiresAt(cmp time.Time, req bool) bo...
    method VerifyIssuedAt (line 98) | func (c *RegisteredClaims) VerifyIssuedAt(cmp time.Time, req bool) bool {
    method VerifyNotBefore (line 108) | func (c *RegisteredClaims) VerifyNotBefore(cmp time.Time, req bool) bo...
    method VerifyIssuer (line 118) | func (c *RegisteredClaims) VerifyIssuer(cmp string, req bool) bool {
  type StandardClaims (line 131) | type StandardClaims struct
    method Valid (line 144) | func (c StandardClaims) Valid() error {
    method VerifyAudience (line 175) | func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool {
    method VerifyExpiresAt (line 181) | func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool {
    method VerifyIssuedAt (line 192) | func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool {
    method VerifyNotBefore (line 203) | func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool {
    method VerifyIssuer (line 214) | func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool {
  function verifyAud (line 220) | func verifyAud(aud []string, cmp string, required bool) bool {
  function verifyExp (line 243) | func verifyExp(exp *time.Time, now time.Time, required bool) bool {
  function verifyIat (line 250) | func verifyIat(iat *time.Time, now time.Time, required bool) bool {
  function verifyNbf (line 257) | func verifyNbf(nbf *time.Time, now time.Time, required bool) bool {
  function verifyIss (line 264) | func verifyIss(iss string, cmp string, required bool) bool {

FILE: vendor/github.com/golang-jwt/jwt/v4/ecdsa.go
  type SigningMethodECDSA (line 18) | type SigningMethodECDSA struct
    method Alg (line 52) | func (m *SigningMethodECDSA) Alg() string {
    method Verify (line 58) | func (m *SigningMethodECDSA) Verify(signingString, signature string, k...
    method Sign (line 100) | func (m *SigningMethodECDSA) Sign(signingString string, key interface{...
  function init (line 32) | func init() {

FILE: vendor/github.com/golang-jwt/jwt/v4/ecdsa_utils.go
  function ParseECPrivateKeyFromPEM (line 16) | func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) {
  function ParseECPublicKeyFromPEM (line 43) | func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) {

FILE: vendor/github.com/golang-jwt/jwt/v4/ed25519.go
  type SigningMethodEd25519 (line 17) | type SigningMethodEd25519 struct
    method Alg (line 31) | func (m *SigningMethodEd25519) Alg() string {
    method Verify (line 37) | func (m *SigningMethodEd25519) Verify(signingString, signature string,...
    method Sign (line 66) | func (m *SigningMethodEd25519) Sign(signingString string, key interfac...
  function init (line 24) | func init() {

FILE: vendor/github.com/golang-jwt/jwt/v4/ed25519_utils.go
  function ParseEdPrivateKeyFromPEM (line 17) | func ParseEdPrivateKeyFromPEM(key []byte) (crypto.PrivateKey, error) {
  function ParseEdPublicKeyFromPEM (line 42) | func ParseEdPublicKeyFromPEM(key []byte) (crypto.PublicKey, error) {

FILE: vendor/github.com/golang-jwt/jwt/v4/errors.go
  constant ValidationErrorMalformed (line 28) | ValidationErrorMalformed        uint32 = 1 << iota
  constant ValidationErrorUnverifiable (line 29) | ValidationErrorUnverifiable
  constant ValidationErrorSignatureInvalid (line 30) | ValidationErrorSignatureInvalid
  constant ValidationErrorAudience (line 33) | ValidationErrorAudience
  constant ValidationErrorExpired (line 34) | ValidationErrorExpired
  constant ValidationErrorIssuedAt (line 35) | ValidationErrorIssuedAt
  constant ValidationErrorIssuer (line 36) | ValidationErrorIssuer
  constant ValidationErrorNotValidYet (line 37) | ValidationErrorNotValidYet
  constant ValidationErrorId (line 38) | ValidationErrorId
  constant ValidationErrorClaimsInvalid (line 39) | ValidationErrorClaimsInvalid
  function NewValidationError (line 43) | func NewValidationError(errorText string, errorFlags uint32) *Validation...
  type ValidationError (line 51) | type ValidationError struct
    method Error (line 58) | func (e ValidationError) Error() string {
    method Unwrap (line 69) | func (e *ValidationError) Unwrap() error {
    method valid (line 74) | func (e *ValidationError) valid() bool {
    method Is (line 81) | func (e *ValidationError) Is(err error) bool {

FILE: vendor/github.com/golang-jwt/jwt/v4/hmac.go
  type SigningMethodHMAC (line 11) | type SigningMethodHMAC struct
    method Alg (line 44) | func (m *SigningMethodHMAC) Alg() string {
    method Verify (line 49) | func (m *SigningMethodHMAC) Verify(signingString, signature string, ke...
    method Sign (line 82) | func (m *SigningMethodHMAC) Sign(signingString string, key interface{}...
  function init (line 24) | func init() {

FILE: vendor/github.com/golang-jwt/jwt/v4/map_claims.go
  type MapClaims (line 12) | type MapClaims
    method VerifyAudience (line 16) | func (m MapClaims) VerifyAudience(cmp string, req bool) bool {
    method VerifyExpiresAt (line 37) | func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool {
    method VerifyIssuedAt (line 63) | func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool {
    method VerifyNotBefore (line 89) | func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool {
    method VerifyIssuer (line 115) | func (m MapClaims) VerifyIssuer(cmp string, req bool) bool {
    method Valid (line 124) | func (m MapClaims) Valid() error {

FILE: vendor/github.com/golang-jwt/jwt/v4/none.go
  constant UnsafeAllowNoneSignatureType (line 7) | UnsafeAllowNoneSignatureType unsafeNoneMagicConstant = "none signing met...
  type signingMethodNone (line 11) | type signingMethodNone struct
    method Alg (line 23) | func (m *signingMethodNone) Alg() string {
    method Verify (line 28) | func (m *signingMethodNone) Verify(signingString, signature string, ke...
    method Sign (line 47) | func (m *signingMethodNone) Sign(signingString string, key interface{}...
  type unsafeNoneMagicConstant (line 12) | type unsafeNoneMagicConstant
  function init (line 14) | func init() {

FILE: vendor/github.com/golang-jwt/jwt/v4/parser.go
  constant tokenDelimiter (line 10) | tokenDelimiter = "."
  type Parser (line 12) | type Parser struct
    method Parse (line 43) | func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, e...
    method ParseWithClaims (line 56) | func (p *Parser) ParseWithClaims(tokenString string, claims Claims, ke...
    method ParseUnverified (line 126) | func (p *Parser) ParseUnverified(tokenString string, claims Claims) (t...
  function NewParser (line 30) | func NewParser(options ...ParserOption) *Parser {
  function splitToken (line 184) | func splitToken(token string) ([]string, bool) {

FILE: vendor/github.com/golang-jwt/jwt/v4/parser_option.go
  type ParserOption (line 6) | type ParserOption
  function WithValidMethods (line 10) | func WithValidMethods(methods []string) ParserOption {
  function WithJSONNumber (line 17) | func WithJSONNumber() ParserOption {
  function WithoutClaimsValidation (line 25) | func WithoutClaimsValidation() ParserOption {

FILE: vendor/github.com/golang-jwt/jwt/v4/rsa.go
  type SigningMethodRSA (line 11) | type SigningMethodRSA struct
    method Alg (line 43) | func (m *SigningMethodRSA) Alg() string {
    method Verify (line 49) | func (m *SigningMethodRSA) Verify(signingString, signature string, key...
    method Sign (line 78) | func (m *SigningMethodRSA) Sign(signingString string, key interface{})...
  function init (line 23) | func init() {

FILE: vendor/github.com/golang-jwt/jwt/v4/rsa_pss.go
  type SigningMethodRSAPSS (line 13) | type SigningMethodRSAPSS struct
    method Verify (line 85) | func (m *SigningMethodRSAPSS) Verify(signingString, signature string, ...
    method Sign (line 119) | func (m *SigningMethodRSAPSS) Sign(signingString string, key interface...
  function init (line 30) | func init() {

FILE: vendor/github.com/golang-jwt/jwt/v4/rsa_utils.go
  function ParseRSAPrivateKeyFromPEM (line 17) | func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) {
  function ParseRSAPrivateKeyFromPEMWithPassword (line 47) | func ParseRSAPrivateKeyFromPEMWithPassword(key []byte, password string) ...
  function ParseRSAPublicKeyFromPEM (line 79) | func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) {

FILE: vendor/github.com/golang-jwt/jwt/v4/signing_method.go
  type SigningMethod (line 11) | type SigningMethod interface
  function RegisterSigningMethod (line 19) | func RegisterSigningMethod(alg string, f func() SigningMethod) {
  function GetSigningMethod (line 27) | func GetSigningMethod(alg string) (method SigningMethod) {
  function GetAlgorithms (line 38) | func GetAlgorithms() (algs []string) {

FILE: vendor/github.com/golang-jwt/jwt/v4/token.go
  type Keyfunc (line 32) | type Keyfunc
  type Token (line 36) | type Token struct
    method SignedString (line 64) | func (t *Token) SignedString(key interface{}) (string, error) {
    method SigningString (line 80) | func (t *Token) SigningString() (string, error) {
  function New (line 46) | func New(method SigningMethod) *Token {
  function NewWithClaims (line 51) | func NewWithClaims(method SigningMethod, claims Claims) *Token {
  function Parse (line 104) | func Parse(tokenString string, keyFunc Keyfunc, options ...ParserOption)...
  function ParseWithClaims (line 113) | func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc,...
  function EncodeSegment (line 121) | func EncodeSegment(seg []byte) string {
  function DecodeSegment (line 129) | func DecodeSegment(seg string) ([]byte, error) {

FILE: vendor/github.com/golang-jwt/jwt/v4/types.go
  type NumericDate (line 32) | type NumericDate struct
    method MarshalJSON (line 51) | func (date NumericDate) MarshalJSON() (b []byte, err error) {
    method UnmarshalJSON (line 78) | func (date *NumericDate) UnmarshalJSON(b []byte) (err error) {
  function NewNumericDate (line 38) | func NewNumericDate(t time.Time) *NumericDate {
  function newNumericDateFromSeconds (line 44) | func newNumericDateFromSeconds(f float64) *NumericDate {
  type ClaimStrings (line 100) | type ClaimStrings
    method UnmarshalJSON (line 102) | func (s *ClaimStrings) UnmarshalJSON(data []byte) (err error) {
    method MarshalJSON (line 135) | func (s ClaimStrings) MarshalJSON() (b []byte, err error) {

FILE: vendor/github.com/golang/protobuf/proto/buffer.go
  constant WireVarint (line 17) | WireVarint     = 0
  constant WireFixed32 (line 18) | WireFixed32    = 5
  constant WireFixed64 (line 19) | WireFixed64    = 1
  constant WireBytes (line 20) | WireBytes      = 2
  constant WireStartGroup (line 21) | WireStartGroup = 3
  constant WireEndGroup (line 22) | WireEndGroup   = 4
  function EncodeVarint (line 26) | func EncodeVarint(v uint64) []byte {
  function SizeVarint (line 32) | func SizeVarint(v uint64) int {
  function DecodeVarint (line 39) | func DecodeVarint(b []byte) (uint64, int) {
  type Buffer (line 49) | type Buffer struct
    method SetDeterministic (line 81) | func (b *Buffer) SetDeterministic(deterministic bool) {
    method SetBuf (line 87) | func (b *Buffer) SetBuf(buf []byte) {
    method Reset (line 93) | func (b *Buffer) Reset() {
    method Bytes (line 99) | func (b *Buffer) Bytes() []byte {
    method Unread (line 104) | func (b *Buffer) Unread() []byte {
    method Marshal (line 109) | func (b *Buffer) Marshal(m Message) error {
    method Unmarshal (line 118) | func (b *Buffer) Unmarshal(m Message) error {
    method DebugPrint (line 132) | func (*Buffer) DebugPrint(s string, b []byte) {
    method EncodeVarint (line 140) | func (b *Buffer) EncodeVarint(v uint64) error {
    method EncodeZigzag32 (line 146) | func (b *Buffer) EncodeZigzag32(v uint64) error {
    method EncodeZigzag64 (line 151) | func (b *Buffer) EncodeZigzag64(v uint64) error {
    method EncodeFixed32 (line 156) | func (b *Buffer) EncodeFixed32(v uint64) error {
    method EncodeFixed64 (line 162) | func (b *Buffer) EncodeFixed64(v uint64) error {
    method EncodeRawBytes (line 168) | func (b *Buffer) EncodeRawBytes(v []byte) error {
    method EncodeStringBytes (line 175) | func (b *Buffer) EncodeStringBytes(v string) error {
    method EncodeMessage (line 181) | func (b *Buffer) EncodeMessage(m Message) error {
    method DecodeVarint (line 189) | func (b *Buffer) DecodeVarint() (uint64, error) {
    method DecodeZigzag32 (line 199) | func (b *Buffer) DecodeZigzag32() (uint64, error) {
    method DecodeZigzag64 (line 208) | func (b *Buffer) DecodeZigzag64() (uint64, error) {
    method DecodeFixed32 (line 217) | func (b *Buffer) DecodeFixed32() (uint64, error) {
    method DecodeFixed64 (line 227) | func (b *Buffer) DecodeFixed64() (uint64, error) {
    method DecodeRawBytes (line 239) | func (b *Buffer) DecodeRawBytes(alloc bool) ([]byte, error) {
    method DecodeStringBytes (line 253) | func (b *Buffer) DecodeStringBytes() (string, error) {
    method DecodeMessage (line 264) | func (b *Buffer) DecodeMessage(m Message) error {
    method DecodeGroup (line 276) | func (b *Buffer) DecodeGroup(m Message) error {
  function NewBuffer (line 57) | func NewBuffer(buf []byte) *Buffer {
  type unknownFields (line 124) | type unknownFields struct
    method String (line 126) | func (m *unknownFields) String() string { panic("not implemented") }
    method Reset (line 127) | func (m *unknownFields) Reset()         { panic("not implemented") }
    method ProtoMessage (line 128) | func (m *unknownFields) ProtoMessage()  { panic("not implemented") }
  function consumeGroup (line 288) | func consumeGroup(b []byte) ([]byte, int, error) {

FILE: vendor/github.com/golang/protobuf/proto/defaults.go
  function SetDefaults (line 14) | func SetDefaults(m Message) {
  function setDefaults (line 20) | func setDefaults(m protoreflect.Message) {

FILE: vendor/github.com/golang/protobuf/proto/deprecated.go
  type Stats (line 28) | type Stats struct
  function GetStats (line 31) | func GetStats() Stats { return Stats{} }
  function MarshalMessageSet (line 34) | func MarshalMessageSet(interface{}) ([]byte, error) {
  function UnmarshalMessageSet (line 39) | func UnmarshalMessageSet([]byte, interface{}) error {
  function MarshalMessageSetJSON (line 44) | func MarshalMessageSetJSON(interface{}) ([]byte, error) {
  function UnmarshalMessageSetJSON (line 49) | func UnmarshalMessageSetJSON([]byte, interface{}) error {
  function RegisterMessageSetType (line 54) | func RegisterMessageSetType(Message, int32, string) {}
  function EnumName (line 57) | func EnumName(m map[int32]string, v int32) string {
  function UnmarshalJSONEnum (line 66) | func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string)...
  type InternalMessageInfo (line 88) | type InternalMessageInfo struct
    method DiscardUnknown (line 91) | func (*InternalMessageInfo) DiscardUnknown(m Message) {
    method Marshal (line 96) | func (*InternalMessageInfo) Marshal(b []byte, m Message, deterministic...
    method Merge (line 101) | func (*InternalMessageInfo) Merge(dst, src Message) {
    method Size (line 106) | func (*InternalMessageInfo) Size(m Message) int {
    method Unmarshal (line 111) | func (*InternalMessageInfo) Unmarshal(m Message, b []byte) error {

FILE: vendor/github.com/golang/protobuf/proto/discard.go
  function DiscardUnknown (line 19) | func DiscardUnknown(m Message) {
  function discardUnknown (line 25) | func discardUnknown(m protoreflect.Message) {

FILE: vendor/github.com/golang/protobuf/proto/extensions.go
  function HasExtension (line 45) | func HasExtension(m Message, xt *ExtensionDesc) (has bool) {
  function ClearExtension (line 73) | func ClearExtension(m Message, xt *ExtensionDesc) {
  function ClearAllExtensions (line 96) | func ClearAllExtensions(m Message) {
  function GetExtension (line 120) | func GetExtension(m Message, xt *ExtensionDesc) (interface{}, error) {
  type extensionResolver (line 183) | type extensionResolver struct
    method FindExtensionByName (line 185) | func (r extensionResolver) FindExtensionByName(field protoreflect.Full...
    method FindExtensionByNumber (line 192) | func (r extensionResolver) FindExtensionByNumber(message protoreflect....
  function GetExtensions (line 202) | func GetExtensions(m Message, xts []*ExtensionDesc) ([]interface{}, erro...
  function SetExtension (line 223) | func SetExtension(m Message, xt *ExtensionDesc, v interface{}) error {
  function SetRawExtension (line 254) | func SetRawExtension(m Message, fnum int32, b []byte) {
  function ExtensionDescs (line 279) | func ExtensionDescs(m Message) ([]*ExtensionDesc, error) {
  function isValidExtension (line 319) | func isValidExtension(md protoreflect.MessageDescriptor, xtd protoreflec...
  function isScalarKind (line 326) | func isScalarKind(k reflect.Kind) bool {
  function clearUnknown (line 336) | func clearUnknown(m protoreflect.Message, remover interface {
  type fieldNum (line 352) | type fieldNum
    method Has (line 354) | func (n1 fieldNum) Has(n2 protoreflect.FieldNumber) bool {

FILE: vendor/github.com/golang/protobuf/proto/properties.go
  type StructProperties (line 22) | type StructProperties struct
    method Len (line 304) | func (sp *StructProperties) Len() int           { return len(sp.Prop) }
    method Less (line 305) | func (sp *StructProperties) Less(i, j int) bool { return false }
    method Swap (line 306) | func (sp *StructProperties) Swap(i, j int)      { return }
  type Properties (line 41) | type Properties struct
    method String (line 99) | func (p *Properties) String() string {
    method Parse (line 137) | func (p *Properties) Parse(tag string) {
    method Init (line 196) | func (p *Properties) Init(typ reflect.Type, name, tag string, f *refle...
  type OneofProperties (line 88) | type OneofProperties struct
  function GetProperties (line 219) | func GetProperties(t reflect.Type) *StructProperties {
  function newProperties (line 227) | func newProperties(t reflect.Type) *StructProperties {

FILE: vendor/github.com/golang/protobuf/proto/proto.go
  constant ProtoPackageIsVersion1 (line 23) | ProtoPackageIsVersion1 = true
  constant ProtoPackageIsVersion2 (line 24) | ProtoPackageIsVersion2 = true
  constant ProtoPackageIsVersion3 (line 25) | ProtoPackageIsVersion3 = true
  constant ProtoPackageIsVersion4 (line 26) | ProtoPackageIsVersion4 = true
  type GeneratedEnum (line 32) | type GeneratedEnum interface
  type GeneratedMessage (line 37) | type GeneratedMessage interface
  function MessageV1 (line 54) | func MessageV1(m GeneratedMessage) protoiface.MessageV1 {
  function MessageV2 (line 60) | func MessageV2(m GeneratedMessage) protoV2.Message {
  function MessageReflect (line 66) | func MessageReflect(m Message) protoreflect.Message {
  type Marshaler (line 75) | type Marshaler interface
  type Unmarshaler (line 87) | type Unmarshaler interface
  type Merger (line 98) | type Merger interface
  type RequiredNotSetError (line 107) | type RequiredNotSetError struct
    method Error (line 111) | func (e *RequiredNotSetError) Error() string {
    method RequiredNotSet (line 117) | func (e *RequiredNotSetError) RequiredNotSet() bool {
  function checkRequiredNotSet (line 121) | func checkRequiredNotSet(m protoV2.Message) error {
  function Clone (line 129) | func Clone(src Message) Message {
  function Merge (line 141) | func Merge(dst, src Message) {
  function Equal (line 160) | func Equal(x, y Message) bool {
  function isMessageSet (line 164) | func isMessageSet(md protoreflect.MessageDescriptor) bool {

FILE: vendor/github.com/golang/protobuf/proto/registry.go
  function RegisterFile (line 34) | func RegisterFile(s filePath, d fileDescGZIP) {
  function FileDescriptor (line 58) | func FileDescriptor(s filePath) fileDescGZIP {
  function RegisterEnum (line 96) | func RegisterEnum(s enumName, _ enumsByNumber, m enumsByName) {
  function EnumValueMap (line 110) | func EnumValueMap(s enumName) enumsByName {
  function walkEnums (line 156) | func walkEnums(d interface {
  function RegisterType (line 179) | func RegisterType(m Message, s messageName) {
  function RegisterMapType (line 191) | func RegisterMapType(m interface{}, s messageName) {
  function MessageType (line 206) | func MessageType(s messageName) reflect.Type {
  function goTypeForField (line 236) | func goTypeForField(fd protoreflect.FieldDescriptor) reflect.Type {
  function enumGoType (line 253) | func enumGoType(et protoreflect.EnumType) reflect.Type {
  function messageGoType (line 257) | func messageGoType(mt protoreflect.MessageType) reflect.Type {
  function MessageName (line 264) | func MessageName(m Message) messageName {
  function RegisterExtension (line 278) | func RegisterExtension(d *ExtensionDesc) {
  function RegisteredExtensions (line 292) | func RegisteredExtensions(m Message) extensionsByNumber {

FILE: vendor/github.com/golang/protobuf/proto/text_decode.go
  constant wrapTextUnmarshalV2 (line 22) | wrapTextUnmarshalV2 = false
  type ParseError (line 25) | type ParseError struct
    method Error (line 32) | func (e *ParseError) Error() string {
  function UnmarshalText (line 43) | func UnmarshalText(s string, m Message) error {
  type textParser (line 67) | type textParser struct
    method unmarshalMessage (line 91) | func (p *textParser) unmarshalMessage(m protoreflect.Message, terminat...
    method unmarshalExtensionOrAny (line 171) | func (p *textParser) unmarshalExtensionOrAny(m protoreflect.Message, s...
    method unmarshalValue (line 258) | func (p *textParser) unmarshalValue(v protoreflect.Value, fd protorefl...
    method unmarshalSingularValue (line 368) | func (p *textParser) unmarshalSingularValue(v protoreflect.Value, fd p...
    method checkForColon (line 475) | func (p *textParser) checkForColon(fd protoreflect.FieldDescriptor) *P...
    method consumeExtensionOrAnyName (line 491) | func (p *textParser) consumeExtensionOrAnyName() (string, error) {
    method consumeOptionalSeparator (line 523) | func (p *textParser) consumeOptionalSeparator() error {
    method errorf (line 534) | func (p *textParser) errorf(format string, a ...interface{}) *ParseErr...
    method skipWhitespace (line 541) | func (p *textParser) skipWhitespace() {
    method advance (line 565) | func (p *textParser) advance() {
    method back (line 617) | func (p *textParser) back() { p.backed = true }
    method next (line 620) | func (p *textParser) next() *token {
    method consumeToken (line 650) | func (p *textParser) consumeToken(s string) error {
  type token (line 75) | type token struct
  function newTextParser (line 83) | func newTextParser(s string) *textParser {
  function unquoteC (line 664) | func unquoteC(s string, quote rune) (string, error) {
  function unescape (line 707) | func unescape(s string) (ch string, tail string, err error) {
  function isIdentOrNumberChar (line 773) | func isIdentOrNumberChar(c byte) bool {
  function isWhitespace (line 787) | func isWhitespace(c byte) bool {
  function isQuote (line 795) | func isQuote(c byte) bool {

FILE: vendor/github.com/golang/protobuf/proto/text_encode.go
  constant wrapTextMarshalV2 (line 23) | wrapTextMarshalV2 = false
  type TextMarshaler (line 26) | type TextMarshaler struct
    method Marshal (line 32) | func (tm *TextMarshaler) Marshal(w io.Writer, m Message) error {
    method Text (line 43) | func (tm *TextMarshaler) Text(m Message) string {
    method marshal (line 48) | func (tm *TextMarshaler) marshal(m Message) ([]byte, error) {
  function MarshalText (line 97) | func MarshalText(w io.Writer, m Message) error { return defaultTextMarsh...
  function MarshalTextString (line 100) | func MarshalTextString(m Message) string { return defaultTextMarshaler.T...
  function CompactText (line 103) | func CompactText(w io.Writer, m Message) error { return compactTextMarsh...
  function CompactTextString (line 106) | func CompactTextString(m Message) string { return compactTextMarshaler.T...
  type textWriter (line 117) | type textWriter struct
    method Write (line 125) | func (w *textWriter) Write(p []byte) (n int, _ error) {
    method WriteByte (line 164) | func (w *textWriter) WriteByte(c byte) error {
    method writeName (line 176) | func (w *textWriter) writeName(fd protoreflect.FieldDescriptor) {
    method writeProto3Any (line 221) | func (w *textWriter) writeProto3Any(m protoreflect.Message) (bool, err...
    method writeMessage (line 261) | func (w *textWriter) writeMessage(m protoreflect.Message) error {
    method writeSingularValue (line 354) | func (w *textWriter) writeSingularValue(v protoreflect.Value, fd proto...
    method writeQuotedString (line 407) | func (w *textWriter) writeQuotedString(s string) {
    method writeUnknownFields (line 432) | func (w *textWriter) writeUnknownFields(b []byte) {
    method writeExtensions (line 496) | func (w *textWriter) writeExtensions(m protoreflect.Message) error {
    method writeSingularExtension (line 540) | func (w *textWriter) writeSingularExtension(name string, v protoreflec...
    method writeIndent (line 552) | func (w *textWriter) writeIndent() {
  function requiresQuotes (line 195) | func requiresQuotes(u string) bool {

FILE: vendor/github.com/golang/protobuf/proto/wire.go
  function Size (line 13) | func Size(m Message) int {
  function Marshal (line 22) | func Marshal(m Message) ([]byte, error) {
  function marshalAppend (line 32) | func marshalAppend(buf []byte, m Message, deterministic bool) ([]byte, e...
  function Unmarshal (line 56) | func Unmarshal(b []byte, m Message) error {
  function UnmarshalMerge (line 62) | func UnmarshalMerge(b []byte, m Message) error {

FILE: vendor/github.com/golang/protobuf/proto/wrappers.go
  function Bool (line 8) | func Bool(v bool) *bool { return &v }
  function Int (line 13) | func Int(v int) *int32 { return Int32(int32(v)) }
  function Int32 (line 16) | func Int32(v int32) *int32 { return &v }
  function Int64 (line 19) | func Int64(v int64) *int64 { return &v }
  function Uint32 (line 22) | func Uint32(v uint32) *uint32 { return &v }
  function Uint64 (line 25) | func Uint64(v uint64) *uint64 { return &v }
  function Float32 (line 28) | func Float32(v float32) *float32 { return &v }
  function Float64 (line 31) | func Float64(v float64) *float64 { return &v }
  function String (line 34) | func String(v string) *string { return &v }

FILE: vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go
  function init (line 42) | func init() { file_github_com_golang_protobuf_ptypes_timestamp_timestamp...
  function file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_init (line 43) | func file_github_com_golang_protobuf_ptypes_timestamp_timestamp_proto_in...

FILE: vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go
  function ReadDelimited (line 38) | func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) {

FILE: vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go
  function WriteDelimited (line 30) | func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) {

FILE: vendor/github.com/prometheus/client_golang/prometheus/build_info_collector.go
  function NewBuildInfoCollector (line 22) | func NewBuildInfoCollector() Collector {

FILE: vendor/github.com/prometheus/client_golang/prometheus/collector.go
  type Collector (line 27) | type Collector interface
  function DescribeByCollect (line 87) | func DescribeByCollect(c Collector, descs chan<- *Desc) {
  type selfCollector (line 101) | type selfCollector struct
    method init (line 108) | func (c *selfCollector) init(self Metric) {
    method Describe (line 113) | func (c *selfCollector) Describe(ch chan<- *Desc) {
    method Collect (line 118) | func (c *selfCollector) Collect(ch chan<- Metric) {
  type collectorMetric (line 125) | type collectorMetric interface

FILE: vendor/github.com/prometheus/client_golang/prometheus/counter.go
  type Counter (line 34) | type Counter interface
  type ExemplarAdder (line 55) | type ExemplarAdder interface
  type CounterOpts (line 60) | type CounterOpts
  function NewCounter (line 74) | func NewCounter(opts CounterOpts) Counter {
  type counter (line 86) | type counter struct
    method Desc (line 103) | func (c *counter) Desc() *Desc {
    method Add (line 107) | func (c *counter) Add(v float64) {
    method AddWithExemplar (line 127) | func (c *counter) AddWithExemplar(v float64, e Labels) {
    method Inc (line 132) | func (c *counter) Inc() {
    method get (line 136) | func (c *counter) get() float64 {
    method Write (line 142) | func (c *counter) Write(out *dto.Metric) error {
    method updateExemplar (line 154) | func (c *counter) updateExemplar(v float64, l Labels) {
  type CounterVec (line 170) | type CounterVec struct
    method GetMetricWithLabelValues (line 218) | func (v *CounterVec) GetMetricWithLabelValues(lvs ...string) (Counter,...
    method GetMetricWith (line 238) | func (v *CounterVec) GetMetricWith(labels Labels) (Counter, error) {
    method WithLabelValues (line 251) | func (v *CounterVec) WithLabelValues(lvs ...string) Counter {
    method With (line 263) | func (v *CounterVec) With(labels Labels) Counter {
    method CurryWith (line 284) | func (v *CounterVec) CurryWith(labels Labels) (*CounterVec, error) {
    method MustCurryWith (line 294) | func (v *CounterVec) MustCurryWith(labels Labels) *CounterVec {
  function NewCounterVec (line 176) | func NewCounterVec(opts CounterOpts, labelNames []string) *CounterVec {
  type CounterFunc (line 306) | type CounterFunc interface
  function NewCounterFunc (line 321) | func NewCounterFunc(opts CounterOpts, function func() float64) CounterFu...

FILE: vendor/github.com/prometheus/client_golang/prometheus/desc.go
  type Desc (line 49) | type Desc struct
    method String (line 174) | func (d *Desc) String() string {
  function NewDesc (line 82) | func NewDesc(fqName, help string, variableLabels []string, constLabels L...
  function NewInvalidDesc (line 168) | func NewInvalidDesc(err error) *Desc {

FILE: vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go
  type expvarCollector (line 21) | type expvarCollector struct
    method Describe (line 36) | func (e *expvarCollector) Describe(ch chan<- *Desc) {
    method Collect (line 43) | func (e *expvarCollector) Collect(ch chan<- Metric) {
  function NewExpvarCollector (line 29) | func NewExpvarCollector(exports map[string]*Desc) Collector {

FILE: vendor/github.com/prometheus/client_golang/prometheus/fnv.go
  constant offset64 (line 19) | offset64 = 14695981039346656037
  constant prime64 (line 20) | prime64  = 1099511628211
  function hashNew (line 24) | func hashNew() uint64 {
  function hashAdd (line 29) | func hashAdd(h uint64, s string) uint64 {
  function hashAddByte (line 38) | func hashAddByte(h uint64, b byte) uint64 {

FILE: vendor/github.com/prometheus/client_golang/prometheus/gauge.go
  type Gauge (line 32) | type Gauge interface
  type GaugeOpts (line 56) | type GaugeOpts
  function NewGauge (line 66) | func NewGauge(opts GaugeOpts) Gauge {
  type gauge (line 78) | type gauge struct
    method Desc (line 90) | func (g *gauge) Desc() *Desc {
    method Set (line 94) | func (g *gauge) Set(val float64) {
    method SetToCurrentTime (line 98) | func (g *gauge) SetToCurrentTime() {
    method Inc (line 102) | func (g *gauge) Inc() {
    method Dec (line 106) | func (g *gauge) Dec() {
    method Add (line 110) | func (g *gauge) Add(val float64) {
    method Sub (line 120) | func (g *gauge) Sub(val float64) {
    method Write (line 124) | func (g *gauge) Write(out *dto.Metric) error {
  type GaugeVec (line 134) | type GaugeVec struct
    method GetMetricWithLabelValues (line 182) | func (v *GaugeVec) GetMetricWithLabelValues(lvs ...string) (Gauge, err...
    method GetMetricWith (line 202) | func (v *GaugeVec) GetMetricWith(labels Labels) (Gauge, error) {
    method WithLabelValues (line 215) | func (v *GaugeVec) WithLabelValues(lvs ...string) Gauge {
    method With (line 227) | func (v *GaugeVec) With(labels Labels) Gauge {
    method CurryWith (line 248) | func (v *GaugeVec) CurryWith(labels Labels) (*GaugeVec, error) {
    method MustCurryWith (line 258) | func (v *GaugeVec) MustCurryWith(labels Labels) *GaugeVec {
  function NewGaugeVec (line 140) | func NewGaugeVec(opts GaugeOpts, labelNames []string) *GaugeVec {
  type GaugeFunc (line 270) | type GaugeFunc interface
  function NewGaugeFunc (line 284) | func NewGaugeFunc(opts GaugeOpts, function func() float64) GaugeFunc {

FILE: vendor/github.com/prometheus/client_golang/prometheus/get_pid.go
  function getPIDFn (line 21) | func getPIDFn() func() (int, error) {

FILE: vendor/github.com/prometheus/client_golang/prometheus/get_pid_gopherjs.go
  function getPIDFn (line 19) | func getPIDFn() func() (int, error) {

FILE: vendor/github.com/prometheus/client_golang/prometheus/go_collector.go
  function goRuntimeMemStats (line 26) | func goRuntimeMemStats() memStatsMetrics {
  type baseGoCollector (line 208) | type baseGoCollector struct
    method Describe (line 242) | func (c *baseGoCollector) Describe(ch chan<- *Desc) {
    method Collect (line 251) | func (c *baseGoCollector) Collect(ch chan<- Metric) {
  function newBaseGoCollector (line 216) | func newBaseGoCollector() baseGoCollector {
  function memstatNamespace (line 271) | func memstatNamespace(s string) string {
  type memStatsMetrics (line 277) | type memStatsMetrics

FILE: vendor/github.com/prometheus/client_golang/prometheus/go_collector_go116.go
  type goCollector (line 25) | type goCollector struct
    method Describe (line 69) | func (c *goCollector) Describe(ch chan<- *Desc) {
    method Collect (line 77) | func (c *goCollector) Collect(ch chan<- Metric) {
    method msCollect (line 118) | func (c *goCollector) msCollect(ch chan<- Metric, ms *runtime.MemStats) {
  function NewGoCollector (line 42) | func NewGoCollector() Collector {

FILE: vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go
  constant goGCHeapTinyAllocsObjects (line 35) | goGCHeapTinyAllocsObjects               = "/gc/heap/tiny/allocs:objects"
  constant goGCHeapAllocsObjects (line 36) | goGCHeapAllocsObjects                   = "/gc/heap/allocs:objects"
  constant goGCHeapFreesObjects (line 37) | goGCHeapFreesObjects                    = "/gc/heap/frees:objects"
  constant goGCHeapFreesBytes (line 38) | goGCHeapFreesBytes                      = "/gc/heap/frees:bytes"
  constant goGCHeapAllocsBytes (line 39) | goGCHeapAllocsBytes                     = "/gc/heap/allocs:bytes"
  constant goGCHeapObjects (line 40) | goGCHeapObjects                         = "/gc/heap/objects:objects"
  constant goGCHeapGoalBytes (line 41) | goGCHeapGoalBytes                       = "/gc/heap/goal:bytes"
  constant goMemoryClassesTotalBytes (line 42) | goMemoryClassesTotalBytes               = "/memory/classes/total:bytes"
  constant goMemoryClassesHeapObjectsBytes (line 43) | goMemoryClassesHeapObjectsBytes         = "/memory/classes/heap/objects:...
  constant goMemoryClassesHeapUnusedBytes (line 44) | goMemoryClassesHeapUnusedBytes          = "/memory/classes/heap/unused:b...
  constant goMemoryClassesHeapReleasedBytes (line 45) | goMemoryClassesHeapReleasedBytes        = "/memory/classes/heap/released...
  constant goMemoryClassesHeapFreeBytes (line 46) | goMemoryClassesHeapFreeBytes            = "/memory/classes/heap/free:bytes"
  constant goMemoryClassesHeapStacksBytes (line 47) | goMemoryClassesHeapStacksBytes          = "/memory/classes/heap/stacks:b...
  constant goMemoryClassesOSStacksBytes (line 48) | goMemoryClassesOSStacksBytes            = "/memory/classes/os-stacks:bytes"
  constant goMemoryClassesMetadataMSpanInuseBytes (line 49) | goMemoryClassesMetadataMSpanInuseBytes  = "/memory/classes/metadata/mspa...
  constant goMemoryClassesMetadataMSPanFreeBytes (line 50) | goMemoryClassesMetadataMSPanFreeBytes   = "/memory/classes/metadata/mspa...
  constant goMemoryClassesMetadataMCacheInuseBytes (line 51) | goMemoryClassesMetadataMCacheInuseBytes = "/memory/classes/metadata/mcac...
  constant goMemoryClassesMetadataMCacheFreeBytes (line 52) | goMemoryClassesMetadataMCacheFreeBytes  = "/memory/classes/metadata/mcac...
  constant goMemoryClassesProfilingBucketsBytes (line 53) | goMemoryClassesProfilingBucketsBytes    = "/memory/classes/profiling/buc...
  constant goMemoryClassesMetadataOtherBytes (line 54) | goMemoryClassesMetadataOtherBytes       = "/memory/classes/metadata/othe...
  constant goMemoryClassesOtherBytes (line 55) | goMemoryClassesOtherBytes               = "/memory/classes/other:bytes"
  function bestEffortLookupRM (line 82) | func bestEffortLookupRM(lookup []string) []metrics.Description {
  type goCollector (line 94) | type goCollector struct
    method Describe (line 289) | func (c *goCollector) Describe(ch chan<- *Desc) {
    method Collect (line 300) | func (c *goCollector) Collect(ch chan<- Metric) {
    method exactSumFor (line 396) | func (c *goCollector) exactSumFor(rmName string) float64 {
  type rmMetricDesc (line 122) | type rmMetricDesc struct
  function matchRuntimeMetricsRules (line 126) | func matchRuntimeMetricsRules(rules []internal.GoCollectorRule) []rmMetr...
  function defaultGoCollectorOptions (line 150) | func defaultGoCollectorOptions() internal.GoCollectorOptions {
  function NewGoCollector (line 166) | func NewGoCollector(opts ...func(o *internal.GoCollectorOptions)) Collec...
  function unwrapScalarRMValue (line 369) | func unwrapScalarRMValue(v metrics.Value) float64 {
  function memStatsFromRM (line 408) | func memStatsFromRM(ms *runtime.MemStats, rm map[string]*metrics.Sample) {
  type batchHistogram (line 457) | type batchHistogram struct
    method update (line 503) | func (h *batchHistogram) update(his *metrics.Float64Histogram, sum flo...
    method Desc (line 526) | func (h *batchHistogram) Desc() *Desc {
    method Write (line 530) | func (h *batchHistogram) Write(out *dto.Metric) error {
  function newBatchHistogram (line 479) | func newBatchHistogram(desc *Desc, buckets []float64, hasSum bool) *batc...

FILE: vendor/github.com/prometheus/client_golang/prometheus/histogram.go
  type Histogram (line 243) | type Histogram interface
  constant bucketLabel (line 259) | bucketLabel = "le"
  constant DefNativeHistogramZeroThreshold (line 272) | DefNativeHistogramZeroThreshold = 2.938735877055719e-39
  constant NativeHistogramZeroThresholdZero (line 277) | NativeHistogramZeroThresholdZero = -1
  function LinearBuckets (line 289) | func LinearBuckets(start, width float64, count int) []float64 {
  function ExponentialBuckets (line 309) | func ExponentialBuckets(start, factor float64, count int) []float64 {
  function ExponentialBucketsRange (line 333) | func ExponentialBucketsRange(min, max float64, count int) []float64 {
  type HistogramOpts (line 359) | type HistogramOpts struct
  function NewHistogram (line 478) | func NewHistogram(opts HistogramOpts) Histogram {
  function newHistogram (line 490) | func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string)...
  type histogramCounts (line 563) | type histogramCounts struct
    method observe (line 605) | func (hc *histogramCounts) observe(v float64, bucket int, doSparse boo...
  type histogram (line 658) | type histogram struct
    method Desc (line 702) | func (h *histogram) Desc() *Desc {
    method Observe (line 706) | func (h *histogram) Observe(v float64) {
    method ObserveWithExemplar (line 710) | func (h *histogram) ObserveWithExemplar(v float64, e Labels) {
    method Write (line 716) | func (h *histogram) Write(out *dto.Metric) error {
    method findBucket (line 785) | func (h *histogram) findBucket(v float64) int {
    method observe (line 799) | func (h *histogram) observe(v float64, bucket int) {
    method limitBuckets (line 818) | func (h *histogram) limitBuckets(counts *histogramCounts, value float6...
    method maybeReset (line 853) | func (h *histogram) maybeReset(hot, cold *histogramCounts, coldIdx uin...
    method maybeWidenZeroBucket (line 880) | func (h *histogram) maybeWidenZeroBucket(hot, cold *histogramCounts) b...
    method doubleBucketWidth (line 950) | func (h *histogram) doubleBucketWidth(hot, cold *histogramCounts) {
    method resetCounts (line 998) | func (h *histogram) resetCounts(counts *histogramCounts) {
    method updateExemplar (line 1014) | func (h *histogram) updateExemplar(v float64, bucket int, l Labels) {
  type HistogramVec (line 1030) | type HistogramVec struct
    method GetMetricWithLabelValues (line 1074) | func (v *HistogramVec) GetMetricWithLabelValues(lvs ...string) (Observ...
    method GetMetricWith (line 1094) | func (v *HistogramVec) GetMetricWith(labels Labels) (Observer, error) {
    method WithLabelValues (line 1107) | func (v *HistogramVec) WithLabelValues(lvs ...string) Observer {
    method With (line 1119) | func (v *HistogramVec) With(labels Labels) Observer {
    method CurryWith (line 1140) | func (v *HistogramVec) CurryWith(labels Labels) (ObserverVec, error) {
    method MustCurryWith (line 1150) | func (v *HistogramVec) MustCurryWith(labels Labels) ObserverVec {
  function NewHistogramVec (line 1036) | func NewHistogramVec(opts HistogramOpts, labelNames []string) *Histogram...
  type constHistogram (line 1158) | type constHistogram struct
    method Desc (line 1166) | func (h *constHistogram) Desc() *Desc {
    method Write (line 1170) | func (h *constHistogram) Write(out *dto.Metric) error {
  function NewConstHistogram (line 1208) | func NewConstHistogram(
  function MustNewConstHistogram (line 1232) | func MustNewConstHistogram(
  type buckSort (line 1246) | type buckSort
    method Len (line 1248) | func (s buckSort) Len() int {
    method Swap (line 1252) | func (s buckSort) Swap(i, j int) {
    method Less (line 1256) | func (s buckSort) Less(i, j int) bool {
  function pickSchema (line 1266) | func pickSchema(bucketFactor float64) int32 {
  function makeBuckets (line 1281) | func makeBuckets(buckets *sync.Map) ([]*dto.BucketSpan, []int64) {
  function addToBucket (line 1338) | func addToBucket(buckets *sync.Map, key int, increment int64) bool {
  function addAndReset (line 1360) | func addAndReset(hotBuckets *sync.Map, bucketNumber *uint32) func(k, v i...
  function deleteSyncMap (line 1371) | func deleteSyncMap(m *sync.Map) {
  function findSmallestKey (line 1378) | func findSmallestKey(m *sync.Map) int {
  function getLe (line 1390) | func getLe(key int, schema int32) float64 {
  function waitForCooldown (line 1445) | func waitForCooldown(count uint64, counts *histogramCounts) {
  function atomicAddFloat (line 1453) | func atomicAddFloat(bits *uint64, v float64) {
  function atomicDecUint32 (line 1465) | func atomicDecUint32(p *uint32) {
  function addAndResetCounts (line 1472) | func addAndResetCounts(hot, cold *histogramCounts) {

FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/almost_equal.go
  function AlmostEqualFloat64 (line 36) | func AlmostEqualFloat64(a, b, epsilon float64) bool {
  function AlmostEqualFloat64s (line 50) | func AlmostEqualFloat64s(a, b []float64, epsilon float64) bool {

FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go
  function min (line 28) | func min(a, b int) int {
  function max (line 35) | func max(a, b int) int {
  function calculateRatio (line 42) | func calculateRatio(matches, length int) float64 {
  type Match (line 49) | type Match struct
  type OpCode (line 55) | type OpCode struct
  type SequenceMatcher (line 89) | type SequenceMatcher struct
    method SetSeqs (line 117) | func (m *SequenceMatcher) SetSeqs(a, b []string) {
    method SetSeq1 (line 131) | func (m *SequenceMatcher) SetSeq1(a []string) {
    method SetSeq2 (line 142) | func (m *SequenceMatcher) SetSeq2(b []string) {
    method chainB (line 153) | func (m *SequenceMatcher) chainB() {
    method isBJunk (line 194) | func (m *SequenceMatcher) isBJunk(s string) bool {
    method findLongestMatch (line 226) | func (m *SequenceMatcher) findLongestMatch(alo, ahi, blo, bhi int) Mat...
    method GetMatchingBlocks (line 310) | func (m *SequenceMatcher) GetMatchingBlocks() []Match {
    method GetOpCodes (line 378) | func (m *SequenceMatcher) GetOpCodes() []OpCode {
    method GetGroupedOpCodes (line 418) | func (m *SequenceMatcher) GetGroupedOpCodes(n int) [][]OpCode {
    method Ratio (line 472) | func (m *SequenceMatcher) Ratio() float64 {
    method QuickRatio (line 484) | func (m *SequenceMatcher) QuickRatio() float64 {
    method RealQuickRatio (line 516) | func (m *SequenceMatcher) RealQuickRatio() float64 {
  function NewMatcher (line 102) | func NewMatcher(a, b []string) *SequenceMatcher {
  function NewMatcherWithJunk (line 108) | func NewMatcherWithJunk(a, b []string, autoJunk bool,
  function formatRangeUnified (line 522) | func formatRangeUnified(start, stop int) string {
  type UnifiedDiff (line 536) | type UnifiedDiff struct
  function WriteUnifiedDiff (line 566) | func WriteUnifiedDiff(writer io.Writer, diff UnifiedDiff) error {
  function GetUnifiedDiffString (line 642) | func GetUnifiedDiffString(diff UnifiedDiff) (string, error) {
  function SplitLines (line 650) | func SplitLines(s string) []string {

FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/go_collector_options.go
  type GoCollectorRule (line 18) | type GoCollectorRule struct
  type GoCollectorOptions (line 28) | type GoCollectorOptions struct

FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go
  function RuntimeMetricsToProm (line 39) | func RuntimeMetricsToProm(d *metrics.Description) (string, string, strin...
  function RuntimeMetricsBucketsForUnit (line 84) | func RuntimeMetricsBucketsForUnit(buckets []float64, unit string) []floa...
  function reBucketExp (line 110) | func reBucketExp(buckets []float64, base float64) []float64 {

FILE: vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go
  type LabelPairSorter (line 24) | type LabelPairSorter
    method Len (line 26) | func (s LabelPairSorter) Len() int {
    method Swap (line 30) | func (s LabelPairSorter) Swap(i, j int) {
    method Less (line 34) | func (s LabelPairSorter) Less(i, j int) bool {
  type MetricSorter (line 39) | type MetricSorter
    method Len (line 41) | func (s MetricSorter) Len() int {
    method Swap (line 45) | func (s MetricSorter) Swap(i, j int) {
    method Less (line 49) | func (s MetricSorter) Less(i, j int) bool {
  function NormalizeMetricFamilies (line 85) | func NormalizeMetricFamilies(metricFamiliesByName map[string]*dto.Metric...

FILE: vendor/github.com/prometheus/client_golang/prometheus/labels.go
  type Labels (line 33) | type Labels
  constant reservedLabelPrefix (line 37) | reservedLabelPrefix = "__"
  function makeInconsistentCardinalityError (line 41) | func makeInconsistentCardinalityError(fqName string, labels, labelValues...
  function validateValuesInLabels (line 50) | func validateValuesInLabels(labels Labels, expectedNumberOfValues int) e...
  function validateLabelValues (line 68) | func validateLabelValues(vals []string, expectedNumberOfValues int) error {
  function checkLabelName (line 86) | func checkLabelName(l string) bool {

FILE: vendor/github.com/prometheus/client_golang/prometheus/metric.go
  type Metric (line 35) | type Metric interface
  type Opts (line 70) | type Opts struct
  function BuildFQName (line 106) | func BuildFQName(namespace, subsystem, name string) string {
  type invalidMetric (line 121) | type invalidMetric struct
    method Desc (line 133) | func (m *invalidMetric) Desc() *Desc { return m.desc }
    method Write (line 135) | func (m *invalidMetric) Write(*dto.Metric) error { return m.err }
  function NewInvalidMetric (line 129) | func NewInvalidMetric(desc *Desc, err error) Metric {
  type timestampedMetric (line 137) | type timestampedMetric struct
    method Write (line 142) | func (m timestampedMetric) Write(pb *dto.Metric) error {
  function NewMetricWithTimestamp (line 161) | func NewMetricWithTimestamp(t time.Time, m Metric) Metric {
  type withExemplarsMetric (line 165) | type withExemplarsMetric struct
    method Write (line 171) | func (m *withExemplarsMetric) Write(pb *dto.Metric) error {
  type Exemplar (line 206) | type Exemplar struct
  function NewMetricWithExemplars (line 224) | func NewMetricWithExemplars(m Metric, exemplars ...Exemplar) (Metric, er...
  function MustNewMetricWithExemplars (line 250) | func MustNewMetricWithExemplars(m Metric, exemplars ...Exemplar) Metric {

FILE: vendor/github.com/prometheus/client_golang/prometheus/num_threads.go
  function getRuntimeNumThreads (line 22) | func getRuntimeNumThreads() float64 {

FILE: vendor/github.com/prometheus/client_golang/prometheus/num_threads_gopherjs.go
  function getRuntimeNumThreads (line 20) | func getRuntimeNumThreads() float64 {

FILE: vendor/github.com/prometheus/client_golang/prometheus/observer.go
  type Observer (line 18) | type Observer interface
  type ObserverFunc (line 35) | type ObserverFunc
    method Observe (line 38) | func (f ObserverFunc) Observe(value float64) {
  type ObserverVec (line 43) | type ObserverVec interface
  type ExemplarObserver (line 62) | type ExemplarObserver interface

FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector.go
  type processCollector (line 24) | type processCollector struct
    method Describe (line 124) | func (c *processCollector) Describe(ch chan<- *Desc) {
    method Collect (line 135) | func (c *processCollector) Collect(ch chan<- Metric) {
    method reportError (line 139) | func (c *processCollector) reportError(ch chan<- Metric, desc *Desc, e...
  type ProcessCollectorOpts (line 37) | type ProcessCollectorOpts struct
  function NewProcessCollector (line 60) | func NewProcessCollector(opts ProcessCollectorOpts) Collector {
  function NewPidFileFn (line 151) | func NewPidFileFn(pidFilePath string) func() (int, error) {

FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_js.go
  function canCollectProcess (line 19) | func canCollectProcess() bool {
  method processCollect (line 23) | func (c *processCollector) processCollect(ch chan<- Metric) {

FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go
  function canCollectProcess (line 23) | func canCollectProcess() bool {
  method processCollect (line 28) | func (c *processCollector) processCollect(ch chan<- Metric) {

FILE: vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go
  function canCollectProcess (line 23) | func canCollectProcess() bool {
  type processMemoryCounters (line 35) | type processMemoryCounters struct
  function getProcessMemoryInfo (line 54) | func getProcessMemoryInfo(handle windows.Handle) (processMemoryCounters,...
  function getProcessHandleCount (line 68) | func getProcessHandleCount(handle windows.Handle) (uint32, error) {
  method processCollect (line 81) | func (c *processCollector) processCollect(ch chan<- Metric) {
  function fileTimeToSeconds (line 114) | func fileTimeToSeconds(ft windows.Filetime) float64 {

FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go
  constant closeNotifier (line 24) | closeNotifier = 1 << iota
  constant flusher (line 25) | flusher
  constant hijacker (line 26) | hijacker
  constant readerFrom (line 27) | readerFrom
  constant pusher (line 28) | pusher
  type delegator (line 31) | type delegator interface
  type responseWriterDelegator (line 38) | type responseWriterDelegator struct
    method Status (line 47) | func (r *responseWriterDelegator) Status() int {
    method Written (line 51) | func (r *responseWriterDelegator) Written() int64 {
    method WriteHeader (line 55) | func (r *responseWriterDelegator) WriteHeader(code int) {
    method Write (line 68) | func (r *responseWriterDelegator) Write(b []byte) (int, error) {
  type closeNotifierDelegator (line 80) | type closeNotifierDelegator struct
    method CloseNotify (line 87) | func (d closeNotifierDelegator) CloseNotify() <-chan bool {
  type flusherDelegator (line 81) | type flusherDelegator struct
    method Flush (line 92) | func (d flusherDelegator) Flush() {
  type hijackerDelegator (line 82) | type hijackerDelegator struct
    method Hijack (line 101) | func (d hijackerDelegator) Hijack() (net.Conn, *bufio.ReadWriter, erro...
  type readerFromDelegator (line 83) | type readerFromDelegator struct
    method ReadFrom (line 105) | func (d readerFromDelegator) ReadFrom(re io.Reader) (int64, error) {
  type pusherDelegator (line 84) | type pusherDelegator struct
    method Push (line 116) | func (d pusherDelegator) Push(target string, opts *http.PushOptions) e...
  function init (line 122) | func init() {
  function newDelegator (line 349) | func newDelegator(w http.ResponseWriter, observeWriteHeaderFunc func(int...

FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go
  constant contentTypeHeader (line 50) | contentTypeHeader     = "Content-Type"
  constant contentEncodingHeader (line 51) | contentEncodingHeader = "Content-Encoding"
  constant acceptEncodingHeader (line 52) | acceptEncodingHeader  = "Accept-Encoding"
  function Handler (line 75) | func Handler() http.Handler {
  function HandlerFor (line 87) | func HandlerFor(reg prometheus.Gatherer, opts HandlerOpts) http.Handler {
  function HandlerForTransactional (line 94) | func HandlerForTransactional(reg prometheus.TransactionalGatherer, opts ...
  function InstrumentMetricHandler (line 242) | func InstrumentMetricHandler(reg prometheus.Registerer, handler http.Han...
  type HandlerErrorHandling (line 281) | type HandlerErrorHandling
  constant HTTPErrorOnError (line 293) | HTTPErrorOnError HandlerErrorHandling = iota
  constant ContinueOnError (line 303) | ContinueOnError
  constant PanicOnError (line 305) | PanicOnError
  type Logger (line 311) | type Logger interface
  type HandlerOpts (line 317) | type HandlerOpts struct
  function gzipAccepted (line 372) | func gzipAccepted(header http.Header) bool {
  function httpError (line 388) | func httpError(rsp http.ResponseWriter, err error) {

FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go
  type RoundTripperFunc (line 28) | type RoundTripperFunc
    method RoundTrip (line 31) | func (rt RoundTripperFunc) RoundTrip(r *http.Request) (*http.Response,...
  function InstrumentRoundTripperInFlight (line 40) | func InstrumentRoundTripperInFlight(gauge prometheus.Gauge, next http.Ro...
  function InstrumentRoundTripperCounter (line 65) | func InstrumentRoundTripperCounter(counter *prometheus.CounterVec, next ...
  function InstrumentRoundTripperDuration (line 107) | func InstrumentRoundTripperDuration(obs prometheus.ObserverVec, next htt...
  type InstrumentTrace (line 134) | type InstrumentTrace struct
  function InstrumentRoundTripperTrace (line 163) | func InstrumentRoundTripperTrace(it *InstrumentTrace, next http.RoundTri...

FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go
  constant magicString (line 29) | magicString = "zZgWfBxLqvG8kc8IMv3POi2Bb0tZI3vAnBx+gBaFi9FyPzB/CzKUer1yu...
  function observeWithExemplar (line 33) | func observeWithExemplar(obs prometheus.Observer, val float64, labels ma...
  function addWithExemplar (line 43) | func addWithExemplar(obs prometheus.Counter, val float64, labels map[str...
  function InstrumentHandlerInFlight (line 56) | func InstrumentHandlerInFlight(g prometheus.Gauge, next http.Handler) ht...
  function InstrumentHandlerDuration (line 84) | func InstrumentHandlerDuration(obs prometheus.ObserverVec, next http.Han...
  function InstrumentHandlerCounter (line 135) | func InstrumentHandlerCounter(counter *prometheus.CounterVec, next http....
  function InstrumentHandlerTimeToWriteHeader (line 188) | func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next...
  function InstrumentHandlerRequestSize (line 228) | func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http....
  function InstrumentHandlerResponseSize (line 278) | func InstrumentHandlerResponseSize(obs prometheus.ObserverVec, next http...
  function checkLabels (line 302) | func checkLabels(c prometheus.Collector) (code, method bool) {
  function isLabelCurried (line 363) | func isLabelCurried(c prometheus.Collector, label string) bool {
  function labels (line 387) | func labels(code, method bool, reqMethod string, status int, extraMethod...
  function computeApproximateRequestSize (line 403) | func computeApproximateRequestSize(r *http.Request) int {
  function sanitizeMethod (line 430) | func sanitizeMethod(m string, extraMethods ...string) string {
  function sanitizeCode (line 467) | func sanitizeCode(s int) string {

FILE: vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go
  type Option (line 23) | type Option interface
  type options (line 28) | type options struct
  function defaultOptions (line 33) | func defaultOptions() *options {
  type optionApplyFunc (line 37) | type optionApplyFunc
    method apply (line 39) | func (o optionApplyFunc) apply(opt *options) { o(opt) }
  function WithExtraMethods (line 45) | func WithExtraMethods(methods ...string) Option {
  function WithExemplarFromContext (line 54) | func WithExemplarFromContext(getExemplarFn func(requestCtx context.Conte...

FILE: vendor/github.com/prometheus/client_golang/prometheus/registry.go
  constant capMetricChan (line 40) | capMetricChan = 1000
  constant capDescChan (line 41) | capDescChan   = 10
  function init (line 61) | func init() {
  function NewRegistry (line 68) | func NewRegistry() *Registry {
  function NewPedanticRegistry (line 86) | func NewPedanticRegistry() *Registry {
  type Registerer (line 97) | type Registerer interface
  type Gatherer (line 141) | type Gatherer interface
  function Register (line 168) | func Register(c Collector) error {
  function MustRegister (line 177) | func MustRegister(cs ...Collector) {
  function Unregister (line 186) | func Unregister(c Collector) bool {
  type GathererFunc (line 191) | type GathererFunc
    method Gather (line 194) | func (gf GathererFunc) Gather() ([]*dto.MetricFamily, error) {
  type AlreadyRegisteredError (line 206) | type AlreadyRegisteredError struct
    method Error (line 210) | func (err AlreadyRegisteredError) Error() string {
  type MultiError (line 216) | type MultiError
    method Error (line 220) | func (errs MultiError) Error() string {
    method Append (line 233) | func (errs *MultiError) Append(err error) {
    method MaybeUnwrap (line 243) | func (errs MultiError) MaybeUnwrap() error {
  type Registry (line 261) | type Registry struct
    method Register (line 271) | func (r *Registry) Register(c Collector) error {
    method Unregister (line 366) | func (r *Registry) Unregister(c Collector) bool {
    method MustRegister (line 403) | func (r *Registry) MustRegister(cs ...Collector) {
    method Gather (line 412) | func (r *Registry) Gather() ([]*dto.MetricFamily, error) {
    method Describe (line 563) | func (r *Registry) Describe(ch chan<- *Desc) {
    method Collect (line 575) | func (r *Registry) Collect(ch chan<- Metric) {
  function WriteToTextfile (line 593) | func WriteToTextfile(filename string, g Gatherer) error {
  function processMetric (line 620) | func processMetric(
  type Gatherers (line 743) | type Gatherers
    method Gather (line 746) | func (gs Gatherers) Gather() ([]*dto.MetricFamily, error) {
  function checkSuffixCollisions (line 808) | func checkSuffixCollisions(mf *dto.MetricFamily, mfs map[string]*dto.Met...
  function checkMetricConsistency (line 869) | func checkMetricConsistency(
  function checkDescConsistency (line 947) | func checkDescConsistency(
  type MultiTRegistry (line 995) | type MultiTRegistry struct
    method Gather (line 1007) | func (r *MultiTRegistry) Gather() (mfs []*dto.MetricFamily, done func(...
  function NewMultiTRegistry (line 1000) | func NewMultiTRegistry(tGatherers ...TransactionalGatherer) *MultiTRegis...
  type TransactionalGatherer (line 1034) | type TransactionalGatherer interface
  function ToTransactionalGatherer (line 1060) | func ToTransactionalGatherer(g Gatherer) TransactionalGatherer {
  type noTransactionGatherer (line 1064) | type noTransactionGatherer struct
    method Gather (line 1069) | func (g *noTransactionGatherer) Gather() (_ []*dto.MetricFamily, done ...

FILE: vendor/github.com/prometheus/client_golang/prometheus/summary.go
  constant quantileLabel (line 34) | quantileLabel = "quantile"
  type Summary (line 54) | type Summary interface
  constant DefMaxAge (line 75) | DefMaxAge time.Duration = 10 * time.Minute
  constant DefAgeBuckets (line 78) | DefAgeBuckets = 5
  constant DefBufCap (line 80) | DefBufCap = 500
  type SummaryOpts (line 88) | type SummaryOpts struct
  function NewSummary (line 167) | func NewSummary(opts SummaryOpts) Summary {
  function newSummary (line 179) | func newSummary(desc *Desc, opts SummaryOpts, labelValues ...string) Sum...
  type summary (line 254) | type summary struct
    method Desc (line 280) | func (s *summary) Desc() *Desc {
    method Observe (line 284) | func (s *summary) Observe(v float64) {
    method Write (line 298) | func (s *summary) Write(out *dto.Metric) error {
    method newStream (line 337) | func (s *summary) newStream() *quantile.Stream {
    method asyncFlush (line 342) | func (s *summary) asyncFlush(now time.Time) {
    method maybeRotateStreams (line 356) | func (s *summary) maybeRotateStreams() {
    method flushColdBuf (line 369) | func (s *summary) flushColdBuf() {
    method swapBufs (line 382) | func (s *summary) swapBufs(now time.Time) {
  type summaryCounts (line 393) | type summaryCounts struct
  type noObjectivesSummary (line 402) | type noObjectivesSummary struct
    method Desc (line 434) | func (s *noObjectivesSummary) Desc() *Desc {
    method Observe (line 438) | func (s *noObjectivesSummary) Observe(v float64) {
    method Write (line 457) | func (s *noObjectivesSummary) Write(out *dto.Metric) error {
  type quantSort (line 503) | type quantSort
    method Len (line 505) | func (s quantSort) Len() int {
    method Swap (line 509) | func (s quantSort) Swap(i, j int) {
    method Less (line 513) | func (s quantSort) Less(i, j int) bool {
  type SummaryVec (line 522) | type SummaryVec struct
    method GetMetricWithLabelValues (line 575) | func (v *SummaryVec) GetMetricWithLabelValues(lvs ...string) (Observer...
    method GetMetricWith (line 595) | func (v *SummaryVec) GetMetricWith(labels Labels) (Observer, error) {
    method WithLabelValues (line 608) | func (v *SummaryVec) WithLabelValues(lvs ...string) Observer {
    method With (line 620) | func (v *SummaryVec) With(labels Labels) Observer {
    method CurryWith (line 641) | func (v *SummaryVec) CurryWith(labels Labels) (ObserverVec, error) {
    method MustCurryWith (line 651) | func (v *SummaryVec) MustCurryWith(labels Labels) ObserverVec {
  function NewSummaryVec (line 532) | func NewSummaryVec(opts SummaryOpts, labelNames []string) *SummaryVec {
  type constSummary (line 659) | type constSummary struct
    method Desc (line 667) | func (s *constSummary) Desc() *Desc {
    method Write (line 671) | func (s *constSummary) Write(out *dto.Metric) error {
  function NewConstSummary (line 711) | func NewConstSummary(
  function MustNewConstSummary (line 735) | func MustNewConstSummary(

FILE: vendor/github.com/prometheus/client_golang/prometheus/timer.go
  type Timer (line 20) | type Timer struct
    method ObserveDuration (line 49) | func (t *Timer) ObserveDuration() time.Duration {
  function NewTimer (line 34) | func NewTimer(o Observer) *Timer {

FILE: vendor/github.com/prometheus/client_golang/prometheus/untyped.go
  type UntypedOpts (line 17) | type UntypedOpts
  type UntypedFunc (line 24) | type UntypedFunc interface
  function NewUntypedFunc (line 35) | func NewUntypedFunc(opts UntypedOpts, function func() float64) UntypedFu...

FILE: vendor/github.com/prometheus/client_golang/prometheus/value.go
  type ValueType (line 32) | type ValueType
    method ToDTO (line 49) | func (v ValueType) ToDTO() *dto.MetricType {
  constant _ (line 37) | _ ValueType = iota
  constant CounterValue (line 38) | CounterValue
  constant GaugeValue (line 39) | GaugeValue
  constant UntypedValue (line 40) | UntypedValue
  type valueFunc (line 65) | type valueFunc struct
    method Desc (line 91) | func (v *valueFunc) Desc() *Desc {
    method Write (line 95) | func (v *valueFunc) Write(out *dto.Metric) error {
  function newValueFunc (line 80) | func newValueFunc(desc *Desc, valueType ValueType, function func() float...
  function NewConstMetric (line 106) | func NewConstMetric(desc *Desc, valueType ValueType, value float64, labe...
  function MustNewConstMetric (line 127) | func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, ...
  type constMetric (line 135) | type constMetric struct
    method Desc (line 140) | func (m *constMetric) Desc() *Desc {
    method Write (line 144) | func (m *constMetric) Write(out *dto.Metric) error {
  function populateMetric (line 152) | func populateMetric(
  function MakeLabelPairs (line 180) | func MakeLabelPairs(desc *Desc, labelValues []string) []*dto.LabelPair {
  constant ExemplarMaxRunes (line 203) | ExemplarMaxRunes = 128
  function newExemplar (line 208) | func newExemplar(value float64, ts time.Time, l Labels) (*dto.Exemplar, ...

FILE: vendor/github.com/prometheus/client_golang/prometheus/vec.go
  type MetricVec (line 36) | type MetricVec struct
    method DeleteLabelValues (line 74) | func (m *MetricVec) DeleteLabelValues(lvs ...string) bool {
    method Delete (line 93) | func (m *MetricVec) Delete(labels Labels) bool {
    method DeletePartialMatch (line 108) | func (m *MetricVec) DeletePartialMatch(labels Labels) int {
    method Describe (line 116) | func (m *MetricVec) Describe(ch chan<- *Desc) { m.metricMap.Describe(c...
    method Collect (line 119) | func (m *MetricVec) Collect(ch chan<- Metric) { m.metricMap.Collect(ch) }
    method Reset (line 122) | func (m *MetricVec) Reset() { m.metricMap.Reset() }
    method CurryWith (line 141) | func (m *MetricVec) CurryWith(labels Labels) (*MetricVec, error) {
    method GetMetricWithLabelValues (line 201) | func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, e...
    method GetMetricWith (line 226) | func (m *MetricVec) GetMetricWith(labels Labels) (Metric, error) {
    method hashLabelValues (line 235) | func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) {
    method hashLabels (line 258) | func (m *MetricVec) hashLabels(labels Labels) (uint64, error) {
  function NewMetricVec (line 47) | func NewMetricVec(desc *Desc, newMetric func(lvs ...string) Metric) *Met...
  type metricWithLabelValues (line 289) | type metricWithLabelValues struct
  type curriedLabelValue (line 295) | type curriedLabelValue struct
  type metricMap (line 302) | type metricMap struct
    method Describe (line 311) | func (m *metricMap) Describe(ch chan<- *Desc) {
    method Collect (line 316) | func (m *metricMap) Collect(ch chan<- Metric) {
    method Reset (line 328) | func (m *metricMap) Reset() {
    method deleteByHashWithLabelValues (line 340) | func (m *metricMap) deleteByHashWithLabelValues(
    method deleteByHashWithLabels (line 369) | func (m *metricMap) deleteByHashWithLabels(
    method deleteByLabels (line 395) | func (m *metricMap) deleteByLabels(labels Labels, curry []curriedLabel...
    method getOrCreateMetricWithLabelValues (line 474) | func (m *metricMap) getOrCreateMetricWithLabelValues(
    method getOrCreateMetricWithLabels (line 499) | func (m *metricMap) getOrCreateMetricWithLabels(
    method getMetricWithHashAndLabelValues (line 522) | func (m *metricMap) getMetricWithHashAndLabelValues(
    method getMetricWithHashAndLabels (line 536) | func (m *metricMap) getMetricWithHashAndLabels(
  function findMetricWithPartialLabels (line 416) | func findMetricWithPartialLabels(
  function indexOf (line 429) | func indexOf(target string, items []string) (int, bool) {
  function valueMatchesVariableOrCurriedValue (line 441) | func valueMatchesVariableOrCurriedValue(targetValue string, index int, v...
  function matchPartialLabels (line 453) | func matchPartialLabels(desc *Desc, values []string, labels Labels, curr...
  function findMetricWithLabelValues (line 550) | func findMetricWithLabelValues(
  function findMetricWithLabels (line 563) | func findMetricWithLabels(
  function matchLabelValues (line 574) | func matchLabelValues(values, lvs []string, curry []curriedLabelValue) b...
  function matchLabels (line 595) | func matchLabels(desc *Desc, values []string, labels Labels, curry []cur...
  function extractLabelValues (line 615) | func extractLabelValues(desc *Desc, labels Labels, curry []curriedLabelV...
  function inlineLabelValues (line 629) | func inlineLabelValues(lvs []string, curry []curriedLabelValue) []string {

FILE: vendor/github.com/prometheus/client_golang/prometheus/wrap.go
  function WrapRegistererWith (line 48) | func WrapRegistererWith(labels Labels, reg Registerer) Registerer {
  function WrapRegistererWithPrefix (line 76) | func WrapRegistererWithPrefix(prefix string, reg Registerer) Registerer {
  type wrappingRegisterer (line 83) | type wrappingRegisterer struct
    method Register (line 89) | func (r *wrappingRegisterer) Register(c Collector) error {
    method MustRegister (line 100) | func (r *wrappingRegisterer) MustRegister(cs ...Collector) {
    method Unregister (line 111) | func (r *wrappingRegisterer) Unregister(c Collector) bool {
  type wrappingCollector (line 122) | type wrappingCollector struct
    method Collect (line 128) | func (c *wrappingCollector) Collect(ch chan<- Metric) {
    method Describe (line 143) | func (c *wrappingCollector) Describe(ch chan<- *Desc) {
    method unwrapRecursively (line 154) | func (c *wrappingCollector) unwrapRecursively() Collector {
  type wrappingMetric (line 163) | type wrappingMetric struct
    method Desc (line 169) | func (m *wrappingMetric) Desc() *Desc {
    method Write (line 173) | func (m *wrappingMetric) Write(out *dto.Metric) error {
  function wrapDesc (line 191) | func wrapDesc(desc *Desc, prefix string, labels Labels) *Desc {

FILE: vendor/github.com/prometheus/client_model/go/metrics.pb.go
  constant _ (line 22) | _ = proto.ProtoPackageIsVersion3
  type MetricType (line 24) | type MetricType
    method Enum (line 59) | func (x MetricType) Enum() *MetricType {
    method String (line 65) | func (x MetricType) String() string {
    method UnmarshalJSON (line 69) | func (x *MetricType) UnmarshalJSON(data []byte) error {
    method EnumDescriptor (line 78) | func (MetricType) EnumDescriptor() ([]byte, []int) {
  constant MetricType_COUNTER (line 28) | MetricType_COUNTER MetricType = 0
  constant MetricType_GAUGE (line 30) | MetricType_GAUGE MetricType = 1
  constant MetricType_SUMMARY (line 32) | MetricType_SUMMARY MetricType = 2
  constant MetricType_UNTYPED (line 34) | MetricType_UNTYPED MetricType = 3
  constant MetricType_HISTOGRAM (line 36) | MetricType_HISTOGRAM MetricType = 4
  constant MetricType_GAUGE_HISTOGRAM (line 38) | MetricType_GAUGE_HISTOGRAM MetricType = 5
  type LabelPair (line 82) | type LabelPair struct
    method Reset (line 90) | func (m *LabelPair) Reset()         { *m = LabelPair{} }
    method String (line 91) | func (m *LabelPair) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 92) | func (*LabelPair) ProtoMessage()    {}
    method Descriptor (line 93) | func (*LabelPair) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 97) | func (m *LabelPair) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 100) | func (m *LabelPair) XXX_Marshal(b []byte, deterministic bool) ([]byte,...
    method XXX_Merge (line 103) | func (m *LabelPair) XXX_Merge(src proto.Message) {
    method XXX_Size (line 106) | func (m *LabelPair) XXX_Size() int {
    method XXX_DiscardUnknown (line 109) | func (m *LabelPair) XXX_DiscardUnknown() {
    method GetName (line 115) | func (m *LabelPair) GetName() string {
    method GetValue (line 122) | func (m *LabelPair) GetValue() string {
  type Gauge (line 129) | type Gauge struct
    method Reset (line 136) | func (m *Gauge) Reset()         { *m = Gauge{} }
    method String (line 137) | func (m *Gauge) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 138) | func (*Gauge) ProtoMessage()    {}
    method Descriptor (line 139) | func (*Gauge) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 143) | func (m *Gauge) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 146) | func (m *Gauge) XXX_Marshal(b []byte, deterministic bool) ([]byte, err...
    method XXX_Merge (line 149) | func (m *Gauge) XXX_Merge(src proto.Message) {
    method XXX_Size (line 152) | func (m *Gauge) XXX_Size() int {
    method XXX_DiscardUnknown (line 155) | func (m *Gauge) XXX_DiscardUnknown() {
    method GetValue (line 161) | func (m *Gauge) GetValue() float64 {
  type Counter (line 168) | type Counter struct
    method Reset (line 176) | func (m *Counter) Reset()         { *m = Counter{} }
    method String (line 177) | func (m *Counter) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 178) | func (*Counter) ProtoMessage()    {}
    method Descriptor (line 179) | func (*Counter) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 183) | func (m *Counter) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 186) | func (m *Counter) XXX_Marshal(b []byte, deterministic bool) ([]byte, e...
    method XXX_Merge (line 189) | func (m *Counter) XXX_Merge(src proto.Message) {
    method XXX_Size (line 192) | func (m *Counter) XXX_Size() int {
    method XXX_DiscardUnknown (line 195) | func (m *Counter) XXX_DiscardUnknown() {
    method GetValue (line 201) | func (m *Counter) GetValue() float64 {
    method GetExemplar (line 208) | func (m *Counter) GetExemplar() *Exemplar {
  type Quantile (line 215) | type Quantile struct
    method Reset (line 223) | func (m *Quantile) Reset()         { *m = Quantile{} }
    method String (line 224) | func (m *Quantile) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 225) | func (*Quantile) ProtoMessage()    {}
    method Descriptor (line 226) | func (*Quantile) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 230) | func (m *Quantile) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 233) | func (m *Quantile) XXX_Marshal(b []byte, deterministic bool) ([]byte, ...
    method XXX_Merge (line 236) | func (m *Quantile) XXX_Merge(src proto.Message) {
    method XXX_Size (line 239) | func (m *Quantile) XXX_Size() int {
    method XXX_DiscardUnknown (line 242) | func (m *Quantile) XXX_DiscardUnknown() {
    method GetQuantile (line 248) | func (m *Quantile) GetQuantile() float64 {
    method GetValue (line 255) | func (m *Quantile) GetValue() float64 {
  type Summary (line 262) | type Summary struct
    method Reset (line 271) | func (m *Summary) Reset()         { *m = Summary{} }
    method String (line 272) | func (m *Summary) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 273) | func (*Summary) ProtoMessage()    {}
    method Descriptor (line 274) | func (*Summary) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 278) | func (m *Summary) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 281) | func (m *Summary) XXX_Marshal(b []byte, deterministic bool) ([]byte, e...
    method XXX_Merge (line 284) | func (m *Summary) XXX_Merge(src proto.Message) {
    method XXX_Size (line 287) | func (m *Summary) XXX_Size() int {
    method XXX_DiscardUnknown (line 290) | func (m *Summary) XXX_DiscardUnknown() {
    method GetSampleCount (line 296) | func (m *Summary) GetSampleCount() uint64 {
    method GetSampleSum (line 303) | func (m *Summary) GetSampleSum() float64 {
    method GetQuantile (line 310) | func (m *Summary) GetQuantile() []*Quantile {
  type Untyped (line 317) | type Untyped struct
    method Reset (line 324) | func (m *Untyped) Reset()         { *m = Untyped{} }
    method String (line 325) | func (m *Untyped) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 326) | func (*Untyped) ProtoMessage()    {}
    method Descriptor (line 327) | func (*Untyped) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 331) | func (m *Untyped) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 334) | func (m *Untyped) XXX_Marshal(b []byte, deterministic bool) ([]byte, e...
    method XXX_Merge (line 337) | func (m *Untyped) XXX_Merge(src proto.Message) {
    method XXX_Size (line 340) | func (m *Untyped) XXX_Size() int {
    method XXX_DiscardUnknown (line 343) | func (m *Untyped) XXX_DiscardUnknown() {
    method GetValue (line 349) | func (m *Untyped) GetValue() float64 {
  type Histogram (line 356) | type Histogram struct
    method Reset (line 390) | func (m *Histogram) Reset()         { *m = Histogram{} }
    method String (line 391) | func (m *Histogram) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 392) | func (*Histogram) ProtoMessage()    {}
    method Descriptor (line 393) | func (*Histogram) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 397) | func (m *Histogram) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 400) | func (m *Histogram) XXX_Marshal(b []byte, deterministic bool) ([]byte,...
    method XXX_Merge (line 403) | func (m *Histogram) XXX_Merge(src proto.Message) {
    method XXX_Size (line 406) | func (m *Histogram) XXX_Size() int {
    method XXX_DiscardUnknown (line 409) | func (m *Histogram) XXX_DiscardUnknown() {
    method GetSampleCount (line 415) | func (m *Histogram) GetSampleCount() uint64 {
    method GetSampleCountFloat (line 422) | func (m *Histogram) GetSampleCountFloat() float64 {
    method GetSampleSum (line 429) | func (m *Histogram) GetSampleSum() float64 {
    method GetBucket (line 436) | func (m *Histogram) GetBucket() []*Bucket {
    method GetSchema (line 443) | func (m *Histogram) GetSchema() int32 {
    method GetZeroThreshold (line 450) | func (m *Histogram) GetZeroThreshold() float64 {
    method GetZeroCount (line 457) | func (m *Histogram) GetZeroCount() uint64 {
    method GetZeroCountFloat (line 464) | func (m *Histogram) GetZeroCountFloat() float64 {
    method GetNegativeSpan (line 471) | func (m *Histogram) GetNegativeSpan() []*BucketSpan {
    method GetNegativeDelta (line 478) | func (m *Histogram) GetNegativeDelta() []int64 {
    method GetNegativeCount (line 485) | func (m *Histogram) GetNegativeCount() []float64 {
    method GetPositiveSpan (line 492) | func (m *Histogram) GetPositiveSpan() []*BucketSpan {
    method GetPositiveDelta (line 499) | func (m *Histogram) GetPositiveDelta() []int64 {
    method GetPositiveCount (line 506) | func (m *Histogram) GetPositiveCount() []float64 {
  type Bucket (line 515) | type Bucket struct
    method Reset (line 525) | func (m *Bucket) Reset()         { *m = Bucket{} }
    method String (line 526) | func (m *Bucket) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 527) | func (*Bucket) ProtoMessage()    {}
    method Descriptor (line 528) | func (*Bucket) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 532) | func (m *Bucket) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 535) | func (m *Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, er...
    method XXX_Merge (line 538) | func (m *Bucket) XXX_Merge(src proto.Message) {
    method XXX_Size (line 541) | func (m *Bucket) XXX_Size() int {
    method XXX_DiscardUnknown (line 544) | func (m *Bucket) XXX_DiscardUnknown() {
    method GetCumulativeCount (line 550) | func (m *Bucket) GetCumulativeCount() uint64 {
    method GetCumulativeCountFloat (line 557) | func (m *Bucket) GetCumulativeCountFloat() float64 {
    method GetUpperBound (line 564) | func (m *Bucket) GetUpperBound() float64 {
    method GetExemplar (line 571) | func (m *Bucket) GetExemplar() *Exemplar {
  type BucketSpan (line 584) | type BucketSpan struct
    method Reset (line 592) | func (m *BucketSpan) Reset()         { *m = BucketSpan{} }
    method String (line 593) | func (m *BucketSpan) String() string { return proto.CompactTextString(...
    method ProtoMessage (line 594) | func (*BucketSpan) ProtoMessage()    {}
    method Descriptor (line 595) | func (*BucketSpan) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 599) | func (m *BucketSpan) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 602) | func (m *BucketSpan) XXX_Marshal(b []byte, deterministic bool) ([]byte...
    method XXX_Merge (line 605) | func (m *BucketSpan) XXX_Merge(src proto.Message) {
    method XXX_Size (line 608) | func (m *BucketSpan) XXX_Size() int {
    method XXX_DiscardUnknown (line 611) | func (m *BucketSpan) XXX_DiscardUnknown() {
    method GetOffset (line 617) | func (m *BucketSpan) GetOffset() int32 {
    method GetLength (line 624) | func (m *BucketSpan) GetLength() uint32 {
  type Exemplar (line 631) | type Exemplar struct
    method Reset (line 640) | func (m *Exemplar) Reset()         { *m = Exemplar{} }
    method String (line 641) | func (m *Exemplar) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 642) | func (*Exemplar) ProtoMessage()    {}
    method Descriptor (line 643) | func (*Exemplar) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 647) | func (m *Exemplar) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 650) | func (m *Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, ...
    method XXX_Merge (line 653) | func (m *Exemplar) XXX_Merge(src proto.Message) {
    method XXX_Size (line 656) | func (m *Exemplar) XXX_Size() int {
    method XXX_DiscardUnknown (line 659) | func (m *Exemplar) XXX_DiscardUnknown() {
    method GetLabel (line 665) | func (m *Exemplar) GetLabel() []*LabelPair {
    method GetValue (line 672) | func (m *Exemplar) GetValue() float64 {
    method GetTimestamp (line 679) | func (m *Exemplar) GetTimestamp() *timestamp.Timestamp {
  type Metric (line 686) | type Metric struct
    method Reset (line 699) | func (m *Metric) Reset()         { *m = Metric{} }
    method String (line 700) | func (m *Metric) String() string { return proto.CompactTextString(m) }
    method ProtoMessage (line 701) | func (*Metric) ProtoMessage()    {}
    method Descriptor (line 702) | func (*Metric) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 706) | func (m *Metric) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 709) | func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, er...
    method XXX_Merge (line 712) | func (m *Metric) XXX_Merge(src proto.Message) {
    method XXX_Size (line 715) | func (m *Metric) XXX_Size() int {
    method XXX_DiscardUnknown (line 718) | func (m *Metric) XXX_DiscardUnknown() {
    method GetLabel (line 724) | func (m *Metric) GetLabel() []*LabelPair {
    method GetGauge (line 731) | func (m *Metric) GetGauge() *Gauge {
    method GetCounter (line 738) | func (m *Metric) GetCounter() *Counter {
    method GetSummary (line 745) | func (m *Metric) GetSummary() *Summary {
    method GetUntyped (line 752) | func (m *Metric) GetUntyped() *Untyped {
    method GetHistogram (line 759) | func (m *Metric) GetHistogram() *Histogram {
    method GetTimestampMs (line 766) | func (m *Metric) GetTimestampMs() int64 {
  type MetricFamily (line 773) | type MetricFamily struct
    method Reset (line 783) | func (m *MetricFamily) Reset()         { *m = MetricFamily{} }
    method String (line 784) | func (m *MetricFamily) String() string { return proto.CompactTextStrin...
    method ProtoMessage (line 785) | func (*MetricFamily) ProtoMessage()    {}
    method Descriptor (line 786) | func (*MetricFamily) Descriptor() ([]byte, []int) {
    method XXX_Unmarshal (line 790) | func (m *MetricFamily) XXX_Unmarshal(b []byte) error {
    method XXX_Marshal (line 793) | func (m *MetricFamily) XXX_Marshal(b []byte, deterministic bool) ([]by...
    method XXX_Merge (line 796) | func (m *MetricFamily) XXX_Merge(src proto.Message) {
    method XXX_Size (line 799) | func (m *MetricFamily) XXX_Size() int {
    method XXX_DiscardUnknown (line 802) | func (m *MetricFamily) XXX_DiscardUnknown() {
    method GetName (line 808) | func (m *MetricFamily) GetName() string {
    method GetHelp (line 815) | func (m *MetricFamily) GetHelp() string {
    method GetType (line 822) | func (m *MetricFamily) GetType() MetricType {
    method GetMetric (line 829) | func (m *MetricFamily) GetMetric() []*Metric {
  function init (line 836) | func init() {
  function init (line 852) | func init() {

FILE: vendor/github.com/prometheus/common/expfmt/decode.go
  type Decoder (line 30) | type Decoder interface
  type DecodeOptions (line 35) | type DecodeOptions struct
  function ResponseFormat (line 42) | func ResponseFormat(h http.Header) Format {
  function NewDecoder (line 74) | func NewDecoder(r io.Reader, format Format) Decoder {
  type protoDecoder (line 83) | type protoDecoder struct
    method Decode (line 88) | func (d *protoDecoder) Decode(v *dto.MetricFamily) error {
  type textDecoder (line 116) | type textDecoder struct
    method Decode (line 123) | func (d *textDecoder) Decode(v *dto.MetricFamily) error {
  type SampleDecoder (line 148) | type SampleDecoder struct
    method Decode (line 157) | func (sd *SampleDecoder) Decode(s *model.Vector) error {
  function ExtractSamples (line 170) | func ExtractSamples(o *DecodeOptions, fams ...*dto.MetricFamily) (model....
  function extractSamples (line 186) | func extractSamples(f *dto.MetricFamily, o *DecodeOptions) (model.Vector...
  function extractCounter (line 202) | func extractCounter(o *DecodeOptions, f *dto.MetricFamily) model.Vector {
  function extractGauge (line 233) | func extractGauge(o *DecodeOptions, f *dto.MetricFamily) model.Vector {
  function extractUntyped (line 264) | func extractUntyped(o *DecodeOptions, f *dto.MetricFamily) model.Vector {
  function extractSummary (line 295) | func extractSummary(o *DecodeOptions, f *dto.MetricFamily) model.Vector {
  function extractHistogram (line 352) | func extractHistogram(o *DecodeOptions, f *dto.MetricFamily) model.Vector {

FILE: vendor/github.com/prometheus/common/expfmt/encode.go
  type Encoder (line 29) | type Encoder interface
  type Closer (line 40) | type Closer interface
  type encoderCloser (line 44) | type encoderCloser struct
    method Encode (line 49) | func (ec encoderCloser) Encode(v *dto.MetricFamily) error {
    method Close (line 53) | func (ec encoderCloser) Close() error {
  function Negotiate (line 62) | func Negotiate(h http.Header) Format {
  function NegotiateIncludingOpenMetrics (line 86) | func NegotiateIncludingOpenMetrics(h http.Header) Format {
  function NewEncoder (line 115) | func NewEncoder(w io.Writer, format Format) Encoder {

FILE: vendor/github.com/prometheus/common/expfmt/expfmt.go
  type Format (line 18) | type Format
  constant TextVersion (line 22) | TextVersion        = "0.0.4"
  constant ProtoType (line 23) | ProtoType          = `application/vnd.google.protobuf`
  constant ProtoProtocol (line 24) | ProtoProtocol      = `io.prometheus.client.MetricFamily`
  constant ProtoFmt (line 25) | ProtoFmt           = ProtoType + "; proto=" + ProtoProtocol + ";"
  constant OpenMetricsType (line 26) | OpenMetricsType    = `application/openmetrics-text`
  constant OpenMetricsVersion (line 27) | OpenMetricsVersion = "0.0.1"
  constant FmtUnknown (line 30) | FmtUnknown      Format = `<unknown>`
  constant FmtText (line 31) | FmtText         Format = `text/plain; version=` + TextVersion + `; chars...
  constant FmtProtoDelim (line 32) | FmtProtoDelim   Format = ProtoFmt + ` encoding=delimited`
  constant FmtProtoText (line 33) | FmtProtoText    Format = ProtoFmt + ` encoding=text`
  constant FmtProtoCompact (line 34) | FmtProtoCompact Format = ProtoFmt + ` encoding=compact-text`
  constant FmtOpenMetrics (line 35) | FmtOpenMetrics  Format = OpenMetricsType + `; version=` + OpenMetricsVer...
  constant hdrContentType (line 39) | hdrContentType = "Content-Type"
  constant hdrAccept (line 40) | hdrAccept      = "Accept"

FILE: vendor/github.com/prometheus/common/expfmt/fuzz.go
  function Fuzz (line 28) | func Fuzz(in []byte) int {

FILE: vendor/github.com/prometheus/common/expfmt/openmetrics_create.go
  function MetricFamilyToOpenMetrics (line 63) | func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (wri...
  function FinalizeOpenMetrics (line 288) | func FinalizeOpenMetrics(w io.Writer) (written int, err error) {
  function writeOpenMetricsSample (line 298) | func writeOpenMetricsSample(
  function writeOpenMetricsLabelPairs (line 370) | func writeOpenMetricsLabelPairs(
  function writeExemplar (line 447) | func writeExemplar(w enhancedWriter, e *dto.Exemplar) (int, error) {
  function writeOpenMetricsFloat (line 494) | func writeOpenMetricsFloat(w enhancedWriter, f float64) (int, error) {
  function writeUint (line 521) | func writeUint(w enhancedWriter, u uint64) (int, error) {

FILE: vendor/github.com/prometheus/common/expfmt/text_create.go
  type enhancedWriter (line 33) | type enhancedWriter interface
  constant initialNumBufSize (line 41) | initialNumBufSize = 24
  function MetricFamilyToText (line 67) | func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written in...
  function writeSample (line 277) | func writeSample(
  function writeLabelPairs (line 341) | func writeLabelPairs(
  function writeEscapedString (line 423) | func writeEscapedString(w enhancedWriter, v string, includeDoubleQuote b...
  function writeFloat (line 433) | func writeFloat(w enhancedWriter, f float64) (int, error) {
  function writeInt (line 459) | func writeInt(w enhancedWriter, i int64) (int, error) {

FILE: vendor/github.com/prometheus/common/expfmt/text_parse.go
  type stateFn (line 35) | type stateFn
  type ParseError (line 39) | type ParseError struct
    method Error (line 45) | func (e ParseError) Error() string {
  type TextParser (line 51) | type TextParser struct
    method TextToMetricFamilies (line 100) | func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*d...
    method reset (line 121) | func (p *TextParser) reset(in io.Reader) {
    method startOfLine (line 142) | func (p *TextParser) startOfLine() stateFn {
    method startComment (line 161) | func (p *TextParser) startComment() stateFn {
    method readingMetricName (line 222) | func (p *TextParser) readingMetricName() stateFn {
    method readingLabels (line 249) | func (p *TextParser) readingLabels() stateFn {
    method startLabelName (line 267) | func (p *TextParser) startLabelName() stateFn {
    method startLabelValue (line 318) | func (p *TextParser) startLabelValue() stateFn {
    method readingValue (line 380) | func (p *TextParser) readingValue() stateFn {
    method startTimestamp (line 468) | func (p *TextParser) startTimestamp() stateFn {
    method readingHelp (line 494) | func (p *TextParser) readingHelp() stateFn {
    method readingType (line 509) | func (p *TextParser) readingType() stateFn {
    method parseError (line 529) | func (p *TextParser) parseError(msg string) {
    method skipBlankTab (line 538) | func (p *TextParser) skipBlankTab() {
    method skipBlankTabIfCurrentBlankTab (line 548) | func (p *TextParser) skipBlankTabIfCurrentBlankTab() {
    method readTokenUntilWhitespace (line 558) | func (p *TextParser) readTokenUntilWhitespace() {
    method readTokenUntilNewline (line 572) | func (p *TextParser) readTokenUntilNewline(recognizeEscapeSequence boo...
    method readTokenAsMetricName (line 605) | func (p *TextParser) readTokenAsMetricName() {
    method readTokenAsLabelName (line 623) | func (p *TextParser) readTokenAsLabelName() {
    method readTokenAsLabelValue (line 642) | func (p *TextParser) readTokenAsLabelValue() {
    method setOrCreateCurrentMF (line 676) | func (p *TextParser) setOrCreateCurrentMF() {
  function isValidLabelNameStart (line 714) | func isValidLabelNameStart(b byte) bool {
  function isValidLabelNameContinuation (line 718) | func isValidLabelNameContinuation(b byte) bool {
  function isValidMetricNameStart (line 722) | func isValidMetricNameStart(b byte) bool {
  function isValidMetricNameContinuation (line 726) | func isValidMetricNameContinuation(b byte) bool {
  function isBlankOrTab (line 730) | func isBlankOrTab(b byte) bool {
  function isCount (line 734) | func isCount(name string) bool {
  function isSum (line 738) | func isSum(name string) bool {
  function isBucket (line 742) | func isBucket(name string) bool {
  function summaryMetricName (line 746) | func summaryMetricName(name string) string {
  function histogramMetricName (line 757) | func histogramMetricName(name string) string {
  function parseFloat (line 770) | func parseFloat(s string) (float64, error) {

FILE: vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go
  type Accept (line 50) | type Accept struct
  type accept_slice (line 57) | type accept_slice
    method Len (line 59) | func (accept accept_slice) Len() int {
    method Less (line 64) | func (accept accept_slice) Less(i, j int) bool {
    method Swap (line 79) | func (accept accept_slice) Swap(i, j int) {
  function ParseAccept (line 86) | func ParseAccept(header string) (accept []Accept) {
  function Negotiate (line 140) | func Negotiate(header string, alternatives []string) (content_type strin...

FILE: vendor/github.com/prometheus/common/model/alert.go
  type AlertStatus (line 21) | type AlertStatus
  constant AlertFiring (line 24) | AlertFiring   AlertStatus = "firing"
  constant AlertResolved (line 25) | AlertResolved AlertStatus = "resolved"
  type Alert (line 29) | type Alert struct
    method Name (line 44) | func (a *Alert) Name() string {
    method Fingerprint (line 50) | func (a *Alert) Fingerprint() Fingerprint {
    method String (line 54) | func (a *Alert) String() string {
    method Resolved (line 63) | func (a *Alert) Resolved() bool {
    method ResolvedAt (line 69) | func (a *Alert) ResolvedAt(ts time.Time) bool {
    method Status (line 77) | func (a *Alert) Status() AlertStatus {
    method Validate (line 85) | func (a *Alert) Validate() error {
  type Alerts (line 105) | type Alerts
    method Len (line 107) | func (as Alerts) Len() int      { return len(as) }
    method Swap (line 108) | func (as Alerts) Swap(i, j int) { as[i], as[j] = as[j], as[i] }
    method Less (line 110) | func (as Alerts) Less(i, j int) bool {
    method HasFiring (line 121) | func (as Alerts) HasFiring() bool {
    method Status (line 131) | func (as Alerts) Status() AlertStatus {

FILE: vendor/github.com/prometheus/common/model/fingerprinting.go
  type Fingerprint (line 23) | type Fingerprint
    method String (line 40) | func (f Fingerprint) String() string {
  function FingerprintFromString (line 26) | func FingerprintFromString(s string) (Fingerprint, error) {
  function ParseFingerprint (line 32) | func ParseFingerprint(s string) (Fingerprint, error) {
  type Fingerprints (line 46) | type Fingerprints
    method Len (line 49) | func (f Fingerprints) Len() int {
    method Less (line 54) | func (f Fingerprints) Less(i, j int) bool {
    method Swap (line 59) | func (f Fingerprints) Swap(i, j int) {
  type FingerprintSet (line 64) | type FingerprintSet
    method Equal (line 67) | func (s FingerprintSet) Equal(o FingerprintSet) bool {
    method Intersection (line 82) | func (s FingerprintSet) Intersection(o FingerprintSet) FingerprintSet {

FILE: vendor/github.com/prometheus/common/model/fnv.go
  constant offset64 (line 19) | offset64 = 14695981039346656037
  constant prime64 (line 20) | prime64  = 1099511628211
  function hashNew (line 24) | func hashNew() uint64 {
  function hashAdd (line 29) | func hashAdd(h uint64, s string) uint64 {
  function hashAddByte (line 38) | func hashAddByte(h uint64, b byte) uint64 {

FILE: vendor/github.com/prometheus/common/model/labels.go
  constant AlertNameLabel (line 26) | AlertNameLabel = "alertname"
  constant ExportedLabelPrefix (line 30) | ExportedLabelPrefix = "exported_"
  constant MetricNameLabel (line 34) | MetricNameLabel = "__name__"
  constant SchemeLabel (line 38) | SchemeLabel = "__scheme__"
  constant AddressLabel (line 42) | AddressLabel = "__address__"
  constant MetricsPathLabel (line 46) | MetricsPathLabel = "__metrics_path__"
  constant ScrapeIntervalLabel (line 50) | ScrapeIntervalLabel = "__scrape_interval__"
  constant ScrapeTimeoutLabel (line 54) | ScrapeTimeoutLabel = "__scrape_timeout__"
  constant ReservedLabelPrefix (line 58) | ReservedLabelPrefix = "__"
  constant MetaLabelPrefix (line 63) | MetaLabelPrefix = "__meta_"
  constant TmpLabelPrefix (line 69) | TmpLabelPrefix = "__tmp_"
  constant ParamLabelPrefix (line 73) | ParamLabelPrefix = "__param_"
  constant JobLabel (line 77) | JobLabel = "job"
  constant InstanceLabel (line 80) | InstanceLabel = "instance"
  constant BucketLabel (line 84) | BucketLabel = "le"
  constant QuantileLabel (line 88) | QuantileLabel = "quantile"
  type LabelName (line 98) | type LabelName
    method IsValid (line 103) | func (ln LabelName) IsValid() bool {
    method UnmarshalYAML (line 116) | func (ln *LabelName) UnmarshalYAML(unmarshal func(interface{}) error) ...
    method UnmarshalJSON (line 129) | func (ln *LabelName) UnmarshalJSON(b []byte) error {
  type LabelNames (line 142) | type LabelNames
    method Len (line 144) | func (l LabelNames) Len() int {
    method Less (line 148) | func (l LabelNames) Less(i, j int) bool {
    method Swap (line 152) | func (l LabelNames) Swap(i, j int) {
    method String (line 156) | func (l LabelNames) String() string {
  type LabelValue (line 165) | type LabelValue
    method IsValid (line 168) | func (lv LabelValue) IsValid() bool {
  type LabelValues (line 173) | type LabelValues
    method Len (line 175) | func (l LabelValues) Len() int {
    method Less (line 179) | func (l LabelValues) Less(i, j int) bool {
    method Swap (line 183) | func (l LabelValues) Swap(i, j int) {
  type LabelPair (line 188) | type LabelPair struct
  type LabelPairs (line 195) | type LabelPairs
    method Len (line 197) | func (l LabelPairs) Len() int {
    method Less (line 201) | func (l LabelPairs) Less(i, j int) bool {
    method Swap (line 216) | func (l LabelPairs) Swap(i, j int) {

FILE: vendor/github.com/prometheus/common/model/labelset.go
  type LabelSet (line 28) | type LabelSet
    method Validate (line 32) | func (ls LabelSet) Validate() error {
    method Equal (line 45) | func (ls LabelSet) Equal(o LabelSet) bool {
    method Before (line 72) | func (ls LabelSet) Before(o LabelSet) bool {
    method Clone (line 109) | func (ls LabelSet) Clone() LabelSet {
    method Merge (line 118) | func (l LabelSet) Merge(other LabelSet) LabelSet {
    method String (line 132) | func (l LabelSet) String() string {
    method Fingerprint (line 143) | func (ls LabelSet) Fingerprint() Fingerprint {
    method FastFingerprint (line 149) | func (ls LabelSet) FastFingerprint() Fingerprint {
    method UnmarshalJSON (line 154) | func (l *LabelSet) UnmarshalJSON(b []byte) error {

FILE: vendor/github.com/prometheus/common/model/metric.go
  type Metric (line 32) | type Metric
    method Equal (line 35) | func (m Metric) Equal(o Metric) bool {
    method Before (line 40) | func (m Metric) Before(o Metric) bool {
    method Clone (line 45) | func (m Metric) Clone() Metric {
    method String (line 53) | func (m Metric) String() string {
    method Fingerprint (line 79) | func (m Metric) Fingerprint() Fingerprint {
    method FastFingerprint (line 85) | func (m Metric) FastFingerprint() Fingerprint {
  function IsValidMetricName (line 92) | func IsValidMetricName(n LabelValue) bool {

FILE: vendor/github.com/prometheus/common/model/signature.go
  constant SeparatorByte (line 23) | SeparatorByte byte = 255
  function LabelsToSignature (line 33) | func LabelsToSignature(labels map[string]string) uint64 {
  function labelSetToFingerprint (line 56) | func labelSetToFingerprint(ls LabelSet) Fingerprint {
  function labelSetToFastFingerprint (line 80) | func labelSetToFastFingerprint(ls LabelSet) Fingerprint {
  function SignatureForLabels (line 100) | func SignatureForLabels(m Metric, labels ...LabelName) uint64 {
  function SignatureWithoutLabels (line 120) | func SignatureWithoutLabels(m Metric, labels map[LabelName]struct{}) uin...

FILE: vendor/github.com/prometheus/common/model/silence.go
  type Matcher (line 24) | type Matcher struct
    method UnmarshalJSON (line 30) | func (m *Matcher) UnmarshalJSON(b []byte) error {
    method Validate (line 48) | func (m *Matcher) Validate() error {
  type Silence (line 64) | type Silence struct
    method Validate (line 78) | func (s *Silence) Validate() error {

FILE: vendor/github.com/prometheus/common/model/time.go
  constant minimumTick (line 30) | minimumTick = time.Millisecond
  constant second (line 32) | second = int64(time.Second / minimumTick)
  constant nanosPerTick (line 34) | nanosPerTick = int64(minimumTick / time.Nanosecond)
  constant Earliest (line 38) | Earliest = Time(math.MinInt64)
  constant Latest (line 41) | Latest = Time(math.MaxInt64)
  type Time (line 46) | type Time
    method Equal (line 71) | func (t Time) Equal(o Time) bool {
    method Before (line 76) | func (t Time) Before(o Time) bool {
    method After (line 81) | func (t Time) After(o Time) bool {
    method Add (line 86) | func (t Time) Add(d time.Duration) Time {
    method Sub (line 91) | func (t Time) Sub(o Time) time.Duration {
    method Time (line 96) | func (t Time) Time() time.Time {
    method Unix (line 102) | func (t Time) Unix() int64 {
    method UnixNano (line 108) | func (t Time) UnixNano() int64 {
    method String (line 116) | func (t Time) String() string {
    method MarshalJSON (line 121) | func (t Time) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 126) | func (t *Time) UnmarshalJSON(b []byte) error {
  type Interval (line 49) | type Interval struct
  function Now (line 54) | func Now() Time {
  function TimeFromUnix (line 60) | func TimeFromUnix(t int64) Time {
  function TimeFromUnixNano (line 66) | func TimeFromUnixNano(t int64) Time {
  type Duration (line 172) | type Duration
    method Set (line 175) | func (d *Duration) Set(s string) error {
    method Type (line 182) | func (d *Duration) Type() string {
    method String (line 236) | func (d Duration) String() string {
    method MarshalJSON (line 270) | func (d Duration) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 275) | func (d *Duration) UnmarshalJSON(bytes []byte) error {
    method MarshalText (line 289) | func (d *Duration) MarshalText() ([]byte, error) {
    method UnmarshalText (line 294) | func (d *Duration) UnmarshalText(text []byte) error {
    method MarshalYAML (line 301) | func (d Duration) MarshalYAML() (interface{}, error) {
    method UnmarshalYAML (line 306) | func (d *Duration) UnmarshalYAML(unmarshal func(interface{}) error) er...
  function ParseDuration (line 190) | func ParseDuration(durationStr string) (Duration, error) {

FILE: vendor/github.com/prometheus/common/model/value.go
  type SampleValue (line 43) | type SampleValue
    method MarshalJSON (line 46) | func (v SampleValue) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 51) | func (v *SampleValue) UnmarshalJSON(b []byte) error {
    method Equal (line 66) | func (v SampleValue) Equal(o SampleValue) bool {
    method String (line 73) | func (v SampleValue) String() string {
  type SamplePair (line 78) | type SamplePair struct
    method MarshalJSON (line 84) | func (s SamplePair) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 97) | func (s *SamplePair) UnmarshalJSON(b []byte) error {
    method Equal (line 104) | func (s *SamplePair) Equal(o *SamplePair) bool {
    method String (line 108) | func (s SamplePair) String() string {
  type Sample (line 113) | type Sample struct
    method Equal (line 121) | func (s *Sample) Equal(o *Sample) bool {
    method String (line 136) | func (s Sample) String() string {
    method MarshalJSON (line 144) | func (s Sample) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 160) | func (s *Sample) UnmarshalJSON(b []byte) error {
  type Samples (line 184) | type Samples
    method Len (line 186) | func (s Samples) Len() int {
    method Less (line 191) | func (s Samples) Less(i, j int) bool {
    method Swap (line 204) | func (s Samples) Swap(i, j int) {
    method Equal (line 209) | func (s Samples) Equal(o Samples) bool {
  type SampleStream (line 223) | type SampleStream struct
    method String (line 228) | func (ss SampleStream) String() string {
  type Value (line 237) | type Value interface
  type ValueType (line 247) | type ValueType
    method MarshalJSON (line 258) | func (et ValueType) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 262) | func (et *ValueType) UnmarshalJSON(b []byte) error {
    method String (line 284) | func (e ValueType) String() string {
  constant ValNone (line 250) | ValNone ValueType = iota
  constant ValScalar (line 251) | ValScalar
  constant ValVector (line 252) | ValVector
  constant ValMatrix (line 253) | ValMatrix
  constant ValString (line 254) | ValString
  type Scalar (line 301) | type Scalar struct
    method Type (line 244) | func (*Scalar) Type() ValueType { return ValScalar }
    method String (line 306) | func (s Scalar) String() string {
    method MarshalJSON (line 311) | func (s Scalar) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 317) | func (s *Scalar) UnmarshalJSON(b []byte) error {
  type String (line 334) | type String struct
    method Type (line 245) | func (*String) Type() ValueType { return ValString }
    method String (line 339) | func (s *String) String() string {
    method MarshalJSON (line 344) | func (s String) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 349) | func (s *String) UnmarshalJSON(b []byte) error {
  type Vector (line 356) | type Vector
    method Type (line 243) | func (Vector) Type() ValueType  { return ValVector }
    method String (line 358) | func (vec Vector) String() string {
    method Len (line 366) | func (vec Vector) Len() int      { return len(vec) }
    method Swap (line 367) | func (vec Vector) Swap(i, j int) { vec[i], vec[j] = vec[j], vec[i] }
    method Less (line 370) | func (vec Vector) Less(i, j int) bool {
    method Equal (line 384) | func (vec Vector) Equal(o Vector) bool {
  type Matrix (line 398) | type Matrix
    method Type (line 242) | func (Matrix) Type() ValueType  { return ValMatrix }
    method Len (line 400) | func (m Matrix) Len() int           { return len(m) }
    method Less (line 401) | func (m Matrix) Less(i, j int) bool { return m[i].Metric.Before(m[j].M...
    method Swap (line 402) | func (m Matrix) Swap(i, j int)      { m[i], m[j] = m[j], m[i] }
    method String (line 404) | func (mat Matrix) String() string {

FILE: vendor/github.com/prometheus/procfs/arp.go
  constant ATFComplete (line 27) | ATFComplete = 0x02
  constant ATFPermanent (line 29) | ATFPermanent = 0x04
  constant ATFPublish (line 31) | ATFPublish = 0x08
  constant ATFUseTrailers (line 33) | ATFUseTrailers = 0x10
  constant ATFNetmask (line 35) | ATFNetmask = 0x20
  constant ATFDontPublish (line 37) | ATFDontPublish = 0x40
  type ARPEntry (line 42) | type ARPEntry struct
    method IsComplete (line 114) | func (entry *ARPEntry) IsComplete() bool {
  method GatherARPEntries (line 55) | func (fs FS) GatherARPEntries() ([]ARPEntry, error) {
  function parseARPEntries (line 64) | func parseARPEntries(data []byte) ([]ARPEntry, error) {
  function parseARPEntry (line 93) | func parseARPEntry(columns []string) (ARPEntry, error) {

FILE: vendor/github.com/prometheus/procfs/buddyinfo.go
  type BuddyInfo (line 28) | type BuddyInfo struct
  method BuddyInfo (line 35) | func (fs FS) BuddyInfo() ([]BuddyInfo, error) {
  function parseBuddyInfo (line 45) | func parseBuddyInfo(r io.Reader) ([]BuddyInfo, error) {

FILE: vendor/github.com/prometheus/procfs/cmdline.go
  method CmdLine (line 23) | func (fs FS) CmdLine() ([]string, error) {

FILE: vendor/github.com/prometheus/procfs/cpuinfo.go
  type CPUInfo (line 32) | type CPUInfo struct
  method CPUInfo (line 68) | func (fs FS) CPUInfo() ([]CPUInfo, error) {
  function parseCPUInfoX86 (line 76) | func parseCPUInfoX86(info []byte) ([]CPUInfo, error) {
  function parseCPUInfoARM (line 191) | func parseCPUInfoARM(info []byte) ([]CPUInfo, error) {
  function parseCPUInfoS390X (line 256) | func parseCPUInfoS390X(info []byte) ([]CPUInfo, error) {
  function parseCPUInfoMips (line 340) | func parseCPUInfoMips(info []byte) ([]CPUInfo, error) {
  function parseCPUInfoPPC (line 383) | func parseCPUInfoPPC(info []byte) ([]CPUInfo, error) {
  function parseCPUInfoRISCV (line 428) | func parseCPUInfoRISCV(info []byte) ([]CPUInfo, error) {
  function parseCPUInfoDummy (line 468) | func parseCPUInfoDummy(_ []byte) ([]CPUInfo, error) { // nolint:unused,d...
  function firstNonEmptyLine (line 474) | func firstNonEmptyLine(scanner *bufio.Scanner) string {

FILE: vendor/github.com/prometheus/procfs/crypto.go
  type Crypto (line 27) | type Crypto struct
    method parseKV (line 107) | func (c *Crypto) parseKV(k, v string) error {
  method Crypto (line 54) | func (fs FS) Crypto() ([]Crypto, error) {
  function parseCrypto (line 70) | func parseCrypto(r io.Reader) ([]Crypto, error) {

FILE: vendor/github.com/prometheus/procfs/fs.go
  type FS (line 22) | type FS struct
  constant DefaultMountPoint (line 27) | DefaultMountPoint = fs.DefaultProcMountPoint
  function NewDefaultFS (line 31) | func NewDefaultFS() (FS, error) {
  function NewFS (line 37) | func NewFS(mountPoint string) (FS, error) {

FILE: vendor/github.com/prometheus/procfs/fscache.go
  type Fscacheinfo (line 28) | type Fscacheinfo struct
  method Fscacheinfo (line 231) | func (fs FS) Fscacheinfo() (Fscacheinfo, error) {
  function setFSCacheFields (line 245) | func setFSCacheFields(fields []string, setFields ...*uint64) error {
  function parseFscacheinfo (line 260) | func parseFscacheinfo(r io.Reader) (*Fscacheinfo, error) {

FILE: vendor/github.com/prometheus/procfs/internal/fs/fs.go
  constant DefaultProcMountPoint (line 24) | DefaultProcMountPoint = "/proc"
  constant DefaultSysMountPoint (line 27) | DefaultSysMountPoint = "/sys"
  constant DefaultConfigfsMountPoint (line 30) | DefaultConfigfsMountPoint = "/sys/kernel/config"
  type FS (line 35) | type FS
    method Path (line 53) | func (fs FS) Path(p ...string) string {
  function NewFS (line 39) | func NewFS(mountPoint string) (FS, error) {

FILE: vendor/github.com/prometheus/procfs/internal/util/parse.go
  function ParseUint32s (line 23) | func ParseUint32s(ss []string) ([]uint32, error) {
  function ParseUint64s (line 38) | func ParseUint64s(ss []string) ([]uint64, error) {
  function ParsePInt64s (line 53) | func ParsePInt64s(ss []string) ([]*int64, error) {
  function ReadUintFromFile (line 68) | func ReadUintFromFile(path string) (uint64, error) {
  function ReadIntFromFile (line 77) | func ReadIntFromFile(path string) (int64, error) {
  function ParseBool (line 86) | func ParseBool(b string) *bool {

FILE: vendor/github.com/prometheus/procfs/internal/util/readfile.go
  function ReadFileNoStat (line 26) | func ReadFileNoStat(filename string) ([]byte, error) {

FILE: vendor/github.com/prometheus/procfs/internal/util/sysreadfile.go
  function SysReadFile (line 30) | func SysReadFile(file string) (string, error) {

FILE: vendor/github.com/prometheus/procfs/internal/util/sysreadfile_compat.go
  function SysReadFile (line 25) | func SysReadFile(file string) (string, error) {

FILE: vendor/github.com/prometheus/procfs/internal/util/valueparser.go
  type ValueParser (line 26) | type ValueParser struct
    method Int (line 37) | func (vp *ValueParser) Int() int { return int(vp.int64()) }
    method PInt64 (line 41) | func (vp *ValueParser) PInt64() *int64 {
    method int64 (line 52) | func (vp *ValueParser) int64() int64 {
    method PUInt64 (line 71) | func (vp *ValueParser) PUInt64() *uint64 {
    method Err (line 89) | func (vp *ValueParser) Err() error {
  function NewValueParser (line 32) | func NewValueParser(v string) *ValueParser {

FILE: vendor/github.com/prometheus/procfs/ipvs.go
  type IPVSStats (line 32) | type IPVSStats struct
  type IPVSBackendStatus (line 46) | type IPVSBackendStatus struct
  method IPVSStats (line 68) | func (fs FS) IPVSStats() (IPVSStats, error) {
  function parseIPVSStats (line 78) | func parseIPVSStats(r io.Reader) (IPVSStats, error) {
  method IPVSBackendStatus (line 126) | func (fs FS) IPVSBackendStatus() ([]IPVSBackendStatus, error) {
  function parseIPVSBackendStatus (line 136) | func parseIPVSBackendStatus(file io.Reader) ([]IPVSBackendStatus, error) {
  function parseIPPort (line 209) | func parseIPPort(s string) (net.IP, uint16, error) {

FILE: vendor/github.com/prometheus/procfs/kernel_random.go
  type KernelRandom (line 26) | type KernelRandom struct
  method KernelRandom (line 42) | func (fs FS) KernelRandom() (KernelRandom, error) {

FILE: vendor/github.com/prometheus/procfs/loadavg.go
  type LoadAvg (line 25) | type LoadAvg struct
  method LoadAvg (line 32) | func (fs FS) LoadAvg() (*LoadAvg, error) {
  function parseLoad (line 43) | func parseLoad(loadavgBytes []byte) (*LoadAvg, error) {

FILE: vendor/github.com/prometheus/procfs/mdstat.go
  type MDStat (line 34) | type MDStat struct
  method MDStat (line 66) | func (fs FS) MDStat() ([]MDStat, error) {
  function parseMDStat (line 80) | func parseMDStat(mdStatData []byte) ([]MDStat, error) {
  function evalStatusLine (line 168) | func evalStatusLine(deviceLine, statusLine string) (active, total, down,...
  function evalRecoveryLine (line 209) | func evalRecoveryLine(recoveryLine string) (syncedBlocks int64, pct floa...
  function evalComponentDevices (line 253) | func evalComponentDevices(deviceFields []string) []string {

FILE: vendor/github.com/prometheus/procfs/meminfo.go
  type Meminfo (line 28) | type Meminfo struct
  method Meminfo (line 147) | func (fs FS) Meminfo() (Meminfo, error) {
  function parseMemInfo (line 161) | func parseMemInfo(r io.Reader) (*Meminfo, error) {

FILE: vendor/github.com/prometheus/procfs/mountinfo.go
  type MountInfo (line 31) | type MountInfo struct
  function parseMountInfo (line 56) | func parseMountInfo(info []byte) ([]*MountInfo, error) {
  function parseMountInfoString (line 75) | func parseMountInfoString(mountString string) (*MountInfo, error) {
  function mountOptionsIsValidField (line 119) | func mountOptionsIsValidField(s string) bool {
  function mountOptionsParseOptionalFields (line 132) | func mountOptionsParseOptionalFields(o []string) (map[string]string, err...
  function mountOptionsParser (line 148) | func mountOptionsParser(mountOptions string) map[string]string {
  function GetMounts (line 165) | func GetMounts() ([]*MountInfo, error) {
  function GetProcMounts (line 174) | func GetProcMounts(pid int) ([]*MountInfo, error) {

FILE: vendor/github.com/prometheus/procfs/mountstats.go
  constant deviceEntryLen (line 34) | deviceEntryLen = 8
  constant fieldBytesLen (line 36) | fieldBytesLen  = 8
  constant fieldEventsLen (line 37) | fieldEventsLen = 27
  constant statVersion10 (line 39) | statVersion10 = "1.0"
  constant statVersion11 (line 40) | statVersion11 = "1.1"
  constant fieldTransport10TCPLen (line 42) | fieldTransport10TCPLen = 10
  constant fieldTransport10UDPLen (line 43) | fieldTransport10UDPLen = 7
  constant fieldTransport11TCPLen (line 45) | fieldTransport11TCPLen = 13
  constant fieldTransport11UDPLen (line 46) | fieldTransport11UDPLen = 10
  type Mount (line 50) | type Mount struct
  type MountStats (line 64) | type MountStats interface
  type MountStatsNFS (line 69) | type MountStatsNFS struct
    method mountStats (line 87) | func (m MountStatsNFS) mountStats() {}
  type NFSBytesStats (line 91) | type NFSBytesStats struct
  type NFSEventsStats (line 111) | type NFSEventsStats struct
  type NFSOperationStats (line 170) | type NFSOperationStats struct
  type NFSTransportStats (line 195) | type NFSTransportStats struct
  function parseMountStats (line 239) | func parseMountStats(r io.Reader) ([]*Mount, error) {
  function parseMount (line 288) | func parseMount(ss []string) (*Mount, error) {
  function parseMountStatsNFS (line 321) | func parseMountStatsNFS(s *bufio.Scanner, statVersion string) (*MountSta...
  function parseNFSBytesStats (line 428) | func parseNFSBytesStats(ss []string) (*NFSBytesStats, error) {
  function parseNFSEventsStats (line 457) | func parseNFSEventsStats(ss []string) (*NFSEventsStats, error) {
  function parseNFSOperationStats (line 506) | func parseNFSOperationStats(s *bufio.Scanner) ([]NFSOperationStats, erro...
  function parseNFSTransportStats (line 561) | func parseNFSTransportStats(ss []string, statVersion string) (*NFSTransp...

FILE: vendor/github.com/prometheus/procfs/net_conntrackstat.go
  type ConntrackStatEntry (line 29) | type ConntrackStatEntry struct
  method ConntrackStat (line 42) | func (fs FS) ConntrackStat() ([]ConntrackStatEntry, error) {
  function readConntrackStat (line 47) | func readConntrackStat(path string) ([]ConntrackStatEntry, error) {
  function parseConntrackStat (line 65) | func parseConntrackStat(r io.Reader) ([]ConntrackStatEntry, error) {
  function parseConntrackStatEntry (line 83) | func parseConntrackStatEntry(fields []string) (*ConntrackStatEntry, erro...
  function parseConntrackStatField (line 147) | func parseConntrackStatField(field string) (uint64, error) {

FILE: vendor/github.com/prometheus/procfs/net_dev.go
  type NetDevLine (line 26) | type NetDevLine struct
  type NetDev (line 48) | type NetDev
    method parseLine (line 89) | func (netDev NetDev) parseLine(rawLine string) (*NetDevLine, error) {
    method Total (line 178) | func (netDev NetDev) Total() NetDevLine {
  method NetDev (line 51) | func (fs FS) NetDev() (NetDev, error) {
  method NetDev (line 56) | func (p Proc) NetDev() (NetDev, error) {
  function newNetDev (line 61) | func newNetDev(file string) (NetDev, error) {

FILE: vendor/github.com/prometheus/procfs/net_ip_socket.go
  constant readLimit (line 34) | readLimit = 4294967296
  type NetIPSocket (line 40) | type NetIPSocket
  type NetIPSocketSummary (line 45) | type NetIPSocketSummary struct
  type netIPSocketLine (line 58) | type netIPSocketLine struct
  function newNetIPSocket (line 72) | func newNetIPSocket(file string) (NetIPSocket, error) {
  function newNetIPSocketSummary (line 99) | func newNetIPSocketSummary(file string) (*NetIPSocketSummary, error) {
  function parseIP (line 129) | func parseIP(hexIP string) (net.IP, error) {
  function parseNetIPSocketLine (line 152) | func parseNetIPSocketLine(fields []string) (*netIPSocketLine, error) {

FILE: vendor/github.com/prometheus/procfs/net_protocols.go
  type NetProtocolStats (line 27) | type NetProtocolStats
    method parseLine (line 98) | func (ps NetProtocolStats) parseLine(rawLine string) (*NetProtocolStat...
  type NetProtocolStatLine (line 32) | type NetProtocolStatLine struct
  type NetProtocolCapabilities (line 45) | type NetProtocolCapabilities struct
    method parseCapabilities (line 146) | func (pc *NetProtocolCapabilities) parseCapabilities(capabilities []st...
  method NetProtocols (line 73) | func (fs FS) NetProtocols() (NetProtocolStats, error) {
  function parseNetProtocols (line 81) | func parseNetProtocols(s *bufio.Scanner) (NetProtocolStats, error) {

FILE: vendor/github.com/prometheus/procfs/net_sockstat.go
  type NetSockstat (line 29) | type NetSockstat struct
  type NetSockstatProtocol (line 38) | type NetSockstatProtocol struct
  method NetSockstat (line 49) | func (fs FS) NetSockstat() (*NetSockstat, error) {
  method NetSockstat6 (line 57) | func (fs FS) NetSockstat6() (*NetSockstat, error) {
  function readSockstat (line 62) | func readSockstat(name string) (*NetSockstat, error) {
  function parseSockstat (line 80) | func parseSockstat(r io.Reader) (*NetSockstat, error) {
  function parseSockstatKVs (line 120) | func parseSockstatKVs(kvs []string) (map[string]int, error) {
  function parseSockstatProtocol (line 140) | func parseSockstatProtocol(kvs map[string]int) NetSockstatProtocol {

FILE: vendor/github.com/prometheus/procfs/net_softnet.go
  type SoftnetStat (line 34) | type SoftnetStat struct
  method NetSoftnetStat (line 46) | func (fs FS) NetSoftnetStat() ([]SoftnetStat, error) {
  function parseSoftnet (line 60) | func parseSoftnet(r io.Reader) ([]SoftnetStat, error) {
  function parseHexUint32s (line 90) | func parseHexUint32s(ss []string) ([]uint32, error) {

FILE: vendor/github.com/prometheus/procfs/net_tcp.go
  type NetTCP (line 18) | type NetTCP
  type NetTCPSummary (line 23) | type NetTCPSummary
  method NetTCP (line 28) | func (fs FS) NetTCP() (NetTCP, error) {
  method NetTCP6 (line 34) | func (fs FS) NetTCP6() (NetTCP, error) {
  method NetTCPSummary (line 40) | func (fs FS) NetTCPSummary() (*NetTCPSummary, error) {
  method NetTCP6Summary (line 46) | func (fs FS) NetTCP6Summary() (*NetTCPSummary, error) {
  function newNetTCP (line 51) | func newNetTCP(file string) (NetTCP, error) {
  function newNetTCPSummary (line 57) | func newNetTCPSummary(file string) (*NetTCPSummary, error) {

FILE: vendor/github.com/prometheus/procfs/net_udp.go
  type NetUDP (line 18) | type NetUDP
  type NetUDPSummary (line 23) | type NetUDPSummary
  method NetUDP (line 28) | func (fs FS) NetUDP() (NetUDP, error) {
  method NetUDP6 (line 34) | func (fs FS) NetUDP6() (NetUDP, error) {
  method NetUDPSummary (line 40) | func (fs FS) NetUDPSummary() (*NetUDPSummary, error) {
  method NetUDP6Summary (line 46) | func (fs FS) NetUDP6Summary() (*NetUDPSummary, error) {
  function newNetUDP (line 51) | func newNetUDP(file string) (NetUDP, error) {
  function newNetUDPSummary (line 57) | func newNetUDPSummary(file string) (*NetUDPSummary, error) {

FILE: vendor/github.com/prometheus/procfs/net_unix.go
  constant netUnixTypeStream (line 32) | netUnixTypeStream    = 1
  constant netUnixTypeDgram (line 33) | netUnixTypeDgram     = 2
  constant netUnixTypeSeqpacket (line 34) | netUnixTypeSeqpacket = 5
  constant netUnixFlagDefault (line 36) | netUnixFlagDefault = 0
  constant netUnixFlagListen (line 37) | netUnixFlagListen  = 1 << 16
  constant netUnixStateUnconnected (line 39) | netUnixStateUnconnected  = 1
  constant netUnixStateConnecting (line 40) | netUnixStateConnecting   = 2
  constant netUnixStateConnected (line 41) | netUnixStateConnected    = 3
  constant netUnixStateDisconnected (line 42) | netUnixStateDisconnected = 4
  type NetUNIXType (line 46) | type NetUNIXType
    method String (line 224) | func (t NetUNIXType) String() string {
  type NetUNIXFlags (line 49) | type NetUNIXFlags
    method String (line 236) | func (f NetUNIXFlags) String() string {
  type NetUNIXState (line 52) | type NetUNIXState
    method String (line 245) | func (s NetUNIXState) String() string {
  type NetUNIXLine (line 55) | type NetUNIXLine struct
  type NetUNIX (line 67) | type NetUNIX struct
    method parseLine (line 124) | func (u *NetUNIX) parseLine(line string, hasInode bool, min int) (*Net...
    method parseUsers (line 189) | func (u NetUNIX) parseUsers(s string) (uint64, error) {
    method parseType (line 193) | func (u NetUNIX) parseType(s string) (NetUNIXType, error) {
    method parseFlags (line 202) | func (u NetUNIX) parseFlags(s string) (NetUNIXFlags, error) {
    method parseState (line 211) | func (u NetUNIX) parseState(s string) (NetUNIXState, error) {
    method parseInode (line 220) | func (u NetUNIX) parseInode(s string) (uint64, error) {
  method NetUNIX (line 72) | func (fs FS) NetUNIX() (*NetUNIX, error) {
  function readNetUNIX (line 77) | func readNetUNIX(file string) (*NetUNIX, error) {
  function parseNetUNIX (line 90) | func parseNetUNIX(r io.Reader) (*NetUNIX, error) {

FILE: vendor/github.com/prometheus/procfs/net_xfrm.go
  type XfrmStat (line 25) | type XfrmStat struct
  function NewXfrmStat (line 92) | func NewXfrmStat() (XfrmStat, error) {
  method NewXfrmStat (line 102) | func (fs FS) NewXfrmStat() (XfrmStat, error) {

FILE: vendor/github.com/prometheus/procfs/netstat.go
  type NetStat (line 25) | type NetStat struct
  method NetStat (line 31) | func (fs FS) NetStat() ([]NetStat, error) {

FILE: vendor/github.com/prometheus/procfs/proc.go
  type Proc (line 29) | type Proc struct
    method CmdLine (line 124) | func (p Proc) CmdLine() ([]string, error) {
    method Wchan (line 138) | func (p Proc) Wchan() (string, error) {
    method Comm (line 159) | func (p Proc) Comm() (string, error) {
    method Executable (line 169) | func (p Proc) Executable() (string, error) {
    method Cwd (line 179) | func (p Proc) Cwd() (string, error) {
    method RootDir (line 189) | func (p Proc) RootDir() (string, error) {
    method FileDescriptors (line 199) | func (p Proc) FileDescriptors() ([]uintptr, error) {
    method FileDescriptorTargets (line 219) | func (p Proc) FileDescriptorTargets() ([]string, error) {
    method FileDescriptorsLen (line 239) | func (p Proc) FileDescriptorsLen() (int, error) {
    method MountStats (line 250) | func (p Proc) MountStats() ([]*Mount, error) {
    method MountInfo (line 264) | func (p Proc) MountInfo() ([]*MountInfo, error) {
    method fileDescriptors (line 272) | func (p Proc) fileDescriptors() ([]string, error) {
    method path (line 287) | func (p Proc) path(pa ...string) string {
    method FileDescriptorsInfo (line 293) | func (p Proc) FileDescriptorsInfo() (ProcFDInfos, error) {
    method Schedstat (line 313) | func (p Proc) Schedstat() (ProcSchedstat, error) {
  type Procs (line 37) | type Procs
    method Len (line 39) | func (p Procs) Len() int           { return len(p) }
    method Swap (line 40) | func (p Procs) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
    method Less (line 41) | func (p Procs) Less(i, j int) bool { return p[i].PID < p[j].PID }
  function Self (line 44) | func Self() (Proc, error) {
  function NewProc (line 53) | func NewProc(pid int) (Proc, error) {
  function AllProcs (line 62) | func AllProcs() (Procs, error) {
  method Self (line 71) | func (fs FS) Self() (Proc, error) {
  method NewProc (line 86) | func (fs FS) NewProc(pid int) (Proc, error) {
  method Proc (line 91) | func (fs FS) Proc(pid int) (Proc, error) {
  method AllProcs (line 99) | func (fs FS) AllProcs() (Procs, error) {

FILE: vendor/github.com/prometheus/procfs/proc_cgroup.go
  type Cgroup (line 35) | type Cgroup struct
  function parseCgroupString (line 49) | func parseCgroupString(cgroupStr string) (*Cgroup, error) {
  function parseCgroups (line 73) | func parseCgroups(data []byte) ([]Cgroup, error) {
  method Cgroups (line 92) | func (p Proc) Cgroups() ([]Cgroup, error) {

FILE: vendor/github.com/prometheus/procfs/proc_cgroups.go
  type CgroupSummary (line 30) | type CgroupSummary struct
  function parseCgroupSummaryString (line 43) | func parseCgroupSummaryString(CgroupSummaryStr string) (*CgroupSummary, ...
  function parseCgroupSummary (line 71) | func parseCgroupSummary(data []byte) ([]CgroupSummary, error) {
  method CgroupSummarys (line 92) | func (fs FS) CgroupSummarys() ([]CgroupSummary, error) {

FILE: vendor/github.com/prometheus/procfs/proc_environ.go
  method Environ (line 23) | func (p Proc) Environ() ([]string, error) {

FILE: vendor/github.com/prometheus/procfs/proc_fdinfo.go
  type ProcFDInfo (line 34) | type ProcFDInfo struct
  method FDInfo (line 48) | func (p Proc) FDInfo(fd string) (*ProcFDInfo, error) {
  type InotifyInfo (line 87) | type InotifyInfo struct
  function parseInotifyInfo (line 99) | func parseInotifyInfo(line string) (*InotifyInfo, error) {
  type ProcFDInfos (line 118) | type ProcFDInfos
    method Len (line 120) | func (p ProcFDInfos) Len() int           { return len(p) }
    method Swap (line 121) | func (p ProcFDInfos) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }
    method Less (line 122) | func (p ProcFDInfos) Less(i, j int) bool { return p[i].FD < p[j].FD }
    method InotifyWatchLen (line 125) | func (p ProcFDInfos) InotifyWatchLen() (int, error) {

FILE: vendor/github.com/prometheus/procfs/proc_io.go
  type ProcIO (line 23) | type ProcIO struct
  method IO (line 43) | func (p Proc) IO() (ProcIO, error) {

FILE: vendor/github.com/prometheus/procfs/proc_limits.go
  type ProcLimits (line 27) | type ProcLimits struct
  constant limitsFields (line 72) | limitsFields    = 4
  constant limitsUnlimited (line 73) | limitsUnlimited = "unlimited"
  method NewLimits (line 83) | func (p Proc) NewLimits() (ProcLimits, error) {
  method Limits (line 88) | func (p Proc) Limits() (ProcLimits, error) {
  function parseUint (line 151) | func parseUint(s string) (uint64, error) {

FILE: vendor/github.com/prometheus/procfs/proc_maps.go
  type ProcMapPermissions (line 31) | type ProcMapPermissions struct
  type ProcMap (line 46) | type ProcMap struct
  function parseDevice (line 65) | func parseDevice(s string) (uint64, error) {
  function parseAddress (line 85) | func parseAddress(s string) (uintptr, error) {
  function parseAddresses (line 95) | func parseAddresses(s string) (uintptr, uintptr, error) {
  function parsePermissions (line 115) | func parsePermissions(s string) (*ProcMapPermissions, error) {
  function parseProcMap (line 141) | func parseProcMap(text string) (*ProcMap, error) {
  method ProcMaps (line 191) | func (p Proc) ProcMaps() ([]*ProcMap, error) {

FILE: vendor/github.com/prometheus/procfs/proc_netstat.go
  type ProcNetstat (line 28) | type ProcNetstat struct
  type TcpExt (line 35) | type TcpExt struct
  type IpExt (line 150) | type IpExt struct
  method Netstat (line 171) | func (p Proc) Netstat() (ProcNetstat, error) {
  function parseNetstat (line 184) | func parseNetstat(r io.Reader, fileName string) (ProcNetstat, error) {

FILE: vendor/github.com/prometheus/procfs/proc_ns.go
  type Namespace (line 24) | type Namespace struct
  type Namespaces (line 30) | type Namespaces
  method Namespaces (line 34) | func (p Proc) Namespaces() (Namespaces, error) {

FILE: vendor/github.com/prometheus/procfs/proc_psi.go
  constant lineFormat (line 36) | lineFormat = "avg10=%f avg60=%f avg300=%f total=%d"
  type PSILine (line 42) | type PSILine struct
  type PSIStats (line 53) | type PSIStats struct
  method PSIStatsForResource (line 61) | func (fs FS) PSIStatsForResource(resource string) (PSIStats, error) {
  function parsePSIStats (line 71) | func parsePSIStats(resource string, r io.Reader) (PSIStats, error) {

FILE: vendor/github.com/prometheus/procfs/proc_smaps.go
  type ProcSMapsRollup (line 36) | type ProcSMapsRollup struct
    method parseLine (line 117) | func (s *ProcSMapsRollup) parseLine(line string) error {
    method addValue (line 143) | func (s *ProcSMapsRollup) addValue(k string, vString string, vUint uin...
  method ProcSMapsRollup (line 64) | func (p Proc) ProcSMapsRollup() (ProcSMapsRollup, error) {
  method procSMapsRollupManual (line 92) | func (p Proc) procSMapsRollupManual() (ProcSMapsRollup, error) {

FILE: vendor/github.com/prometheus/procfs/proc_snmp.go
  type ProcSnmp (line 28) | type ProcSnmp struct
  type Ip (line 39) | type Ip struct
  type Icmp (line 61) | type Icmp struct
  type IcmpMsg (line 91) | type IcmpMsg struct
  type Tcp (line 96) | type Tcp struct
  type Udp (line 114) | type Udp struct
  type UdpLite (line 125) | type UdpLite struct
  method Snmp (line 136) | func (p Proc) Snmp() (ProcSnmp, error) {
  function parseSnmp (line 149) | func parseSnmp(r io.Reader, fileName string) (ProcSnmp, error) {

FILE: vendor/github.com/prometheus/procfs/proc_snmp6.go
  type ProcSnmp6 (line 29) | type ProcSnmp6 struct
  type Ip6 (line 38) | type Ip6 struct
  type Icmp6 (line 73) | type Icmp6 struct
  type Udp6 (line 120) | type Udp6 struct
  type UdpLite6 (line 131) | type UdpLite6 struct
  method Snmp6 (line 141) | func (p Proc) Snmp6() (ProcSnmp6, error) {
  function parseSNMP6Stats (line 161) | func parseSNMP6Stats(r io.Reader) (ProcSnmp6, error) {

FILE: vendor/github.com/prometheus/procfs/proc_stat.go
  constant userHZ (line 40) | userHZ = 100
  type ProcStat (line 44) | type ProcStat struct
    method VirtualMemory (line 200) | func (s ProcStat) VirtualMemory() uint {
    method ResidentMemory (line 205) | func (s ProcStat) ResidentMemory() int {
    method StartTime (line 210) | func (s ProcStat) StartTime() (float64, error) {
    method CPUTime (line 220) | func (s ProcStat) CPUTime() float64 {
  method NewStat (line 119) | func (p Proc) NewStat() (ProcStat, error) {
  method Stat (line 124) | func (p Proc) Stat() (ProcStat, error) {

FILE: vendor/github.com/prometheus/procfs/proc_status.go
  type ProcStatus (line 26) | type ProcStatus struct
    method fillStatus (line 116) | func (s *ProcStatus) fillStatus(k string, vString string, vUint uint64...
    method TotalCtxtSwitches (line 168) | func (s ProcStatus) TotalCtxtSwitches() uint64 {
  method NewStatus (line 82) | func (p Proc) NewStatus() (ProcStatus, error) {

FILE: vendor/github.com/prometheus/procfs/proc_sys.go
  function sysctlToPath (line 23) | func sysctlToPath(sysctl string) string {
  method SysctlStrings (line 27) | func (fs FS) SysctlStrings(sysctl string) ([]string, error) {
  method SysctlInts (line 36) | func (fs FS) SysctlInts(sysctl string) ([]int, error) {

FILE: vendor/github.com/prometheus/procfs/schedstat.go
  type Schedstat (line 39) | type Schedstat struct
  type SchedstatCPU (line 44) | type SchedstatCPU struct
  type ProcSchedstat (line 53) | type ProcSchedstat struct
  method Schedstat (line 60) | func (fs FS) Schedstat() (*Schedstat, error) {
  function parseProcSchedstat (line 98) | func parseProcSchedstat(contents string) (ProcSchedstat, error) {

FILE: vendor/github.com/prometheus/procfs/slab.go
  type Slab (line 34) | type Slab struct
  type SlabInfo (line 51) | type SlabInfo struct
  function shouldParseSlab (line 55) | func shouldParseSlab(line string) bool {
  function parseV21SlabEntry (line 66) | func parseV21SlabEntry(line string) (*Slab, error) {
  function parseSlabInfo21 (line 123) | func parseSlabInfo21(r *bytes.Reader) (SlabInfo, error) {
  method SlabInfo (line 141) | func (fs FS) SlabInfo() (SlabInfo, error) {

FILE: vendor/github.com/prometheus/procfs/softirqs.go
  type Softirqs (line 28) | type Softirqs struct
  method Softirqs (line 41) | func (fs FS) Softirqs() (Softirqs, error) {
  function parseSoftirqs (line 53) | func parseSoftirqs(r io.Reader) (Softirqs, error) {

FILE: vendor/github.com/prometheus/procfs/stat.go
  type CPUStat (line 29) | type CPUStat struct
  type SoftIRQStat (line 45) | type SoftIRQStat struct
  type Stat (line 59) | type Stat struct
  function parseCPUStat (line 85) | func parseCPUStat(line string) (CPUStat, int64, error) {
  function parseSoftIRQStat (line 126) | func parseSoftIRQStat(line string) (SoftIRQStat, uint64, error) {
  function NewStat (line 149) | func NewStat() (Stat, error) {
  method NewStat (line 161) | func (fs FS) NewStat() (Stat, error) {
  method Stat (line 167) | func (fs FS) Stat() (Stat, error) {

FILE: vendor/github.com/prometheus/procfs/swaps.go
  type Swap (line 27) | type Swap struct
  method Swaps (line 36) | func (fs FS) Swaps() ([]*Swap, error) {
  function parseSwaps (line 44) | func parseSwaps(info []byte) ([]*Swap, error) {
  function parseSwapString (line 61) | func parseSwapString(swapString string) (*Swap, error) {

FILE: vendor/github.com/prometheus/procfs/vm.go
  type VM (line 33) | type VM struct
  method VM (line 80) | func (fs FS) VM() (*VM, error) {

FILE: vendor/github.com/prometheus/procfs/zoneinfo.go
  type Zoneinfo (line 30) | type Zoneinfo struct
  method Zoneinfo (line 75) | func (fs FS) Zoneinfo() ([]Zoneinfo, error) {
  function parseZoneinfo (line 87) | func parseZoneinfo(zoneinfoData []byte) ([]Zoneinfo, error) {

FILE: vendor/github.com/spf13/pflag/bool.go
  type boolFlag (line 7) | type boolFlag interface
  type boolValue (line 13) | type boolValue
    method Set (line 20) | func (b *boolValue) Set(s string) error {
    method Type (line 26) | func (b *boolValue) Type() string {
    method String (line 30) | func (b *boolValue) String() string { return strconv.FormatBool(bool(*...
    method IsBoolFlag (line 32) | func (b *boolValue) IsBoolFlag() bool { return true }
  function newBoolValue (line 15) | func newBoolValue(val bool, p *bool) *boolValue {
  function boolConv (line 34) | func boolConv(sval string) (interface{}, error) {
  method GetBool (line 39) | func (f *FlagSet) GetBool(name string) (bool, error) {
  method BoolVar (line 49) | func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) {
  method BoolVarP (line 54) | func (f *FlagSet) BoolVarP(p *bool, name, shorthand string, value bool, ...
  function BoolVar (line 61) | func BoolVar(p *bool, name string, value bool, usage string) {
  function BoolVarP (line 66) | func BoolVarP(p *bool, name, shorthand string, value bool, usage string) {
  method Bool (line 73) | func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
  method BoolP (line 78) | func (f *FlagSet) BoolP(name, shorthand string, value bool, usage string...
  function Bool (line 86) | func Bool(name string, value bool, usage string) *bool {
  function BoolP (line 91) | func BoolP(name, shorthand string, value bool, usage string) *bool {

FILE: vendor/github.com/spf13/pflag/bool_slice.go
  type boolSliceValue (line 10) | type boolSliceValue struct
    method Set (line 24) | func (s *boolSliceValue) Set(val string) error {
    method Type (line 57) | func (s *boolSliceValue) Type() string {
    method String (line 62) | func (s *boolSliceValue) String() string {
    method fromString (line 74) | func (s *boolSliceValue) fromString(val string) (bool, error) {
    method toString (line 78) | func (s *boolSliceValue) toString(val bool) string {
    method Append (line 82) | func (s *boolSliceValue) Append(val string) error {
    method Replace (line 91) | func (s *boolSliceValue) Replace(val []string) error {
    method GetSlice (line 104) | func (s *boolSliceValue) GetSlice() []string {
  function newBoolSliceValue (line 15) | func newBoolSliceValue(val []bool, p *[]bool) *boolSliceValue {
  function boolSliceConv (line 112) | func boolSliceConv(val string) (interface{}, error) {
  method GetBoolSlice (line 131) | func (f *FlagSet) GetBoolSlice(name string) ([]bool, error) {
  method BoolSliceVar (line 141) | func (f *FlagSet) BoolSliceVar(p *[]bool, name string, value []bool, usa...
  method BoolSliceVarP (line 146) | func (f *FlagSet) BoolSliceVarP(p *[]bool, name, shorthand string, value...
  function BoolSliceVar (line 152) | func BoolSliceVar(p *[]bool, name string, value []bool, usage string) {
  function BoolSliceVarP (line 157) | func BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usag...
  method BoolSlice (line 163) | func (f *FlagSet) BoolSlice(name string, value []bool, usage string) *[]...
  method BoolSliceP (line 170) | func (f *FlagSet) BoolSliceP(name, shorthand string, value []bool, usage...
  function BoolSlice (line 178) | func BoolSlice(name string, value []bool, usage string) *[]bool {
  function BoolSliceP (line 183) | func BoolSliceP(name, shorthand string, value []bool, usage string) *[]b...

FILE: vendor/github.com/spf13/pflag/bytes.go
  type bytesHexValue (line 11) | type bytesHexValue
    method String (line 14) | func (bytesHex bytesHexValue) String() string {
    method Set (line 19) | func (bytesHex *bytesHexValue) Set(value string) error {
    method Type (line 32) | func (*bytesHexValue) Type() string {
  function newBytesHexValue (line 36) | func newBytesHexValue(val []byte, p *[]byte) *bytesHexValue {
  function bytesHexConv (line 41) | func bytesHexConv(sval string) (interface{}, error) {
  method GetBytesHex (line 53) | func (f *FlagSet) GetBytesHex(name string) ([]byte, error) {
  method BytesHexVar (line 65) | func (f *FlagSet) BytesHexVar(p *[]byte, name string, value []byte, usag...
  method BytesHexVarP (line 70) | func (f *FlagSet) BytesHexVarP(p *[]byte, name, shorthand string, value ...
  function BytesHexVar (line 76) | func BytesHexVar(p *[]byte, name string, value []byte, usage string) {
  function BytesHexVarP (line 81) | func BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage...
  method BytesHex (line 87) | func (f *FlagSet) BytesHex(name string, value []byte, usage string) *[]b...
  method BytesHexP (line 94) | func (f *FlagSet) BytesHexP(name, shorthand string, value []byte, usage ...
  function BytesHex (line 102) | func BytesHex(name string, value []byte, usage string) *[]byte {
  function BytesHexP (line 107) | func BytesHexP(name, shorthand string, value []byte, usage string) *[]by...
  type bytesBase64Value (line 112) | type bytesBase64Value
    method String (line 115) | func (bytesBase64 bytesBase64Value) String() string {
    method Set (line 120) | func (bytesBase64 *bytesBase64Value) Set(value string) error {
    method Type (line 133) | func (*bytesBase64Value) Type() string {
  function newBytesBase64Value (line 137) | func newBytesBase64Value(val []byte, p *[]byte) *bytesBase64Value {
  function bytesBase64ValueConv (line 142) | func bytesBase64ValueConv(sval string) (interface{}, error) {
  method GetBytesBase64 (line 153) | func (f *FlagSet) GetBytesBase64(name string) ([]byte, error) {
  method BytesBase64Var (line 165) | func (f *FlagSet) BytesBase64Var(p *[]byte, name string, value []byte, u...
  method BytesBase64VarP (line 170) | func (f *FlagSet) BytesBase64VarP(p *[]byte, name, shorthand string, val...
  function BytesBase64Var (line 176) | func BytesBase64Var(p *[]byte, name string, value []byte, usage string) {
  function BytesBase64VarP (line 181) | func BytesBase64VarP(p *[]byte, name, shorthand string, value []byte, us...
  method BytesBase64 (line 187) | func (f *FlagSet) BytesBase64(name string, value []byte, usage string) *...
  method BytesBase64P (line 194) | func (f *FlagSet) BytesBase64P(name, shorthand string, value []byte, usa...
  function BytesBase64 (line 202) | func BytesBase64(name string, value []byte, usage string) *[]byte {
  function BytesBase64P (line 207) | func BytesBase64P(name, shorthand string, value []byte, usage string) *[...

FILE: vendor/github.com/spf13/pflag/count.go
  type countValue (line 6) | type countValue
    method Set (line 13) | func (i *countValue) Set(s string) error {
    method Type (line 24) | func (i *countValue) Type() string {
    method String (line 28) | func (i *countValue) String() string { return strconv.Itoa(int(*i)) }
  function newCountValue (line 8) | func newCountValue(val int, p *int) *countValue {
  function countConv (line 30) | func countConv(sval string) (interface{}, error) {
  method GetCount (line 39) | func (f *FlagSet) GetCount(name string) (int, error) {
  method CountVar (line 50) | func (f *FlagSet) CountVar(p *int, name string, usage string) {
  method CountVarP (line 55) | func (f *FlagSet) CountVarP(p *int, name, shorthand string, usage string) {
  function CountVar (line 61) | func CountVar(p *int, name string, usage string) {
  function CountVarP (line 66) | func CountVarP(p *int, name, shorthand string, usage string) {
  method Count (line 73) | func (f *FlagSet) Count(name string, usage string) *int {
  method CountP (line 80) | func (f *FlagSet) CountP(name, shorthand string, usage string) *int {
  function Count (line 89) | func Count(name string, usage string) *int {
  function CountP (line 94) | func CountP(name, shorthand string, usage string) *int {

FILE: vendor/github.com/spf13/pflag/duration.go
  type durationValue (line 8) | type durationValue
    method Set (line 15) | func (d *durationValue) Set(s string) error {
    method Type (line 21) | func (d *durationValue) Type() string {
    method String (line 25) | func (d *durationValue) String() string { return (*time.Duration)(d).S...
  function newDurationValue (line 10) | func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
  function durationConv (line 27) | func durationConv(sval string) (interface{}, error) {
  method GetDuration (line 32) | func (f *FlagSet) GetDuration(name string) (time.Duration, error) {
  method DurationVar (line 42) | func (f *FlagSet) DurationVar(p *time.Duration, name string, value time....
  method DurationVarP (line 47) | func (f *FlagSet) DurationVarP(p *time.Duration, name, shorthand string,...
  function DurationVar (line 53) | func DurationVar(p *time.Duration, name string, value time.Duration, usa...
  function DurationVarP (line 58) | func DurationVarP(p *time.Duration, name, shorthand string, value time.D...
  method Duration (line 64) | func (f *FlagSet) Duration(name string, value time.Duration, usage strin...
  method DurationP (line 71) | func (f *FlagSet) DurationP(name, shorthand string, value time.Duration,...
  function Duration (line 79) | func Duration(name string, value time.Duration, usage string) *time.Dura...
  function DurationP (line 84) | func DurationP(name, shorthand string, value time.Duration, usage string...

FILE: vendor/github.com/spf13/pflag/duration_slice.go
  type durationSliceValue (line 10) | type durationSliceValue struct
    method Set (line 22) | func (s *durationSliceValue) Set(val string) error {
    method Type (line 42) | func (s *durationSliceValue) Type() string {
    method String (line 46) | func (s *durationSliceValue) String() string {
    method fromString (line 54) | func (s *durationSliceValue) fromString(val string) (time.Duration, er...
    method toString (line 58) | func (s *durationSliceValue) toString(val time.Duration) string {
    method Append (line 62) | func (s *durationSliceValue) Append(val string) error {
    method Replace (line 71) | func (s *durationSliceValue) Replace(val []string) error {
    method GetSlice (line 84) | func (s *durationSliceValue) GetSlice() []string {
  function newDurationSliceValue (line 15) | func newDurationSliceValue(val []time.Duration, p *[]time.Duration) *dur...
  function durationSliceConv (line 92) | func durationSliceConv(val string) (interface{}, error) {
  method GetDurationSlice (line 112) | func (f *FlagSet) GetDurationSlice(name string) ([]time.Duration, error) {
  method DurationSliceVar (line 122) | func (f *FlagSet) DurationSliceVar(p *[]time.Duration, name string, valu...
  method DurationSliceVarP (line 127) | func (f *FlagSet) DurationSliceVarP(p *[]time.Duration, name, shorthand ...
  function DurationSliceVar (line 133) | func DurationSliceVar(p *[]time.Duration, name string, value []time.Dura...
  function DurationSliceVarP (line 138) | func DurationSliceVarP(p *[]time.Duration, name, shorthand string, value...
  method DurationSlice (line 144) | func (f *FlagSet) DurationSlice(name string, value []time.Duration, usag...
  method DurationSliceP (line 151) | func (f *FlagSet) DurationSliceP(name, shorthand string, value []time.Du...
  function DurationSlice (line 159) | func DurationSlice(name string, value []time.Duration, usage string) *[]...
  function DurationSliceP (line 164) | func DurationSliceP(name, shorthand string, value []time.Duration, usage...

FILE: vendor/github.com/spf13/pflag/flag.go
  type ErrorHandling (line 116) | type ErrorHandling
  constant ContinueOnError (line 120) | ContinueOnError ErrorHandling = iota
  constant ExitOnError (line 122) | ExitOnError
  constant PanicOnError (line 124) | PanicOnError
  type ParseErrorsWhitelist (line 128) | type ParseErrorsWhitelist struct
  type NormalizedName (line 135) | type NormalizedName
  type FlagSet (line 138) | type FlagSet struct
    method SetNormalizeFunc (line 226) | func (f *FlagSet) SetNormalizeFunc(n func(f *FlagSet, name string) Nor...
    method GetNormalizeFunc (line 246) | func (f *FlagSet) GetNormalizeFunc() func(f *FlagSet, name string) Nor...
    method normalizeFlagName (line 253) | func (f *FlagSet) normalizeFlagName(name string) NormalizedName {
    method out (line 258) | func (f *FlagSet) out() io.Writer {
    method SetOutput (line 267) | func (f *FlagSet) SetOutput(output io.Writer) {
    method VisitAll (line 274) | func (f *FlagSet) VisitAll(fn func(*Flag)) {
    method HasFlags (line 295) | func (f *FlagSet) HasFlags() bool {
    method HasAvailableFlags (line 301) | func (f *FlagSet) HasAvailableFlags() bool {
    method Visit (line 320) | func (f *FlagSet) Visit(fn func(*Flag)) {
    method Lookup (line 348) | func (f *FlagSet) Lookup(name string) *Flag {
    method ShorthandLookup (line 355) | func (f *FlagSet) ShorthandLookup(name string) *Flag {
    method lookup (line 369) | func (f *FlagSet) lookup(name NormalizedName) *Flag {
    method getFlagType (line 374) | func (f *FlagSet) getFlagType(name string, ftype string, convFunc func...
    method ArgsLenAtDash (line 397) | func (f *FlagSet) ArgsLenAtDash() int {
    method MarkDeprecated (line 404) | func (f *FlagSet) MarkDeprecated(name string, usageMessage string) err...
    method MarkShorthandDeprecated (line 420) | func (f *FlagSet) MarkShorthandDeprecated(name string, usageMessage st...
    method MarkHidden (line 434) | func (f *FlagSet) MarkHidden(name string) error {
    method Set (line 456) | func (f *FlagSet) Set(name, value string) error {
    method SetAnnotation (line 493) | func (f *FlagSet) SetAnnotation(name, key string, values []string) err...
    method Changed (line 508) | func (f *FlagSet) Changed(name string) bool {
    method PrintDefaults (line 524) | func (f *FlagSet) PrintDefaults() {
    method FlagUsagesWrapped (line 677) | func (f *FlagSet) FlagUsagesWrapped(cols int) string {
    method FlagUsages (line 750) | func (f *FlagSet) FlagUsages() string {
    method NFlag (line 779) | func (f *FlagSet) NFlag() int { return len(f.actual) }
    method Arg (line 786) | func (f *FlagSet) Arg(i int) string {
    method NArg (line 800) | func (f *FlagSet) NArg() int { return len(f.args) }
    method Args (line 806) | func (f *FlagSet) Args() []string { return f.args }
    method Var (line 817) | func (f *FlagSet) Var(value Value, name string, usage string) {
    method VarPF (line 822) | func (f *FlagSet) VarPF(value Value, name, shorthand, usage string) *F...
    method VarP (line 836) | func (f *FlagSet) VarP(value Value, name, shorthand, usage string) {
    method AddFlag (line 841) | func (f *FlagSet) AddFlag(flag *Flag) {
    method AddFlagSet (line 881) | func (f *FlagSet) AddFlagSet(newSet *FlagSet) {
    method failf (line 909) | func (f *FlagSet) failf(format string, a ...interface{}) error {
    method usage (line 920) | func (f *FlagSet) usage() {
    method parseLongArg (line 952) | func (f *FlagSet) parseLongArg(s string, args []string, fn parseFunc) ...
    method parseSingleShortArg (line 1007) | func (f *FlagSet) parseSingleShortArg(shorthands string, args []string...
    method parseShortArg (line 1073) | func (f *FlagSet) parseShortArg(s string, args []string, fn parseFunc)...
    method parseArgs (line 1088) | func (f *FlagSet) parseArgs(args []string, fn parseFunc) (err error) {
    method Parse (line 1123) | func (f *FlagSet) Parse(arguments []string) error {
    method ParseAll (line 1163) | func (f *FlagSet) ParseAll(arguments []string, fn func(flag *Flag, val...
    method Parsed (line 1182) | func (f *FlagSet) Parsed() bool {
    method SetInterspersed (line 1228) | func (f *FlagSet) SetInterspersed(interspersed bool) {
    method Init (line 1235) | func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
  type Flag (line 171) | type Flag struct
    method defaultIsZeroValue (line 531) | func (f *Flag) defaultIsZeroValue() bool {
  type Value (line 187) | type Value interface
  type SliceValue (line 196) | type SliceValue interface
  function sortFlags (line 206) | func sortFlags(flags map[NormalizedName]*Flag) []*Flag {
  function VisitAll (line 313) | func VisitAll(fn func(*Flag)) {
  function Visit (line 343) | func Visit(fn func(*Flag)) {
  function Lookup (line 445) | func Lookup(name string) *Flag {
  function ShorthandLookup (line 451) | func ShorthandLookup(name string) *Flag {
  function Set (line 518) | func Set(name, value string) error {
  function UnquoteUsage (line 566) | func UnquoteUsage(flag *Flag) (name string, usage string) {
  function wrapN (line 609) | func wrapN(i, slop int, s string) (string, string) {
  function wrap (line 628) | func wrap(i, w int, s string) string {
  function PrintDefaults (line 755) | func PrintDefaults() {
  function defaultUsage (line 760) | func defaultUsage(f *FlagSet) {
  function NFlag (line 782) | func NFlag() int { return len(CommandLine.actual) }
  function Arg (line 795) | func Arg(i int) string {
  function NArg (line 803) | func NArg() int { return len(CommandLine.args) }
  function Args (line 809) | func Args() []string { return CommandLine.args }
  function Var (line 898) | func Var(value Value, name string, usage string) {
  function VarP (line 903) | func VarP(value Value, name, shorthand, usage string) {
  function stripUnknownFlagValue (line 933) | func stripUnknownFlagValue(args []string) []string {
  type parseFunc (line 1156) | type parseFunc
  function Parse (line 1188) | func Parse() {
  function ParseAll (line 1196) | func ParseAll(fn func(flag *Flag, value string) error) {
  function SetInterspersed (line 1202) | func SetInterspersed(interspersed bool) {
  function Parsed (line 1207) | func Parsed() bool {
  function NewFlagSet (line 1216) | func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {

FILE: vendor/github.com/spf13/pflag/float32.go
  type float32Value (line 6) | type float32Value
    method Set (line 13) | func (f *float32Value) Set(s string) error {
    method Type (line 19) | func (f *float32Value) Type() string {
    method String (line 23) | func (f *float32Value) String() string { return strconv.FormatFloat(fl...
  function newFloat32Value (line 8) | func newFloat32Value(val float32, p *float32) *float32Value {
  function float32Conv (line 25) | func float32Conv(sval string) (interface{}, error) {
  method GetFloat32 (line 34) | func (f *FlagSet) GetFloat32(name string) (float32, error) {
  method Float32Var (line 44) | func (f *FlagSet) Float32Var(p *float32, name string, value float32, usa...
  method Float32VarP (line 49) | func (f *FlagSet) Float32VarP(p *float32, name, shorthand string, value ...
  function Float32Var (line 55) | func Float32Var(p *float32, name string, value float32, usage string) {
  function Float32VarP (line 60) | func Float32VarP(p *float32, name, shorthand string, value float32, usag...
  method Float32 (line 66) | func (f *FlagSet) Float32(name string, value float32, usage string) *flo...
  method Float32P (line 73) | func (f *FlagSet) Float32P(name, shorthand string, value float32, usage ...
  function Float32 (line 81) | func Float32(name string, value float32, usage string) *float32 {
  function Float32P (line 86) | func Float32P(name, shorthand string, value float32, usage string) *floa...

FILE: vendor/github.com/spf13/pflag/float32_slice.go
  type float32SliceValue (line 10) | type float32SliceValue struct
    method Set (line 22) | func (s *float32SliceValue) Set(val string) error {
    method Type (line 44) | func (s *float32SliceValue) Type() string {
    method String (line 48) | func (s *float32SliceValue) String() string {
    method fromString (line 56) | func (s *float32SliceValue) fromString(val string) (float32, error) {
    method toString (line 64) | func (s *float32SliceValue) toString(val float32) string {
    method Append (line 68) | func (s *float32SliceValue) Append(val string) error {
    method Replace (line 77) | func (s *float32SliceValue) Replace(val []string) error {
    method GetSlice (line 90) | func (s *float32SliceValue) GetSlice() []string {
  function newFloat32SliceValue (line 15) | func newFloat32SliceValue(val []float32, p *[]float32) *float32SliceValue {
  function float32SliceConv (line 98) | func float32SliceConv(val string) (interface{}, error) {
  method GetFloat32Slice (line 120) | func (f *FlagSet) GetFloat32Slice(name string) ([]float32, error) {
  method Float32SliceVar (line 130) | func (f *FlagSet) Float32SliceVar(p *[]float32, name string, value []flo...
  method Float32SliceVarP (line 135) | func (f *FlagSet) Float32SliceVarP(p *[]float32, name, shorthand string,...
  function Float32SliceVar (line 141) | func Float32SliceVar(p *[]float32, name string, value []float32, usage s...
  function Float32SliceVarP (line 146) | func Float32SliceVarP(p *[]float32, name, shorthand string, value []floa...
  method Float32Slice (line 152) | func (f *FlagSet) Float32Slice(name string, value []float32, usage strin...
  method Float32SliceP (line 159) | func (f *FlagSet) Float32SliceP(name, shorthand string, value []float32,...
  function Float32Slice (line 167) | func Float32Slice(name string, value []float32, usage string) *[]float32 {
  function Float32SliceP (line 172) | func Float32SliceP(name, shorthand string, value []float32, usage string...

FILE: vendor/github.com/spf13/pflag/float64.go
  type float64Value (line 6) | type float64Value
    method Set (line 13) | func (f *float64Value) Set(s string) error {
    method Type (line 19) | func (f *float64Value) Type() string {
    method String (line 23) | func (f *float64Value) String() string { return strconv.FormatFloat(fl...
  function newFloat64Value (line 8) | func newFloat64Value(val float64, p *float64) *float64Value {
  function float64Conv (line 25) | func float64Conv(sval string) (interface{}, error) {
  method GetFloat64 (line 30) | func (f *FlagSet) GetFloat64(name string) (float64, error) {
  method Float64Var (line 40) | func (f *FlagSet) Float64Var(p *float64, name string, value float64, usa...
  method Float64VarP (line 45) | func (f *FlagSet) Float64VarP(p *float64, name, shorthand string, value ...
  function Float64Var (line 51) | func Float64Var(p *float64, name string, value float64, usage string) {
  function Float64VarP (line 56) | func Float64VarP(p *float64, name, shorthand string, value float64, usag...
  method Float64 (line 62) | func (f *FlagSet) Float64(name string, value float64, usage string) *flo...
  method Float64P (line 69) | func (f *FlagSet) Float64P(name, shorthand string, value float64, usage ...
  function Float64 (line 77) | func Float64(name string, value float64, usage string) *float64 {
  function Float64P (line 82) | func Float64P(name, shorthand string, value float64, usage string) *floa...

FILE: vendor/github.com/spf13/pflag/float64_slice.go
  type float64SliceValue (line 10) | type float64SliceValue struct
    method Set (line 22) | func (s *float64SliceValue) Set(val string) error {
    method Type (line 42) | func (s *float64SliceValue) Type() string {
    method String (line 46) | func (s *float64SliceValue) String() string {
    method fromString (line 54) | func (s *float64SliceValue) fromString(val string) (float64, error) {
    method toString (line 58) | func (s *float64SliceValue) toString(val float64) string {
    method Append (line 62) | func (s *float64SliceValue) Append(val string) error {
    method Replace (line 71) | func (s *float64SliceValue) Replace(val []string) error {
    method GetSlice (line 84) | func (s *float64SliceValue) GetSlice() []string {
  function newFloat64SliceValue (line 15) | func newFloat64SliceValue(val []float64, p *[]float64) *float64SliceValue {
  function float64SliceConv (line 92) | func float64SliceConv(val string) (interface{}, error) {
  method GetFloat64Slice (line 112) | func (f *FlagSet) GetFloat64Slice(name string) ([]float64, error) {
  method Float64SliceVar (line 122) | func (f *FlagSet) Float64SliceVar(p *[]float64, name string, value []flo...
  method Float64SliceVarP (line 127) | func (f *FlagSet) Float64SliceVarP(p *[]float64, name, shorthand string,...
  function Float64SliceVar (line 133) | func Float64SliceVar(p *[]float64, name string, value []float64, usage s...
  function Float64SliceVarP (line 138) | func Float64SliceVarP(p *[]float64, name, shorthand string, value []floa...
  method Float64Slice (line 144) | func (f *FlagSet) Float64Slice(name string, value []float64, usage strin...
  method Float64SliceP (line 151) | func (f *FlagSet) Float64SliceP(name, shorthand string, value []float64,...
  function Float64Slice (line 159) | func Float64Slice(name string, value []float64, usage string) *[]float64 {
  function Float64SliceP (line 164) | func Float64SliceP(name, shorthand string, value []float64, usage string...

FILE: vendor/github.com/spf13/pflag/golangflag.go
  type flagValueWrapper (line 17) | type flagValueWrapper struct
    method String (line 48) | func (v *flagValueWrapper) String() string {
    method Set (line 52) | func (v *flagValueWrapper) Set(s string) error {
    method Type (line 56) | func (v *flagValueWrapper) Type() string {
  type goBoolFlag (line 24) | type goBoolFlag interface
  function wrapFlagValue (line 29) | func wrapFlagValue(v goflag.Value) Value {
  function PFlagFromGoFlag (line 64) | func PFlagFromGoFlag(goflag *goflag.Flag) *Flag {
  method AddGoFlag (line 85) | func (f *FlagSet) AddGoFlag(goflag *goflag.Flag) {
  method AddGoFlagSet (line 94) | func (f *FlagSet) AddGoFlagSet(newSet *goflag.FlagSet) {

FILE: vendor/github.com/spf13/pflag/int.go
  type intValue (line 6) | type intValue
    method Set (line 13) | func (i *intValue) Set(s string) error {
    method Type (line 19) | func (i *intValue) Type() string {
    method String (line 23) | func (i *intValue) String() string { return strconv.Itoa(int(*i)) }
  function newIntValue (line 8) | func newIntValue(val int, p *int) *intValue {
  function intConv (line 25) | func intConv(sval string) (interface{}, error) {
  method GetInt (line 30) | func (f *FlagSet) GetInt(name string) (int, error) {
  method IntVar (line 40) | func (f *FlagSet) IntVar(p *int, name string, value int, usage string) {
  method IntVarP (line 45) | func (f *FlagSet) IntVarP(p *int, name, shorthand string, value int, usa...
  function IntVar (line 51) | func IntVar(p *int, name string, value int, usage string) {
  function IntVarP (line 56) | func IntVarP(p *int, name, shorthand string, value int, usage string) {
  method Int (line 62) | func (f *FlagSet) Int(name string, value int, usage string) *int {
  method IntP (line 69) | func (f *FlagSet) IntP(name, shorthand string, value int, usage string) ...
  function Int (line 77) | func Int(name string, value int, usage string) *int {
  function IntP (line 82) | func IntP(name, shorthand string, value int, usage string) *int {

FILE: vendor/github.com/spf13/pflag/int16.go
  type int16Value (line 6) | type int16Value
    method Set (line 13) | func (i *int16Value) Set(s string) error {
    method Type (line 19) | func (i *int16Value) Type() string {
    method String (line 23) | func (i *int16Value) String() string { return strconv.FormatInt(int64(...
  function newInt16Value (line 8) | func newInt16Value(val int16, p *int16) *int16Value {
  function int16Conv (line 25) | func int16Conv(sval string) (interface{}, error) {
  method GetInt16 (line 34) | func (f *FlagSet) GetInt16(name string) (int16, error) {
  method Int16Var (line 44) | func (f *FlagSet) Int16Var(p *int16, name string, value int16, usage str...
  method Int16VarP (line 49) | func (f *FlagSet) Int16VarP(p *int16, name, shorthand string, value int1...
  function Int16Var (line 55) | func Int16Var(p *int16, name string, value int16, usage string) {
  function Int16VarP (line 60) | func Int16VarP(p *int16, name, shorthand string, value int16, usage stri...
  method Int16 (line 66) | func (f *FlagSet) Int16(name string, value int16, usage string) *int16 {
  method Int16P (line 73) | func (f *FlagSet) Int16P(name, shorthand string, value int16, usage stri...
  function Int16 (line 81) | func Int16(name string, value int16, usage string) *int16 {
  function Int16P (line 86) | func Int16P(name, shorthand string, value int16, usage string) *int16 {

FILE: vendor/github.com/spf13/pflag/int32.go
  type int32Value (line 6) | type int32Value
    method Set (line 13) | func (i *int32Value) Set(s string) error {
    method Type (line 19) | func (i *int32Value) Type() string {
    method String (line 23) | func (i *int32Value) String() string { return strconv.FormatInt(int64(...
  function newInt32Value (line 8) | func newInt32Value(val int32, p *int32) *int32Value {
  function int32Conv (line 25) | func int32Conv(sval string) (interface{}, error) {
  method GetInt32 (line 34) | func (f *FlagSet) GetInt32(name string) (int32, error) {
  method Int32Var (line 44) | func (f *FlagSet) Int32Var(p *int32, name string, value int32, usage str...
  method Int32VarP (line 49) | func (f *FlagSet) Int32VarP(p *int32, name, shorthand string, value int3...
  function Int32Var (line 55) | func Int32Var(p *int32, name string, value int32, usage string) {
  function Int32VarP (line 60) | func Int32VarP(p *int32, name, shorthand string, value int32, usage stri...
  method Int32 (line 66) | func (f *FlagSet) Int32(name string, value int32, usage string) *int32 {
  method Int32P (line 73) | func (f *FlagSet) Int32P(name, shorthand string, value int32, usage stri...
  function Int32 (line 81) | func Int32(name string, value int32, usage string) *int32 {
  function Int32P (line 86) | func Int32P(name, shorthand string, value int32, usage string) *int32 {

FILE: vendor/github.com/spf13/pflag/int32_slice.go
  type int32SliceValue (line 10) | type int32SliceValue struct
    method Set (line 22) | func (s *int32SliceValue) Set(val string) error {
    method Type (line 44) | func (s *int32SliceValue) Type() string {
    method String (line 48) | func (s *int32SliceValue) String() string {
    method fromString (line 56) | func (s *int32SliceValue) fromString(val string) (int32, error) {
    method toString (line 64) | func (s *int32SliceValue) toString(val int32) string {
    method Append (line 68) | func (s *int32SliceValue) Append(val string) error {
    method Replace (line 77) | func (s *int32SliceValue) Replace(val []string) error {
    method GetSlice (line 90) | func (s *int32SliceValue) GetSlice() []string {
  function newInt32SliceValue (line 15) | func newInt32SliceValue(val []int32, p *[]int32) *int32SliceValue {
  function int32SliceConv (line 98) | func int32SliceConv(val string) (interface{}, error) {
  method GetInt32Slice (line 120) | func (f *FlagSet) GetInt32Slice(name string) ([]int32, error) {
  method Int32SliceVar (line 130) | func (f *FlagSet) Int32SliceVar(p *[]int32, name string, value []int32, ...
  method Int32SliceVarP (line 135) | func (f *FlagSet) Int32SliceVarP(p *[]int32, name, shorthand string, val...
  function Int32SliceVar (line 141) | func Int32SliceVar(p *[]int32, name string, value []int32, usage string) {
  function Int32SliceVarP (line 146) | func Int32SliceVarP(p *[]int32, name, shorthand string, value []int32, u...
  method Int32Slice (line 152) | func (f *FlagSet) Int32Slice(name string, value []int32, usage string) *...
  method Int32SliceP (line 159) | func (f *FlagSet) Int32SliceP(name, shorthand string, value []int32, usa...
  function Int32Slice (line 167) | func Int32Slice(name string, value []int32, usage string) *[]int32 {
  function Int32SliceP (line 172) | func Int32SliceP(name, shorthand string, value []int32, usage string) *[...

FILE: vendor/github.com/spf13/pflag/int64.go
  type int64Value (line 6) | type int64Value
    method Set (line 13) | func (i *int64Value) Set(s string) error {
    method Type (line 19) | func (i *int64Value) Type() string {
    method String (line 23) | func (i *int64Value) String() string { return strconv.FormatInt(int64(...
  function newInt64Value (line 8) | func newInt64Value(val int64, p *int64) *int64Value {
  function int64Conv (line 25) | func int64Conv(sval string) (interface{}, error) {
  method GetInt64 (line 30) | func (f *FlagSet) GetInt64(name string) (int64, error) {
  method Int64Var (line 40) | func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage str...
  method Int64VarP (line 45) | func (f *FlagSet) Int64VarP(p *int64, name, shorthand string, value int6...
  function Int64Var (line 51) | func Int64Var(p *int64, name string, value int64, usage string) {
  function Int64VarP (line 56) | func Int64VarP(p *int64, name, shorthand string, value int64, usage stri...
  method Int64 (line 62) | func (f *FlagSet) Int64(name string, value int64, usage string) *int64 {
  method Int64P (line 69) | func (f *FlagSet) Int64P(name, shorthand string, value int64, usage stri...
  function Int64 (line 77) | func Int64(name string, value int64, usage string) *int64 {
  function Int64P (line 82) | func Int64P(name, shorthand string, value int64, usage string) *int64 {

FILE: vendor/github.com/spf13/pflag/int64_slice.go
  type int64SliceValue (line 10) | type int64SliceValue struct
    method Set (line 22) | func (s *int64SliceValue) Set(val string) error {
    method Type (line 42) | func (s *int64SliceValue) Type() string {
    method String (line 46) | func (s *int64SliceValue) String() string {
    method fromString (line 54) | func (s *int64SliceValue) fromString(val string) (int64, error) {
    method toString (line 58) | func (s *int64SliceValue) toString(val int64) string {
    method Append (line 62) | func (s *int64SliceValue) Append(val string) error {
    method Replace (line 71) | func (s *int64SliceValue) Replace(val []string) error {
    method GetSlice (line 84) | func (s *int64SliceValue) GetSlice() []string {
  function newInt64SliceValue (line 15) | func newInt64SliceValue(val []int64, p *[]int64) *int64SliceValue {
  function int64SliceConv (line 92) | func int64SliceConv(val string) (interface{}, error) {
  method GetInt64Slice (line 112) | func (f *FlagSet) GetInt64Slice(name string) ([]int64, error) {
  method Int64SliceVar (line 122) | func (f *FlagSet) Int64SliceVar(p *[]int64, name string, value []int64, ...
  method Int64SliceVarP (line 127) | func (f *FlagSet) Int64SliceVarP(p *[]int64, name, shorthand string, val...
  function Int64SliceVar (line 133) | func Int64SliceVar(p *[]int64, name string, value []int64, usage string) {
  function Int64SliceVarP (line 138) | func Int64SliceVarP(p *[]int64, name, shorthand string, value []int64, u...
  method Int64Slice (line 144) | func (f *FlagSet) Int64Slice(name string, value []int64, usage string) *...
  method Int64SliceP (line 151) | func (f *FlagSet) Int64SliceP(name, shorthand string, value []int64, usa...
  function Int64Slice (line 159) | func Int64Slice(name string, value []int64, usage string) *[]int64 {
  function Int64SliceP (line 164) | func Int64SliceP(name, shorthand string, value []int64, usage string) *[...

FILE: vendor/github.com/spf13/pflag/int8.go
  type int8Value (line 6) | type int8Value
    method Set (line 13) | func (i *int8Value) Set(s string) error {
    method Type (line 19) | func (i *int8Value) Type() string {
    method String (line 23) | func (i *int8Value) String() string { return strconv.FormatInt(int64(*...
  function newInt8Value (line 8) | func newInt8Value(val int8, p *int8) *int8Value {
  function int8Conv (line 25) | func int8Conv(sval string) (interface{}, error) {
  method GetInt8 (line 34) | func (f *FlagSet) GetInt8(name string) (int8, error) {
  method Int8Var (line 44) | func (f *Flag
Copy disabled (too large) Download .json
Condensed preview — 784 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (10,798K chars).
[
  {
    "path": ".gitallowed",
    "chars": 10,
    "preview": "xxxyyyzzz\n"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 118,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n"
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 2083,
    "preview": "---\nname: CI\n\n'on':\n  - push\n  - pull_request\n\nenv:\n  GOPROXY: https://proxy.golang.org\n  GOPATH: ${{ github.workspace }"
  },
  {
    "path": ".gitignore",
    "chars": 80,
    "preview": "/bin\n/.go\n/.push-*\n/.container-*\n/.dockerfile-*\n/.buildx-initialized\n/.licenses\n"
  },
  {
    "path": ".golangci.yaml",
    "chars": 990,
    "preview": "# This file configures checks that all new code for Kubernetes is meant to\n# pass, in contrast to .golangci.yaml which d"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 1791,
    "preview": "# Contributing\n\nWelcome to git-sync!\n\nThe [Kubernetes community repo](https://github.com/kubernetes/community) contains "
  },
  {
    "path": "Dockerfile.in",
    "chars": 6018,
    "preview": "# Copyright 2016 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "Makefile",
    "chars": 10935,
    "preview": "# Copyright 2016 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
  },
  {
    "path": "OWNERS",
    "chars": 51,
    "preview": "approvers:\n- thockin\n- stp-ip\n- janetkuo\n- sdowell\n"
  },
  {
    "path": "README.md",
    "chars": 27132,
    "preview": "# NOTE: THIS DOCUMENT COVERS GIT-SYNC v4\n\nThis is the \"master\" branch, which is under development.  If you are looking \n"
  },
  {
    "path": "RELEASING.md",
    "chars": 2109,
    "preview": "# Cutting a release\n\n## Tags\n\nFirst, pick the new tag.  Usually this means to see what has already been\ntagged, and pick"
  },
  {
    "path": "SECURITY.md",
    "chars": 1069,
    "preview": "# Security Policy\n\n## Security Announcements\n\nJoin the [kubernetes-security-announce] group for security and vulnerabili"
  },
  {
    "path": "SECURITY_CONTACTS",
    "chars": 533,
    "preview": "# Defined below are the security contacts for this repo.\n#\n# They are the contact point for the Product Security Committ"
  },
  {
    "path": "_test_tools/exechook_command.sh",
    "chars": 888,
    "preview": "#!/bin/sh\n#\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "_test_tools/exechook_command_fail.sh",
    "chars": 744,
    "preview": "#!/bin/sh\n#\n# Copyright 2021 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "_test_tools/exechook_command_fail_with_sleep.sh",
    "chars": 752,
    "preview": "#!/bin/sh\n#\n# Copyright 2021 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "_test_tools/exechook_command_git_archive.sh",
    "chars": 769,
    "preview": "#!/bin/sh\n#\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "_test_tools/exechook_command_with_sleep.sh",
    "chars": 780,
    "preview": "#!/bin/sh\n#\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "_test_tools/git_askpass.sh",
    "chars": 1564,
    "preview": "#!/bin/bash\n#\n# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "_test_tools/git_slow_fetch.sh",
    "chars": 672,
    "preview": "#!/bin/sh\n#\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "_test_tools/httpd/Dockerfile",
    "chars": 1326,
    "preview": "# Copyright 2023 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
  },
  {
    "path": "_test_tools/httpd/README.md",
    "chars": 725,
    "preview": "# A server for tests git-over-http\n\nDO NOT USE THIS FOR ANYTHING BUT TESTING GIT OVER HTTP!!!\n\n## How to use it\n\nBuild y"
  },
  {
    "path": "_test_tools/httpd/nginx.conf",
    "chars": 1217,
    "preview": "# /etc/nginx/nginx.conf\n\nuser root;\nworker_processes 1;\ndaemon off;\nerror_log /dev/stdout info;\n\nevents {\n}\n\nhttp {\n\tacc"
  },
  {
    "path": "_test_tools/httpd/run.sh",
    "chars": 691,
    "preview": "#!/bin/sh\n#\n# Copyright 2023 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "_test_tools/ncsvr/Dockerfile",
    "chars": 1014,
    "preview": "# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
  },
  {
    "path": "_test_tools/ncsvr/README.md",
    "chars": 791,
    "preview": "# A simple server for tests\n\nDO NOT USE THIS FOR ANYTHING BUT TESTING!!!\n\n## How to use it\n\nBuild yourself a test image."
  },
  {
    "path": "_test_tools/ncsvr/ncsvr.sh",
    "chars": 1060,
    "preview": "#!/bin/sh\n#\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "_test_tools/sshd/Dockerfile",
    "chars": 1566,
    "preview": "# Copyright 2019 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may n"
  },
  {
    "path": "_test_tools/sshd/README.md",
    "chars": 1327,
    "preview": "# An SSHD for tests git-over-ssh\n\nDO NOT USE THIS FOR ANYTHING BUT TESTING GIT OVER SSH!!!\n\n## How to use it\n\nBuild your"
  },
  {
    "path": "_test_tools/sshd/sshd.sh",
    "chars": 999,
    "preview": "#!/bin/sh\n#\n# Copyright 2020 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");"
  },
  {
    "path": "_test_tools/sshd/sshd_config",
    "chars": 468,
    "preview": "# This is the sshd server system-wide configuration file.  See\n# sshd_config(5) for more information.\n\n# The default is "
  },
  {
    "path": "abspath.go",
    "chars": 2693,
    "preview": "/*\nCopyright 2014 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "abspath_test.go",
    "chars": 4328,
    "preview": "/*\nCopyright 2015 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "build/build.sh",
    "chars": 1654,
    "preview": "#!/bin/bash\n#\n# Copyright 2016 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "build/test.sh",
    "chars": 1160,
    "preview": "#!/bin/bash\n#\n# Copyright 2016 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "code-of-conduct.md",
    "chars": 148,
    "preview": "# Kubernetes Community Code of Conduct\n\nPlease refer to our [Kubernetes Community Code of Conduct](https://git.k8s.io/co"
  },
  {
    "path": "credential.go",
    "chars": 3807,
    "preview": "/*\nCopyright 2014 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "demo/README.md",
    "chars": 594,
    "preview": "# git-sync-demo\n\nThis demo shows how to use a `git-sync` container alongside an HTTP server to\nserve static content.\n\n##"
  },
  {
    "path": "demo/deployment.yaml",
    "chars": 1605,
    "preview": "apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: static-server\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n  "
  },
  {
    "path": "demo/html/index.html",
    "chars": 110,
    "preview": "<!DOCTYPE html>\n<html>\n<body>\n\n<h1>That's it, that's the demo</h1>\n<p>Impressive, right?</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "demo/service.yaml",
    "chars": 166,
    "preview": "apiVersion: v1\nkind: Service\nmetadata:\n  name: static-server\nspec:\n  selector:\n    app: static-server\n  type: LoadBalanc"
  },
  {
    "path": "docs/askpass-url.md",
    "chars": 813,
    "preview": "# Using an HTTP auth URL with git-sync\n\n## Step 1: Create a GIT_ASKPASS HTTP Service\n\nThe GIT ASKPASS Service is exposed"
  },
  {
    "path": "docs/cookie-file.md",
    "chars": 1379,
    "preview": "# Using an HTTP cookie file with git-sync\n\nGit-sync supports use of an HTTP cookie file for accessing git content.\n\n## S"
  },
  {
    "path": "docs/dev/testing_github_app_auth.md",
    "chars": 2406,
    "preview": "# Testing GitHub app auth\n\n## Step 1: Create and install a dummy GitHub app for testing with\n\nGo to https://github.com/s"
  },
  {
    "path": "docs/kubernetes.md",
    "chars": 1971,
    "preview": "# Using git-sync in kubernetes\n\nThis document provides a trivialized example of running a multi-container pod\nin Kuberne"
  },
  {
    "path": "docs/proxy.md",
    "chars": 1227,
    "preview": "# Using git with proxy\n\nGit-sync supports using a proxy through git-configuration.\n\n## Background\n\nSee [issue 180](https"
  },
  {
    "path": "docs/ssh.md",
    "chars": 3917,
    "preview": "# Using SSH with git-sync\n\nGit-sync supports using the SSH protocol for pulling git content.\n\n## Step 1: Create Secret\n\n"
  },
  {
    "path": "env.go",
    "chars": 8435,
    "preview": "/*\nCopyright 2014 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "env_test.go",
    "chars": 6132,
    "preview": "/*\nCopyright 2015 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "go.mod",
    "chars": 724,
    "preview": "module k8s.io/git-sync\n\nrequire (\n\tgithub.com/go-logr/logr v1.2.3\n\tgithub.com/golang-jwt/jwt/v4 v4.5.2\n\tgithub.com/prome"
  },
  {
    "path": "go.sum",
    "chars": 49241,
    "preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
  },
  {
    "path": "main.go",
    "chars": 98340,
    "preview": "/*\nCopyright 2014 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "main_test.go",
    "chars": 11905,
    "preview": "/*\nCopyright 2015 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/cmd/cmd.go",
    "chars": 3571,
    "preview": "/*\nCopyright 2021 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/hook/exechook.go",
    "chars": 2135,
    "preview": "/*\nCopyright 2021 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/hook/exechook_test.go",
    "chars": 1847,
    "preview": "/*\nCopyright 2021 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/hook/hook.go",
    "chars": 5235,
    "preview": "/*\nCopyright 2021 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/hook/hook_test.go",
    "chars": 1714,
    "preview": "/*\nCopyright 2019 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/hook/webhook.go",
    "chars": 2361,
    "preview": "/*\nCopyright 2019 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/hook/webhook_test.go",
    "chars": 1038,
    "preview": "/*\nCopyright 2019 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/logging/logging.go",
    "chars": 3804,
    "preview": "/*\nCopyright 2021 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/pid1/pid1.go",
    "chars": 3058,
    "preview": "/*\nCopyright 2019 The Kubernetes Authors All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"Lice"
  },
  {
    "path": "pkg/version/version.go",
    "chars": 774,
    "preview": "/*\nCopyright 2016 The Kubernetes Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not u"
  },
  {
    "path": "stage_binaries.sh",
    "chars": 14323,
    "preview": "#!/bin/bash\n\n# Copyright 2022 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\")"
  },
  {
    "path": "test_e2e.sh",
    "chars": 123668,
    "preview": "#!/bin/bash\n#\n# Copyright 2016 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "test_git.sh",
    "chars": 29030,
    "preview": "#!/bin/bash\n#\n# Copyright 2023 The Kubernetes Authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\""
  },
  {
    "path": "tools/go.mod",
    "chars": 2887,
    "preview": "module k8s.io/git-sync/tools\n\ngo 1.23.0\n\ntoolchain go1.24.1\n\nrequire (\n\tgithub.com/estesp/manifest-tool/v2 v2.2.0\n\tgithu"
  },
  {
    "path": "tools/go.sum",
    "chars": 27627,
    "preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
  },
  {
    "path": "tools/tools.go",
    "chars": 1015,
    "preview": "//go:build tools\n// +build tools\n\n/*\nCopyright 2021 The Kubernetes Authors.\n\nLicensed under the Apache License, Version "
  },
  {
    "path": "v3-to-v4.md",
    "chars": 8206,
    "preview": "# Converting from git-sync v3.x to v4.x\n\nGit-sync v4 is a significant change from v3.  It includes several flag changes\n"
  },
  {
    "path": "vendor/github.com/beorn7/perks/LICENSE",
    "chars": 1058,
    "preview": "Copyright (C) 2013 Blake Mizerany\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this "
  },
  {
    "path": "vendor/github.com/beorn7/perks/quantile/exampledata.txt",
    "chars": 5339,
    "preview": "8\n5\n26\n12\n5\n235\n13\n6\n28\n30\n3\n3\n3\n3\n5\n2\n33\n7\n2\n4\n7\n12\n14\n5\n8\n3\n10\n4\n5\n3\n6\n6\n209\n20\n3\n10\n14\n3\n4\n6\n8\n5\n11\n7\n3\n2\n3\n3\n212\n5\n2"
  },
  {
    "path": "vendor/github.com/beorn7/perks/quantile/stream.go",
    "chars": 7956,
    "preview": "// Package quantile computes approximate quantiles over an unbounded data\n// stream within low memory and CPU bounds.\n//"
  },
  {
    "path": "vendor/github.com/cespare/xxhash/v2/LICENSE.txt",
    "chars": 1068,
    "preview": "Copyright (c) 2016 Caleb Spare\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining\na cop"
  },
  {
    "path": "vendor/github.com/cespare/xxhash/v2/README.md",
    "chars": 2179,
    "preview": "# xxhash\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/cespare/xxhash/v2.svg)](https://pkg.go.dev/github.com/ces"
  },
  {
    "path": "vendor/github.com/cespare/xxhash/v2/xxhash.go",
    "chars": 5411,
    "preview": "// Package xxhash implements the 64-bit variant of xxHash (XXH64) as described\n// at http://cyan4973.github.io/xxHash/.\n"
  },
  {
    "path": "vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go",
    "chars": 220,
    "preview": "// +build !appengine\n// +build gc\n// +build !purego\n\npackage xxhash\n\n// Sum64 computes the 64-bit xxHash digest of b.\n//"
  },
  {
    "path": "vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s",
    "chars": 3554,
    "preview": "// +build !appengine\n// +build gc\n// +build !purego\n\n#include \"textflag.h\"\n\n// Register allocation:\n// AX\th\n// SI\tpointe"
  },
  {
    "path": "vendor/github.com/cespare/xxhash/v2/xxhash_other.go",
    "chars": 1555,
    "preview": "// +build !amd64 appengine !gc purego\n\npackage xxhash\n\n// Sum64 computes the 64-bit xxHash digest of b.\nfunc Sum64(b []b"
  },
  {
    "path": "vendor/github.com/cespare/xxhash/v2/xxhash_safe.go",
    "chars": 392,
    "preview": "// +build appengine\n\n// This file contains the safe implementations of otherwise unsafe-using code.\n\npackage xxhash\n\n// "
  },
  {
    "path": "vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go",
    "chars": 2060,
    "preview": "// +build !appengine\n\n// This file encapsulates usage of unsafe.\n// xxhash_safe.go contains the safe implementations.\n\np"
  },
  {
    "path": "vendor/github.com/go-logr/logr/.golangci.yaml",
    "chars": 425,
    "preview": "run:\n  timeout: 1m\n  tests: true\n\nlinters:\n  disable-all: true\n  enable:\n    - asciicheck\n    - deadcode\n    - errcheck\n"
  },
  {
    "path": "vendor/github.com/go-logr/logr/CHANGELOG.md",
    "chars": 140,
    "preview": "# CHANGELOG\n\n## v1.0.0-rc1\n\nThis is the first logged release.  Major changes (including breaking changes)\nhave occurred "
  },
  {
    "path": "vendor/github.com/go-logr/logr/CONTRIBUTING.md",
    "chars": 579,
    "preview": "# Contributing\n\nLogr is open to pull-requests, provided they fit within the intended scope of\nthe project.  Specifically"
  },
  {
    "path": "vendor/github.com/go-logr/logr/LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "vendor/github.com/go-logr/logr/README.md",
    "chars": 12280,
    "preview": "# A minimal logging API for Go\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/go-logr/logr.svg)](https://pkg.go.d"
  },
  {
    "path": "vendor/github.com/go-logr/logr/discard.go",
    "chars": 1424,
    "preview": "/*\nCopyright 2020 The logr Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use thi"
  },
  {
    "path": "vendor/github.com/go-logr/logr/funcr/funcr.go",
    "chars": 23782,
    "preview": "/*\nCopyright 2021 The logr Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use thi"
  },
  {
    "path": "vendor/github.com/go-logr/logr/logr.go",
    "chars": 20632,
    "preview": "/*\nCopyright 2019 The logr Authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use thi"
  },
  {
    "path": "vendor/github.com/golang/protobuf/AUTHORS",
    "chars": 173,
    "preview": "# This source code refers to The Go Authors for copyright purposes.\n# The master list of authors is in the main Go distr"
  },
  {
    "path": "vendor/github.com/golang/protobuf/CONTRIBUTORS",
    "chars": 170,
    "preview": "# This source code was written by the Go contributors.\n# The master list of contributors is in the main Go distribution,"
  },
  {
    "path": "vendor/github.com/golang/protobuf/LICENSE",
    "chars": 1480,
    "preview": "Copyright 2010 The Go Authors.  All rights reserved.\n\nRedistribution and use in source and binary forms, with or without"
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/buffer.go",
    "chars": 9791,
    "preview": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/defaults.go",
    "chars": 1637,
    "preview": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/deprecated.go",
    "chars": 3188,
    "preview": "// Copyright 2018 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/discard.go",
    "chars": 1618,
    "preview": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/extensions.go",
    "chars": 10945,
    "preview": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/properties.go",
    "chars": 9108,
    "preview": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/proto.go",
    "chars": 6004,
    "preview": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/registry.go",
    "chars": 10502,
    "preview": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/text_decode.go",
    "chars": 20106,
    "preview": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/text_encode.go",
    "chars": 13043,
    "preview": "// Copyright 2010 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/wire.go",
    "chars": 1905,
    "preview": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/proto/wrappers.go",
    "chars": 1238,
    "preview": "// Copyright 2019 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license "
  },
  {
    "path": "vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go",
    "chars": 3166,
    "preview": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// source: github.com/golang/protobuf/ptypes/timestamp/timestamp.proto\n"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/.gitignore",
    "chars": 22,
    "preview": ".DS_Store\nbin\n.idea/\n\n"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/LICENSE",
    "chars": 1100,
    "preview": "Copyright (c) 2012 Dave Grijalva\nCopyright (c) 2021 golang-jwt maintainers\n\nPermission is hereby granted, free of charge"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/MIGRATION_GUIDE.md",
    "chars": 865,
    "preview": "## Migration Guide (v4.0.0)\n\nStarting from [v4.0.0](https://github.com/golang-jwt/jwt/releases/tag/v4.0.0), the import p"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/README.md",
    "chars": 11221,
    "preview": "# jwt-go\n\n[![build](https://github.com/golang-jwt/jwt/actions/workflows/build.yml/badge.svg)](https://github.com/golang-"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/SECURITY.md",
    "chars": 875,
    "preview": "# Security Policy\n\n## Supported Versions\n\nAs of February 2022 (and until this document is updated), the latest version `"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/VERSION_HISTORY.md",
    "chars": 7805,
    "preview": "## `jwt-go` Version History\n\n#### 4.0.0\n\n* Introduces support for Go modules. The `v4` version will be backwards compati"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/claims.go",
    "chars": 8630,
    "preview": "package jwt\n\nimport (\n\t\"crypto/subtle\"\n\t\"fmt\"\n\t\"time\"\n)\n\n// Claims must just have a Valid method that determines\n// if t"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/doc.go",
    "chars": 166,
    "preview": "// Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html\n/"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/ecdsa.go",
    "chars": 3516,
    "preview": "package jwt\n\nimport (\n\t\"crypto\"\n\t\"crypto/ecdsa\"\n\t\"crypto/rand\"\n\t\"errors\"\n\t\"math/big\"\n)\n\nvar (\n\t// Sadly this is missing "
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/ecdsa_utils.go",
    "chars": 1596,
    "preview": "package jwt\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"errors\"\n)\n\nvar (\n\tErrNotECPublicKey  = errors.New"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/ed25519.go",
    "chars": 2129,
    "preview": "package jwt\n\nimport (\n\t\"errors\"\n\n\t\"crypto\"\n\t\"crypto/ed25519\"\n\t\"crypto/rand\"\n)\n\nvar (\n\tErrEd25519Verification = errors.Ne"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/ed25519_utils.go",
    "chars": 1414,
    "preview": "package jwt\n\nimport (\n\t\"crypto\"\n\t\"crypto/ed25519\"\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"errors\"\n)\n\nvar (\n\tErrNotEdPrivateKey "
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/errors.go",
    "chars": 4044,
    "preview": "package jwt\n\nimport (\n\t\"errors\"\n)\n\n// Error constants\nvar (\n\tErrInvalidKey      = errors.New(\"key is invalid\")\n\tErrInval"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/hmac.go",
    "chars": 2460,
    "preview": "package jwt\n\nimport (\n\t\"crypto\"\n\t\"crypto/hmac\"\n\t\"errors\"\n)\n\n// SigningMethodHMAC implements the HMAC-SHA family of signi"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/map_claims.go",
    "chars": 3673,
    "preview": "package jwt\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"time\"\n\t// \"fmt\"\n)\n\n// MapClaims is a claims type that uses the map[st"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/none.go",
    "chars": 1677,
    "preview": "package jwt\n\n// SigningMethodNone implements the none signing method.  This is required by the spec\n// but you probably "
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/parser.go",
    "chars": 6973,
    "preview": "package jwt\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n)\n\nconst tokenDelimiter = \".\"\n\ntype Parser struct {\n\t/"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/parser_option.go",
    "chars": 1198,
    "preview": "package jwt\n\n// ParserOption is used to implement functional-style options that modify the behavior of the parser. To ad"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/rsa.go",
    "chars": 2459,
    "preview": "package jwt\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n)\n\n// SigningMethodRSA implements the RSA family of signing"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/rsa_pss.go",
    "chars": 3495,
    "preview": "//go:build go1.4\n// +build go1.4\n\npackage jwt\n\nimport (\n\t\"crypto\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n)\n\n// SigningMethodRSAPSS"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/rsa_utils.go",
    "chars": 2843,
    "preview": "package jwt\n\nimport (\n\t\"crypto/rsa\"\n\t\"crypto/x509\"\n\t\"encoding/pem\"\n\t\"errors\"\n)\n\nvar (\n\tErrKeyMustBePEMEncoded = errors.N"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/signing_method.go",
    "chars": 1398,
    "preview": "package jwt\n\nimport (\n\t\"sync\"\n)\n\nvar signingMethods = map[string]func() SigningMethod{}\nvar signingMethodLock = new(sync"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/staticcheck.conf",
    "chars": 61,
    "preview": "checks = [\"all\", \"-ST1000\", \"-ST1003\", \"-ST1016\", \"-ST1023\"]\n"
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/token.go",
    "chars": 5888,
    "preview": "package jwt\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"strings\"\n\t\"time\"\n)\n\n// DecodePaddingAllowed will switch the "
  },
  {
    "path": "vendor/github.com/golang-jwt/jwt/v4/types.go",
    "chars": 4962,
    "preview": "package jwt\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"math\"\n\t\"reflect\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// TimePrecision sets the precisi"
  },
  {
    "path": "vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE",
    "chars": 52,
    "preview": "Copyright 2012 Matt T. Proud (matt.proud@gmail.com)\n"
  },
  {
    "path": "vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore",
    "chars": 10,
    "preview": "cover.dat\n"
  },
  {
    "path": "vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile",
    "chars": 108,
    "preview": "all:\n\ncover:\n\tgo test -cover -v -coverprofile=cover.dat ./...\n\tgo tool cover -func cover.dat\n\n.PHONY: cover\n"
  },
  {
    "path": "vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go",
    "chars": 2836,
    "preview": "// Copyright 2013 Matt T. Proud\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
  },
  {
    "path": "vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go",
    "chars": 684,
    "preview": "// Copyright 2013 Matt T. Proud\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
  },
  {
    "path": "vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go",
    "chars": 1510,
    "preview": "// Copyright 2013 Matt T. Proud\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/NOTICE",
    "chars": 841,
    "preview": "Prometheus instrumentation library for Go applications\nCopyright 2012-2015 The Prometheus Authors\n\nThis product includes"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/.gitignore",
    "chars": 28,
    "preview": "command-line-arguments.test\n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/README.md",
    "chars": 167,
    "preview": "See [![Go Reference](https://pkg.go.dev/badge/github.com/prometheus/client_golang/prometheus.svg)](https://pkg.go.dev/gi"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/build_info_collector.go",
    "chars": 1270,
    "preview": "// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/collector.go",
    "chars": 5511,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/counter.go",
    "chars": 11725,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/desc.go",
    "chars": 6835,
    "preview": "// Copyright 2016 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/doc.go",
    "chars": 10119,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go",
    "chars": 2263,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/fnv.go",
    "chars": 1197,
    "preview": "// Copyright 2018 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/gauge.go",
    "chars": 10033,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/get_pid.go",
    "chars": 780,
    "preview": "// Copyright 2015 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/get_pid_gopherjs.go",
    "chars": 745,
    "preview": "// Copyright 2015 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/go_collector.go",
    "chars": 8575,
    "preview": "// Copyright 2018 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/go_collector_go116.go",
    "chars": 3677,
    "preview": "// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/go_collector_latest.go",
    "chars": 18975,
    "preview": "// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/histogram.go",
    "chars": 62548,
    "preview": "// Copyright 2015 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/internal/almost_equal.go",
    "chars": 2237,
    "preview": "// Copyright (c) 2015 Björn Rabenstein\n//\n// Permission is hereby granted, free of charge, to any person obtaining a cop"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/internal/difflib.go",
    "chars": 19836,
    "preview": "// Copyright 2022 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/internal/go_collector_options.go",
    "chars": 1165,
    "preview": "// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/internal/go_runtime_metrics.go",
    "chars": 4855,
    "preview": "// Copyright 2021 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go",
    "chars": 3065,
    "preview": "// Copyright 2018 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/labels.go",
    "chars": 2567,
    "preview": "// Copyright 2018 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/metric.go",
    "chars": 9236,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/num_threads.go",
    "chars": 838,
    "preview": "// Copyright 2018 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/num_threads_gopherjs.go",
    "chars": 769,
    "preview": "// Copyright 2018 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/observer.go",
    "chars": 2583,
    "preview": "// Copyright 2017 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/process_collector.go",
    "chars": 4682,
    "preview": "// Copyright 2015 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/process_collector_js.go",
    "chars": 788,
    "preview": "// Copyright 2019 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go",
    "chars": 1926,
    "preview": "// Copyright 2019 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go",
    "chars": 3464,
    "preview": "// Copyright 2019 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go",
    "chars": 11696,
    "preview": "// Copyright 2017 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go",
    "chars": 15313,
    "preview": "// Copyright 2016 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go",
    "chars": 8919,
    "preview": "// Copyright 2017 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go",
    "chars": 17791,
    "preview": "// Copyright 2017 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/promhttp/option.go",
    "chars": 2013,
    "preview": "// Copyright 2022 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/registry.go",
    "chars": 36081,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/summary.go",
    "chars": 24744,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/timer.go",
    "chars": 1745,
    "preview": "// Copyright 2016 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/untyped.go",
    "chars": 1628,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/value.go",
    "chars": 7405,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/vec.go",
    "chars": 20496,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_golang/prometheus/wrap.go",
    "chars": 6860,
    "preview": "// Copyright 2018 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/client_model/LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "vendor/github.com/prometheus/client_model/NOTICE",
    "chars": 167,
    "preview": "Data model artifacts for Prometheus.\nCopyright 2012-2015 The Prometheus Authors\n\nThis product includes software develope"
  },
  {
    "path": "vendor/github.com/prometheus/client_model/go/metrics.pb.go",
    "chars": 31630,
    "preview": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// source: io/prometheus/client/metrics.proto\n\npackage io_prometheus_cl"
  },
  {
    "path": "vendor/github.com/prometheus/common/LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "vendor/github.com/prometheus/common/NOTICE",
    "chars": 178,
    "preview": "Common libraries shared by Prometheus Go components.\nCopyright 2015 The Prometheus Authors\n\nThis product includes softwa"
  },
  {
    "path": "vendor/github.com/prometheus/common/expfmt/decode.go",
    "chars": 11441,
    "preview": "// Copyright 2015 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/expfmt/encode.go",
    "chars": 5205,
    "preview": "// Copyright 2015 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/expfmt/expfmt.go",
    "chars": 1696,
    "preview": "// Copyright 2015 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/expfmt/fuzz.go",
    "chars": 1093,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/expfmt/openmetrics_create.go",
    "chars": 13410,
    "preview": "// Copyright 2020 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/expfmt/text_create.go",
    "chars": 11135,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/expfmt/text_parse.go",
    "chars": 25934,
    "preview": "// Copyright 2014 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt",
    "chars": 2268,
    "preview": "PACKAGE\n\npackage goautoneg\nimport \"bitbucket.org/ww/goautoneg\"\n\nHTTP Content-Type Autonegotiation.\n\nThe functions in thi"
  },
  {
    "path": "vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go",
    "chars": 4301,
    "preview": "/*\nCopyright (c) 2011, Open Knowledge Foundation Ltd.\nAll rights reserved.\n\nHTTP Content-Type Autonegotiation.\n\nThe func"
  },
  {
    "path": "vendor/github.com/prometheus/common/model/alert.go",
    "chars": 3756,
    "preview": "// Copyright 2013 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/model/fingerprinting.go",
    "chars": 2567,
    "preview": "// Copyright 2013 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/model/fnv.go",
    "chars": 1191,
    "preview": "// Copyright 2015 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  },
  {
    "path": "vendor/github.com/prometheus/common/model/labels.go",
    "chars": 6074,
    "preview": "// Copyright 2013 The Prometheus Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may n"
  }
]

// ... and 584 more files (download for full content)

About this extraction

This page contains the full source code of the kubernetes/git-sync GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 784 files (9.7 MB), approximately 2.6M tokens, and a symbol index with 91090 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!