diff --git a/Dockerfile b/Dockerfile index 4241cdf..65ef30a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,9 +15,9 @@ RUN apt-get update && \ && rm -rf /var/lib/apt/lists/* # Install Golang -RUN curl -LO https://go.dev/dl/go1.17.9.linux-amd64.tar.gz && \ - echo "9dacf782028fdfc79120576c872dee488b81257b1c48e9032d122cfdb379cca6 go1.17.9.linux-amd64.tar.gz" | sha256sum -c && \ - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.17.9.linux-amd64.tar.gz +RUN curl -LO https://golang.org/dl/go1.21.2.linux-amd64.tar.gz && \ + echo "f5414a770e5e11c6e9674d4cd4dd1f4f630e176d1828d3427ea8ca4211eee90d go1.21.2.linux-amd64.tar.gz" | sha256sum -c && \ + rm -rf /usr/local/go && tar -C /usr/local -xzf go1.21.2.linux-amd64.tar.gz ENV PATH /usr/local/go/bin:$PATH # Install DPDK @@ -52,14 +52,16 @@ RUN sudo apt-get update && \ sudo rm -rf /var/lib/apt/lists/* && \ sudo pip3 install plumbum toml supervisor-wildcards -# Require SCION NetSec binaries (contain DRKey) for SCION tests. -RUN git clone https://github.com/netsec-ethz/scion.git && cd scion && \ - go build -o ./bin/ ./go/cs/ && \ - go build -o ./bin/ ./go/posix-router/ && \ - go build -o ./bin/ ./go/dispatcher/ && \ - go build -o ./bin/ ./go/daemon/ && \ - go build -o ./bin/ ./go/scion-pki/ && \ - go build -o ./bin/ ./go/scion/ +# Require SCION binaries for SCION tests. +RUN git clone https://github.com/scionproto/scion.git && \ + cd scion && \ + git checkout v0.9.1 && \ + go build -o ./bin/ ./control/cmd/control && \ + go build -o ./bin/ ./daemon/cmd/daemon && \ + go build -o ./bin/ ./dispatcher/cmd/dispatcher && \ + go build -o ./bin/ ./router/cmd/router && \ + go build -o ./bin/ ./scion/cmd/scion && \ + go build -o ./bin/ ./scion-pki/cmd/scion-pki ENV SCION_DIR=/home/$USER/scion ENV SCION_BIN=/home/$USER/scion/bin diff --git a/docs/SCION.md b/docs/SCION.md index e003849..dbba732 100644 --- a/docs/SCION.md +++ b/docs/SCION.md @@ -13,9 +13,9 @@ https://go.dev/doc/install On x86: ``` -curl -LO https://go.dev/dl/go1.17.9.linux-amd64.tar.gz -echo "9dacf782028fdfc79120576c872dee488b81257b1c48e9032d122cfdb379cca6 go1.17.9.linux-amd64.tar.gz" | sha256sum -c -sudo tar -C /usr/local -xzf go1.17.9.linux-amd64.tar.gz +curl -LO https://golang.org/dl/go1.21.2.linux-amd64.tar.gz +echo "f5414a770e5e11c6e9674d4cd4dd1f4f630e176d1828d3427ea8ca4211eee90d go1.21.2.linux-amd64.tar.gz" | sha256sum -c +sudo tar -C /usr/local -xzf go1.21.2.linux-amd64.tar.gz ``` ``` @@ -38,25 +38,21 @@ Don't forget to remove the PATH entry in `~/.profile`. ### Install SCION (Modules) -Besides the official SCION repository, there also exists the experimental fork from the Network Security Group at ETH Zurich: -https://github.com/netsec-ethz/scion - -Currently, only the experimental fork supports DRKey. -Therefore, LightningFilter requires that version. - To obtain the source, clone the repository: ``` -git clone https://github.com/netsec-ethz/scion.git +git clone https://github.com/scionproto/scion.git +cd scion +git checkout v0.9.1 ``` Modules can be installed with `go build`. -E.g., the `testnet_scion` setup requires the control service (cs), border router (posix-router), dispatcher (dispatcher), daemon (daemon), the PKI (scion-pki), and SCION tools like ping (scion): +E.g., the `testnet_scion` setup requires the control service (control), border router (router), dispatcher (dispatcher), daemon (daemon), the PKI (scion-pki), and SCION tools like ping (scion): ``` -go build -o ./bin/ ./go/cs/ -go build -o ./bin/ ./go/posix-router/ -go build -o ./bin/ ./go/dispatcher/ -go build -o ./bin/ ./go/daemon/ -go build -o ./bin/ ./go/scion-pki/ -go build -o ./bin/ ./go/scion/ +go build -o ./bin/ ./control/cmd/control +go build -o ./bin/ ./daemon/cmd/daemon +go build -o ./bin/ ./dispatcher/cmd/dispatcher +go build -o ./bin/ ./router/cmd/router +go build -o ./bin/ ./scion/cmd/scion +go build -o ./bin/ ./scion-pki/cmd/scion-pki ``` diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ec112ea..7c4cd7e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -48,7 +48,7 @@ include(plugins/CMakePlugins.cmake) # Add all source files target_sources(${EXEC} PRIVATE params.c setup.c duplicate_filter.c config.c configmanager.c) -target_sources(${EXEC} PRIVATE keymanager.c ratelimiter.c statistics.c version.c) +target_sources(${EXEC} PRIVATE keyfetcher.c keymanager.c ratelimiter.c statistics.c version.c) target_sources(${EXEC} PRIVATE worker.c worker_check.c) target_sources(${EXEC} PRIVATE lib/crypto/crypto.c lib/hash/murmurhash.c lib/ipc/ipc.c) target_sources(${EXEC} PRIVATE lib/mirror/mirror.c) diff --git a/src/config.c b/src/config.c index af573e4..0696df7 100644 --- a/src/config.c +++ b/src/config.c @@ -45,6 +45,10 @@ #define FIELD_DRKEY_PROTOCOL "drkey_protocol" #define FIELD_DRKEY_SERVICE_ADDR "drkey_service_addr" +#define FIELD_SHARED_SECRETS "shared_secrets" +#define FIELD_NOT_BEFORE "not_before" +#define FIELD_SECRET_VALUE "sv" + #define FIELD_DST_RATELIMITER "dst_ratelimiter" #define FIELD_WG_RATELIMITER "wg_ratelimiter" @@ -54,6 +58,9 @@ /* potential value for the ether field of a packet modifier */ #define VALUE_ETHER_SRC_ADDR "src_addr" +/* 16 byte buffer with zero value. */ +static const uint8_t zero_secret_value[16] = { 0 }; + /** * Ratelimit struct with the rate set to 0. * @@ -87,6 +94,9 @@ peer_init(struct lf_config_peer *config_peer) .isd_as = 1, .next = NULL, + .shared_secrets_configured_option = false, + .shared_secrets = { 0 }, + /* per default no rate limit is defined for a peer */ .ratelimit_option = false, .ratelimit = zero_ratelimit, @@ -176,6 +186,120 @@ parse_ratelimit(json_value *json_val, struct lf_config_ratelimit *ratelimit) return 0; } +/** + * The shared_secret struct consists of a key and a timestamp. + * This should be used for preconfigured keys. + * + * @return Returns 0 on success. + */ +static int +parse_shared_secret(json_value *json_val, + struct lf_config_shared_secret *shared_secret) +{ + int res, error_count = 0; + unsigned int length; + unsigned int i; + char *field_name; + json_value *field_value; + bool sv_flag = false, ts_flag = false; + + /* Initialize drkey struct. Set all to 0. */ + (void)memset(shared_secret, 0, sizeof *shared_secret); + + if (json_val == NULL) { + return -1; + } + + if (json_val->type != json_object) { + return -1; + } + + length = json_val->u.object.length; + + for (i = 0; i < length; ++i) { + field_name = json_val->u.object.values[i].name; + field_value = json_val->u.object.values[i].value; + + if (strcmp(field_name, FIELD_SECRET_VALUE) == 0) { + res = lf_json_parse_byte_buffer(field_value, LF_CRYPTO_DRKEY_SIZE, + shared_secret->sv); + if (res != 0) { + LF_LOG(ERR, "Invalid shared secret (%d:%d)\n", + field_value->line, field_value->col); + error_count++; + } + if (memcmp(shared_secret->sv, zero_secret_value, + sizeof shared_secret->sv) == 0) { + LF_LOG(ERR, + "Invalid shared secret. " + "Secret value can not be the all zero secret value.\n"); + return -1; + } + sv_flag = true; + } else if (strcmp(field_name, FIELD_NOT_BEFORE) == 0) { + res = lf_json_parse_timestamp(field_value, + &shared_secret->not_before); + if (res != 0) { + LF_LOG(ERR, "Invalid timestamp (%d:%d)\n", field_value->line, + field_value->col); + error_count++; + } + ts_flag = true; + } else { + LF_LOG(ERR, "Unknown field %s (%d:%d)\n", field_name, + field_value->line, field_value->col); + error_count++; + } + } + + if (error_count > 0) { + return -1; + } + + if (!sv_flag || !ts_flag) { + LF_LOG(ERR, "Invalid shared secret configuration. Need to define both " + "secret value " + "and not before timestamp.\n"); + return -1; + } + + return 0; +} + +static int +parse_shared_secret_list(json_value *json_val, + struct lf_config_shared_secret shared_secret[LF_CONFIG_SV_MAX]) +{ + unsigned int length; + unsigned int i; + unsigned int res; + + if (json_val == NULL) { + return -1; + } + + if (json_val->type != json_array) { + return -1; + } + + length = json_val->u.array.length; + if (length > LF_CONFIG_SV_MAX) { + LF_LOG(ERR, "Exceed shared secret limit (%d:%d)\n", json_val->line, + json_val->col); + return -1; + } + + for (i = 0; i < length; ++i) { + res = parse_shared_secret(json_val->u.array.values[i], + &shared_secret[i]); + if (res != 0) { + return -1; + } + } + + return length; +} + static int parse_peer(json_value *json_val, struct lf_config_peer *peer) { @@ -231,6 +355,16 @@ parse_peer(json_value *json_val, struct lf_config_peer *peer) error_count++; } peer->ratelimit_option = true; + } else if (strcmp(field_name, FIELD_SHARED_SECRETS) == 0) { + res = parse_shared_secret_list(field_value, peer->shared_secrets); + if (res >= 0) { + peer->shared_secrets_configured_option = true; + } + if (res < 0) { + LF_LOG(ERR, "Invalid shared secret (%d:%d)\n", + field_value->line, field_value->col); + error_count++; + } } else { LF_LOG(ERR, "Unknown field %s (%d:%d)\n", field_name, field_value->line, field_value->col); diff --git a/src/config.h b/src/config.h index f841d62..8af9ada 100644 --- a/src/config.h +++ b/src/config.h @@ -9,6 +9,8 @@ #include #include +#include "lib/crypto/crypto.h" + /** * This module defines the config structure and offers functionality to parse a * JSON configuration file, check its format, and return a C struct representing @@ -18,6 +20,11 @@ #define LF_CONFIG_PEERS_MAX 1000000 /* 1'000'000 */ +/* + * Maximum number of SV that can be configured per peer + */ +#define LF_CONFIG_SV_MAX 5 + /* * Rate limits are always defined for bytes and packets. */ @@ -28,6 +35,11 @@ struct lf_config_ratelimit { uint64_t packet_burst; }; +struct lf_config_shared_secret { + uint8_t sv[LF_CRYPTO_DRKEY_SIZE]; + uint64_t not_before; +}; + struct lf_config_peer { /* peer identifier */ uint64_t isd_as; /* in network byte order */ @@ -37,6 +49,10 @@ struct lf_config_peer { bool ratelimit_option; /* if a rate limit is defined */ struct lf_config_ratelimit ratelimit; + /* preconfigured shared keys */ + bool shared_secrets_configured_option; /* if shared secrets are defined*/ + struct lf_config_shared_secret shared_secrets[LF_CONFIG_SV_MAX]; + /* LF-IP: ip -> isd_as map (TODO: move this to a separate map) */ uint32_t ip; /* in network byte order */ diff --git a/src/drkey.h b/src/drkey.h new file mode 100644 index 0000000..ce943fd --- /dev/null +++ b/src/drkey.h @@ -0,0 +1,161 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 ETH Zurich + */ + +#ifndef LF_DRKEY_H +#define LF_DRKEY_H + +#include +#include + +#include "lf.h" +#include "lib/crypto/crypto.h" +#include "lib/time/time.h" + +/* + * A DRKey is valid during a certain epoch defined by a starting and ending + * point in time. During the transition between an old key and a new key, both + * keys are valid. This transition period is defined by the + * LF_DRKEY_GRACE_PERIOD, which extends the ending point of the old key by a + * certain amount of time. + */ +#define LF_DRKEY_GRACE_PERIOD (2 * LF_TIME_NS_IN_S) /* in nanoseconds */ +#define LF_DRKEY_PREFETCHING_PERIOD (1 * LF_TIME_NS_IN_S) /* in nanoseconds */ + +/* + * DRKey derivation types. + */ +#define LF_DRKEY_DERIVATION_TYPE_AS_AS 0 +#define LF_DRKEY_DERIVATION_TYPE_AS_HOST 1 +#define LF_DRKEY_DERIVATION_TYPE_HOST_AS 2 +#define LF_DRKEY_DERIVATION_TYPE_HOST_HOST 3 + +/* + * DRKey validity period used for shared, configured keys. + */ +#define LF_DRKEY_VALIDITY_PERIOD_NS \ + (3 * 24 * 3600 * LF_TIME_NS_IN_S) /* in nanoseconds */ + +/* + * IPv6 prefix for embedded IPv4 address + */ +static const uint8_t IPV4_MAPPED_IPV6_PREFIX[12] = { 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF }; + +/** + * The key container wraps all information required to use a key. + * A DRKeys validity is usually defined in seconds. Because the workers operate + * with nanosecond timestamps, the validity timestamps are also stored in + * nanoseconds to avoid any conversion. + */ +struct lf_keymanager_key_container { + uint64_t validity_not_before; /* Unix timestamp (nanoseconds) */ + uint64_t validity_not_after; /* Unix timestamp (nanoseconds) */ + struct lf_crypto_drkey key; +}; + +/** + * Derive HOST-AS DRKey from AS-AS DRKey. + * + * @param drkey_ctx DRKey cipher context. + * @param drkey_as_as AS-AS DRKey. + * @param fast_side_host Fast side host address. + * @param drkey_protocol (network byte order). + * @param drkey_ha Returning HOST-AS DRKey. + */ +static inline void +lf_drkey_derive_host_as_from_as_as(struct lf_crypto_drkey_ctx *drkey_ctx, + const struct lf_crypto_drkey *drkey_as_as, + const struct lf_host_addr *fast_side_host, + const uint16_t drkey_protocol, struct lf_crypto_drkey *drkey_ha) +{ + assert(LF_HOST_ADDR_LENGTH(fast_side_host) <= LF_CRYPTO_CBC_BLOCK_SIZE); + + uint8_t addr_type_len = (uint8_t)(fast_side_host->type_length); + uint8_t *addr = (uint8_t *)(fast_side_host->addr); + uint8_t addr_len = LF_HOST_ADDR_LENGTH(fast_side_host); + + // IPv4 mapped to IPv6 + if (addr_type_len == 3 && memcmp(addr, IPV4_MAPPED_IPV6_PREFIX, + sizeof IPV4_MAPPED_IPV6_PREFIX) == 0) { + addr += 12; + addr_len = 4; + addr_type_len = 0; + } + + int buf_len = (addr_len == 4) ? LF_CRYPTO_CBC_BLOCK_SIZE + : 2 * LF_CRYPTO_CBC_BLOCK_SIZE; + uint8_t buf[2 * LF_CRYPTO_CBC_BLOCK_SIZE] = { 0 }; + buf[0] = LF_DRKEY_DERIVATION_TYPE_HOST_AS; + memcpy(buf + 1, &drkey_protocol, 2); + buf[3] = addr_type_len; + memcpy(buf + 4, addr, addr_len); + + lf_crypto_drkey_derivation_step(drkey_ctx, drkey_as_as, buf, buf_len, + drkey_ha); +} + +/** + * Derive HOST-HOST DRKey from HOST-AS DRKey. + * + * @param drkey_ctx DRKey cipher context. + * @param drkey_host_as HOST-AS DRKey. + * @param slow_side_host Slow side host address. + * @param drkey_hh Returning HOST-HOST DRKey. + */ +static inline void +lf_drkey_derive_host_host_from_host_as(struct lf_crypto_drkey_ctx *drkey_ctx, + const struct lf_crypto_drkey *drkey_host_as, + const struct lf_host_addr *slow_side_host, + struct lf_crypto_drkey *drkey_hh) +{ + assert(LF_HOST_ADDR_LENGTH(slow_side_host) <= LF_CRYPTO_CBC_BLOCK_SIZE); + + uint8_t addr_type_len = (uint8_t)(slow_side_host->type_length); + uint8_t *addr = (uint8_t *)(slow_side_host->addr); + uint8_t addr_len = LF_HOST_ADDR_LENGTH(slow_side_host); + + // IPv4 mapped to IPv6 + if (addr_type_len == 3 && memcmp(addr, IPV4_MAPPED_IPV6_PREFIX, + sizeof IPV4_MAPPED_IPV6_PREFIX) == 0) { + addr += 12; + addr_len = 4; + addr_type_len = 0; + } + + int buf_len = (addr_len == 4) ? LF_CRYPTO_CBC_BLOCK_SIZE + : 2 * LF_CRYPTO_CBC_BLOCK_SIZE; + uint8_t buf[2 * LF_CRYPTO_CBC_BLOCK_SIZE] = { 0 }; + buf[0] = LF_DRKEY_DERIVATION_TYPE_HOST_HOST; + buf[1] = addr_type_len; + memcpy(buf + 2, addr, addr_len); + + lf_crypto_drkey_derivation_step(drkey_ctx, drkey_host_as, buf, buf_len, + drkey_hh); +} + +/** + * Derive HOST-HOST DRKey from AS-AS DRKey. + * + * @param drkey_ctx DRKey cipher context. + * @param drkey_as_as AS-AS DRKey. + * @param fast_side_host Fast side host address. + * @param slow_side_host Slow side host address. + * @param drkey_protocol (network byte order). + * @param drkey_hh Returning HOST-HOST DRKey. + */ +static inline void +lf_drkey_derive_host_host_from_as_as(struct lf_crypto_drkey_ctx *drkey_ctx, + const struct lf_crypto_drkey *drkey_as_as, + const struct lf_host_addr *fast_side_host, + const struct lf_host_addr *slow_side_host, + const uint16_t drkey_protocol, struct lf_crypto_drkey *drkey_hh) +{ + struct lf_crypto_drkey drkey_ha; + lf_drkey_derive_host_as_from_as_as(drkey_ctx, drkey_as_as, fast_side_host, + drkey_protocol, &drkey_ha); + lf_drkey_derive_host_host_from_host_as(drkey_ctx, &drkey_ha, slow_side_host, + drkey_hh); +} + +#endif // LF_DRKEY_H \ No newline at end of file diff --git a/src/drkey_fetcher.h b/src/drkey_fetcher.h index 2660913..307c40c 100644 --- a/src/drkey_fetcher.h +++ b/src/drkey_fetcher.h @@ -14,12 +14,16 @@ * long as it implements this interface. */ +// TODO (abojarski) use correct types for src_addr and dst_addr to accommodate +// enough space for IPV6 addresses. + /** - * Fetch a AS to AS (level 1) DRKey from a DRKey service. + * Fetch a host-AS (level 2) DRKey from a DRKey service. * * @param drkey_service_addr Service address ("IP:Port") * @param src_ia DRKey slow side (CPU endian) * @param dst_ia DRKey fast side (CPU endian) + * @param src_addr DRKey slow side (CPU endian) * @param drkey_protocol DRKey protocol (CPU endian) * @param val_time_ms Time at which the requested key should be valid * (millisecond UNIX timestamp) @@ -30,8 +34,33 @@ * @return 0 on success. */ int -lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, - uint64_t dst_ia, uint16_t drkey_protocol, int64_t val_time_ms, +lf_drkey_fetcher_host_as_key(const char drkey_service_addr[48], uint64_t src_ia, + uint64_t dst_ia, uint64_t src_addr, uint16_t drkey_protocol, + int64_t val_time_ms, int64_t *validity_not_before, + int64_t *validity_not_after, void *key); + +/** + * Fetch a host-host (level 3) DRKey from a DRKey service. + * + * @param drkey_service_addr Service address ("IP:Port") + * @param src_ia DRKey slow side (CPU endian) + * @param dst_ia DRKey fast side (CPU endian) + * @param src_addr DRKey slow side (CPU endian) + * @param dst_addr DRKey fast side (CPU endian) + * @param drkey_protocol DRKey protocol (CPU endian) + * @param val_time_ms Time at which the requested key should be valid + * (millisecond UNIX timestamp) + * @param validity_not_before Return DRKey epoch start (millisecond UNIX + * timestamp) + * @param validity_not_after Return DRKey epoch end (millisecond UNIX + * timestamp) + * @param key Return requested DRKey as byte array of size 16. + * @return 0 on success. + */ +int +lf_drkey_fetcher_host_host_key(const char drkey_service_addr[48], + uint64_t src_ia, uint64_t dst_ia, uint64_t src_addr, uint64_t dst_addr, + uint16_t drkey_protocol, int64_t val_time_ms, int64_t *validity_not_before, int64_t *validity_not_after, void *key); diff --git a/src/drkey_fetcher_scion.c b/src/drkey_fetcher_scion.c index 1a284a8..10bf947 100644 --- a/src/drkey_fetcher_scion.c +++ b/src/drkey_fetcher_scion.c @@ -8,9 +8,10 @@ #include "lib/scion_drkey/drkey.h" int -lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, - uint64_t dst_ia, uint16_t drkey_protocol, int64_t val_time_ms, - int64_t *validity_not_before, int64_t *validity_not_after, void *key) +lf_drkey_fetcher_host_as_key(const char drkey_service_addr[48], uint64_t src_ia, + uint64_t dst_ia, uint64_t src_addr, uint16_t drkey_protocol, + int64_t val_time_ms, int64_t *validity_not_before, + int64_t *validity_not_after, void *key) { /* * Cast the const char* drkey_service_addr to a non-constant char*! @@ -28,7 +29,34 @@ lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, #pragma GCC diagnostic pop #endif - return (int)GetASASKey(non_const_addr, src_ia, dst_ia, drkey_protocol, - val_time_ms, (GoInt64 *)validity_not_before, + return (int)GetHostASKey(non_const_addr, src_ia, dst_ia, src_addr, + drkey_protocol, val_time_ms, (GoInt64 *)validity_not_before, (GoInt64 *)validity_not_after, key); +} + +int +lf_drkey_fetcher_host_host_key(const char drkey_service_addr[48], + uint64_t src_ia, uint64_t dst_ia, uint64_t src_addr, uint64_t dst_addr, + uint16_t drkey_protocol, int64_t val_time_ms, + int64_t *validity_not_before, int64_t *validity_not_after, void *key) +{ +/* + * Cast the const char* drkey_service_addr to a non-constant char*! + * This is done because Cgo does not know the principle of const variable. + * However, the GetASASKey function does not change the address string, + * therefore, this cast is legal (and disabling the compiler warnings is + * acceptable)! + */ +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + char *non_const_addr = (char *)drkey_service_addr; +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + + return (int)GetHostHostKey(non_const_addr, src_ia, dst_ia, src_addr, + dst_addr, drkey_protocol, val_time_ms, + (GoInt64 *)validity_not_before, (GoInt64 *)validity_not_after, key); } \ No newline at end of file diff --git a/src/keyfetcher.c b/src/keyfetcher.c new file mode 100644 index 0000000..485edf8 --- /dev/null +++ b/src/keyfetcher.c @@ -0,0 +1,489 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 ETH Zurich + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "drkey_fetcher.h" +#include "keyfetcher.h" +#include "keymanager.h" +#include "lib/crypto/crypto.h" +#include "lib/log/log.h" +#include "lib/time/time.h" + +/** + * Log function for key fetcher service (not on data path). + * Format: "Keyfetcher: log message here" + */ +#define LF_KEYFETCHER_LOG(level, ...) LF_LOG(level, "Keyfetcher: " __VA_ARGS__) + +/* 16 byte buffer with zero value. */ +static const uint8_t zero_secret_value[16] = { 0 }; + +/** + * Derives a short term AS-AS key from the shared secret. + * The derivation is done using AES-CBC MAC keyed with the shared secret and the + * input: + * + * (type | ISD_AS1 | ISD_AS2 | start timestamp) + * + * "type" is the 1 byte fixed constant 0. + * "ISD_AS1" is the ISD_AS number (8 byte) in network byte order of the fast + * side AS. + * "ISD_AS2" is the ISD_AS number (8 byte) in network byte order of the slow + * side AS. + * "start timestamp" is the timestamp in ns (8 byte) of the start time of the + * validity period for the resulting key. This can be synchronized between peers + * since the initial start time is configured by both and consequent start times + * can be calculated by configured time + k * VALIDITY_PERIOD for some k such + * that the key is currently valid. + * + * @param drkey_ctx DRKey cipher context. + * @param secret_node configured shared secret values. + * @param src_ia DRKey slow side (CPU endian). + * @param dst_ia DRKey fast side (CPU endian). + * @param drkey_protocol (network byte order). + * @param ns_valid time in nanoseconds for which the key should be valid. + * @param key Returning AS-AS key. + */ +static int +lf_keyfetcher_derive_shared_key(struct lf_crypto_drkey_ctx *drkey_ctx, + struct lf_keyfetcher_sv_dictionary_data *secret_node, uint64_t src_ia, + uint64_t dst_ia, uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key) +{ + struct lf_keyfetcher_sv_container *secret = NULL; + uint64_t ms_valid; + ms_valid = ns_valid / LF_TIME_NS_IN_MS; + + // Find the correct shared secret to be used for current timestamp. + for (int i = 0; i < LF_CONFIG_SV_MAX; i++) { + if (memcmp(secret_node->secret_values[i].key.key, zero_secret_value, + sizeof secret_node->secret_values[i].key.key) == 0) { + continue; + } + if (secret_node->secret_values[i].validity_not_before <= ns_valid) { + if (secret == NULL) { + secret = &secret_node->secret_values[i]; + } else if (secret_node->secret_values[i].validity_not_before >= + secret->validity_not_before) { + secret = &secret_node->secret_values[i]; + } + } + } + if (secret == NULL) { + LF_KEYFETCHER_LOG(ERR, + "Could not find shared secret for: src_as " PRIISDAS + ", dst_as " PRIISDAS ", drkey_protocol %u, ms_valid %" PRIu64 + "\n", + PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), + PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), + rte_be_to_cpu_16(drkey_protocol), ms_valid); + return -1; + } + + uint64_t validity_not_before_ns = + secret->validity_not_before + + (int)((ns_valid - secret->validity_not_before) / + LF_DRKEY_VALIDITY_PERIOD_NS) * + LF_DRKEY_VALIDITY_PERIOD_NS; + uint64_t validity_not_before_ns_be = + rte_cpu_to_be_64(validity_not_before_ns); + uint64_t validity_not_after_ns = + validity_not_before_ns + LF_DRKEY_VALIDITY_PERIOD_NS - 1; + + uint8_t buf[2 * LF_CRYPTO_CBC_BLOCK_SIZE] = { 0 }; + buf[0] = LF_DRKEY_DERIVATION_TYPE_AS_AS; + memcpy(buf + 1, &dst_ia, 8); + memcpy(buf + 9, &src_ia, 8); + memcpy(buf + 17, &validity_not_before_ns_be, 8); + + lf_crypto_drkey_derivation_step(drkey_ctx, &secret->key, buf, sizeof buf, + &key->key); + + LF_KEYFETCHER_LOG(INFO, + "Derived shared AS AS Key: src_as " PRIISDAS ", dst_as " PRIISDAS + ", drkey_protocol %u, ms_valid %" PRIu64 + ", validity_not_before_ms %" PRIu64 + ", validity_not_after_ms %" PRIu64 "\n", + PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), + PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), + rte_be_to_cpu_16(drkey_protocol), ms_valid, + (validity_not_before_ns / LF_TIME_NS_IN_MS), + (validity_not_after_ns / LF_TIME_NS_IN_MS)); + + /* set values in returned key structure */ + key->validity_not_before = validity_not_before_ns; + key->validity_not_after = validity_not_after_ns; + + return 0; +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_fetch_as_as_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key) +{ + int key_id, res; + struct lf_keyfetcher_dictionary_key dict_key; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_node; + + // check if there is entry in cache + dict_key.as = src_ia == kf->src_ia ? dst_ia : src_ia; + dict_key.drkey_protocol = drkey_protocol; + key_id = rte_hash_lookup_data(kf->dict, &dict_key, + (void **)&shared_secret_node); + if (key_id >= 0) { + res = lf_keyfetcher_derive_shared_key(&kf->drkey_ctx, + shared_secret_node, src_ia, dst_ia, drkey_protocol, ns_valid, + key); + } else { + LF_KEYFETCHER_LOG(ERR, + "Fail to look up shared secret: src_as " PRIISDAS + ", dst_as " PRIISDAS ", drkey_protocol %u\n", + PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), + PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), + rte_be_to_cpu_16(drkey_protocol)); + res = -1; + } + return res; +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_fetch_host_as_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, const struct lf_host_addr *fast_side_host, + uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key) +{ + int key_id, res; + struct lf_keyfetcher_dictionary_key dict_key; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_node; + struct lf_keymanager_key_container as_as_key; + uint64_t ms_valid; + int64_t validity_not_before_ms, validity_not_after_ms; + uint8_t drkey_buf[LF_CRYPTO_DRKEY_SIZE]; + + // check if there is entry in cache + dict_key.as = src_ia; + dict_key.drkey_protocol = drkey_protocol; + key_id = rte_hash_lookup_data(kf->dict, &dict_key, + (void **)&shared_secret_node); + if (key_id >= 0) { + res = lf_keyfetcher_derive_shared_key(&kf->drkey_ctx, + shared_secret_node, src_ia, dst_ia, drkey_protocol, ns_valid, + &as_as_key); + if (res < 0) { + return res; + } + lf_drkey_derive_host_as_from_as_as(&kf->drkey_ctx, &as_as_key.key, + fast_side_host, drkey_protocol, &key->key); + key->validity_not_before = as_as_key.validity_not_before; + key->validity_not_after = as_as_key.validity_not_after; + } else { + // fetch from control service + ms_valid = ns_valid / LF_TIME_NS_IN_MS; + + // TODO: implement address parsing correctly. IPv6 addresses do not fit + // in uint64_t... + res = lf_drkey_fetcher_host_as_key(kf->drkey_service_addr, + rte_be_to_cpu_64(src_ia), rte_be_to_cpu_64(dst_ia), + rte_be_to_cpu_64(*(uint64_t *)(fast_side_host->addr)), + rte_be_to_cpu_16(drkey_protocol), (int64_t)ms_valid, + &validity_not_before_ms, &validity_not_after_ms, drkey_buf); + if (res < 0) { + return res; + } + key->validity_not_after = + (uint64_t)validity_not_after_ms * LF_TIME_NS_IN_MS; + key->validity_not_before = + (uint64_t)validity_not_before_ms * LF_TIME_NS_IN_MS; + lf_crypto_drkey_from_buf(&kf->drkey_ctx, drkey_buf, &key->key); + } + + return res; +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_fetch_host_host_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, const struct lf_host_addr *fast_side_host, + const struct lf_host_addr *slow_side_host, uint16_t drkey_protocol, + uint64_t ns_valid, struct lf_keymanager_key_container *key) +{ + int key_id, res; + struct lf_keyfetcher_dictionary_key dict_key; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_node; + struct lf_keymanager_key_container as_as_key; + uint64_t ms_valid; + int64_t validity_not_before_ms, validity_not_after_ms; + uint8_t drkey_buf[LF_CRYPTO_DRKEY_SIZE]; + + // check if there is entry in cache + dict_key.as = src_ia; + dict_key.drkey_protocol = drkey_protocol; + key_id = rte_hash_lookup_data(kf->dict, &dict_key, + (void **)&shared_secret_node); + if (key_id >= 0) { + res = lf_keyfetcher_derive_shared_key(&kf->drkey_ctx, + shared_secret_node, src_ia, dst_ia, drkey_protocol, ns_valid, + &as_as_key); + if (res < 0) { + return res; + } + lf_drkey_derive_host_host_from_as_as(&kf->drkey_ctx, &as_as_key.key, + fast_side_host, slow_side_host, drkey_protocol, &key->key); + key->validity_not_before = as_as_key.validity_not_before; + key->validity_not_after = as_as_key.validity_not_after; + } else { + // fetch from control service + ms_valid = ns_valid / LF_TIME_NS_IN_MS; + + // TODO: implement address parsing correctly. IPv6 addresses do not fit + // in uint64_t... + res = lf_drkey_fetcher_host_host_key(kf->drkey_service_addr, + rte_be_to_cpu_64(src_ia), rte_be_to_cpu_64(dst_ia), + rte_be_to_cpu_64(*(uint64_t *)(fast_side_host->addr)), + rte_be_to_cpu_64(*(uint64_t *)(slow_side_host->addr)), + rte_be_to_cpu_16(drkey_protocol), (int64_t)ms_valid, + &validity_not_before_ms, &validity_not_after_ms, drkey_buf); + if (res < 0) { + return res; + } + key->validity_not_after = + (uint64_t)validity_not_after_ms * LF_TIME_NS_IN_MS; + key->validity_not_before = + (uint64_t)validity_not_before_ms * LF_TIME_NS_IN_MS; + lf_crypto_drkey_from_buf(&kf->drkey_ctx, drkey_buf, &key->key); + } + + return res; +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_apply_config(struct lf_keyfetcher *kf, + const struct lf_config *config) +{ + int res, err = 0, key_id; + uint32_t iterator; + bool is_in_list; + struct lf_keyfetcher_dictionary_key key, *key_ptr; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_data; + struct lf_config_peer *peer; + + LF_KEYFETCHER_LOG(NOTICE, "Apply config!\n"); + + memcpy(kf->drkey_service_addr, config->drkey_service_addr, + sizeof kf->drkey_service_addr); + + kf->src_ia = config->isd_as; + + for (iterator = 0; rte_hash_iterate(kf->dict, (void *)&key_ptr, + (void **)&shared_secret_data, &iterator) >= 0;) { + is_in_list = false; + for (peer = config->peers; peer != NULL; peer = peer->next) { + if (peer->isd_as == key_ptr->as && + peer->drkey_protocol == key_ptr->drkey_protocol) { + is_in_list = true; + break; + } + } + if (!is_in_list) { + // Remove SV since peer is no longer configured. + LF_KEYFETCHER_LOG(DEBUG, + "Remove SV entry for AS " PRIISDAS " DRKey protocol %u\n", + PRIISDAS_VAL(rte_be_to_cpu_64(key_ptr->as)), + rte_be_to_cpu_16(key_ptr->drkey_protocol)); + rte_hash_del_key(kf->dict, key_ptr); + // can be removed here since manager lock is beeing held + rte_free(shared_secret_data); + } + } + + for (peer = config->peers; peer != NULL; peer = peer->next) { + key.as = peer->isd_as; + key.drkey_protocol = peer->drkey_protocol; + + // update secret values that were already in dict + key_id = rte_hash_lookup_data(kf->dict, &key, + (void **)&shared_secret_data); + if (key_id >= 0) { + if (peer->shared_secrets_configured_option) { + for (int i = 0; i < LF_CONFIG_SV_MAX; i++) { + shared_secret_data->secret_values[i].validity_not_before = + peer->shared_secrets[i].not_before; + lf_crypto_drkey_from_buf(&kf->drkey_ctx, + peer->shared_secrets[i].sv, + &shared_secret_data->secret_values[i].key); + } + } else { + // Peer still exists but has no longer secret values defined. + LF_KEYFETCHER_LOG(DEBUG, + "Peer has no longer SVs defined. Remove SV entry for " + "AS " PRIISDAS " DRKey protocol %u\n", + PRIISDAS_VAL(rte_be_to_cpu_64(key.as)), + rte_be_to_cpu_16(key.drkey_protocol)); + rte_hash_del_key(kf->dict, &key); + // can be removed here since manager lock is beeing held + rte_free(shared_secret_data); + } + continue; + } + + if (peer->shared_secrets_configured_option) { + // create entry of secret value for new hash table + shared_secret_data = + (struct lf_keyfetcher_sv_dictionary_data *)rte_zmalloc(NULL, + sizeof(struct lf_keyfetcher_sv_dictionary_data), 0); + if (shared_secret_data == NULL) { + LF_KEYFETCHER_LOG(ERR, "Failed to allocate memory for key\n"); + err = 1; + break; + } + + // populate secret data and add to dict + for (int i = 0; i < LF_CONFIG_SV_MAX; i++) { + shared_secret_data->secret_values[i].validity_not_before = + peer->shared_secrets[i].not_before; + lf_crypto_drkey_from_buf(&kf->drkey_ctx, + peer->shared_secrets[i].sv, + &shared_secret_data->secret_values[i].key); + } + + res = rte_hash_add_key_data(kf->dict, &key, + (void *)shared_secret_data); + if (res != 0) { + LF_KEYFETCHER_LOG(ERR, "Add key failed with %d!\n", key_id); + rte_free(shared_secret_data); + err = 1; + break; + } + } + } + if (err == 0) { + return 0; + } else { + LF_KEYFETCHER_LOG(ERR, "Failed to set config"); + return -1; + } +} + +/** + * @param size of table. Must be at least 8. + * @return struct rte_hash* + */ +static struct rte_hash * +key_dictionary_init(uint32_t size) +{ + struct rte_hash *dic; + struct rte_hash_parameters params = { 0 }; + /* rte_hash table name */ + char name[RTE_HASH_NAMESIZE]; + /* counter to ensure unique rte_hash table name */ + static int counter = 0; + + LF_KEYFETCHER_LOG(DEBUG, "Init\n"); + + /* DPDK hash table entry must be at least 8 (undocumented) */ + if (size < 8) { + LF_KEYFETCHER_LOG(ERR, + "Hash creation failed because size is smaller than 8\n"); + return NULL; + } + + (void)snprintf(name, sizeof(name), "keyfetcher_dict_%d\n", counter); + counter += 1; + + params.name = name; + /* DPDK hash table entry must be at least 8 (undocumented) */ + params.entries = size; + /* AS + drkey_protocol */ + params.key_len = sizeof(struct lf_keymanager_dictionary_key); + /* hash function */ + params.hash_func = rte_jhash; + params.hash_func_init_val = 0; + /* TODO: (fstreun) potentially use multiple hash tables for different + * sockets */ + params.socket_id = (int)rte_socket_id(); + /* ensure that insertion always succeeds */ + params.extra_flag = RTE_HASH_EXTRA_FLAGS_EXT_TABLE; + /* Lock Free Read Write */ + params.extra_flag |= RTE_HASH_EXTRA_FLAGS_RW_CONCURRENCY_LF; + + dic = rte_hash_create(¶ms); + + if (dic == NULL) { + LF_KEYFETCHER_LOG(ERR, "Hash creation failed with: %d\n", errno); + rte_hash_free(dic); + return NULL; + } + + LF_KEYFETCHER_LOG(DEBUG, "Created hash table (size = %d)\n", size); + + return dic; +} + +/** + * Free all keys stored in the dictionary and the dictionary itself. + */ +static void +lf_keyfetcher_dictionary_free(struct rte_hash *dict) +{ + uint32_t iterator; + struct lf_keyfetcher_dictionary_key *key_ptr; + struct lf_keyfetcher_sv_dictionary_data *data; + + for (iterator = 0; rte_hash_iterate(dict, (void *)&key_ptr, (void **)&data, + &iterator) >= 0;) { + rte_free(data); + } + rte_hash_free(dict); +} + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_close(struct lf_keyfetcher *kf) +{ + lf_keyfetcher_dictionary_free(kf->dict); + kf->dict = NULL; + lf_crypto_drkey_ctx_close(&kf->drkey_ctx); + return 0; +} + +int +lf_keyfetcher_init(struct lf_keyfetcher *kf, uint32_t initial_size) +{ + int res; + + /* dictionary requires a size of at least 8 (magic number) */ + // NOLINTBEGIN(readability-magic-numbers) + if (initial_size < 8) { + initial_size = 8; + } + // NOLINTEND(readability-magic-numbers) + kf->size = initial_size; + kf->dict = key_dictionary_init(initial_size); + if (kf->dict == NULL) { + return -1; + } + + memset(kf->drkey_service_addr, 0, sizeof kf->drkey_service_addr); + + res = lf_crypto_drkey_ctx_init(&kf->drkey_ctx); + if (res != 0) { + /* TODO: error handling*/ + return -1; + } + + return 0; +} diff --git a/src/keyfetcher.h b/src/keyfetcher.h new file mode 100644 index 0000000..5e66a6a --- /dev/null +++ b/src/keyfetcher.h @@ -0,0 +1,87 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright (c) 2021 ETH Zurich + */ + +#ifndef LF_KEYFETCHER_H +#define LF_KEYFETCHER_H + +#include + +#include + +#include "config.h" +#include "drkey.h" +#include "drkey_fetcher.h" +#include "lib/crypto/crypto.h" +#include "lib/log/log.h" + +/** + * The keyfetcher fetches the requested DRKeys. + * It either fetches the keys from the control service or derives them for peers + * that have shared secret values configured. The configured shared values are + * stored in the keyfetcher. + * + * The keyfetcher does not implement additional caching. + * + * The CS fetching depends on a DRKey fetcher module, which depends on the + * deployment setup. + */ + +struct lf_keyfetcher_sv_container { + uint64_t validity_not_before; /* Unix timestamp (nanoseconds) */ + struct lf_crypto_drkey key; +}; + +struct lf_keyfetcher_sv_dictionary_data { + struct lf_keyfetcher_sv_container secret_values[LF_CONFIG_SV_MAX]; +}; + +struct lf_keyfetcher_dictionary_key { + uint64_t as; /* network byte order */ + uint16_t drkey_protocol; /* network byte order */ +} __attribute__((__packed__)); + + +struct lf_keyfetcher { + /* SV dictionary */ + struct rte_hash *dict; + /* max number of entries */ + uint32_t size; + + uint64_t src_ia; + + char drkey_service_addr[48]; + + /* crypto DRKey context */ + struct lf_crypto_drkey_ctx drkey_ctx; +}; + +int +lf_keyfetcher_fetch_as_as_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key); + +int +lf_keyfetcher_fetch_host_as_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, const struct lf_host_addr *fast_side_host, + uint16_t drkey_protocol, uint64_t ns_valid, + struct lf_keymanager_key_container *key); + +int +lf_keyfetcher_fetch_host_host_key(struct lf_keyfetcher *kf, uint64_t src_ia, + uint64_t dst_ia, const struct lf_host_addr *fast_side_host, + const struct lf_host_addr *slow_side_host, uint16_t drkey_protocol, + uint64_t ns_valid, struct lf_keymanager_key_container *key); + +// should only be called when keymanager management lock is hold +int +lf_keyfetcher_apply_config(struct lf_keyfetcher *kf, + const struct lf_config *config); + +int +lf_keyfetcher_close(struct lf_keyfetcher *kf); + +int +lf_keyfetcher_init(struct lf_keyfetcher *kf, uint32_t initial_size); + +#endif /* LF_KEYFETCHER_H */ \ No newline at end of file diff --git a/src/keymanager.c b/src/keymanager.c index a6fffb0..ea167f7 100644 --- a/src/keymanager.c +++ b/src/keymanager.c @@ -15,6 +15,7 @@ #include "config.h" #include "drkey_fetcher.h" +#include "keyfetcher.h" #include "keymanager.h" #include "lib/crypto/crypto.h" #include "lib/ipc/ipc.h" @@ -73,78 +74,11 @@ synchronize_worker(struct lf_keymanager *km) (void)rte_rcu_qsbr_synchronize(km->qsv, RTE_QSBR_THRID_INVALID); } -/** - * Fetch AS-AS key (Level 1). - * Increments statistics counter accordingly; increment fetch_success on success - * and fetch_fail otherwise. - * - * @param drkey_service_addr: address of drkey service, such as the SCION - * control service, e.g., 10.248.7.1:31008 - * @param src_ia: slow side of the DRKey (network byte order) - * @param dst_ia: fast side of the DRKey (network byte order) - * @param drkey_protocol: (network byte order) - * @param ns_valid: Unix timestamp in nanoseconds, at which the requested key - * must be valid. - * @param key: pointer to key container struct to store result in. - * @return 0 on success, otherwise, < 0. - */ -static int -fetch_as_as_key(struct lf_keymanager *km, const char drkey_service_addr[48], - uint64_t src_ia, uint64_t dst_ia, uint16_t drkey_protocol, - uint64_t ns_valid, struct lf_keymanager_key_container *key) -{ - int res; - uint64_t ms_valid; - int64_t validity_not_before_ms, validity_not_after_ms; - uint8_t drkey_buf[LF_CRYPTO_DRKEY_SIZE]; - - ms_valid = ns_valid / LF_TIME_NS_IN_MS; - - assert(ms_valid <= INT64_MAX); - res = lf_drkey_fetcher_as_as_key(drkey_service_addr, - rte_be_to_cpu_64(src_ia), rte_be_to_cpu_64(dst_ia), - rte_be_to_cpu_16(drkey_protocol), (int64_t)ms_valid, - &validity_not_before_ms, &validity_not_after_ms, drkey_buf); - - if (res != 0) { - km->statistics.fetch_fail++; - - LF_KEYMANAGER_LOG(ERR, - "Fetching AS AS Key failed with %d: drkey_service_addr " - "%s, src_as" PRIISDAS ", dst_as " PRIISDAS - ", drkey_protocol %u, ms_valid %" PRIu64 "\n", - res, drkey_service_addr, PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), - PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), - rte_be_to_cpu_16(drkey_protocol), ms_valid); - return -1; - } - - km->statistics.fetch_successful++; - LF_KEYMANAGER_LOG(INFO, - "Fetched AS AS Key: drkey_service_addr " - "%s, src_as " PRIISDAS ", dst_as " PRIISDAS - ", drkey_protocol %u, ms_valid %" PRIu64 - ", validity_not_before_ms %" PRIu64 - ", validity_not_after_ms %" PRIu64 "\n", - drkey_service_addr, PRIISDAS_VAL(rte_be_to_cpu_64(src_ia)), - PRIISDAS_VAL(rte_be_to_cpu_64(dst_ia)), - rte_be_to_cpu_16(drkey_protocol), ms_valid, validity_not_before_ms, - validity_not_after_ms); - - /* set values in returned key structure */ - key->validity_not_after = - (uint64_t)validity_not_after_ms * LF_TIME_NS_IN_MS; - key->validity_not_before = - (uint64_t)validity_not_before_ms * LF_TIME_NS_IN_MS; - lf_crypto_drkey_from_buf(&km->drkey_ctx, drkey_buf, &key->key); - - return 0; -} void lf_keymanager_service_update(struct lf_keymanager *km) { - int res, key_id; + int res; int err = 0; struct lf_keymanager_dictionary_key *key_ptr; uint32_t iterator; @@ -179,11 +113,11 @@ lf_keymanager_service_update(struct lf_keymanager *km) (void)rte_memcpy(new_data, data, sizeof(struct lf_keymanager_dictionary_data)); - key_id = fetch_as_as_key(km, km->drkey_service_addr, key_ptr->as, + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, key_ptr->as, km->src_as, key_ptr->drkey_protocol, ns_now + LF_DRKEY_PREFETCHING_PERIOD, &new_data->inbound_key); - if (key_id < 0) { + if (res < 0) { rte_free(new_data); err = -1; goto exit; @@ -227,11 +161,11 @@ lf_keymanager_service_update(struct lf_keymanager *km) (void)rte_memcpy(new_data, data, sizeof(struct lf_keymanager_dictionary_data)); - key_id = fetch_as_as_key(km, km->drkey_service_addr, km->src_as, + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, km->src_as, key_ptr->as, key_ptr->drkey_protocol, ns_now + LF_DRKEY_PREFETCHING_PERIOD, &new_data->outbound_key); - if (key_id < 0) { + if (res < 0) { rte_free(new_data); err = -1; goto exit; @@ -255,7 +189,6 @@ lf_keymanager_service_update(struct lf_keymanager *km) (void)linked_list_push(&free_list, data); } } - exit: if (free_list != NULL) { /* free old data after no worker accesses it anymore */ @@ -384,6 +317,8 @@ lf_keymanager_apply_config(struct lf_keymanager *km, rte_spinlock_lock(&km->management_lock); LF_KEYMANAGER_LOG(NOTICE, "Apply config...\n"); + lf_keyfetcher_apply_config(km->fetcher, config); + /* * Update general keymanager configurations */ @@ -451,22 +386,15 @@ lf_keymanager_apply_config(struct lf_keymanager *km, break; } - /* - * Fetch keys from the new drkey service. - * If this does not succeed, initialize them as not valid, i.e., set - * validity_not_after to 0. - */ - res = fetch_as_as_key(km, config->drkey_service_addr, key.as, - config->isd_as, key.drkey_protocol, ns_now, - &dictionary_data->inbound_key); + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, key.as, config->isd_as, + key.drkey_protocol, ns_now, &dictionary_data->inbound_key); if (res < 0) { dictionary_data->inbound_key.validity_not_after = 0; } dictionary_data->old_inbound_key.validity_not_after = 0; - res = fetch_as_as_key(km, config->drkey_service_addr, config->isd_as, - key.as, key.drkey_protocol, ns_now, - &dictionary_data->outbound_key); + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, config->isd_as, key.as, + key.drkey_protocol, ns_now, &dictionary_data->outbound_key); if (res < 0) { dictionary_data->outbound_key.validity_not_after = 0; } @@ -521,6 +449,9 @@ lf_keymanager_close(struct lf_keymanager *km) km->workers[worker_id].dict = NULL; lf_crypto_drkey_ctx_close(&km->workers[worker_id].drkey_ctx); } + lf_keyfetcher_close(km->fetcher); + free(km->fetcher); + km->fetcher = NULL; return 0; } @@ -568,6 +499,15 @@ lf_keymanager_init(struct lf_keymanager *km, uint16_t nb_workers, reset_statistics(&km->statistics); + km->fetcher = malloc(sizeof(struct lf_keyfetcher)); + if (km->fetcher == NULL) { + return -1; + } + res = lf_keyfetcher_init(km->fetcher, initial_size); + if (res != 0) { + return -1; + } + return 0; } diff --git a/src/keymanager.h b/src/keymanager.h index 01dc1c1..6e72e4c 100644 --- a/src/keymanager.h +++ b/src/keymanager.h @@ -15,6 +15,8 @@ #include #include "config.h" +#include "drkey.h" +#include "keyfetcher.h" #include "lf.h" #include "lib/crypto/crypto.h" #include "lib/telemetry/counters.h" @@ -23,37 +25,15 @@ #include "lib/log/log.h" /** - * The key manager manages the storage and fetching of the required DRKeys. - * It provides an interface for workers to query host-to-host keys efficiently. + * The key manager manages the storage, caching and fetching of the required + * DRKeys. It provides an interface for workers to query host-to-host keys + * efficiently. * - * For the fetching, it depends on a DRKey fetcher module, which depends on the - * deployment setup. + * For the fetching, it uses the keyfetcher. */ #define LF_KEYMANAGER_INTERVAL 0.5 /* seconds */ -/* - * A DRKey is valid during a certain epoch defined by a starting and ending - * point in time. During the transition between an old key and a new key, both - * keys are valid. This transition period is defined by the - * LF_DRKEY_GRACE_PERIOD, which extends the ending point of the old key by a - * certain amount of time. - */ -#define LF_DRKEY_GRACE_PERIOD (2 * LF_TIME_NS_IN_S) /* in nanoseconds */ -#define LF_DRKEY_PREFETCHING_PERIOD (1 * LF_TIME_NS_IN_S) /* in nanoseconds */ - -/** - * The key container wraps all information required to use a key. - * A DRKeys validity is usually defined in seconds. Because the workers operate - * with nanosecond timestamps, the validity timestamps are also stored in - * nanoseconds to avoid any conversion. - */ -struct lf_keymanager_key_container { - uint64_t validity_not_before; /* Unix timestamp (nanoseconds) */ - uint64_t validity_not_after; /* Unix timestamp (nanoseconds) */ - struct lf_crypto_drkey key; -}; - struct lf_keymanager_worker { struct rte_hash *dict; struct lf_crypto_drkey_ctx drkey_ctx; @@ -93,6 +73,8 @@ struct lf_keymanager { uint64_t src_as; + struct lf_keyfetcher *fetcher; + char drkey_service_addr[48]; /* crypto DRKey context */ @@ -133,36 +115,6 @@ lf_keymanager_check_drkey_validity(struct lf_keymanager_key_container *drkey, return -1; } -/** - * Derive host-host DRKey from AS-AS DRKey. - * - * @param kmw Keymanager worker context. - * @param drkey_asas AS-AS DRKey. - * @param fast_side_host Fast side host address. - * @param slow_side_host Slow side host address. - * @param drkey_hh Returning host-host DRKey. - */ -static inline void -lf_keymanager_drkey_from_asas(struct lf_keymanager_worker *kmw, - const struct lf_crypto_drkey *drkey_asas, - const struct lf_host_addr *fast_side_host, - const struct lf_host_addr *slow_side_host, - struct lf_crypto_drkey *drkey_hh) -{ - assert(LF_HOST_ADDR_LENGTH(fast_side_host) <= LF_CRYPTO_CBC_BLOCK_SIZE); - assert(LF_HOST_ADDR_LENGTH(slow_side_host) <= LF_CRYPTO_CBC_BLOCK_SIZE); - - /* TODO: prepend key type and address length/type */ - uint8_t buf[2 * LF_CRYPTO_CBC_BLOCK_SIZE] = { 0 }; - - memcpy(buf, fast_side_host->addr, LF_HOST_ADDR_LENGTH(fast_side_host)); - memcpy(buf + LF_CRYPTO_CBC_BLOCK_SIZE, slow_side_host->addr, - LF_HOST_ADDR_LENGTH(slow_side_host)); - - lf_crypto_drkey_derivation_step(&kmw->drkey_ctx, drkey_asas, buf, - sizeof(buf), drkey_hh); -} - /** * Obtain inbound DRKey. * @@ -205,8 +157,9 @@ lf_keymanager_worker_inbound_get_drkey(struct lf_keymanager_worker *kmw, grace_period = 0; #endif if (res >= 0 && (res == grace_period)) { - lf_keymanager_drkey_from_asas(kmw, &dict_node->inbound_key.key, - backend_addr, peer_addr, drkey); + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, + &dict_node->inbound_key.key, backend_addr, peer_addr, + drkey_protocol, drkey); return 0; } @@ -215,8 +168,9 @@ lf_keymanager_worker_inbound_get_drkey(struct lf_keymanager_worker *kmw, res = lf_keymanager_check_drkey_validity(&dict_node->old_inbound_key, ns_valid); if (res >= 0 && (res == grace_period)) { - lf_keymanager_drkey_from_asas(kmw, &dict_node->old_inbound_key.key, - backend_addr, peer_addr, drkey); + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, + &dict_node->old_inbound_key.key, backend_addr, peer_addr, + drkey_protocol, drkey); return 0; } @@ -266,8 +220,9 @@ lf_keymanager_worker_outbound_get_drkey(struct lf_keymanager_worker *kmw, res = 0; #endif if (likely(res == 0 || res == 1)) { - lf_keymanager_drkey_from_asas(kmw, &dict_node->outbound_key.key, - peer_addr, backend_addr, drkey); + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, + &dict_node->outbound_key.key, peer_addr, backend_addr, + drkey_protocol, drkey); return res; } @@ -275,8 +230,9 @@ lf_keymanager_worker_outbound_get_drkey(struct lf_keymanager_worker *kmw, res = lf_keymanager_check_drkey_validity(&dict_node->old_outbound_key, ns_valid); if (likely(res == 0 || res == 1)) { - lf_keymanager_drkey_from_asas(kmw, &dict_node->old_outbound_key.key, - peer_addr, backend_addr, drkey); + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, + &dict_node->old_outbound_key.key, peer_addr, backend_addr, + drkey_protocol, drkey); return res; } diff --git a/src/lib/json-parser/lf_json_util.h b/src/lib/json-parser/lf_json_util.h index 6d1700b..3353bd1 100644 --- a/src/lib/json-parser/lf_json_util.h +++ b/src/lib/json-parser/lf_json_util.h @@ -9,6 +9,8 @@ #include #include +#include + #include #include "../utils/parse.h" @@ -44,19 +46,19 @@ lf_json_parse_string(const json_value *json_val, char *dst, size_t n) } static inline int -lf_json_parse_uint16(const json_value *json_val, uint16_t *dst) +lf_json_parse_uint16(const json_value *json_val, uint16_t *val) { - int64_t drkey_protocol; + int64_t raw_value; if (json_val->type != json_integer) { return -1; } - drkey_protocol = json_val->u.integer; - if (drkey_protocol < 0 || drkey_protocol > UINT16_MAX) { + raw_value = json_val->u.integer; + if (raw_value < 0 || raw_value > UINT16_MAX) { return -1; } - *dst = (uint16_t)drkey_protocol; + *val = (uint16_t)raw_value; return 0; } @@ -103,10 +105,10 @@ lf_json_parse_ether(const json_value *json_val, uint8_t val[6]) j = i; do { assert(j <= json_val->u.string.length); - if (('0' <= addrstr[j]) && (int)(addrstr[j] <= '9')) { - val[k] = (val[k] << 4) | (addrstr[j] - '0'); + if (('0' <= addrstr[j]) && (addrstr[j] <= '9')) { + val[k] = (val[k] << 4) | (uint8_t)(addrstr[j] - '0'); } else if (('a' <= addrstr[j]) && (addrstr[j] <= 'f')) { - val[k] = (val[k] << 4) | (int)(addrstr[j] - 'a' + 10); + val[k] = (val[k] << 4) | (uint8_t)(addrstr[j] - 'a' + 10); } else { return -1; } @@ -164,14 +166,14 @@ lf_json_parse_ipv6(const json_value *json_val, uint8_t val[16]) * @param val result port number (newtork byte order). */ static inline int -lf_json_parse_port(const json_value *json_val, uint16_t *dst) +lf_json_parse_port(const json_value *json_val, uint16_t *val) { int res; - res = lf_json_parse_uint16(json_val, dst); + res = lf_json_parse_uint16(json_val, val); if (res != 0) { return res; } - *dst = rte_cpu_to_be_16(*dst); + *val = rte_cpu_to_be_16(*val); return 0; } @@ -208,4 +210,117 @@ lf_json_parse_isd_as_be(json_value *json_val, uint64_t *val) return 0; } + +/** + * Parse byte buffer from hex string. + * @param val result byte buffer of length len (newtork byte order). + */ +static inline int +lf_json_parse_byte_buffer(const json_value *json_val, int len, uint8_t val[]) +{ + char *bufstr; + + if (json_val->type != json_string) { + return -1; + } + + bufstr = json_val->u.string.ptr; + + int bufstr_len = json_val->u.string.length; + if (bufstr_len != 2 * len) { + return -1; + } + + for (uint8_t i = 0; i < len; i++) { + val[i] = 0; + for (uint8_t j = 2 * i; j < 2 * i + 2; j++) { + assert(j < bufstr_len); + if (('0' <= bufstr[j]) && (bufstr[j] <= '9')) { + val[i] = (val[i] << 4) | (uint8_t)(bufstr[j] - '0'); + } else if (('a' <= bufstr[j]) && (bufstr[j] <= 'f')) { + val[i] = (val[i] << 4) | (uint8_t)(bufstr[j] - 'a' + 10); + } else { + return -1; + } + } + } + + return 0; +} + +/** + * Parse timestamp from iso string. + * @param val result timestamp in unix time + */ +static inline int +lf_json_parse_timestamp(const json_value *json_val, uint64_t *val) +{ + if (json_val->type != json_string) { + return -1; + } + + char *bufstr; + bufstr = json_val->u.string.ptr; + + int bufstr_len = json_val->u.string.length; + if (bufstr_len != 19) { + return -1; + } + + struct tm date; + // expect time in format "%Y-%m-%dT%H:%M:%S" + if (bufstr[4] != '-' || bufstr[7] != '-' || bufstr[10] != 'T' || + bufstr[13] != ':' || bufstr[16] != ':') { + return -1; + } + + uint64_t v; + int res; + res = lf_parse_unum(bufstr, &v); + if (res < 0) { + return -1; + } + date.tm_year = (int)v - 1900; + + res = lf_parse_unum(bufstr + 5, &v); + if (res < 0) { + return -1; + } + date.tm_mon = (int)v - 1; + + res = lf_parse_unum(bufstr + 8, &v); + if (res < 0) { + return -1; + } + date.tm_mday = (int)v; + + res = lf_parse_unum(bufstr + 11, &v); + if (res < 0) { + return -1; + } + date.tm_hour = (int)v; + + res = lf_parse_unum(bufstr + 14, &v); + if (res < 0) { + return -1; + } + date.tm_min = (int)v; + + res = lf_parse_unum(bufstr + 17, &v); + if (res < 0) { + return -1; + } + date.tm_sec = (int)v; + + // NOTE: timegm is only available on linux systems + time_t unix_time = timegm(&date); + if (unix_time < 0) { + return -1; + } + + *val = (uint64_t)(unix_time) * (uint64_t)1e9; + + return 0; +} + #endif /* LF_JSON_UTIL_H */ \ No newline at end of file diff --git a/src/lib/scion_drkey/drkey.go b/src/lib/scion_drkey/drkey.go index 12cde17..d38c29f 100644 --- a/src/lib/scion_drkey/drkey.go +++ b/src/lib/scion_drkey/drkey.go @@ -6,65 +6,22 @@ package main import ( "C" "unsafe" - - "context" - "fmt" - "time" - - "github.com/scionproto/scion/go/lib/addr" - drkeyctrl "github.com/scionproto/scion/go/lib/ctrl/drkey" - "github.com/scionproto/scion/go/lib/drkey" - cppb "github.com/scionproto/scion/go/pkg/proto/control_plane" - - "google.golang.org/grpc" ) -//export GetASASKey -func GetASASKey(sciondAddr *C.char, fastIA, slowIA uint64, drkeyProtocol uint16, valTime int64, +//export GetHostASKey +func GetHostASKey(sciondAddr *C.char, fastIA, slowIA, fastAddr uint64, drkeyProtocol uint16, valTime int64, validityNotBefore, validityNotAfter *int64, keyPtr unsafe.Pointer) int { + + // TODO: implement key fetching from SCION control service + return -1 +} - meta := drkey.Lvl1Meta{ - ProtoId: drkey.Protocol(drkeyProtocol), - Validity: time.Unix(valTime/1000, 0).UTC(), - SrcIA: addr.IA(fastIA), - DstIA: addr.IA(slowIA), - } - - ctx, cancelF := context.WithTimeout(context.Background(), 10*time.Second) - defer cancelF() - - // Dial - conn, err := grpc.DialContext(ctx, C.GoString(sciondAddr), grpc.WithInsecure()) - if err != nil { - fmt.Println("DialContext failed") - return -1 - } - - defer conn.Close() - client := cppb.NewDRKeyIntraServiceClient(conn) - protoReq, err := drkeyctrl.IntraLvl1ToProtoRequest(meta) - if err != nil { - fmt.Println("IntraLvl1ToProtoRequest failed") - return -1 - } - - rep, err := client.IntraLvl1(ctx, protoReq) - if err != nil { - fmt.Println("IntraLvl1 failed") - return -1 - } - - key, err := drkeyctrl.GetASASKeyFromReply(meta, rep) - if err != nil { - fmt.Println("GetASASKeyFromReply failed") - return -1 - } - - *validityNotBefore = key.Epoch.NotBefore.Unix() * 1000 - *validityNotAfter = key.Epoch.NotAfter.Unix() * 1000 - copy((*[16]byte)(keyPtr)[:], key.Key[:]) +//export GetHostHostKey +func GetHostHostKey(sciondAddr *C.char, fastIA, slowIA, fastAddr, slowAddr uint64, drkeyProtocol uint16, valTime int64, + validityNotBefore, validityNotAfter *int64, keyPtr unsafe.Pointer) int { - return 0 + // TODO: implement key fetching from SCION control service + return -1 } func main() {} diff --git a/src/lib/scion_drkey/go.mod b/src/lib/scion_drkey/go.mod index 407ca54..19fce0e 100644 --- a/src/lib/scion_drkey/go.mod +++ b/src/lib/scion_drkey/go.mod @@ -1,10 +1,40 @@ module example.com/lightning-filter -go 1.16 +go 1.21 + +require github.com/scionproto/scion v0.9.1 require ( - github.com/scionproto/scion v0.6.1-0.20220202161514-5883c725f748 - google.golang.org/grpc v1.40.0 + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/dchest/cmac v1.0.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/google/gopacket v1.1.19 // indirect + github.com/google/uuid v1.4.0 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-sqlite3 v1.14.18 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/prometheus/client_golang v1.17.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.26.0 // indirect + golang.org/x/crypto v0.15.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sys v0.14.0 // indirect + golang.org/x/tools v0.15.0 // indirect + google.golang.org/protobuf v1.31.0 // indirect + lukechampine.com/uint128 v1.3.0 // indirect + modernc.org/cc/v3 v3.41.0 // indirect + modernc.org/ccgo/v3 v3.16.15 // indirect + modernc.org/libc v1.34.9 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/opt v0.1.3 // indirect + modernc.org/sqlite v1.27.0 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect ) - -replace github.com/scionproto/scion => github.com/netsec-ethz/scion v0.6.1-0.20220422080039-25976708fd6b diff --git a/src/lib/scion_drkey/go.sum b/src/lib/scion_drkey/go.sum index e96a4fe..592532b 100644 --- a/src/lib/scion_drkey/go.sum +++ b/src/lib/scion_drkey/go.sum @@ -1,1159 +1,117 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.31.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.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= -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 v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -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/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU= -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/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= -dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= -dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= -git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -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/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -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/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4 v0.0.0-20181218183524-be58ebffde8e/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/bazelbuild/rules_go v0.29.0/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= -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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= -github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buildkite/go-buildkite/v2 v2.8.1/go.mod h1:kRCClqF2FuCFK42+Jk8ggYUMMAQXJC3uMjBt6W/ajJ0= -github.com/cenkalti/backoff v1.1.1-0.20171020064038-309aa717adbf/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -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/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/dchest/cmac v0.0.0-20150527144652-62ff55a1048c h1:qoavXEzRRUfup81LsDQv4fnUQbLyorpPz6WxiwdiU7A= -github.com/dchest/cmac v0.0.0-20150527144652-62ff55a1048c/go.mod h1:vWqNmss2I/DL9JKC95Lkwp+lzw+v8hwsQs7hQKyQpwk= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= -github.com/deepmap/oapi-codegen v1.9.0/go.mod h1:7t4DbSxmAffcTEgrWvsPYEE2aOARZ8ZKWp3hDuZkHNc= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emojisum/emojisum v0.0.0-20210601164913-cb9db27ebae2/go.mod h1:WC2DpT1Je6GNGFgfBtMSrjTnWwb24TYpNin8zB4jIuI= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/getkin/kin-openapi v0.80.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= -github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= -github.com/go-chi/chi/v5 v5.0.2/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/cors v1.1.1/go.mod h1:K2Yje0VW/SJzxiyMYu6iPQYa7hMjQX2i/F491VChg1I= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -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-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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/goccy/go-json v0.7.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -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/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= -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/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.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/dchest/cmac v1.0.0 h1:Vaorm9FVpO2P+YmRdH0RVCUB1XF3Ge1yg9scPvJphyk= +github.com/dchest/cmac v1.0.0/go.mod h1:0zViPqHm8iZwwMl1cuK3HqK7Tu4Q7DV4EuMIOUwBVQ0= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -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/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -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.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.0.1-0.20190318165438-c8c88dbee036/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.16-0.20190123011826-102d5ca2098c h1:eR3RuANqlK0CQoHJxUdXQNsco+gJykcti01+wqBCuPs= -github.com/google/gopacket v1.1.16-0.20190123011826-102d5ca2098c/go.mod h1:UCLx9mCmAwsVbn6qQl1WIEt2SO7Nd2fD0th1TBAsqBw= -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/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -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/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= -github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= -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/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -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/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.0.0-20190422225806-e506e3ef7365/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -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.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -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/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -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/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/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/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= -github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= -github.com/lestrrat-go/codegen v1.0.2/go.mod h1:JhJw6OQAuPEfVKUCLItpaVLumDGWQznd1VaXrBk9TdM= -github.com/lestrrat-go/httpcc v1.0.0/go.mod h1:tGS/u00Vh5N6FHNkExqGGNId8e0Big+++0Gf8MBnAvE= -github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/jwx v1.2.7/go.mod h1:bw24IXWbavc0R2RsOtpXL7RtMyP589yZ1+L7kd09ZGA= -github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= -github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= -github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= -github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-sqlite3 v1.14.4 h1:4rQjbDxdu9fSgI/r3KN72G3c2goxknAqHHgPWWs8UlI= -github.com/mattn/go-sqlite3 v1.14.4/go.mod h1:WVKg1VTActs4Qso6iwGbiFih2UIHo0ENGwNd0Lj+XmI= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mdlayher/raw v0.0.0-20191009151244-50f2db8cc065/go.mod h1:7EpbotpCmVZcu+KCX4g9WaRNuu11uyhiW7+Le1dKawg= -github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -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/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -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/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= -github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= -github.com/netsec-ethz/scion v0.6.1-0.20220422080039-25976708fd6b h1:cLQzuQ51QiGVdwGgUZdFh6QyoXAM64YkdWqdGjBgfSg= -github.com/netsec-ethz/scion v0.6.1-0.20220422080039-25976708fd6b/go.mod h1:9EyDb3Bfn7kDmy6v+gHKwl2eIxFo3Reod4TwDaKY5zo= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/patrickmn/go-cache v2.1.1-0.20180815053127-5633e0862627+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= -github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -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 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= 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/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -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 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -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 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -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.0 h1:HRmM4uANZDAjdvbsdfOoqI5UDbjz0faKeMs/cGPKKI0= -github.com/prometheus/common v0.32.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -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 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= -github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= -github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= -github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= -github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= -github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= -github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= -github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= -github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= -github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= -github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= -github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= -github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= -github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= -github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= -github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= -github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= -github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= -github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= -github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -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/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.7/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/songgao/water v0.0.0-20190725173103-fd331bda3f4b/go.mod h1:P5HUIBuIWKbyjl083/loAegFkfbFNx5i2qEP4CNbm7E= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -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.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/uber/jaeger-client-go v2.29.1+incompatible h1:R9ec3zO3sGpzs0abd43Y+fBZRJ9uiH6lXyR/+u6brW4= -github.com/uber/jaeger-client-go v2.29.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v2.0.0+incompatible h1:iMSCV0rmXEogjNWPh2D0xk9YVKvrtGoHJNe9ebLu/pw= -github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= -github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -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= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= -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.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go4.org v0.0.0-20180809161055-417644f6feb5 h1:+hE86LblG4AyDgwMCLTE6FOlM9+qjHSYS+rKqxUVdsM= -go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= -go4.org/intern v0.0.0-20210108033219-3eb7198706b2 h1:VFTf+jjIgsldaz/Mr00VaCSswHJrI2hIjQygE/W4IMg= -go4.org/intern v0.0.0-20210108033219-3eb7198706b2/go.mod h1:vLqJ+12kCw61iCWsPto0EOHhBS+o4rO5VIucbc9g2Cc= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222175341-b30ae309168e/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063 h1:1tk03FUNpulq2cuWpXZWj649rwJpk0d20rxWiopKRmc= -go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063/go.mod h1:FftLjUGFEDu5k8lt0ddY+HcrH/qU/0qk+H8j9/nTl3E= -golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/scionproto/scion v0.9.1 h1:agRbJ2n2RjI6BdewTqK2Vo0DnjPQ4qRjG00PKMIg8GM= +github.com/scionproto/scion v0.9.1/go.mod h1:5oZGBv6ZI6gK5MgYlZ70FaNUXihxYLrRfolvO3bQAY4= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/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-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -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-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -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/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= +golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/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/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/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-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181106065722-10aee1819953/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-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/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-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190419010253-1f3472d942ba/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-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -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-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/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-20200520004742-59133d7f0dd7/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-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/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-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/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-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= -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/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= +golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= 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-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/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-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190418153312-f0ce4c0180be/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-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/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-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/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-20200217220822-9197077df867/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-20200519105757-fe76b779f299/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-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211031064116-611d5d643895/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -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/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -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/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190328211700-ab21143f2384/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-20190614205625-5aca471b1d59/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-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/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-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/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/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 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-20200505023115-26f46d2f7ef8/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-20200616133436-c1934b75d054/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-20200619180055-7c47624df98f/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/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210114065538-d78b04bdf963/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= 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 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= -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/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -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/appengine v1.6.7/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-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= -google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -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-20200423170343-7949de9c1215/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-20200513103714-09dca8ec2884/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-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -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-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 h1:z+ErRPu0+KS02Td3fOAgdX+lnPDh/VyaABEJPD4JRQs= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= -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.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -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/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/grpc/examples v0.0.0-20210630181457-52546c5d89b7/go.mod h1:bF8wuZSAZTcbF7ZPKrDI/qY52toTP/yxLpRRY4Eu9Js= -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/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878 h1:lv6/DhyiFFGsmzxbsUUTOkN29II+zeWHxvT8Lpdxsv0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230815205213-6bfd019c3878/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.57.2 h1:uw37EN34aMFFXB2QPW7Tq6tdTbind1GpRxw5aOX3a5k= +google.golang.org/grpc v1.57.2/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= 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.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -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/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -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.3/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.2.8/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 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -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= -inet.af/netaddr v0.0.0-20210903134321-85fa6c94624e h1:tvgqez5ZQoBBiBAGNU/fmJy247yB/7++kcLOEoMYup0= -inet.af/netaddr v0.0.0-20210903134321-85fa6c94624e/go.mod h1:z0nx+Dh+7N7CC8V5ayHtHGpZpxLQZZxkIaaz6HN65Ls= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -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= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= -sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v1.34.9 h1:yhQGs5jsWHJIU7jY6nCe8GJw27j+z6xYi0eorwPpGgI= +modernc.org/libc v1.34.9/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.27.0 h1:MpKAHoyYB7xqcwnUwkuD+npwEa0fojF0B5QRbN+auJ8= +modernc.org/sqlite v1.27.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= +modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= +modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= diff --git a/src/mock/drkey_fetcher_mock.c b/src/mock/drkey_fetcher_mock.c index 97fe472..4eccd93 100644 --- a/src/mock/drkey_fetcher_mock.c +++ b/src/mock/drkey_fetcher_mock.c @@ -5,20 +5,82 @@ #include #include +#include "../drkey.h" #include "../drkey_fetcher.h" +#include "../lf.h" #include "../lib/crypto/crypto.h" #define DRKEY_SIZE 16 #define VALIDITY_PERIOD 10000 /* 10 seconds */ +// TODO: add constant for drkey_service_addr len (48). + +int +lf_drkey_fetcher_host_as_key(const char drkey_service_addr[48], uint64_t src_ia, + uint64_t dst_ia, uint64_t src_addr, uint16_t drkey_protocol, + int64_t val_time_ms, int64_t *validity_not_before, + int64_t *validity_not_after, void *key) +{ + int res; + struct lf_crypto_drkey_ctx drkey_ctx; + struct lf_crypto_drkey sv_drkey, as_as_drkey, host_as_drkey; + struct lf_host_addr fast_side_addr; + fast_side_addr.addr = &src_addr; + fast_side_addr.type_length = LF_HOST_ADDR_TL_IPV4; + + (void)drkey_service_addr; + /* + * Validity period starts and stops at multiples of VALIDITY_PERIOD and has + * a duration of VALIDITY_PERIOD. I.e., the n-th validity period is + * [n*VALIDITY_PERIOD,(n+1)*VALIDITY_PERIOD]. + * With this approach, the DRKey epochs are deterministic, as long as + * VALIDITY_PERIOD is defined. + */ + *validity_not_before = (val_time_ms / VALIDITY_PERIOD) * VALIDITY_PERIOD; + *validity_not_after = + (val_time_ms / VALIDITY_PERIOD) * VALIDITY_PERIOD + VALIDITY_PERIOD; + + /* The DRKey's secret value (SV) has the drkey_protocol identifier (cpu + * endian) as its first two bytes and zeros for the following bytes */ + uint8_t sv[DRKEY_SIZE] = { 0 }; + memcpy(sv, &drkey_protocol, sizeof(drkey_protocol)); + uint8_t buf[16] = { 0 }; + memcpy(buf, &src_ia, sizeof src_ia); + memcpy(buf + 8, &dst_ia, sizeof dst_ia); + + res = lf_crypto_drkey_ctx_init(&drkey_ctx); + if (res != 0) { + return -1; + } + + uint8_t as_as_drkey_buf[DRKEY_SIZE] = { 0 }; + lf_crypto_drkey_from_buf(&drkey_ctx, sv, &sv_drkey); + lf_crypto_drkey_cbcmac(&drkey_ctx, &sv_drkey, buf, 16, as_as_drkey_buf); + + lf_crypto_drkey_from_buf(&drkey_ctx, as_as_drkey_buf, &as_as_drkey); + lf_drkey_derive_host_as_from_as_as(&drkey_ctx, &as_as_drkey, + &fast_side_addr, drkey_protocol, &host_as_drkey); + memcpy(key, host_as_drkey.key, DRKEY_SIZE); + + lf_crypto_drkey_ctx_close(&drkey_ctx); + + return 0; +} + int -lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, - uint64_t dst_ia, uint16_t drkey_protocol, int64_t val_time_ms, +lf_drkey_fetcher_host_host_key(const char drkey_service_addr[48], + uint64_t src_ia, uint64_t dst_ia, uint64_t src_addr, uint64_t dst_addr, + uint16_t drkey_protocol, int64_t val_time_ms, int64_t *validity_not_before, int64_t *validity_not_after, void *key) { int res; struct lf_crypto_drkey_ctx drkey_ctx; - struct lf_crypto_drkey sv_drkey; + struct lf_crypto_drkey sv_drkey, as_as_drkey, host_host_drkey; + struct lf_host_addr fast_side_addr, slow_side_addr; + fast_side_addr.addr = &src_addr; + fast_side_addr.type_length = LF_HOST_ADDR_TL_IPV4; + slow_side_addr.addr = &dst_addr; + slow_side_addr.type_length = LF_HOST_ADDR_TL_IPV4; (void)drkey_service_addr; /* @@ -34,9 +96,9 @@ lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, /* The DRKey's secret value (SV) has the drkey_protocol identifier (cpu * endian) as its first two bytes and zeros for the following bytes */ - uint8_t sv[DRKEY_SIZE] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + uint8_t sv[DRKEY_SIZE] = { 0 }; memcpy(sv, &drkey_protocol, sizeof(drkey_protocol)); - uint8_t buf[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + uint8_t buf[16] = { 0 }; memcpy(buf, &src_ia, sizeof src_ia); memcpy(buf + 8, &dst_ia, sizeof dst_ia); @@ -45,9 +107,16 @@ lf_drkey_fetcher_as_as_key(const char drkey_service_addr[48], uint64_t src_ia, return -1; } + uint8_t as_as_drkey_buf[DRKEY_SIZE] = { 0 }; lf_crypto_drkey_from_buf(&drkey_ctx, sv, &sv_drkey); - lf_crypto_drkey_cbcmac(&drkey_ctx, &sv_drkey, buf, 16, key); + lf_crypto_drkey_cbcmac(&drkey_ctx, &sv_drkey, buf, 16, as_as_drkey_buf); + + lf_crypto_drkey_from_buf(&drkey_ctx, as_as_drkey_buf, &as_as_drkey); + lf_drkey_derive_host_host_from_as_as(&drkey_ctx, &as_as_drkey, + &fast_side_addr, &slow_side_addr, drkey_protocol, &host_host_drkey); + memcpy(key, host_host_drkey.key, DRKEY_SIZE); lf_crypto_drkey_ctx_close(&drkey_ctx); + return 0; -} \ No newline at end of file +} diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index d5f4966..96e272d 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -51,7 +51,7 @@ add_executable(keymanager_test EXCLUDE_FROM_ALL keymanager_test.c) add_test(NAME keymanager_test COMMAND keymanager_test --no-huge) # Dependencies target_sources(keymanager_test PRIVATE log_mock.c) -target_sources(keymanager_test PRIVATE ../keymanager.c ../mock/drkey_fetcher_mock.c ../lib/crypto/crypto.c ../config.c ../lib/ipc/ipc.c) +target_sources(keymanager_test PRIVATE ../mock/drkey_fetcher_mock.c ../keyfetcher.c ../keymanager.c ../lib/crypto/crypto.c ../config.c ../lib/ipc/ipc.c) # DPDK add_definitions(${DPDK_STATIC_CFLAGS}) # TODO: target target_include_directories(keymanager_test PRIVATE ${DPDK_SATIC_INCLUDE_DIRS}) @@ -70,6 +70,7 @@ add_custom_target(keymanager_test_file copy_if_different ${CMAKE_CURRENT_LIST_DIR}/keymanager_test1.json ${CMAKE_CURRENT_LIST_DIR}/keymanager_test2.json + ${CMAKE_CURRENT_LIST_DIR}/keymanager_test3.json ${CMAKE_CURRENT_BINARY_DIR}/ ) add_dependencies(keymanager_test keymanager_test_file) diff --git a/src/test/keymanager_test.c b/src/test/keymanager_test.c index ed7d2ed..ffe244e 100644 --- a/src/test/keymanager_test.c +++ b/src/test/keymanager_test.c @@ -8,6 +8,8 @@ #include #include "../config.h" +#include "../drkey.h" +#include "../keyfetcher.h" #include "../keymanager.h" #include "../lf.h" #include "../lib/log/log.h" @@ -15,6 +17,7 @@ #define TEST1_JSON "keymanager_test1.json" #define TEST2_JSON "keymanager_test2.json" +#define TEST3_JSON "keymanager_test3.json" #define LF_TEST_NO_RCU 1 @@ -97,6 +100,18 @@ new_test_context() return keymanager; } +void +print_keys(uint8_t expected[LF_CRYPTO_DRKEY_SIZE], + uint8_t actual[LF_CRYPTO_DRKEY_SIZE]) +{ + printf("Expected: \t"); + for (int i = 0; i < LF_CRYPTO_DRKEY_SIZE; i++) + printf("%02hhx", expected[i]); + printf("\nGot: \t\t"); + for (int i = 0; i < LF_CRYPTO_DRKEY_SIZE; i++) printf("%02hhx", actual[i]); + printf("\n"); +} + int test1() { @@ -162,13 +177,14 @@ test1() error_count += 1; } - ns_now = ns_now + 20 * LF_TIME_NS_IN_S; /* 20 seconds (the validity period - of the mock keys is 10 seconds) */ + ns_now = + ns_now + + 3 * 24 * 3600 * LF_TIME_NS_IN_S; // 3 days (the max validity period) res = lf_keymanager_worker_inbound_get_drkey(kmw, config->peers->isd_as, &src_host_addr, &dst_host_addr, config->peers->drkey_protocol, ns_now, 0, &drkey); if (res != -2) { - printf("Error: ns_now = ns_now + 20*1e9; " + printf("Error: ns_now = ns_now + 3*24*3600*1e9; " "lf_keymanager_worker_inbound_get_drkey (expected = -2, res = " "%d)\n", res); @@ -179,7 +195,7 @@ test1() &dst_host_addr, &src_host_addr, config->peers->drkey_protocol, ns_now, &drkey); if (res != -2) { - printf("Error: ns_now = ns_now + 20*1e9; " + printf("Error: ns_now = ns_now + 3*24*3600*1e9; " "lf_keymanager_worker_outbound_get_drkey (expected = -2, res = " "%d)\n", res); @@ -279,6 +295,7 @@ test2() if (memcmp(&drkey1, &drkey2, sizeof(drkey1)) != 0) { printf("Error: DRKey are not the same\n"); error_count += 1; + print_keys(drkey1.key, drkey2.key); } free_test_context(km1); @@ -287,6 +304,207 @@ test2() return error_count; } +/** + * Test that the DRKey derivation is correct. + * + * @return int + */ +int +test3() +{ + int error_count = 0; + struct lf_keymanager *km; + struct lf_keymanager_worker *kmw; + struct lf_crypto_drkey drkey; + struct lf_crypto_drkey as_as_zero_drkey, as_as_drkey; + struct lf_host_addr src_host_addr; + struct lf_host_addr dst_host_addr; + + const uint8_t zero_key[LF_CRYPTO_DRKEY_SIZE] = { 0 }; + const uint8_t random_key[LF_CRYPTO_DRKEY_SIZE] = { 0x01, 0x23, 0x45, 0x67, + 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, + 0xef }; + + uint32_t src_addr = 0; + uint32_t dst_addr = 0; + + src_host_addr.addr = &src_addr; + src_host_addr.type_length = 0x0; + dst_host_addr.addr = &dst_addr; + dst_host_addr.type_length = 0x0; + + km = new_test_context(); + if (km == NULL) { + return 1; + } + kmw = &km->workers[0]; + + lf_crypto_drkey_from_buf(&kmw->drkey_ctx, zero_key, &as_as_zero_drkey); + lf_crypto_drkey_from_buf(&kmw->drkey_ctx, random_key, &as_as_drkey); + + // test most general derivation + uint8_t expected_key_1[LF_CRYPTO_DRKEY_SIZE] = { 0x82, 0x67, 0xa4, 0xe9, + 0x10, 0x60, 0x8f, 0xa8, 0xdd, 0x46, 0xb1, 0x1b, 0x43, 0x95, 0x97, + 0x49 }; + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, &as_as_zero_drkey, + &src_host_addr, &dst_host_addr, 0, &drkey); + + if (memcmp(expected_key_1, drkey.key, sizeof expected_key_1) != 0) { + printf("Error: DRKey derivation wrong\n"); + print_keys(expected_key_1, drkey.key); + error_count += 1; + } + + // test IPv4 addresses + src_addr = 0x0202f80a; // 10.248.2.2 + dst_addr = 0x0505f80a; // 10.248.5.5 + + uint8_t expected_key_2[LF_CRYPTO_DRKEY_SIZE] = { 0x75, 0xde, 0xfa, 0x86, + 0xd5, 0x6d, 0x26, 0x5b, 0x0c, 0xc7, 0xe6, 0x31, 0x3a, 0x9a, 0x13, + 0x14 }; + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, &as_as_drkey, + &src_host_addr, &dst_host_addr, 0, &drkey); + + if (memcmp(expected_key_2, drkey.key, sizeof expected_key_2) != 0) { + printf("Error: DRKey derivation wrong\n"); + print_keys(expected_key_2, drkey.key); + error_count += 1; + } + + // test DRKey protocol number + uint8_t expected_key_3[LF_CRYPTO_DRKEY_SIZE] = { 0x81, 0xc0, 0x7f, 0xbc, + 0x5c, 0xdd, 0xb1, 0xda, 0x18, 0xaa, 0xa0, 0x56, 0xbc, 0x22, 0xef, + 0x56 }; + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, &as_as_drkey, + &src_host_addr, &dst_host_addr, 0x0300, &drkey); + + if (memcmp(expected_key_3, drkey.key, sizeof expected_key_3) != 0) { + printf("Error: DRKey derivation wrong\n"); + print_keys(expected_key_3, drkey.key); + error_count += 1; + } + + // test IPv4 as IPv6 addresses + uint8_t src_addr_ipv6[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0a, 0xf8, 0x02, 0x02 }; // 10.248.2.2 + uint8_t dst_addr_ipv6[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x0a, 0xf8, 0x05, 0x05 }; // 10.248.5.5 + + src_host_addr.addr = &src_addr_ipv6; + src_host_addr.type_length = 0x03; + dst_host_addr.addr = &dst_addr_ipv6; + dst_host_addr.type_length = 0x03; + + lf_drkey_derive_host_host_from_as_as(&kmw->drkey_ctx, &as_as_drkey, + &src_host_addr, &dst_host_addr, 0, &drkey); + + if (memcmp(expected_key_2, drkey.key, sizeof expected_key_2) != 0) { + printf("Error: DRKey derivation wrong\n"); + print_keys(expected_key_2, drkey.key); + error_count += 1; + } + + free_test_context(km); + + return error_count; +} + +/** + * Test that the config replacement changes keys as expected. + * + * @return int + */ +int +test4() +{ + int res = 0, error_count = 0; + struct lf_keymanager *km = NULL; + struct lf_config *config1 = NULL; + struct lf_config *config3 = NULL; + uint64_t ns_timestamp = 1702422000 * LF_TIME_NS_IN_S; + + struct lf_keymanager_dictionary_key key; + struct lf_keyfetcher_sv_dictionary_data *shared_secret_node; + struct lf_keymanager_key_container asas_key1, asas_key3; + + km = new_test_context(); + if (km == NULL) { + return 1; + } + + config1 = lf_config_new_from_file(TEST1_JSON); + if (config1 == NULL) { + printf("Error: lf_config_new_from_file\n"); + error_count = 1; + goto exit; + } + + res = lf_keymanager_apply_config(km, config1); + if (res != 0) { + printf("Error: lf_keymanager_apply_config\n"); + error_count = 1; + goto exit; + } + + key.as = config1->peers->isd_as; + key.drkey_protocol = config1->peers->drkey_protocol; + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, km->src_as, key.as, + key.drkey_protocol, ns_timestamp, &asas_key1); + if (res != 0) { + printf("Error: lf_keymanager_derive_shared_key\n"); + error_count += 1; + } + + config3 = lf_config_new_from_file(TEST3_JSON); + if (config3 == NULL) { + printf("Error: lf_config_new_from_file\n"); + error_count = 1; + goto exit; + } + + // apply new config with additional key + res = lf_keymanager_apply_config(km, config3); + if (res != 0) { + printf("Error: lf_keymanager_apply_config\n"); + error_count = 1; + goto exit; + } + + res = rte_hash_lookup_data(km->fetcher->dict, &key, + (void **)&shared_secret_node); + if (res != 0) { + printf("Error: rte_hash_lookup_data\n"); + error_count = 1; + goto exit; + } + + res = lf_keyfetcher_fetch_as_as_key(km->fetcher, km->src_as, key.as, + key.drkey_protocol, ns_timestamp, &asas_key3); + if (res != 0) { + printf("Error: lf_keymanager_derive_shared_key\n"); + error_count += 1; + } + + if (memcmp(asas_key1.key.key, asas_key3.key.key, + sizeof asas_key1.key.key) == 0) { + printf("Error: Key replacement failed\n"); + error_count += 1; + } + +exit: + if (config3 != NULL) { + free(config3); + } + if (config1 != NULL) { + free(config1); + } + if (km != NULL) { + free_test_context(km); + } + + return error_count; +} + int main(int argc, char *argv[]) { @@ -298,6 +516,8 @@ main(int argc, char *argv[]) error_counter += test1(); error_counter += test2(); + error_counter += test3(); + error_counter += test4(); if (error_counter > 0) { printf("Error Count: %d\n", error_counter); diff --git a/src/test/keymanager_test1.json b/src/test/keymanager_test1.json index e20ba40..8867400 100644 --- a/src/test/keymanager_test1.json +++ b/src/test/keymanager_test1.json @@ -1,13 +1,26 @@ { "isd_as": "1-1", + "drkey_protocol": 3, "peers": [ { "isd_as": "2-1", - "drkey_protocol": 3 + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] }, { "isd_as": "4-0", - "drkey_protocol": 3 + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0000000000000000fedcba9876543210", + "not_before": "2023-11-29T00:00:00" + } + ] } ] } \ No newline at end of file diff --git a/src/test/keymanager_test2.json b/src/test/keymanager_test2.json index 72df355..f8c79bb 100644 --- a/src/test/keymanager_test2.json +++ b/src/test/keymanager_test2.json @@ -1,13 +1,26 @@ { "isd_as": "2-1", + "drkey_protocol": 3, "peers": [ { "isd_as": "1-1", - "drkey_protocol": 3 + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] }, { "isd_as": "4-0", - "drkey_protocol": 3 + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0000000000000000fedcba9876543210", + "not_before": "2023-11-29T00:00:00" + } + ] } ] } \ No newline at end of file diff --git a/src/test/keymanager_test3.json b/src/test/keymanager_test3.json new file mode 100644 index 0000000..be1b285 --- /dev/null +++ b/src/test/keymanager_test3.json @@ -0,0 +1,20 @@ +{ + "isd_as": "1-1", + "drkey_protocol": 3, + "peers": [ + { + "isd_as": "2-1", + "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + }, + { + "sv": "fedcba9876543210fedcba9876543210", + "not_before": "2023-12-01T00:00:00" + } + ] + } + ] +} \ No newline at end of file diff --git a/test/testnet_ip/config/lf1.json b/test/testnet_ip/config/lf1.json index 693d959..0474f75 100644 --- a/test/testnet_ip/config/lf1.json +++ b/test/testnet_ip/config/lf1.json @@ -13,7 +13,13 @@ "ratelimit": { "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 - } + }, + "shared_secrets": [ + { + "sv": "00000000000000000123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] }, { "isd_as": "2-1", @@ -22,7 +28,13 @@ "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 }, - "ip": "10.248.2.1" + "ip": "10.248.2.1", + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] } ], "inbound": { diff --git a/test/testnet_ip/config/lf2.json b/test/testnet_ip/config/lf2.json index 0789af9..4e58643 100644 --- a/test/testnet_ip/config/lf2.json +++ b/test/testnet_ip/config/lf2.json @@ -13,7 +13,13 @@ "ratelimit": { "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 - } + }, + "shared_secrets": [ + { + "sv": "0123456789abcdef0000000000000000", + "not_before": "2023-11-29T00:00:00" + } + ] }, { "isd_as": "1-1", @@ -22,7 +28,13 @@ "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 }, - "ip": "10.248.1.1" + "ip": "10.248.1.1", + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ] } ], "inbound": { diff --git a/test/testnet_scion/README.md b/test/testnet_scion/README.md index 81f3b3a..2063049 100644 --- a/test/testnet_scion/README.md +++ b/test/testnet_scion/README.md @@ -32,20 +32,21 @@ To remove the network run The LightningFilter documentation provides instructions to install SCION on a machine (see [docs/SCION.md](../../docs/SCION.md)). For the test setup the following SCION modules are required: -control service (cs), border router (posix-router), dispatcher (dispatcher), daemon (daemon), and the PKI (scion-pki). +control service (control), border router (router), dispatcher (dispatcher), daemon (daemon), and the PKI (scion-pki), and SCION tools like ping (scion). For that run following code in the SCION directory: ``` -go build -o ./bin/ ./go/cs/ -go build -o ./bin/ ./go/posix-router/ -go build -o ./bin/ ./go/dispatcher/ -go build -o ./bin/ ./go/daemon/ -go build -o ./bin/ ./go/scion-pki/ +go build -o ./bin/ ./control/cmd/control +go build -o ./bin/ ./daemon/cmd/daemon +go build -o ./bin/ ./dispatcher/cmd/dispatcher +go build -o ./bin/ ./router/cmd/router +go build -o ./bin/ ./scion/cmd/scion +go build -o ./bin/ ./scion-pki/cmd/scion-pki ``` Optionally also build the SIG: ``` -go build -o ./bin/ ./go/posix-gateway/ +go build -o ./bin/ ./gateway/cmd/gateway ``` ### SCION Topology diff --git a/test/testnet_scion/config/lf_1_ff00_0_111.json b/test/testnet_scion/config/lf_1_ff00_0_111.json index d459300..e780ac0 100644 --- a/test/testnet_scion/config/lf_1_ff00_0_111.json +++ b/test/testnet_scion/config/lf_1_ff00_0_111.json @@ -10,6 +10,12 @@ { "isd_as": "1-ff00:0:112", "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ], "ratelimit": { "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 diff --git a/test/testnet_scion/config/lf_1_ff00_0_112.json b/test/testnet_scion/config/lf_1_ff00_0_112.json index cf2c26d..79c6cfd 100644 --- a/test/testnet_scion/config/lf_1_ff00_0_112.json +++ b/test/testnet_scion/config/lf_1_ff00_0_112.json @@ -5,10 +5,17 @@ "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 }, + "peers": [ { "isd_as": "1-ff00:0:111", "drkey_protocol": 3, + "shared_secrets": [ + { + "sv": "0123456789abcdef0123456789abcdef", + "not_before": "2023-11-29T00:00:00" + } + ], "ratelimit": { "byte_rate": 9223372036854775807, "packet_rate": 9223372036854775807 diff --git a/test/testnet_scion/scion/gen-topo.sh b/test/testnet_scion/scion/gen-topo.sh index 3624a01..191508b 100755 --- a/test/testnet_scion/scion/gen-topo.sh +++ b/test/testnet_scion/scion/gen-topo.sh @@ -16,7 +16,10 @@ export PYTHONPATH=. printf '#!/bin/bash\necho "0.0.0.0"' > tools/docker-ip echo "Create topology, configuration, and execution files." -python/topology/generator.py -c $SCRIPTPATH/tiny.topo -o $SCRIPTPATH/tmp +tools/topogen.py -c $SCRIPTPATH/tiny.topo -o $SCRIPTPATH/tmp + +export PYTHONPATH=. +$SCRIPTPATH/scion-topo-add-drkey.py popd > /dev/null diff --git a/test/testnet_scion/scion/scion-topo-add-drkey.py b/test/testnet_scion/scion/scion-topo-add-drkey.py new file mode 100755 index 0000000..dd67291 --- /dev/null +++ b/test/testnet_scion/scion/scion-topo-add-drkey.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python3 +import os +from plumbum import local +from acceptance.common import scion + +def main(): + gen_dir = local.path(os.path.dirname(__file__) + "/tmp") + isd_ases = scion.ASList.load(gen_dir / "as_list.yml").all + + for isd_as in isd_ases: + conf_dir = gen_dir / ("AS" + isd_as.as_file_fmt()) + scion.update_toml({ + "drkey": { + "level1_db": { + "connection": "gen-cache/cs%s-1.drkey_level1.db" % isd_as.file_fmt(), + }, + "secret_value_db": { + "connection": "gen-cache/cs%s-1.secret_value.db" % isd_as.file_fmt() + } + } + }, conf_dir // "cs*-1.toml") + scion.update_toml({ + "drkey_level2_db": { + "connection": "gen-cache/sd%s.drkey_level2.db" % isd_as.file_fmt() + } + }, conf_dir // "sd.toml") + +if __name__ == "__main__": + main() diff --git a/test/testnet_scion/scion/template/ASff00_0_110/cs1-ff00_0_110-1.toml b/test/testnet_scion/scion/template/ASff00_0_110/cs1-ff00_0_110-1.toml index 5e6a0ff..947f4b4 100644 --- a/test/testnet_scion/scion/template/ASff00_0_110/cs1-ff00_0_110-1.toml +++ b/test/testnet_scion/scion/template/ASff00_0_110/cs1-ff00_0_110-1.toml @@ -31,11 +31,8 @@ mode = "in-process" [log.console] level = "debug" -[drkey.lvl1_db] -connection = "gen-cache/cs1-ff00_0_110-1.lvl1.db" +[drkey.level1_db] +connection = "gen-cache/cs1-ff00_0_110-1.drkey_level1.db" -[drkey.sv_db] -connection = "gen-cache/cs1-ff00_0_110-1.sv.db" - -[drkey.delegation] -colibri = [ "127.0.0.11", "127.0.0.1",] +[drkey.secret_value_db] +connection = "gen-cache/cs1-ff00_0_110-1.secret_value.db" diff --git a/test/testnet_scion/scion/template/ASff00_0_110/sd.toml b/test/testnet_scion/scion/template/ASff00_0_110/sd.toml index 27a3795..ad2fa98 100644 --- a/test/testnet_scion/scion/template/ASff00_0_110/sd.toml +++ b/test/testnet_scion/scion/template/ASff00_0_110/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_110.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_110.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_110.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_110.drkey_level2.db" [sd] address = "127.0.0.13:30255" -bind_dialer_to_address = true [tracing] enabled = true diff --git a/test/testnet_scion/scion/template/ASff00_0_111/cs1-ff00_0_111-1.toml b/test/testnet_scion/scion/template/ASff00_0_111/cs1-ff00_0_111-1.toml index ea766ec..546c291 100644 --- a/test/testnet_scion/scion/template/ASff00_0_111/cs1-ff00_0_111-1.toml +++ b/test/testnet_scion/scion/template/ASff00_0_111/cs1-ff00_0_111-1.toml @@ -28,11 +28,8 @@ addr = "127.0.0.19:31152" [log.console] level = "debug" -[drkey.lvl1_db] -connection = "gen-cache/cs1-ff00_0_111-1.lvl1.db" +[drkey.level1_db] +connection = "gen-cache/cs1-ff00_0_111-1.drkey_level1.db" -[drkey.sv_db] -connection = "gen-cache/cs1-ff00_0_111-1.sv.db" - -[drkey.delegation] -colibri = [ "10.248.7.1", "10.248.7.2",] +[drkey.secret_value_db] +connection = "gen-cache/cs1-ff00_0_111-1.secret_value.db" diff --git a/test/testnet_scion/scion/template/ASff00_0_111/sd.toml b/test/testnet_scion/scion/template/ASff00_0_111/sd.toml index 4965ef1..04414dc 100644 --- a/test/testnet_scion/scion/template/ASff00_0_111/sd.toml +++ b/test/testnet_scion/scion/template/ASff00_0_111/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_111.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_111.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_111.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_111.drkey_level2.db" [sd] address = "127.0.0.20:30255" -bind_dialer_to_address = true [tracing] enabled = true diff --git a/test/testnet_scion/scion/template/ASff00_0_112/cs1-ff00_0_112-1.toml b/test/testnet_scion/scion/template/ASff00_0_112/cs1-ff00_0_112-1.toml index 9a21caa..b009f9c 100644 --- a/test/testnet_scion/scion/template/ASff00_0_112/cs1-ff00_0_112-1.toml +++ b/test/testnet_scion/scion/template/ASff00_0_112/cs1-ff00_0_112-1.toml @@ -28,11 +28,8 @@ addr = "127.0.0.27:31152" [log.console] level = "debug" -[drkey.lvl1_db] -connection = "gen-cache/cs1-ff00_0_112-1.lvl1.db" +[drkey.level1_db] +connection = "gen-cache/cs1-ff00_0_112-1.drkey_level1.db" -[drkey.sv_db] -connection = "gen-cache/cs1-ff00_0_112-1.sv.db" - -[drkey.delegation] -colibri = [ "10.248.8.1", "10.248.8.2",] +[drkey.secret_value_db] +connection = "gen-cache/cs1-ff00_0_112-1.secret_value.db" diff --git a/test/testnet_scion/scion/template/ASff00_0_112/sd.toml b/test/testnet_scion/scion/template/ASff00_0_112/sd.toml index 378142c..8919362 100644 --- a/test/testnet_scion/scion/template/ASff00_0_112/sd.toml +++ b/test/testnet_scion/scion/template/ASff00_0_112/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_112.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_112.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_112.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_112.drkey_level2.db" [sd] address = "127.0.0.28:30255" -bind_dialer_to_address = true [tracing] enabled = true diff --git a/test/testnet_scion/scion/template/supervisord.conf b/test/testnet_scion/scion/template/supervisord.conf index bb91cb8..8ab5829 100644 --- a/test/testnet_scion/scion/template/supervisord.conf +++ b/test/testnet_scion/scion/template/supervisord.conf @@ -8,7 +8,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_110/br1-ff00_0_110-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_110/br1-ff00_0_110-1.toml [program:br1-ff00_0_110-2] autostart = false @@ -20,7 +20,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_110/br1-ff00_0_110-2.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_110/br1-ff00_0_110-2.toml [program:cs1-ff00_0_110-1] autostart = false @@ -32,7 +32,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/cs --config gen/ASff00_0_110/cs1-ff00_0_110-1.toml +command = %(ENV_SCION_BIN)s/control --config gen/ASff00_0_110/cs1-ff00_0_110-1.toml [program:sd1-ff00_0_110] autostart = false @@ -59,7 +59,7 @@ redirect_stderr = True startretries = 0 startsecs = 5 priority = 100 -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_111/br1-ff00_0_111-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_111/br1-ff00_0_111-1.toml [program:cs1-ff00_0_111-1] autostart = false @@ -71,7 +71,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/cs --config gen/ASff00_0_111/cs1-ff00_0_111-1.toml +command = %(ENV_SCION_BIN)s/control --config gen/ASff00_0_111/cs1-ff00_0_111-1.toml [program:sd1-ff00_0_111] autostart = false @@ -99,7 +99,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_112/br1-ff00_0_112-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_112/br1-ff00_0_112-1.toml [program:cs1-ff00_0_112-1] autostart = false @@ -111,7 +111,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/cs --config gen/ASff00_0_112/cs1-ff00_0_112-1.toml +command = %(ENV_SCION_BIN)s/control --config gen/ASff00_0_112/cs1-ff00_0_112-1.toml [program:sd1-ff00_0_112] autostart = false @@ -176,7 +176,7 @@ startsecs = 5 priority = 10 user = root environment = SCION_DISPATCHER="/run/shm/dispatcher/endhost1-ff00_0_111.sock" -command = ip netns exec far-0 %(ENV_SCION_BIN)s/posix-gateway --config gen-eh/ASff00_0_111/sig.toml +command = ip netns exec far-0 %(ENV_SCION_BIN)s/gateway --config gen-eh/ASff00_0_111/sig.toml [program:sd1-ff00_0_112-eh] autostart = false @@ -213,7 +213,7 @@ startsecs = 5 priority = 10 user = root environment = SCION_DISPATCHER="/run/shm/dispatcher/endhost1-ff00_0_112.sock" -command = ip netns exec far-1 %(ENV_SCION_BIN)s/posix-gateway --config gen-eh/ASff00_0_112/sig.toml +command = ip netns exec far-1 %(ENV_SCION_BIN)s/gateway --config gen-eh/ASff00_0_112/sig.toml [group:sig-eh] programs = sig1-ff00_0_111-eh,sig1-ff00_0_112-eh \ No newline at end of file diff --git a/test/testnet_scion/scion/template6/supervisord.conf b/test/testnet_scion/scion/template6/supervisord.conf index bb91cb8..890ad20 100644 --- a/test/testnet_scion/scion/template6/supervisord.conf +++ b/test/testnet_scion/scion/template6/supervisord.conf @@ -8,7 +8,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_110/br1-ff00_0_110-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_110/br1-ff00_0_110-1.toml [program:br1-ff00_0_110-2] autostart = false @@ -20,7 +20,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_110/br1-ff00_0_110-2.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_110/br1-ff00_0_110-2.toml [program:cs1-ff00_0_110-1] autostart = false @@ -59,7 +59,7 @@ redirect_stderr = True startretries = 0 startsecs = 5 priority = 100 -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_111/br1-ff00_0_111-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_111/br1-ff00_0_111-1.toml [program:cs1-ff00_0_111-1] autostart = false @@ -99,7 +99,7 @@ startretries = 0 startsecs = 5 priority = 100 user = %(ENV_SCION_USER)s -command = %(ENV_SCION_BIN)s/posix-router --config gen/ASff00_0_112/br1-ff00_0_112-1.toml +command = %(ENV_SCION_BIN)s/router --config gen/ASff00_0_112/br1-ff00_0_112-1.toml [program:cs1-ff00_0_112-1] autostart = false @@ -176,7 +176,7 @@ startsecs = 5 priority = 10 user = root environment = SCION_DISPATCHER="/run/shm/dispatcher/endhost1-ff00_0_111.sock" -command = ip netns exec far-0 %(ENV_SCION_BIN)s/posix-gateway --config gen-eh/ASff00_0_111/sig.toml +command = ip netns exec far-0 %(ENV_SCION_BIN)s/gateway --config gen-eh/ASff00_0_111/sig.toml [program:sd1-ff00_0_112-eh] autostart = false @@ -213,7 +213,7 @@ startsecs = 5 priority = 10 user = root environment = SCION_DISPATCHER="/run/shm/dispatcher/endhost1-ff00_0_112.sock" -command = ip netns exec far-1 %(ENV_SCION_BIN)s/posix-gateway --config gen-eh/ASff00_0_112/sig.toml +command = ip netns exec far-1 %(ENV_SCION_BIN)s/gateway --config gen-eh/ASff00_0_112/sig.toml [group:sig-eh] programs = sig1-ff00_0_111-eh,sig1-ff00_0_112-eh \ No newline at end of file diff --git a/test/testnet_scion/scion/template_eh/ASff00_0_111/sd.toml b/test/testnet_scion/scion/template_eh/ASff00_0_111/sd.toml index 59a65f2..331006b 100644 --- a/test/testnet_scion/scion/template_eh/ASff00_0_111/sd.toml +++ b/test/testnet_scion/scion/template_eh/ASff00_0_111/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_111-eh.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_111-eh.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_111-eh.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_111-eh.drkey_level2.db" [sd] address = "10.248.3.1:30255" -bind_dialer_to_address = true [tracing] enabled = false diff --git a/test/testnet_scion/scion/template_eh/ASff00_0_112/sd.toml b/test/testnet_scion/scion/template_eh/ASff00_0_112/sd.toml index 065890a..eba251d 100644 --- a/test/testnet_scion/scion/template_eh/ASff00_0_112/sd.toml +++ b/test/testnet_scion/scion/template_eh/ASff00_0_112/sd.toml @@ -9,12 +9,11 @@ connection = "gen-cache/sd1-ff00_0_112-eh.trust.db" [path_db] connection = "gen-cache/sd1-ff00_0_112-eh.path.db" -[drkey_lvl2_db] -connection = "gen-cache/sd1-ff00_0_112-eh.drkey.db" +[drkey_level2_db] +connection = "gen-cache/sd1-ff00_0_112-eh.drkey_level2.db" [sd] address = "10.248.6.1:30255" -bind_dialer_to_address = true [tracing] enabled = false diff --git a/usertools/install_deps.sh b/usertools/install_deps.sh index 22683c4..3f99936 100755 --- a/usertools/install_deps.sh +++ b/usertools/install_deps.sh @@ -63,9 +63,9 @@ popd && popd && popd ####################################### pushd $DEP_DIR # Get source -curl -LO https://go.dev/dl/go1.17.9.linux-amd64.tar.gz -echo "9dacf782028fdfc79120576c872dee488b81257b1c48e9032d122cfdb379cca6 go1.17.9.linux-amd64.tar.gz" | sha256sum -c -sudo tar -C $DEP_DIR -xzf go1.17.9.linux-amd64.tar.gz +curl -LO https://golang.org/dl/go1.21.2.linux-amd64.tar.gz +echo "f5414a770e5e11c6e9674d4cd4dd1f4f630e176d1828d3427ea8ca4211eee90d go1.21.2.linux-amd64.tar.gz" | sha256sum -c +sudo tar -C $DEP_DIR -xzf go1.21.2.linux-amd64.tar.gz # Add to PATH echo >> $ENV_VARS_FILE echo "# set PATH so it includes Go" >> $ENV_VARS_FILE