diff --git a/.github/actions/install-node-and-deps/action.yml b/.github/actions/install-node-and-deps/action.yml index 96f6c2525b..06e25b5d7a 100644 --- a/.github/actions/install-node-and-deps/action.yml +++ b/.github/actions/install-node-and-deps/action.yml @@ -4,7 +4,7 @@ inputs: node-version: description: Node Version required: true - default: '~16' + default: 18 runs: using: composite steps: diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6c9ee3b7cc..23954a6a9b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -13,3 +13,31 @@ updates: interval: "monthly" commit-message: prefix: "dev" + + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + commit-message: + prefix: "dev" + + - package-ecosystem: "gomod" + directory: "/" + schedule: + interval: "monthly" + commit-message: + prefix: "dev" + + - package-ecosystem: "gomod" + directory: "/tools" + schedule: + interval: "monthly" + commit-message: + prefix: "dev" + + - package-ecosystem: "docker" + directory: "/" + schedule: + interval: "monthly" + commit-message: + prefix: "dev" diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index ac9998e30a..3ace77ac5b 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -85,7 +85,7 @@ jobs: args: -h postgres -U root ttn_lorawan_is_store_test - name: Configure AWS Credentials if: "${{ env.AWS_REGION != '' }}" - uses: aws-actions/configure-aws-credentials@v1-node16 + uses: aws-actions/configure-aws-credentials@v2 with: aws-region: "${{ secrets.AWS_REGION }}" role-to-assume: "arn:aws:iam::${{ secrets.AWS_USER_ID }}:role/${{ secrets.AWS_ROLE_NAME }}" diff --git a/.github/workflows/release-rc.yml b/.github/workflows/release-rc.yml index ad3e956bf2..e8ed4f3e5b 100644 --- a/.github/workflows/release-rc.yml +++ b/.github/workflows/release-rc.yml @@ -64,9 +64,9 @@ jobs: export RC_VERSION=${RC_VERSION#release/v} echo "rc_version=$RC_VERSION" >> $GITHUB_OUTPUT - name: Run Goreleaser - uses: goreleaser/goreleaser-action@v3 + uses: goreleaser/goreleaser-action@v4 with: - version: "v1.9.2" + version: "v1.18.2" args: release --config .goreleaser.snapshot.yml --snapshot --timeout 60m env: SIGN_KEY_NAME: ${{ secrets.SIGN_KEY_NAME }} diff --git a/.github/workflows/release-snapshot.yml b/.github/workflows/release-snapshot.yml index e000ddbd97..442ec0be5f 100644 --- a/.github/workflows/release-snapshot.yml +++ b/.github/workflows/release-snapshot.yml @@ -55,9 +55,9 @@ jobs: printf '%s' '${{ secrets.SIGNATURE_PASSPHRASE }}' >/tmp/gpg_passphrase cat /tmp/gpg_passphrase | gpg --passphrase-fd 0 --no-tty --batch --import gpg_signing_key - name: Run Goreleaser - uses: goreleaser/goreleaser-action@v3 + uses: goreleaser/goreleaser-action@v4 with: - version: "v1.9.2" + version: "v1.18.2" args: release --config .goreleaser.snapshot.yml --snapshot --timeout 60m env: SIGN_KEY_NAME: ${{ secrets.SIGN_KEY_NAME }} diff --git a/.github/workflows/release-tag.yml b/.github/workflows/release-tag.yml index ff2d16f8eb..0c587d32b2 100644 --- a/.github/workflows/release-tag.yml +++ b/.github/workflows/release-tag.yml @@ -45,7 +45,7 @@ jobs: git push origin v${{ steps.version.outputs.result }} fi - name: Configure AWS Credentials - uses: aws-actions/configure-aws-credentials@v1-node16 + uses: aws-actions/configure-aws-credentials@v2 with: aws-region: "${{ secrets.AWS_REGION }}" role-to-assume: "arn:aws:iam::${{ secrets.AWS_USER_ID }}:role/${{ secrets.AWS_ROLE_NAME }}" @@ -105,9 +105,9 @@ jobs: printf '%s' '${{ secrets.SIGNATURE_PASSPHRASE }}' >/tmp/gpg_passphrase cat /tmp/gpg_passphrase | gpg --passphrase-fd 0 --no-tty --batch --import gpg_signing_key - name: Run Goreleaser - uses: goreleaser/goreleaser-action@v3 + uses: goreleaser/goreleaser-action@v4 with: - version: "v1.9.2" + version: "v1.18.2" args: release --config .goreleaser.release.yml --release-notes /tmp/release-notes.md --timeout 120m env: SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_LOGIN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 46e02cd1ee..30246ee4b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ For details about compatibility between different releases, see the **Commitment ### Added +- New Admin Panel in the Console. + ### Changed ### Deprecated @@ -21,10 +23,34 @@ For details about compatibility between different releases, see the **Commitment - Console not applying webhook field masks when creating a webhook from a template that has field masks set. - Removing user invitations not working in the user management panel for administrators. +- Fix payload formatter page launching malformed requests in the Console. +- HTTP API routes for parsing QR codes for the QR Generator service. We exercise our right to break compatibility with third party HTTP clients since this is a bug. + - `/qr-code/end-devices/parse` is changed to `/qr-codes/end-devices/parse`. + - `/qr-code/end-devices/{format_id}/parse` is changed to `/qr-codes/end-devices/{format_id}/parse`. ### Security -## [3.25.2] - unreleased +## [3.26.1] - 2023-06-20 + +### Added + +- Support claim in device import in the Console. + +## [3.26.0] - 2023-06-06 + +### Added + +- Support for scanning a QR code that only contains the hexadecimal encoded DevEUI. +- Experimental flag `ns.adr.auto_narrow_steer`. When enabled, end devices which do not have an explicit channel steering mode will be steered towards the LoRa narrow channels. + +### Fixed + +- Console not applying webhook field masks when creating a webhook from a template that has field masks set. +- LoRa Basics Station `PONG` messages will now contain the application payload of the associated `PING`, as required by the WebSockets specification. + - This fix enables `PING`/`PONG` behavior for non reference implementations of the LNS protocol. +- Fix crash of "Edit webhook" view due to invalid Authorization header encoding in the Console. + +## [3.25.2] - 2023-05-16 ### Added @@ -98,7 +124,7 @@ For details about compatibility between different releases, see the **Commitment - Device claiming that transfer devices between applications is now deprecated and will be removed in a future version of The Things Stack. Device claiming on Join Servers, including The Things Join Server, remains functional. This deprecates the following components: - API for managing application claim authorization (`EndDeviceClaimingServer.AuthorizeApplication` and `EndDeviceClaimingServer.UnauthorizeApplication`) - CLI commands to manage application claim settings (`ttn-lw-cli application claim [authorize|unauthorize]`) - - CLI command to claim end devices (`ttn-lw-cli devices claim`) + - CLI command to claim end devices (`ttn-lw-cli devices claim`) ### Fixed @@ -232,10 +258,10 @@ For details about compatibility between different releases, see the **Commitment ### Changed - Option to ignore logs from selected gRPC methods now supports ignoring logs for selected errors on method. - Examples: - - `--grpc.log-ignore-methods="/ttn.lorawan.v3.GsNs/HandleUplink"`: log is skipped when no error occurs. - - `--grpc.log-ignore-methods="/ttn.lorawan.v3.GsNs/HandleUplink:pkg/networkserver:duplicate_uplink;pkg/networkserver:device_not_found"`: log is skipped when either `pkg/networkserver:duplicate_uplink` or `pkg/networkserver:device_not_found` error occurs (but not on success). - - `--grpc.log-ignore-methods="/ttn.lorawan.v3.GsNs/HandleUplink:;pkg/networkserver:duplicate_uplink"`: log is skipped on success or when `pkg/networkserver:duplicate_uplink` error occurs. + Examples: + - `--grpc.log-ignore-methods="/ttn.lorawan.v3.GsNs/HandleUplink"`: log is skipped when no error occurs. + - `--grpc.log-ignore-methods="/ttn.lorawan.v3.GsNs/HandleUplink:pkg/networkserver:duplicate_uplink;pkg/networkserver:device_not_found"`: log is skipped when either `pkg/networkserver:duplicate_uplink` or `pkg/networkserver:device_not_found` error occurs (but not on success). + - `--grpc.log-ignore-methods="/ttn.lorawan.v3.GsNs/HandleUplink:;pkg/networkserver:duplicate_uplink"`: log is skipped on success or when `pkg/networkserver:duplicate_uplink` error occurs. - The Gateway Server now takes into consideration the extra duty cycle checks present in the LoRa Basics Station forwarder. Previously the Gateway Server may accept the scheduling of downlinks which the packet forwarder would silently drop. - Note that in some rare cases in which the LoRa Basics Station duty cycle is stricter than the windowed approach used by The Things Stack, the scheduling will fail and this will be visible via `ns.down.data.schedule.fail` events. Note that this is actually a positive outcome - it allows the Network Server to schedule the downlink via another gateway, while previously the downlink would be scheduled but get silently dropped on the gateway. @@ -2582,7 +2608,9 @@ For details about compatibility between different releases, see the **Commitment NOTE: These links should respect backports. See https://github.com/TheThingsNetwork/lorawan-stack/pull/1444/files#r333379706. --> -[unreleased]: https://github.com/TheThingsNetwork/lorawan-stack/compare/v3.25.2...v3.25 +[unreleased]: https://github.com/TheThingsNetwork/lorawan-stack/compare/v3.26.1...v3.26 +[3.26.1]: https://github.com/TheThingsNetwork/lorawan-stack/compare/v3.26.0...v3.26.1 +[3.26.0]: https://github.com/TheThingsNetwork/lorawan-stack/compare/v3.25.2...v3.26.0 [3.25.2]: https://github.com/TheThingsNetwork/lorawan-stack/compare/v3.25.1...v3.25.2 [3.25.1]: https://github.com/TheThingsNetwork/lorawan-stack/compare/v3.25.0...v3.25.1 [3.25.0]: https://github.com/TheThingsNetwork/lorawan-stack/compare/v3.24.2...v3.25.0 diff --git a/CODEOWNERS b/CODEOWNERS index c1bad77190..51685c5e3a 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -11,17 +11,17 @@ /go.mod @johanstokking @adriansmares /go.sum @johanstokking @adriansmares /package.json @kschiffer @ryaplots -/yarn.lock @kschiffer @ryaplots -/sdk/js/package.json @kschiffer @ryaplots -/sdk/js/yarn.lock @kschiffer @ryaplots +/yarn.lock @kschiffer @ryaplots @mjamescompton +/sdk/js/package.json @kschiffer @ryaplots @mjamescompton +/sdk/js/yarn.lock @kschiffer @ryaplots @mjamescompton # Build pipeline and tooling /Makefile @adriansmares /tools @adriansmares /.github/workflows @adriansmares -/config @kschiffer @ryaplots +/config @kschiffer @ryaplots @mjamescompton /config/stack @benolayinka @KrishnaIyer -/cypress @kschiffer @ryaplots +/cypress @kschiffer @ryaplots @mjamescompton # API, configuration, CLI and storage compatibility /api/*.proto @johanstokking @adriansmares @@ -49,7 +49,7 @@ /pkg/rpcmiddleware @johanstokking @adriansmares /pkg/rpcserver @johanstokking @adriansmares /pkg/types @johanstokking -/pkg/web @kschiffer @ryaplots +/pkg/web @kschiffer @ryaplots @mjamescompton /pkg/webmiddleware @KrishnaIyer @kschiffer /pkg/webui @kschiffer @ryaplots @mjamescompton /pkg/ratelimit @johanstokking @KrishnaIyer @@ -77,7 +77,7 @@ /pkg/joinserver @johanstokking @adriansmares -/pkg/console @kschiffer @ryaplots +/pkg/console @kschiffer @ryaplots @mjamescompton /pkg/packetbrokeragent @johanstokking @adriansmares diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index ec81b0f670..203f295ed0 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -55,7 +55,7 @@ The Things Stack components are primarily built in Go, we use React for web fron ## Development Environment -The Things Network's development tooling uses [Mage](https://magefile.org/). Under the hood, `mage` calls other tools such as `git`, `go`, `yarn`, `docker` etc. Recent versions are supported; Node v16.x and Go v1.18.x. +The Things Network's development tooling uses [Mage](https://magefile.org/). Under the hood, `mage` calls other tools such as `git`, `go`, `yarn`, `docker` etc. Recent versions are supported; Node v18.x and Go v1.18.x. - Follow [Go's installation guide](https://golang.org/doc/install) to install Go. - Download Node.js [from their website](https://nodejs.org) and install it. diff --git a/Dockerfile b/Dockerfile index 8bc88c51f8..abbb673631 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,7 +12,7 @@ RUN rm -rf /srv/ttn-lorawan/lorawan-frequency-plans/.git COPY data/lorawan-webhook-templates /srv/ttn-lorawan/lorawan-webhook-templates RUN rm -rf /srv/ttn-lorawan/lorawan-webhook-templates/.git -FROM alpine:3.17 +FROM alpine:3.18 RUN addgroup -g 886 thethings && adduser -u 886 -S -G thethings thethings @@ -29,7 +29,7 @@ COPY public /srv/ttn-lorawan/public COPY --from=builder /srv/ttn-lorawan/lorawan-frequency-plans /srv/ttn-lorawan/lorawan-frequency-plans COPY --from=builder /srv/ttn-lorawan/lorawan-webhook-templates /srv/ttn-lorawan/lorawan-webhook-templates COPY data/lorawan-devices-index /srv/ttn-lorawan/lorawan-devices-index -RUN chown thethings:thethings -R /srv/ttn-lorawan/lorawan-devices-index +RUN chmod 755 -R /srv/ttn-lorawan/lorawan-devices-index EXPOSE 1700/udp 1881 8881 1882 8882 1883 8883 1884 8884 1885 8885 1887 8887 diff --git a/api/api.md b/api/api.md index befb5f20d8..3824c298f7 100644 --- a/api/api.md +++ b/api/api.md @@ -53,6 +53,7 @@ - [Message `ALCSyncCommand.AppTimeReq`](#ttn.lorawan.v3.ALCSyncCommand.AppTimeReq) - [Enum `ALCSyncCommandIdentifier`](#ttn.lorawan.v3.ALCSyncCommandIdentifier) - [File `lorawan-stack/api/applicationserver_integrations_storage.proto`](#lorawan-stack/api/applicationserver_integrations_storage.proto) + - [Message `ContinuationTokenPayload`](#ttn.lorawan.v3.ContinuationTokenPayload) - [Message `GetStoredApplicationUpCountRequest`](#ttn.lorawan.v3.GetStoredApplicationUpCountRequest) - [Message `GetStoredApplicationUpCountResponse`](#ttn.lorawan.v3.GetStoredApplicationUpCountResponse) - [Message `GetStoredApplicationUpCountResponse.CountEntry`](#ttn.lorawan.v3.GetStoredApplicationUpCountResponse.CountEntry) @@ -1294,6 +1295,19 @@ The NsAs service connects a Network Server to an Application Server. ## File `lorawan-stack/api/applicationserver_integrations_storage.proto` +### Message `ContinuationTokenPayload` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `limit` | [`google.protobuf.UInt32Value`](#google.protobuf.UInt32Value) | | | +| `after` | [`google.protobuf.Timestamp`](#google.protobuf.Timestamp) | | | +| `before` | [`google.protobuf.Timestamp`](#google.protobuf.Timestamp) | | | +| `f_port` | [`google.protobuf.UInt32Value`](#google.protobuf.UInt32Value) | | | +| `order` | [`string`](#string) | | | +| `field_mask` | [`google.protobuf.FieldMask`](#google.protobuf.FieldMask) | | | +| `last` | [`google.protobuf.Duration`](#google.protobuf.Duration) | | | +| `last_received_id` | [`int64`](#int64) | | | + ### Message `GetStoredApplicationUpCountRequest` | Field | Type | Label | Description | @@ -1339,6 +1353,7 @@ The NsAs service connects a Network Server to an Application Server. | `order` | [`string`](#string) | | Order results. | | `field_mask` | [`google.protobuf.FieldMask`](#google.protobuf.FieldMask) | | The names of the upstream message fields that should be returned. See the API reference for allowed field names for each type of upstream message. | | `last` | [`google.protobuf.Duration`](#google.protobuf.Duration) | | Query upstream messages that have arrived in the last minutes or hours. Cannot be used in conjunction with after and before. | +| `continuation_token` | [`string`](#string) | | The continuation token, which is used to retrieve the next page. If provided, other fields are ignored. | #### Field Rules @@ -1346,6 +1361,7 @@ The NsAs service connects a Network Server to an Application Server. | ----- | ----------- | | `type` |

`string.in`: `[ uplink_message uplink_normalized join_accept downlink_ack downlink_nack downlink_sent downlink_failed downlink_queued downlink_queue_invalidated location_solved service_data]`

| | `order` |

`string.in`: `[ -received_at received_at]`

| +| `continuation_token` |

`string.max_len`: `16000`

| ### Service `ApplicationUpStorage` @@ -2717,13 +2733,6 @@ in a future version of The Things Stack. | `qr_code` | [`bytes`](#bytes) | | Raw QR code contents. | | `target_application_ids` | [`ApplicationIdentifiers`](#ttn.lorawan.v3.ApplicationIdentifiers) | | Application identifiers of the target end device. | | `target_device_id` | [`string`](#string) | | End device ID of the target end device. If empty, use the source device ID. | -| `target_network_server_address` | [`string`](#string) | | The address of the Network Server where the device will be registered. If set and if the source device is currently registered on a Network Server, settings will be transferred. If not set, the device shall not be registered on a Network Server. | -| `target_network_server_kek_label` | [`string`](#string) | | The KEK label of the Network Server to use for wrapping network session keys. | -| `target_application_server_address` | [`string`](#string) | | The address of the Application Server where the device will be registered. If set and if the source device is currently registered on an Application Server, settings will be transferred. If not set, the device shall not be registered on an Application Server. | -| `target_application_server_kek_label` | [`string`](#string) | | The KEK label of the Application Server to use for wrapping the application session key. | -| `target_application_server_id` | [`string`](#string) | | The AS-ID of the Application Server to use. | -| `target_net_id` | [`bytes`](#bytes) | | Home NetID. | -| `invalidate_authentication_code` | [`bool`](#bool) | | If set, invalidate the authentication code with which the device gets claimed. This prohibits subsequent claiming requests. | #### Field Rules @@ -2732,12 +2741,6 @@ in a future version of The Things Stack. | `qr_code` |

`bytes.min_len`: `0`

`bytes.max_len`: `1024`

| | `target_application_ids` |

`message.required`: `true`

| | `target_device_id` |

`string.max_len`: `36`

`string.pattern`: `^[a-z0-9](?:[-]?[a-z0-9]){2,}$|^$`

| -| `target_network_server_address` |

`string.pattern`: `^(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*(?:[A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])(?::[0-9]{1,5})?$|^$`

| -| `target_network_server_kek_label` |

`string.max_len`: `2048`

| -| `target_application_server_address` |

`string.pattern`: `^(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*(?:[A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])(?::[0-9]{1,5})?$|^$`

| -| `target_application_server_kek_label` |

`string.max_len`: `2048`

| -| `target_application_server_id` |

`string.max_len`: `100`

| -| `target_net_id` |

`bytes.len`: `3`

| ### Message `ClaimEndDeviceRequest.AuthenticatedIdentifiers` @@ -8672,8 +8675,8 @@ The Pba service allows clients to manage peering through Packet Broker. | `GetFormat` | `GET` | `/api/v3/qr-codes/end-devices/formats/{format_id}` | | | `ListFormats` | `GET` | `/api/v3/qr-codes/end-devices/formats` | | | `Generate` | `POST` | `/api/v3/qr-codes/end-devices` | `*` | -| `Parse` | `POST` | `/api/v3/qr-code/end-devices/parse` | `*` | -| `Parse` | `POST` | `/api/v3/qr-code/end-devices/{format_id}/parse` | `*` | +| `Parse` | `POST` | `/api/v3/qr-codes/end-devices/parse` | `*` | +| `Parse` | `POST` | `/api/v3/qr-codes/end-devices/{format_id}/parse` | `*` | ## File `lorawan-stack/api/regional.proto` diff --git a/api/api.swagger.json b/api/api.swagger.json index 91ab76f16a..4321bba9e5 100644 --- a/api/api.swagger.json +++ b/api/api.swagger.json @@ -2331,6 +2331,13 @@ "in": "query", "required": false, "type": "string" + }, + { + "name": "continuation_token", + "description": "The continuation token, which is used to retrieve the next page. If provided, other fields are ignored.", + "in": "query", + "required": false, + "type": "string" } ], "tags": [ @@ -3935,6 +3942,13 @@ "in": "query", "required": false, "type": "string" + }, + { + "name": "continuation_token", + "description": "The continuation token, which is used to retrieve the next page. If provided, other fields are ignored.", + "in": "query", + "required": false, + "type": "string" } ], "tags": [ @@ -13832,15 +13846,15 @@ ] } }, - "/qr-code/end-devices/parse": { + "/qr-codes/end-devices": { "post": { - "summary": "Parse QR Codes of known formats and return the information contained within.", - "operationId": "EndDeviceQRCodeGenerator_Parse", + "summary": "Generates a QR code.", + "operationId": "EndDeviceQRCodeGenerator_Generate", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v3ParseEndDeviceQRCodeResponse" + "$ref": "#/definitions/v3GenerateQRCodeResponse" } }, "default": { @@ -13856,7 +13870,7 @@ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/v3ParseEndDeviceQRCodeRequest" + "$ref": "#/definitions/v3GenerateEndDeviceQRCodeRequest" } } ], @@ -13865,15 +13879,15 @@ ] } }, - "/qr-code/end-devices/{format_id}/parse": { - "post": { - "summary": "Parse QR Codes of known formats and return the information contained within.", - "operationId": "EndDeviceQRCodeGenerator_Parse2", + "/qr-codes/end-devices/formats": { + "get": { + "summary": "Returns the supported formats.", + "operationId": "EndDeviceQRCodeGenerator_ListFormats", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v3ParseEndDeviceQRCodeResponse" + "$ref": "#/definitions/v3QRCodeFormats" } }, "default": { @@ -13883,44 +13897,20 @@ } } }, - "parameters": [ - { - "name": "format_id", - "description": "QR code format identifier.\nEnumerate available formats with the rpc `ListFormats`.\nIf this field is not specified, the server will attempt to parse the data with each known format.", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "qr_code": { - "type": "string", - "format": "byte", - "description": "Raw QR code contents." - } - } - } - } - ], "tags": [ "EndDeviceQRCodeGenerator" ] } }, - "/qr-codes/end-devices": { - "post": { - "summary": "Generates a QR code.", - "operationId": "EndDeviceQRCodeGenerator_Generate", + "/qr-codes/end-devices/formats/{format_id}": { + "get": { + "summary": "Return the QR code format.", + "operationId": "EndDeviceQRCodeGenerator_GetFormat", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v3GenerateQRCodeResponse" + "$ref": "#/definitions/v3QRCodeFormat" } }, "default": { @@ -13932,12 +13922,11 @@ }, "parameters": [ { - "name": "body", - "in": "body", + "name": "format_id", + "description": "QR code format identifier. Enumerate available formats with rpc ListFormats in the EndDeviceQRCodeGenerator service.", + "in": "path", "required": true, - "schema": { - "$ref": "#/definitions/v3GenerateEndDeviceQRCodeRequest" - } + "type": "string" } ], "tags": [ @@ -13945,15 +13934,15 @@ ] } }, - "/qr-codes/end-devices/formats": { - "get": { - "summary": "Returns the supported formats.", - "operationId": "EndDeviceQRCodeGenerator_ListFormats", + "/qr-codes/end-devices/parse": { + "post": { + "summary": "Parse QR Codes of known formats and return the information contained within.", + "operationId": "EndDeviceQRCodeGenerator_Parse", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v3QRCodeFormats" + "$ref": "#/definitions/v3ParseEndDeviceQRCodeResponse" } }, "default": { @@ -13963,20 +13952,30 @@ } } }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/v3ParseEndDeviceQRCodeRequest" + } + } + ], "tags": [ "EndDeviceQRCodeGenerator" ] } }, - "/qr-codes/end-devices/formats/{format_id}": { - "get": { - "summary": "Return the QR code format.", - "operationId": "EndDeviceQRCodeGenerator_GetFormat", + "/qr-codes/end-devices/{format_id}/parse": { + "post": { + "summary": "Parse QR Codes of known formats and return the information contained within.", + "operationId": "EndDeviceQRCodeGenerator_Parse2", "responses": { "200": { "description": "A successful response.", "schema": { - "$ref": "#/definitions/v3QRCodeFormat" + "$ref": "#/definitions/v3ParseEndDeviceQRCodeResponse" } }, "default": { @@ -13989,10 +13988,25 @@ "parameters": [ { "name": "format_id", - "description": "QR code format identifier. Enumerate available formats with rpc ListFormats in the EndDeviceQRCodeGenerator service.", + "description": "QR code format identifier.\nEnumerate available formats with the rpc `ListFormats`.\nIf this field is not specified, the server will attempt to parse the data with each known format.", "in": "path", "required": true, "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "qr_code": { + "type": "string", + "format": "byte", + "description": "Raw QR code contents." + } + } + } } ], "tags": [ @@ -20102,36 +20116,6 @@ "target_device_id": { "type": "string", "description": "End device ID of the target end device. If empty, use the source device ID." - }, - "target_network_server_address": { - "type": "string", - "description": "The address of the Network Server where the device will be registered.\nIf set and if the source device is currently registered on a Network Server, settings will be transferred.\nIf not set, the device shall not be registered on a Network Server." - }, - "target_network_server_kek_label": { - "type": "string", - "description": "The KEK label of the Network Server to use for wrapping network session keys." - }, - "target_application_server_address": { - "type": "string", - "description": "The address of the Application Server where the device will be registered.\nIf set and if the source device is currently registered on an Application Server, settings will be transferred.\nIf not set, the device shall not be registered on an Application Server." - }, - "target_application_server_kek_label": { - "type": "string", - "description": "The KEK label of the Application Server to use for wrapping the application session key." - }, - "target_application_server_id": { - "type": "string", - "description": "The AS-ID of the Application Server to use." - }, - "target_net_id": { - "type": "string", - "format": "string", - "example": "000013", - "description": "Home NetID." - }, - "invalidate_authentication_code": { - "type": "boolean", - "description": "If set, invalidate the authentication code with which the device gets claimed. This prohibits subsequent claiming requests." } } }, diff --git a/api/applicationserver_integrations_storage.proto b/api/applicationserver_integrations_storage.proto index 4954f38e03..31d1ffec98 100644 --- a/api/applicationserver_integrations_storage.proto +++ b/api/applicationserver_integrations_storage.proto @@ -27,6 +27,17 @@ package ttn.lorawan.v3; option go_package = "go.thethings.network/lorawan-stack/v3/pkg/ttnpb"; +message ContinuationTokenPayload { + google.protobuf.UInt32Value limit = 1; + google.protobuf.Timestamp after = 2; + google.protobuf.Timestamp before = 3; + google.protobuf.UInt32Value f_port = 4; + string order = 5; + google.protobuf.FieldMask field_mask = 6; + google.protobuf.Duration last = 7; + int64 last_received_id = 8; +} + message GetStoredApplicationUpRequest { // Query upstream messages from all end devices of an application. Cannot be used in conjunction with end_device_ids. ApplicationIdentifiers application_ids = 1; @@ -68,7 +79,10 @@ message GetStoredApplicationUpRequest { google.protobuf.FieldMask field_mask = 9; // Query upstream messages that have arrived in the last minutes or hours. Cannot be used in conjunction with after and before. - google.protobuf.Duration last = 10; + google.protobuf.Duration last = 10 [deprecated = true]; + + // The continuation token, which is used to retrieve the next page. If provided, other fields are ignored. + string continuation_token = 11 [(validate.rules).string.max_len = 16000]; } message GetStoredApplicationUpCountRequest { diff --git a/api/deviceclaimingserver.proto b/api/deviceclaimingserver.proto index f7f2555737..633c1945a5 100644 --- a/api/deviceclaimingserver.proto +++ b/api/deviceclaimingserver.proto @@ -66,36 +66,16 @@ message ClaimEndDeviceRequest { ApplicationIdentifiers target_application_ids = 3 [(validate.rules).message.required = true]; // End device ID of the target end device. If empty, use the source device ID. string target_device_id = 4 [(validate.rules).string = {pattern: "^[a-z0-9](?:[-]?[a-z0-9]){2,}$|^$" , max_len: 36}]; - reserved 6; // target_join_eui - // The address of the Network Server where the device will be registered. - // If set and if the source device is currently registered on a Network Server, settings will be transferred. - // If not set, the device shall not be registered on a Network Server. - string target_network_server_address = 7 [(validate.rules).string.pattern = "^(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*(?:[A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])(?::[0-9]{1,5})?$|^$"]; - // The KEK label of the Network Server to use for wrapping network session keys. - string target_network_server_kek_label = 8 [(validate.rules).string.max_len = 2048]; - // The address of the Application Server where the device will be registered. - // If set and if the source device is currently registered on an Application Server, settings will be transferred. - // If not set, the device shall not be registered on an Application Server. - string target_application_server_address = 9 [(validate.rules).string.pattern = "^(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*(?:[A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])(?::[0-9]{1,5})?$|^$"]; - // The KEK label of the Application Server to use for wrapping the application session key. - string target_application_server_kek_label = 10 [(validate.rules).string.max_len = 2048]; - // The AS-ID of the Application Server to use. - string target_application_server_id = 11 [(validate.rules).string.max_len = 100]; - reserved 12; // target_join_server_address - // Home NetID. - bytes target_net_id = 13 [ - (validate.rules).bytes = { len: 3, ignore_empty: true }, - (thethings.json.field) = { - marshaler_func: "go.thethings.network/lorawan-stack/v3/pkg/types.MarshalHEXBytes", - unmarshaler_func: "go.thethings.network/lorawan-stack/v3/pkg/types.Unmarshal3Bytes" - }, - (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - type: STRING, format: "string", example: "\"000013\"" - } - ]; - // If set, invalidate the authentication code with which the device gets claimed. This prohibits subsequent claiming requests. - bool invalidate_authentication_code = 5; + reserved 5; // Deprecated: invalidate_authentication_code + reserved 6; // Deprecated: target_join_eui + reserved 7; // Deprecated: target_network_server_address + reserved 8; // Deprecated: target_network_server_kek_label + reserved 9; // Deprecated: target_application_server_address + reserved 10; // Deprecated: target_application_server_kek_label + reserved 11; // Deprecated: target_application_server_id + reserved 12; // Deprecated: target_join_server_address + reserved 13; // Deprecated: target_net_id } // DEPRECATED: Device claiming that transfers devices between applications is no longer supported and will be removed diff --git a/api/qrcodegenerator.proto b/api/qrcodegenerator.proto index 7e1b699092..b757b02b78 100644 --- a/api/qrcodegenerator.proto +++ b/api/qrcodegenerator.proto @@ -104,10 +104,10 @@ service EndDeviceQRCodeGenerator { // Parse QR Codes of known formats and return the information contained within. rpc Parse(ParseEndDeviceQRCodeRequest) returns (ParseEndDeviceQRCodeResponse){ option (google.api.http) = { - post: "/qr-code/end-devices/parse", + post: "/qr-codes/end-devices/parse", body: "*" additional_bindings { - post: "/qr-code/end-devices/{format_id}/parse" + post: "/qr-codes/end-devices/{format_id}/parse" body: "*" } }; diff --git a/cmd/internal/commands/config.go b/cmd/internal/commands/config.go index 76b00d4828..55d7676db4 100644 --- a/cmd/internal/commands/config.go +++ b/cmd/internal/commands/config.go @@ -24,9 +24,9 @@ import ( "gopkg.in/yaml.v2" ) -type configYml map[string]interface{} +type configYml map[string]any -func (c configYml) add(key string, value interface{}) { +func (c configYml) add(key string, value any) { k := strings.SplitN(key, ".", 2) if len(k) > 1 { sub, ok := c[k[0]] diff --git a/cmd/internal/io/io.go b/cmd/internal/io/io.go index 2086342376..b5368d7b94 100644 --- a/cmd/internal/io/io.go +++ b/cmd/internal/io/io.go @@ -28,7 +28,7 @@ import ( // Write output to Stdout. // Uses either JSON or formats using the configured template. -func Write(w io.Writer, format string, data interface{}) (err error) { +func Write(w io.Writer, format string, data any) (err error) { defer func() { fmt.Fprintln(w) }() @@ -40,14 +40,14 @@ func Write(w io.Writer, format string, data interface{}) (err error) { panic(fmt.Sprintf("unsupported value: %T", data)) } var prefix, sep, suffix []byte - var writeItem func(interface{}) error + var writeItem func(any) error switch format { case "json": jsonpb := jsonpb.TTN() jsonpb.Indent = " " encoder := jsonpb.NewEncoder(w) prefix, sep, suffix = []byte("["), []byte(", "), []byte("]") - writeItem = func(v interface{}) error { + writeItem = func(v any) error { return encoder.Encode(v) } default: @@ -57,7 +57,7 @@ func Write(w io.Writer, format string, data interface{}) (err error) { return err } sep = []byte("\n") - writeItem = func(v interface{}) error { + writeItem = func(v any) error { return tmpl.Execute(w, v) } } diff --git a/cmd/ttn-lw-cli/commands/applications_claim.go b/cmd/ttn-lw-cli/commands/applications_claim.go index 59a354ba30..aaaab6fb55 100644 --- a/cmd/ttn-lw-cli/commands/applications_claim.go +++ b/cmd/ttn-lw-cli/commands/applications_claim.go @@ -15,90 +15,40 @@ package commands import ( + "fmt" + "github.com/spf13/cobra" - "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/internal/api" - "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" ) var ( applicationClaim = &cobra.Command{ - Use: "claim", - Deprecated: "Device claiming is deprecated and will be removed.", - Short: "Manage claim settings in applications", + Use: "claim", + Short: "Manage claim settings in applications (DEPRECATED)", + Hidden: true, + RunE: func(cmd *cobra.Command, args []string) error { + return fmt.Errorf( + "this command is no longer supported. End device claiming is integrated into the device creation flow", + ) + }, } applicationClaimAuthorize = &cobra.Command{ - Use: "authorize [application-id]", - Deprecated: "Device claiming is deprecated and will be removed.", - Short: "Authorize an application for claiming (EXPERIMENTAL)", - Long: `Authorize an application for claiming (EXPERIMENTAL) - -The given API key must have devices and device keys read/write rights. If no API -key is provided, a new API key will be created.`, + Use: "authorize [application-id]", + Short: "Authorize an application for claiming (DEPRECATED)", + Hidden: true, RunE: func(cmd *cobra.Command, args []string) error { - appID := getApplicationID(cmd.Flags(), args) - if appID == nil { - return errNoApplicationID.New() - } - - expiryDate, err := getAPIKeyExpiry(cmd.Flags()) - if err != nil { - return err - } - - key, _ := cmd.Flags().GetString("api-key") - if key == "" { - is, err := api.Dial(ctx, config.IdentityServerGRPCAddress) - if err != nil { - return err - } - logger.Info("Creating API key") - apiKey, err := ttnpb.NewApplicationAccessClient(is).CreateAPIKey(ctx, &ttnpb.CreateApplicationAPIKeyRequest{ - ApplicationIds: appID, - Name: "Device Claiming", - Rights: []ttnpb.Right{ - ttnpb.Right_RIGHT_APPLICATION_DEVICES_READ, - ttnpb.Right_RIGHT_APPLICATION_DEVICES_READ_KEYS, - ttnpb.Right_RIGHT_APPLICATION_DEVICES_WRITE, - ttnpb.Right_RIGHT_APPLICATION_DEVICES_WRITE_KEYS, - }, - ExpiresAt: ttnpb.ProtoTime(expiryDate), - }) - if err != nil { - return err - } - key = apiKey.Key - } - - dcs, err := api.Dial(ctx, config.DeviceClaimingServerGRPCAddress) - if err != nil { - return err - } - _, err = ttnpb.NewEndDeviceClaimingServerClient(dcs).AuthorizeApplication(ctx, &ttnpb.AuthorizeApplicationRequest{ - ApplicationIds: appID, - ApiKey: key, - }) - return err + return fmt.Errorf( + "this command is no longer supported. End device claiming is integrated into the device creation flow", + ) }, } applicationClaimUnauthorize = &cobra.Command{ - Use: "unauthorize [application-id]", - Short: "Unauthorize an application for claiming (EXPERIMENTAL)", - Deprecated: "Device claiming is deprecated and will be removed.", + Use: "unauthorize [application-id]", + Short: "Unauthorize an application for claiming (DEPRECATED)", + Hidden: true, RunE: func(cmd *cobra.Command, args []string) error { - appID := getApplicationID(cmd.Flags(), args) - if appID == nil { - return errNoApplicationID.New() - } - - dcs, err := api.Dial(ctx, config.DeviceClaimingServerGRPCAddress) - if err != nil { - return err - } - - logger.Warn("Make sure to delete the API Key used for authorizing claiming as this is not done automatically") - - _, err = ttnpb.NewEndDeviceClaimingServerClient(dcs).UnauthorizeApplication(ctx, appID) - return err + return fmt.Errorf( + "this command is no longer supported. End device claiming is integrated into the device creation flow", + ) }, } ) diff --git a/cmd/ttn-lw-cli/commands/contact_info.go b/cmd/ttn-lw-cli/commands/contact_info.go index 413b431be3..adfe9fe018 100644 --- a/cmd/ttn-lw-cli/commands/contact_info.go +++ b/cmd/ttn-lw-cli/commands/contact_info.go @@ -31,7 +31,7 @@ func listContactInfo(entityID *ttnpb.EntityIdentifiers) ([]*ttnpb.ContactInfo, e return nil, err } fieldMask := ttnpb.FieldMask("contact_info") - var res interface{} + var res any switch id := entityID.GetIds().(type) { case *ttnpb.EntityIdentifiers_ApplicationIds: res, err = ttnpb.NewApplicationRegistryClient(is).Get(ctx, &ttnpb.GetApplicationRequest{ApplicationIds: id.ApplicationIds, FieldMask: fieldMask}) @@ -58,7 +58,7 @@ func updateContactInfo(entityID *ttnpb.EntityIdentifiers, updater func([]*ttnpb. return nil, err } fieldMask := ttnpb.FieldMask("contact_info") - var res interface{} + var res any switch id := entityID.GetIds().(type) { case *ttnpb.EntityIdentifiers_ApplicationIds: res, err = ttnpb.NewApplicationRegistryClient(is).Get(ctx, &ttnpb.GetApplicationRequest{ApplicationIds: id.ApplicationIds, FieldMask: fieldMask}) diff --git a/cmd/ttn-lw-cli/commands/end_devices.go b/cmd/ttn-lw-cli/commands/end_devices.go index 70953cd19f..d174e84b1e 100644 --- a/cmd/ttn-lw-cli/commands/end_devices.go +++ b/cmd/ttn-lw-cli/commands/end_devices.go @@ -15,11 +15,10 @@ package commands import ( - "bufio" "bytes" "context" "crypto/rand" - "encoding/hex" + "fmt" stdio "io" "mime" "os" @@ -33,7 +32,6 @@ import ( "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/internal/util" "go.thethings.network/lorawan-stack/v3/pkg/errors" "go.thethings.network/lorawan-stack/v3/pkg/log" - "go.thethings.network/lorawan-stack/v3/pkg/random" "go.thethings.network/lorawan-stack/v3/pkg/specification/macspec" "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" "go.thethings.network/lorawan-stack/v3/pkg/types" @@ -188,6 +186,10 @@ var ( "claim_generated_eui", "cannot claim end device with a randomly generated DevEUI. Use a valid DevEUI registered with a Join Server", ) + errClaimingNotSupported = errors.DefineInvalidArgument( + "claiming_not_supported", + "claiming not supported for JoinEUI `{join_eui}`", + ) ) var ( @@ -541,16 +543,6 @@ var ( claimOnExternalJS := len(device.ClaimAuthenticationCode.GetValue()) > 0 - // TODO: Remove this flag once the legacy DCS is deprecated - // https://github.com/TheThingsIndustries/lorawan-stack/issues/3036 - if withClaimAuthenticationCode, _ := cmd.Flags().GetBool("with-claim-authentication-code"); withClaimAuthenticationCode { - device.ClaimAuthenticationCode = &ttnpb.EndDeviceAuthenticationCode{ - Value: strings.ToUpper(hex.EncodeToString(random.Bytes(4))), - } - paths = append(paths, "claim_authentication_code") - logger.Warn("Generating claim authentication codes will be deprecated in the future. Use a valid claim authentication code registered with a Join Server instead.") //nolint:lll - } - if hasUpdateDeviceLocationFlags(cmd.Flags()) { updateDeviceLocation(device, cmd.Flags()) paths = append(paths, "locations") @@ -632,30 +624,28 @@ var ( if err != nil { return errEndDeviceClaimInfo.WithCause(err) } - if claimInfoResp.SupportsClaiming { - _, err = ttnpb.NewEndDeviceClaimingServerClient(dcs).Claim(ctx, &ttnpb.ClaimEndDeviceRequest{ - TargetApplicationIds: device.Ids.ApplicationIds, - TargetDeviceId: device.Ids.DeviceId, - SourceDevice: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers_{ - AuthenticatedIdentifiers: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers{ - JoinEui: device.Ids.JoinEui, - DevEui: device.Ids.DevEui, - AuthenticationCode: device.ClaimAuthenticationCode.Value, - }, + if !claimInfoResp.SupportsClaiming { + return errClaimingNotSupported.WithAttributes("join_eui", types.MustEUI64(device.Ids.JoinEui).String()) + } + _, err = ttnpb.NewEndDeviceClaimingServerClient(dcs).Claim(ctx, &ttnpb.ClaimEndDeviceRequest{ + TargetApplicationIds: device.Ids.ApplicationIds, + TargetDeviceId: device.Ids.DeviceId, + SourceDevice: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers_{ + AuthenticatedIdentifiers: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers{ + JoinEui: device.Ids.JoinEui, + DevEui: device.Ids.DevEui, + AuthenticationCode: device.ClaimAuthenticationCode.Value, }, - }) - if err != nil { - return errEndDeviceClaim.WithCause(err) - } - logger.Info("Device successfully claimed, skip registering on the cluster Join Server") - // Remove Cluster Join Server related paths. - jsPaths = []string{} - isPaths = ttnpb.ExcludeFields(isPaths, "join_server_address") - device.JoinServerAddress = "" - } else { - // TODO: Remove this path once the legacy DCS is deprecated (https://github.com/TheThingsIndustries/lorawan-stack/issues/3036). - logger.Info("Device not configured for claiming, register in the cluster Join Server") + }, + }) + if err != nil { + return errEndDeviceClaim.WithCause(err) } + logger.Info("Device successfully claimed on an external Join Server") + // Remove Cluster Join Server related paths. + jsPaths = []string{} + isPaths = ttnpb.ExcludeFields(isPaths, "join_server_address") + device.JoinServerAddress = "" } // Require EUIs for devices that need to be added to the Join Server. if len(jsPaths) > 0 && (device.Ids.JoinEui == nil || device.Ids.DevEui == nil) { @@ -1135,112 +1125,13 @@ var ( }, } endDevicesClaimCommand = &cobra.Command{ - Use: "claim [application-id]", - Short: "Claim an end device (EXPERIMENTAL)", - Long: `Claim an end device (EXPERIMENTAL) - -The claiming procedure transfers devices from the source application to the -target application using the Device Claiming Server, thereby transferring -ownership of the device. - -Authentication of device claiming is by the device's JoinEUI, DevEUI and claim -authentication code as stored in the Join Server. This information is typically -encoded in a QR code. This command supports claiming by QR code (via stdin), as -well as providing the claim information through the flags --source-join-eui, ---source-dev-eui, --source-authentication-code. - -Claim authentication code validity is controlled by the owner of the device by -setting the value and optionally a time window when the code is valid. As part -of the claiming, the claim authentication code is invalidated by default to -block subsequent claiming attempts. You can keep the claim authentication code -valid by specifying --invalidate-authentication-code=false. - -As part of claiming, you can optionally provide the target NetID, Network Server -KEK label and Application Server ID and KEK label. The Network Server and -Application Server addresses will be taken from the CLI configuration. These -values will be stored in the Join Server.`, - Deprecated: "End device claiming is integrated into the device creation flow.", + Use: "claim [application-id]", + Short: "Claim an end device (DEPRECATED)", + Hidden: true, RunE: func(cmd *cobra.Command, args []string) error { - targetAppID := getApplicationID(cmd.Flags(), args) - if targetAppID == nil { - return errNoApplicationID.New() - } - - req := &ttnpb.ClaimEndDeviceRequest{ - TargetApplicationIds: targetAppID, - } - - var joinEUI, devEUI *types.EUI64 - if joinEUIHex, _ := cmd.Flags().GetString("source-join-eui"); joinEUIHex != "" { - joinEUI = new(types.EUI64) - if err := joinEUI.UnmarshalText([]byte(joinEUIHex)); err != nil { - return errInvalidJoinEUI.WithCause(err) - } - } - if devEUIHex, _ := cmd.Flags().GetString("source-dev-eui"); devEUIHex != "" { - devEUI = new(types.EUI64) - if err := devEUI.UnmarshalText([]byte(devEUIHex)); err != nil { - return errInvalidDevEUI.WithCause(err) - } - } - if joinEUI != nil && devEUI != nil { - authenticationCode, _ := cmd.Flags().GetString("source-authentication-code") - req.SourceDevice = &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers_{ - AuthenticatedIdentifiers: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers{ - JoinEui: joinEUI.Bytes(), - DevEui: devEUI.Bytes(), - AuthenticationCode: authenticationCode, - }, - } - } else { - if joinEUI != nil || devEUI != nil { - logger.Warn("Either target JoinEUI or DevEUI specified but need both, not considering any and using scan mode") - } - rd, ok := io.BufferedPipe(os.Stdin) - if !ok { - logger.Info("Scan QR code") - rd = bufio.NewReader(os.Stdin) - } - qrCode, err := rd.ReadBytes('\n') - if err != nil { - return err - } - qrCode = qrCode[:len(qrCode)-1] - logger.WithField("code", string(qrCode)).Debug("Scanned QR code") - req.SourceDevice = &ttnpb.ClaimEndDeviceRequest_QrCode{ - QrCode: qrCode, - } - } - - req.TargetDeviceId, _ = cmd.Flags().GetString("target-device-id") - if netIDHex, _ := cmd.Flags().GetString("target-net-id"); netIDHex != "" { - var netID types.NetID - if err := netID.UnmarshalText([]byte(netIDHex)); err != nil { - return err - } - req.TargetNetId = netID.Bytes() - } - if config.NetworkServerEnabled { - req.TargetNetworkServerAddress = config.NetworkServerGRPCAddress - } - req.TargetNetworkServerKekLabel, _ = cmd.Flags().GetString("target-network-server-kek-label") - if config.ApplicationServerEnabled { - req.TargetApplicationServerAddress = config.ApplicationServerGRPCAddress - } - req.TargetApplicationServerKekLabel, _ = cmd.Flags().GetString("target-application-server-kek-label") - req.TargetApplicationServerId, _ = cmd.Flags().GetString("target-application-server-id") - req.InvalidateAuthenticationCode, _ = cmd.Flags().GetBool("invalidate-authentication-code") - - dcs, err := api.Dial(ctx, config.DeviceClaimingServerGRPCAddress) - if err != nil { - return err - } - ids, err := ttnpb.NewEndDeviceClaimingServerClient(dcs).Claim(ctx, req) - if err != nil { - return err - } - - return io.Write(os.Stdout, config.OutputFormat, ids) + return fmt.Errorf( + "this command is no longer supported. End device claiming is integrated into the device creation flow", + ) }, } endDevicesListQRCodeFormatsCommand = &cobra.Command{ @@ -1360,6 +1251,13 @@ This command may take end device identifiers from stdin.`, if err := device.SetFields(dev, append(append(nsPaths, asPaths...), jsPaths...)...); err != nil { return err } + + if device.ClaimAuthenticationCode.GetValue() == "" { + // Unset the field since qrcodegenerator.Generate does not support fieldmask + // and an empty field would result in a validation error. + device.ClaimAuthenticationCode = nil + } + size, _ := cmd.Flags().GetUint32("size") res, err := client.Generate(ctx, &ttnpb.GenerateEndDeviceQRCodeRequest{ FormatId: formatID, @@ -1687,6 +1585,13 @@ func init() { endDevicesListPhyVersionsCommand.Flags().AddFlagSet(listPhyVersionFlags) endDevicesCommand.AddCommand(endDevicesListPhyVersionsCommand) + // Deprecate flags. + util.DeprecateFlagWithoutForwarding( + endDevicesCreateCommand.Flags(), + "with-claim-authentication-code", + "use a valid claim authentication code registered with a Join Server instead", + ) + Root.AddCommand(endDevicesCommand) endDeviceTemplatesExtendCommand.Flags().AddFlagSet(setEndDeviceFlags) diff --git a/cmd/ttn-lw-cli/commands/packetbroker.go b/cmd/ttn-lw-cli/commands/packetbroker.go index 922370151f..af6faf2c5a 100644 --- a/cmd/ttn-lw-cli/commands/packetbroker.go +++ b/cmd/ttn-lw-cli/commands/packetbroker.go @@ -288,7 +288,7 @@ var ( if err != nil { return err } - var res interface{} + var res any if id == nil { res, err = ttnpb.NewPbaClient(pba).GetHomeNetworkDefaultRoutingPolicy(ctx, ttnpb.Empty) } else { diff --git a/cmd/ttn-lw-cli/commands/storage_integration.go b/cmd/ttn-lw-cli/commands/storage_integration.go index 040fc3d2bb..861c2fd02e 100644 --- a/cmd/ttn-lw-cli/commands/storage_integration.go +++ b/cmd/ttn-lw-cli/commands/storage_integration.go @@ -22,6 +22,7 @@ import ( "github.com/spf13/cobra" "go.thethings.network/lorawan-stack/v3/cmd/internal/io" "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/internal/api" + "go.thethings.network/lorawan-stack/v3/pkg/errors" "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" ) @@ -80,8 +81,23 @@ var ( if err != nil { return err } + if err := getStoredUp(cmd, args, client, os.Stdout); err != nil { + return err + } + + md, err := client.Header() + if err != nil { + return err + } - return getStoredUp(cmd, args, client, os.Stdout) + token, err := newContinuationTokenFromMD(md) + if errors.IsUnavailable(err) { + return nil + } + if err != nil { + return err + } + return io.Write(os.Stdout, config.OutputFormat, token) }, } endDeviceStorageCountCommand = &cobra.Command{ @@ -136,7 +152,23 @@ var ( return err } - return getStoredUp(cmd, args, client, os.Stdout) + if err := getStoredUp(cmd, args, client, os.Stdout); err != nil { + return err + } + + md, err := client.Header() + if err != nil { + return err + } + + token, err := newContinuationTokenFromMD(md) + if errors.IsUnavailable(err) { + return nil + } + if err != nil { + return err + } + return io.Write(os.Stdout, config.OutputFormat, token) }, } applicationsStorageCountCommand = &cobra.Command{ diff --git a/cmd/ttn-lw-cli/commands/storage_integration_util.go b/cmd/ttn-lw-cli/commands/storage_integration_util.go index 5a9ccdd815..99ab7958d1 100644 --- a/cmd/ttn-lw-cli/commands/storage_integration_util.go +++ b/cmd/ttn-lw-cli/commands/storage_integration_util.go @@ -21,7 +21,9 @@ import ( "github.com/spf13/pflag" "go.thethings.network/lorawan-stack/v3/cmd/ttn-lw-cli/internal/util" + "go.thethings.network/lorawan-stack/v3/pkg/errors" "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "google.golang.org/grpc/metadata" "google.golang.org/protobuf/types/known/durationpb" "google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/wrapperspb" @@ -40,6 +42,10 @@ func getStoredUpFlags() *pflag.FlagSet { flags.AddFlagSet(timestampFlags("after", "query upstream messages after specified timestamp")) flags.AddFlagSet(timestampFlags("before", "query upstream messages before specified timestamp")) flags.Duration("last", 0, "query upstream messages in the last hours or minutes") + flags.String( + "continuation-token", "", + "continuation token for pagination (if used additional flags other than the type are ignored)", + ) ttnpb.AddSelectFlagsForApplicationUp(flags, "", false) @@ -54,24 +60,26 @@ func getStoredUpFlags() *pflag.FlagSet { } func getStoredUpRequest(flags *pflag.FlagSet) (*ttnpb.GetStoredApplicationUpRequest, error) { + req := &ttnpb.GetStoredApplicationUpRequest{} + + req.Type, _ = flags.GetString("type") + req.ContinuationToken, _ = flags.GetString("continuation-token") + if req.ContinuationToken != "" { + return req, nil + } + before, after, last, err := timeRangeFromFlags(flags) if err != nil { return nil, err } - req := &ttnpb.GetStoredApplicationUpRequest{ - Before: before, - After: after, - Last: last, - } - + req.Before = before + req.After = after + req.Last = last //nolint req.Order, _ = flags.GetString("order") - req.Type, _ = flags.GetString("type") if flags.Changed("f-port") { fport, _ := flags.GetUint32("f-port") - req.FPort = &wrapperspb.UInt32Value{ - Value: fport, - } + req.FPort = wrapperspb.UInt32(fport) } req.FieldMask = ttnpb.FieldMask( ttnpb.AllowedFields( @@ -156,3 +164,19 @@ func timeRangeFromFlags(flags *pflag.FlagSet) (beforePB *timestamppb.Timestamp, } return } + +type continuationToken struct { + ContinuationToken string `json:"continuation_token,omitempty"` +} + +var errNoContinuationToken = errors.DefineUnavailable("no_continuation_token", "no continuation token") + +func newContinuationTokenFromMD(md metadata.MD) (*continuationToken, error) { + continuationTokenHeaderValues := md.Get("x-continuation-token") + if len(continuationTokenHeaderValues) == 1 { + return &continuationToken{ + ContinuationToken: continuationTokenHeaderValues[0], + }, nil + } + return nil, errNoContinuationToken +} diff --git a/cmd/ttn-lw-cli/internal/api/grpc.go b/cmd/ttn-lw-cli/internal/api/grpc.go index cb7bc4186b..78977fba81 100644 --- a/cmd/ttn-lw-cli/internal/api/grpc.go +++ b/cmd/ttn-lw-cli/internal/api/grpc.go @@ -102,7 +102,7 @@ func SetAuth(authType, authValue string) { } // requestInterceptor is a gRPC interceptor logging the request payload -func requestInterceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { +func requestInterceptor(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { logger := log.FromContext(ctx) if b, err := jsonpb.TTN().Marshal(req); err == nil { logger.WithFields(log.Fields("grpc_payload", string(b))).Debug("Request payload") diff --git a/cmd/ttn-lw-cli/internal/util/cache.go b/cmd/ttn-lw-cli/internal/util/cache.go index f1c2a9d949..700054d41c 100644 --- a/cmd/ttn-lw-cli/internal/util/cache.go +++ b/cmd/ttn-lw-cli/internal/util/cache.go @@ -25,10 +25,10 @@ import ( // AuthData is the stored auth data. type AuthData struct { - OAuthToken *oauth2.Token `json:"oauth_token,omitempty"` - APIKey string `json:"api_key,omitempty"` - Hosts []string `json:"hosts,omitempty"` - Other map[string]interface{} `json:"other,omitempty"` + OAuthToken *oauth2.Token `json:"oauth_token,omitempty"` + APIKey string `json:"api_key,omitempty"` + Hosts []string `json:"hosts,omitempty"` + Other map[string]any `json:"other,omitempty"` } // AuthCache stores auth for the CLI. @@ -65,7 +65,7 @@ func (c *AuthCache) getData() *AuthData { } // Get gets a key from the auth cache. -func (c *AuthCache) Get(key string) interface{} { +func (c *AuthCache) Get(key string) any { authData := c.getData() switch key { case "oauth_token": @@ -79,19 +79,19 @@ func (c *AuthCache) Get(key string) interface{} { } } -func getFromMap(m map[string]interface{}, path []string) interface{} { +func getFromMap(m map[string]any, path []string) any { item := m[path[0]] if len(path) == 1 { return item } - if m, ok := item.(map[string]interface{}); ok { + if m, ok := item.(map[string]any); ok { return getFromMap(m, path[1:]) } return nil } // Set sets keys in the auth cache. -func (c *AuthCache) Set(key string, value interface{}) { +func (c *AuthCache) Set(key string, value any) { authData := c.getData() switch key { case "oauth_token": @@ -102,7 +102,7 @@ func (c *AuthCache) Set(key string, value interface{}) { authData.Hosts = value.([]string) default: if authData.Other == nil { - authData.Other = make(map[string]interface{}) + authData.Other = make(map[string]any) } setInMap(authData.Other, strings.Split(key, "."), value) } @@ -134,7 +134,7 @@ func (c *AuthCache) unset(key string) { c.changed = true } -func setInMap(m map[string]interface{}, path []string, value interface{}) { +func setInMap(m map[string]any, path []string, value any) { if len(path) == 1 { if value == nil { delete(m, path[0]) @@ -143,9 +143,9 @@ func setInMap(m map[string]interface{}, path []string, value interface{}) { } } if m[path[0]] == nil { - m[path[0]] = make(map[string]interface{}) + m[path[0]] = make(map[string]any) } - if m, ok := m[path[0]].(map[string]interface{}); ok { + if m, ok := m[path[0]].(map[string]any); ok { setInMap(m, path[1:], value) } } diff --git a/cmd/ttn-lw-stack/commands/js_db.go b/cmd/ttn-lw-stack/commands/js_db.go index 5b774b4075..77c6943164 100644 --- a/cmd/ttn-lw-stack/commands/js_db.go +++ b/cmd/ttn-lw-stack/commands/js_db.go @@ -176,7 +176,7 @@ var ( logger.WithField("count", len(sids[:d])).Debug("Deleted old session keys") sids = sids[d:] } - sidVals := make([]interface{}, len(sids)) + sidVals := make([]any, len(sids)) for i := range sids { sidVals[i] = base64.RawStdEncoding.EncodeToString(sids[i]) } diff --git a/cmd/ttn-lw-stack/commands/root.go b/cmd/ttn-lw-stack/commands/root.go index 91cd61ca80..18b5553a95 100644 --- a/cmd/ttn-lw-stack/commands/root.go +++ b/cmd/ttn-lw-stack/commands/root.go @@ -20,6 +20,7 @@ import ( "os" "time" + "github.com/KimMachineGun/automemlimit/memlimit" "github.com/getsentry/sentry-go" "github.com/spf13/cobra" "go.thethings.network/lorawan-stack/v3/cmd/internal/commands" @@ -107,7 +108,10 @@ var ( } if _, err := maxprocs.Set(); err != nil { - logger.WithError(err).Debug("Failed to set GOMAXPROCS") + logger.WithError(err).Info("Failed to set GOMAXPROCS") + } + if _, err := memlimit.SetGoMemLimit(0.9); err != nil { + logger.WithError(err).Info("Failed to set GOMEMLIMIT") } ctx = log.NewContext(ctx, logger) diff --git a/config/messages.json b/config/messages.json index effb46d801..a0cef65c2b 100644 --- a/config/messages.json +++ b/config/messages.json @@ -1340,6 +1340,15 @@ "file": "end_devices.go" } }, + "error:cmd/ttn-lw-cli/commands:claiming_not_supported": { + "translations": { + "en": "claiming not supported for JoinEUI `{join_eui}`" + }, + "description": { + "package": "cmd/ttn-lw-cli/commands", + "file": "end_devices.go" + } + }, "error:cmd/ttn-lw-cli/commands:conflicting_paths": { "translations": { "en": "conflicting set and unset field mask paths" @@ -1646,6 +1655,15 @@ "file": "applications.go" } }, + "error:cmd/ttn-lw-cli/commands:no_continuation_token": { + "translations": { + "en": "no continuation token" + }, + "description": { + "package": "cmd/ttn-lw-cli/commands", + "file": "storage_integration_util.go" + } + }, "error:cmd/ttn-lw-cli/commands:no_data": { "translations": { "en": "no data for `{name}`" @@ -3626,27 +3644,27 @@ "file": "ttjs.go" } }, - "error:pkg/deviceclaimingserver/enddevices:claiming_not_supported": { + "error:pkg/deviceclaimingserver:claiming_not_supported": { "translations": { "en": "claiming not supported for JoinEUI `{eui}`" }, "description": { - "package": "pkg/deviceclaimingserver/enddevices", - "file": "enddevices.go" + "package": "pkg/deviceclaimingserver", + "file": "grpc_end_devices.go" } }, - "error:pkg/deviceclaimingserver/enddevices:no_eui": { + "error:pkg/deviceclaimingserver:method_unavailable": { "translations": { - "en": "DevEUI/JoinEUI not found in request" + "en": "method unavailable" }, "description": { - "package": "pkg/deviceclaimingserver/enddevices", - "file": "enddevices.go" + "package": "pkg/deviceclaimingserver", + "file": "grpc_end_devices.go" } }, - "error:pkg/deviceclaimingserver:method_unavailable": { + "error:pkg/deviceclaimingserver:no_eui": { "translations": { - "en": "method unavailable" + "en": "DevEUI/JoinEUI not set for device" }, "description": { "package": "pkg/deviceclaimingserver", @@ -5291,6 +5309,15 @@ "file": "errors.go" } }, + "error:pkg/identityserver/store:contact_info_not_found": { + "translations": { + "en": "contact information with id `{contact_info_id}` not found" + }, + "description": { + "package": "pkg/identityserver/store", + "file": "errors.go" + } + }, "error:pkg/identityserver/store:end_device_not_found": { "translations": { "en": "end device with id `{device_id}` not found in application with id `{application_id}`" @@ -5489,6 +5516,15 @@ "file": "errors.go" } }, + "error:pkg/identityserver/store:validation_without_contact_info": { + "translations": { + "en": "validation does not reference any valid contact information" + }, + "description": { + "package": "pkg/identityserver/store", + "file": "errors.go" + } + }, "error:pkg/identityserver:access_token_mismatch": { "translations": { "en": "access token ID did not match user or client identifiers" @@ -5723,15 +5759,6 @@ "file": "entity_access.go" } }, - "error:pkg/identityserver:invitation_token_expired": { - "translations": { - "en": "invitation token expired" - }, - "description": { - "package": "pkg/identityserver", - "file": "user_registry.go" - } - }, "error:pkg/identityserver:invitation_token_required": { "translations": { "en": "invitation token required" diff --git a/config/webpack.config.babel.js b/config/webpack.config.babel.js index 72f9f82033..bed3290970 100644 --- a/config/webpack.config.babel.js +++ b/config/webpack.config.babel.js @@ -109,7 +109,6 @@ const env = (obj = {}) => { } } -// Export the style config for usage in the storybook config. export const styleConfig = { test: /\.(styl|css)$/, include, @@ -127,7 +126,7 @@ export const styleConfig = { exportLocalsConvention: 'camelCase', localIdentName: env({ production: '[hash:base64:10]', - development: '[path][local]-[hash:base64:10]', + development: '[local]-[hash:base64:4]', }), }, }, @@ -151,10 +150,6 @@ export default { stats: 'minimal', target: 'web', devtool: production ? false : 'eval-source-map', - node: { - fs: 'empty', - module: 'empty', - }, resolve: { alias: env({ all: { @@ -169,11 +164,11 @@ export default { }), }, devServer: { + devMiddleware: { + publicPath: `${ASSETS_ROOT}/`, + }, port: 8080, - inline: true, hot: !WEBPACK_DEV_SERVER_DISABLE_HMR, - stats: 'minimal', - publicPath: `${ASSETS_ROOT}/`, proxy: [ { context: ['/console', '/account', '/oauth', '/api', '/assets/blob'], @@ -200,8 +195,6 @@ export default { output: { filename: production ? '[name].[chunkhash].js' : '[name].js', chunkFilename: production ? '[name].[chunkhash].js' : '[name].js', - hashDigest: 'hex', - hashDigestLength: 20, path: path.resolve(context, PUBLIC_DIR), crossOriginLoading: 'anonymous', publicPath: ASSETS_ROOT, @@ -216,7 +209,7 @@ export default { }, }, }, - removeAvailableModules: false, + removeEmptyChunks: false, }, module: { rules: [ @@ -238,9 +231,9 @@ export default { }, { test: /\.(woff|woff2|ttf|eot|jpg|jpeg|png|svg)$/i, - loader: 'file-loader', - options: { - name: '[name].[hash:hex:20].[ext]', + type: 'asset/resource', + generator: { + filename: '[name].[contenthash:20][ext]', }, }, styleConfig, @@ -261,8 +254,6 @@ export default { }, plugins: env({ all: [ - new webpack.NamedModulesPlugin(), - new webpack.NamedChunksPlugin(), new webpack.EnvironmentPlugin({ NODE_ENV, VERSION: version, @@ -293,8 +284,9 @@ export default { production: ['!libs.*.bundle.js', '!libs.*.bundle.js.map'], }), }), - // Copy static assets to output directory. - new CopyWebpackPlugin({ patterns: [{ from: `${src}/assets/static` }] }), + new CopyWebpackPlugin({ + patterns: [{ from: `${src}/assets/static` }], + }), new webpack.DllReferencePlugin({ context, manifest: path.resolve(context, CACHE_DIR, 'dll.json'), @@ -315,11 +307,9 @@ export default { ], development: [ ...(!WEBPACK_DEV_SERVER_DISABLE_HMR ? [new ReactRefreshWebpackPlugin()] : []), - new webpack.WatchIgnorePlugin([ - /node_modules/, - /locales/, - new RegExp(path.resolve(context, PUBLIC_DIR)), - ]), + new webpack.WatchIgnorePlugin({ + paths: [/node_modules/, /locales/, path.resolve(context, PUBLIC_DIR)], + }), new ShellPlugin({ onBuildExit: [`${MAGE} js:extractLocaleFiles`], }), diff --git a/config/webpack.dll.babel.js b/config/webpack.dll.babel.js index 2aa5cb0e1c..e47a52f66d 100644 --- a/config/webpack.dll.babel.js +++ b/config/webpack.dll.babel.js @@ -24,30 +24,26 @@ const WEBPACK_GENERATE_PRODUCTION_SOURCEMAPS = process.env.WEBPACK_GENERATE_PRODUCTION_SOURCEMAPS === 'true' const context = path.resolve(CONTEXT) -const library = '[name]_[hash]' +const library = '[name]_[fullhash]' const pkg = require(path.resolve(context, 'package.json')) const excludeLibs = ['react-hot-loader', 'ttn-lw'] const libs = Object.keys(pkg.dependencies || {}).filter(lib => !excludeLibs.includes(lib)) const devtool = (mode === 'production' && WEBPACK_GENERATE_PRODUCTION_SOURCEMAPS) || mode === 'development' - ? 'module-source-map' + ? 'source-map' : false export default { context, mode, target: 'web', - node: { - fs: 'empty', - module: 'empty', - }, stats: 'minimal', devtool, recordsPath: path.resolve(context, CACHE_DIR, '_libs_records'), entry: { libs }, output: { - filename: mode === 'production' ? '[name].[hash].bundle.js' : '[name].bundle.js', + filename: mode === 'production' ? '[name].[fullhash].bundle.js' : '[name].bundle.js', hashDigest: 'hex', hashDigestLength: 20, path: path.resolve(context, PUBLIC_DIR), @@ -66,10 +62,14 @@ export default { rules: [ { test: /\.(woff|woff2|ttf|eot|jpg|jpeg|png|svg)$/i, - loader: 'file-loader', - options: { - name: '[name].[hash:hex:20].[ext]', - }, + use: [ + { + loader: 'file-loader', + options: { + name: '[name].[contenthash:20].[ext]', + }, + }, + ], }, ], }, diff --git a/cypress/integration/console/admin-panel/admin-panel.spec.js b/cypress/integration/console/admin-panel/admin-panel.spec.js new file mode 100644 index 0000000000..47084f3f75 --- /dev/null +++ b/cypress/integration/console/admin-panel/admin-panel.spec.js @@ -0,0 +1,36 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +describe('Admin Panel', () => { + before(() => { + cy.dropAndSeedDatabase() + cy.intercept('/api/v3/pba/info', { fixture: 'console/packet-broker/info-registered.json' }) + }) + + beforeEach(() => { + cy.loginConsole({ user_id: 'admin', password: 'admin' }) + }) + + it('succeeds displaying different views in the admin panel', () => { + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel`) + + cy.findByText('User management').should('be.visible').click() + cy.findByText('User management', { selector: 'h1' }).should('be.visible') + cy.findByTestId('error-notification').should('not.exist') + + cy.findByText('Peering settings').should('be.visible').click() + cy.findByText('Packet Broker', { selector: 'h1' }).should('be.visible') + cy.findByTestId('error-notification').should('not.exist') + }) +}) diff --git a/cypress/integration/console/admin-panel/network-information/network-information.spec.js b/cypress/integration/console/admin-panel/network-information/network-information.spec.js new file mode 100644 index 0000000000..6dbeabce3c --- /dev/null +++ b/cypress/integration/console/admin-panel/network-information/network-information.spec.js @@ -0,0 +1,35 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +describe('Network information section', () => { + before(() => { + cy.dropAndSeedDatabase() + }) + + beforeEach(() => { + cy.loginConsole({ user_id: 'admin', password: 'admin' }) + }) + + it('succeeds showing registry totals', () => { + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/network-information`) + cy.findByText('Network information', { selector: 'h1' }).should('be.visible') + // Shows registry totals. + cy.findAllByText('Total applications').should('be.visible') + cy.findAllByText('Total gateways').should('be.visible') + cy.findAllByText('Registered users').should('be.visible') + cy.findAllByText('Organizations').should('be.visible') + cy.findByText('Deployment').should('be.visible') + cy.findByText('Available components').should('be.visible') + }) +}) diff --git a/cypress/integration/console/packet-broker/default-gateway-visibility.spec.js b/cypress/integration/console/admin-panel/packet-broker/default-gateway-visibility.spec.js similarity index 92% rename from cypress/integration/console/packet-broker/default-gateway-visibility.spec.js rename to cypress/integration/console/admin-panel/packet-broker/default-gateway-visibility.spec.js index 0fcfeffdd0..c2c2e7bf74 100644 --- a/cypress/integration/console/packet-broker/default-gateway-visibility.spec.js +++ b/cypress/integration/console/admin-panel/packet-broker/default-gateway-visibility.spec.js @@ -31,7 +31,9 @@ describe('Packet Broker routing policies', () => { }) cy.intercept('GET', '/api/v3/pba/home-networks/policies/default', { statusCode: 404 }) cy.intercept('PUT', '/api/v3/pba/home-networks/gateway-visibilities/default', {}).as('putCall') - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker/default-gateway-visibility`) + cy.visit( + `${Cypress.config('consoleRootPath')}/admin-panel/packet-broker/default-gateway-visibility`, + ) cy.findByLabelText('Location').check() cy.findByLabelText('Antenna placement').check() @@ -53,7 +55,9 @@ describe('Packet Broker routing policies', () => { fixture: 'console/packet-broker/default-gateway-visibility.json', }) cy.intercept('PUT', '/api/v3/pba/home-networks/gateway-visibilities/default', {}).as('putCall') - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker/default-gateway-visibility`) + cy.visit( + `${Cypress.config('consoleRootPath')}/admin-panel/packet-broker/default-gateway-visibility`, + ) cy.findByLabelText('Location').uncheck() cy.findByLabelText('Antenna placement').uncheck() diff --git a/cypress/integration/console/packet-broker/networks.spec.js b/cypress/integration/console/admin-panel/packet-broker/networks.spec.js similarity index 97% rename from cypress/integration/console/packet-broker/networks.spec.js rename to cypress/integration/console/admin-panel/packet-broker/networks.spec.js index 08711e1b42..db702ac160 100644 --- a/cypress/integration/console/packet-broker/networks.spec.js +++ b/cypress/integration/console/admin-panel/packet-broker/networks.spec.js @@ -45,7 +45,7 @@ describe('Packet Broker networks', () => { cy.intercept('/api/v3/pba/home-networks/policies*', { fixture: 'console/packet-broker/policies-home-network.json', }) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker/networks`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker/networks`) const { networks } = this.networks const networksFiltered = networks.filter( @@ -73,7 +73,7 @@ describe('Packet Broker networks', () => { n => n.forwarder_id.net_id === 19 && n.forwarder_id.tenant_id === 'johan', ) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker/networks/19/johan`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker/networks/19/johan`) cy.findAllByText(`${network.id.net_id.toString(16).padStart(6, '0')}/${network.id.tenant_id}`) cy.findByText( diff --git a/cypress/integration/console/packet-broker/registration.spec.js b/cypress/integration/console/admin-panel/packet-broker/registration.spec.js similarity index 89% rename from cypress/integration/console/packet-broker/registration.spec.js rename to cypress/integration/console/admin-panel/packet-broker/registration.spec.js index a531f03332..98f6f497aa 100644 --- a/cypress/integration/console/packet-broker/registration.spec.js +++ b/cypress/integration/console/admin-panel/packet-broker/registration.spec.js @@ -36,10 +36,10 @@ describe('Packet Broker registration', () => { cy.loginConsole({ user_id: user.ids.user_id, password: user.password }) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker`) cy.location('pathname').should('eq', `${Cypress.config('consoleRootPath')}/`) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker/networks/19`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker/networks/19`) cy.location('pathname').should('eq', `${Cypress.config('consoleRootPath')}/`) }) @@ -47,7 +47,7 @@ describe('Packet Broker registration', () => { cy.intercept('/api/v3/pba/info', { statusCode: 403 }) cy.loginConsole({ user_id: 'admin', password: 'admin' }) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker`) cy.findByTestId('notification') .findByText(/not set up/) @@ -58,11 +58,11 @@ describe('Packet Broker registration', () => { it('displays UI elements in place', () => { cy.intercept('/api/v3/pba/info', { fixture: 'console/packet-broker/info.json' }) cy.loginConsole({ user_id: 'admin', password: 'admin' }) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker`) cy.findByText('Packet Broker', { selector: 'h1' }).should('be.visible') cy.findByText(/Packet Broker can be used to exchange traffic/).should('be.visible') - cy.findByText('Packet Broker', { selector: 'a' }).should('be.visible') + cy.findByText('Packet Broker documentation', { selector: 'a' }).should('be.visible') cy.findByText('Packet Broker website', { selector: 'a' }).should('be.visible') cy.findByText('Register network', { selector: 'span' }).should('be.visible') cy.findByTestId('switch') @@ -87,7 +87,7 @@ describe('Packet Broker registration', () => { cy.intercept('/api/v3/pba/info', { fixture: 'console/packet-broker/info.json' }) cy.loginConsole({ user_id: 'admin', password: 'admin' }) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker`) cy.findByText('Register network').click().next().findByTestId('switch').should('be.checked') cy.findByText('List network publicly') diff --git a/cypress/integration/console/packet-broker/routing-policies.spec.js b/cypress/integration/console/admin-panel/packet-broker/routing-policies.spec.js similarity index 93% rename from cypress/integration/console/packet-broker/routing-policies.spec.js rename to cypress/integration/console/admin-panel/packet-broker/routing-policies.spec.js index d1d9e34848..9b9f519f12 100644 --- a/cypress/integration/console/packet-broker/routing-policies.spec.js +++ b/cypress/integration/console/admin-panel/packet-broker/routing-policies.spec.js @@ -35,7 +35,7 @@ describe('Packet Broker routing policies', () => { it('succeeds setting a default routing policy', () => { cy.intercept('GET', '/api/v3/pba/home-networks/policies/default', { statusCode: 404 }) cy.intercept('PUT', '/api/v3/pba/home-networks/policies/default', {}) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker`) cy.findByLabelText('Use default routing policy for this network').check() @@ -71,7 +71,7 @@ describe('Packet Broker routing policies', () => { }) cy.intercept('DELETE', '/api/v3/pba/home-networks/policies/default', {}) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker`) cy.findByLabelText('Do not use a default routing policy for this network').check() cy.findByRole('button', { name: 'Save default policy' }).click() @@ -93,7 +93,7 @@ describe('Packet Broker routing policies', () => { }) cy.intercept('PUT', '/api/v3/pba/home-networks/policies/19', {}) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker/networks/19`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker/networks/19`) // Check routing policy form checkboxes. cy.findByLabelText('Use network specific routing policy').check() @@ -138,7 +138,7 @@ describe('Packet Broker routing policies', () => { }) cy.intercept('DELETE', '/api/v3/pba/home-networks/policies/19', {}) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker/networks/19`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker/networks/19`) cy.findByLabelText('Do not use a routing policy for this network').check() cy.findByRole('button', { name: 'Save routing policy' }).click() @@ -161,7 +161,7 @@ describe('Packet Broker routing policies', () => { }) cy.intercept('DELETE', '/api/v3/pba/home-networks/policies/19', {}) - cy.visit(`${Cypress.config('consoleRootPath')}/admin/packet-broker/networks/19`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/packet-broker/networks/19`) cy.findByLabelText('Use default routing policy for this network').check() cy.findByRole('button', { name: 'Save routing policy' }).click() diff --git a/cypress/integration/console/user-management/invitations.spec.js b/cypress/integration/console/admin-panel/user-management/invitations.spec.js similarity index 81% rename from cypress/integration/console/user-management/invitations.spec.js rename to cypress/integration/console/admin-panel/user-management/invitations.spec.js index 06f0896da0..276f11cf14 100644 --- a/cypress/integration/console/user-management/invitations.spec.js +++ b/cypress/integration/console/admin-panel/user-management/invitations.spec.js @@ -22,7 +22,7 @@ describe('Send invite', () => { }) it('displays UI elements in place', () => { - cy.visit(`${Cypress.config('consoleRootPath')}/admin/user-management/invitations/add`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/user-management/invitations/add`) cy.findByText('Invite', { selector: 'h1' }).should('be.visible') cy.findByLabelText('Email address') @@ -33,7 +33,7 @@ describe('Send invite', () => { }) it('validates before submitting an empty form', () => { - cy.visit(`${Cypress.config('consoleRootPath')}/admin/user-management/invitations/add`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/user-management/invitations/add`) cy.findByRole('button', { name: 'Invite' }).should('be.visible').click() @@ -42,12 +42,12 @@ describe('Send invite', () => { .and('be.visible') cy.location('pathname').should( 'eq', - `${Cypress.config('consoleRootPath')}/admin/user-management/invitations/add`, + `${Cypress.config('consoleRootPath')}/admin-panel/user-management/invitations/add`, ) }) it('succeeds inviting a user', () => { - cy.visit(`${Cypress.config('consoleRootPath')}/admin/user-management/invitations/add`) + cy.visit(`${Cypress.config('consoleRootPath')}/admin-panel/user-management/invitations/add`) cy.findByLabelText('Email address').type('mail@example.com') cy.findByRole('button', { name: 'Invite' }).click() @@ -56,7 +56,7 @@ describe('Send invite', () => { cy.findByTestId('full-error-view').should('not.exist') cy.location('pathname').should( 'eq', - `${Cypress.config('consoleRootPath')}/admin/user-management`, + `${Cypress.config('consoleRootPath')}/admin-panel/user-management`, ) cy.findByText('User invitations').click() cy.findByRole('cell', { name: 'mail@example.com' }).should('be.visible') diff --git a/cypress/integration/console/devices/import.spec.js b/cypress/integration/console/devices/import.spec.js index 315c59dd67..e6889f3b81 100644 --- a/cypress/integration/console/devices/import.spec.js +++ b/cypress/integration/console/devices/import.spec.js @@ -87,9 +87,9 @@ describe('End device messaging', () => { const devicesFile = 'successful-devices.json' cy.findByLabelText('File').attachFile(devicesFile) cy.findByRole('button', { name: 'Import end devices' }).click() - cy.findByText('0 of 3 (0.00% finished)') + cy.findByText('0 of 3 (0% finished)') cy.findByText('Operation finished') - cy.findByText('3 of 3 (100.00% finished)') + cy.findByText('3 of 3 (100% finished)') cy.findByTestId('notification') .should('be.visible') .findByText('All end devices imported successfully') @@ -117,7 +117,7 @@ describe('End device messaging', () => { cy.findByRole('button', { name: 'Import end devices' }).click() cy.findByText('Operation finished').should('be.visible') - cy.findByText('3 of 3 (100.00% finished)').should('be.visible') + cy.findByText('3 of 3 (100% finished)').should('be.visible') cy.findByText('Successfully converted 1 of 3 end devices').should('be.visible') cy.findByTestId('notification') .should('be.visible') @@ -196,7 +196,7 @@ describe('End device messaging', () => { cy.findByLabelText('File').attachFile(devicesFile) cy.findByRole('button', { name: 'Import end devices' }).click() cy.findByText('Operation finished').should('be.visible') - cy.findByText('3 of 3 (100.00% finished)').should('be.visible') + cy.findByText('3 of 3 (100% finished)').should('be.visible') cy.findByText('Successfully converted 2 of 3 end devices').should('be.visible') cy.findByTestId('notification') .findByText('Not all devices imported successfully') @@ -230,9 +230,9 @@ describe('End device messaging', () => { const devicesFile = 'successful-devices.json' cy.findByLabelText('File').attachFile(devicesFile) cy.findByRole('button', { name: 'Import end devices' }).click() - cy.findByText('0 of 3 (0.00% finished)') + cy.findByText('0 of 3 (0% finished)') cy.findByText('Operation finished') - cy.findByText('3 of 3 (100.00% finished)') + cy.findByText('3 of 3 (100% finished)') cy.findByTestId('notification') .should('be.visible') .findByText('All end devices imported successfully') diff --git a/cypress/integration/console/devices/onboarding/qr-scan.spec.js b/cypress/integration/console/devices/onboarding/qr-scan.spec.js index 0f8593936d..f9d21593a0 100644 --- a/cypress/integration/console/devices/onboarding/qr-scan.spec.js +++ b/cypress/integration/console/devices/onboarding/qr-scan.spec.js @@ -18,6 +18,7 @@ import { interceptDeviceRepo, selectDevice, composeClaimResponse, + composeQRGeneratorParseResponse, composeExpectedRequest, } from './utils' @@ -52,12 +53,18 @@ describe('Device onboarding with QR scan', () => { beforeEach(() => { interceptDeviceRepo(appId) + cy.intercept( + 'POST', + '/api/v3/qr-codes/end-devices/parse', + composeQRGeneratorParseResponse({ ...device, vendorId: 428 }), + ).as('qr-code-parse-request') cy.loginConsole({ user_id: user.ids.user_id, password: user.password }) cy.visit(`${Cypress.config('consoleRootPath')}/applications/${appId}/devices/add`) }) it('succeeds registering a device via a qr code', () => { cy.intercept('POST', `/api/v3/applications/${appId}/devices`).as('registerDevice') + cy.findByTestId('full-error-view').should('not.exist') cy.findByTestId('error-notification').should('not.exist') @@ -67,6 +74,7 @@ describe('Device onboarding with QR scan', () => { cy.findByText('Please scan the QR code to continue.').should('exist') cy.findByTestId('webcam-feed').should('be.visible') cy.findByText('Found QR code data').should('be.visible') + cy.wait('@qr-code-parse-request') cy.findByText('Apply').should('not.be.disabled').click() // Display scanned data in form. @@ -113,6 +121,7 @@ describe('Device onboarding with QR scan', () => { cy.findByText('Please scan the QR code to continue.').should('exist') cy.findByTestId('webcam-feed').should('be.visible') cy.findByText('Found QR code data').should('be.visible') + cy.wait('@qr-code-parse-request') cy.findByRole('button', { name: /Scan again/g }).click() cy.findByTestId('webcam-feed').should('be.visible') }) @@ -127,6 +136,7 @@ describe('Device onboarding with QR scan', () => { cy.findByText('Please scan the QR code to continue.').should('exist') cy.findByTestId('webcam-feed').should('be.visible') cy.findByText('Found QR code data').should('be.visible') + cy.wait('@qr-code-parse-request') cy.findByText('Apply').should('not.be.disabled').click() // Display scanned data in form. @@ -185,6 +195,7 @@ describe('Device onboarding with QR scan', () => { cy.findByText('Please scan the QR code to continue.').should('exist') cy.findByTestId('webcam-feed').should('be.visible') cy.findByText('Found QR code data').should('be.visible') + cy.wait('@qr-code-parse-request') cy.findByText('Apply').should('not.be.disabled').click() cy.findByLabelText('End device brand') diff --git a/cypress/integration/console/devices/onboarding/utils.js b/cypress/integration/console/devices/onboarding/utils.js index cba31f658c..76cdc0953e 100644 --- a/cypress/integration/console/devices/onboarding/utils.js +++ b/cypress/integration/console/devices/onboarding/utils.js @@ -44,6 +44,20 @@ export const interceptDeviceRepo = appId => { }) } +export const composeQRGeneratorParseResponse = ({ joinEui, devEui, cac, vendorId }) => ({ + format_id: 'tr005', + end_device_template: { + end_device: { + ids: { dev_eui: devEui, join_eui: joinEui }, + claim_authentication_code: { value: cac }, + lora_alliance_profile_ids: { + vendor_id: vendorId, + }, + }, + field_mask: { paths: ['ids', 'claim_authentication_code'] }, + }, +}) + export const composeClaimResponse = ({ joinEui, devEui, id, appId }) => ({ application_ids: { application_id: appId }, device_id: id, diff --git a/cypress/integration/console/shared/payload-formatters/edit.spec.js b/cypress/integration/console/shared/payload-formatters/edit.spec.js index 023af9ef14..36818ca6ca 100644 --- a/cypress/integration/console/shared/payload-formatters/edit.spec.js +++ b/cypress/integration/console/shared/payload-formatters/edit.spec.js @@ -30,6 +30,13 @@ describe('Payload formatters', () => { multicast: false, supports_join: true, lorawan_version: 'MAC_V1_0_2', + version_ids: { + brand_id: 'the-things-products', + model_id: 'the-things-uno', + hw_version: '1.0', + fw_version: 'quickstart', + band_id: 'EU_863_870', + }, ids: { device_id: 'device-all-components', dev_eui: '70B3D57ED8000013', @@ -47,6 +54,11 @@ describe('Payload formatters', () => { }, field_mask: { paths: [ + 'version_ids.brand_id', + 'version_ids.model_id', + 'version_ids.hardware_version', + 'version_ids.firmware_version', + 'version_ids.band_id', 'frequency_plan_id', 'lorawan_phy_version', 'multicast', diff --git a/cypress/plugins/tasks.js b/cypress/plugins/tasks.js index dde1674d24..dabe3ba210 100644 --- a/cypress/plugins/tasks.js +++ b/cypress/plugins/tasks.js @@ -15,8 +15,8 @@ const childProcess = require('child_process') const fs = require('fs') const path = require('path') - const util = require('util') + const { Client } = require('pg') const yaml = require('js-yaml') const codeCoverageTask = require('@cypress/code-coverage/task') diff --git a/data/lorawan-devices b/data/lorawan-devices index b6eb479c58..1f0f94d781 160000 --- a/data/lorawan-devices +++ b/data/lorawan-devices @@ -1 +1 @@ -Subproject commit b6eb479c58d4a09be9fcd8b4611dfcad28b8393e +Subproject commit 1f0f94d781cfc06972d4561466abba6645afcc42 diff --git a/data/lorawan-webhook-templates b/data/lorawan-webhook-templates index 07112b9a11..2967b46c83 160000 --- a/data/lorawan-webhook-templates +++ b/data/lorawan-webhook-templates @@ -1 +1 @@ -Subproject commit 07112b9a11382c016beed63505120f2a358c66a8 +Subproject commit 2967b46c83eeaa4e8fcc448ef0ee3b4ec0bc7a52 diff --git a/go.mod b/go.mod index 9a5b0de000..f7acbc130d 100644 --- a/go.mod +++ b/go.mod @@ -10,12 +10,13 @@ replace github.com/mitchellh/mapstructure => github.com/TheThingsIndustries/maps require ( contrib.go.opencensus.io/exporter/prometheus v0.4.2 + github.com/KimMachineGun/automemlimit v0.2.6 github.com/Masterminds/sprig/v3 v3.2.3 github.com/TheThingsIndustries/mystique v0.0.0-20221125120501-80ab21781b6d github.com/TheThingsIndustries/protoc-gen-go-flags v1.1.0 github.com/TheThingsIndustries/protoc-gen-go-json v1.5.1 github.com/TheThingsNetwork/go-cayenne-lib v1.1.0 - github.com/aws/aws-sdk-go v1.44.186 + github.com/aws/aws-sdk-go v1.44.274 github.com/blang/semver v3.5.1+incompatible github.com/blevesearch/bleve v1.0.14 github.com/bluele/gcache v0.0.2 @@ -24,9 +25,9 @@ require ( github.com/dustin/go-humanize v1.0.1 github.com/eclipse/paho.mqtt.golang v1.4.2 github.com/emersion/go-smtp v0.16.0 - github.com/envoyproxy/protoc-gen-validate v0.9.1 + github.com/envoyproxy/protoc-gen-validate v1.0.1 github.com/felixge/httpsnoop v1.0.3 - github.com/getsentry/sentry-go v0.17.0 + github.com/getsentry/sentry-go v0.21.0 github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f github.com/google/go-cmp v0.5.9 github.com/google/uuid v1.3.0 @@ -40,70 +41,72 @@ require ( github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 - github.com/hellofresh/health-go/v5 v5.0.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 + github.com/hellofresh/health-go/v5 v5.1.1 github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef github.com/iancoleman/strcase v0.2.0 github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa - github.com/jackc/pgx/v5 v5.2.0 + github.com/jackc/pgx/v5 v5.3.1 github.com/jacobsa/crypto v0.0.0-20190317225127-9f44e2d11115 - github.com/jarcoal/httpmock v1.2.0 + github.com/jarcoal/httpmock v1.3.0 github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba github.com/json-iterator/go v1.1.12 github.com/jtacoma/uritemplates v1.0.0 github.com/kr/pretty v0.3.1 - github.com/lib/pq v1.10.7 + github.com/lib/pq v1.10.9 github.com/mitchellh/mapstructure v1.5.0 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 - github.com/nats-io/nats-server/v2 v2.9.11 - github.com/nats-io/nats.go v1.23.0 + github.com/nats-io/nats-server/v2 v2.9.17 + github.com/nats-io/nats.go v1.26.0 github.com/oklog/ulid/v2 v2.1.0 github.com/openshift/osin v1.0.2-0.20220317075346-0f4d38c6e53f github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.14.0 - github.com/redis/go-redis/v9 v9.0.2 + github.com/prometheus/client_golang v1.15.1 + github.com/redis/go-redis/v9 v9.0.5 github.com/satori/go.uuid v1.2.0 github.com/sendgrid/sendgrid-go v3.12.0+incompatible github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e - github.com/smartystreets/assertions v1.13.0 - github.com/spf13/cast v1.5.0 - github.com/spf13/cobra v1.6.1 + github.com/smartystreets/assertions v1.13.1 + github.com/spf13/cast v1.5.1 + github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.15.0 + github.com/spf13/viper v1.16.0 github.com/throttled/throttled v2.2.5+incompatible github.com/throttled/throttled/v2 v2.0.0-00010101000000-000000000000 - github.com/uptrace/bun v1.1.10 - github.com/uptrace/bun/dialect/pgdialect v1.1.10 - github.com/uptrace/bun/driver/pgdriver v1.1.10 + github.com/uptrace/bun v1.1.14 + github.com/uptrace/bun/dialect/pgdialect v1.1.14 + github.com/uptrace/bun/driver/pgdriver v1.1.14 github.com/vmihailenco/msgpack/v5 v5.3.5 go.opencensus.io v0.24.0 - go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.41.0 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0 - go.opentelemetry.io/otel v1.15.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0 - go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.13.0 - go.opentelemetry.io/otel/sdk v1.15.0 - go.opentelemetry.io/otel/trace v1.15.0 - go.packetbroker.org/api/iam v1.5.27 - go.packetbroker.org/api/iam/v2 v2.7.8 - go.packetbroker.org/api/mapping/v2 v2.1.27 - go.packetbroker.org/api/routing v1.8.18 - go.packetbroker.org/api/v3 v3.12.4 + go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.42.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 + go.opentelemetry.io/otel v1.16.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 + go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 + go.opentelemetry.io/otel/sdk v1.16.0 + go.opentelemetry.io/otel/trace v1.16.0 + go.packetbroker.org/api/iam v1.6.0 + go.packetbroker.org/api/iam/v2 v2.7.10 + go.packetbroker.org/api/mapping/v2 v2.1.29 + go.packetbroker.org/api/routing v1.8.20 + go.packetbroker.org/api/v3 v3.13.0 go.thethings.network/lorawan-application-payload v0.0.0-20220125153912-1198ff1e403e go.thethings.network/lorawan-stack-legacy/v2 v2.1.0 go.uber.org/automaxprocs v1.5.2 go.uber.org/zap v1.24.0 - gocloud.dev v0.28.0 - gocloud.dev/pubsub/natspubsub v0.28.0 - golang.org/x/crypto v0.6.0 + gocloud.dev v0.29.0 + gocloud.dev/pubsub/natspubsub v0.29.0 + golang.org/x/crypto v0.9.0 golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2 - golang.org/x/net v0.9.0 - golang.org/x/oauth2 v0.6.0 - golang.org/x/sync v0.1.0 - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 - google.golang.org/grpc v1.54.0 + golang.org/x/net v0.10.0 + golang.org/x/oauth2 v0.8.0 + golang.org/x/sync v0.2.0 + google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e + google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc + google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc + google.golang.org/grpc v1.55.0 google.golang.org/protobuf v1.30.0 gopkg.in/mail.v2 v2.3.1 gopkg.in/square/go-jose.v2 v2.6.0 @@ -116,38 +119,38 @@ require ( cloud.google.com/go/compute/metadata v0.2.3 // indirect cloud.google.com/go/iam v0.13.0 // indirect cloud.google.com/go/pubsub v1.30.0 // indirect - cloud.google.com/go/storage v1.28.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.2.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.0 // indirect + cloud.google.com/go/storage v1.29.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.6.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v0.7.0 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver/v3 v3.2.0 // indirect github.com/RoaringBitmap/roaring v0.4.23 // indirect - github.com/aws/aws-sdk-go-v2 v1.17.1 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9 // indirect - github.com/aws/aws-sdk-go-v2/config v1.18.3 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.3 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.42 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4 // indirect - github.com/aws/aws-sdk-go-v2/service/sns v1.18.6 // indirect - github.com/aws/aws-sdk-go-v2/service/sqs v1.19.15 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.11.25 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.17.5 // indirect - github.com/aws/smithy-go v1.13.4 // indirect + github.com/aws/aws-sdk-go-v2 v1.17.4 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 // indirect + github.com/aws/aws-sdk-go-v2/config v1.18.12 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.13.12 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.22 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.51 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.3.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.19 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.23 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.22 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.22 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.30.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sns v1.20.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sqs v1.20.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.18.3 // indirect + github.com/aws/smithy-go v1.13.5 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blevesearch/go-porterstemmer v1.0.3 // indirect github.com/blevesearch/mmap-go v1.0.2 // indirect @@ -160,10 +163,14 @@ require ( github.com/blevesearch/zap/v15 v15.0.3 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cilium/ebpf v0.9.1 // indirect + github.com/containerd/cgroups/v3 v3.0.1 // indirect + github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/couchbase/vellum v1.0.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dlclark/regexp2 v1.7.0 // indirect + github.com/docker/go-units v0.5.0 // indirect github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2 // indirect @@ -172,29 +179,31 @@ require ( github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect + github.com/godbus/dbus/v5 v5.0.6 // indirect github.com/golang-jwt/jwt/v4 v4.4.3 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/gomodule/redigo v1.8.9 // indirect + github.com/google/s2a-go v0.1.3 // indirect github.com/google/wire v0.5.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.7.1 // indirect + github.com/googleapis/gax-go/v2 v2.8.0 // indirect github.com/gotnospirit/makeplural v0.0.0-20180622080156-a5f48d94d976 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.3.3 // indirect github.com/imdario/mergo v0.3.12 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jacobsa/oglematchers v0.0.0-20150720000706-141901ea67cd // indirect github.com/jacobsa/oglemock v0.0.0-20150831005832-e94d794d06ff // indirect github.com/jacobsa/ogletest v0.0.0-20170503003838-80d50a735a11 // indirect github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/klauspost/compress v1.15.11 // indirect + github.com/klauspost/compress v1.16.5 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -206,12 +215,13 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mschoch/smat v0.2.0 // indirect - github.com/nats-io/jwt/v2 v2.3.0 // indirect - github.com/nats-io/nkeys v0.3.0 // indirect + github.com/nats-io/jwt/v2 v2.4.1 // indirect + github.com/nats-io/nkeys v0.4.4 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect github.com/pborman/uuid v1.2.0 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/philhofer/fwd v1.0.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect @@ -222,7 +232,8 @@ require ( github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sendgrid/rest v2.6.9+incompatible // indirect github.com/shopspring/decimal v1.2.0 // indirect - github.com/spf13/afero v1.9.3 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/spf13/afero v1.9.5 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect github.com/steveyen/gtreap v0.1.0 // indirect @@ -232,19 +243,19 @@ require ( github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/willf/bitset v1.1.11 // indirect go.etcd.io/bbolt v1.3.6 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.0 // indirect - go.opentelemetry.io/otel/metric v0.37.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.16.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.10.0 // indirect - go.uber.org/multierr v1.8.0 // indirect + go.uber.org/multierr v1.9.0 // indirect golang.org/x/image v0.5.0 // indirect - golang.org/x/sys v0.7.0 // indirect - golang.org/x/term v0.7.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.114.0 // indirect + google.golang.org/api v0.122.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 1f3c0d463a..08b4a7a73a 100644 --- a/go.sum +++ b/go.sum @@ -32,12 +32,14 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.109.0/go.mod h1:2sYycXt75t/CSB5R9M2wPU1tJmire7AQZTPtITcGBVE= cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= @@ -46,6 +48,7 @@ cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= @@ -88,6 +91,7 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= @@ -118,6 +122,9 @@ cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOt cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= @@ -154,6 +161,7 @@ cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4c cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= 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/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= @@ -175,6 +183,7 @@ cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1 cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= @@ -182,6 +191,7 @@ cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEu cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= @@ -202,10 +212,13 @@ cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZ cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.10.0/go.mod h1:nXAECrMt2qHpF6RZUZseteD6QyanL68reN4OXPw0UWM= cloud.google.com/go/iam v0.13.0 h1:+CmB+K0J/33d0zSQ9SlFWUeCCEn5XJA0ZMZ3pHE9u8k= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= @@ -214,20 +227,24 @@ cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+ cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.7.0/go.mod h1:k2UdVoNIHLJi/Rnng6dN0vlq7lS3jHSDiZasft+gmYE= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.0/go.mod h1:eF3Qsw58iX/bkKtVjMTYpH0LRjQ2goDkjkNQTlzq/ZM= cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= @@ -241,7 +258,7 @@ cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4= cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.9.0/go.mod h1:/FsTS0gkEFUc4cgB16s6jYDnyjzRBkRJNRzBn5Zx+wA= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= @@ -278,9 +295,12 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k 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/pubsub v1.27.0/go.mod h1:BgkDyjrFNV8c7txDxPrlQkM/XtbJQVEeAWmt56lVVf8= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= cloud.google.com/go/pubsub v1.30.0 h1:vCge8m7aUKBJYOgrZp7EsNDf6QMd2CAlXZqWTn3yq6s= cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= @@ -314,6 +334,7 @@ cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJe cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= @@ -335,6 +356,7 @@ cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5 cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= @@ -348,9 +370,9 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.0/go.mod h1:qlgZML35PXA3zoEnIkiPLY4/TOkUleufRlu6qmcf7sI= -cloud.google.com/go/storage v1.28.1 h1:F5QDG5ChchaAVQhINh24U99OWHURqrW8OmQcGKXcbgI= cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0 h1:6weCgzRvMg7lzuUurI4697AqIRPU1SvzHhynwpW31jI= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= @@ -364,6 +386,7 @@ cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227 cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A= cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= @@ -379,6 +402,7 @@ cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= @@ -406,25 +430,26 @@ github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9mo github.com/Azure/azure-sdk-for-go v66.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.1/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.4/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.2.0 h1:sVW/AFBTGyJxDaMYlq0ct3jUXTtj12tQ6zE2GZUgVQw= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.2.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.0/go.mod h1:tZoQYdDZNOiIjdSn0dVWVfl0NEPGOJqVLzSrcFk4Is0= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.1 h1:gVXuXcWd1i4C2Ruxe321aU+IKGaStvGB/S90PUPB/W8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.3.1/go.mod h1:DffdKW9RFqa5VgmsjUOsS7UE7eiA5iAvYUs63bhKQ0M= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.0 h1:t/W5MYAuQy81cvM8VUNfRLzhtKpXhVUAN7Cd7KVbTyc= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.0/go.mod h1:NBanQUfSWiWn3QEpWDTCU0IjBECKOYvl2R8xdRtMtiM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1 h1:T8quHYlUGyb/oqtSTwqlCr1ilJHrDv+ZtpSfo+hm1BU= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM= github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.1/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.1/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 h1:+5VZ72z0Qan5Bog5C+ZkgSqUbeVUd9wgtHOrIKuc5b8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.9.0/go.mod h1:EAyXOW1F6BTJPiK2pDvmnvxOHPxoTYWoqBeIlql+QhI= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.0/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA= -github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.1.3/go.mod h1:Eo6WMP/iw9sp06+v8y030eReUwX6sULn5i3fxCDWPag= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.6.1 h1:YvQv9Mz6T8oR5ypQOL6erY0Z5t71ak1uHV4QFokCOZk= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.6.1/go.mod h1:c6WvOhtmjNUWbLfOG1qxM/q0SPvQNSVJvolm+C52dIU= +github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.2.0/go.mod h1:R6+0udeRV8iYSTVuT5RT7If4sc46K5Bz3ZKrmvZQF7U= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag= github.com/Azure/go-amqp v0.17.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= -github.com/Azure/go-amqp v0.17.5/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg= +github.com/Azure/go-amqp v0.18.1/go.mod h1:+bg0x3ce5+Q3ahCEXnCsGG3ETpDQe3MEVnOuT2ywPwc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= @@ -434,14 +459,12 @@ github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSW github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= github.com/Azure/go-autorest/autorest v0.11.25/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= -github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U= github.com/Azure/go-autorest/autorest v0.11.28/go.mod h1:MrkzG3Y3AH668QyF9KRk5neJnGgmhQ6krbhR8Q5eMvA= github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ= -github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= +github.com/Azure/go-autorest/autorest/adal v0.9.22/go.mod h1:XuAbAEUv2Tta//+voMI038TrJBqjKam0me7qR+L8Cmk= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= @@ -454,12 +477,16 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v0.7.0 h1:VgSJlZH5u0k2qxSpqyghcFQKmvYckj46uymKK5XzkBM= -github.com/AzureAD/microsoft-authentication-library-for-go v0.7.0/go.mod h1:BDJ5qMFKx9DugEg3+uQSDCdbYPr5s9vBTrL9P8TpqOU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1 h1:oPdPEZFSbl7oSPEAIPMPBMUmiL+mqgzBJwM/9qYcwNg= +github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0= 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/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/GoogleCloudPlatform/cloudsql-proxy v1.33.1/go.mod h1:n3KDPrdaY2p9Nr0B1allAdjYArwIpXQcitNbsS/Qiok= +github.com/GoogleCloudPlatform/cloudsql-proxy v1.33.2/go.mod h1:uqoR4sJc63p7ugW8a/vsEspOsNuehbi7ptS2CHCyOnY= +github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/KimMachineGun/automemlimit v0.2.6 h1:tQFriVTcIteUkV5EgU9iz03eDY36T8JU5RAjP2r6Kt0= +github.com/KimMachineGun/automemlimit v0.2.6/go.mod h1:pJhTW/nWJMj6SnWSU2TEKSlCaM+1N5Mej+IfS/5/Ol0= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= @@ -516,6 +543,7 @@ github.com/TheThingsNetwork/go-cayenne-lib v1.1.0 h1:uw+WnTMSSwTo58/ob3ktWNBiCY2 github.com/TheThingsNetwork/go-cayenne-lib v1.1.0/go.mod h1:HTTus7UIBhXKvLIeNGybbG1o7wr4zwwVbbUXwFqrtp0= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= 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= @@ -525,80 +553,81 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8V github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= 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-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= 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/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= +github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.128/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= -github.com/aws/aws-sdk-go v1.44.151/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go v1.44.186 h1:HInpD2b9FXgJIcP/WDRuSW4Wri9i5WVglO9okFFuOow= -github.com/aws/aws-sdk-go v1.44.186/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.17.1 h1:02c72fDJr87N8RAC2s3Qu0YuvMRZKNZJ9F+lAehCazk= -github.com/aws/aws-sdk-go-v2 v1.17.1/go.mod h1:JLnGeGONAyi2lWXI1p0PCIOIy333JMVK1U7Hf0aRFLw= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9 h1:RKci2D7tMwpvGpDNZnGQw9wk6v7o/xSwFcUAuNPoB8k= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.9/go.mod h1:vCmV1q1VK8eoQJ5+aYE7PkK1K6v41qJ5pJdK3ggCDvg= -github.com/aws/aws-sdk-go-v2/config v1.18.3 h1:3kfBKcX3votFX84dm00U8RGA1sCCh3eRMOGzg5dCWfU= -github.com/aws/aws-sdk-go-v2/config v1.18.3/go.mod h1:BYdrbeCse3ZnOD5+2/VE/nATOK8fEUpBtmPMdKSyhMU= -github.com/aws/aws-sdk-go-v2/credentials v1.13.3 h1:ur+FHdp4NbVIv/49bUjBW+FE7e57HOo03ELodttmagk= -github.com/aws/aws-sdk-go-v2/credentials v1.13.3/go.mod h1:/rOMmqYBcFfNbRPU0iN9IgGqD5+V2yp3iWNmIlz0wI4= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19 h1:E3PXZSI3F2bzyj6XxUXdTIfvp425HHhwKsFvmzBwHgs= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.19/go.mod h1:VihW95zQpeKQWVPGkwT+2+WJNQV8UXFfMTWdU6VErL8= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.42 h1:bxgBYvvBh+W1RnNYP4ROXEB8N+HSSucDszfE7Rb+kfU= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.42/go.mod h1:LHOsygMiW/14CkFxdXxvzKyMh3jbk/QfZVaDtCbLkl8= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25 h1:nBO/RFxeq/IS5G9Of+ZrgucRciie2qpLy++3UGZ+q2E= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.25/go.mod h1:Zb29PYkf42vVYQY6pvSyJCJcFHlPIiY+YKdPtwnvMkY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19 h1:oRHDrwCTVT8ZXi4sr9Ld+EXk7N/KGssOr2ygNeojEhw= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.19/go.mod h1:6Q0546uHDp421okhmmGfbxzq2hBqbXFNpi4k+Q1JnQA= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26 h1:Mza+vlnZr+fPKFKRq/lKGVvM6B/8ZZmNdEopOwSQLms= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.26/go.mod h1:Y2OJ+P+MC1u1VKnavT+PshiEuGPyh/7DqxoDNij4/bg= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16 h1:2EXB7dtGwRYIN3XQ9qwIW504DVbKIw3r89xQnonGdsQ= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.16/go.mod h1:XH+3h395e3WVdd6T2Z3mPxuI+x/HVtdqVOREkTiyubs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10 h1:dpiPHgmFstgkLG07KaYAewvuptq5kvo52xn7tVSrtrQ= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.10/go.mod h1:9cBNUHI2aW4ho0A5T87O294iPDuuUOSIEDjnd1Lq/z0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20 h1:KSvtm1+fPXE0swe9GPjc6msyrdTT0LB/BP8eLugL1FI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.20/go.mod h1:Mp4XI/CkWGD79AQxZ5lIFlgvC0A+gl+4BmyG1F+SfNc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19 h1:GE25AWCdNUPh9AOJzI9KIJnja7IwUc1WyUqz/JTyJ/I= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.19/go.mod h1:02CP6iuYP+IVnBX5HULVdSAku/85eHB2Y9EsFhrkEwU= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19 h1:piDBAaWkaxkkVV3xJJbTehXCZRXYs49kvpi/LG6LR2o= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.19/go.mod h1:BmQWRVkLTmyNzYPFAZgon53qKLWBNSvonugD1MrSWUs= -github.com/aws/aws-sdk-go-v2/service/kms v1.19.0/go.mod h1:kZodDPTQjSH/qM6/OvyTfM5mms5JHB/EKYp5dhn/vI4= -github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4 h1:QgmmWifaYZZcpaw3y1+ccRlgH6jAvLm4K/MBGUc7cNM= -github.com/aws/aws-sdk-go-v2/service/s3 v1.29.4/go.mod h1:/NHbqPRiwxSPVOB2Xr+StDEH+GWV/64WwnUjv4KYzV0= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.16.8/go.mod h1:k6CPuxyzO247nYEM1baEwHH1kRtosRCvgahAepaaShw= -github.com/aws/aws-sdk-go-v2/service/sns v1.18.6 h1:rfQqunscpnVmvK6O9B2DwrBzIMICSCKswPwkD2XDan8= -github.com/aws/aws-sdk-go-v2/service/sns v1.18.6/go.mod h1:2cPUjR63iE9MPMPJtSyzYmsTFCNrN/Xi9j0v9BL5OU0= -github.com/aws/aws-sdk-go-v2/service/sqs v1.19.15 h1:5PgOVgJWObGxve+0qU7T/C0reU6RxqpNwbuunLT9Vlc= -github.com/aws/aws-sdk-go-v2/service/sqs v1.19.15/go.mod h1:DKX/7/ZiAzHO6p6AhArnGdrV4r+d461weby8KeVtvC4= -github.com/aws/aws-sdk-go-v2/service/ssm v1.33.1/go.mod h1:rEsqsZrOp9YvSGPOrcL3pR9+i/QJaWRkAYbuxMa7yCU= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.25 h1:GFZitO48N/7EsFDt8fMa5iYdmWqkUDDB3Eje6z3kbG0= -github.com/aws/aws-sdk-go-v2/service/sso v1.11.25/go.mod h1:IARHuzTXmj1C0KS35vboR0FeJ89OkEy1M9mWbK2ifCI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8 h1:jcw6kKZrtNfBPJkaHrscDOZoe5gvi9wjudnxvozYFJo= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.8/go.mod h1:er2JHN+kBY6FcMfcBBKNGCT3CarImmdFzishsqBmSRI= -github.com/aws/aws-sdk-go-v2/service/sts v1.17.5 h1:60SJ4lhvn///8ygCzYy2l53bFW/Q15bVfyjyAWo6zuw= -github.com/aws/aws-sdk-go-v2/service/sts v1.17.5/go.mod h1:bXcN3koeVYiJcdDU89n3kCYILob7Y34AeLopUbZgLT4= -github.com/aws/smithy-go v1.13.4 h1:/RN2z1txIJWeXeOkzX+Hk/4Uuvv7dWtCjbmVJcrskyk= -github.com/aws/smithy-go v1.13.4/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/aws-sdk-go v1.44.156/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.187/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.200/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.44.274 h1:vfreSv19e/9Ka9YytOzgzJasrRZfX7dnttLlbh8NKeA= +github.com/aws/aws-sdk-go v1.44.274/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= +github.com/aws/aws-sdk-go-v2 v1.17.4 h1:wyC6p9Yfq6V2y98wfDsj6OnNQa4w2BLGCLIxzNhwOGY= +github.com/aws/aws-sdk-go-v2 v1.17.4/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10 h1:dK82zF6kkPeCo8J1e+tGx4JdvDIQzj7ygIoLg8WMuGs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= +github.com/aws/aws-sdk-go-v2/config v1.18.12 h1:fKs/I4wccmfrNRO9rdrbMO1NgLxct6H9rNMiPdBxHWw= +github.com/aws/aws-sdk-go-v2/config v1.18.12/go.mod h1:J36fOhj1LQBr+O4hJCiT8FwVvieeoSGOtPuvhKlsNu8= +github.com/aws/aws-sdk-go-v2/credentials v1.13.12 h1:Cb+HhuEnV19zHRaYYVglwvdHGMJWbdsyP4oHhw04xws= +github.com/aws/aws-sdk-go-v2/credentials v1.13.12/go.mod h1:37HG2MBroXK3jXfxVGtbM2J48ra2+Ltu+tmwr/jO0KA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.22 h1:3aMfcTmoXtTZnaT86QlVaYh+BRMbvrrmZwIQ5jWqCZQ= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.22/go.mod h1:YGSIJyQ6D6FjKMQh16hVFSIUD54L4F7zTGePqYMYYJU= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.51 h1:iTFYCAdKzSAjGnVIUe88Hxvix0uaBqr0Rv7qJEOX5hE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.51/go.mod h1:7Grl2gV+dx9SWrUIgwwlUvU40t7+lOSbx34XwfmsTkY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 h1:r+XwaCLpIvCKjBIYy/HVZujQS9tsz5ohHG3ZIe0wKoE= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28/go.mod h1:3lwChorpIM/BhImY/hy+Z6jekmN92cXGPI1QJasVPYY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22 h1:7AwGYXDdqRQYsluvKFmWoqpcOQJ4bH634SkYf3FNj/A= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22/go.mod h1:EqK7gVrIGAHyZItrD1D8B0ilgwMD1GiWAmbU4u/JHNk= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.29 h1:J4xhFd6zHhdF9jPP0FQJ6WknzBboGMBNjKOv4iTuw4A= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.29/go.mod h1:TwuqRBGzxjQJIwH16/fOZodwXt2Zxa9/cwJC5ke4j7s= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.19 h1:FGvpyTg2LKEmMrLlpjOgkoNp9XF5CGeyAyo33LdqZW8= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.19/go.mod h1:8W88sW3PjamQpKFUQvHWWKay6ARsNvZnzU7+a4apubw= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11 h1:y2+VQzC6Zh2ojtV2LoC0MNwHWc6qXv/j2vrQtlftkdA= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.23 h1:c5+bNdV8E4fIPteWx4HZSkqI07oY9exbfQ7JH7Yx4PI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.23/go.mod h1:1jcUfF+FAOEwtIcNiHPaV4TSoZqkUIPzrohmD7fb95c= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.22 h1:LjFQf8hFuMO22HkV5VWGLBvmCLBCLPivUAmpdpnp4Vs= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.22/go.mod h1:xt0Au8yPIwYXf/GYPy/vl4K3CgwhfQMYbrH7DlUUIws= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.22 h1:ISLJ2BKXe4zzyZ7mp5ewKECiw0U7KpLgS3S6OxY9Cm0= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.22/go.mod h1:QFVbqK54XArazLvn2wvWMRBi/jGrWii46qbr5DyPGjc= +github.com/aws/aws-sdk-go-v2/service/kms v1.20.2/go.mod h1:vdqtUOdVuf5ooy+hJ2GnzqNo94xiAA9s1xbZ1hQgRE0= +github.com/aws/aws-sdk-go-v2/service/s3 v1.30.2 h1:5EQWIFO+Hc8E2hFcXQJ1vm6ufl/PMt/6RVRDZRju2vM= +github.com/aws/aws-sdk-go-v2/service/s3 v1.30.2/go.mod h1:SXDHd6fI2RhqB7vmAzyYQCTQnpZrIprVJvYxpzW3JAM= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.18.3/go.mod h1:hqPcyOuLU6yWIbLy3qMnQnmidgKuIEwqIlW6+chYnog= +github.com/aws/aws-sdk-go-v2/service/sns v1.20.2 h1:MU/v2qtfGjKexJ09BMqE8pXo9xYMhT13FXjKgFc0cFw= +github.com/aws/aws-sdk-go-v2/service/sns v1.20.2/go.mod h1:VN2n9SOMS1lNbh5YD7o+ho0/rgfifSrK//YYNiVVF5E= +github.com/aws/aws-sdk-go-v2/service/sqs v1.20.2 h1:CSNIo1jiw7KrkdgZjCOnotu6yuB3IybhKLuSQrTLNfo= +github.com/aws/aws-sdk-go-v2/service/sqs v1.20.2/go.mod h1:1ttxGjUHZliCQMpPss1sU5+Ph/5NvdMFRzr96bv8gm0= +github.com/aws/aws-sdk-go-v2/service/ssm v1.35.2/go.mod h1:VLSz2SHUKYFSOlXB/GlXoLU6KPYQJAbw7I20TDJdyws= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.1 h1:lQKN/LNa3qqu2cDOQZybP7oL4nMGGiFqob0jZJaR8/4= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.1/go.mod h1:IgV8l3sj22nQDd5qcAGY0WenwCzCphqdbFOpfktZPrI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.1 h1:0bLhH6DRAqox+g0LatcjGKjjhU6Eudyys6HB6DJVPj8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.1/go.mod h1:O1YSOg3aekZibh2SngvCRRG+cRHKKlYgxf/JBF/Kr/k= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.3 h1:s49mSnsBZEXjfGBkRfmK+nPqzT7Lt3+t2SmAKNyHblw= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.3/go.mod h1:b+psTJn33Q4qGoDaM7ZiOVVG8uVjGI6HaZ8WBHdgDgU= +github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= +github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 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= @@ -639,18 +668,17 @@ github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bradfitz/gomemcache v0.0.0-20170208213004-1952afaa557d/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bsm/ginkgo/v2 v2.5.0 h1:aOAnND1T40wEdAtkGSkvSICWeQ8L3UASX7YVCqQx+eQ= -github.com/bsm/gomega v1.20.0 h1:JhAwLmtRzXFTx2AkALSLa8ijZafntmhSoU63Ok18Uq8= +github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao= +github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -678,26 +706,29 @@ github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= 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/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -713,6 +744,8 @@ github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4S github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= +github.com/containerd/cgroups/v3 v3.0.1 h1:4hfGvu8rfGIwVIDd+nLzn/B9ZXx4BcCjzt5ToenJRaE= +github.com/containerd/cgroups/v3 v3.0.1/go.mod h1:/vtwk1VXrtoa5AaZLkypuOJgA/6DyPMZHJPGQNtlHnw= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= @@ -812,6 +845,7 @@ github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= @@ -850,7 +884,7 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cu github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/digitalocean/godo v1.78.0/go.mod h1:GBmu8MkjZmNARE7IXRPmkbbnocNN8+uBm0xbEVw2LCs= -github.com/digitalocean/godo v1.88.0/go.mod h1:NRpFznZFvhHjBoqZAaOD3khVzsJ3EibzKqFL4R60dmA= +github.com/digitalocean/godo v1.95.0/go.mod h1:NRpFznZFvhHjBoqZAaOD3khVzsJ3EibzKqFL4R60dmA= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= @@ -864,9 +898,10 @@ github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.8.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 v20.10.14+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.21+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.23+incompatible/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-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= @@ -874,6 +909,7 @@ github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6Uezg github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= @@ -902,7 +938,7 @@ github.com/emersion/go-smtp v0.16.0/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVR 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/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= 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= @@ -916,9 +952,9 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.6.13/go.mod h1:qEySVqXrEugbHKvmhI8ZqtQi75/RHSSRNpffvB4I6Bw= -github.com/envoyproxy/protoc-gen-validate v0.9.1 h1:PS7VIOgmSVhWUEeZwTe7z7zouA22Cr590PzXKbZHOVY= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v1.0.1 h1:kt9FtLiooDc0vbwTLhdg3dyNX1K9Qwa1EK9LcD4jVUQ= +github.com/envoyproxy/protoc-gen-validate v1.0.1/go.mod h1:0vj8bNkYbSTNS2PIyH87KZaeN4x9zpL9Qt8fQC7d+vs= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -928,22 +964,26 @@ github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+ne 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/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.3-0.20170329110642-4da3e2cfbabc/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 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/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= @@ -951,8 +991,8 @@ github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYis github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/getsentry/sentry-go v0.17.0 h1:UustVWnOoDFHBS7IJUB2QK/nB5pap748ZEp0swnQJak= -github.com/getsentry/sentry-go v0.17.0/go.mod h1:B82dxtBvxG0KaPD8/hfSV+VcHD+Lg/xUS4JuQn1P4cM= +github.com/getsentry/sentry-go v0.21.0 h1:c9l5F1nPF30JIppulk4veau90PK6Smu3abgVtVQWon4= +github.com/getsentry/sentry-go v0.21.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= 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= @@ -969,7 +1009,7 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= 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/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= @@ -992,9 +1032,11 @@ github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jT github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= +github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/errors v0.20.3/go.mod h1:Z3FlZ4I8jEGxjUK+bugx3on2mIAk4txuAOhlsB1FSgk= 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= @@ -1004,11 +1046,16 @@ github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwoh github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g= +github.com/go-openapi/loads v0.21.2/go.mod h1:Jq58Os6SSGz0rzh62ptiu8Z31I+OTHqmULx5e/gJbNw= github.com/go-openapi/runtime v0.23.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk= +github.com/go-openapi/runtime v0.25.0/go.mod h1:Ux6fikcHXyyob6LNWxtE96hWwjBPYF0DXgVFuMTneOs= 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/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= +github.com/go-openapi/spec v0.20.7/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg= github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k= @@ -1019,7 +1066,9 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.21.1/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-openapi/validate v0.21.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= +github.com/go-openapi/validate v0.22.0/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg= 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/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= @@ -1028,8 +1077,7 @@ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= @@ -1069,15 +1117,15 @@ github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblf github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= @@ -1093,11 +1141,12 @@ github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5 github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f h1:16RtHeWGkJMc80Etb8RPCcKevXGldr57+LOyZt8zOlg= github.com/golang/gddo v0.0.0-20210115222349-20d68f94ee1f/go.mod h1:ijRvpgDJDI262hYq/IQVYgf8hd8IHUs93Ol0kvMBAx4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 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= @@ -1199,8 +1248,10 @@ github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLe 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/pprof v0.0.0-20220318212150-b2ab0324ddda/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= -github.com/google/pprof v0.0.0-20221102093814-76f304f74e5e/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= +github.com/google/pprof v0.0.0-20230111200839-76d1ae5aea2b/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.3 h1:FAgZmpLl/SXurPEZyCMPBIiiYeTbqfjlbdnCNTAkbGE= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -1213,6 +1264,7 @@ github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1 github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= @@ -1226,15 +1278,15 @@ github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0 h1:UBtEZqx1bjXtOQ5BVTkuYghXrr3N4V123VKJK67vJZc= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gophercloud/gophercloud v0.24.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c= -github.com/gophercloud/gophercloud v1.0.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c= +github.com/gophercloud/gophercloud v1.1.1/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99 h1:twflg0XRTjwKpxb/jFExr4HGq6on2dEOmnL6FV+fgPw= github.com/gopherjs/gopherjs v0.0.0-20190910122728-9d188e94fb99/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -1253,6 +1305,7 @@ github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -1264,7 +1317,7 @@ github.com/gotnospirit/makeplural v0.0.0-20180622080156-a5f48d94d976/go.mod h1:Z github.com/gotnospirit/messageformat v0.0.0-20221001023931-dfe49f1eb092 h1:c7gcNWTSr1gtLp6PyYi3wzvFCEcHJ4YRobDgqmIgf7Q= github.com/gotnospirit/messageformat v0.0.0-20221001023931-dfe49f1eb092/go.mod h1:ZZAN4fkkful3l1lpJwF8JbW41ZiG9TwJ2ZlqzQovBNU= github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= -github.com/grafana/regexp v0.0.0-20221005093135-b4c2bcb0a4b6/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= github.com/gregjones/httpcache v0.0.0-20170920190843-316c5e0ff04e/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= @@ -1282,18 +1335,16 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.1/go.mod h1:G+WkljZi4mflcqVxYSgvt8MNctRQHjEH8ubKtt1Ka3w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 h1:gDLXvp5S9izjldquuoAhDzccbskOL6tDC5jMSyx3zxE= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAszqCJMbfTISJ7oMftp8+UGV08= -github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= -github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hanwen/go-fuse/v2 v2.2.0/go.mod h1:B1nGE/6RBFyBRC1RRnf23UpwCdyJ31eukw34oAKukAc= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/api v1.15.3/go.mod h1:/g/qgcoBcEXALCNZgRRisyTW0nY86++L0KbeAMXYCeY= +github.com/hashicorp/consul/api v1.18.0/go.mod h1:owRRGJ9M5xReDC5nfT8FTJrNAPbT4NM6p/k+d03q2v4= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= -github.com/hashicorp/consul/sdk v0.11.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= +github.com/hashicorp/consul/sdk v0.13.0/go.mod h1:0hs/l5fOVhJy/VdcoaNqUSi2AUs95eF5WKtv+EYIQqE= github.com/hashicorp/cronexpr v1.1.1/go.mod h1:P4wA0KBl9C5q2hABiMO7cp6jcIg96CDh1Efb3g1PWA4= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -1304,12 +1355,12 @@ github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/S github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= 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= @@ -1324,35 +1375,41 @@ github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdv 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-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v0.0.0-20170914154624-68e816d1c783/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/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/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= 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/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/nomad/api v0.0.0-20221102143410-8a95f1239005/go.mod h1:vgJmrz4Bz9E1cR/uy70oP9udUJKFRkcEYHlHTp4nFwI= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/nomad/api v0.0.0-20230124213148-69fd1a0e4bf7/go.mod h1:xYYd4dybIhRhhzDemKx7Ddt8CvCosgrEek8YM7/cF0A= 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/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hellofresh/health-go/v5 v5.0.0 h1:jxjllHekqEU4VYIajKJtFoOxDp1YaaygNWwAoZwWFh0= -github.com/hellofresh/health-go/v5 v5.0.0/go.mod h1:9hFVIBdKkxrg1bJurUPlw1D/0FWhl47IVfGYPy4Op9o= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hellofresh/health-go/v5 v5.1.1 h1:Ss0EQekzT45NVgk1hSgbXAa1LBaagZhqJ4Xql8bxxBA= +github.com/hellofresh/health-go/v5 v5.1.1/go.mod h1:ZUymhy/viIPx3xmGT9EkWny0CUZq9GLxqasC4Y2xdSc= github.com/hetznercloud/hcloud-go v1.33.1/go.mod h1:XX/TQub3ge0yWR2yHWmnDVIrB+MQbda1pHxkUmDlUME= -github.com/hetznercloud/hcloud-go v1.35.3/go.mod h1:mepQwR6va27S3UQthaEPGS86jtzSY9xWL1e9dyxXpgA= +github.com/hetznercloud/hcloud-go v1.39.0/go.mod h1:mepQwR6va27S3UQthaEPGS86jtzSY9xWL1e9dyxXpgA= github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef h1:A9HsByNhogrvm9cWb28sjiS3i7tcKCkflWFEkHfuAgM= github.com/howeyc/gopass v0.0.0-20210920133722-c8aef6fb66ef/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -1369,9 +1426,9 @@ github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/log15 v0.0.0-20170622235902-74a0988b5f80/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= github.com/ionos-cloud/sdk-go/v6 v6.1.3/go.mod h1:Ox3W0iiEz0GHnfY9e5LmAxwklsxguuNFEUSu0gVRTME= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= @@ -1402,8 +1459,9 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1: github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= @@ -1414,8 +1472,8 @@ github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9 github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= -github.com/jackc/pgx/v5 v5.2.0 h1:NdPpngX0Y6z6XDFKqmFQaE+bCtkqzvQIOt1wvBlAqs8= -github.com/jackc/pgx/v5 v5.2.0/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk= +github.com/jackc/pgx/v5 v5.3.1 h1:Fcr8QJ1ZeLi5zsPZqQeUZhNhxfkkKBOgJuYkJHoBOtU= +github.com/jackc/pgx/v5 v5.3.1/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= @@ -1430,16 +1488,21 @@ github.com/jacobsa/ogletest v0.0.0-20170503003838-80d50a735a11 h1:BMb8s3ENQLt5ul github.com/jacobsa/ogletest v0.0.0-20170503003838-80d50a735a11/go.mod h1:+DBdDyfoO2McrOyDemRBq0q9CMEByef7sYl7JH5Q3BI= github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb h1:uSWBjJdMf47kQlXMwWEfmc864bA1wAC+Kl3ApryuG9Y= github.com/jacobsa/reqtrace v0.0.0-20150505043853-245c9e0234cb/go.mod h1:ivcmUvxXWjb27NsPEaiYK7AidlZXS7oQ5PowUS9z3I4= -github.com/jarcoal/httpmock v1.2.0 h1:gSvTxxFR/MEMfsGrvRbdfpRUMBStovlSRLw0Ep1bwwc= -github.com/jarcoal/httpmock v1.2.0/go.mod h1:oCoTsnAz4+UoOUIf5lJOWV2QQIW5UoeUI6aM2YnWAZk= +github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= +github.com/jarcoal/httpmock v1.3.0/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba h1:QFQpJdgbON7I0jr2hYW7Bs+XV0qjc3d5tZoDnRFnqTg= github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -1454,7 +1517,6 @@ github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFF 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.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 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= @@ -1468,6 +1530,7 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 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/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -1480,8 +1543,8 @@ github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdY github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.11 h1:Lcadnb3RKGin4FYM/orgq0qde+nc15E5Cbqg4B9Sx9c= -github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= +github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kljensen/snowball v0.6.0/go.mod h1:27N7E8fVU5H68RlUmnWwZCfxgt4POBJfENGMvNRhldw= github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= github.com/kolo/xmlrpc v0.0.0-20220921171641-a4b6fa1dd06b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM= @@ -1510,19 +1573,18 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/linode/linodego v1.4.0/go.mod h1:PVsRxSlOiJyvG4/scTszpmZDTdgS+to3X6eS8pRrWI8= -github.com/linode/linodego v1.9.3/go.mod h1:h6AuFR/JpqwwM/vkj7s8KV3iGN8/jxn+zc437F8SZ8w= +github.com/linode/linodego v1.12.0/go.mod h1:NJlzvlNtdMRRkXb0oN6UWzUkj6t+IBsyveHgZ5Ppjyk= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.7.4-0.20170902060319-8d7837e64d3c/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -1561,15 +1623,17 @@ github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxatome/go-testdeep v1.11.0 h1:Tgh5efyCYyJFGUYiT0qxBSIDeXw0F5zSoatlou685kk= +github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/microsoft/ApplicationInsights-Go v0.4.4/go.mod h1:fKRUseBqkw6bDiXTs3ESTiU/4YTIHsQS4W3fP2ieF4U= -github.com/microsoft/go-mssqldb v0.17.0/go.mod h1:OkoNGhGEs8EZqchVTtochlXruEhEOaO4S0d2sB5aeGQ= +github.com/microsoft/go-mssqldb v0.18.0/go.mod h1:ukJCBnnzLzpVF0qYRT+eg1e+eSwjeQ7IvenUv8QPook= 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/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= @@ -1624,32 +1688,30 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m 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/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= +github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= github.com/nats-io/jwt/v2 v2.2.1-0.20220113022732-58e87895b296/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= -github.com/nats-io/jwt/v2 v2.3.0 h1:z2mA1a7tIf5ShggOFlR1oBPgd6hGqcDYsISxZByUzdI= -github.com/nats-io/jwt/v2 v2.3.0/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/jwt/v2 v2.4.1 h1:Y35W1dgbbz2SQUYDPCaclXcuqleVmpbRa7646Jf2EX4= +github.com/nats-io/jwt/v2 v2.4.1/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= +github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= github.com/nats-io/nats-server/v2 v2.7.2/go.mod h1:tckmrt0M6bVaDT3kmh9UrIq/CBOBBse+TpXQi5ldaa8= -github.com/nats-io/nats-server/v2 v2.9.11 h1:4y5SwWvWI59V5mcqtuoqKq6L9NDUydOP3Ekwuwl8cZI= -github.com/nats-io/nats-server/v2 v2.9.11/go.mod h1:b0oVuxSlkvS3ZjMkncFeACGyZohbO4XhSqW1Lt7iRRY= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nats-server/v2 v2.9.17 h1:gFpUQ3hqIDJrnqog+Bl5vaXg+RhhYEZIElasEuRn2tw= +github.com/nats-io/nats-server/v2 v2.9.17/go.mod h1:eQysm3xDZmIjfkjr7DuD9DjRFpnxQc2vKVxtEg0Dp6s= +github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nats.go v1.13.1-0.20220121202836-972a071d373d/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= -github.com/nats-io/nats.go v1.20.0/go.mod h1:tLqubohF7t4z3du1QDPYJIQQyhb4wl6DhjxEajSI7UA= -github.com/nats-io/nats.go v1.23.0 h1:lR28r7IX44WjYgdiKz9GmUeW0uh/m33uD3yEjLZ2cOE= github.com/nats-io/nats.go v1.23.0/go.mod h1:ki/Scsa23edbh8IRZbCuNXR9TDcbvfaSijKtaqQgw+Q= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= +github.com/nats-io/nats.go v1.26.0 h1:fWJTYPnZ8DzxIaqIHOAMfColuznchnd5Ab5dbJpgPIE= +github.com/nats-io/nats.go v1.26.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= +github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +github.com/nats-io/nkeys v0.4.4 h1:xvBJ8d69TznjcQl9t6//Q5xXuVhyYiSos6RPtvQNTwA= +github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= 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/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU= @@ -1669,10 +1731,13 @@ github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0 github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= 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/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/ginkgo/v2 v2.1.4/go.mod h1:um6tUpWM/cxCK3/FK8BXqEiUMUwRgSM4JXG47RKZmLU= github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk= +github.com/onsi/ginkgo/v2 v2.3.0/go.mod h1:Eew0uilEqZmIEZr8JrvYlvOM7Rr6xzTmMV8AyFNU9d0= +github.com/onsi/ginkgo/v2 v2.4.0/go.mod h1:iHkDK1fKGcBoEHT5W7YBq4RFWaQulw+caOMkAt4OrFo= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -1682,10 +1747,14 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J 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.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo= +github.com/onsi/gomega v1.21.1/go.mod h1:iYAIXgPSaDHak0LCMA+AWBpIKBr8WZicMxnE8luStNc= +github.com/onsi/gomega v1.22.1/go.mod h1:x6n7VNe4hw0vkyYUM4mjIXx3JbLiPaBPNgB7PRQ1tuM= +github.com/onsi/gomega v1.23.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -1708,6 +1777,7 @@ github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/ github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= @@ -1718,17 +1788,10 @@ github.com/openshift/build-machinery-go v0.0.0-20200917070002-f171684f77ab/go.mo github.com/openshift/osin v1.0.2-0.20220317075346-0f4d38c6e53f h1:4da9vH8eDlJo58703cADj3FlsdnFRgsnfuwj/4lYXfY= github.com/openshift/osin v1.0.2-0.20220317075346-0f4d38c6e53f/go.mod h1:DoYehsADYGKlXTIvqyZVnopfJbWgT6UsQYf8ETt1vjw= github.com/openshift/osincli v0.0.0-20160924135400-fababb0555f2/go.mod h1:Riv9DbfKiX3y9ebcS4PHU4zLhVXu971+4jCVwKIue5M= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/ovh/go-ovh v1.1.0/go.mod h1:AxitLZ5HBRPyUd+Zl60Ajaag+rNTdVXWIkzfrVuTXWA= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= +github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= +github.com/ovh/go-ovh v1.3.0/go.mod h1:AxitLZ5HBRPyUd+Zl60Ajaag+rNTdVXWIkzfrVuTXWA= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o= @@ -1739,14 +1802,15 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9 github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= +github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= @@ -1768,38 +1832,34 @@ github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prY github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/alertmanager v0.24.0/go.mod h1:r6fy/D7FRuZh5YbnX6J3MBY0eI4Pb5yPYS7/bPSXXqI= +github.com/prometheus/alertmanager v0.25.0/go.mod h1:MEZ3rFVHqKZsw7IcNS/m4AWZeXThmJhumpiWR4eHU/w= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/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-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= 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.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_golang v1.13.0/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.13.1/go.mod h1:vTeo+zgvILHsnnj/39Ou/1fPN5nJFOEMgftOUOmlvYQ= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/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.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 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.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= @@ -1809,6 +1869,8 @@ github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+ github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/common v0.35.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.38.0/go.mod h1:MBXfmBQZrK5XpbCkjofnXs96LD2QQ7fEq4C0xjC/yec= +github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/common/assets v0.1.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= @@ -1818,7 +1880,6 @@ github.com/prometheus/exporter-toolkit v0.7.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQY github.com/prometheus/exporter-toolkit v0.8.2/go.mod h1:00shzmJL7KxcsabLWcONwpyNEuWhREOnFqZW7vadFS0= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/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-20190117184657-bf6a532e95b1/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.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -1833,15 +1894,15 @@ github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0ua github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/prometheus v0.35.0/go.mod h1:7HaLx5kEPKJ0GDgbODG0fZgXbQ8K/XjZNJXQmbmgQlY= -github.com/prometheus/prometheus v0.40.5/go.mod h1:bxgdmtoSNLmmIVPGmeTJ3OiP67VmuY4yalE4ZP6L/j8= +github.com/prometheus/prometheus v0.42.0/go.mod h1:Pfqb/MLnnR2KK+0vchiaH39jXxvLMBk+3lnIGP4N7Vk= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.0.2 h1:BA426Zqe/7r56kCcvxYLWe1mkaz71LKF77GwgFzSxfE= -github.com/redis/go-redis/v9 v9.0.2/go.mod h1:/xDTe9EF1LM61hek62Poq2nzQSGj0xSrEtEHbBQevps= +github.com/redis/go-redis/v9 v9.0.5 h1:CuQcn5HIEeK7BgElubPP8CGtE0KakrnbBSTLjathl5o= +github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= @@ -1866,10 +1927,11 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.12/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg= github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= 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= @@ -1879,7 +1941,7 @@ github.com/sendgrid/rest v2.6.9+incompatible h1:1EyIcsNdn9KIisLW50MKwmSRSK+ekuei github.com/sendgrid/rest v2.6.9+incompatible/go.mod h1:kXX7q3jZtJXK5c5qK83bSGMdV6tsOE70KbHoqJls4lE= github.com/sendgrid/sendgrid-go v3.12.0+incompatible h1:/N2vx18Fg1KmQOh6zESc5FJB8pYwt5QFBDflYPh1KVg= github.com/sendgrid/sendgrid-go v3.12.0+incompatible/go.mod h1:QRQt+LX/NmgVEvmdRw0VT/QgUn499+iza2FnDca9fg8= -github.com/shoenig/test v0.4.3/go.mod h1:xYtyGBC5Q3kzCNyJg/SjgNpfAa2kvmgA0i5+lQso8x0= +github.com/shoenig/test v0.6.0/go.mod h1:xYtyGBC5Q3kzCNyJg/SjgNpfAa2kvmgA0i5+lQso8x0= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -1895,12 +1957,14 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/assertions v1.13.0 h1:Dx1kYM01xsSqKPno3aqLnrwac2LetPvN23diwyr69Qs= -github.com/smartystreets/assertions v1.13.0/go.mod h1:wDmR7qL282YbGsPy6H/yAsesrxfxaaSlJazyFLYVFx8= +github.com/smartystreets/assertions v1.13.1 h1:Ef7KhSmjZcK6AVf9YbJdvPYG9avaF0ZxudX+ThRdWfU= +github.com/smartystreets/assertions v1.13.1/go.mod h1:cXr/IwVfSo/RbCSPhoAPv73p3hlSdrBH/b3SdnW/LMY= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -1912,21 +1976,23 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= -github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= github.com/spf13/cast v1.1.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= 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.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v0.0.0-20170901151539-12bd96e66386/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= @@ -1942,8 +2008,9 @@ github.com/spf13/viper v1.0.0/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7Sr github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= @@ -1951,8 +2018,8 @@ github.com/steveyen/gtreap v0.1.0 h1:CjhzTa274PyJLJuMZwIzCO1PfC00oRa8d1Kc78bFXJM github.com/steveyen/gtreap v0.1.0/go.mod h1:kl/5J7XbrOmlIbYIXdRHDDE5QxHqpk0cmkT7Z4dM9/Y= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 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= @@ -1968,11 +2035,14 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -2001,12 +2071,12 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/uptrace/bun v1.1.10 h1:wx80lg32mWlOV1gNvmPTbR9znt6A2fYvvURzU5dzSPE= -github.com/uptrace/bun v1.1.10/go.mod h1:pOWJSVU+W0jp3+cbn/TtHdcG/h+QxagECw4EYdKiaSw= -github.com/uptrace/bun/dialect/pgdialect v1.1.10 h1:H25ieb5OJV5ywvKvswF++wMTnePRaGRiSNkYCRXrQxc= -github.com/uptrace/bun/dialect/pgdialect v1.1.10/go.mod h1:leDSw/IC70/GYPIU3zC8fkOZpJaJ28f51OMT1VnZiY8= -github.com/uptrace/bun/driver/pgdriver v1.1.10 h1:xmabc3eG5rz8FadFF3GrQiGs5XvXlz6CJUMZhne+1sM= -github.com/uptrace/bun/driver/pgdriver v1.1.10/go.mod h1:krWrOAzJmroYDySsA6oNsJEVUmKl+ZBWLkGHphXUxqI= +github.com/uptrace/bun v1.1.14 h1:S5vvNnjEynJ0CvnrBOD7MIRW7q/WbtvFXrdfy0lddAM= +github.com/uptrace/bun v1.1.14/go.mod h1:RHk6DrIisO62dv10pUOJCz5MphXThuOTpVNYEYv7NI8= +github.com/uptrace/bun/dialect/pgdialect v1.1.14 h1:b7+V1KDJPQSFYgkG/6YLXCl2uvwEY3kf/GSM7hTHRDY= +github.com/uptrace/bun/dialect/pgdialect v1.1.14/go.mod h1:v6YiaXmnKQ2FlhRD2c0ZfKd+QXH09pYn4H8ojaavkKk= +github.com/uptrace/bun/driver/pgdriver v1.1.14 h1:V2Etm7mLGS3mhx8ddxZcUnwZLX02Jmq9JTlo0sNVDhA= +github.com/uptrace/bun/driver/pgdriver v1.1.14/go.mod h1:D4FjWV9arDYct6sjMJhFoyU71SpllZRHXFRRP2Kd0Kw= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -2057,12 +2127,15 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= @@ -2070,11 +2143,9 @@ go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R7 go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= -go.mongodb.org/mongo-driver v1.10.2/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8= +go.mongodb.org/mongo-driver v1.11.0/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= 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= @@ -2085,56 +2156,59 @@ go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.41.0 h1:3ceTL0QoDc6yNWF7GxqF5JYP2tdhtVNZXajXfq2Yw5M= -go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.41.0/go.mod h1:JrvNPF0mxy8T9Bt3z5I2uKWIPktlisu/RYGrzzPj9Rc= +go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.42.0 h1:M21Uhqx97uKzB9NhtPxUGT1EzP/AkLaVHD5vib+qoK4= +go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.42.0/go.mod h1:hZGj9DTQYUAszT7dWME6Ls2nWHrJAyyjTtBrBvK6QJw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 h1:Ky1MObd188aGbgb5OgNnwGuEEwI9MVIcc7rBW6zk5Ak= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0 h1:ZOLJc06r4CB42laIXg/7udr0pbZyuAihN10A/XuiQRY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0/go.mod h1:PFmBsWbldL1kiWZk9+0LBZz2brhByaGsvp6pRICMlPE= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4/go.mod h1:l2MdsbKTocpPS5nQZscqTR9jd8u96VYZdcpF8Sye7mA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0 h1:lE9EJyw3/JhrjWH/hEy9FptnalDQgj7vpbgC2KCCCxE= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.40.0/go.mod h1:pcQ3MM3SWvrA71U4GDqv9UFDJ3HQsW7y5ZO3tDTlUdI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.37.0/go.mod h1:+ARmXlUlc51J7sZeCBkBJNdHGySrdOzgzxp6VWRWM1U= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 h1:pginetY7+onl4qN1vl0xW/V/v6OBZ0vVdH+esuJgvmM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0/go.mod h1:XiYsayHc36K3EByOO6nbAXnAWbrUxdjUROCEeeROOH8= go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ= go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ= go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE= -go.opentelemetry.io/otel v1.15.0 h1:NIl24d4eiLJPM0vKn4HjLYM+UZf6gSfi9Z+NmCxkWbk= -go.opentelemetry.io/otel v1.15.0/go.mod h1:qfwLEbWhLPk5gyWrne4XnF0lC8wtywbuJbgfAE3zbek= +go.opentelemetry.io/otel v1.11.2/go.mod h1:7p4EUV+AqgdlNV9gL97IgUZiVR3yrFXYo53f9BM3tRI= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.1/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.1/go.mod h1:i8vjiSzbiUC7wOQplijSXMYUpNM93DtlS5CbUT+C6oQ= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.0 h1:ZSdnH1x5Gm/eUFNQquwSt4/LMCOqS6KPlI9qaTKx5Ho= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.15.0/go.mod h1:uOTV75+LOzV+ODmL8ahRLWkFA3eQcSC2aAsbxIu4duk= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.11.2/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1/go.mod h1:YJ/JbY5ag/tSQFXzH3mtDmHqzF3aFn3DI/aB1n7pt4w= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.1/go.mod h1:19O5I2U5iys38SsmT2uDJja/300woyzE1KPIQxEUBUc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.0 h1:rk5I7PaOk5NGQHfHR2Rz6MgdA8AYQSHwsigFsOxEC1c= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.15.0/go.mod h1:pvkFJxNUXyJ5i8u6m8NIcqkoOf/65VM2mSyBbBJfeVQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.11.2/go.mod h1:5Qn6qvgkMsLDX+sYK64rHb1FPhpn0UtxF+ouX1uhyJE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0/go.mod h1:JgXSGah17croqhJfhByOLVY719k1emAXC8MVhCIJlRs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1/go.mod h1:UJJXJj0rltNIemDMwkOJyggsvyMG9QHfJeFH0HS5JjM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.1/go.mod h1:QrRRQiY3kzAoYPNLP0W/Ikg0gR6V3LMc+ODSxr7yyvg= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0 h1:Wz7UQn7/eIqZVDJbuNEM6PmqeA71cWXrWcXekP5HZgU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0/go.mod h1:OhH1xvgA5jZW2M/S4PcvtDlFE1VULRRBsibBrKuJQGI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.11.2/go.mod h1:jWZUM2MWhWCJ9J9xVbRx7tzK1mXKpAlze4CeulycwVY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 h1:TVQp/bboR4mhZSav+MdgXB8FaRho1RC8UwVn3T0vjVc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0/go.mod h1:I33vtIe0sR96wfrUcilIzLoA3mLHhRmz9S9Te0S3gDo= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1/go.mod h1:DAKwdo06hFLc0U88O10x4xnb5sc7dDRDqRuiN+io8JE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.11.1/go.mod h1:X620Jww3RajCJXw/unA+8IRTgxkdS7pi+ZwK9b7KUJk= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.13.0 h1:rs3xmoGZsuHJxUUzX2dwYNDc7S0L68oEo2L/MvG5cyc= -go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.13.0/go.mod h1:gr0y6t58jZxp9WtIAGKXxXenDWC91hmZivlGoOag3+4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.11.2/go.mod h1:GZWSQQky8AgdJj50r1KJm8oiQiIPaAX7uZCFQX9GzC8= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 h1:+XWJd3jf75RXJq29mxbuXhCXFDG3S3R4vBUeSI2P7tE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0/go.mod h1:hqgzBPTf4yONMFgdZvL/bK42R/iinTyVQtiWihs3SZc= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw= -go.opentelemetry.io/otel/metric v0.33.0/go.mod h1:QlTYc+EnYNq/M2mNk1qDDMRLpqCOj2f/r5c7Fd5FYaI= -go.opentelemetry.io/otel/metric v0.37.0 h1:pHDQuLQOZwYD+Km0eb657A25NaRzy0a+eLyKfDXedEs= -go.opentelemetry.io/otel/metric v0.37.0/go.mod h1:DmdaHfGt54iV6UKxsV9slj2bBRJcKC1B1uvDLIioc1s= +go.opentelemetry.io/otel/metric v0.34.0/go.mod h1:ZFuI4yQGNCupurTXCwkeD/zHBt+C2bR7bw5JqUm/AP8= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= go.opentelemetry.io/otel/sdk v1.6.1/go.mod h1:IVYrddmFZ+eJqu2k38qD3WezFR2pymCzm8tdxyh3R4E= go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys= -go.opentelemetry.io/otel/sdk v1.15.0 h1:jZTCkRRd08nxD6w7rIaZeDNGZGGQstH3SfLQ3ZsKICk= -go.opentelemetry.io/otel/sdk v1.15.0/go.mod h1:XDEMrYWzJ4YlC17i6Luih2lwDw2j6G0PkUfr1ZqE+rQ= +go.opentelemetry.io/otel/sdk v1.11.2/go.mod h1:wZ1WxImwpq+lVRo4vsmSOxdd+xwoUJ6rqyLc3SyX9aU= +go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= @@ -2142,24 +2216,25 @@ go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKu go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE= go.opentelemetry.io/otel/trace v1.6.1/go.mod h1:RkFRM1m0puWIq10oxImnGEduNBzxiN7TXluRBtE+5j0= go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk= -go.opentelemetry.io/otel/trace v1.15.0 h1:5Fwje4O2ooOxkfyqI/kJwxWotggDLix4BSAvpE1wlpo= -go.opentelemetry.io/otel/trace v1.15.0/go.mod h1:CUsmE2Ht1CRkvE8OsMESvraoZrrcgD1J2W8GV1ev0Y4= +go.opentelemetry.io/otel/trace v1.11.2/go.mod h1:4N+yC7QEz7TTsG9BSRLNAa63eg5E06ObSbKPmxQ/pKA= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.opentelemetry.io/proto/otlp v0.12.1/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.packetbroker.org/api/iam v1.5.27 h1:11zFINS05aYg6pSuJpS7ObE6GvU7rgzKpjrpXDDXcBA= -go.packetbroker.org/api/iam v1.5.27/go.mod h1:6XUeoMoCi9wkbTNR6PKPzbLMasGr6d4eM2p/DqHyEx4= -go.packetbroker.org/api/iam/v2 v2.7.8 h1:7ejsuOcxfxc3qiuIfwjXLukcGrN60walAi9Gb8CcDII= -go.packetbroker.org/api/iam/v2 v2.7.8/go.mod h1:zU/7Ec1x/71YncuQrm2vxlYJiCpj1gZzitOSFr6BVuM= -go.packetbroker.org/api/mapping/v2 v2.1.27 h1:j4swqJJPN74W28bRMtVM5o/Ms8XVFS7PXgIymR7yWF0= -go.packetbroker.org/api/mapping/v2 v2.1.27/go.mod h1:O1M0oa+6Pn7HjmnhlKv6qzGVjpecU8YcPkv76W+WH78= -go.packetbroker.org/api/routing v1.8.18 h1:U6ctgJcTS3wEJ4rqNwM/j2XUGouOL59Zl0zO/RxKdjA= -go.packetbroker.org/api/routing v1.8.18/go.mod h1:mwfrtAZH5kFGd4HXpKYFOgMbQ5tiA/n+soS7ajG0azU= -go.packetbroker.org/api/v3 v3.12.4 h1:3BGiYBgN20SaUrlucpIZ+PWy7Az/foM/ilM4zRs2iEk= -go.packetbroker.org/api/v3 v3.12.4/go.mod h1:ovVOyAdBDz8eT6B6JIOnDefQRTcGl42vhszDlbqTxGY= +go.packetbroker.org/api/iam v1.6.0 h1:Qkq+fVZxihQPxhxwW2l+AFqRbMgTemuuPjrZ9vySzXk= +go.packetbroker.org/api/iam v1.6.0/go.mod h1:JnrI9j4j90XftftRALhaDlr+5oKcjkD/jnTqauXafRk= +go.packetbroker.org/api/iam/v2 v2.7.10 h1:0qxqlSOwCoC3fVr4Fhp/bqIhGFyzryQTcjfCfF5D6rQ= +go.packetbroker.org/api/iam/v2 v2.7.10/go.mod h1:PBGDDvnvsdkhtkcAor3PeBnCvQO4NjB/pDaqkPQrUsg= +go.packetbroker.org/api/mapping/v2 v2.1.29 h1:yacJWttIF03KovuxemA/sn2WYnLc6cp7Mi/QnUAzvgU= +go.packetbroker.org/api/mapping/v2 v2.1.29/go.mod h1:2p+8pc3zKZgOcosqiQrI6VDTvDDp6qrv3UObm1cOuMQ= +go.packetbroker.org/api/routing v1.8.20 h1:nIbVrj3D//Y4lRcH2KazeVOyapUtaLY50T5GGapnRXI= +go.packetbroker.org/api/routing v1.8.20/go.mod h1:cDGUBlDBV0canSuzfNwWU/onEIXq4EwsdZqbnT/FZy0= +go.packetbroker.org/api/v3 v3.13.0 h1:YAlRUK38sUOsXpEz2Pk8BANvHjRUh6yeUMvfliGcl/0= +go.packetbroker.org/api/v3 v3.13.0/go.mod h1:Ocd3Ia7E8c/1zZ4h/8LL9o4I/dDFdpSW8WGqMtTh6Jw= go.thethings.network/lorawan-application-payload v0.0.0-20220125153912-1198ff1e403e h1:TWGQ3lh7gI2W5hnb6qPdpoAa0d7s/XPwvgf2VVCMJaY= go.thethings.network/lorawan-application-payload v0.0.0-20220125153912-1198ff1e403e/go.mod h1:/smENFuESiJCyWRsHRLBjbZGMN889BORQXIPP6NlpZE= go.thethings.network/lorawan-stack-legacy/v2 v2.1.0 h1:xP1fElQiH8/6GWXg6JG8UqRD0uluhmicIRS4e/BzcAw= @@ -2176,29 +2251,31 @@ go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66 go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME= go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= -go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -gocloud.dev v0.28.0 h1:PjL1f9zu8epY1pFCIHdrQnJRZzRcDyAr18hNTkXIKlQ= -gocloud.dev v0.28.0/go.mod h1:nzSs01FpRYyIb/OqXLNNa+NMPZG9CdTUY/pGLgSpIN0= -gocloud.dev/pubsub/natspubsub v0.28.0 h1:lbGSzp/7JvjrH1Dy08sKe4X4xMQV92i7qBlaZ/iS+lg= -gocloud.dev/pubsub/natspubsub v0.28.0/go.mod h1:+J484VYToq+UwV3dETa/mYaIKJyMeWiZusnCdZAgcFw= +gocloud.dev v0.29.0 h1:fBy0jwJSmxs0IjT0fE32MO+Mj+307VZQwyHaTyFZbC4= +gocloud.dev v0.29.0/go.mod h1:E3dAjji80g+lIkq4CQeF/BTWqv1CBeTftmOb+gpyapQ= +gocloud.dev/pubsub/natspubsub v0.29.0 h1:hWZIiOKobmnKIxqafE3a9F7PwPbQAICsR3VIHP1O0/4= +gocloud.dev/pubsub/natspubsub v0.29.0/go.mod h1:cttQWH84CiJzyhfcTneSbjD3Bux+0jwnhvtgsBDTtL0= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -2215,9 +2292,11 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U 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-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= @@ -2227,21 +2306,29 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 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-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20221012134737-56aed061732a/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= +golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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= @@ -2251,9 +2338,11 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 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/exp v0.0.0-20221031165847-c99f073a8326/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230108222341-4b8118a2686a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230124195608-d38c7dcee874/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2 h1:Jvc7gsqn21cJHCmAWx0LiimpP18LZmUxkT5Mp7EZ1mI= golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= 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/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -2287,6 +2376,7 @@ golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2296,7 +2386,6 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r 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-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -2347,9 +2436,11 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2359,20 +2450,25 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220907135653-1e95f45603a7/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220921155015-db77216a4ee9/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= -golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2390,6 +2486,7 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ 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/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= @@ -2401,10 +2498,11 @@ golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.2.0/go.mod h1:Cwn6afJ8jrQwYMxQDTpISoXmXW9I6qF6vDeuuoX3Ibs= -golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/sync v0.0.0-20170517211232-f52d1811a629/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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= @@ -2418,11 +2516,13 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ 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/sync v0.0.0-20220513210516-0976fa681c29/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= +golang.org/x/sync v0.2.0/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= @@ -2430,7 +2530,6 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/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/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2470,7 +2569,6 @@ golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7w 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-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/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= @@ -2569,17 +2667,19 @@ golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220708085239-5a0f0661e09d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908150016-7ac13a9a928d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/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-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -2588,8 +2688,10 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -2602,6 +2704,7 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= @@ -2619,15 +2722,15 @@ golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.2.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/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-20180525024113-a5b4c53f6e8b/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-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-20190206041539-40960b6deb8e/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= @@ -2706,6 +2809,9 @@ golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/tools v0.5.0/go.mod h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2717,9 +2823,12 @@ golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNq golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.0.0-20170921000349-586095a6e407/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= 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= @@ -2751,6 +2860,7 @@ google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqiv google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= @@ -2761,6 +2871,7 @@ google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69 google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= @@ -2773,10 +2884,14 @@ google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91 google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.104.0/go.mod h1:JCspTXJbBxa5ySXw4UgUqVer7DfVxbvc/CTUFqAED5U= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.122.0 h1:zDobeejm3E7pEG1mNHvdxvjs5XJoCMzyNH+CmwL94Es= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= 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.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= @@ -2792,7 +2907,6 @@ google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRn 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-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= 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= @@ -2856,7 +2970,9 @@ google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= @@ -2877,6 +2993,7 @@ google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= @@ -2905,21 +3022,32 @@ google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221205194025-8222ab48f5fc/go.mod h1:1dOng4TWOomJrDGhpXjfCD35wQC6jnC7HpRmOFRqEV0= +google.golang.org/genproto v0.0.0-20221206210731-b1a01be3a5f6/go.mod h1:1dOng4TWOomJrDGhpXjfCD35wQC6jnC7HpRmOFRqEV0= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e h1:Ao9GzfUMPH3zjVfzXG5rlWlk+Q8MXWKwWpwVQE1MXfw= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.2.1-0.20170921194603-d4b75ebd4f9f/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -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.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= 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.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= @@ -2957,8 +3085,10 @@ google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.52.1/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 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= @@ -3003,6 +3133,7 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mail.v2 v2.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk= gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v1 v1.1.2/go.mod h1:QpYS+a4WhS+DTlyQIi6Ka7MS3SuR9a055rgXNEe6EiA= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -3011,6 +3142,7 @@ gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76 gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/telebot.v3 v3.0.0/go.mod h1:7rExV8/0mDDNu9epSrDm/8j22KLaActH1Tbee6YjzWg= +gopkg.in/telebot.v3 v3.1.2/go.mod h1:GJKwwWqp9nSkIVN51eRKU78aB5f5OnQuWdwiIZfPbko= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -3032,7 +3164,6 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -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= @@ -3045,14 +3176,14 @@ k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8= -k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI= +k8s.io/api v0.26.1/go.mod h1:xd/GBNgR0f707+ATNyPmQ1oyKSgndzXij81FzWGsejg= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= -k8s.io/apimachinery v0.25.3/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo= +k8s.io/apimachinery v0.26.1/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= @@ -3062,7 +3193,7 @@ k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4= -k8s.io/client-go v0.25.3/go.mod h1:t39LPczAIMwycjcXkVc+CB+PZV69jQuNx4um5ORDjQA= +k8s.io/client-go v0.26.1/go.mod h1:IWNSglg+rQ3OcvDkhY6+QLeasV4OYHDjdqeWkDQZwGE= k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= @@ -3084,25 +3215,27 @@ k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.70.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/klog/v2 v2.80.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/kube-openapi v0.0.0-20221207184640-f3cff1453715/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20220728103510-ee6ede2d64ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo= mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 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/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= @@ -3110,6 +3243,7 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyz sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= @@ -3119,4 +3253,3 @@ sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ih sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/package.json b/package.json index 26fdf8525a..8206460a52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ttn-stack", - "version": "3.25.1", + "version": "3.26.1", "description": "The Things Stack", "main": "index.js", "repository": "https://github.com/TheThingsNetwork/lorawan-stack.git", @@ -18,8 +18,8 @@ "@babel/preset-env": "^7.16.11", "@babel/preset-react": "^7.16.0", "@babel/register": "^7.21.0", - "@babel/runtime-corejs2": "^7.20.1", - "@cypress/code-coverage": "^3.10.0", + "@babel/runtime-corejs2": "^7.21.5", + "@cypress/code-coverage": "^3.10.4", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.8", "@storybook/addon-actions": "^6.4.9", "@storybook/addon-info": "6.0.0-alpha.2", @@ -32,7 +32,7 @@ "babel-plugin-react-intl": "^3.0.1", "babel-plugin-react-intl-auto": "^3.3.0", "clean-webpack-plugin": "^4.0.0", - "copy-webpack-plugin": "^6.4.0", + "copy-webpack-plugin": "^11.0.0", "css-hot-loader": "^1.4.4", "css-loader": "^5.2.7", "cypress": "7.7.0", @@ -57,8 +57,8 @@ "js-yaml": "^4.0.0", "json": "^11.0.0", "messageformat-parser": "^4.1.3", - "mini-css-extract-plugin": "^1.3.8", - "mjml": "^4.13.0", + "mini-css-extract-plugin": "^2.7.5", + "mjml": "^4.14.1", "mkdirp": "^3.0.1", "nib": "^1.2.0", "pg": "^8.8.0", @@ -68,10 +68,9 @@ "stylus": "^0.59.0", "stylus-loader": "^4.3.3", "wait-on": "^6.0.1", - "webpack": "^4.46.0", - "webpack-cli": "^3.3.12", - "webpack-dev-server": "^4.13.3", - "webpack-plugin-hash-output": "^3.1.0", + "webpack": "^5.82.1", + "webpack-cli": "^5.1.1", + "webpack-dev-server": "^4.15.0", "webpack-shell-plugin": "https://github.com/cdeutsch/webpack-shell-plugin.git#bee537d", "yargs": "^17.7.2" }, @@ -110,7 +109,7 @@ "react-display-name": "^0.2.5", "react-dom": "^17.0.1", "react-focus-lock": "^2.9.4", - "react-grid-system": "^8.1.5", + "react-grid-system": "^8.1.9", "react-helmet": "^6.1.0", "react-intl": "^6.2.4", "react-leaflet": ">=3.1.0 <3.2.0", @@ -124,7 +123,7 @@ "react-text-mask": "^5.5.0", "react-toastify": "^8.1.0", "react-virtualized-auto-sizer": "^1.0.4", - "react-window": "^1.8.6", + "react-window": "^1.8.9", "redux": "^4.2.1", "redux-actions": "^2.6.5", "redux-logic": "^3.0.2", diff --git a/pkg/account/server.go b/pkg/account/server.go index 2884c39119..a7b7f99655 100644 --- a/pkg/account/server.go +++ b/pkg/account/server.go @@ -90,7 +90,7 @@ func (s *server) configFromContext(ctx context.Context) *oauth.Config { return &s.config } -func (s *server) Printf(format string, v ...interface{}) { +func (s *server) Printf(format string, v ...any) { log.FromContext(s.c.Context()).Warnf(format, v...) } diff --git a/pkg/account/server_test.go b/pkg/account/server_test.go index 8797795f4c..25dccfe6e6 100644 --- a/pkg/account/server_test.go +++ b/pkg/account/server_test.go @@ -142,7 +142,7 @@ func TestAuthentication(t *testing.T) { StoreCheck func(*testing.T, *mockStore) Method string Path string - Body interface{} + Body any ExpectedCode int ExpectedRedirect string ExpectedBody string diff --git a/pkg/applicationserver/grpc_deviceregistry_test.go b/pkg/applicationserver/grpc_deviceregistry_test.go index b53ca0a878..2afb176779 100644 --- a/pkg/applicationserver/grpc_deviceregistry_test.go +++ b/pkg/applicationserver/grpc_deviceregistry_test.go @@ -302,7 +302,7 @@ func TestDeviceRegistryGet(t *testing.T) { return tc.GetFunc(ctx, ids, paths) }, }, - })).(*applicationserver.ApplicationServer) + })) as.AddContextFiller(tc.ContextFunc) as.AddContextFiller(func(ctx context.Context) context.Context { @@ -583,7 +583,7 @@ func TestDeviceRegistrySet(t *testing.T) { Formatters: applicationserver.FormattersConfig{ MaxParameterLength: maxParameterLength, }, - })).(*applicationserver.ApplicationServer) + })) as.AddContextFiller(tc.ContextFunc) as.AddContextFiller(func(ctx context.Context) context.Context { @@ -773,7 +773,7 @@ func TestDeviceRegistryDelete(t *testing.T) { return tc.SetFunc(ctx, deviceIds, paths, cb) }, }, - })).(*applicationserver.ApplicationServer) + })) as.AddContextFiller(tc.ContextFunc) as.AddContextFiller(func(ctx context.Context) context.Context { diff --git a/pkg/applicationserver/io/packages/loradms/v1/api/client.go b/pkg/applicationserver/io/packages/loradms/v1/api/client.go index b907b6c5bb..e4e9b6a059 100644 --- a/pkg/applicationserver/io/packages/loradms/v1/api/client.go +++ b/pkg/applicationserver/io/packages/loradms/v1/api/client.go @@ -77,7 +77,7 @@ func (c *Client) newRequest(ctx context.Context, method, category, entity, opera } // Do executes a new HTTP request with the given parameters and body and returns the response. -func (c *Client) Do(ctx context.Context, method, category, entity, operation string, body interface{}) (*http.Response, error) { +func (c *Client) Do(ctx context.Context, method, category, entity, operation string, body any) (*http.Response, error) { buffer := bytes.NewBuffer(nil) err := json.NewEncoder(buffer).Encode(body) if err != nil { diff --git a/pkg/applicationserver/io/packages/loradms/v1/api/messages.go b/pkg/applicationserver/io/packages/loradms/v1/api/messages.go index c3059036fb..d870c8515d 100644 --- a/pkg/applicationserver/io/packages/loradms/v1/api/messages.go +++ b/pkg/applicationserver/io/packages/loradms/v1/api/messages.go @@ -31,19 +31,19 @@ const ( ) type baseResponse struct { - Result interface{} `json:"result"` - Errors []string `json:"errors"` + Result any `json:"result"` + Errors []string `json:"errors"` } var errRequest = errors.DefineUnavailable("request", "LoRaCloud DMS request") -func parse(result interface{}, res *http.Response) error { +func parse(result any, res *http.Response) error { defer res.Body.Close() defer io.Copy(io.Discard, res.Body) reader := io.LimitReader(res.Body, maxResponseSize) if res.StatusCode < 200 || res.StatusCode > 299 { body, _ := io.ReadAll(reader) - detail, err := goproto.Struct(map[string]interface{}{ + detail, err := goproto.Struct(map[string]any{ "status_code": res.StatusCode, "body": string(body), }) diff --git a/pkg/applicationserver/io/packages/loradms/v1/api/objects/objects.go b/pkg/applicationserver/io/packages/loradms/v1/api/objects/objects.go index ad58be8cd5..9cfd5f9fb9 100644 --- a/pkg/applicationserver/io/packages/loradms/v1/api/objects/objects.go +++ b/pkg/applicationserver/io/packages/loradms/v1/api/objects/objects.go @@ -138,7 +138,7 @@ type StreamRecord struct { // MarshalJSON implements json.Marshaler. func (r StreamRecord) MarshalJSON() ([]byte, error) { - return json.Marshal([]interface{}{r.Offset, r.Data}) + return json.Marshal([]any{r.Offset, r.Data}) } var errInvalidStreamRecord = errors.DefineCorruption("invalid_stream_record", "invalid stream record") @@ -300,8 +300,8 @@ type LoRaDnlink struct { } // Fields implements log.Fielder. -func (u LoRaDnlink) Fields() map[string]interface{} { - return map[string]interface{}{ +func (u LoRaDnlink) Fields() map[string]any { + return map[string]any{ "port": u.Port, "payload": u.Payload, } diff --git a/pkg/applicationserver/io/packages/loradms/v1/package.go b/pkg/applicationserver/io/packages/loradms/v1/package.go index e53161bf58..63c8f8fd7b 100644 --- a/pkg/applicationserver/io/packages/loradms/v1/package.go +++ b/pkg/applicationserver/io/packages/loradms/v1/package.go @@ -344,7 +344,7 @@ func hexPtr(x objects.Hex) *objects.Hex { return &x } -func toStruct(i interface{}) (*structpb.Struct, error) { +func toStruct(i any) (*structpb.Struct, error) { b, err := jsonpb.TTN().Marshal(i) if err != nil { return nil, err diff --git a/pkg/applicationserver/io/packages/loragls/v3/api/client.go b/pkg/applicationserver/io/packages/loragls/v3/api/client.go index 0077c51dcd..9f3a40ee76 100644 --- a/pkg/applicationserver/io/packages/loragls/v3/api/client.go +++ b/pkg/applicationserver/io/packages/loragls/v3/api/client.go @@ -76,7 +76,7 @@ func (c *Client) newRequest(ctx context.Context, method, version, category, oper } // Do executes a new HTTP request with the given parameters and body and returns the response. -func (c *Client) Do(ctx context.Context, method, version, category, operation string, body interface{}) (*http.Response, error) { +func (c *Client) Do(ctx context.Context, method, version, category, operation string, body any) (*http.Response, error) { buffer := bytes.NewBuffer(nil) if err := json.NewEncoder(buffer).Encode(body); err != nil { return nil, err diff --git a/pkg/applicationserver/io/packages/loragls/v3/api/client_test.go b/pkg/applicationserver/io/packages/loragls/v3/api/client_test.go index c03aee5800..f091b90d06 100644 --- a/pkg/applicationserver/io/packages/loragls/v3/api/client_test.go +++ b/pkg/applicationserver/io/packages/loragls/v3/api/client_test.go @@ -271,8 +271,8 @@ func TestClient(t *testing.T) { func(ctx context.Context, t *testing.T, reqChan <-chan *http.Request, respChan chan<- *http.Response, errChan chan<- error, cl *api.Client) { for _, tc := range []struct { name string - request interface{} - response interface{} + request any + response any do func(ctx context.Context, a *assertions.Assertion) assertRequest func(t *testing.T, a *assertions.Assertion, req *http.Request) }{ diff --git a/pkg/applicationserver/io/packages/loragls/v3/api/messages.go b/pkg/applicationserver/io/packages/loragls/v3/api/messages.go index 557da17a70..14f3e957dc 100644 --- a/pkg/applicationserver/io/packages/loragls/v3/api/messages.go +++ b/pkg/applicationserver/io/packages/loragls/v3/api/messages.go @@ -27,13 +27,13 @@ const maxResponseSize = (1 << 24) // 16 MiB var errRequest = errors.DefineUnavailable("request", "LoRa Cloud GLS request") -func parse(result interface{}, res *http.Response) error { +func parse(result any, res *http.Response) error { defer res.Body.Close() defer io.Copy(io.Discard, res.Body) reader := io.LimitReader(res.Body, maxResponseSize) if res.StatusCode < 200 || res.StatusCode > 299 { body, _ := io.ReadAll(reader) - detail, err := goproto.Struct(map[string]interface{}{ + detail, err := goproto.Struct(map[string]any{ "status_code": res.StatusCode, "body": string(body), }) diff --git a/pkg/applicationserver/io/packages/loragls/v3/api/objects.go b/pkg/applicationserver/io/packages/loragls/v3/api/objects.go index d3e2ef8bf2..d741027e4d 100644 --- a/pkg/applicationserver/io/packages/loragls/v3/api/objects.go +++ b/pkg/applicationserver/io/packages/loragls/v3/api/objects.go @@ -47,7 +47,7 @@ type Uplink struct { // MarshalJSON implements json.Marshaler. func (u *Uplink) MarshalJSON() ([]byte, error) { - return json.Marshal([]interface{}{ + return json.Marshal([]any{ u.GatewayID, u.AntennaID, u.TDOA, @@ -65,7 +65,7 @@ func (u *Uplink) UnmarshalJSON(b []byte) error { if n := len(components); n != 5 { return fmt.Errorf("invalid field count %d", n) } - for i, c := range []interface{}{ + for i, c := range []any{ &u.GatewayID, &u.AntennaID, &u.TDOA, diff --git a/pkg/applicationserver/io/packages/loragls/v3/package.go b/pkg/applicationserver/io/packages/loragls/v3/package.go index cd99207eb8..bbd6f96861 100644 --- a/pkg/applicationserver/io/packages/loragls/v3/package.go +++ b/pkg/applicationserver/io/packages/loragls/v3/package.go @@ -335,7 +335,7 @@ func (p *GeolocationPackage) mergePackageData(def *ttnpb.ApplicationPackageDefau return &merged, nil } -func toStruct(i interface{}) (*structpb.Struct, error) { +func toStruct(i any) (*structpb.Struct, error) { b, err := jsonpb.TTN().Marshal(i) if err != nil { return nil, err diff --git a/pkg/applicationserver/io/pubsub/provider/connection.go b/pkg/applicationserver/io/pubsub/provider/connection.go index 8296c3b83b..a8240f9135 100644 --- a/pkg/applicationserver/io/pubsub/provider/connection.go +++ b/pkg/applicationserver/io/pubsub/provider/connection.go @@ -125,7 +125,7 @@ func toProtoMessage(err error) proto.Message { } } -func isNil(c interface{}) bool { +func isNil(c any) bool { if c == nil { return true } diff --git a/pkg/applicationserver/io/pubsub/provider/mqtt/driver.go b/pkg/applicationserver/io/pubsub/provider/mqtt/driver.go index df9c462ed9..4f22417de7 100644 --- a/pkg/applicationserver/io/pubsub/provider/mqtt/driver.go +++ b/pkg/applicationserver/io/pubsub/provider/mqtt/driver.go @@ -69,7 +69,7 @@ func (t *topic) SendBatch(ctx context.Context, msgs []*driver.Message) error { return ctx.Err() } if msg.BeforeSend != nil { - asFunc := func(i interface{}) bool { return false } + asFunc := func(i any) bool { return false } if err := msg.BeforeSend(asFunc); err != nil { return err } @@ -104,7 +104,7 @@ func encodeMessage(dm *driver.Message) ([]byte, error) { } func decodeMessage(message mqtt.Message) (*driver.Message, error) { - asFunc := func(i interface{}) bool { + asFunc := func(i any) bool { p, ok := i.(*mqtt.Message) if !ok { return false @@ -131,7 +131,7 @@ func decodeMessage(message mqtt.Message) (*driver.Message, error) { func (*topic) IsRetryable(error) bool { return false } // As implements driver.Topic. -func (t *topic) As(i interface{}) bool { +func (t *topic) As(i any) bool { c, ok := i.(*mqtt.Client) if !ok { return false @@ -141,7 +141,7 @@ func (t *topic) As(i interface{}) bool { } // ErrorAs implements driver.Topic. -func (*topic) ErrorAs(error, interface{}) bool { return false } +func (*topic) ErrorAs(error, any) bool { return false } // ErrorCode implements driver.Topic. func (*topic) ErrorCode(err error) gcerrors.ErrorCode { @@ -235,7 +235,7 @@ func (*subscription) SendNacks(context.Context, []driver.AckID) error { panic("u func (*subscription) IsRetryable(error) bool { return false } // As implements driver.Subscription. -func (s *subscription) As(i interface{}) bool { +func (s *subscription) As(i any) bool { c, ok := i.(*mqtt.Client) if !ok { return false @@ -245,7 +245,7 @@ func (s *subscription) As(i interface{}) bool { } // ErrorAs implements driver.Subscription. -func (*subscription) ErrorAs(error, interface{}) bool { return false } +func (*subscription) ErrorAs(error, any) bool { return false } // ErrorCode implements driver.Subscription. func (*subscription) ErrorCode(err error) gcerrors.ErrorCode { diff --git a/pkg/applicationserver/io/web/webhooks.go b/pkg/applicationserver/io/web/webhooks.go index e7c6340ca9..7e621e1bb3 100644 --- a/pkg/applicationserver/io/web/webhooks.go +++ b/pkg/applicationserver/io/web/webhooks.go @@ -60,7 +60,7 @@ var errRequest = errors.DefineUnavailable("request", "request") func createRequestErrorDetails(req *http.Request, res *http.Response) []proto.Message { ctx := req.Context() - m := map[string]interface{}{ + m := map[string]any{ "webhook_id": webhookIDFromContext(ctx).WebhookId, "url": req.URL.String(), } @@ -504,7 +504,7 @@ func expandVariables(u string, up *ttnpb.ApplicationUp) (*url.URL, error) { if err != nil { return nil, err } - expanded, err := tmpl.Expand(map[string]interface{}{ + expanded, err := tmpl.Expand(map[string]any{ "appID": up.EndDeviceIds.ApplicationIds.ApplicationId, "applicationID": up.EndDeviceIds.ApplicationIds.ApplicationId, "appEUI": joinEUI, diff --git a/pkg/applicationserver/observability.go b/pkg/applicationserver/observability.go index 8cba74e028..64fb6af65f 100644 --- a/pkg/applicationserver/observability.go +++ b/pkg/applicationserver/observability.go @@ -152,7 +152,6 @@ const ( subsystem = "as" unknown = "unknown" networkServer = "network_server" - applicationID = "application_id" ) var asMetrics = &messageMetrics{ @@ -170,7 +169,7 @@ var asMetrics = &messageMetrics{ Name: "uplink_forwarded_total", Help: "Total number of forwarded uplinks (join-accepts and data)", }, - []string{applicationID}, + []string{}, ), uplinkDropped: metrics.NewContextualCounterVec( prometheus.CounterOpts{ @@ -204,7 +203,7 @@ var asMetrics = &messageMetrics{ Name: "downlink_received_total", Help: "Total number of received downlinks", }, - []string{applicationID}, + []string{}, ), downlinkForwarded: metrics.NewContextualCounterVec( prometheus.CounterOpts{ @@ -292,7 +291,7 @@ func registerForwardUp(ctx context.Context, msg *ttnpb.ApplicationUp) { default: return } - asMetrics.uplinkForwarded.WithLabelValues(ctx, msg.EndDeviceIds.ApplicationIds.ApplicationId).Inc() + asMetrics.uplinkForwarded.WithLabelValues(ctx).Inc() } func registerDropUp(ctx context.Context, msg *ttnpb.ApplicationUp, err error) { @@ -322,7 +321,7 @@ func registerUplinkLatency(ctx context.Context, msg *ttnpb.ApplicationUplink) { func registerReceiveDownlink(ctx context.Context, ids *ttnpb.EndDeviceIdentifiers, msg *ttnpb.ApplicationDownlink) { events.Publish(evtReceiveDataDown.NewWithIdentifiersAndData(ctx, ids, msg)) - asMetrics.downlinkReceived.WithLabelValues(ctx, ids.ApplicationIds.ApplicationId).Inc() + asMetrics.downlinkReceived.WithLabelValues(ctx).Inc() } func registerReceiveDownlinks(ctx context.Context, ids *ttnpb.EndDeviceIdentifiers, items []*ttnpb.ApplicationDownlink) { diff --git a/pkg/auth/rights/mock_test.go b/pkg/auth/rights/mock_test.go index 5b52b2db48..33e00ba6be 100644 --- a/pkg/auth/rights/mock_test.go +++ b/pkg/auth/rights/mock_test.go @@ -21,16 +21,16 @@ import ( ) type mockHandler struct { - call func(ctx context.Context, req interface{}) + call func(ctx context.Context, req any) ctx context.Context - req interface{} + req any - res interface{} + res any err error } -func (h *mockHandler) Handler(ctx context.Context, req interface{}) (interface{}, error) { +func (h *mockHandler) Handler(ctx context.Context, req any) (any, error) { h.ctx, h.req = ctx, req if h.call != nil { h.call(ctx, req) diff --git a/pkg/basicstation/cups/server.go b/pkg/basicstation/cups/server.go index f1a67ff3bb..323ac8c91f 100644 --- a/pkg/basicstation/cups/server.go +++ b/pkg/basicstation/cups/server.go @@ -253,7 +253,7 @@ func (s *Server) getTrust(address string) (*x509.Certificate, error) { } address = net.JoinHostPort(host, port) - trustI, err, _ := s.getTrustOnce.Do(address, func() (interface{}, error) { + trustI, err, _ := s.getTrustOnce.Do(address, func() (any, error) { s.trustCacheMu.RLock() trust, ok := s.trustCache[address] s.trustCacheMu.RUnlock() diff --git a/pkg/component/context.go b/pkg/component/context.go index a728fa9e70..18cd5459e9 100644 --- a/pkg/component/context.go +++ b/pkg/component/context.go @@ -40,6 +40,6 @@ func (ctx *crossContext) Err() error { } // Value implements context.Context using the value context. -func (ctx *crossContext) Value(key interface{}) interface{} { +func (ctx *crossContext) Value(key any) any { return ctx.valueCtx.Value(key) } diff --git a/pkg/component/grpc.go b/pkg/component/grpc.go index 4d66ef5671..2ed427ecb1 100644 --- a/pkg/component/grpc.go +++ b/pkg/component/grpc.go @@ -106,7 +106,7 @@ func (c *Component) WithClusterAuth() grpc.CallOption { // If a call can't be identified as coming from the cluster, it will be discarded. func (c *Component) ClusterAuthUnaryHook() hooks.UnaryHandlerMiddleware { return func(next grpc.UnaryHandler) grpc.UnaryHandler { - return func(ctx context.Context, req interface{}) (interface{}, error) { + return func(ctx context.Context, req any) (any, error) { ctx = c.cluster.WithVerifiedSource(ctx) return next(ctx, req) } @@ -117,7 +117,7 @@ func (c *Component) ClusterAuthUnaryHook() hooks.UnaryHandlerMiddleware { // If a call can't be identified as coming from the cluster, it will be discarded. func (c *Component) ClusterAuthStreamHook() hooks.StreamHandlerMiddleware { return func(hdl grpc.StreamHandler) grpc.StreamHandler { - return func(srv interface{}, stream grpc.ServerStream) error { + return func(srv any, stream grpc.ServerStream) error { wrapped := grpc_middleware.WrapServerStream(stream) ctx := c.cluster.WithVerifiedSource(stream.Context()) wrapped.WrappedContext = ctx diff --git a/pkg/component/interop_test.go b/pkg/component/interop_test.go index d8636df9f6..2e53a34951 100644 --- a/pkg/component/interop_test.go +++ b/pkg/component/interop_test.go @@ -121,7 +121,7 @@ func TestInteropTLS(t *testing.T) { c := component.MustNew(test.GetLogger(t), config) c.RegisterInterop(mockInterop) - test.Must(nil, c.Start()) + test.Must[any](nil, c.Start()) defer c.Close() certPool := x509.NewCertPool() diff --git a/pkg/component/tasks_internal_test.go b/pkg/component/tasks_internal_test.go index 329f0834cf..86f5dc4067 100644 --- a/pkg/component/tasks_internal_test.go +++ b/pkg/component/tasks_internal_test.go @@ -83,7 +83,7 @@ func TestTaskBackoffReset(t *testing.T) { }) // Wait for all invocations. - test.Must(nil, c.Start()) + test.Must[any](nil, c.Start()) defer c.Close() wg.Wait() } diff --git a/pkg/component/tasks_test.go b/pkg/component/tasks_test.go index f87d97c21b..e2416d083e 100644 --- a/pkg/component/tasks_test.go +++ b/pkg/component/tasks_test.go @@ -85,7 +85,7 @@ func TestTasks(t *testing.T) { }) // Wait for all invocations. - test.Must(nil, c.Start()) + test.Must[any](nil, c.Start()) defer c.Close() oneOffWg.Wait() restartingWg.Wait() diff --git a/pkg/config/config.go b/pkg/config/config.go index b0a2d2a8e1..4366547bbc 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -42,7 +42,7 @@ type Manager struct { viper *viper.Viper flags *pflag.FlagSet replacer *strings.Replacer - defaults interface{} + defaults any defaultPaths []string configFlag string } @@ -85,7 +85,7 @@ func (m *Manager) EnvironmentForKey(key string) string { } // Get returns the current value of the given config key. -func (m *Manager) Get(key string) interface{} { +func (m *Manager) Get(key string) any { return m.viper.Get(key) } @@ -147,7 +147,7 @@ var DefaultOptions = []Option{ // - structs with fields of these types: The nested config names will be prefixed // by the name of this struct, unless it is `name:",squash"` in which case // the names are merged into the parent struct. -func Initialize(name, envPrefix string, defaults interface{}, opts ...Option) *Manager { +func Initialize(name, envPrefix string, defaults any, opts ...Option) *Manager { m := &Manager{ name: name, envPrefix: envPrefix, @@ -186,7 +186,7 @@ func Initialize(name, envPrefix string, defaults interface{}, opts ...Option) *M // WithConfig returns a new flagset with has the flags of the Manager as well as the additional flags defined // from the defaults passed along. // Use this to build derived flagsets with a shared base config (for instance with cobra). -func (m *Manager) WithConfig(defaults interface{}) *pflag.FlagSet { +func (m *Manager) WithConfig(defaults any) *pflag.FlagSet { flags := pflag.NewFlagSet(m.name, pflag.ExitOnError) flags.AddFlagSet(m.flags) @@ -204,7 +204,7 @@ func (m *Manager) WithConfig(defaults interface{}) *pflag.FlagSet { // InitializeWithDefaults is the same as Initialize but it sets some sane default options (see DefaultOptions) // alongside the passed in options. -func InitializeWithDefaults(name, envPrefix string, defaults interface{}, opts ...Option) *Manager { +func InitializeWithDefaults(name, envPrefix string, defaults any, opts ...Option) *Manager { return Initialize(name, envPrefix, defaults, append(DefaultOptions, opts...)...) } @@ -215,7 +215,7 @@ func (m *Manager) Parse(flags ...string) error { // Unmarshal unmarshals the available config keys into the result. // It matches the names of fields based on the name struct tag. -func (m *Manager) Unmarshal(result interface{}) error { +func (m *Manager) Unmarshal(result any) error { d, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ TagName: "name", ZeroFields: true, @@ -305,7 +305,7 @@ func (m *Manager) mergeConfig(in io.Reader) error { // UnmarshalKey unmarshals a specific key into a destination, which must have a matching type. // This is useful for fields which have the `file-only:"true"` tag set and so are ignored when // Unmarshalling them to a struct. -func (m *Manager) UnmarshalKey(key string, raw interface{}) error { +func (m *Manager) UnmarshalKey(key string, raw any) error { return m.viper.UnmarshalKey(key, raw) } @@ -332,7 +332,7 @@ func isConfigurableType(t reflect.Type) bool { return t.Implements(configurableI) || reflect.PtrTo(t).Implements(configurableI) } -func (m *Manager) setDefaults(prefix string, flags *pflag.FlagSet, config interface{}) { +func (m *Manager) setDefaults(prefix string, flags *pflag.FlagSet, config any) { configValue := reflect.ValueOf(config) configKind := configValue.Type().Kind() diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 34d9083391..f68d3719fc 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -83,7 +83,7 @@ type example struct { Custom Custom `name:"custom" description:"A custom type"` Customs []Custom `name:"customs" description:"A slice of custom types"` - FileOnly interface{} `name:"file-only" file-only:"true"` + FileOnly any `name:"file-only" file-only:"true"` } var ( diff --git a/pkg/config/example/example.go b/pkg/config/example/example.go index 24c087127b..181f9c033d 100644 --- a/pkg/config/example/example.go +++ b/pkg/config/example/example.go @@ -96,7 +96,7 @@ func main() { } // printYAML prints the nested config struct. -func printYAML(in interface{}) error { +func printYAML(in any) error { bs, err := yaml.Marshal(in) if err != nil { return err diff --git a/pkg/config/hooks.go b/pkg/config/hooks.go index 8d9e4a649e..6f7ef414db 100644 --- a/pkg/config/hooks.go +++ b/pkg/config/hooks.go @@ -32,7 +32,7 @@ var errFormat = errors.DefineInvalidArgument("format", "invalid format `{input}` // stringToTimeHookFunc is a hook for mapstructure that decodes strings to time.Time. func stringToTimeHookFunc(layout string) mapstructure.DecodeHookFuncType { - return func(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { + return func(f reflect.Type, t reflect.Type, data any) (any, error) { if f.Kind() != reflect.String { return data, nil } @@ -44,7 +44,7 @@ func stringToTimeHookFunc(layout string) mapstructure.DecodeHookFuncType { } // stringSliceToStringMapHookFunc is a hook for mapstructure that decodes []string to map[string]string. -func stringSliceToStringMapHookFunc(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringSliceToStringMapHookFunc(f reflect.Type, t reflect.Type, data any) (any, error) { if f.Kind() != reflect.Slice || f.Elem().Kind() != reflect.String || t.Kind() != reflect.Map || t.Elem().Kind() != reflect.String { return data, nil @@ -64,7 +64,7 @@ func stringSliceToStringMapHookFunc(f reflect.Type, t reflect.Type, data interfa // stringSliceToStringMapSliceHookFunc is a hook for mapstructure that decodes []string to map[string][]string. // For example: [a=b a=c d=e] -> map[string][]string{a:[b c], d:[e]}. -func stringSliceToStringMapStringSliceHookFunc(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringSliceToStringMapStringSliceHookFunc(f reflect.Type, t reflect.Type, data any) (any, error) { if (f.Kind() != reflect.String && (f.Kind() != reflect.Slice || f.Elem().Kind() != reflect.String)) || t.Kind() != reflect.Map || t.Elem().Kind() != reflect.Slice || @@ -98,7 +98,7 @@ func stringSliceToStringMapStringSliceHookFunc(f reflect.Type, t reflect.Type, d } // stringSliceToStringHookFunc is a hook for mapstructure that decodes []string to string by picking the first element. -func stringSliceToStringHookFunc(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringSliceToStringHookFunc(f reflect.Type, t reflect.Type, data any) (any, error) { if f.Kind() != reflect.Slice || f.Elem().Kind() != reflect.String || t.Kind() != reflect.String { return data, nil } @@ -113,7 +113,7 @@ func stringSliceToStringHookFunc(f reflect.Type, t reflect.Type, data interface{ } // stringToStringMapHookFunc is a hook for mapstructure that decodes string to map[string]string. -func stringToStringMapHookFunc(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToStringMapHookFunc(f reflect.Type, t reflect.Type, data any) (any, error) { if f.Kind() != reflect.String || t.Kind() != reflect.Map || t.Elem().Kind() != reflect.String { return data, nil } @@ -134,7 +134,7 @@ func stringToStringMapHookFunc(f reflect.Type, t reflect.Type, data interface{}) } // stringToBufferMapHookFunc is a hook for mapstructure that decodes string or []string to map[string][]byte. -func stringToBufferMapHookFunc(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToBufferMapHookFunc(f reflect.Type, t reflect.Type, data any) (any, error) { if (f.Kind() != reflect.String && (f.Kind() != reflect.Slice || f.Elem().Kind() != reflect.String)) || t.Kind() != reflect.Map || t.Elem().Kind() != reflect.Slice || t.Elem().Elem().Kind() != reflect.Uint8 { return data, nil @@ -165,7 +165,7 @@ func stringToBufferMapHookFunc(f reflect.Type, t reflect.Type, data interface{}) return m, nil } -func configurableInterfaceHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func configurableInterfaceHook(f reflect.Type, t reflect.Type, data any) (any, error) { if f.Kind() != reflect.String || !isConfigurableType(t) { return data, nil } @@ -186,7 +186,7 @@ func configurableInterfaceHook(f reflect.Type, t reflect.Type, data interface{}) return rv.Elem().Interface(), nil } -func configurableInterfaceSliceHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func configurableInterfaceSliceHook(f reflect.Type, t reflect.Type, data any) (any, error) { if f.Kind() != reflect.Slice || f.Elem().Kind() != reflect.String || t.Kind() != reflect.Slice || @@ -218,7 +218,7 @@ func configurableInterfaceSliceHook(f reflect.Type, t reflect.Type, data interfa return res.Interface(), nil } -func stringToByteSliceHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToByteSliceHook(f reflect.Type, t reflect.Type, data any) (any, error) { if f.Kind() != reflect.String || t.Kind() != reflect.Slice || t.Elem().Kind() != reflect.Uint8 { return data, nil } @@ -232,7 +232,7 @@ func stringToByteSliceHook(f reflect.Type, t reflect.Type, data interface{}) (in return slice, nil } -func stringToByteArrayHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToByteArrayHook(f reflect.Type, t reflect.Type, data any) (any, error) { if f.Kind() != reflect.String || t.Kind() != reflect.Array || t.Elem().Kind() != reflect.Uint8 { return data, nil } @@ -253,7 +253,7 @@ func stringToByteArrayHook(f reflect.Type, t reflect.Type, data interface{}) (in return rv.Interface(), nil } -func stringToTimeDurationPointerHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToTimeDurationPointerHook(f reflect.Type, t reflect.Type, data any) (any, error) { d := time.Duration(0) if f.Kind() != reflect.String || t != reflect.TypeOf(&d) { return data, nil @@ -269,7 +269,7 @@ func stringToTimeDurationPointerHook(f reflect.Type, t reflect.Type, data interf return &d, nil } -func stringToRxDelayPointerHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToRxDelayPointerHook(f reflect.Type, t reflect.Type, data any) (any, error) { var enum ttnpb.RxDelay if f.Kind() != reflect.String || t != reflect.TypeOf(&enum) { return data, nil @@ -288,7 +288,7 @@ func stringToRxDelayPointerHook(f reflect.Type, t reflect.Type, data interface{} return &enum, nil } -func stringToEUI64PointerHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToEUI64PointerHook(f reflect.Type, t reflect.Type, data any) (any, error) { var eui types.EUI64 if f.Kind() != reflect.String || t != reflect.TypeOf(&eui) { return data, nil @@ -303,7 +303,7 @@ func stringToEUI64PointerHook(f reflect.Type, t reflect.Type, data interface{}) return &eui, nil } -func stringToADRAckDelayExponentPointerHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToADRAckDelayExponentPointerHook(f reflect.Type, t reflect.Type, data any) (any, error) { var enum ttnpb.ADRAckDelayExponent if f.Kind() != reflect.String || t != reflect.TypeOf(&enum) { return data, nil @@ -322,7 +322,7 @@ func stringToADRAckDelayExponentPointerHook(f reflect.Type, t reflect.Type, data return &enum, nil } -func stringToADRAckLimitExponentPointerHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToADRAckLimitExponentPointerHook(f reflect.Type, t reflect.Type, data any) (any, error) { var enum ttnpb.ADRAckLimitExponent if f.Kind() != reflect.String || t != reflect.TypeOf(&enum) { return data, nil @@ -341,7 +341,7 @@ func stringToADRAckLimitExponentPointerHook(f reflect.Type, t reflect.Type, data return &enum, nil } -func stringToAggregatedDutyCyclePointerHook(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { +func stringToAggregatedDutyCyclePointerHook(f reflect.Type, t reflect.Type, data any) (any, error) { var enum ttnpb.AggregatedDutyCycle if f.Kind() != reflect.String || t != reflect.TypeOf(&enum) { return data, nil diff --git a/pkg/config/unmarshal_test.go b/pkg/config/unmarshal_test.go index 84f32086c1..20b01e8d5a 100644 --- a/pkg/config/unmarshal_test.go +++ b/pkg/config/unmarshal_test.go @@ -36,7 +36,7 @@ func TestUnmarshal(t *testing.T) { err = mgr.MergeConfig(strings.NewReader(`file-only: 10`)) a.So(err, should.BeNil) - var res map[string]interface{} + var res map[string]any err = mgr.Unmarshal(&res) a.So(err, should.BeNil) a.So(res, should.ContainKey, "file-only") diff --git a/pkg/crypto/cryptoutil/cryptoutil_test.go b/pkg/crypto/cryptoutil/cryptoutil_test.go index 810c0ca857..280954fcb6 100644 --- a/pkg/crypto/cryptoutil/cryptoutil_test.go +++ b/pkg/crypto/cryptoutil/cryptoutil_test.go @@ -126,8 +126,8 @@ func TestUnwrapSelectedSessionKeys(t *testing.T) { t.Parallel() key := types.AES128Key{0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF} - kekKey := test.Must(hex.DecodeString("000102030405060708090A0B0C0D0E0F")).([]byte) - cipherKey := test.Must(hex.DecodeString("1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5")).([]byte) + kekKey := test.Must(hex.DecodeString("000102030405060708090A0B0C0D0E0F")) + cipherKey := test.Must(hex.DecodeString("1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5")) kv := NewMemKeyVault(map[string][]byte{ "key": kekKey, diff --git a/pkg/crypto/cryptoutil/keyservice_cache.go b/pkg/crypto/cryptoutil/keyservice_cache.go index 7e09069c76..0197263226 100644 --- a/pkg/crypto/cryptoutil/keyservice_cache.go +++ b/pkg/crypto/cryptoutil/keyservice_cache.go @@ -46,8 +46,8 @@ func NewCacheKeyService(inner crypto.KeyService, ttl time.Duration, size int) cr } func (c *cacheKeyService) getOrLoad( - ctx context.Context, cache crypto.CacheKey, key string, loaderFunc func() (interface{}, error), -) (interface{}, error) { + ctx context.Context, cache crypto.CacheKey, key string, loaderFunc func() (any, error), +) (any, error) { cacheKey := fmt.Sprintf("%s:%s", cache, key) if val, err := c.cache.Get(cacheKey); err == nil { crypto.RegisterCacheHit(ctx, cache) @@ -62,7 +62,7 @@ func (c *cacheKeyService) getOrLoad( func (c *cacheKeyService) Unwrap(ctx context.Context, ciphertext []byte, kekLabel string) ([]byte, error) { res, err := c.getOrLoad(ctx, crypto.CacheUnwrap, fmt.Sprintf("%s:%X", kekLabel, ciphertext), - func() (interface{}, error) { + func() (any, error) { return c.KeyService.Unwrap(ctx, ciphertext, kekLabel) }, ) diff --git a/pkg/crypto/cryptoutil/keyvault_cache_test.go b/pkg/crypto/cryptoutil/keyvault_cache_test.go index 5424386d6a..91dad7db91 100644 --- a/pkg/crypto/cryptoutil/keyvault_cache_test.go +++ b/pkg/crypto/cryptoutil/keyvault_cache_test.go @@ -117,11 +117,11 @@ func TestCacheKeyVault(t *testing.T) { cryptoutil.WithCacheKeyVaultTTL(4*time.Hour, 5*time.Minute), ) - a.So(test.Must(kv.Key(ctx, "key1")).([]byte), should.Resemble, []byte("key1")) - a.So(test.Must(kv.Key(ctx, "key1")).([]byte), should.Resemble, []byte("key1")) - a.So(test.Must(kv.Key(ctx, "key2")).([]byte), should.Resemble, []byte("key2")) - a.So(test.Must(kv.Key(ctx, "key1")).([]byte), should.Resemble, []byte("key1")) - a.So(test.Must(kv.Key(ctx, "key2")).([]byte), should.Resemble, []byte("key2")) + a.So(test.Must(kv.Key(ctx, "key1")), should.Resemble, []byte("key1")) + a.So(test.Must(kv.Key(ctx, "key1")), should.Resemble, []byte("key1")) + a.So(test.Must(kv.Key(ctx, "key2")), should.Resemble, []byte("key2")) + a.So(test.Must(kv.Key(ctx, "key1")), should.Resemble, []byte("key1")) + a.So(test.Must(kv.Key(ctx, "key2")), should.Resemble, []byte("key2")) a.So(keys, should.Resemble, []string{"key1", "key2"}) test.Must(kv.ServerCertificate(ctx, "server1.example.com")) diff --git a/pkg/deviceclaimingserver/deviceclaimingserver.go b/pkg/deviceclaimingserver/deviceclaimingserver.go index 9594f172d8..0c6c626aa5 100644 --- a/pkg/deviceclaimingserver/deviceclaimingserver.go +++ b/pkg/deviceclaimingserver/deviceclaimingserver.go @@ -23,7 +23,6 @@ import ( "go.thethings.network/lorawan-stack/v3/pkg/deviceclaimingserver/enddevices" "go.thethings.network/lorawan-stack/v3/pkg/log" "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" - "go.thethings.network/lorawan-stack/v3/pkg/web" "google.golang.org/grpc" ) @@ -35,7 +34,6 @@ type DeviceClaimingServer struct { config Config endDeviceClaimingUpstream *enddevices.Upstream - endDeviceClaimingFallback Fallback gatewayClaimingServerUpstream ttnpb.GatewayClaimingServerServer @@ -58,31 +56,36 @@ func New(c *component.Component, conf *Config, opts ...Option) (*DeviceClaimingS opt(dcs) } - dcs.gatewayClaimingServerUpstream = noopGCLS{} - - upstream, err := enddevices.NewUpstream(ctx, c, conf.EndDeviceClaimingServerConfig) - if err != nil { - return nil, err + if dcs.endDeviceClaimingUpstream == nil { + upstream, err := enddevices.NewUpstream(ctx, c, conf.EndDeviceClaimingServerConfig) + if err != nil { + return nil, err + } + dcs.endDeviceClaimingUpstream = upstream } - dcs.endDeviceClaimingFallback = noopEDCS{} - dcs.endDeviceClaimingUpstream = upstream - dcs.grpc.endDeviceClaimingServer = &endDeviceClaimingServer{ DCS: dcs, } + dcs.gatewayClaimingServerUpstream = noopGCLS{} dcs.grpc.gatewayClaimingServer = &gatewayClaimingServer{ DCS: dcs, } c.RegisterGRPC(dcs) - c.RegisterWeb(dcs) return dcs, nil } // Option configures GatewayClaimingServer. type Option func(*DeviceClaimingServer) +// WithEndDeviceClaimingUpstream configures the upstream for end device claiming. +func WithEndDeviceClaimingUpstream(upstream *enddevices.Upstream) Option { + return func(dcs *DeviceClaimingServer) { + dcs.endDeviceClaimingUpstream = upstream + } +} + // Context returns the context of the Device Claiming Server. func (dcs *DeviceClaimingServer) Context() context.Context { return dcs.ctx @@ -106,8 +109,3 @@ func (dcs *DeviceClaimingServer) RegisterHandlers(s *runtime.ServeMux, conn *grp ttnpb.RegisterEndDeviceClaimingServerHandler(dcs.Context(), s, conn) ttnpb.RegisterGatewayClaimingServerHandler(dcs.Context(), s, conn) } - -// RegisterRoutes implements web.Registerer. It registers the Device Claiming Server to the web server. -func (dcs *DeviceClaimingServer) RegisterRoutes(server *web.Server) { - dcs.endDeviceClaimingFallback.RegisterRoutes(server) -} diff --git a/pkg/deviceclaimingserver/enddevices/enddevices.go b/pkg/deviceclaimingserver/enddevices/enddevices.go index f3ee6c7b52..9f8e484009 100644 --- a/pkg/deviceclaimingserver/enddevices/enddevices.go +++ b/pkg/deviceclaimingserver/enddevices/enddevices.go @@ -20,20 +20,16 @@ import ( "path/filepath" "strings" - "go.thethings.network/lorawan-stack/v3/pkg/auth/rights" "go.thethings.network/lorawan-stack/v3/pkg/cluster" "go.thethings.network/lorawan-stack/v3/pkg/config" "go.thethings.network/lorawan-stack/v3/pkg/crypto" "go.thethings.network/lorawan-stack/v3/pkg/deviceclaimingserver/enddevices/ttjsv2" - "go.thethings.network/lorawan-stack/v3/pkg/errors" "go.thethings.network/lorawan-stack/v3/pkg/fetch" "go.thethings.network/lorawan-stack/v3/pkg/httpclient" "go.thethings.network/lorawan-stack/v3/pkg/log" - "go.thethings.network/lorawan-stack/v3/pkg/rpcmetadata" "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" "go.thethings.network/lorawan-stack/v3/pkg/types" "google.golang.org/grpc" - "google.golang.org/protobuf/types/known/emptypb" "gopkg.in/yaml.v2" ) @@ -64,16 +60,16 @@ const ( // Upstream abstracts EndDeviceClaimingServer. type Upstream struct { - Component - deviceRegistry ttnpb.EndDeviceRegistryClient - servers map[string]EndDeviceClaimer + claimers map[string]EndDeviceClaimer } // NewUpstream returns a new Upstream. func NewUpstream(ctx context.Context, c Component, conf Config, opts ...Option) (*Upstream, error) { upstream := &Upstream{ - Component: c, - servers: make(map[string]EndDeviceClaimer), + claimers: make(map[string]EndDeviceClaimer), + } + for _, opt := range opts { + opt(upstream) } fetcher, err := conf.Fetcher(ctx, c.GetBaseConfig(ctx).Blob, c) @@ -130,11 +126,7 @@ func NewUpstream(ctx context.Context, c Component, conf Config, opts ...Option) // The file for each client will be unique. clientName := strings.Trim(fileName, filepath.Ext(fileName)) - upstream.servers[clientName] = claimer - } - - for _, opt := range opts { - opt(upstream) + upstream.claimers[clientName] = claimer } return upstream, nil @@ -143,128 +135,19 @@ func NewUpstream(ctx context.Context, c Component, conf Config, opts ...Option) // Option configures Upstream. type Option func(*Upstream) -// WithDeviceRegistry overrides the device registry of the Upstream. -func WithDeviceRegistry(reg ttnpb.EndDeviceRegistryClient) Option { +// WithClaimer adds a claimer to Upstream. +func WithClaimer(name string, claimer EndDeviceClaimer) Option { return func(upstream *Upstream) { - upstream.deviceRegistry = reg + upstream.claimers[name] = claimer } } -var ( - errNoEUI = errors.DefineInvalidArgument("no_eui", "DevEUI/JoinEUI not found in request") - errClaimingNotSupported = errors.DefineAborted("claiming_not_supported", "claiming not supported for JoinEUI `{eui}`") -) - -func (upstream *Upstream) joinEUIClaimer(_ context.Context, joinEUI types.EUI64) EndDeviceClaimer { - for _, srv := range upstream.servers { - if srv.SupportsJoinEUI(joinEUI) { - return srv +// JoinEUIClaimer returns the EndDeviceClaimer for the given JoinEUI. +func (upstream *Upstream) JoinEUIClaimer(_ context.Context, joinEUI types.EUI64) EndDeviceClaimer { + for _, claimer := range upstream.claimers { + if claimer.SupportsJoinEUI(joinEUI) { + return claimer } } return nil } - -// Claim implements EndDeviceClaimingServer. -func (upstream *Upstream) Claim( - ctx context.Context, joinEUI, devEUI types.EUI64, claimAuthenticationCode string, -) error { - claimer := upstream.joinEUIClaimer(ctx, joinEUI) - if claimer == nil { - return errClaimingNotSupported.WithAttributes("eui", joinEUI) - } - return claimer.Claim(ctx, joinEUI, devEUI, claimAuthenticationCode) -} - -// Unclaim implements EndDeviceClaimingServer. -func (upstream *Upstream) Unclaim(ctx context.Context, in *ttnpb.EndDeviceIdentifiers) (*emptypb.Empty, error) { - if in.DevEui == nil || in.JoinEui == nil { - return nil, errNoEUI.New() - } - err := upstream.requireRights(ctx, in, &ttnpb.Rights{ - Rights: []ttnpb.Right{ - ttnpb.Right_RIGHT_APPLICATION_DEVICES_WRITE, - }, - }) - if err != nil { - return nil, err - } - claimer := upstream.joinEUIClaimer(ctx, types.MustEUI64(in.JoinEui).OrZero()) - if claimer == nil { - return nil, errClaimingNotSupported.WithAttributes("eui", in.JoinEui) - } - err = claimer.Unclaim(ctx, in) - if err != nil { - return nil, err - } - return ttnpb.Empty, nil -} - -// GetInfoByJoinEUI implements EndDeviceClaimingServer. -func (upstream *Upstream) GetInfoByJoinEUI( - ctx context.Context, in *ttnpb.GetInfoByJoinEUIRequest, -) (*ttnpb.GetInfoByJoinEUIResponse, error) { - joinEUI := types.MustEUI64(in.JoinEui).OrZero() - claimer := upstream.joinEUIClaimer(ctx, joinEUI) - return &ttnpb.GetInfoByJoinEUIResponse{ - JoinEui: joinEUI.Bytes(), - SupportsClaiming: (claimer != nil), - }, nil -} - -// GetClaimStatus implements EndDeviceClaimingServer. -func (upstream *Upstream) GetClaimStatus( - ctx context.Context, in *ttnpb.EndDeviceIdentifiers, -) (*ttnpb.GetClaimStatusResponse, error) { - if in.DevEui == nil || in.JoinEui == nil { - return nil, errNoEUI.New() - } - err := upstream.requireRights(ctx, in, &ttnpb.Rights{ - Rights: []ttnpb.Right{ - ttnpb.Right_RIGHT_APPLICATION_DEVICES_READ, - }, - }) - if err != nil { - return nil, err - } - claimer := upstream.joinEUIClaimer(ctx, types.MustEUI64(in.JoinEui).OrZero()) - if claimer == nil { - return nil, errClaimingNotSupported.WithAttributes("eui", in.JoinEui) - } - return claimer.GetClaimStatus(ctx, in) -} - -func (upstream *Upstream) requireRights( - ctx context.Context, in *ttnpb.EndDeviceIdentifiers, appRights *ttnpb.Rights, -) error { - // Collaborator must have the required rights on the application. - if err := rights.RequireApplication(ctx, in.ApplicationIds, - appRights.Rights..., - ); err != nil { - return err - } - // Check that the device actually exists in the application. - // If the EUIs are set in the request, the IS also checks that they match the stored device. - callOpt, err := rpcmetadata.WithForwardedAuth(ctx, upstream.Component.AllowInsecureForCredentials()) - if err != nil { - return err - } - er, err := upstream.getDeviceRegistry(ctx) - if err != nil { - return err - } - _, err = er.Get(ctx, &ttnpb.GetEndDeviceRequest{ - EndDeviceIds: in, - }, callOpt) - return err -} - -func (upstream *Upstream) getDeviceRegistry(ctx context.Context) (ttnpb.EndDeviceRegistryClient, error) { - if upstream.deviceRegistry != nil { - return upstream.deviceRegistry, nil - } - conn, err := upstream.Component.GetPeerConn(ctx, ttnpb.ClusterRole_ENTITY_REGISTRY, nil) - if err != nil { - return nil, err - } - return ttnpb.NewEndDeviceRegistryClient(conn), nil -} diff --git a/pkg/deviceclaimingserver/enddevices/enddevices_test.go b/pkg/deviceclaimingserver/enddevices/enddevices_test.go index b4e9c6b388..0e89e4a444 100644 --- a/pkg/deviceclaimingserver/enddevices/enddevices_test.go +++ b/pkg/deviceclaimingserver/enddevices/enddevices_test.go @@ -17,22 +17,14 @@ package enddevices import ( "testing" - "go.thethings.network/lorawan-stack/v3/pkg/auth/rights" "go.thethings.network/lorawan-stack/v3/pkg/component" componenttest "go.thethings.network/lorawan-stack/v3/pkg/component/test" "go.thethings.network/lorawan-stack/v3/pkg/errors" - "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" "go.thethings.network/lorawan-stack/v3/pkg/types" - "go.thethings.network/lorawan-stack/v3/pkg/unique" "go.thethings.network/lorawan-stack/v3/pkg/util/test" "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" ) -var ( - supportedJoinEUI = &types.EUI64{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C} - unsupportedJoinEUI = &types.EUI64{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D} -) - func TestUpstream(t *testing.T) { t.Parallel() a, ctx := test.New(t) @@ -47,68 +39,20 @@ func TestUpstream(t *testing.T) { _, err := NewUpstream(ctx, c, Config{ Source: "directory", }) - a.So(err, should.NotBeNil) + a.So(errors.IsNotFound(err), should.BeTrue) - // Upstream test + // Test Upstream. upstream := test.Must(NewUpstream(ctx, c, Config{ NetID: test.DefaultNetID, Source: "directory", Directory: "testdata", - }, WithDeviceRegistry(&mockDeviceRegistry{}))).(*Upstream) - - ctx = rights.NewContext(ctx, &rights.Rights{ - ApplicationRights: *rights.NewMap(map[string]*ttnpb.Rights{ - unique.ID(test.Context(), &ttnpb.ApplicationIdentifiers{ApplicationId: "test-app"}): ttnpb.RightsFrom( - ttnpb.Right_RIGHT_APPLICATION_DEVICES_READ, - ttnpb.Right_RIGHT_APPLICATION_DEVICES_WRITE, - ), - }), - }) - - // Invalid JoinEUI. - err = upstream.Claim(ctx, *unsupportedJoinEUI, - types.EUI64{0x00, 0x04, 0xA3, 0x0B, 0x00, 0x1C, 0x05, 0x30}, - "secret", - ) - a.So(errors.IsAborted(err), should.BeTrue) - - _, err = upstream.Unclaim(ctx, &ttnpb.EndDeviceIdentifiers{ - DeviceId: "test-dev", - ApplicationIds: &ttnpb.ApplicationIdentifiers{ - ApplicationId: "test-app", - }, - JoinEui: unsupportedJoinEUI.Bytes(), - DevEui: types.EUI64{0x00, 0x04, 0xA3, 0x0B, 0x00, 0x1C, 0x05, 0x30}.Bytes(), - }) - a.So(errors.IsUnauthenticated(err), should.BeTrue) - - resp, err := upstream.GetInfoByJoinEUI(ctx, &ttnpb.GetInfoByJoinEUIRequest{ - JoinEui: unsupportedJoinEUI.Bytes(), - }) - a.So(err, should.BeNil) - a.So(resp.SupportsClaiming, should.BeFalse) + })) - // Valid JoinEUI. - inf, err := upstream.GetInfoByJoinEUI(ctx, &ttnpb.GetInfoByJoinEUIRequest{ - JoinEui: supportedJoinEUI.Bytes(), - }) - a.So(err, should.BeNil) - a.So(inf.JoinEui, should.Resemble, supportedJoinEUI.Bytes()) - a.So(inf.SupportsClaiming, should.BeTrue) - - err = upstream.Claim(ctx, *supportedJoinEUI, - types.EUI64{0x00, 0x04, 0xA3, 0x0B, 0x00, 0x1C, 0x05, 0x30}, - "secret", - ) - a.So(!errors.IsUnimplemented(err), should.BeTrue) + unsupportedJoinEUI := types.EUI64{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D} + claimer := upstream.JoinEUIClaimer(ctx, unsupportedJoinEUI) + a.So(claimer, should.BeNil) - _, err = upstream.Unclaim(ctx, &ttnpb.EndDeviceIdentifiers{ - DeviceId: "test-dev", - ApplicationIds: &ttnpb.ApplicationIdentifiers{ - ApplicationId: "test-app", - }, - JoinEui: supportedJoinEUI.Bytes(), - DevEui: types.EUI64{0x00, 0x04, 0xA3, 0x0B, 0x00, 0x1C, 0x05, 0x30}.Bytes(), - }) - a.So(!errors.IsUnavailable(err), should.BeTrue) + supportedJoinEUI := types.EUI64{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C} + claimer = upstream.JoinEUIClaimer(ctx, supportedJoinEUI) + a.So(claimer, should.NotBeNil) } diff --git a/pkg/deviceclaimingserver/enddevices/ttjsv2/util_test.go b/pkg/deviceclaimingserver/enddevices/ttjsv2/util_test.go index 20af895510..3f01521eb3 100644 --- a/pkg/deviceclaimingserver/enddevices/ttjsv2/util_test.go +++ b/pkg/deviceclaimingserver/enddevices/ttjsv2/util_test.go @@ -172,10 +172,10 @@ func (srv *mockTTJS) handleClaim(w http.ResponseWriter, r *http.Request) { //nol return } - test.Must(nil, dev.homeNetID.UnmarshalText([]byte(req.HomeNetID))) + test.Must[any](nil, dev.homeNetID.UnmarshalText([]byte(req.HomeNetID))) if req.HomeNSID != nil { dev.homeNSID = new(types.EUI64) - test.Must(nil, dev.homeNSID.UnmarshalText([]byte(*req.HomeNSID))) + test.Must[any](nil, dev.homeNSID.UnmarshalText([]byte(*req.HomeNSID))) } dev.asID = asID dev.locked = req.Lock != nil && *req.Lock diff --git a/pkg/deviceclaimingserver/grpc_end_devices.go b/pkg/deviceclaimingserver/grpc_end_devices.go index 3c97e62c1f..113b9d32eb 100644 --- a/pkg/deviceclaimingserver/grpc_end_devices.go +++ b/pkg/deviceclaimingserver/grpc_end_devices.go @@ -19,72 +19,24 @@ import ( "go.thethings.network/lorawan-stack/v3/pkg/auth/rights" "go.thethings.network/lorawan-stack/v3/pkg/errors" - "go.thethings.network/lorawan-stack/v3/pkg/log" "go.thethings.network/lorawan-stack/v3/pkg/rpcmetadata" "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" "go.thethings.network/lorawan-stack/v3/pkg/types" - "go.thethings.network/lorawan-stack/v3/pkg/web" "google.golang.org/protobuf/types/known/emptypb" ) var ( - errParseQRCode = errors.Define("parse_qr_code", "parse QR code failed") - errQRCodeData = errors.DefineInvalidArgument("qr_code_data", "invalid QR code data") - errNoJoinEUI = errors.DefineInvalidArgument("no_join_eui", "failed to extract JoinEUI from request") - errMethodUnavailable = errors.DefineUnimplemented("method_unavailable", "method unavailable") + errParseQRCode = errors.Define("parse_qr_code", "parse QR code failed") + errQRCodeData = errors.DefineInvalidArgument("qr_code_data", "invalid QR code data") + errNoJoinEUI = errors.DefineInvalidArgument("no_join_eui", "failed to extract JoinEUI from request") + errNoEUI = errors.DefineInvalidArgument("no_eui", "DevEUI/JoinEUI not set for device") + errMethodUnavailable = errors.DefineUnimplemented("method_unavailable", "method unavailable") + errClaimingNotSupported = errors.DefineAborted( + "claiming_not_supported", + "claiming not supported for JoinEUI `{eui}`", + ) ) -// Fallback defines methods for the fallback server. -// TODO: Remove this interface (https://github.com/TheThingsIndustries/lorawan-stack/issues/3036). -type Fallback interface { - web.Registerer - Claim(ctx context.Context, req *ttnpb.ClaimEndDeviceRequest) (ids *ttnpb.EndDeviceIdentifiers, err error) - AuthorizeApplication(context.Context, *ttnpb.AuthorizeApplicationRequest) (*emptypb.Empty, error) - UnauthorizeApplication(context.Context, *ttnpb.ApplicationIdentifiers) (*emptypb.Empty, error) -} - -// noopEDCS is a no-op EDCS. -type noopEDCS struct{} - -// SupportsJoinEUI implements EndDeviceClaimingServer. -func (noopEDCS) SupportsJoinEUI(types.EUI64) bool { - return false -} - -// RegisterRoutes implements EndDeviceClaimingServer. -func (noopEDCS) RegisterRoutes(server *web.Server) { -} - -// Claim implements EndDeviceClaimingServer. -func (noopEDCS) Claim(ctx context.Context, req *ttnpb.ClaimEndDeviceRequest) (ids *ttnpb.EndDeviceIdentifiers, err error) { - return nil, errMethodUnavailable.New() -} - -// Unclaim implements EndDeviceClaimingServer. -func (noopEDCS) Unclaim(ctx context.Context, in *ttnpb.EndDeviceIdentifiers) (*emptypb.Empty, error) { - return nil, errMethodUnavailable.New() -} - -// GetInfoByJoinEUI implements EndDeviceClaimingServer. -func (noopEDCS) GetInfoByJoinEUI(ctx context.Context, in *ttnpb.GetInfoByJoinEUIRequest) (*ttnpb.GetInfoByJoinEUIResponse, error) { - return nil, errMethodUnavailable.New() -} - -// GetClaimStatus implements EndDeviceClaimingServer. -func (noopEDCS) GetClaimStatus(ctx context.Context, in *ttnpb.EndDeviceIdentifiers) (*ttnpb.GetClaimStatusResponse, error) { - return nil, errMethodUnavailable.New() -} - -// AuthorizeApplication implements EndDeviceClaimingServer. -func (noopEDCS) AuthorizeApplication(ctx context.Context, req *ttnpb.AuthorizeApplicationRequest) (*emptypb.Empty, error) { - return nil, errMethodUnavailable.New() -} - -// UnauthorizeApplication implements EndDeviceClaimingServer. -func (noopEDCS) UnauthorizeApplication(ctx context.Context, ids *ttnpb.ApplicationIdentifiers) (*emptypb.Empty, error) { - return nil, errMethodUnavailable.New() -} - // endDeviceClaimingServer is the front facing entity for gRPC requests. type endDeviceClaimingServer struct { ttnpb.UnimplementedEndDeviceClaimingServerServer @@ -93,9 +45,13 @@ type endDeviceClaimingServer struct { } // Claim implements EndDeviceClaimingServer. -func (edcs *endDeviceClaimingServer) Claim(ctx context.Context, req *ttnpb.ClaimEndDeviceRequest) (*ttnpb.EndDeviceIdentifiers, error) { +func (edcs *endDeviceClaimingServer) Claim( + ctx context.Context, + req *ttnpb.ClaimEndDeviceRequest, +) (*ttnpb.EndDeviceIdentifiers, error) { // Check that the collaborator has necessary rights before attempting to claim it on an upstream. - // Since this is part of the create device flow, we check that the collaborator has the rights to create devices in the application. + // Since this is part of the create device flow, + // we check that the collaborator has the rights to create devices in the application. targetAppID := req.GetTargetApplicationIds() if err := rights.RequireApplication(ctx, targetAppID, ttnpb.Right_RIGHT_APPLICATION_DEVICES_WRITE, @@ -124,6 +80,9 @@ func (edcs *endDeviceClaimingServer) Claim(ctx context.Context, req *ttnpb.Claim data, err := qrg.Parse(ctx, &ttnpb.ParseEndDeviceQRCodeRequest{ QrCode: qrCode, }, callOpt) + if err != nil { + return nil, errQRCodeData.WithCause(err) + } dev := data.GetEndDeviceTemplate().GetEndDevice() if dev == nil { return nil, errParseQRCode.New() @@ -135,12 +94,13 @@ func (edcs *endDeviceClaimingServer) Claim(ctx context.Context, req *ttnpb.Claim return nil, errNoJoinEUI.New() } - err := edcs.DCS.endDeviceClaimingUpstream.Claim(ctx, joinEUI, devEUI, claimAuthenticationCode) + claimer := edcs.DCS.endDeviceClaimingUpstream.JoinEUIClaimer(ctx, joinEUI) + if claimer == nil { + return nil, errClaimingNotSupported.WithAttributes("eui", joinEUI) + } + + err := claimer.Claim(ctx, joinEUI, devEUI, claimAuthenticationCode) if err != nil { - if errors.IsAborted(err) { - log.FromContext(ctx).Warn("No upstream supports JoinEUI, use fallback") - return edcs.DCS.endDeviceClaimingFallback.Claim(ctx, req) - } return nil, err } @@ -154,26 +114,60 @@ func (edcs *endDeviceClaimingServer) Claim(ctx context.Context, req *ttnpb.Claim } // Unclaim implements EndDeviceClaimingServer. -func (edcs *endDeviceClaimingServer) Unclaim(ctx context.Context, in *ttnpb.EndDeviceIdentifiers) (*emptypb.Empty, error) { - return edcs.DCS.endDeviceClaimingUpstream.Unclaim(ctx, in) +func (edcs *endDeviceClaimingServer) Unclaim( + ctx context.Context, + in *ttnpb.EndDeviceIdentifiers, +) (*emptypb.Empty, error) { + if in.DevEui == nil || in.JoinEui == nil { + return nil, errNoEUI.New() + } + if err := rights.RequireApplication(ctx, in.GetApplicationIds(), + ttnpb.Right_RIGHT_APPLICATION_DEVICES_WRITE, + ); err != nil { + return nil, err + } + + joinEUI := types.MustEUI64(in.JoinEui).OrZero() + claimer := edcs.DCS.endDeviceClaimingUpstream.JoinEUIClaimer(ctx, joinEUI) + if claimer == nil { + return nil, errClaimingNotSupported.WithAttributes("eui", joinEUI) + } + if err := claimer.Unclaim(ctx, in); err != nil { + return nil, err + } + return ttnpb.Empty, nil } // GetInfoByJoinEUI implements EndDeviceClaimingServer. -func (edcs *endDeviceClaimingServer) GetInfoByJoinEUI(ctx context.Context, in *ttnpb.GetInfoByJoinEUIRequest) (*ttnpb.GetInfoByJoinEUIResponse, error) { - return edcs.DCS.endDeviceClaimingUpstream.GetInfoByJoinEUI(ctx, in) +func (edcs *endDeviceClaimingServer) GetInfoByJoinEUI( + ctx context.Context, + in *ttnpb.GetInfoByJoinEUIRequest, +) (*ttnpb.GetInfoByJoinEUIResponse, error) { + joinEUI := types.MustEUI64(in.JoinEui).OrZero() + claimer := edcs.DCS.endDeviceClaimingUpstream.JoinEUIClaimer(ctx, joinEUI) + return &ttnpb.GetInfoByJoinEUIResponse{ + JoinEui: joinEUI.Bytes(), + SupportsClaiming: claimer != nil, + }, nil } // GetClaimStatus implements EndDeviceClaimingServer. -func (edcs *endDeviceClaimingServer) GetClaimStatus(ctx context.Context, in *ttnpb.EndDeviceIdentifiers) (*ttnpb.GetClaimStatusResponse, error) { - return edcs.DCS.endDeviceClaimingUpstream.GetClaimStatus(ctx, in) -} - -// AuthorizeApplication implements EndDeviceClaimingServer. -func (edcs *endDeviceClaimingServer) AuthorizeApplication(ctx context.Context, req *ttnpb.AuthorizeApplicationRequest) (*emptypb.Empty, error) { - return edcs.DCS.endDeviceClaimingFallback.AuthorizeApplication(ctx, req) -} - -// UnauthorizeApplication implements EndDeviceClaimingServer. -func (edcs *endDeviceClaimingServer) UnauthorizeApplication(ctx context.Context, ids *ttnpb.ApplicationIdentifiers) (*emptypb.Empty, error) { - return edcs.DCS.endDeviceClaimingFallback.UnauthorizeApplication(ctx, ids) +func (edcs *endDeviceClaimingServer) GetClaimStatus( + ctx context.Context, + in *ttnpb.EndDeviceIdentifiers, +) (*ttnpb.GetClaimStatusResponse, error) { + if in.DevEui == nil || in.JoinEui == nil { + return nil, errNoEUI.New() + } + if err := rights.RequireApplication(ctx, in.GetApplicationIds(), + ttnpb.Right_RIGHT_APPLICATION_DEVICES_READ, + ); err != nil { + return nil, err + } + joinEUI := types.MustEUI64(in.JoinEui).OrZero() + claimer := edcs.DCS.endDeviceClaimingUpstream.JoinEUIClaimer(ctx, joinEUI) + if claimer == nil { + return nil, errClaimingNotSupported.WithAttributes("eui", joinEUI) + } + return claimer.GetClaimStatus(ctx, in) } diff --git a/pkg/deviceclaimingserver/grpc_end_devices_test.go b/pkg/deviceclaimingserver/grpc_end_devices_test.go new file mode 100644 index 0000000000..f9cf47d521 --- /dev/null +++ b/pkg/deviceclaimingserver/grpc_end_devices_test.go @@ -0,0 +1,306 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package deviceclaimingserver_test + +import ( + "context" + "testing" + "time" + + "github.com/smartystreets/assertions" + "go.thethings.network/lorawan-stack/v3/pkg/cluster" + "go.thethings.network/lorawan-stack/v3/pkg/component" + componenttest "go.thethings.network/lorawan-stack/v3/pkg/component/test" + "go.thethings.network/lorawan-stack/v3/pkg/config" + . "go.thethings.network/lorawan-stack/v3/pkg/deviceclaimingserver" + "go.thethings.network/lorawan-stack/v3/pkg/deviceclaimingserver/enddevices" + "go.thethings.network/lorawan-stack/v3/pkg/errors" + mockis "go.thethings.network/lorawan-stack/v3/pkg/identityserver/mock" + "go.thethings.network/lorawan-stack/v3/pkg/log" + "go.thethings.network/lorawan-stack/v3/pkg/rpcmetadata" + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/types" + "go.thethings.network/lorawan-stack/v3/pkg/util/test" + "go.thethings.network/lorawan-stack/v3/pkg/util/test/assertions/should" + "google.golang.org/grpc" +) + +var ( + timeout = (1 << 5) * test.Delay + + registeredApplicationIDs = &ttnpb.ApplicationIdentifiers{ + ApplicationId: "test-application", + } + registeredApplicationKey = "test-key" + registeredEndDeviceID = "test-end-device" + registeredJoinEUI = types.EUI64{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C} + unRegisteredJoinEUI = types.EUI64{0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D} + registeredDevEUI = types.EUI64{0x00, 0x04, 0xA3, 0x0B, 0x00, 0x1C, 0x05, 0x30} + authenticationCode = "BEEF1234" +) + +func mustHavePeer(ctx context.Context, c *component.Component, role ttnpb.ClusterRole) { + for i := 0; i < 20; i++ { + time.Sleep(20 * time.Millisecond) + if _, err := c.GetPeer(ctx, role, nil); err == nil { + return + } + } + panic("could not connect to peer") +} + +func TestEndDeviceClaimingServer(t *testing.T) { + t.Parallel() + a := assertions.New(t) + ctx := log.NewContext(test.Context(), test.GetLogger(t)) + ctx, cancelCtx := context.WithCancel(ctx) + t.Cleanup(func() { + cancelCtx() + }) + + is, isAddr, closeIS := mockis.New(ctx) + t.Cleanup(closeIS) + + c := componenttest.NewComponent(t, &component.Config{ + ServiceBase: config.ServiceBase{ + Cluster: cluster.Config{ + IdentityServer: isAddr, + }, + GRPC: config.GRPC{ + AllowInsecureForCredentials: true, + }, + }, + }) + mockUpstream, err := enddevices.NewUpstream( + ctx, + c, + enddevices.Config{}, + enddevices.WithClaimer("test", &MockClaimer{ + JoinEUI: registeredJoinEUI, + ClaimFunc: func( + ctx context.Context, joinEUI, devEUI types.EUI64, claimAuthenticationCode string, + ) error { + a.So(joinEUI, should.Equal, registeredJoinEUI) + a.So(devEUI, should.Resemble, registeredDevEUI) + a.So(claimAuthenticationCode, should.Equal, authenticationCode) + return nil + }, + }), + ) + a.So(err, should.BeNil) + dcs, err := New(c, &Config{}, WithEndDeviceClaimingUpstream(mockUpstream)) + test.Must(dcs, err) + + componenttest.StartComponent(t, c) + t.Cleanup(c.Close) + + // Wait for server to be ready. + time.Sleep(timeout) + + mustHavePeer(ctx, c, ttnpb.ClusterRole_DEVICE_CLAIMING_SERVER) + edcsClient := ttnpb.NewEndDeviceClaimingServerClient(c.LoopbackConn()) + + authorizedCallOpt = grpc.PerRPCCredentials(rpcmetadata.MD{ + AuthType: "Bearer", + AuthValue: registeredApplicationKey, + }) + + unAuthorizedCallOpt := grpc.PerRPCCredentials(rpcmetadata.MD{ + AuthType: "Bearer", + AuthValue: "invalid-key", + }) + + // Register entities. + is.ApplicationRegistry().Add( + ctx, + registeredApplicationIDs, + registeredApplicationKey, + ttnpb.Right_RIGHT_APPLICATION_DEVICES_WRITE, + ttnpb.Right_RIGHT_APPLICATION_DEVICES_READ, + ) + is.EndDeviceRegistry().Add( + ctx, + &ttnpb.EndDevice{ + Ids: &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: registeredApplicationIDs, + DeviceId: registeredEndDeviceID, + JoinEui: registeredJoinEUI.Bytes(), + DevEui: registeredDevEUI.Bytes(), + }, + }, + ) + + // GetInfoByJoinEUI. + resp, err := edcsClient.GetInfoByJoinEUI(ctx, &ttnpb.GetInfoByJoinEUIRequest{ + JoinEui: registeredJoinEUI.Bytes(), + }) + a.So(err, should.BeNil) + a.So(resp, should.NotBeNil) + a.So(resp.JoinEui, should.Resemble, registeredJoinEUI.Bytes()) + a.So(resp.SupportsClaiming, should.BeTrue) + + resp, err = edcsClient.GetInfoByJoinEUI(ctx, &ttnpb.GetInfoByJoinEUIRequest{ + JoinEui: unRegisteredJoinEUI.Bytes(), + }) + a.So(err, should.BeNil) + a.So(resp, should.NotBeNil) + a.So(resp.JoinEui, should.Resemble, unRegisteredJoinEUI.Bytes()) + a.So(resp.SupportsClaiming, should.BeFalse) + + // Claim end device. + for _, tc := range []struct { + Name string + Req *ttnpb.ClaimEndDeviceRequest + CallOpts grpc.CallOption + ErrorAssertion func(err error) bool + }{ + { + Name: "EmptyRequest", + Req: &ttnpb.ClaimEndDeviceRequest{}, + CallOpts: authorizedCallOpt, + ErrorAssertion: errors.IsInvalidArgument, + }, + { + Name: "NilTargetApplicationIds", + Req: &ttnpb.ClaimEndDeviceRequest{ + SourceDevice: &ttnpb.ClaimEndDeviceRequest_QrCode{ + QrCode: []byte("URN:LW:DP:42FFFFFFFFFFFFFF:4242FFFFFFFFFFFF:42FFFF42:%V0102"), + }, + TargetApplicationIds: nil, + }, + CallOpts: authorizedCallOpt, + ErrorAssertion: errors.IsInvalidArgument, + }, + { + Name: "NilSource", + Req: &ttnpb.ClaimEndDeviceRequest{ + SourceDevice: nil, + TargetApplicationIds: &ttnpb.ApplicationIdentifiers{ + ApplicationId: "target-app", + }, + }, + CallOpts: authorizedCallOpt, + ErrorAssertion: errors.IsInvalidArgument, + }, + { + Name: "NoEUIs", + Req: &ttnpb.ClaimEndDeviceRequest{ + SourceDevice: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers_{ + AuthenticatedIdentifiers: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers{}, + }, + TargetApplicationIds: &ttnpb.ApplicationIdentifiers{ + ApplicationId: "target-app", + }, + }, + CallOpts: authorizedCallOpt, + ErrorAssertion: errors.IsInvalidArgument, + }, + { + Name: "PermissionDenied", + Req: &ttnpb.ClaimEndDeviceRequest{ + SourceDevice: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers_{ + AuthenticatedIdentifiers: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers{ + JoinEui: registeredJoinEUI.Bytes(), + DevEui: registeredDevEUI.Bytes(), + AuthenticationCode: authenticationCode, + }, + }, + TargetApplicationIds: registeredApplicationIDs, + TargetDeviceId: "target-device", + }, + CallOpts: unAuthorizedCallOpt, + ErrorAssertion: func(err error) bool { + return errors.IsPermissionDenied(err) + }, + }, + { + Name: "ValidDevice", + Req: &ttnpb.ClaimEndDeviceRequest{ + SourceDevice: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers_{ + AuthenticatedIdentifiers: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers{ + JoinEui: registeredJoinEUI.Bytes(), + DevEui: registeredDevEUI.Bytes(), + AuthenticationCode: authenticationCode, + }, + }, + TargetApplicationIds: registeredApplicationIDs, + TargetDeviceId: "target-device", + }, + CallOpts: authorizedCallOpt, + }, + } { + tc := tc + t.Run(tc.Name, func(t *testing.T) { + t.Parallel() + _, err := edcsClient.Claim(ctx, tc.Req, tc.CallOpts) + if err != nil { + if tc.ErrorAssertion == nil || !a.So(tc.ErrorAssertion(err), should.BeTrue) { + t.Fatalf("Unexpected error: %v", err) + } + } else if tc.ErrorAssertion != nil { + t.Fatalf("Expected error") + } + }) + } + + // GetClaimStatus. + status, err := edcsClient.GetClaimStatus(ctx, &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: registeredApplicationIDs, + DeviceId: registeredEndDeviceID, + }, authorizedCallOpt) + a.So(errors.IsInvalidArgument(err), should.BeTrue) + a.So(status, should.BeNil) + + status, err = edcsClient.GetClaimStatus(ctx, &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: registeredApplicationIDs, + DeviceId: registeredEndDeviceID, + JoinEui: registeredJoinEUI.Bytes(), + DevEui: registeredDevEUI.Bytes(), + }, unAuthorizedCallOpt) + a.So(errors.IsPermissionDenied(err), should.BeTrue) + a.So(status, should.BeNil) + + status, err = edcsClient.GetClaimStatus(ctx, &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: registeredApplicationIDs, + DeviceId: registeredEndDeviceID, + JoinEui: registeredJoinEUI.Bytes(), + DevEui: registeredDevEUI.Bytes(), + }, authorizedCallOpt) + a.So(err, should.BeNil) + a.So(status, should.NotBeNil) + + // Unclaim. + _, err = edcsClient.Unclaim(ctx, &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: registeredApplicationIDs, + DeviceId: registeredEndDeviceID, + }, authorizedCallOpt) + a.So(errors.IsInvalidArgument(err), should.BeTrue) + + _, err = edcsClient.Unclaim(ctx, &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: registeredApplicationIDs, + DeviceId: registeredEndDeviceID, + JoinEui: registeredJoinEUI.Bytes(), + DevEui: registeredDevEUI.Bytes(), + }, unAuthorizedCallOpt) + a.So(errors.IsPermissionDenied(err), should.BeTrue) + + _, err = edcsClient.Unclaim(ctx, &ttnpb.EndDeviceIdentifiers{ + ApplicationIds: registeredApplicationIDs, + DeviceId: registeredEndDeviceID, + JoinEui: registeredJoinEUI.Bytes(), + DevEui: registeredDevEUI.Bytes(), + }, authorizedCallOpt) + a.So(err, should.BeNil) +} diff --git a/pkg/deviceclaimingserver/grpc_gateways.go b/pkg/deviceclaimingserver/grpc_gateways.go index cef5574899..7ecae5c0ae 100644 --- a/pkg/deviceclaimingserver/grpc_gateways.go +++ b/pkg/deviceclaimingserver/grpc_gateways.go @@ -27,17 +27,26 @@ type noopGCLS struct { } // Claim implements GatewayClaimingServer. -func (noopGCLS) Claim(ctx context.Context, req *ttnpb.ClaimGatewayRequest) (ids *ttnpb.GatewayIdentifiers, retErr error) { +func (noopGCLS) Claim( + _ context.Context, + _ *ttnpb.ClaimGatewayRequest, +) (ids *ttnpb.GatewayIdentifiers, retErr error) { return nil, errMethodUnavailable.New() } // AuthorizeGateway implements GatewayClaimingServer. -func (noopGCLS) AuthorizeGateway(ctx context.Context, req *ttnpb.AuthorizeGatewayRequest) (*emptypb.Empty, error) { +func (noopGCLS) AuthorizeGateway( + _ context.Context, + _ *ttnpb.AuthorizeGatewayRequest, +) (*emptypb.Empty, error) { return nil, errMethodUnavailable.New() } // UnauthorizeGateway implements GatewayClaimingServer. -func (noopGCLS) UnauthorizeGateway(ctx context.Context, gtwIDs *ttnpb.GatewayIdentifiers) (*emptypb.Empty, error) { +func (noopGCLS) UnauthorizeGateway( + _ context.Context, + _ *ttnpb.GatewayIdentifiers, +) (*emptypb.Empty, error) { return nil, errMethodUnavailable.New() } @@ -49,16 +58,25 @@ type gatewayClaimingServer struct { } // Claim implements GatewayClaimingServer. -func (gcls gatewayClaimingServer) Claim(ctx context.Context, req *ttnpb.ClaimGatewayRequest) (ids *ttnpb.GatewayIdentifiers, retErr error) { +func (gcls gatewayClaimingServer) Claim( + ctx context.Context, + req *ttnpb.ClaimGatewayRequest, +) (ids *ttnpb.GatewayIdentifiers, retErr error) { return gcls.DCS.gatewayClaimingServerUpstream.Claim(ctx, req) } // AuthorizeGateway implements GatewayClaimingServer. -func (gcls gatewayClaimingServer) AuthorizeGateway(ctx context.Context, req *ttnpb.AuthorizeGatewayRequest) (*emptypb.Empty, error) { +func (gcls gatewayClaimingServer) AuthorizeGateway( + ctx context.Context, + req *ttnpb.AuthorizeGatewayRequest, +) (*emptypb.Empty, error) { return gcls.DCS.gatewayClaimingServerUpstream.AuthorizeGateway(ctx, req) } // UnauthorizeGateway implements GatewayClaimingServer. -func (gcls gatewayClaimingServer) UnauthorizeGateway(ctx context.Context, gtwIDs *ttnpb.GatewayIdentifiers) (*emptypb.Empty, error) { +func (gcls gatewayClaimingServer) UnauthorizeGateway( + ctx context.Context, + gtwIDs *ttnpb.GatewayIdentifiers, +) (*emptypb.Empty, error) { return gcls.DCS.gatewayClaimingServerUpstream.UnauthorizeGateway(ctx, gtwIDs) } diff --git a/pkg/deviceclaimingserver/deviceclaimingserver_test.go b/pkg/deviceclaimingserver/grpc_gateways_test.go similarity index 55% rename from pkg/deviceclaimingserver/deviceclaimingserver_test.go rename to pkg/deviceclaimingserver/grpc_gateways_test.go index 36a11b28d7..8724b7e2d0 100644 --- a/pkg/deviceclaimingserver/deviceclaimingserver_test.go +++ b/pkg/deviceclaimingserver/grpc_gateways_test.go @@ -1,4 +1,4 @@ -// Copyright © 2021 The Things Network Foundation, The Things Industries B.V. +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -34,138 +34,6 @@ import ( "google.golang.org/grpc" ) -var timeout = (1 << 5) * test.Delay - -func mustHavePeer(ctx context.Context, c *component.Component, role ttnpb.ClusterRole) { - for i := 0; i < 20; i++ { - time.Sleep(20 * time.Millisecond) - if _, err := c.GetPeer(ctx, role, nil); err == nil { - return - } - } - panic("could not connect to peer") -} - -func TestEndDeviceClaimingServer(t *testing.T) { - a := assertions.New(t) - ctx := log.NewContext(test.Context(), test.GetLogger(t)) - ctx, cancelCtx := context.WithCancel(ctx) - defer cancelCtx() - - c := componenttest.NewComponent(t, &component.Config{ - ServiceBase: config.ServiceBase{ - GRPC: config.GRPC{ - AllowInsecureForCredentials: true, - }, - }, - }) - test.Must(New(c, &Config{})) - componenttest.StartComponent(t, c) - defer c.Close() - - // Wait for server to be ready. - time.Sleep(timeout) - - mustHavePeer(ctx, c, ttnpb.ClusterRole_DEVICE_CLAIMING_SERVER) - edcsClient := ttnpb.NewEndDeviceClaimingServerClient(c.LoopbackConn()) - - ids := &ttnpb.ApplicationIdentifiers{ - ApplicationId: "foo", - } - - authorizedCallOpt := grpc.PerRPCCredentials(rpcmetadata.MD{ - AuthType: "Bearer", - AuthValue: "foo", - }) - - // Test API Validation here. Functionality is tested in the implementations. - for _, tc := range []struct { - Name string - Req interface{} - ErrorAssertion func(err error) bool - }{ - { - Name: "Authorize/NilIDs", - Req: &ttnpb.AuthorizeApplicationRequest{ - ApplicationIds: nil, - ApiKey: "test", - }, - ErrorAssertion: errors.IsInvalidArgument, - }, - { - Name: "Authorize/EmptyAPIKey", - Req: &ttnpb.AuthorizeApplicationRequest{ - ApplicationIds: ids, - ApiKey: "", - }, - ErrorAssertion: errors.IsInvalidArgument, - }, - { - Name: "Unauthorize/EmptyAppIDs", - Req: &ttnpb.ApplicationIdentifiers{}, - ErrorAssertion: errors.IsInvalidArgument, - }, - { - Name: "Claim/EmptyRequest", - Req: &ttnpb.ClaimEndDeviceRequest{}, - ErrorAssertion: errors.IsInvalidArgument, - }, - { - Name: "Claim/NilTargetApplicationIds", - Req: &ttnpb.ClaimEndDeviceRequest{ - SourceDevice: &ttnpb.ClaimEndDeviceRequest_QrCode{ - QrCode: []byte("URN:LW:DP:42FFFFFFFFFFFFFF:4242FFFFFFFFFFFF:42FFFF42:%V0102"), - }, - TargetApplicationIds: nil, - }, - ErrorAssertion: errors.IsInvalidArgument, - }, - { - Name: "Claim/NilSource", - Req: &ttnpb.ClaimEndDeviceRequest{ - SourceDevice: nil, - TargetApplicationIds: &ttnpb.ApplicationIdentifiers{ - ApplicationId: "target-app", - }, - }, - ErrorAssertion: errors.IsInvalidArgument, - }, - { - Name: "Claim/NoEUIs", - Req: &ttnpb.ClaimEndDeviceRequest{ - SourceDevice: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers_{ - AuthenticatedIdentifiers: &ttnpb.ClaimEndDeviceRequest_AuthenticatedIdentifiers{}, - }, - TargetApplicationIds: &ttnpb.ApplicationIdentifiers{ - ApplicationId: "target-app", - }, - }, - ErrorAssertion: errors.IsInvalidArgument, - }, - } { - t.Run(tc.Name, func(t *testing.T) { - var err error - switch req := tc.Req.(type) { - case *ttnpb.AuthorizeApplicationRequest: - _, err = edcsClient.AuthorizeApplication(ctx, req, authorizedCallOpt) - case *ttnpb.ApplicationIdentifiers: - _, err = edcsClient.UnauthorizeApplication(ctx, req, authorizedCallOpt) - case *ttnpb.ClaimEndDeviceRequest: - _, err = edcsClient.Claim(ctx, req, authorizedCallOpt) - default: - panic("invalid request type") - } - if err != nil { - if tc.ErrorAssertion == nil || !a.So(tc.ErrorAssertion(err), should.BeTrue) { - t.Fatalf("Unexpected error: %v", err) - } - } else if tc.ErrorAssertion != nil { - t.Fatalf("Expected error") - } - }) - } -} - var ( claimAuthCode = []byte("test-code") userID = ttnpb.UserIdentifiers{ @@ -178,10 +46,13 @@ var ( ) func TestGatewayClaimingServer(t *testing.T) { + t.Parallel() a := assertions.New(t) ctx := log.NewContext(test.Context(), test.GetLogger(t)) ctx, cancelCtx := context.WithCancel(ctx) - defer cancelCtx() + t.Cleanup(func() { + cancelCtx() + }) c := componenttest.NewComponent(t, &component.Config{ ServiceBase: config.ServiceBase{ @@ -192,7 +63,9 @@ func TestGatewayClaimingServer(t *testing.T) { }) test.Must(New(c, &Config{})) componenttest.StartComponent(t, c) - defer c.Close() + t.Cleanup(func() { + c.Close() + }) // Wait for server to be ready. time.Sleep(timeout) @@ -203,7 +76,7 @@ func TestGatewayClaimingServer(t *testing.T) { // Test API Validation here. Functionality is tested in the implementations. for _, tc := range []struct { Name string - Req interface{} + Req any ErrorAssertion func(err error) bool }{ { @@ -257,7 +130,9 @@ func TestGatewayClaimingServer(t *testing.T) { ErrorAssertion: errors.IsInvalidArgument, }, } { + tc := tc t.Run(tc.Name, func(t *testing.T) { + t.Parallel() var err error switch req := tc.Req.(type) { case *ttnpb.AuthorizeGatewayRequest: diff --git a/pkg/deviceclaimingserver/util_test.go b/pkg/deviceclaimingserver/util_test.go new file mode 100644 index 0000000000..26405d2e20 --- /dev/null +++ b/pkg/deviceclaimingserver/util_test.go @@ -0,0 +1,57 @@ +// Copyright © 2023 The Things Network Foundation, The Things Industries B.V. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package deviceclaimingserver_test + +import ( + "context" + + "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" + "go.thethings.network/lorawan-stack/v3/pkg/types" +) + +// MockClaimer is a mock Claimer. +type MockClaimer struct { + JoinEUI types.EUI64 + + ClaimFunc func(context.Context, types.EUI64, types.EUI64, string) error +} + +// SupportsJoinEUI returns whether the Join Server supports this JoinEUI. +func (m MockClaimer) SupportsJoinEUI(joinEUI types.EUI64) bool { + return m.JoinEUI.Equal(joinEUI) +} + +// Claim claims an End Device. +func (m MockClaimer) Claim( + ctx context.Context, joinEUI, devEUI types.EUI64, claimAuthenticationCode string, +) error { + return m.ClaimFunc(ctx, joinEUI, devEUI, claimAuthenticationCode) +} + +// GetClaimStatus returns the claim status an End Device. +func (MockClaimer) GetClaimStatus(_ context.Context, + ids *ttnpb.EndDeviceIdentifiers, +) (*ttnpb.GetClaimStatusResponse, error) { + return &ttnpb.GetClaimStatusResponse{ + EndDeviceIds: ids, + }, nil +} + +// Unclaim releases the claim on an End Device. +func (MockClaimer) Unclaim(_ context.Context, + _ *ttnpb.EndDeviceIdentifiers, +) (err error) { + return nil +} diff --git a/pkg/devicerepository/grpc_test.go b/pkg/devicerepository/grpc_test.go index 65df5de562..3623e443f6 100644 --- a/pkg/devicerepository/grpc_test.go +++ b/pkg/devicerepository/grpc_test.go @@ -182,18 +182,18 @@ func TestGRPC(t *testing.T) { t.Run("Auth", func(t *testing.T) { for _, atc := range []struct { name string - execute func(opts ...grpc.CallOption) (interface{}, error) + execute func(opts ...grpc.CallOption) (any, error) }{ { name: "ListBrands", - execute: func(opts ...grpc.CallOption) (interface{}, error) { + execute: func(opts ...grpc.CallOption) (any, error) { response, err := cl.ListBrands(ctx, &ttnpb.ListEndDeviceBrandsRequest{}, opts...) return response, err }, }, { name: "GetBrand", - execute: func(opts ...grpc.CallOption) (interface{}, error) { + execute: func(opts ...grpc.CallOption) (any, error) { response, err := cl.GetBrand(ctx, &ttnpb.GetEndDeviceBrandRequest{ BrandId: "brand1", }, opts...) @@ -202,7 +202,7 @@ func TestGRPC(t *testing.T) { }, { name: "ListModels", - execute: func(opts ...grpc.CallOption) (interface{}, error) { + execute: func(opts ...grpc.CallOption) (any, error) { response, err := cl.ListModels(ctx, &ttnpb.ListEndDeviceModelsRequest{ BrandId: "brand1", }, opts...) @@ -211,7 +211,7 @@ func TestGRPC(t *testing.T) { }, { name: "GetModel", - execute: func(opts ...grpc.CallOption) (interface{}, error) { + execute: func(opts ...grpc.CallOption) (any, error) { response, err := cl.GetModel(ctx, &ttnpb.GetEndDeviceModelRequest{ BrandId: "brand1", ModelId: "model1", @@ -221,7 +221,7 @@ func TestGRPC(t *testing.T) { }, { name: "GetTemplate", - execute: func(opts ...grpc.CallOption) (interface{}, error) { + execute: func(opts ...grpc.CallOption) (any, error) { response, err := cl.GetTemplate(ctx, &ttnpb.GetTemplateRequest{ VersionIds: &ttnpb.EndDeviceVersionIdentifiers{ BrandId: "brand1", @@ -233,7 +233,7 @@ func TestGRPC(t *testing.T) { }, { name: "GetUplinkDecoder", - execute: func(opts ...grpc.CallOption) (interface{}, error) { + execute: func(opts ...grpc.CallOption) (any, error) { response, err := cl.GetUplinkDecoder(ctx, &ttnpb.GetPayloadFormatterRequest{ VersionIds: &ttnpb.EndDeviceVersionIdentifiers{ BrandId: "brand1", @@ -245,7 +245,7 @@ func TestGRPC(t *testing.T) { }, { name: "GetDownlinkDecoder", - execute: func(opts ...grpc.CallOption) (interface{}, error) { + execute: func(opts ...grpc.CallOption) (any, error) { response, err := cl.GetDownlinkDecoder(ctx, &ttnpb.GetPayloadFormatterRequest{ VersionIds: &ttnpb.EndDeviceVersionIdentifiers{ BrandId: "brand1", @@ -257,7 +257,7 @@ func TestGRPC(t *testing.T) { }, { name: "GetDownlinkEncoder", - execute: func(opts ...grpc.CallOption) (interface{}, error) { + execute: func(opts ...grpc.CallOption) (any, error) { response, err := cl.GetDownlinkEncoder(ctx, &ttnpb.GetPayloadFormatterRequest{ VersionIds: &ttnpb.EndDeviceVersionIdentifiers{ BrandId: "brand1", diff --git a/pkg/devicerepository/store/bleve/bleve.go b/pkg/devicerepository/store/bleve/bleve.go index 41caf599c1..52da8e9e79 100644 --- a/pkg/devicerepository/store/bleve/bleve.go +++ b/pkg/devicerepository/store/bleve/bleve.go @@ -80,7 +80,7 @@ var errCannotOpenIndex = errors.DefineNotFound("cannot_open_index", "cannot open func openIndex(ctx context.Context, path string) (bleve.Index, error) { log.FromContext(ctx).WithField("path", path).Debug("Loading index") - index, err := bleve.OpenUsing(path, map[string]interface{}{"read_only": true, "bolt_timeout": "60s"}) + index, err := bleve.OpenUsing(path, map[string]any{"read_only": true, "bolt_timeout": "60s"}) if err != nil { return nil, errCannotOpenIndex.WithAttributes("path", path).WithCause(err) } diff --git a/pkg/devicerepository/store/bleve/bleve_test.go b/pkg/devicerepository/store/bleve/bleve_test.go index 4d3cf1b72e..265bf21c6a 100644 --- a/pkg/devicerepository/store/bleve/bleve_test.go +++ b/pkg/devicerepository/store/bleve/bleve_test.go @@ -559,12 +559,12 @@ func TestBleve(t *testing.T) { }) for _, tc := range []struct { name string - f func(store.GetCodecRequest) (interface{}, error) - codec interface{} + f func(store.GetCodecRequest) (any, error) + codec any }{ { name: "UplinkDecoder", - f: func(req store.GetCodecRequest) (interface{}, error) { return s.GetUplinkDecoder(req) }, + f: func(req store.GetCodecRequest) (any, error) { return s.GetUplinkDecoder(req) }, codec: &ttnpb.MessagePayloadDecoder{ Formatter: ttnpb.PayloadFormatter_FORMATTER_JAVASCRIPT, FormatterParameter: "// uplink decoder\n", @@ -572,7 +572,7 @@ func TestBleve(t *testing.T) { }, { name: "DownlinkDecoder", - f: func(req store.GetCodecRequest) (interface{}, error) { return s.GetDownlinkDecoder(req) }, + f: func(req store.GetCodecRequest) (any, error) { return s.GetDownlinkDecoder(req) }, codec: &ttnpb.MessagePayloadDecoder{ Formatter: ttnpb.PayloadFormatter_FORMATTER_JAVASCRIPT, FormatterParameter: "// downlink decoder\n", @@ -580,7 +580,7 @@ func TestBleve(t *testing.T) { }, { name: "DownlinkEncoder", - f: func(req store.GetCodecRequest) (interface{}, error) { return s.GetDownlinkEncoder(req) }, + f: func(req store.GetCodecRequest) (any, error) { return s.GetDownlinkEncoder(req) }, codec: &ttnpb.MessagePayloadEncoder{ Formatter: ttnpb.PayloadFormatter_FORMATTER_JAVASCRIPT, FormatterParameter: "// downlink encoder\n", diff --git a/pkg/devicerepository/store/bleve/store.go b/pkg/devicerepository/store/bleve/store.go index 565527ba1c..06a3a76138 100644 --- a/pkg/devicerepository/store/bleve/store.go +++ b/pkg/devicerepository/store/bleve/store.go @@ -37,7 +37,7 @@ var ( // retrieve returns the resulting document from the cache, if available. Otherwise, // it extracts it from the appropriate field of the document match result and stores // in the cache for future use. -func (s *bleveStore) retrieve(hit *search.DocumentMatch, fieldName string, newValue func() interface{}) (interface{}, error) { +func (s *bleveStore) retrieve(hit *search.DocumentMatch, fieldName string, newValue func() any) (any, error) { cached, err := s.cache.Get(hit.ID) if err != nil { jsonString, ok := hit.Fields[fieldName].(string) @@ -99,7 +99,7 @@ func (s *bleveStore) GetBrands(req store.GetBrandsRequest) (*store.GetBrandsResp brands := make([]*ttnpb.EndDeviceBrand, 0, len(result.Hits)) for _, hit := range result.Hits { - brand, err := s.retrieve(hit, "BrandJSON", func() interface{} { return &ttnpb.EndDeviceBrand{} }) + brand, err := s.retrieve(hit, "BrandJSON", func() any { return &ttnpb.EndDeviceBrand{} }) if err != nil { return nil, err } @@ -165,7 +165,7 @@ func (s *bleveStore) GetModels(req store.GetModelsRequest) (*store.GetModelsResp models := make([]*ttnpb.EndDeviceModel, 0, len(result.Hits)) for _, hit := range result.Hits { - model, err := s.retrieve(hit, "ModelJSON", func() interface{} { return &ttnpb.EndDeviceModel{} }) + model, err := s.retrieve(hit, "ModelJSON", func() any { return &ttnpb.EndDeviceModel{} }) if err != nil { return nil, err } @@ -233,7 +233,7 @@ func (s *bleveStore) GetTemplate(req *ttnpb.GetTemplateRequest, _ *store.EndDevi BrandId: brandID, } - model, err := s.retrieve(result.Hits[0], "ProfileJSON", func() interface{} { return &store.EndDeviceProfile{} }) + model, err := s.retrieve(result.Hits[0], "ProfileJSON", func() any { return &store.EndDeviceProfile{} }) if err != nil { return nil, err } diff --git a/pkg/devicerepository/store/remote/remote_test.go b/pkg/devicerepository/store/remote/remote_test.go index dce923f10a..d3b6677688 100644 --- a/pkg/devicerepository/store/remote/remote_test.go +++ b/pkg/devicerepository/store/remote/remote_test.go @@ -467,12 +467,12 @@ func TestRemoteStore(t *testing.T) { }) for _, tc := range []struct { name string - f func(store.GetCodecRequest) (interface{}, error) - codec interface{} + f func(store.GetCodecRequest) (any, error) + codec any }{ { name: "UplinkDecoder", - f: func(req store.GetCodecRequest) (interface{}, error) { return s.GetUplinkDecoder(req) }, + f: func(req store.GetCodecRequest) (any, error) { return s.GetUplinkDecoder(req) }, codec: &ttnpb.MessagePayloadDecoder{ Formatter: ttnpb.PayloadFormatter_FORMATTER_JAVASCRIPT, FormatterParameter: "// uplink decoder\n", @@ -480,7 +480,7 @@ func TestRemoteStore(t *testing.T) { }, { name: "DownlinkDecoder", - f: func(req store.GetCodecRequest) (interface{}, error) { return s.GetDownlinkDecoder(req) }, + f: func(req store.GetCodecRequest) (any, error) { return s.GetDownlinkDecoder(req) }, codec: &ttnpb.MessagePayloadDecoder{ Formatter: ttnpb.PayloadFormatter_FORMATTER_JAVASCRIPT, FormatterParameter: "// downlink decoder\n", @@ -488,7 +488,7 @@ func TestRemoteStore(t *testing.T) { }, { name: "DownlinkEncoder", - f: func(req store.GetCodecRequest) (interface{}, error) { return s.GetDownlinkEncoder(req) }, + f: func(req store.GetCodecRequest) (any, error) { return s.GetDownlinkEncoder(req) }, codec: &ttnpb.MessagePayloadEncoder{ Formatter: ttnpb.PayloadFormatter_FORMATTER_JAVASCRIPT, FormatterParameter: "// downlink encoder\n", @@ -513,12 +513,12 @@ func TestRemoteStore(t *testing.T) { t.Run("Examples", func(t *testing.T) { for _, tc := range []struct { name string - f func(store.GetCodecRequest) (interface{}, error) - codec interface{} + f func(store.GetCodecRequest) (any, error) + codec any }{ { name: "UplinkDecoder", - f: func(req store.GetCodecRequest) (interface{}, error) { return s.GetUplinkDecoder(req) }, + f: func(req store.GetCodecRequest) (any, error) { return s.GetUplinkDecoder(req) }, codec: &ttnpb.MessagePayloadDecoder{ Formatter: ttnpb.PayloadFormatter_FORMATTER_JAVASCRIPT, FormatterParameter: "// uplink decoder\n", @@ -529,10 +529,10 @@ func TestRemoteStore(t *testing.T) { FrmPayload: []byte{1, 1, 100}, }, Output: &ttnpb.DecodedMessagePayload{ - Data: mustStruct(map[string]interface{}{ + Data: mustStruct(map[string]any{ "type": "BATTERY_STATUS", "value": 100, - "nested": map[string]interface{}{ + "nested": map[string]any{ "key": "value", "list": []int{1, 2, 3}, }, @@ -545,7 +545,7 @@ func TestRemoteStore(t *testing.T) { }, { name: "DownlinkDecoder", - f: func(req store.GetCodecRequest) (interface{}, error) { return s.GetDownlinkDecoder(req) }, + f: func(req store.GetCodecRequest) (any, error) { return s.GetDownlinkDecoder(req) }, codec: &ttnpb.MessagePayloadDecoder{ Formatter: ttnpb.PayloadFormatter_FORMATTER_JAVASCRIPT, FormatterParameter: "// downlink decoder\n", @@ -556,7 +556,7 @@ func TestRemoteStore(t *testing.T) { FrmPayload: []byte{1, 5}, }, Output: &ttnpb.DecodedMessagePayload{ - Data: mustStruct(map[string]interface{}{ + Data: mustStruct(map[string]any{ "action": "DIM", "value": 5, }), @@ -568,14 +568,14 @@ func TestRemoteStore(t *testing.T) { }, { name: "DownlinkEncoder", - f: func(req store.GetCodecRequest) (interface{}, error) { return s.GetDownlinkEncoder(req) }, + f: func(req store.GetCodecRequest) (any, error) { return s.GetDownlinkEncoder(req) }, codec: &ttnpb.MessagePayloadEncoder{ Formatter: ttnpb.PayloadFormatter_FORMATTER_JAVASCRIPT, FormatterParameter: "// downlink encoder\n", Examples: []*ttnpb.MessagePayloadEncoder_Example{{ Description: "downlink encode example", Input: &ttnpb.DecodedMessagePayload{ - Data: mustStruct(map[string]interface{}{ + Data: mustStruct(map[string]any{ "action": "DIM", "value": 5, }), @@ -611,7 +611,7 @@ func TestRemoteStore(t *testing.T) { }) } -func mustStruct(d map[string]interface{}) *structpb.Struct { +func mustStruct(d map[string]any) *structpb.Struct { v, err := goproto.Struct(d) if err != nil { panic(err) diff --git a/pkg/devicerepository/store/remote/schema.go b/pkg/devicerepository/store/remote/schema.go index cbb7513f02..aae1d0eea6 100644 --- a/pkg/devicerepository/store/remote/schema.go +++ b/pkg/devicerepository/store/remote/schema.go @@ -294,9 +294,9 @@ type EncodedCodecData struct { } type DecodedCodecData struct { - Data map[string]interface{} `yaml:"data"` - Warnings []string `yaml:"warnings"` - Errors []string `yaml:"errors"` + Data map[string]any `yaml:"data"` + Warnings []string `yaml:"warnings"` + Errors []string `yaml:"errors"` } type DecoderCodecExample struct { diff --git a/pkg/devicetemplates/microchip.go b/pkg/devicetemplates/microchip.go index 44af9c8db6..8ca166a3de 100644 --- a/pkg/devicetemplates/microchip.go +++ b/pkg/devicetemplates/microchip.go @@ -162,7 +162,7 @@ var ( // microchipATECC608AMAHTNT is a Microchip ATECC608A-MAHTN-T device provisioner. type microchipATECC608AMAHTNT struct { - keys map[string]interface{} + keys map[string]any } func (*microchipATECC608AMAHTNT) Format() *ttnpb.EndDeviceTemplateFormat { @@ -236,7 +236,7 @@ func (m *microchipATECC608AMAHTNT) Convert( // microchipATECC608TNGLORA is a Microchip ATECC608A-TNGLORA-B and -C device provisioner. type microchipATECC608TNGLORA struct { - keys map[string]interface{} + keys map[string]any } func (*microchipATECC608TNGLORA) Format() *ttnpb.EndDeviceTemplateFormat { @@ -397,8 +397,8 @@ func (m *microchipATECC608TNGLORA) Convert( //nolint:gocyclo } func init() { - getKeys := func(raw map[string][]byte) map[string]interface{} { - keys := make(map[string]interface{}, len(raw)) + getKeys := func(raw map[string][]byte) map[string]any { + keys := make(map[string]any, len(raw)) for kid, key := range raw { block, _ := pem.Decode(key) if block == nil { diff --git a/pkg/email/sendgrid/sendgrid.go b/pkg/email/sendgrid/sendgrid.go index c395129517..7285d3048a 100644 --- a/pkg/email/sendgrid/sendgrid.go +++ b/pkg/email/sendgrid/sendgrid.go @@ -66,7 +66,7 @@ func (s *SendGrid) Send(message *email.Message) error { } if response.StatusCode >= 300 { - attributes := []interface{}{ + attributes := []any{ "status_code", response.StatusCode, "response", response.Body, } diff --git a/pkg/email/templates/base.html.tmpl b/pkg/email/templates/base.html.tmpl index c7f84d6fb1..08a855c7df 100644 --- a/pkg/email/templates/base.html.tmpl +++ b/pkg/email/templates/base.html.tmpl @@ -2,9 +2,7 @@ - - {{ block "title" . }}{{ end }} - + {{ block "title" . }}{{ end }} @@ -83,7 +81,7 @@