diff --git a/.github/workflows/build-ci-service-images.yaml b/.github/workflows/build-ci-service-images.yaml index 229bbf21b232a..0ce3f02799a4b 100644 --- a/.github/workflows/build-ci-service-images.yaml +++ b/.github/workflows/build-ci-service-images.yaml @@ -38,13 +38,13 @@ jobs: - name: Extract metadata (tags, labels) for Docker id: meta - uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 + uses: docker/metadata-action@369eb591f429131d6889c46b94e711f089e6ca96 # v5.6.1 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - name: Build etcd image id: docker_build - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 + uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0 with: context: ${{ github.workspace }} file: .github/services/Dockerfile.etcd diff --git a/.github/workflows/build-usage-image.yaml b/.github/workflows/build-usage-image.yaml index bd7ab7a733e03..dd7aa94a8c9a6 100644 --- a/.github/workflows/build-usage-image.yaml +++ b/.github/workflows/build-usage-image.yaml @@ -24,7 +24,7 @@ jobs: with: registry-type: public # Build and publish container image on ECR. - - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6.9.0 + - uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355 # v6.10.0 with: context: "examples/teleport-usage" tags: public.ecr.aws/gravitational/teleport-usage:${{ steps.version.outputs.version }} diff --git a/.github/workflows/dependency-review.yaml b/.github/workflows/dependency-review.yaml index 8042dba782511..cff3d22b5e26a 100644 --- a/.github/workflows/dependency-review.yaml +++ b/.github/workflows/dependency-review.yaml @@ -25,4 +25,5 @@ jobs: pkg:cargo/asn1-rs, pkg:cargo/asn1-rs-derive, pkg:cargo/asn1-rs-impl, - pkg:cargo/der-parser + pkg:cargo/der-parser, + pkg:npm/prettier diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 67ed5701fa9dc..a75de41cae910 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -203,7 +203,7 @@ jobs: - name: Print linter versions run: | echo "BUF_VERSION=$BUF_VERSION" - - uses: bufbuild/buf-setup-action@5d38b66514ec5b6b7b753e133245555ea664d0ac # v1.46.0 + - uses: bufbuild/buf-setup-action@9672cee01808979ea1249f81d6d321217b9a10f6 # v1.47.2 with: github_token: ${{ github.token }} version: ${{ env.BUF_VERSION }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 35b2a831979f2..e1cfc3f0c819e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog +## 18.0.0 (xx/xx/xx) + +### Breaking changes + +#### TLS Cipher Suites + +TLS cipher suites with known security issues can no longer be manually +configured in the Teleport YAML configuration file. +If you do not explicitly configure any of the listed TLS cipher suites, you are +not affected by this change. +Teleport 18 removes support for: +- `tls-rsa-with-aes-128-cbc-sha` +- `tls-rsa-with-aes-256-cbc-sha` +- `tls-rsa-with-aes-128-cbc-sha256` +- `tls-rsa-with-aes-128-gcm-sha256` +- `tls-rsa-with-aes-256-gcm-sha384` +- `tls-ecdhe-ecdsa-with-aes-128-cbc-sha256` +- `tls-ecdhe-rsa-with-aes-128-cbc-sha256` + ## 16.0.0 (xx/xx/xx) ### Breaking changes @@ -37,10 +56,10 @@ more details. #### Default keyboard shortcuts in Teleport Connect have been changed -On Windows and Linux, some of the default shortcuts conflicted with the default bash or nano shortcuts +On Windows and Linux, some of the default shortcuts conflicted with the default bash or nano shortcuts (e.g. Ctrl + E, Ctrl + K). On those platforms, the default shortcuts have been changed to a combination of Ctrl + Shift + *. -We also updated the shortcut to open a new terminal on macOS to Control + Shift + \`. +We also updated the shortcut to open a new terminal on macOS to Control + Shift + \`. See [configuration](docs/pages/connect-your-client/teleport-connect.mdx#configuration) for the current list of shortcuts. @@ -152,8 +171,8 @@ or use PAM. #### Remove restricted sessions for SSH -The restricted session feature for SSH has been deprecated since Teleport 14 and -has been removed in Teleport 15. We recommend implementing network restrictions +The restricted session feature for SSH has been deprecated since Teleport 14 and +has been removed in Teleport 15. We recommend implementing network restrictions outside of Teleport (iptables, security groups, etc). #### Packages no longer published to legacy Debian and RPM repos @@ -200,7 +219,7 @@ throughout the remainder of these releases' lifecycle. ##### Helm cluster chart FIPS mode changes -The teleport-cluster chart no longer uses versionOverride and extraArgs to set FIPS mode. +The teleport-cluster chart no longer uses versionOverride and extraArgs to set FIPS mode. Instead, you should use the following values file configuration: ``` @@ -277,7 +296,7 @@ used with the legacy AMIs has been removed. Due to the new separate operator deployment, the operator is deployed by a subchart. This causes the following breaking changes: - `installCRDs` has been replaced by `operator.installCRDs` -- `teleportVersionOverride` does not set the operator version anymore, you must +- `teleportVersionOverride` does not set the operator version anymore, you must use `operator.teleportVersionOverride` to override the operator version. Note: version overrides are dangerous and not recommended. Each chart version @@ -290,7 +309,7 @@ The chart configures this for you since v12, unless you disabled `rbac` creation ##### Helm cluster chart FIPS mode changes -The teleport-cluster chart no longer uses versionOverride and extraArgs to set FIPS mode. +The teleport-cluster chart no longer uses versionOverride and extraArgs to set FIPS mode. Instead, you should use the following values file configuration: @@ -340,7 +359,7 @@ Teleport 14 brings the following new major features and improvements: - Support for TLS routing in Terraform deployment examples - Discord and ServiceNow hosted plugins - Limited passwordless access for local Windows users in Teleport Community - Edition + Edition - Machine ID: Kubernetes Secret destination In addition, this release includes several changes that affect existing @@ -413,7 +432,7 @@ audit logging support. See documentation on how to configure it in the [Oracle guide](docs/pages/enroll-resources/database-access/enroll-self-hosted-databases/oracle-self-hosted.mdx). -#### Limited passwordless access for local Windows users in Teleport Community Edition +#### Limited passwordless access for local Windows users in Teleport Community Edition In Teleport 14, access to Windows desktops with local Windows users has been extended to Community Edition. Teleport will permit users to register and @@ -3291,7 +3310,7 @@ auth_service: # EXPERIMENTAL *-sync modes: proxy and node send logs directly to S3 or other # storage without storing the records on disk at all. This mode will kill a # connection if network connectivity is lost. - # NOTE: These experimental modes require all Teleport Auth Service instances, + # NOTE: These experimental modes require all Teleport Auth Service instances, # Proxy Service instances, and nodes to be running Teleport 4.4. # # "node-sync" : sessions recording will be streamed from node -> auth -> storage diff --git a/Cargo.lock b/Cargo.lock index ac958e2b348aa..723a180b2cd34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1335,7 +1335,7 @@ dependencies = [ "ironrdp-svc", "picky", "picky-asn1-der", - "picky-asn1-x509", + "picky-asn1-x509 0.13.0", "rand_core", "sspi 0.13.0", "tracing", @@ -1904,9 +1904,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "picky" -version = "7.0.0-rc.9" +version = "7.0.0-rc.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9b488630f493840c2e6ef270c3619a3dc2ad0953eb978d6e4273a8337fee5e" +checksum = "f62f11977ee3ab76e48f7465f035a607e61b7421b154384b71607cb85a26d5dd" dependencies = [ "aes", "aes-gcm", @@ -1925,9 +1925,9 @@ dependencies = [ "p384", "p521", "pbkdf2", - "picky-asn1", + "picky-asn1 0.10.0", "picky-asn1-der", - "picky-asn1-x509", + "picky-asn1-x509 0.14.1", "rand", "rand_core", "rc2", @@ -1952,6 +1952,17 @@ dependencies = [ "serde", "serde_bytes", "time", +] + +[[package]] +name = "picky-asn1" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d061c9f67e256511d8d69b86730a506bed100db520c8812e789cf91d9c6a16cc" +dependencies = [ + "oid", + "serde", + "serde_bytes", "zeroize", ] @@ -1961,7 +1972,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04784987e157b5a8f832ce68b3364915dc6ef4bed94a6e10e241fa1bae3db2e3" dependencies = [ - "picky-asn1", + "picky-asn1 0.9.0", "serde", "serde_bytes", ] @@ -1973,12 +1984,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3384ff768b1c4a04532916be77935f634a4738d3b2138da98798e90352fadf4" dependencies = [ "base64", - "num-bigint-dig", "oid", - "picky-asn1", + "picky-asn1 0.9.0", "picky-asn1-der", "serde", "widestring", +] + +[[package]] +name = "picky-asn1-x509" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f702973074c654cef724d7430e2852acdb8b0e897ed9c4120727446a1bda1464" +dependencies = [ + "base64", + "num-bigint-dig", + "oid", + "picky-asn1 0.10.0", + "picky-asn1-der", + "serde", "zeroize", ] @@ -1997,9 +2021,9 @@ dependencies = [ "num-bigint-dig", "oid", "pbkdf2", - "picky-asn1", + "picky-asn1 0.9.0", "picky-asn1-der", - "picky-asn1-x509", + "picky-asn1-x509 0.13.0", "rand", "serde", "sha1", @@ -2208,7 +2232,7 @@ dependencies = [ "parking_lot", "picky", "picky-asn1-der", - "picky-asn1-x509", + "picky-asn1-x509 0.13.0", "rand", "rand_chacha", "reqwest", @@ -2400,7 +2424,6 @@ dependencies = [ "aws-lc-rs", "log", "once_cell", - "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -2705,9 +2728,9 @@ dependencies = [ "num-traits", "oid", "picky", - "picky-asn1", + "picky-asn1 0.9.0", "picky-asn1-der", - "picky-asn1-x509", + "picky-asn1-x509 0.13.0", "picky-krb", "rand", "rsa", @@ -2749,9 +2772,9 @@ dependencies = [ "num-traits", "oid", "picky", - "picky-asn1", + "picky-asn1 0.9.0", "picky-asn1-der", - "picky-asn1-x509", + "picky-asn1-x509 0.13.0", "picky-krb", "portpicker", "rand", diff --git a/api/accessrequest/access_request.go b/api/accessrequest/access_request.go index 2823aefbdc7d5..1af10ac4400d3 100644 --- a/api/accessrequest/access_request.go +++ b/api/accessrequest/access_request.go @@ -60,7 +60,7 @@ func GetResourceDetails(ctx context.Context, clusterName string, lister client.L // We're interested in hostname or friendly name details. These apply to // nodes, app servers, and user groups. switch resourceID.Kind { - case types.KindNode, types.KindApp, types.KindUserGroup: + case types.KindNode, types.KindApp, types.KindUserGroup, types.KindIdentityCenterAccount: resourceIDs = append(resourceIDs, resourceID) } } diff --git a/api/client/client.go b/api/client/client.go index 297e8bb9ed273..cf277db63b221 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -55,6 +55,7 @@ import ( "github.com/gravitational/teleport/api/client/discoveryconfig" "github.com/gravitational/teleport/api/client/dynamicwindows" "github.com/gravitational/teleport/api/client/externalauditstorage" + gitserverclient "github.com/gravitational/teleport/api/client/gitserver" kubewaitingcontainerclient "github.com/gravitational/teleport/api/client/kubewaitingcontainer" "github.com/gravitational/teleport/api/client/okta" "github.com/gravitational/teleport/api/client/proto" @@ -77,7 +78,7 @@ import ( discoveryconfigv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/discoveryconfig/v1" dynamicwindowsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dynamicwindows/v1" externalauditstoragev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/externalauditstorage/v1" - gitserverv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" + gitserverpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" kubeproto "github.com/gravitational/teleport/api/gen/proto/go/teleport/kube/v1" @@ -3807,6 +3808,8 @@ func (c *Client) ListResources(ctx context.Context, req proto.ListResourcesReque resources[i] = respResource.GetAppServerOrSAMLIdPServiceProvider() case types.KindSAMLIdPServiceProvider: resources[i] = respResource.GetSAMLIdPServiceProvider() + case types.KindIdentityCenterAccount: + resources[i] = respResource.GetAppServer() default: return nil, trace.NotImplemented("resource type %s does not support pagination", req.ResourceType) } @@ -3896,6 +3899,8 @@ func convertEnrichedResource(resource *proto.PaginatedResource) (*types.Enriched return &types.EnrichedResource{ResourceWithLabels: r, Logins: resource.Logins, RequiresRequest: resource.RequiresRequest}, nil } else if r := resource.GetSAMLIdPServiceProvider(); r != nil { return &types.EnrichedResource{ResourceWithLabels: r, RequiresRequest: resource.RequiresRequest}, nil + } else if r := resource.GetGitServer(); r != nil { + return &types.EnrichedResource{ResourceWithLabels: r, RequiresRequest: resource.RequiresRequest}, nil } else { return nil, trace.BadParameter("received unsupported resource %T", resource.Resource) } @@ -4876,8 +4881,8 @@ func (c *Client) UserTasksServiceClient() *usertaskapi.Client { } // GitServerClient returns a client for managing git servers -func (c *Client) GitServerClient() gitserverv1.GitServerServiceClient { - return gitserverv1.NewGitServerServiceClient(c.conn) +func (c *Client) GitServerClient() *gitserverclient.Client { + return gitserverclient.NewClient(gitserverpb.NewGitServerServiceClient(c.conn)) } // GetCertAuthority retrieves a CA by type and domain. @@ -5196,3 +5201,8 @@ func (c *Client) IdentityCenterClient() identitycenterv1.IdentityCenterServiceCl func (c *Client) ProvisioningServiceClient() provisioningv1.ProvisioningServiceClient { return provisioningv1.NewProvisioningServiceClient(c.conn) } + +// IntegrationsClient returns integrations client. +func (c *Client) IntegrationsClient() integrationpb.IntegrationServiceClient { + return c.integrationsClient() +} diff --git a/api/client/credentials_test.go b/api/client/credentials_test.go index ba82451b024d9..51126d6e1b3c0 100644 --- a/api/client/credentials_test.go +++ b/api/client/credentials_test.go @@ -471,6 +471,7 @@ func TestDynamicIdentityFileCreds(t *testing.T) { require.NoError(t, err) wantTLSCert, err := tls.X509KeyPair(tlsCert, keyPEM) require.NoError(t, err) + wantTLSCert.Leaf = nil require.Equal(t, wantTLSCert, *gotTLSCert) expiry, ok := cred.Expiry() @@ -529,6 +530,7 @@ func TestDynamicIdentityFileCreds(t *testing.T) { require.NoError(t, err) wantTLSCert, err = tls.X509KeyPair(secondTLSCertPem, keyPEM) require.NoError(t, err) + wantTLSCert.Leaf = nil require.Equal(t, wantTLSCert, *gotTLSCert) expiry, ok = cred.Expiry() diff --git a/api/client/events.go b/api/client/events.go index 89e5b5ecc3157..44c239b4c960d 100644 --- a/api/client/events.go +++ b/api/client/events.go @@ -343,6 +343,10 @@ func EventToGRPC(in types.Event) (*proto.Event, error) { out.Resource = &proto.Event_AccessListReview{ AccessListReview: accesslistv1conv.ToReviewProto(r), } + case *types.PluginStaticCredentialsV1: + out.Resource = &proto.Event_PluginStaticCredentials{ + PluginStaticCredentials: r, + } default: return nil, trace.BadParameter("resource type %T is not supported", in.Resource) } @@ -609,6 +613,9 @@ func EventFromGRPC(in *proto.Event) (*types.Event, error) { } else if r := in.GetIdentityCenterAccountAssignment(); r != nil { out.Resource = types.Resource153ToLegacy(r) return &out, nil + } else if r := in.GetPluginStaticCredentials(); r != nil { + out.Resource = r + return &out, nil } else { return nil, trace.BadParameter("received unsupported resource %T", in.Resource) } diff --git a/api/client/gitserver/gitserver.go b/api/client/gitserver/gitserver.go new file mode 100644 index 0000000000000..70c69aa73dc75 --- /dev/null +++ b/api/client/gitserver/gitserver.go @@ -0,0 +1,125 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package gitserver + +import ( + "context" + + "github.com/gravitational/trace" + + gitserverv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" + "github.com/gravitational/teleport/api/types" +) + +// Client is an Git servers client. +type Client struct { + grpcClient gitserverv1.GitServerServiceClient +} + +// NewClient creates a new Git servers client. +func NewClient(grpcClient gitserverv1.GitServerServiceClient) *Client { + return &Client{ + grpcClient: grpcClient, + } +} + +// GetGitServer returns Git servers by name. +func (c *Client) GetGitServer(ctx context.Context, name string) (types.Server, error) { + server, err := c.grpcClient.GetGitServer(ctx, &gitserverv1.GetGitServerRequest{Name: name}) + if err != nil { + return nil, trace.Wrap(err) + } + return server, nil +} + +// ListGitServers returns all Git servers matching filter. +func (c *Client) ListGitServers(ctx context.Context, pageSize int, pageToken string) ([]types.Server, string, error) { + resp, err := c.grpcClient.ListGitServers(ctx, &gitserverv1.ListGitServersRequest{ + PageSize: int32(pageSize), + PageToken: pageToken, + }) + if err != nil { + return nil, "", trace.Wrap(err) + } + + servers := make([]types.Server, 0, len(resp.Servers)) + for _, server := range resp.Servers { + servers = append(servers, server) + } + return servers, resp.NextPageToken, nil +} + +func toServerV2(server types.Server) (*types.ServerV2, error) { + serverV2, ok := server.(*types.ServerV2) + if !ok { + return nil, trace.Errorf("encountered unexpected server type: %T", serverV2) + } + return serverV2, nil +} + +// CreateGitServer creates a Git server resource. +func (c *Client) CreateGitServer(ctx context.Context, item types.Server) (types.Server, error) { + serverV2, err := toServerV2(item) + if err != nil { + return nil, trace.Wrap(err) + } + resp, err := c.grpcClient.CreateGitServer(ctx, &gitserverv1.CreateGitServerRequest{ + Server: serverV2, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// UpdateGitServer updates a Git server resource. +func (c *Client) UpdateGitServer(ctx context.Context, item types.Server) (types.Server, error) { + serverV2, err := toServerV2(item) + if err != nil { + return nil, trace.Wrap(err) + } + resp, err := c.grpcClient.UpdateGitServer(ctx, &gitserverv1.UpdateGitServerRequest{ + Server: serverV2, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// UpsertGitServer updates a Git server resource, creating it if it doesn't exist. +func (c *Client) UpsertGitServer(ctx context.Context, item types.Server) (types.Server, error) { + serverV2, err := toServerV2(item) + if err != nil { + return nil, trace.Wrap(err) + } + resp, err := c.grpcClient.UpsertGitServer(ctx, &gitserverv1.UpsertGitServerRequest{ + Server: serverV2, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// DeleteGitServer removes the specified Git server resource. +func (c *Client) DeleteGitServer(ctx context.Context, name string) error { + _, err := c.grpcClient.DeleteGitServer(ctx, &gitserverv1.DeleteGitServerRequest{Name: name}) + return trace.Wrap(err) +} + +// DeleteAllGitServers removes all Git server resources. +func (c *Client) DeleteAllGitServers(ctx context.Context) error { + return trace.NotImplemented("DeleteAllGitServers servers not implemented") +} diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index c58969d68b030..62622d8ffd149 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -1300,7 +1300,13 @@ type RouteToApp struct { // GCPServiceAccount is the GCP service account to assume when accessing GCP API. GCPServiceAccount string `protobuf:"bytes,7,opt,name=GCPServiceAccount,proto3" json:"gcp_service_account,omitempty"` // URI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. - URI string `protobuf:"bytes,8,opt,name=URI,proto3" json:"uri,omitempty"` + // Used merely for audit events and mirrors the URI from the app spec. Not used as a source of + // truth when routing connections. + URI string `protobuf:"bytes,8,opt,name=URI,proto3" json:"uri,omitempty"` + // TargetPort signifies that the cert grants access to a specific port in a multi-port TCP app, as + // long as the port is defined in the app spec. When specified, it must be between 1 and 65535. + // Used only for routing, should not be used in other contexts (e.g., access requests). + TargetPort uint32 `protobuf:"varint,9,opt,name=TargetPort,proto3" json:"target_port,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1388,6 +1394,13 @@ func (m *RouteToApp) GetURI() string { return "" } +func (m *RouteToApp) GetTargetPort() uint32 { + if m != nil { + return m.TargetPort + } + return 0 +} + // GetUserRequest specifies parameters for the GetUser method. type GetUserRequest struct { // Name is the name of the desired user. @@ -10631,6 +10644,7 @@ type PaginatedResource struct { // *PaginatedResource_UserGroup // *PaginatedResource_AppServerOrSAMLIdPServiceProvider // *PaginatedResource_SAMLIdPServiceProvider + // *PaginatedResource_GitServer Resource isPaginatedResource_Resource `protobuf_oneof:"resource"` // Logins allowed for the included resource. Only to be populated for SSH and Desktops. Logins []string `protobuf:"bytes,13,rep,name=Logins,proto3" json:"logins,omitempty"` @@ -10714,6 +10728,9 @@ type PaginatedResource_AppServerOrSAMLIdPServiceProvider struct { type PaginatedResource_SAMLIdPServiceProvider struct { SAMLIdPServiceProvider *types.SAMLIdPServiceProviderV1 `protobuf:"bytes,12,opt,name=SAMLIdPServiceProvider,proto3,oneof" json:"saml_idp_service_provider,omitempty"` } +type PaginatedResource_GitServer struct { + GitServer *types.ServerV2 `protobuf:"bytes,15,opt,name=git_server,json=gitServer,proto3,oneof" json:"git_server,omitempty"` +} func (*PaginatedResource_DatabaseServer) isPaginatedResource_Resource() {} func (*PaginatedResource_AppServer) isPaginatedResource_Resource() {} @@ -10726,6 +10743,7 @@ func (*PaginatedResource_DatabaseService) isPaginatedResource_Resource() func (*PaginatedResource_UserGroup) isPaginatedResource_Resource() {} func (*PaginatedResource_AppServerOrSAMLIdPServiceProvider) isPaginatedResource_Resource() {} func (*PaginatedResource_SAMLIdPServiceProvider) isPaginatedResource_Resource() {} +func (*PaginatedResource_GitServer) isPaginatedResource_Resource() {} func (m *PaginatedResource) GetResource() isPaginatedResource_Resource { if m != nil { @@ -10812,6 +10830,13 @@ func (m *PaginatedResource) GetSAMLIdPServiceProvider() *types.SAMLIdPServicePro return nil } +func (m *PaginatedResource) GetGitServer() *types.ServerV2 { + if x, ok := m.GetResource().(*PaginatedResource_GitServer); ok { + return x.GitServer + } + return nil +} + func (m *PaginatedResource) GetLogins() []string { if m != nil { return m.Logins @@ -10840,6 +10865,7 @@ func (*PaginatedResource) XXX_OneofWrappers() []interface{} { (*PaginatedResource_UserGroup)(nil), (*PaginatedResource_AppServerOrSAMLIdPServiceProvider)(nil), (*PaginatedResource_SAMLIdPServiceProvider)(nil), + (*PaginatedResource_GitServer)(nil), } } @@ -15823,953 +15849,956 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 15134 bytes of a gzipped FileDescriptorProto + // 15177 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x6c, 0x5c, 0x4b, 0x76, 0x18, 0xaa, 0x6e, 0xbe, 0x17, 0x1f, 0x6a, 0x15, 0x49, 0xb1, 0x45, 0x3d, 0x5a, 0xda, 0x3a, - 0x3a, 0xa3, 0xa3, 0x39, 0xa3, 0x07, 0xcf, 0x63, 0xce, 0x6b, 0xce, 0x39, 0xcd, 0x87, 0x48, 0x4a, - 0x7c, 0x9d, 0xdd, 0x24, 0x75, 0x5e, 0x9e, 0x9e, 0xcd, 0xee, 0x12, 0xb9, 0xad, 0xe6, 0xde, 0x3d, - 0x7b, 0xef, 0x96, 0x8e, 0xc6, 0xd7, 0xbe, 0xb0, 0x7d, 0x1f, 0xbe, 0xb8, 0xb8, 0x37, 0x36, 0x90, - 0x18, 0x4e, 0xf2, 0xe1, 0x04, 0x48, 0x80, 0x20, 0x40, 0x00, 0xff, 0x04, 0xfe, 0x89, 0x11, 0xe4, - 0x2b, 0x13, 0x03, 0x41, 0x12, 0xd8, 0xfe, 0x09, 0x10, 0x3a, 0x19, 0xc0, 0x3f, 0x44, 0xf2, 0x61, - 0x04, 0x09, 0x90, 0x01, 0x0c, 0x04, 0xb5, 0xea, 0xb1, 0xab, 0xf6, 0xa3, 0x9b, 0x94, 0x74, 0xc6, - 0xf9, 0x91, 0xd8, 0xab, 0xd6, 0x5a, 0x55, 0xb5, 0xaa, 0x76, 0xd5, 0xaa, 0x55, 0xab, 0xd6, 0x82, - 0xdb, 0x11, 0x6d, 0xd1, 0xb6, 0x1f, 0x44, 0x77, 0x5a, 0x74, 0xdf, 0x69, 0x3c, 0xbf, 0xd3, 0x68, - 0xb9, 0xd4, 0x8b, 0xee, 0xb4, 0x03, 0x3f, 0xf2, 0xef, 0x38, 0x9d, 0xe8, 0x20, 0xa4, 0xc1, 0x53, - 0xb7, 0x41, 0x6f, 0x23, 0x84, 0x0c, 0xe0, 0x7f, 0xb3, 0x53, 0xfb, 0xfe, 0xbe, 0xcf, 0x71, 0xd8, - 0x5f, 0xbc, 0x70, 0xf6, 0xe2, 0xbe, 0xef, 0xef, 0xb7, 0x28, 0x27, 0xde, 0xeb, 0x3c, 0xbe, 0x43, - 0x0f, 0xdb, 0xd1, 0x73, 0x51, 0x58, 0x49, 0x16, 0x46, 0xee, 0x21, 0x0d, 0x23, 0xe7, 0xb0, 0x2d, - 0x10, 0xde, 0x50, 0x4d, 0x71, 0xa2, 0x88, 0x95, 0x44, 0xae, 0xef, 0xdd, 0x79, 0x7a, 0x4f, 0xff, - 0x29, 0x50, 0x6f, 0x76, 0x6d, 0x75, 0x83, 0x06, 0x51, 0x78, 0x22, 0x4c, 0xfa, 0x94, 0x7a, 0x51, - 0xaa, 0x7a, 0x81, 0x19, 0x3d, 0x6f, 0xd3, 0x90, 0xa3, 0xc8, 0xff, 0x04, 0xea, 0xb5, 0x6c, 0x54, - 0xfc, 0x57, 0xa0, 0x7c, 0x2f, 0x1b, 0xe5, 0x19, 0xdd, 0x63, 0x32, 0xf5, 0xd4, 0x1f, 0x3d, 0xd0, - 0x03, 0xa7, 0xdd, 0xa6, 0x41, 0xfc, 0x87, 0x40, 0xbf, 0xa0, 0xd0, 0x0f, 0x1f, 0x3b, 0x4c, 0x44, - 0x87, 0x8f, 0x9d, 0x54, 0x37, 0x3a, 0xa1, 0xb3, 0x4f, 0x45, 0xf3, 0x9f, 0xde, 0xd3, 0x7f, 0x72, - 0x54, 0xeb, 0xf7, 0x0b, 0x30, 0xf0, 0xc8, 0x89, 0x1a, 0x07, 0xe4, 0x13, 0x18, 0x78, 0xe8, 0x7a, - 0xcd, 0xb0, 0x5c, 0xb8, 0xda, 0x77, 0x73, 0x74, 0xae, 0x74, 0x9b, 0x77, 0x05, 0x0b, 0x59, 0xc1, - 0xfc, 0xcc, 0x4f, 0x8f, 0x2a, 0x67, 0x8e, 0x8f, 0x2a, 0x67, 0x9f, 0x30, 0xb4, 0x37, 0xfd, 0x43, - 0x37, 0xc2, 0xb1, 0xb5, 0x39, 0x1d, 0xd9, 0x81, 0xc9, 0x6a, 0xab, 0xe5, 0x3f, 0xdb, 0x72, 0x82, - 0xc8, 0x75, 0x5a, 0xb5, 0x4e, 0xa3, 0x41, 0xc3, 0xb0, 0x5c, 0xbc, 0x5a, 0xb8, 0x39, 0x3c, 0x7f, - 0xfd, 0xf8, 0xa8, 0x52, 0x71, 0x58, 0x71, 0xbd, 0xcd, 0xcb, 0xeb, 0x21, 0x47, 0xd0, 0x18, 0x65, - 0xd1, 0x5b, 0x7f, 0x3c, 0x08, 0xa5, 0x15, 0x3f, 0x8c, 0x16, 0xd8, 0x88, 0xda, 0xf4, 0xc7, 0x1d, - 0x1a, 0x46, 0xe4, 0x3a, 0x0c, 0x32, 0xd8, 0xea, 0x62, 0xb9, 0x70, 0xb5, 0x70, 0x73, 0x64, 0x7e, - 0xf4, 0xf8, 0xa8, 0x32, 0x74, 0xe0, 0x87, 0x51, 0xdd, 0x6d, 0xda, 0xa2, 0x88, 0xbc, 0x01, 0xc3, - 0x1b, 0x7e, 0x93, 0x6e, 0x38, 0x87, 0x14, 0x5b, 0x31, 0x32, 0x3f, 0x7e, 0x7c, 0x54, 0x19, 0xf1, - 0xfc, 0x26, 0xad, 0x7b, 0xce, 0x21, 0xb5, 0x55, 0x31, 0xd9, 0x85, 0x7e, 0xdb, 0x6f, 0xd1, 0x72, - 0x1f, 0xa2, 0xcd, 0x1f, 0x1f, 0x55, 0xfa, 0x03, 0xbf, 0x45, 0x7f, 0x7e, 0x54, 0x79, 0x77, 0xdf, - 0x8d, 0x0e, 0x3a, 0x7b, 0xb7, 0x1b, 0xfe, 0xe1, 0x9d, 0xfd, 0xc0, 0x79, 0xea, 0xf2, 0x49, 0xe8, - 0xb4, 0xee, 0xc4, 0x53, 0xb5, 0xed, 0x8a, 0x71, 0xaf, 0x3d, 0x0f, 0x23, 0x7a, 0xc8, 0x38, 0xd9, - 0xc8, 0x8f, 0x3c, 0x82, 0xa9, 0x6a, 0xb3, 0xe9, 0x72, 0x8a, 0xad, 0xc0, 0xf5, 0x1a, 0x6e, 0xdb, - 0x69, 0x85, 0xe5, 0xfe, 0xab, 0x7d, 0x37, 0x47, 0x84, 0x50, 0x54, 0x79, 0xbd, 0xad, 0x10, 0x34, - 0xa1, 0x64, 0x32, 0x20, 0x6f, 0xc1, 0xf0, 0xe2, 0x46, 0x8d, 0xb5, 0x3d, 0x2c, 0x0f, 0x20, 0xb3, - 0x99, 0xe3, 0xa3, 0xca, 0x64, 0xd3, 0x0b, 0xb1, 0x6b, 0x3a, 0x03, 0x85, 0x48, 0xde, 0x85, 0xb1, - 0xad, 0xce, 0x5e, 0xcb, 0x6d, 0x6c, 0xaf, 0xd5, 0x1e, 0xd2, 0xe7, 0xe5, 0xc1, 0xab, 0x85, 0x9b, - 0x63, 0xf3, 0xe4, 0xf8, 0xa8, 0x32, 0xd1, 0x46, 0x78, 0x3d, 0x6a, 0x85, 0xf5, 0x27, 0xf4, 0xb9, - 0x6d, 0xe0, 0xc5, 0x74, 0xb5, 0xda, 0x0a, 0xa3, 0x1b, 0x4a, 0xd1, 0x85, 0xe1, 0x81, 0x4e, 0xc7, - 0xf1, 0xc8, 0x1d, 0x00, 0x9b, 0x1e, 0xfa, 0x11, 0xad, 0x36, 0x9b, 0x41, 0x79, 0x18, 0x65, 0x7b, - 0xf6, 0xf8, 0xa8, 0x32, 0x1a, 0x20, 0xb4, 0xee, 0x34, 0x9b, 0x81, 0xad, 0xa1, 0x90, 0x05, 0x18, - 0xb6, 0x7d, 0x2e, 0xe0, 0xf2, 0xc8, 0xd5, 0xc2, 0xcd, 0xd1, 0xb9, 0xb3, 0x62, 0x1a, 0x4a, 0xf0, - 0xfc, 0xf9, 0xe3, 0xa3, 0x0a, 0x09, 0xc4, 0x2f, 0xbd, 0x97, 0x12, 0x83, 0x54, 0x60, 0x68, 0xc3, - 0x5f, 0x70, 0x1a, 0x07, 0xb4, 0x0c, 0x38, 0xf7, 0x06, 0x8e, 0x8f, 0x2a, 0x85, 0xef, 0xd9, 0x12, - 0x4a, 0x9e, 0xc2, 0x68, 0x3c, 0x50, 0x61, 0x79, 0x14, 0xc5, 0xb7, 0x7d, 0x7c, 0x54, 0x39, 0x1f, - 0x22, 0xb8, 0xce, 0x86, 0x5e, 0x93, 0xe0, 0x4b, 0xcc, 0x02, 0xbd, 0x22, 0xf2, 0x35, 0x4c, 0xc7, - 0x3f, 0xab, 0x61, 0x48, 0x03, 0xc6, 0x63, 0x75, 0xb1, 0x3c, 0x8e, 0x92, 0x79, 0xfd, 0xf8, 0xa8, - 0x62, 0x69, 0x2d, 0xa8, 0x3b, 0x12, 0xa5, 0xee, 0x36, 0xb5, 0x9e, 0x66, 0x33, 0x79, 0xd0, 0x3f, - 0x3c, 0x56, 0x1a, 0xb7, 0x2f, 0xef, 0x78, 0x61, 0xe4, 0xec, 0xb5, 0x68, 0x26, 0x92, 0xf5, 0x57, - 0x05, 0x20, 0x9b, 0x6d, 0xea, 0xd5, 0x6a, 0x2b, 0xec, 0x7b, 0x92, 0x9f, 0xd3, 0x9b, 0x30, 0xc2, - 0x07, 0x8e, 0x8d, 0x6e, 0x11, 0x47, 0x77, 0xe2, 0xf8, 0xa8, 0x02, 0x62, 0x74, 0xd9, 0xc8, 0xc6, - 0x08, 0xe4, 0x06, 0xf4, 0x6d, 0x6f, 0xaf, 0xe1, 0xb7, 0xd2, 0x37, 0x3f, 0x79, 0x7c, 0x54, 0xe9, - 0x8b, 0xa2, 0xd6, 0xcf, 0x8f, 0x2a, 0xc3, 0x8b, 0x9d, 0x00, 0xc5, 0x62, 0xb3, 0x72, 0x72, 0x03, - 0x86, 0x16, 0x5a, 0x9d, 0x30, 0xa2, 0x41, 0xb9, 0x3f, 0xfe, 0x48, 0x1b, 0x1c, 0x64, 0xcb, 0x32, - 0xf2, 0x5d, 0xe8, 0xdf, 0x09, 0x69, 0x50, 0x1e, 0xc0, 0xf1, 0x1e, 0x17, 0xe3, 0xcd, 0x40, 0xbb, - 0x73, 0xf3, 0xc3, 0xec, 0x4b, 0xec, 0x84, 0x34, 0xb0, 0x11, 0x89, 0xdc, 0x86, 0x01, 0x3e, 0x68, - 0x83, 0xb8, 0x48, 0x8d, 0xab, 0xd9, 0xd1, 0xa2, 0xbb, 0xef, 0xce, 0x8f, 0x1c, 0x1f, 0x55, 0x06, - 0x70, 0xf0, 0x6c, 0x8e, 0xf6, 0xa0, 0x7f, 0xb8, 0x50, 0x2a, 0xda, 0xc3, 0x8c, 0x96, 0x7d, 0x16, - 0xd6, 0x77, 0x61, 0x54, 0xeb, 0x3e, 0xb9, 0x04, 0xfd, 0xec, 0x7f, 0x5c, 0x44, 0xc6, 0x78, 0x65, - 0x6c, 0xe3, 0xb0, 0x11, 0x6a, 0xfd, 0xbd, 0x49, 0x28, 0x31, 0x4a, 0x63, 0xe5, 0xb9, 0xad, 0x8b, - 0x8a, 0xd3, 0x95, 0x4c, 0x51, 0x95, 0x0b, 0xba, 0xb0, 0x6e, 0x82, 0xaa, 0x5d, 0x2c, 0x42, 0x63, - 0xc7, 0x47, 0x95, 0xe1, 0x8e, 0x80, 0xc5, 0x6d, 0x23, 0x35, 0x18, 0x5a, 0xfa, 0xa6, 0xed, 0x06, - 0x34, 0x44, 0xd1, 0x8e, 0xce, 0xcd, 0xde, 0xe6, 0xdb, 0xe5, 0x6d, 0xb9, 0x5d, 0xde, 0xde, 0x96, - 0xdb, 0xe5, 0xfc, 0x65, 0xb1, 0x18, 0x9f, 0xa3, 0x9c, 0x24, 0x9e, 0x1f, 0xbf, 0xfd, 0xe7, 0x95, - 0x82, 0x2d, 0x39, 0x91, 0x37, 0x61, 0xf0, 0xbe, 0x1f, 0x1c, 0x3a, 0x91, 0x18, 0x83, 0xa9, 0xe3, - 0xa3, 0x4a, 0xe9, 0x31, 0x42, 0xb4, 0x29, 0x25, 0x70, 0xc8, 0x7d, 0x98, 0xb0, 0xfd, 0x4e, 0x44, - 0xb7, 0x7d, 0x39, 0x72, 0x03, 0x48, 0x75, 0xe5, 0xf8, 0xa8, 0x32, 0x1b, 0xb0, 0x92, 0x7a, 0xe4, - 0xd7, 0xc5, 0x10, 0x6a, 0xf4, 0x09, 0x2a, 0xb2, 0x04, 0x13, 0x55, 0x5c, 0xbd, 0x85, 0xd4, 0xf8, - 0x78, 0x8d, 0xcc, 0x5f, 0x3e, 0x3e, 0xaa, 0x5c, 0x70, 0xb0, 0xa4, 0x1e, 0x88, 0x22, 0x9d, 0x8d, - 0x49, 0x44, 0x36, 0xe0, 0xdc, 0xc3, 0xce, 0x1e, 0x0d, 0x3c, 0x1a, 0xd1, 0x50, 0xb6, 0x68, 0x08, - 0x5b, 0x74, 0xf5, 0xf8, 0xa8, 0x72, 0xe9, 0x89, 0x2a, 0xcc, 0x68, 0x53, 0x9a, 0x94, 0x50, 0x38, - 0x2b, 0x1a, 0xba, 0xe8, 0x44, 0xce, 0x9e, 0x13, 0x52, 0x5c, 0x94, 0x46, 0xe7, 0xce, 0x73, 0x11, - 0xdf, 0x4e, 0x94, 0xce, 0x5f, 0x17, 0x52, 0xbe, 0xa8, 0xfa, 0xde, 0x14, 0x45, 0x5a, 0x45, 0x49, - 0x9e, 0x6c, 0x6d, 0x56, 0xfb, 0xce, 0x08, 0xb6, 0x16, 0xd7, 0x66, 0xb5, 0xef, 0xe8, 0xab, 0x96, - 0xda, 0x81, 0xd6, 0x60, 0x60, 0x87, 0xed, 0xce, 0xb8, 0x66, 0x4d, 0xcc, 0x5d, 0x13, 0x2d, 0x4a, - 0xce, 0xbf, 0xdb, 0xec, 0x07, 0x22, 0xe2, 0x97, 0x77, 0x16, 0x77, 0x74, 0x7d, 0x2f, 0xc6, 0x32, - 0xf2, 0x19, 0x80, 0x68, 0x55, 0xb5, 0xdd, 0x2e, 0x8f, 0x62, 0x27, 0xcf, 0x99, 0x9d, 0xac, 0xb6, - 0xdb, 0xf3, 0x57, 0x44, 0xff, 0xce, 0xab, 0xfe, 0x39, 0xed, 0xb6, 0xc6, 0x4d, 0x63, 0x42, 0x3e, - 0x81, 0x31, 0x5c, 0xd2, 0xe4, 0x88, 0x8e, 0xe1, 0x88, 0x5e, 0x3c, 0x3e, 0xaa, 0xcc, 0xe0, 0x6a, - 0x95, 0x31, 0x9e, 0x06, 0x01, 0xf9, 0x35, 0x98, 0x16, 0xec, 0x1e, 0xb9, 0x5e, 0xd3, 0x7f, 0x16, - 0x2e, 0xd2, 0xf0, 0x49, 0xe4, 0xb7, 0x71, 0xf9, 0x1b, 0x9d, 0xbb, 0x64, 0x36, 0xcf, 0xc4, 0x99, - 0xbf, 0x25, 0x5a, 0x6a, 0xa9, 0x96, 0x3e, 0xe3, 0x08, 0xf5, 0x26, 0xc7, 0xd0, 0x17, 0xc8, 0x4c, - 0x16, 0x64, 0x15, 0xce, 0xee, 0x84, 0xd4, 0xe8, 0xc3, 0x04, 0xee, 0x0f, 0x15, 0x36, 0xc2, 0x9d, - 0x90, 0xd6, 0xf3, 0xfa, 0x91, 0xa4, 0x23, 0x36, 0x90, 0xc5, 0xc0, 0x6f, 0x27, 0xe6, 0xf8, 0x59, - 0x94, 0x88, 0x75, 0x7c, 0x54, 0xb9, 0xd2, 0x0c, 0xfc, 0x76, 0x3d, 0x7f, 0xa2, 0x67, 0x50, 0x93, - 0x1f, 0xc2, 0xf9, 0x05, 0xdf, 0xf3, 0x68, 0x83, 0xad, 0xa0, 0x8b, 0xae, 0xb3, 0xef, 0xf9, 0x61, - 0xe4, 0x36, 0x56, 0x17, 0xcb, 0xa5, 0x78, 0x7b, 0x68, 0x28, 0x8c, 0x7a, 0x53, 0xa1, 0x98, 0xdb, - 0x43, 0x0e, 0x17, 0xf2, 0x15, 0x8c, 0x8b, 0xba, 0x68, 0x80, 0x53, 0xf3, 0x5c, 0xf7, 0x89, 0xa6, - 0x90, 0xf9, 0x46, 0x1f, 0xc8, 0x9f, 0x5c, 0x75, 0x32, 0x79, 0x91, 0xaf, 0x61, 0x74, 0xfd, 0x7e, - 0xd5, 0xa6, 0x61, 0xdb, 0xf7, 0x42, 0x5a, 0x26, 0x38, 0xa2, 0x57, 0x04, 0xeb, 0xf5, 0xfb, 0xd5, - 0x6a, 0x27, 0x3a, 0xa0, 0x5e, 0xe4, 0x36, 0x9c, 0x88, 0x4a, 0xac, 0xf9, 0x59, 0x36, 0xf3, 0x0e, - 0x1f, 0x3b, 0xf5, 0x40, 0x40, 0xb4, 0x5e, 0xe8, 0xec, 0xc8, 0x2c, 0x0c, 0xd7, 0x6a, 0x2b, 0x6b, - 0xfe, 0xbe, 0xeb, 0x95, 0x27, 0x99, 0x30, 0x6c, 0xf5, 0x9b, 0x3c, 0x86, 0x69, 0xed, 0x6c, 0x50, - 0x67, 0xff, 0xd3, 0x43, 0xea, 0x45, 0xe5, 0x29, 0x6c, 0xc3, 0xf7, 0xd4, 0xe1, 0xe6, 0xb6, 0x7e, - 0x84, 0x78, 0x7a, 0xef, 0x76, 0x35, 0xfe, 0x59, 0x93, 0x44, 0xf3, 0xc5, 0x72, 0xc1, 0x9e, 0x72, - 0x32, 0x4a, 0xc8, 0x36, 0x0c, 0x6d, 0x75, 0x82, 0xb6, 0x1f, 0xd2, 0xf2, 0x34, 0x0a, 0xee, 0x7a, - 0xb7, 0x2f, 0x54, 0xa0, 0xce, 0x4f, 0xb3, 0x25, 0xba, 0xcd, 0x7f, 0x68, 0xbd, 0x93, 0xac, 0xc8, - 0xa7, 0x30, 0x56, 0xab, 0xad, 0xc4, 0x1b, 0xca, 0x79, 0xdc, 0x50, 0x2e, 0x1d, 0x1f, 0x55, 0xca, - 0x4c, 0xa5, 0x8a, 0x37, 0x15, 0xfd, 0xab, 0xd2, 0x29, 0x18, 0x87, 0xed, 0xb5, 0x5a, 0xcc, 0x61, - 0x26, 0xe6, 0xc0, 0x94, 0xb9, 0x6c, 0x0e, 0x3a, 0x05, 0xf9, 0x27, 0x05, 0xb8, 0xaa, 0xb3, 0xcc, - 0x12, 0x4c, 0xf9, 0xc2, 0x8b, 0x48, 0x73, 0xee, 0xf8, 0xa8, 0x72, 0xdb, 0xec, 0x47, 0x3d, 0x73, - 0xb0, 0xb4, 0xb6, 0xf5, 0x6c, 0x0a, 0xb6, 0x57, 0xef, 0x40, 0x66, 0x7b, 0x67, 0x5f, 0xb8, 0xbd, - 0xa6, 0xd4, 0x7a, 0xb7, 0xb7, 0x57, 0x53, 0xac, 0xcf, 0x61, 0x44, 0x2d, 0xda, 0x64, 0x08, 0xfa, - 0xaa, 0xad, 0x56, 0xe9, 0x0c, 0xfb, 0xa3, 0x56, 0x5b, 0x29, 0x15, 0xc8, 0x04, 0x40, 0xbc, 0x53, - 0x95, 0x8a, 0x64, 0x0c, 0x86, 0xe5, 0x4e, 0x52, 0xea, 0x43, 0xfc, 0x76, 0xbb, 0xd4, 0x4f, 0x08, - 0x4c, 0x98, 0xeb, 0x59, 0x69, 0xc0, 0xfa, 0x9d, 0x02, 0x8c, 0xa8, 0xef, 0x90, 0x9c, 0x85, 0xd1, - 0x9d, 0x8d, 0xda, 0xd6, 0xd2, 0xc2, 0xea, 0xfd, 0xd5, 0xa5, 0xc5, 0xd2, 0x19, 0x72, 0x19, 0x2e, - 0x6c, 0xd7, 0x56, 0xea, 0x8b, 0xf3, 0xf5, 0xb5, 0xcd, 0x85, 0xea, 0x5a, 0x7d, 0xcb, 0xde, 0xfc, - 0xfc, 0x8b, 0xfa, 0xf6, 0xce, 0xc6, 0xc6, 0xd2, 0x5a, 0xa9, 0x40, 0xca, 0x30, 0xc5, 0x8a, 0x1f, - 0xee, 0xcc, 0x2f, 0xe9, 0x08, 0xa5, 0x22, 0xb9, 0x06, 0x97, 0xb3, 0x4a, 0xea, 0x2b, 0x4b, 0xd5, - 0xc5, 0xb5, 0xa5, 0x5a, 0xad, 0xd4, 0x47, 0x66, 0x60, 0x92, 0xa1, 0x54, 0xb7, 0xb6, 0x0c, 0xda, - 0x7e, 0xab, 0x05, 0xa3, 0xda, 0x07, 0x40, 0x2e, 0x41, 0x79, 0x61, 0xc9, 0xde, 0xae, 0x6f, 0xed, - 0xd8, 0x5b, 0x9b, 0xb5, 0xa5, 0xba, 0xd9, 0xc2, 0x64, 0xe9, 0xda, 0xe6, 0xf2, 0xea, 0x46, 0x9d, - 0x81, 0x6a, 0xa5, 0x02, 0x6b, 0x86, 0x51, 0x5a, 0x5b, 0xdd, 0x58, 0x5e, 0x5b, 0xaa, 0xef, 0xd4, - 0x96, 0x04, 0x4a, 0xd1, 0xfa, 0x8d, 0x62, 0x6a, 0x4b, 0x27, 0x73, 0x30, 0x5a, 0xe3, 0xf6, 0x0a, - 0x5c, 0xe6, 0xf8, 0x01, 0x91, 0xe9, 0x68, 0x63, 0xc2, 0x8c, 0xc1, 0x57, 0x30, 0x1d, 0x89, 0x69, - 0x69, 0x5b, 0xec, 0x6b, 0x6e, 0xf8, 0x2d, 0x5d, 0x4b, 0x6b, 0x0b, 0x98, 0xad, 0x4a, 0xc9, 0x9c, - 0xa6, 0xcf, 0xf1, 0xd3, 0x22, 0x9e, 0x48, 0xa4, 0x3e, 0xa7, 0xef, 0xed, 0x4a, 0xb3, 0x9b, 0x8b, - 0x87, 0x54, 0xa8, 0x61, 0x48, 0x93, 0xa1, 0x4b, 0x28, 0x3c, 0xf2, 0x86, 0xd4, 0x74, 0xf9, 0xe9, - 0x0e, 0x37, 0xfb, 0xc4, 0xb9, 0x44, 0x28, 0xb9, 0x56, 0x27, 0x67, 0x63, 0x25, 0x1f, 0x26, 0xe7, - 0x8c, 0x10, 0x06, 0x32, 0x4b, 0xec, 0x9f, 0x76, 0x02, 0x95, 0x54, 0x60, 0x80, 0xaf, 0xb8, 0x5c, - 0x1e, 0xa8, 0x5b, 0xb7, 0x18, 0xc0, 0xe6, 0x70, 0xeb, 0x77, 0xfb, 0x74, 0x25, 0x83, 0xe9, 0xd2, - 0x9a, 0xbc, 0x51, 0x97, 0x46, 0x39, 0x23, 0x94, 0x1d, 0x05, 0xf9, 0x57, 0x82, 0x47, 0xc1, 0xbe, - 0xf8, 0x28, 0x28, 0x3e, 0x35, 0x7e, 0x14, 0x8c, 0x51, 0xd8, 0x28, 0x0a, 0xb5, 0x0d, 0xb9, 0xf6, - 0xc7, 0xa3, 0x28, 0x54, 0x3d, 0x31, 0x8a, 0x1a, 0x12, 0xf9, 0x00, 0xa0, 0xfa, 0xa8, 0x86, 0x67, - 0x1e, 0x7b, 0x43, 0xa8, 0xae, 0xb8, 0xc9, 0x38, 0xcf, 0x42, 0x71, 0xa4, 0x0a, 0xf4, 0x33, 0xa3, - 0x86, 0x4d, 0xe6, 0x61, 0xbc, 0xfa, 0x93, 0x4e, 0x40, 0x57, 0x9b, 0x6c, 0x9f, 0x8a, 0xf8, 0xe1, - 0x78, 0x84, 0x2f, 0xa4, 0x0e, 0x2b, 0xa8, 0xbb, 0xa2, 0x44, 0x63, 0x60, 0x92, 0x90, 0x4d, 0x38, - 0xb7, 0xbc, 0xb0, 0x25, 0xe6, 0x55, 0xb5, 0xd1, 0xf0, 0x3b, 0x5e, 0x24, 0xf4, 0xd5, 0x6b, 0xc7, - 0x47, 0x95, 0xcb, 0xfb, 0x8d, 0x76, 0x5d, 0xce, 0x41, 0x87, 0x17, 0xeb, 0x0a, 0x6b, 0x8a, 0x96, - 0x5c, 0x87, 0xbe, 0x1d, 0x7b, 0x55, 0x9c, 0x9c, 0xcf, 0x1d, 0x1f, 0x55, 0xc6, 0x3b, 0x81, 0xab, - 0x91, 0xb0, 0xd2, 0x07, 0xfd, 0xc3, 0xc5, 0x52, 0x9f, 0x3d, 0x52, 0xa3, 0x61, 0xc8, 0x0f, 0x79, - 0x2d, 0x98, 0x58, 0xa6, 0x11, 0x9b, 0x7d, 0xf2, 0xd0, 0xd2, 0x7d, 0x6c, 0x3e, 0x82, 0xd1, 0x47, - 0x6e, 0x74, 0x50, 0xa3, 0x8d, 0x80, 0x46, 0xd2, 0x60, 0x83, 0x72, 0x7b, 0xe6, 0x46, 0x07, 0xf5, - 0x90, 0xc3, 0xf5, 0xcd, 0x59, 0x43, 0xb7, 0x96, 0xe0, 0xac, 0xa8, 0x4d, 0x9d, 0x91, 0xe6, 0x4c, - 0x86, 0x05, 0x64, 0x88, 0x63, 0xa7, 0x33, 0x34, 0xd9, 0xfc, 0xd3, 0x22, 0x4c, 0x2f, 0x1c, 0x38, - 0xde, 0x3e, 0xdd, 0x72, 0xc2, 0xf0, 0x99, 0x1f, 0x34, 0xb5, 0xc6, 0xe3, 0x01, 0x31, 0xd5, 0x78, - 0x3c, 0x11, 0xce, 0xc1, 0xe8, 0x66, 0xab, 0x29, 0x69, 0xc4, 0xe1, 0x15, 0xeb, 0xf2, 0x5b, 0xcd, - 0x7a, 0x5b, 0xf2, 0xd2, 0x91, 0x18, 0xcd, 0x06, 0x7d, 0xa6, 0x68, 0xfa, 0x62, 0x1a, 0x8f, 0x3e, - 0xd3, 0x68, 0x34, 0x24, 0xb2, 0x04, 0xe7, 0x6a, 0xb4, 0xe1, 0x7b, 0xcd, 0xfb, 0x4e, 0x23, 0xf2, - 0x83, 0x6d, 0xff, 0x09, 0xf5, 0xc4, 0xac, 0x44, 0xed, 0x3e, 0xc4, 0xc2, 0xfa, 0x63, 0x2c, 0xad, - 0x47, 0xac, 0xd8, 0x4e, 0x53, 0x90, 0x4d, 0x18, 0x7e, 0x24, 0xcc, 0x7e, 0xe2, 0xc4, 0x7b, 0xe3, - 0xb6, 0xb2, 0x03, 0x2e, 0x04, 0x14, 0xa7, 0x92, 0xd3, 0x52, 0x67, 0x76, 0xa5, 0x2c, 0xe1, 0x7a, - 0x24, 0x31, 0x6d, 0xc5, 0xc4, 0xda, 0x81, 0xf1, 0xad, 0x56, 0x67, 0xdf, 0xf5, 0xd8, 0xca, 0x51, - 0xa3, 0x3f, 0x26, 0x8b, 0x00, 0x31, 0x40, 0x18, 0xf3, 0x26, 0xc5, 0x39, 0x39, 0x2e, 0xd8, 0x7d, - 0x4b, 0x7c, 0x7e, 0x08, 0xc1, 0x63, 0x8d, 0xad, 0xd1, 0x59, 0xff, 0xa3, 0x0f, 0x88, 0x18, 0x00, - 0xdc, 0xc9, 0x6a, 0x34, 0x62, 0x7b, 0xcc, 0x79, 0x28, 0x2a, 0x9b, 0xdb, 0xe0, 0xf1, 0x51, 0xa5, - 0xe8, 0x36, 0xed, 0xe2, 0xea, 0x22, 0x79, 0x1b, 0x06, 0x10, 0x0d, 0xe5, 0x3f, 0xa1, 0xea, 0xd3, - 0x39, 0xf0, 0x15, 0x04, 0xb7, 0x50, 0x9b, 0x23, 0x93, 0x77, 0x60, 0x64, 0x91, 0xb6, 0xe8, 0xbe, - 0x13, 0xf9, 0x72, 0x4d, 0xe0, 0x56, 0x2c, 0x09, 0xd4, 0xe6, 0x5c, 0x8c, 0xc9, 0xce, 0xb4, 0x36, - 0x75, 0x42, 0xdf, 0xd3, 0xcf, 0xb4, 0x01, 0x42, 0xf4, 0x33, 0x2d, 0xc7, 0x21, 0x7f, 0xab, 0x00, - 0xa3, 0x55, 0xcf, 0x13, 0xd6, 0xa1, 0x50, 0x48, 0x7d, 0xfa, 0xb6, 0x32, 0xa7, 0xae, 0x39, 0x7b, - 0xb4, 0xb5, 0xeb, 0xb4, 0x3a, 0x34, 0x9c, 0xff, 0x9a, 0x1d, 0x33, 0xfe, 0xfd, 0x51, 0xe5, 0xc3, - 0x53, 0xd8, 0x7b, 0x62, 0xc3, 0xec, 0x76, 0xe0, 0xb8, 0x51, 0x78, 0x7c, 0x54, 0x99, 0x76, 0xe2, - 0x0a, 0xf5, 0xef, 0x46, 0x6b, 0x47, 0xbc, 0xc0, 0x0f, 0xf6, 0x5a, 0xe0, 0xc9, 0x21, 0x9c, 0xad, - 0x86, 0x61, 0xe7, 0x90, 0xd6, 0x22, 0x27, 0x88, 0xb6, 0xdd, 0x43, 0x8a, 0xab, 0x4a, 0x77, 0x0b, - 0xc1, 0x77, 0x7e, 0x7a, 0x54, 0x29, 0xb0, 0x93, 0x8d, 0x83, 0xa4, 0x4c, 0x79, 0x09, 0xa2, 0x7a, - 0xe4, 0xea, 0x7b, 0x14, 0xda, 0x0a, 0x92, 0xbc, 0xad, 0xeb, 0x4a, 0xab, 0x58, 0x5d, 0xcc, 0x1b, - 0x71, 0x6b, 0x01, 0x2e, 0x2d, 0xd3, 0xc8, 0xa6, 0x21, 0x8d, 0xe4, 0x37, 0x82, 0x33, 0x3c, 0xb6, - 0xd0, 0x0e, 0xe1, 0x6f, 0x45, 0x8c, 0xc3, 0xcf, 0xbf, 0x0b, 0x59, 0x62, 0xfd, 0x1f, 0x05, 0xa8, - 0x2c, 0x04, 0x94, 0x1f, 0x0a, 0x72, 0x18, 0x75, 0x5f, 0xbb, 0x2e, 0x41, 0xff, 0xf6, 0xf3, 0xb6, - 0x34, 0xad, 0x60, 0x29, 0x1b, 0x14, 0x1b, 0xa1, 0x27, 0xb4, 0x54, 0x59, 0x8f, 0x61, 0xda, 0xa6, - 0x1e, 0x7d, 0xe6, 0xec, 0xb5, 0xa8, 0x61, 0xec, 0xa9, 0xc0, 0x00, 0xff, 0xd0, 0x53, 0x5d, 0xe0, - 0xf0, 0xd3, 0x19, 0xce, 0xac, 0x71, 0x18, 0xdd, 0x72, 0xbd, 0x7d, 0xc1, 0xdd, 0xfa, 0x8b, 0x7e, - 0x18, 0xe3, 0xbf, 0xc5, 0x39, 0x27, 0xb1, 0xe7, 0x15, 0x4e, 0xb2, 0xe7, 0xbd, 0x07, 0xe3, 0x6c, - 0xd3, 0xa0, 0xc1, 0x2e, 0x0d, 0xd8, 0xfa, 0x2f, 0x24, 0x81, 0x67, 0xb6, 0x10, 0x0b, 0xea, 0x4f, - 0x79, 0x89, 0x6d, 0x22, 0x92, 0x35, 0x98, 0xe0, 0x80, 0xfb, 0xd4, 0x89, 0x3a, 0xb1, 0xd9, 0xe9, - 0xac, 0x38, 0xd8, 0x48, 0x30, 0x9f, 0x9a, 0x82, 0xd7, 0x63, 0x01, 0xb4, 0x13, 0xb4, 0xe4, 0x13, - 0x38, 0xbb, 0x15, 0xf8, 0xdf, 0x3c, 0xd7, 0x76, 0x79, 0xfe, 0x75, 0xf2, 0x23, 0x10, 0x2b, 0xaa, - 0xeb, 0x7b, 0x7d, 0x12, 0x9b, 0xbc, 0x01, 0xc3, 0xab, 0xe1, 0xbc, 0x1f, 0xb8, 0xde, 0x3e, 0x7e, - 0xa3, 0xc3, 0xdc, 0x5a, 0xef, 0x86, 0xf5, 0x3d, 0x04, 0xda, 0xaa, 0x38, 0x61, 0x57, 0x1e, 0xea, - 0x6d, 0x57, 0xbe, 0x0b, 0xb0, 0xe6, 0x3b, 0xcd, 0x6a, 0xab, 0xb5, 0x50, 0x0d, 0x71, 0x3b, 0x15, - 0xfb, 0x51, 0xcb, 0x77, 0x9a, 0x75, 0xa7, 0xd5, 0xaa, 0x37, 0x9c, 0xd0, 0xd6, 0x70, 0xc8, 0x97, - 0x70, 0x21, 0x74, 0xf7, 0x3d, 0xec, 0x5c, 0xdd, 0x69, 0xed, 0xfb, 0x81, 0x1b, 0x1d, 0x1c, 0xd6, - 0xc3, 0x8e, 0x1b, 0x71, 0xa3, 0xce, 0xc4, 0xdc, 0x15, 0xb1, 0xc8, 0xd5, 0x24, 0x5e, 0x55, 0xa2, - 0xd5, 0x18, 0x96, 0x3d, 0x13, 0x66, 0x17, 0x90, 0x47, 0x30, 0xbe, 0xe6, 0x36, 0xa8, 0x17, 0x52, - 0xb4, 0xd2, 0x3d, 0x47, 0x93, 0x4f, 0xf7, 0x8f, 0x99, 0x09, 0x71, 0xbc, 0xa5, 0x13, 0xe1, 0xa7, - 0x6b, 0xf2, 0x79, 0xd0, 0x3f, 0x3c, 0x58, 0x1a, 0xb2, 0xcf, 0x0a, 0xe0, 0x23, 0x27, 0xf0, 0x5c, - 0x6f, 0x3f, 0xb4, 0xfe, 0x5f, 0x02, 0xc3, 0x6a, 0x9c, 0x6e, 0xeb, 0xc7, 0x0d, 0xb1, 0x35, 0xe3, - 0x94, 0x8d, 0x8d, 0x69, 0xb6, 0x86, 0x41, 0x2e, 0xe0, 0x01, 0x44, 0x28, 0x05, 0x43, 0xec, 0x13, - 0x72, 0xda, 0x6d, 0x9b, 0xc1, 0xd8, 0xd2, 0xb0, 0x38, 0x8f, 0x93, 0x66, 0x98, 0x2f, 0x0d, 0xcd, - 0x3d, 0xbb, 0xb8, 0x38, 0xcf, 0xbe, 0xc9, 0xcd, 0xd5, 0xc5, 0x05, 0x1c, 0xff, 0x61, 0xfe, 0x4d, - 0xfa, 0x6e, 0xb3, 0x61, 0x23, 0x94, 0x95, 0xd6, 0xaa, 0xeb, 0x6b, 0x62, 0x8c, 0xb1, 0x34, 0x74, - 0x0e, 0x5b, 0x36, 0x42, 0x99, 0xca, 0xca, 0xed, 0x22, 0x0b, 0xbe, 0x17, 0x05, 0x7e, 0x2b, 0x44, - 0x3d, 0x6c, 0x98, 0xcf, 0x41, 0x61, 0x50, 0x69, 0x88, 0x22, 0x3b, 0x81, 0x4a, 0x1e, 0xc1, 0x4c, - 0xb5, 0xf9, 0xd4, 0xf1, 0x1a, 0xb4, 0xc9, 0x4b, 0x1e, 0xf9, 0xc1, 0x93, 0xc7, 0x2d, 0xff, 0x59, - 0x88, 0x93, 0x64, 0x58, 0xd8, 0x1f, 0x05, 0x8a, 0xb4, 0xcf, 0x3c, 0x93, 0x48, 0x76, 0x1e, 0x35, - 0x5b, 0x07, 0x16, 0x5a, 0x7e, 0xa7, 0x29, 0xa6, 0x0e, 0xae, 0x03, 0x0d, 0x06, 0xb0, 0x39, 0x9c, - 0x49, 0x69, 0xa5, 0xb6, 0x8e, 0x13, 0x43, 0x48, 0xe9, 0x20, 0x3c, 0xb4, 0x19, 0x8c, 0xdc, 0x80, - 0x21, 0xa9, 0x7d, 0xf3, 0xeb, 0x08, 0x34, 0x83, 0x4b, 0xad, 0x5b, 0x96, 0xb1, 0xef, 0xd8, 0xa6, - 0x0d, 0xff, 0x29, 0x0d, 0x9e, 0x2f, 0xf8, 0x4d, 0x2a, 0x6d, 0x53, 0xc2, 0xf6, 0xc2, 0x0b, 0xea, - 0x0d, 0x56, 0x62, 0x9b, 0x88, 0xac, 0x02, 0xbe, 0x71, 0x87, 0xe5, 0xb3, 0x71, 0x05, 0x7c, 0x63, - 0x0f, 0x6d, 0x59, 0x46, 0x16, 0xe1, 0x5c, 0xb5, 0x13, 0xf9, 0x87, 0x4e, 0xe4, 0x36, 0x76, 0xda, - 0xfb, 0x81, 0xc3, 0x2a, 0x29, 0x21, 0x01, 0x9e, 0x46, 0x1c, 0x59, 0x58, 0xef, 0x88, 0x52, 0x3b, - 0x4d, 0x40, 0xde, 0x85, 0xb1, 0xd5, 0x90, 0xdb, 0x1f, 0x9d, 0x90, 0x36, 0xd1, 0x88, 0x24, 0x5a, - 0xe9, 0x86, 0x75, 0xb4, 0x46, 0xd6, 0xd9, 0xf9, 0xa5, 0x69, 0x1b, 0x78, 0xc4, 0x82, 0xc1, 0x6a, - 0x18, 0xba, 0x61, 0x84, 0xb6, 0xa1, 0xe1, 0x79, 0x38, 0x3e, 0xaa, 0x0c, 0x3a, 0x08, 0xb1, 0x45, - 0x09, 0x79, 0x04, 0xa3, 0x8b, 0x94, 0xa9, 0xbf, 0xdb, 0x41, 0x27, 0x8c, 0xd0, 0xd2, 0x33, 0x3a, - 0x77, 0x41, 0xac, 0x46, 0x5a, 0x89, 0x98, 0xcb, 0x5c, 0x45, 0x6d, 0x22, 0xbc, 0x1e, 0xb1, 0x02, - 0x7d, 0xab, 0xd5, 0xf0, 0x99, 0x6e, 0x2f, 0x68, 0x56, 0xdc, 0x26, 0x5b, 0x5f, 0xa6, 0xb0, 0x0d, - 0xa8, 0xdb, 0x8b, 0x05, 0xad, 0x7e, 0x80, 0x25, 0xba, 0x6e, 0x6f, 0x90, 0x90, 0x46, 0xca, 0xa4, - 0x3d, 0x6d, 0x98, 0x2d, 0xcd, 0x42, 0xd9, 0xc4, 0x53, 0x1a, 0xbc, 0x3f, 0x82, 0xd1, 0x85, 0x4e, - 0x18, 0xf9, 0x87, 0xdb, 0x07, 0xf4, 0x90, 0xa2, 0x35, 0x48, 0x9c, 0x60, 0x1a, 0x08, 0xae, 0x47, - 0x0c, 0xae, 0x77, 0x53, 0x43, 0x27, 0x9f, 0x01, 0x91, 0x47, 0x91, 0x65, 0x36, 0x3f, 0x3c, 0x36, - 0x97, 0xd1, 0x20, 0x34, 0xcc, 0xcf, 0x1f, 0xf2, 0x04, 0x53, 0xdf, 0x57, 0xc5, 0xba, 0x51, 0x32, - 0x4d, 0xcc, 0x1a, 0xc4, 0x9b, 0xb8, 0x1c, 0x38, 0xed, 0x83, 0x72, 0x39, 0x3e, 0x1a, 0x88, 0x4e, - 0xed, 0x33, 0xb8, 0xa1, 0xe2, 0xc4, 0xe8, 0xa4, 0x06, 0xc0, 0x7f, 0xae, 0xb1, 0x81, 0xe7, 0x26, - 0xa4, 0xb2, 0x21, 0x2f, 0x56, 0x20, 0x65, 0x75, 0x01, 0x15, 0x27, 0xce, 0xb6, 0xe5, 0x1a, 0xa3, - 0xa9, 0xb1, 0x21, 0x4f, 0xa0, 0xc4, 0x7f, 0xad, 0xfb, 0x9e, 0x1b, 0xf1, 0xfd, 0x62, 0xd6, 0xb0, - 0x37, 0x26, 0x8b, 0x65, 0x05, 0x68, 0xe7, 0x15, 0x15, 0x1c, 0xaa, 0x52, 0xad, 0x9a, 0x14, 0x63, - 0xb2, 0x05, 0xa3, 0x5b, 0x81, 0xdf, 0xec, 0x34, 0x22, 0xd4, 0x32, 0x2e, 0xe2, 0xc2, 0x4f, 0x44, - 0x3d, 0x5a, 0x09, 0x97, 0x49, 0x9b, 0x03, 0xea, 0x6c, 0x5f, 0xd0, 0x65, 0xa2, 0x21, 0x92, 0x79, - 0x18, 0xdc, 0xf2, 0x5b, 0x6e, 0xe3, 0x79, 0xf9, 0x12, 0x36, 0x7a, 0x4a, 0x32, 0x43, 0xa0, 0x6c, - 0x2a, 0xaa, 0xb4, 0x6d, 0x04, 0xe9, 0x2a, 0x2d, 0x47, 0x22, 0x55, 0x18, 0xff, 0x8c, 0x4d, 0x18, - 0xd7, 0xf7, 0x3c, 0xc7, 0x0d, 0x68, 0xf9, 0x32, 0x8e, 0x0b, 0xda, 0xe2, 0x7f, 0xac, 0x17, 0xe8, - 0xd3, 0xd9, 0xa0, 0x20, 0xab, 0x70, 0x76, 0x35, 0xac, 0x45, 0x81, 0xdb, 0xa6, 0xeb, 0x8e, 0xe7, - 0xec, 0xd3, 0x66, 0xf9, 0x4a, 0x6c, 0x0c, 0x77, 0xc3, 0x7a, 0x88, 0x65, 0xf5, 0x43, 0x5e, 0xa8, - 0x1b, 0xc3, 0x13, 0x74, 0xe4, 0x73, 0x98, 0x5a, 0xfa, 0x26, 0x62, 0x33, 0xa6, 0x55, 0xed, 0x34, - 0xdd, 0xa8, 0x16, 0xf9, 0x81, 0xb3, 0x4f, 0xcb, 0x15, 0xe4, 0xf7, 0xda, 0xf1, 0x51, 0xe5, 0x2a, - 0x15, 0xe5, 0x75, 0x87, 0x21, 0xd4, 0x43, 0x8e, 0xa1, 0x5f, 0x72, 0x67, 0x71, 0x60, 0xd2, 0xaf, - 0x75, 0xda, 0x4c, 0xdb, 0x46, 0xe9, 0x5f, 0x35, 0xa4, 0xaf, 0x95, 0x70, 0xe9, 0x87, 0x1c, 0x90, - 0x92, 0xbe, 0x86, 0x48, 0x6c, 0x20, 0x0f, 0x7c, 0xd7, 0xab, 0x36, 0x22, 0xf7, 0x29, 0x15, 0x27, - 0xe6, 0xb0, 0x7c, 0x0d, 0x5b, 0x8a, 0x86, 0xfb, 0x5f, 0xf6, 0x5d, 0xaf, 0xee, 0x60, 0x71, 0x3d, - 0x14, 0xe5, 0xfa, 0x37, 0x92, 0xa6, 0x26, 0x3f, 0x84, 0xf3, 0xeb, 0xfe, 0x9e, 0xdb, 0xa2, 0x7c, - 0xc9, 0xe1, 0x62, 0x41, 0x23, 0xa4, 0x85, 0x7c, 0xd1, 0x70, 0x7f, 0x88, 0x18, 0x75, 0xb1, 0x5a, - 0x1d, 0x2a, 0x1c, 0xdd, 0x70, 0x9f, 0xcd, 0x85, 0x2c, 0xc1, 0x18, 0x7e, 0x97, 0x2d, 0xfc, 0x19, - 0x96, 0xaf, 0xe3, 0x91, 0xee, 0x5a, 0x42, 0x4b, 0xbb, 0xbd, 0xa4, 0xe1, 0x2c, 0x79, 0x51, 0xf0, - 0xdc, 0x36, 0xc8, 0xc8, 0xc7, 0x30, 0x9b, 0x9c, 0xde, 0x0b, 0xbe, 0xf7, 0xd8, 0xdd, 0xef, 0x04, - 0xb4, 0x59, 0x7e, 0x8d, 0x35, 0xd5, 0xee, 0x82, 0x41, 0xbe, 0x82, 0x69, 0xdc, 0xeb, 0xaa, 0x9e, - 0xef, 0x3d, 0x3f, 0x74, 0x7f, 0x82, 0xfa, 0x33, 0x53, 0x7b, 0x6f, 0xa0, 0xda, 0x7b, 0xe3, 0xf8, - 0xa8, 0x72, 0x0d, 0xf7, 0xc4, 0xba, 0xa3, 0x63, 0x24, 0x4c, 0xcf, 0xd9, 0x3c, 0x66, 0x1f, 0xc1, - 0xb9, 0x54, 0xfb, 0x49, 0x09, 0xfa, 0x9e, 0x88, 0x4b, 0xd6, 0x11, 0x9b, 0xfd, 0x49, 0xde, 0x84, - 0x81, 0xa7, 0xec, 0xa0, 0x86, 0xea, 0x48, 0x7c, 0x6d, 0xa7, 0x91, 0xae, 0x7a, 0x8f, 0x7d, 0x9b, - 0x23, 0x7d, 0x50, 0x7c, 0xaf, 0xf0, 0xa0, 0x7f, 0x78, 0xb4, 0x34, 0xc6, 0xef, 0xc6, 0x1f, 0xf4, - 0x0f, 0x8f, 0x97, 0x26, 0xac, 0x2a, 0x9c, 0x4d, 0xe0, 0x93, 0x32, 0x0c, 0x51, 0x8f, 0x29, 0xff, - 0x4d, 0xae, 0x10, 0xd9, 0xf2, 0x27, 0x99, 0x82, 0x81, 0x96, 0x7b, 0xe8, 0x46, 0x58, 0xe1, 0x80, - 0xcd, 0x7f, 0x58, 0xbf, 0x57, 0x00, 0x92, 0xde, 0x8f, 0xc8, 0x9d, 0x04, 0x1b, 0xae, 0xfa, 0x0a, - 0x90, 0x6e, 0xfd, 0x97, 0xdc, 0x3f, 0x83, 0x49, 0x3e, 0x21, 0xe4, 0xce, 0xa9, 0xd5, 0xc5, 0x57, - 0xec, 0x8c, 0x62, 0xdd, 0x62, 0x24, 0x8a, 0x71, 0x9f, 0x5d, 0xc3, 0xa6, 0x75, 0x60, 0x3a, 0x73, - 0x27, 0x22, 0xeb, 0x30, 0x7d, 0xe8, 0x7b, 0xd1, 0x41, 0xeb, 0xb9, 0xdc, 0x88, 0x44, 0x6d, 0x05, - 0xac, 0x0d, 0x17, 0xdf, 0x4c, 0x04, 0x7b, 0x52, 0x80, 0x05, 0x47, 0xac, 0x47, 0x18, 0x9d, 0x64, - 0x4f, 0x2c, 0x1b, 0xce, 0xa5, 0x16, 0x74, 0xf2, 0x03, 0x18, 0x6b, 0xe0, 0xe1, 0xce, 0xa8, 0x89, - 0x6f, 0x67, 0x1a, 0x5c, 0xff, 0x56, 0x39, 0x9c, 0x77, 0xe5, 0x1f, 0x16, 0x60, 0x26, 0x67, 0x29, - 0x3f, 0xbd, 0xa8, 0xbf, 0x80, 0xf3, 0x87, 0xce, 0x37, 0xf5, 0x00, 0xcf, 0xee, 0xf5, 0xc0, 0xf1, - 0x12, 0xd2, 0xc6, 0x65, 0x2a, 0x1b, 0x43, 0x77, 0x50, 0x3a, 0x74, 0xbe, 0xb1, 0x11, 0xc1, 0x66, - 0xe5, 0xbc, 0x9d, 0x9f, 0xc2, 0xb8, 0xb1, 0x78, 0x9f, 0xba, 0x71, 0xd6, 0x3d, 0x38, 0xb7, 0x48, - 0x5b, 0x34, 0xa2, 0x27, 0xb6, 0xd9, 0x59, 0x5b, 0x00, 0x35, 0x7a, 0xe8, 0xb4, 0x0f, 0x7c, 0xa6, - 0xd4, 0xcf, 0xeb, 0xbf, 0x84, 0xcd, 0x87, 0xc8, 0xe3, 0x89, 0x2c, 0xd8, 0x7d, 0x8b, 0x2b, 0xfa, - 0xa1, 0xc2, 0xb4, 0x35, 0x2a, 0xeb, 0x5f, 0x17, 0x81, 0x88, 0xd5, 0x37, 0xa0, 0xce, 0xa1, 0x6c, - 0xc6, 0xfb, 0x30, 0xc6, 0x4f, 0xe8, 0x1c, 0x8c, 0xcd, 0x19, 0x9d, 0x9b, 0x14, 0x5f, 0x9e, 0x5e, - 0xb4, 0x72, 0xc6, 0x36, 0x50, 0x19, 0xa9, 0x4d, 0xb9, 0x69, 0x01, 0x49, 0x8b, 0x06, 0xa9, 0x5e, - 0xc4, 0x48, 0xf5, 0xdf, 0xe4, 0x13, 0x98, 0x58, 0xf0, 0x0f, 0xdb, 0x4c, 0x26, 0x82, 0xb8, 0x4f, - 0x98, 0x6d, 0x44, 0xbd, 0x46, 0xe1, 0xca, 0x19, 0x3b, 0x81, 0x4e, 0x36, 0x60, 0xf2, 0x7e, 0xab, - 0x13, 0x1e, 0x54, 0xbd, 0xe6, 0x42, 0xcb, 0x0f, 0x25, 0x97, 0x7e, 0x71, 0xd2, 0x12, 0x6b, 0x67, - 0x1a, 0x63, 0xe5, 0x8c, 0x9d, 0x45, 0x48, 0x6e, 0xc0, 0xc0, 0xd2, 0x53, 0xb6, 0xa6, 0x4b, 0x37, - 0x15, 0xe1, 0x45, 0xb7, 0xe9, 0xd1, 0xcd, 0xc7, 0x2b, 0x67, 0x6c, 0x5e, 0x3a, 0x3f, 0x02, 0x43, - 0xf2, 0x74, 0x7f, 0x87, 0xe9, 0xdb, 0x4a, 0x9c, 0xb5, 0xc8, 0x89, 0x3a, 0x21, 0x99, 0x85, 0xe1, - 0x9d, 0x36, 0x3b, 0x74, 0x4a, 0xb3, 0x88, 0xad, 0x7e, 0x5b, 0x6f, 0x9a, 0x92, 0x26, 0x97, 0x20, - 0xb6, 0xe9, 0x0a, 0x64, 0xcd, 0xc8, 0xbb, 0x62, 0x0a, 0xb7, 0x3b, 0xb6, 0x51, 0x6f, 0x31, 0x51, - 0x6f, 0x29, 0x29, 0x6b, 0x6b, 0x3a, 0x53, 0x78, 0xd6, 0xe7, 0x70, 0x65, 0xa7, 0x1d, 0xd2, 0x20, - 0xaa, 0xb6, 0xdb, 0x2d, 0xb7, 0xc1, 0xaf, 0xb9, 0xd0, 0x0a, 0x20, 0x27, 0xcb, 0xbb, 0x30, 0xc8, - 0x01, 0x62, 0x9a, 0xc8, 0x39, 0x58, 0x6d, 0xb7, 0x85, 0xed, 0xe1, 0x2d, 0xae, 0xf9, 0x73, 0x6b, - 0x82, 0x2d, 0xb0, 0xad, 0xdf, 0x2e, 0xc0, 0x15, 0xfe, 0x05, 0xe4, 0xb2, 0xfe, 0x2e, 0x8c, 0xa0, - 0x13, 0x5b, 0xdb, 0x69, 0xc8, 0x6f, 0x82, 0x7b, 0xf3, 0x49, 0xa0, 0x1d, 0x97, 0x6b, 0xee, 0x81, - 0xc5, 0x7c, 0xf7, 0x40, 0xf9, 0x81, 0xf5, 0x65, 0x7e, 0x60, 0x9f, 0x81, 0x25, 0x5a, 0xd4, 0x6a, - 0xa5, 0x1a, 0x15, 0xbe, 0x48, 0xab, 0xac, 0xff, 0x52, 0x84, 0x99, 0x65, 0xea, 0xd1, 0xc0, 0xc1, - 0x7e, 0x1a, 0x56, 0x2e, 0xdd, 0x4d, 0xa8, 0xd0, 0xd5, 0x4d, 0xa8, 0x22, 0xed, 0x86, 0x45, 0xb4, - 0x1b, 0xa6, 0x7c, 0x9e, 0xd8, 0x59, 0x74, 0xc7, 0x5e, 0x15, 0xdd, 0xc2, 0xb3, 0x68, 0x27, 0x70, - 0xf1, 0xaa, 0x80, 0xac, 0xc6, 0x2e, 0x46, 0xfd, 0x3d, 0x6d, 0x0e, 0x93, 0xc2, 0xe5, 0x62, 0x48, - 0xb8, 0x18, 0x99, 0x8e, 0x45, 0x1b, 0x30, 0xc8, 0xcd, 0x9d, 0x78, 0x41, 0x35, 0x3a, 0x77, 0x4b, - 0x7c, 0x53, 0x39, 0x1d, 0x14, 0xb6, 0x51, 0xdc, 0xd8, 0xf9, 0x14, 0x88, 0x10, 0x60, 0x0b, 0x2e, - 0xb3, 0x9f, 0xc1, 0xa8, 0x86, 0x72, 0x92, 0xbd, 0x5f, 0x99, 0x5d, 0x99, 0x3a, 0xea, 0xed, 0x73, - 0x0b, 0xae, 0xb6, 0xf7, 0x5b, 0x1f, 0x42, 0x39, 0xdd, 0x1a, 0x61, 0x6a, 0xeb, 0x65, 0xd9, 0xb3, - 0x16, 0x61, 0x6a, 0x99, 0x46, 0x38, 0x71, 0xf1, 0x23, 0xd2, 0x5c, 0xe5, 0x12, 0xdf, 0x99, 0x5c, - 0x55, 0x11, 0xc8, 0x26, 0x98, 0xf6, 0x95, 0xd6, 0x60, 0x3a, 0xc1, 0x45, 0xd4, 0xff, 0x01, 0x0c, - 0x09, 0x90, 0x5a, 0x51, 0x85, 0xbf, 0x2d, 0xdd, 0x13, 0x05, 0xbb, 0x73, 0x7c, 0xde, 0x0a, 0xce, - 0xb6, 0x24, 0xb0, 0x0e, 0xe0, 0x3c, 0xdb, 0x66, 0x63, 0xae, 0x6a, 0x3a, 0x5e, 0x84, 0x91, 0x36, - 0x53, 0x14, 0x42, 0xf7, 0x27, 0x7c, 0x1a, 0x0d, 0xd8, 0xc3, 0x0c, 0x50, 0x73, 0x7f, 0x42, 0xc9, - 0x65, 0x00, 0x2c, 0xc4, 0x6e, 0x8a, 0x55, 0x00, 0xd1, 0xb9, 0x29, 0x93, 0x00, 0x3a, 0xda, 0xf1, - 0x79, 0x63, 0xe3, 0xdf, 0x56, 0x00, 0x33, 0xa9, 0x9a, 0x44, 0x07, 0xee, 0xc0, 0xb0, 0xd4, 0x8f, - 0x13, 0x97, 0x0c, 0x7a, 0x0f, 0x6c, 0x85, 0x44, 0x5e, 0x87, 0xb3, 0x1e, 0xfd, 0x26, 0xaa, 0xa7, - 0xda, 0x30, 0xce, 0xc0, 0x5b, 0xb2, 0x1d, 0xd6, 0x2f, 0xa1, 0x61, 0xb9, 0xe6, 0xf9, 0xcf, 0x1e, - 0xb7, 0x9c, 0x27, 0x34, 0x55, 0xf1, 0x0f, 0x60, 0xb8, 0xd6, 0xbb, 0x62, 0xfe, 0xf9, 0xc8, 0xca, - 0x6d, 0x45, 0x62, 0xb5, 0x60, 0x96, 0x75, 0xa9, 0x56, 0x5d, 0x5f, 0x5b, 0x6d, 0x6e, 0x7d, 0xdb, - 0x02, 0x7c, 0x0a, 0x17, 0x33, 0x6b, 0xfb, 0xb6, 0x85, 0xf8, 0x47, 0xfd, 0x30, 0xc3, 0x37, 0x93, - 0xf4, 0x0c, 0x3e, 0xf9, 0x52, 0xf3, 0x0b, 0xb9, 0xb4, 0xbd, 0x9b, 0x71, 0x69, 0x8b, 0x24, 0xfa, - 0xa5, 0xad, 0x71, 0x55, 0xfb, 0x5e, 0xf6, 0x55, 0x2d, 0x1a, 0xa1, 0xcc, 0xab, 0xda, 0xe4, 0x05, - 0xed, 0x52, 0xfe, 0x05, 0x2d, 0x5e, 0x3c, 0x65, 0x5c, 0xd0, 0x66, 0x5d, 0xcb, 0x26, 0xbc, 0x9d, - 0x86, 0x5f, 0xad, 0xb7, 0xd3, 0xeb, 0x30, 0x54, 0x6d, 0xb7, 0x35, 0xef, 0x41, 0x1c, 0x1e, 0xa7, - 0xdd, 0xe6, 0xc2, 0x93, 0x85, 0x72, 0x9d, 0x87, 0x8c, 0x75, 0xfe, 0x7d, 0x80, 0x05, 0x7c, 0xe3, - 0x80, 0x03, 0x37, 0x8a, 0x18, 0xa8, 0xe1, 0xf3, 0x97, 0x0f, 0x38, 0x70, 0xba, 0x79, 0x25, 0x46, - 0xe6, 0x8a, 0xbd, 0xb5, 0x0b, 0xe5, 0xf4, 0xf4, 0x79, 0x05, 0x4b, 0xd7, 0x1f, 0x16, 0xe0, 0xb2, - 0x50, 0x72, 0x12, 0x1f, 0xf8, 0xe9, 0x67, 0xe7, 0x3b, 0x30, 0x26, 0x68, 0xb7, 0xe3, 0x0f, 0x81, - 0xdf, 0x92, 0xcb, 0xc5, 0x98, 0xaf, 0xe8, 0x06, 0x1a, 0x79, 0x07, 0x86, 0xf1, 0x8f, 0xf8, 0x62, - 0x88, 0x49, 0x66, 0x04, 0x51, 0xeb, 0xc9, 0xeb, 0x21, 0x85, 0x6a, 0x7d, 0x0d, 0x57, 0xf2, 0x1a, - 0xfe, 0x0a, 0xe4, 0xf2, 0x2f, 0x0a, 0x70, 0x51, 0xb0, 0x37, 0x96, 0x8a, 0x17, 0xda, 0x75, 0x4e, - 0xe1, 0x73, 0xfc, 0x00, 0x46, 0x59, 0x85, 0xb2, 0xdd, 0x7d, 0x62, 0x6b, 0x15, 0x27, 0x87, 0xb8, - 0x64, 0xd1, 0x89, 0x1c, 0xe1, 0x43, 0xe3, 0x1c, 0xb6, 0xa4, 0x65, 0xc4, 0xd6, 0x89, 0xad, 0x2f, - 0xe1, 0x52, 0x76, 0x17, 0x5e, 0x81, 0x7c, 0x1e, 0xc0, 0x6c, 0xc6, 0xa6, 0xf0, 0x62, 0x7b, 0xf2, - 0x17, 0x70, 0x31, 0x93, 0xd7, 0x2b, 0x68, 0xe6, 0x0a, 0xd3, 0x38, 0xa2, 0x57, 0x30, 0x84, 0xd6, - 0x23, 0xb8, 0x90, 0xc1, 0xe9, 0x15, 0x34, 0x71, 0x19, 0x66, 0x94, 0xa6, 0xfd, 0x52, 0x2d, 0x5c, - 0x87, 0xcb, 0x9c, 0xd1, 0xab, 0x19, 0x95, 0x87, 0x70, 0x51, 0xb0, 0x7b, 0x05, 0xd2, 0x5b, 0x81, - 0x4b, 0xf1, 0x81, 0x3a, 0x43, 0x4f, 0x3a, 0xf1, 0x22, 0x63, 0xad, 0xc1, 0xd5, 0x98, 0x53, 0x8e, - 0xd2, 0x70, 0x72, 0x6e, 0x5c, 0x1d, 0x8c, 0x47, 0xe9, 0x95, 0x8c, 0xe8, 0x23, 0x38, 0x6f, 0x30, - 0x7d, 0x65, 0xaa, 0xd2, 0x2a, 0x4c, 0x72, 0xc6, 0xa6, 0xea, 0x3c, 0xa7, 0xab, 0xce, 0xa3, 0x73, - 0xe7, 0x62, 0x96, 0x08, 0xde, 0x7d, 0x2b, 0x43, 0x9b, 0x5e, 0x47, 0x6d, 0x5a, 0xa2, 0xc4, 0x2d, - 0x7c, 0x07, 0x06, 0x39, 0x44, 0xb4, 0x2f, 0x83, 0x19, 0x3f, 0x2c, 0x70, 0x32, 0x81, 0x6c, 0xfd, - 0x10, 0x2e, 0xf3, 0x93, 0x68, 0x7c, 0x51, 0x69, 0x9e, 0x16, 0x7f, 0x90, 0x38, 0x88, 0x5e, 0x10, - 0x7c, 0x93, 0xf8, 0x39, 0xe7, 0xd1, 0x3d, 0x39, 0xb7, 0xf3, 0xf8, 0x9f, 0xe8, 0xfd, 0x99, 0x3c, - 0x60, 0x16, 0x33, 0x0f, 0x98, 0xd7, 0xe1, 0x9a, 0x3a, 0x60, 0x26, 0xab, 0x91, 0x53, 0xcb, 0xfa, - 0x12, 0x2e, 0xf2, 0x8e, 0x4a, 0xbf, 0x40, 0xb3, 0x19, 0x1f, 0x26, 0xba, 0x39, 0x23, 0xba, 0x69, - 0x62, 0xe7, 0x74, 0xf2, 0xff, 0x2b, 0xc8, 0x4f, 0x2e, 0x9b, 0xf9, 0x2f, 0xfa, 0xc4, 0xbd, 0x01, - 0x15, 0x25, 0x10, 0xb3, 0x45, 0x2f, 0x76, 0xdc, 0x5e, 0x87, 0x69, 0x9d, 0x8d, 0xdb, 0xa0, 0xbb, - 0xf7, 0xf0, 0x06, 0xe9, 0x6d, 0xf6, 0x59, 0x20, 0x40, 0x4e, 0xbb, 0x72, 0x86, 0xdc, 0x10, 0xdf, - 0x56, 0x98, 0x56, 0x1d, 0x2e, 0xa5, 0x87, 0xc2, 0x6d, 0xc8, 0x47, 0x01, 0xe4, 0x13, 0xf6, 0x09, - 0x23, 0x44, 0x0c, 0x46, 0x2e, 0x53, 0xf9, 0x1d, 0x73, 0x72, 0x49, 0x65, 0x59, 0x72, 0xa9, 0x49, - 0xf4, 0x9f, 0xd5, 0x2e, 0xe7, 0xc3, 0xaf, 0x02, 0x91, 0x45, 0x0b, 0x35, 0x5b, 0x56, 0x7d, 0x01, - 0xfa, 0x16, 0x6a, 0xb6, 0x78, 0x8d, 0x84, 0x9a, 0x60, 0x23, 0x0c, 0x6c, 0x06, 0x4b, 0x6a, 0xe4, - 0xc5, 0x13, 0x68, 0xe4, 0x0f, 0xfa, 0x87, 0xfb, 0x4a, 0xfd, 0x36, 0xa9, 0xb9, 0xfb, 0xde, 0x23, - 0x37, 0x3a, 0x50, 0x15, 0x56, 0xad, 0xaf, 0x60, 0xd2, 0xa8, 0x5e, 0x7c, 0xc5, 0x5d, 0x9f, 0x51, - 0x31, 0x7d, 0x76, 0xa1, 0x8a, 0x6e, 0x35, 0x68, 0xb2, 0x18, 0xe3, 0xeb, 0x4d, 0xc3, 0xa9, 0xe3, - 0x1b, 0x5d, 0x5b, 0x16, 0x5a, 0xff, 0xa0, 0x5f, 0xe3, 0xae, 0x3d, 0x4e, 0xeb, 0xd2, 0xbb, 0x7b, - 0x00, 0x7c, 0x86, 0x68, 0x9d, 0x63, 0x0a, 0xe0, 0xa8, 0xf0, 0x56, 0xe1, 0x4b, 0xb2, 0xad, 0x21, - 0x9d, 0xf4, 0xf1, 0x9a, 0x70, 0x22, 0xe6, 0x44, 0xf2, 0xbd, 0xa6, 0x72, 0x22, 0x16, 0xac, 0x43, - 0x5b, 0x47, 0x22, 0x3f, 0x4c, 0xbe, 0xb0, 0x18, 0xc0, 0x0b, 0xab, 0xd7, 0xe4, 0x0d, 0x76, 0xba, - 0x6f, 0xa7, 0x7b, 0x64, 0xf1, 0x0c, 0xa6, 0x19, 0xad, 0xfb, 0x18, 0x0f, 0x16, 0x4b, 0xdf, 0x44, - 0xd4, 0xe3, 0x6b, 0xfb, 0x20, 0xd6, 0x73, 0xa3, 0x4b, 0x3d, 0x31, 0xb2, 0xb0, 0xbf, 0xc7, 0x7c, - 0xea, 0x54, 0x95, 0xd9, 0xd9, 0xfc, 0x71, 0x12, 0xd9, 0x6b, 0x4b, 0x5e, 0xb3, 0xed, 0xbb, 0xea, - 0xc0, 0xc4, 0x27, 0x51, 0xd0, 0xaa, 0x53, 0x01, 0xb7, 0x75, 0x24, 0xeb, 0xf5, 0xae, 0xae, 0xe9, - 0xc3, 0xd0, 0xbf, 0xbd, 0xb0, 0xbd, 0x56, 0x2a, 0x58, 0x77, 0x00, 0xb4, 0x9a, 0x00, 0x06, 0x37, - 0x36, 0xed, 0xf5, 0xea, 0x5a, 0xe9, 0x0c, 0x99, 0x86, 0x73, 0x8f, 0x56, 0x37, 0x16, 0x37, 0x1f, - 0xd5, 0xea, 0xb5, 0xf5, 0xaa, 0xbd, 0xbd, 0x50, 0xb5, 0x17, 0x4b, 0x05, 0xeb, 0x6b, 0x98, 0x32, - 0x7b, 0xf8, 0x4a, 0x27, 0x61, 0x04, 0x93, 0x4a, 0x9f, 0x79, 0xf0, 0x68, 0x5b, 0xf3, 0x68, 0x15, - 0x87, 0xbf, 0xa4, 0x67, 0x96, 0x38, 0x26, 0x8a, 0xcf, 0x48, 0x43, 0x22, 0x6f, 0x70, 0xb5, 0x20, - 0xf9, 0xfc, 0x98, 0xa9, 0x05, 0xf5, 0x58, 0x2f, 0xc0, 0xa5, 0xef, 0xfb, 0x30, 0x65, 0xd6, 0x7a, - 0x52, 0x2b, 0xd5, 0x6b, 0xe8, 0xea, 0xab, 0xbd, 0x4d, 0x22, 0x44, 0xbf, 0x36, 0x10, 0x2b, 0xeb, - 0xf7, 0xa1, 0x24, 0xb0, 0xe2, 0x9d, 0xf7, 0xba, 0x34, 0x23, 0x16, 0x32, 0x5e, 0x52, 0x4a, 0xcf, - 0x72, 0x1f, 0x4a, 0x6c, 0xc5, 0x14, 0x94, 0xbc, 0x82, 0x29, 0x18, 0x58, 0x8b, 0xaf, 0x73, 0x6c, - 0xfe, 0x03, 0x9f, 0xe8, 0x44, 0x4e, 0x10, 0x49, 0x3f, 0xb8, 0x11, 0x5b, 0xfd, 0x26, 0x6f, 0xc0, - 0xe0, 0x7d, 0xb7, 0x15, 0x09, 0xd3, 0x48, 0xbc, 0xc9, 0x33, 0xb6, 0xbc, 0xc0, 0x16, 0x08, 0x96, - 0x0d, 0xe7, 0xb4, 0x0a, 0x4f, 0xd1, 0x54, 0x52, 0x86, 0xa1, 0x0d, 0xfa, 0x8d, 0x56, 0xbf, 0xfc, - 0x69, 0xbd, 0x0b, 0xe7, 0x84, 0x8f, 0xa1, 0x26, 0xa6, 0x6b, 0xe2, 0xc1, 0x77, 0xc1, 0x78, 0x75, - 0x2a, 0x58, 0x62, 0x11, 0xa3, 0xdb, 0x69, 0x37, 0x5f, 0x90, 0x8e, 0x6d, 0x14, 0xa7, 0xa4, 0xfb, - 0x8e, 0xbc, 0x05, 0xea, 0x35, 0x9c, 0xff, 0x57, 0x11, 0xca, 0x09, 0x2b, 0xc3, 0xc2, 0x81, 0xd3, - 0x6a, 0x51, 0x6f, 0x9f, 0x92, 0x9b, 0xd0, 0xbf, 0xbd, 0xb9, 0xbd, 0x25, 0xac, 0xa4, 0xd2, 0xbb, - 0x80, 0x81, 0x14, 0x8e, 0x8d, 0x18, 0xe4, 0x21, 0x9c, 0x93, 0x5e, 0xc4, 0xaa, 0x48, 0x8c, 0xd0, - 0xe5, 0xee, 0x3e, 0xc9, 0x69, 0x3a, 0xf2, 0xb6, 0x30, 0x89, 0xfc, 0xb8, 0xe3, 0x06, 0xb4, 0x89, - 0x96, 0x9f, 0xf8, 0xaa, 0x5e, 0x2b, 0xb1, 0x75, 0x34, 0xf2, 0x7d, 0x18, 0xab, 0xd5, 0x36, 0xe3, - 0xda, 0x07, 0x8c, 0x1b, 0x22, 0xbd, 0xc8, 0x36, 0x10, 0xf9, 0xbb, 0x5e, 0xeb, 0x8f, 0x0a, 0x30, - 0x93, 0x63, 0x6e, 0x21, 0x6f, 0x18, 0x72, 0x98, 0xd4, 0xe4, 0x20, 0x51, 0x56, 0xce, 0x08, 0x41, - 0x2c, 0x68, 0x3e, 0xd9, 0x7d, 0xa7, 0xf0, 0xc9, 0x5e, 0x39, 0x13, 0xfb, 0x61, 0x93, 0xd7, 0xa1, - 0xaf, 0x56, 0xdb, 0x14, 0x66, 0x75, 0x12, 0xf7, 0x40, 0x43, 0x66, 0x08, 0xf3, 0x00, 0xc3, 0x12, - 0x64, 0x9d, 0x85, 0x71, 0x63, 0x60, 0x2c, 0x0b, 0xc6, 0xf4, 0x16, 0xb2, 0xd1, 0x5f, 0xf0, 0x9b, - 0x6a, 0xf4, 0xd9, 0xdf, 0xd6, 0xaf, 0x9a, 0x32, 0x23, 0x97, 0x01, 0xe4, 0x7d, 0xad, 0xdb, 0x94, - 0x37, 0x3f, 0x02, 0xb2, 0xda, 0x24, 0xd7, 0x60, 0x2c, 0xa0, 0x4d, 0x37, 0xa0, 0x8d, 0xa8, 0xde, - 0x09, 0xc4, 0xeb, 0x16, 0x7b, 0x54, 0xc2, 0x76, 0x82, 0x16, 0xf9, 0x2e, 0x0c, 0xf2, 0x8b, 0x64, - 0xd1, 0x7b, 0x79, 0x48, 0xa8, 0xd5, 0x36, 0xd7, 0xef, 0x57, 0xf9, 0x45, 0xb7, 0x2d, 0x50, 0xac, - 0x79, 0x18, 0xd5, 0x7a, 0xd5, 0xab, 0xf6, 0x29, 0x18, 0xd0, 0xad, 0x94, 0xfc, 0x87, 0xf5, 0x3b, - 0x05, 0x98, 0xc2, 0x69, 0xb0, 0xef, 0xb2, 0xed, 0x21, 0xee, 0xcb, 0x9c, 0x31, 0x68, 0x97, 0x8c, - 0x41, 0x4b, 0xe0, 0xaa, 0xd1, 0xfb, 0x20, 0x35, 0x7a, 0x97, 0xb2, 0x46, 0x0f, 0x97, 0x00, 0xd7, - 0xf7, 0xf4, 0x41, 0xd3, 0xaf, 0xeb, 0x7e, 0xaf, 0x00, 0x93, 0x5a, 0x9b, 0x54, 0x07, 0xef, 0x19, - 0x4d, 0xba, 0x98, 0xd1, 0xa4, 0xd4, 0x7c, 0x9a, 0x4f, 0xb5, 0xe8, 0xb5, 0x6e, 0x2d, 0xca, 0x9a, - 0x4e, 0xc6, 0x34, 0xf9, 0x8b, 0x02, 0x4c, 0x67, 0xca, 0x80, 0x9c, 0x67, 0xfa, 0x7f, 0x23, 0xa0, - 0x91, 0x90, 0xbc, 0xf8, 0xc5, 0xe0, 0xab, 0x61, 0xd8, 0xa1, 0x81, 0x90, 0xbb, 0xf8, 0x45, 0x5e, - 0x83, 0xf1, 0x2d, 0x1a, 0xb8, 0x7e, 0x93, 0x3f, 0x4c, 0xe0, 0x1e, 0xbf, 0xe3, 0xb6, 0x09, 0x24, - 0x97, 0x60, 0x44, 0x79, 0xac, 0x72, 0x1b, 0xae, 0x1d, 0x03, 0x18, 0xef, 0x45, 0x77, 0x9f, 0x5f, - 0xfc, 0x30, 0x62, 0xf1, 0x8b, 0x2d, 0xc0, 0xd2, 0xa2, 0x3a, 0xc8, 0x17, 0x60, 0x69, 0x2e, 0x3d, - 0x0f, 0x83, 0x9f, 0xd9, 0x38, 0x8f, 0x31, 0x70, 0x84, 0x2d, 0x7e, 0x91, 0x09, 0x74, 0x2d, 0xc7, - 0xc7, 0x2d, 0xe8, 0x52, 0xfe, 0x01, 0x4c, 0x65, 0xc9, 0x35, 0xeb, 0x2b, 0x10, 0xb4, 0x45, 0x45, - 0xfb, 0x25, 0x4c, 0x56, 0x9b, 0xcd, 0x78, 0xba, 0xf2, 0x51, 0xe5, 0xeb, 0x04, 0xb7, 0x69, 0x0a, - 0xb5, 0xb6, 0x7f, 0xd5, 0x73, 0x23, 0x7b, 0x72, 0xe9, 0x1b, 0x37, 0x8c, 0x5c, 0x6f, 0x5f, 0x33, - 0xbc, 0xda, 0xe7, 0x37, 0xe8, 0xb3, 0x8c, 0x29, 0xc0, 0x34, 0x0e, 0x93, 0x37, 0x87, 0x67, 0x30, - 0x9f, 0xd2, 0xd8, 0xc6, 0x4b, 0xd7, 0x8c, 0xc9, 0x37, 0x2e, 0xe8, 0xab, 0x36, 0x9e, 0x58, 0xdf, - 0x87, 0xf3, 0x7c, 0xd9, 0xef, 0xd6, 0x78, 0xd1, 0x6c, 0xdd, 0x4e, 0x6c, 0xbd, 0x27, 0x2d, 0x39, - 0x5d, 0x5b, 0x66, 0x8f, 0x19, 0x6d, 0xc1, 0x2a, 0xff, 0x73, 0x01, 0x66, 0x13, 0xa4, 0xb5, 0xe7, - 0x5e, 0x43, 0xee, 0x39, 0xaf, 0x27, 0x5d, 0xf7, 0x51, 0x57, 0xe2, 0x06, 0x52, 0xb7, 0xa9, 0xbc, - 0xf7, 0xc9, 0x1d, 0x00, 0x4e, 0xac, 0xa9, 0x38, 0x78, 0x3d, 0x20, 0xbc, 0x9c, 0x50, 0xc9, 0xd1, - 0x50, 0x48, 0x07, 0xb2, 0xe4, 0x2e, 0xbe, 0x91, 0x5e, 0xf6, 0x73, 0x0c, 0x96, 0x42, 0x05, 0x79, - 0x3d, 0xc7, 0x90, 0x9e, 0xc5, 0xdf, 0xfa, 0xff, 0xfb, 0x60, 0x46, 0x1f, 0xc0, 0x17, 0xe9, 0xeb, - 0x16, 0x8c, 0x2e, 0xf8, 0x5e, 0x44, 0xbf, 0x89, 0xb4, 0x60, 0x15, 0x44, 0x79, 0x23, 0xa8, 0x12, - 0xa1, 0x5e, 0x73, 0x40, 0x9d, 0xe9, 0x7a, 0x86, 0xb7, 0x66, 0x8c, 0x48, 0x16, 0x60, 0x7c, 0x83, - 0x3e, 0x4b, 0x09, 0x10, 0x3d, 0x46, 0x3d, 0xfa, 0xac, 0xae, 0x09, 0x51, 0x77, 0xe3, 0x33, 0x68, - 0xc8, 0x1e, 0x4c, 0xc8, 0xc9, 0x65, 0x08, 0x73, 0x56, 0xdf, 0x79, 0xcd, 0xe9, 0xcc, 0x83, 0x39, - 0xb0, 0x1a, 0x72, 0x64, 0x98, 0xe0, 0xc8, 0xba, 0xce, 0x6b, 0xe4, 0xf1, 0x09, 0xcc, 0xad, 0x5d, - 0x2b, 0x31, 0xfc, 0x71, 0x93, 0x71, 0x09, 0x74, 0x16, 0xd6, 0x16, 0x94, 0xd3, 0xe3, 0x21, 0x6a, - 0x7b, 0x1b, 0x06, 0x39, 0x54, 0xa8, 0x4a, 0x32, 0x0e, 0x91, 0xc2, 0xe6, 0xb6, 0x8c, 0xa6, 0xd8, - 0x95, 0x38, 0xcc, 0x5a, 0x41, 0xfb, 0x92, 0xc2, 0x51, 0xca, 0xea, 0xdd, 0xe4, 0xf0, 0xa2, 0xab, - 0xb3, 0x1c, 0x5e, 0xdd, 0x17, 0x47, 0x3e, 0x49, 0x59, 0x40, 0x13, 0x9d, 0xce, 0x49, 0x34, 0xec, - 0x16, 0x0c, 0x09, 0x50, 0x22, 0x42, 0x52, 0xfc, 0xf9, 0x49, 0x04, 0xeb, 0x03, 0xb8, 0x80, 0xf6, - 0x42, 0xd7, 0xdb, 0x6f, 0xd1, 0x9d, 0xd0, 0x78, 0x54, 0xd2, 0xeb, 0xb3, 0xfe, 0x08, 0x66, 0xb3, - 0x68, 0x7b, 0x7e, 0xd9, 0x3c, 0x66, 0xc9, 0x9f, 0x15, 0x61, 0x6a, 0x35, 0xd4, 0x15, 0x2e, 0x15, - 0xb7, 0x24, 0x23, 0x96, 0x06, 0xca, 0x64, 0xe5, 0x4c, 0x56, 0xac, 0x8c, 0xb7, 0xb5, 0x37, 0xab, - 0xc5, 0x6e, 0x41, 0x32, 0xd8, 0xb6, 0xa5, 0x5e, 0xad, 0xbe, 0x0e, 0xfd, 0x1b, 0x6c, 0xa9, 0xee, - 0x13, 0x63, 0xc7, 0x29, 0x18, 0x08, 0xdf, 0x8c, 0xb2, 0x2d, 0x92, 0xfd, 0x20, 0xf7, 0x53, 0x2f, - 0x53, 0xfb, 0x7b, 0x07, 0x81, 0x58, 0x39, 0x93, 0x7a, 0xa4, 0xfa, 0x2e, 0x8c, 0x56, 0x9b, 0x87, - 0xdc, 0x25, 0xd3, 0xf7, 0x12, 0x9f, 0xa5, 0x56, 0xb2, 0x72, 0xc6, 0xd6, 0x11, 0xc9, 0x0d, 0xfe, - 0xaa, 0x61, 0x30, 0x27, 0x30, 0x06, 0x53, 0xd6, 0xaa, 0xed, 0xf6, 0xfc, 0x30, 0x0c, 0x6e, 0x3b, - 0xc1, 0x3e, 0x8d, 0xac, 0x2f, 0x61, 0x56, 0x38, 0xf2, 0x70, 0xeb, 0x28, 0xba, 0xfb, 0x84, 0xb1, - 0xaf, 0x56, 0x37, 0xe7, 0x9b, 0x2b, 0x00, 0x78, 0x16, 0x5a, 0xf5, 0x9a, 0xf4, 0x1b, 0xe1, 0x49, - 0xa8, 0x41, 0xac, 0x77, 0x60, 0x44, 0x49, 0x08, 0x15, 0x7e, 0x6d, 0xb3, 0x43, 0x69, 0x4d, 0x19, - 0x4f, 0x71, 0xe5, 0xfb, 0xdb, 0x0b, 0x46, 0xdf, 0x45, 0xa8, 0x1b, 0x7e, 0x42, 0x70, 0x61, 0x3a, - 0x31, 0x09, 0xe2, 0x48, 0x0a, 0x4a, 0x47, 0xe7, 0xae, 0x8e, 0xea, 0x77, 0x52, 0x85, 0x2f, 0x9e, - 0x48, 0x85, 0xb7, 0xfe, 0x71, 0x11, 0x0f, 0x97, 0x29, 0x79, 0x24, 0xec, 0x74, 0xba, 0xad, 0x70, - 0x1e, 0x46, 0xb0, 0xf7, 0x8b, 0xf2, 0xc1, 0x60, 0x77, 0x3f, 0x94, 0xe1, 0x9f, 0x1e, 0x55, 0xce, - 0xa0, 0xf3, 0x49, 0x4c, 0x46, 0x3e, 0x86, 0xa1, 0x25, 0xaf, 0x89, 0x1c, 0xfa, 0x4e, 0xc1, 0x41, - 0x12, 0xb1, 0x31, 0xc1, 0x26, 0x6f, 0xb3, 0x4f, 0x98, 0x9b, 0x77, 0x6c, 0x0d, 0x12, 0x9f, 0x72, - 0x07, 0xf2, 0x4e, 0xb9, 0x83, 0x89, 0x53, 0xae, 0x05, 0x03, 0x9b, 0x41, 0x53, 0x04, 0xa8, 0x99, - 0x98, 0x1b, 0x13, 0x82, 0x43, 0x98, 0xcd, 0x8b, 0xac, 0xff, 0x5a, 0x80, 0x99, 0x65, 0x1a, 0x65, - 0xce, 0x21, 0x43, 0x2a, 0x85, 0x97, 0x96, 0x4a, 0xf1, 0x45, 0xa4, 0xa2, 0x7a, 0xdd, 0x97, 0xd7, - 0xeb, 0xfe, 0xbc, 0x5e, 0x0f, 0xe4, 0xf7, 0x7a, 0x19, 0x06, 0x79, 0x57, 0xd9, 0x49, 0x7e, 0x35, - 0xa2, 0x87, 0xf1, 0x49, 0x5e, 0xf7, 0xa2, 0xb3, 0x79, 0x19, 0x53, 0x24, 0xd7, 0x9c, 0x50, 0x3f, - 0xc9, 0x8b, 0x9f, 0xd6, 0x8f, 0xf0, 0xa9, 0xf1, 0x9a, 0xdf, 0x78, 0xa2, 0x59, 0x84, 0x87, 0xf8, - 0x17, 0x9a, 0xbc, 0x41, 0x60, 0x58, 0xbc, 0xc4, 0x96, 0x18, 0xe4, 0x2a, 0x8c, 0xae, 0x7a, 0xf7, - 0xfd, 0xa0, 0x41, 0x37, 0xbd, 0x16, 0xe7, 0x3e, 0x6c, 0xeb, 0x20, 0x61, 0x29, 0x11, 0x35, 0xc4, - 0xe6, 0x07, 0x04, 0x24, 0xcc, 0x0f, 0x0c, 0xb6, 0x3b, 0x67, 0xf3, 0x32, 0x61, 0x88, 0x61, 0x7f, - 0x77, 0x3b, 0xb9, 0xab, 0x23, 0x7e, 0x2f, 0xc4, 0x3d, 0xb8, 0x60, 0xd3, 0x76, 0xcb, 0x61, 0x3a, - 0xdd, 0xa1, 0xcf, 0xf1, 0x55, 0x9f, 0xaf, 0x66, 0x3c, 0x13, 0x34, 0x7d, 0x2a, 0x54, 0x93, 0x8b, - 0x5d, 0x9a, 0x7c, 0x08, 0xd7, 0x96, 0x69, 0x64, 0x2e, 0xa8, 0xb1, 0xbd, 0x59, 0x74, 0x7e, 0x05, - 0x86, 0x43, 0xd3, 0x56, 0x2e, 0x9f, 0xbd, 0x65, 0x12, 0xee, 0xbe, 0x25, 0x6f, 0x93, 0x04, 0x1f, - 0xf5, 0x97, 0xf5, 0x09, 0x54, 0xf2, 0xaa, 0x3b, 0x99, 0xcb, 0xab, 0x0b, 0x57, 0xf3, 0x19, 0x88, - 0xe6, 0x2e, 0x81, 0xb4, 0xab, 0x8b, 0x4f, 0xa8, 0x57, 0x6b, 0x4d, 0x53, 0xbc, 0xf8, 0xc3, 0x9a, - 0x97, 0xce, 0x7f, 0x2f, 0xd1, 0xdc, 0x3a, 0x5e, 0x59, 0x9b, 0x0c, 0x62, 0xb9, 0x56, 0x61, 0x58, - 0xc2, 0x84, 0x5c, 0x67, 0x32, 0x5b, 0x2a, 0x05, 0xda, 0x94, 0x0c, 0x14, 0x99, 0xf5, 0x23, 0x79, - 0x7d, 0x63, 0x52, 0x9c, 0xec, 0xdd, 0xec, 0x49, 0xee, 0x6b, 0x2c, 0x1f, 0x2e, 0x98, 0xbc, 0x75, - 0xb3, 0x7c, 0x49, 0x33, 0xcb, 0x73, 0x6b, 0xfc, 0x55, 0xd3, 0x4c, 0x2c, 0x2c, 0x0d, 0x1a, 0x88, - 0x5c, 0xd1, 0x8d, 0xef, 0x63, 0xe9, 0x87, 0xb8, 0x77, 0x61, 0x36, 0xab, 0x42, 0xed, 0x1c, 0xa8, - 0x2c, 0xbc, 0x42, 0xdf, 0x59, 0x84, 0x2b, 0x32, 0x44, 0x94, 0xef, 0x47, 0x61, 0x14, 0x38, 0xed, - 0x5a, 0x23, 0x70, 0xdb, 0x31, 0x95, 0x05, 0x83, 0x1c, 0x22, 0x24, 0xc1, 0xaf, 0xc2, 0x38, 0x8e, - 0x28, 0xb1, 0x7e, 0xbd, 0x00, 0x96, 0xe1, 0xa7, 0x85, 0xe3, 0xbc, 0x15, 0xf8, 0x4f, 0xdd, 0xa6, - 0x76, 0xfd, 0xf4, 0x86, 0x61, 0xfa, 0xe4, 0x6f, 0x12, 0x93, 0x2e, 0xe2, 0x62, 0xcd, 0xbc, 0x9b, - 0x30, 0x47, 0x72, 0xc5, 0x13, 0x7d, 0xb7, 0xcc, 0x07, 0x11, 0xca, 0x4c, 0xf9, 0xdf, 0x0b, 0x70, - 0xbd, 0x6b, 0x1b, 0x44, 0x7f, 0xf6, 0xa0, 0x94, 0x2c, 0x13, 0x33, 0xa8, 0xa2, 0xf9, 0x6d, 0xa4, - 0x39, 0xec, 0xde, 0xe3, 0x7e, 0xe8, 0xd2, 0xbf, 0xa9, 0xad, 0x38, 0xa7, 0xf8, 0x9d, 0xbe, 0xf5, - 0xe4, 0x7d, 0x80, 0x6d, 0x3f, 0x72, 0x5a, 0x0b, 0x68, 0x00, 0xe8, 0x8b, 0xdf, 0x14, 0x44, 0x0c, - 0x5a, 0x4f, 0xc6, 0xba, 0xd0, 0x90, 0xad, 0x4f, 0xf1, 0xbb, 0xce, 0x6e, 0xf4, 0xc9, 0x3e, 0xb5, - 0x05, 0xb8, 0x9e, 0xf0, 0x1d, 0x78, 0x01, 0x26, 0x11, 0x4c, 0x33, 0xf1, 0x33, 0xdd, 0x7b, 0x39, - 0xf0, 0x3b, 0xed, 0x5f, 0xcc, 0xa8, 0xff, 0x71, 0x81, 0x3b, 0x73, 0xea, 0xd5, 0x8a, 0x81, 0x5e, - 0x00, 0x88, 0xa1, 0x09, 0xa7, 0x7e, 0x55, 0xb0, 0x7b, 0x8f, 0x1f, 0xb9, 0xf1, 0x56, 0x61, 0x9f, - 0x33, 0xd0, 0xc8, 0x7e, 0xb1, 0x23, 0xf9, 0x16, 0x3a, 0x0c, 0xa8, 0xda, 0x4f, 0x26, 0xf7, 0x77, - 0xa5, 0xfd, 0xe3, 0x94, 0x74, 0x07, 0x30, 0xc5, 0x56, 0x80, 0x6a, 0x27, 0x3a, 0xf0, 0x03, 0x37, - 0x92, 0xcf, 0x53, 0xc8, 0x96, 0x88, 0x08, 0xc0, 0xa9, 0x3e, 0xfa, 0xf9, 0x51, 0xe5, 0xbd, 0xd3, - 0x04, 0xef, 0x94, 0x3c, 0xb7, 0x55, 0x14, 0x01, 0x6b, 0x06, 0xfa, 0x16, 0xec, 0x35, 0x5c, 0xf0, - 0xec, 0x35, 0xb5, 0xe0, 0xd9, 0x6b, 0xd6, 0x5f, 0x16, 0xa1, 0xc2, 0x63, 0x96, 0xa0, 0x9f, 0x49, - 0x6c, 0xb5, 0xd0, 0x1c, 0x57, 0x4e, 0x6a, 0x60, 0x48, 0xc4, 0x24, 0x29, 0x9e, 0x24, 0x26, 0xc9, - 0xaf, 0x40, 0x8e, 0xc9, 0xea, 0x04, 0x56, 0x80, 0xef, 0x1c, 0x1f, 0x55, 0xae, 0xc7, 0x56, 0x00, - 0x5e, 0x9a, 0x65, 0x0e, 0xc8, 0xa9, 0x22, 0x6d, 0xbf, 0xe8, 0x7f, 0x01, 0xfb, 0xc5, 0x5d, 0x18, - 0xc2, 0xc3, 0xcc, 0xea, 0x96, 0xf0, 0xfc, 0xc4, 0xe9, 0x89, 0x61, 0x86, 0xea, 0xae, 0x1e, 0xd3, - 0x4f, 0xa2, 0x59, 0xbf, 0x5b, 0x84, 0xab, 0xf9, 0x32, 0x17, 0x6d, 0x5b, 0x04, 0x88, 0x3d, 0x5c, - 0xba, 0x79, 0xd4, 0xe0, 0xb7, 0xf3, 0x8c, 0xee, 0x29, 0x8f, 0x36, 0x8d, 0x8e, 0xe9, 0x3e, 0xf2, - 0xa5, 0x75, 0xe2, 0x3a, 0xc5, 0x78, 0x80, 0x2d, 0x42, 0xd2, 0x0a, 0x90, 0x11, 0x92, 0x56, 0xc0, - 0xc8, 0x1e, 0xcc, 0x6c, 0x05, 0xee, 0x53, 0x27, 0xa2, 0x0f, 0xe9, 0x73, 0xfe, 0x58, 0x68, 0x49, - 0xbc, 0x10, 0xe2, 0xcf, 0xe7, 0x6f, 0x1e, 0x1f, 0x55, 0x5e, 0x6b, 0x73, 0x14, 0x0c, 0x3b, 0xc6, - 0xdf, 0x7e, 0xd6, 0xd3, 0x8f, 0x86, 0xf2, 0x18, 0x59, 0xff, 0xaa, 0x00, 0x17, 0x51, 0x2d, 0x17, - 0x66, 0x57, 0x59, 0xf9, 0x0b, 0x39, 0x56, 0xea, 0x1d, 0x14, 0x73, 0x11, 0x1d, 0x2b, 0x8d, 0x97, - 0xe8, 0xb6, 0x81, 0x46, 0x56, 0x61, 0x54, 0xfc, 0xc6, 0xef, 0xaf, 0x0f, 0x0f, 0x04, 0xd3, 0xda, - 0x82, 0x85, 0x53, 0x9d, 0x9b, 0x8a, 0x70, 0x62, 0x0b, 0x66, 0xf8, 0x60, 0xd3, 0xd6, 0x69, 0xad, - 0x9f, 0x15, 0xe1, 0xd2, 0x2e, 0x0d, 0xdc, 0xc7, 0xcf, 0x73, 0x3a, 0xb3, 0x09, 0x53, 0x12, 0xc4, - 0xe3, 0x96, 0x18, 0x9f, 0x18, 0x0f, 0x4a, 0x29, 0x9b, 0x2a, 0x02, 0x9f, 0xc8, 0x2f, 0x2e, 0x93, - 0xf0, 0x14, 0x2e, 0x93, 0x6f, 0xc3, 0x70, 0x22, 0x72, 0x10, 0x8e, 0xbf, 0xfc, 0x42, 0xe3, 0xa1, - 0x5a, 0x39, 0x63, 0x2b, 0x4c, 0xf2, 0x9b, 0xf9, 0x57, 0x55, 0xc2, 0xf4, 0xd1, 0xcb, 0xfe, 0x89, - 0x1f, 0x2c, 0xfb, 0x58, 0x1d, 0xad, 0x34, 0xe3, 0x83, 0x5d, 0x39, 0x63, 0xe7, 0xd5, 0x34, 0x3f, - 0x0a, 0x23, 0x55, 0xbc, 0xb7, 0x63, 0x27, 0xf7, 0xff, 0x56, 0x84, 0x2b, 0xf2, 0xe1, 0x4f, 0x8e, - 0x98, 0x3f, 0x87, 0x19, 0x09, 0xaa, 0xb6, 0x99, 0xc2, 0x40, 0x9b, 0xa6, 0xa4, 0x79, 0x60, 0x58, - 0x29, 0x69, 0x47, 0xe0, 0xc4, 0xc2, 0xce, 0x23, 0x7f, 0x35, 0xd6, 0xcf, 0x8f, 0xb3, 0xe2, 0x38, - 0xa1, 0x15, 0x52, 0x5f, 0x33, 0x0d, 0xd1, 0x18, 0xeb, 0x67, 0x33, 0x65, 0x3d, 0xed, 0x7f, 0x59, - 0xeb, 0xe9, 0xca, 0x99, 0xa4, 0xfd, 0x74, 0x7e, 0x02, 0xc6, 0x36, 0xe8, 0xb3, 0x58, 0xee, 0xff, - 0x67, 0x21, 0x11, 0xea, 0x81, 0x69, 0x18, 0x3c, 0xe6, 0x43, 0x21, 0x0e, 0x05, 0x84, 0xa1, 0x1e, - 0x74, 0x0d, 0x83, 0xa3, 0xae, 0xc2, 0x10, 0xbf, 0xcc, 0x6e, 0x9e, 0xe0, 0x84, 0xaf, 0x5e, 0xf0, - 0xf0, 0x67, 0x95, 0x4d, 0x7e, 0xd8, 0x17, 0xf4, 0xd6, 0x43, 0xb8, 0x26, 0x7c, 0xbc, 0xcd, 0xc1, - 0xc7, 0x8a, 0x4e, 0xb9, 0x7d, 0x59, 0x0e, 0x5c, 0x59, 0xa6, 0xc9, 0xa5, 0xc7, 0x78, 0xe1, 0xf4, - 0x09, 0x9c, 0x35, 0xe0, 0x8a, 0x23, 0x6a, 0xa5, 0x6a, 0x0e, 0x29, 0xd6, 0x49, 0x6c, 0xeb, 0x6a, - 0x56, 0x15, 0x7a, 0x63, 0x2d, 0x8a, 0x11, 0x5e, 0x83, 0xf8, 0x8a, 0x2d, 0x3c, 0xc5, 0xaa, 0x77, - 0x53, 0xfb, 0xae, 0xf9, 0x8a, 0xc7, 0x43, 0x00, 0xca, 0x9d, 0x57, 0x95, 0x5a, 0xe3, 0xc6, 0x5d, - 0x80, 0x35, 0x01, 0x63, 0xb2, 0xa8, 0x45, 0xc3, 0xd0, 0xfa, 0x0f, 0x03, 0x60, 0x09, 0xc1, 0x66, - 0xdd, 0xd0, 0x4b, 0x79, 0xec, 0xa5, 0x1a, 0x2b, 0x36, 0xaa, 0xf3, 0x7a, 0x60, 0xd1, 0xb8, 0x94, - 0xcf, 0x3c, 0xd4, 0xf3, 0x1a, 0x31, 0xd4, 0x98, 0x79, 0xa9, 0xde, 0x7f, 0x95, 0xb3, 0x4c, 0xf2, - 0x8f, 0x0d, 0x9f, 0x6c, 0xe7, 0x2c, 0x93, 0x06, 0xdf, 0xec, 0x25, 0xd3, 0x36, 0xaf, 0x44, 0xfa, - 0x5e, 0xe4, 0x4a, 0x84, 0x7d, 0x91, 0xfa, 0xa5, 0xc8, 0x8e, 0x29, 0x4b, 0xf1, 0x3d, 0xca, 0xdb, - 0x7b, 0xbd, 0x48, 0x44, 0x5c, 0xd0, 0x20, 0x06, 0x57, 0x83, 0x0d, 0x71, 0xa1, 0xa4, 0xd9, 0x2c, - 0x17, 0x0e, 0x68, 0xe3, 0x89, 0xb0, 0x15, 0xcb, 0x0b, 0xdd, 0x2c, 0x9b, 0x39, 0x0f, 0x32, 0xcd, - 0xbf, 0x73, 0x5e, 0x50, 0x6f, 0x30, 0x52, 0x3d, 0x62, 0x44, 0x92, 0x2d, 0xf9, 0x09, 0x4c, 0xaa, - 0xa1, 0x4e, 0xb8, 0x68, 0x8d, 0xce, 0xbd, 0x16, 0xc7, 0x23, 0x3d, 0x7c, 0xec, 0xdc, 0x7e, 0x7a, - 0xef, 0x76, 0x06, 0x2e, 0x0f, 0x44, 0xd0, 0x90, 0x05, 0x9a, 0x7f, 0x96, 0x7e, 0xd1, 0x95, 0x41, - 0x48, 0xbe, 0x80, 0xa9, 0x5a, 0x6d, 0x93, 0x3f, 0xe6, 0xb0, 0xe5, 0x05, 0xbf, 0xbd, 0x26, 0x1c, - 0xb6, 0x70, 0xb8, 0xc3, 0xd0, 0xaf, 0x8b, 0x47, 0x20, 0xba, 0x5b, 0x80, 0x1e, 0x8a, 0x21, 0x8b, - 0x85, 0x7e, 0x53, 0xfe, 0x37, 0xd5, 0x5b, 0x05, 0xa6, 0x8a, 0xb8, 0x2d, 0x2a, 0x1e, 0x1d, 0xc9, - 0x89, 0x9d, 0x73, 0xcb, 0x57, 0xf8, 0x96, 0x6f, 0xf9, 0xfe, 0xa0, 0x28, 0x5f, 0x68, 0xa4, 0x2f, - 0x5a, 0x4f, 0x7d, 0xd9, 0x97, 0xd9, 0x83, 0x13, 0xed, 0xd3, 0x99, 0x8d, 0x23, 0xf3, 0xf2, 0xaa, - 0x54, 0x05, 0x2b, 0x9b, 0x50, 0xd7, 0x0e, 0x71, 0x81, 0x71, 0x7b, 0x8a, 0x5a, 0x91, 0x46, 0x95, - 0xbc, 0x87, 0xeb, 0x7b, 0xf9, 0x7b, 0xb8, 0x7f, 0x36, 0x02, 0xe7, 0xb6, 0x9c, 0x7d, 0xd7, 0x63, - 0xfb, 0x81, 0x4d, 0x43, 0xbf, 0x13, 0x34, 0x28, 0xa9, 0xc2, 0x84, 0xe9, 0x7e, 0xdb, 0xc3, 0xb9, - 0x98, 0x6d, 0x79, 0x26, 0x8c, 0xcc, 0xc1, 0x88, 0x7a, 0xf2, 0x2b, 0xf6, 0xa9, 0x8c, 0xa7, 0xc0, - 0x2b, 0x67, 0xec, 0x18, 0x8d, 0xbc, 0x6f, 0x5c, 0x1d, 0x9d, 0x55, 0xaf, 0xd7, 0x11, 0x77, 0x8e, - 0xfb, 0x47, 0x7a, 0x7e, 0xd3, 0xdc, 0x6b, 0xf9, 0xfd, 0xc8, 0x8f, 0x52, 0xb7, 0x49, 0x03, 0x46, - 0x8b, 0x53, 0x26, 0x35, 0x54, 0x33, 0x72, 0x03, 0x88, 0x67, 0xdc, 0x33, 0x7d, 0x09, 0xa3, 0x0f, - 0x3b, 0x7b, 0x54, 0xde, 0x9b, 0x0d, 0x8a, 0xad, 0x37, 0xe9, 0x54, 0x2e, 0xca, 0x77, 0xdf, 0xe2, - 0x63, 0xf0, 0xa4, 0xb3, 0x47, 0xd3, 0x91, 0xe9, 0xd9, 0x9a, 0xa7, 0x31, 0x23, 0x07, 0x50, 0x4a, - 0xfa, 0x7f, 0x8b, 0xf0, 0x7e, 0x5d, 0xbc, 0xd6, 0x31, 0x4c, 0x8b, 0x16, 0xff, 0x9e, 0x7b, 0xa5, - 0x1a, 0x95, 0xa4, 0xb8, 0x92, 0x5f, 0x85, 0xe9, 0x4c, 0x83, 0xa6, 0x7a, 0xc1, 0xd6, 0xdd, 0x56, - 0x8a, 0x0b, 0x48, 0x42, 0x6a, 0xf2, 0xb9, 0x9c, 0x51, 0x73, 0x76, 0x2d, 0xa4, 0x09, 0x67, 0x13, - 0x7e, 0xcd, 0x22, 0xc9, 0x47, 0xbe, 0xa7, 0x34, 0xee, 0x79, 0x32, 0x4e, 0x6e, 0x66, 0x5d, 0x49, - 0x96, 0x64, 0x0d, 0x46, 0x94, 0x25, 0x41, 0x44, 0x56, 0xcb, 0xb2, 0x9a, 0x94, 0x8f, 0x8f, 0x2a, - 0x53, 0xb1, 0xd5, 0xc4, 0xe0, 0x19, 0x33, 0x20, 0xbf, 0x06, 0xd7, 0xd4, 0x14, 0xdd, 0x0c, 0xb2, - 0xed, 0x4b, 0x22, 0xbe, 0xfe, 0xad, 0xe4, 0x0c, 0xcf, 0xc3, 0xdf, 0xbd, 0x37, 0x5f, 0x2c, 0x17, - 0x56, 0xce, 0xd8, 0xbd, 0x59, 0x93, 0xdf, 0x28, 0xc0, 0xf9, 0x9c, 0x5a, 0xc7, 0xb0, 0xd6, 0x9e, - 0x46, 0x3f, 0x3c, 0x37, 0xe0, 0xab, 0x2d, 0xb7, 0x19, 0xbf, 0x6e, 0x94, 0xd6, 0x3f, 0xa3, 0xdf, - 0x39, 0x35, 0x91, 0x37, 0x61, 0x10, 0x8f, 0xdf, 0x61, 0x79, 0x1c, 0x15, 0x54, 0x8c, 0x4e, 0x84, - 0x87, 0x74, 0x7d, 0x4b, 0x12, 0x38, 0x64, 0x85, 0x29, 0x7a, 0xb8, 0x25, 0x4a, 0xc5, 0x4c, 0xc4, - 0x32, 0x13, 0x87, 0x05, 0x5e, 0x24, 0x83, 0x8c, 0x18, 0x89, 0x14, 0x4c, 0xb2, 0x79, 0x80, 0xe1, - 0x40, 0xac, 0x4a, 0x0f, 0xfa, 0x87, 0xfb, 0x4b, 0x03, 0xfc, 0xc3, 0x91, 0x0e, 0xf3, 0xbf, 0x35, - 0xcc, 0x5f, 0xd7, 0xee, 0x78, 0xee, 0x63, 0x37, 0x5e, 0xc0, 0x74, 0xc3, 0x5d, 0x9c, 0xd1, 0x48, - 0xa8, 0xd5, 0x39, 0xb9, 0x8b, 0x94, 0x8d, 0xaf, 0xd8, 0xd3, 0xc6, 0xf7, 0x96, 0x76, 0x1b, 0xa6, - 0xc5, 0x2c, 0xe5, 0xea, 0x93, 0x69, 0x53, 0x8b, 0xaf, 0xc9, 0xbe, 0x86, 0x41, 0x0c, 0x33, 0xca, - 0xaf, 0x1a, 0x47, 0xe7, 0x6e, 0x8b, 0x65, 0xbb, 0x4b, 0xf3, 0x79, 0x5c, 0x52, 0xf1, 0x62, 0x9e, - 0x4b, 0x1c, 0x01, 0x86, 0xc4, 0x11, 0x42, 0xb6, 0x61, 0x72, 0x8b, 0xed, 0xe6, 0xdc, 0x6d, 0xbb, - 0x1d, 0x08, 0xbb, 0x07, 0xb7, 0xa8, 0xa0, 0x36, 0xd1, 0x96, 0xc5, 0x75, 0xaa, 0xca, 0xf5, 0x0d, - 0x35, 0x83, 0x9c, 0x2c, 0xc1, 0x44, 0x8d, 0x3a, 0x41, 0xe3, 0xe0, 0x21, 0x7d, 0xce, 0x34, 0x29, - 0x23, 0x89, 0x47, 0x88, 0x25, 0xac, 0xbf, 0x58, 0xa4, 0xbb, 0x8f, 0x98, 0x44, 0xe4, 0x53, 0x18, - 0xac, 0xf9, 0x41, 0x34, 0xff, 0x5c, 0x2c, 0x6a, 0xf2, 0x32, 0x8a, 0x03, 0xe7, 0x2f, 0xc8, 0x44, - 0x26, 0xa1, 0x1f, 0x44, 0xf5, 0x3d, 0x23, 0xdc, 0x15, 0x47, 0x21, 0xcf, 0x61, 0xca, 0x5c, 0x50, - 0x84, 0x37, 0xf1, 0xb0, 0xd0, 0xe0, 0xb2, 0x56, 0x2d, 0x8e, 0x32, 0x7f, 0x53, 0x70, 0xbf, 0x9a, - 0x5c, 0xb6, 0x1e, 0x63, 0xb9, 0xae, 0xf6, 0x64, 0xd1, 0x93, 0x75, 0xcc, 0x00, 0xc3, 0x7b, 0x54, - 0x0d, 0xb9, 0x17, 0xf2, 0x48, 0x1c, 0x50, 0xad, 0x83, 0x8b, 0x12, 0x4a, 0xc2, 0x09, 0x93, 0x69, - 0x83, 0xec, 0x14, 0x29, 0xd9, 0x82, 0x73, 0x3b, 0x21, 0xdd, 0x0a, 0xe8, 0x53, 0x97, 0x3e, 0x93, - 0xfc, 0x20, 0x8e, 0x3e, 0xc5, 0xf8, 0xb5, 0x79, 0x69, 0x16, 0xc3, 0x34, 0x31, 0x79, 0x1f, 0x60, - 0xcb, 0xf5, 0x3c, 0xda, 0xc4, 0x1b, 0xcd, 0x51, 0x64, 0x85, 0xd6, 0xda, 0x36, 0x42, 0xeb, 0xbe, - 0xd7, 0xd2, 0x45, 0xaa, 0x21, 0x93, 0x79, 0x18, 0x5f, 0xf5, 0x1a, 0xad, 0x8e, 0xf0, 0x3c, 0x08, - 0x71, 0x41, 0x11, 0x51, 0xf1, 0x5c, 0x5e, 0x50, 0x4f, 0x7d, 0xe4, 0x26, 0x09, 0x79, 0x08, 0x44, - 0x00, 0xc4, 0xac, 0x75, 0xf6, 0x5a, 0x54, 0x7c, 0xee, 0x68, 0x85, 0x91, 0x8c, 0x70, 0xba, 0x1b, - 0xc1, 0xe6, 0x52, 0x64, 0xb3, 0xef, 0xc3, 0xa8, 0x36, 0xe7, 0x33, 0x42, 0x40, 0x4c, 0xe9, 0x21, - 0x20, 0x46, 0xf4, 0x50, 0x0f, 0x7f, 0xbf, 0x00, 0x97, 0xb2, 0xbf, 0x25, 0xa1, 0x80, 0x6d, 0xc2, - 0x88, 0x02, 0xaa, 0x47, 0x3f, 0xf2, 0x54, 0x91, 0xd0, 0x80, 0xf8, 0x07, 0x2d, 0x57, 0x1e, 0xbd, - 0xf7, 0x31, 0x8f, 0x17, 0x30, 0xf5, 0xff, 0xdf, 0xc3, 0x30, 0x85, 0xce, 0xed, 0xc9, 0x75, 0xea, - 0x13, 0x0c, 0xe5, 0x82, 0x30, 0xcd, 0x72, 0x2d, 0x8c, 0x58, 0x1c, 0x9e, 0x0c, 0x6a, 0x66, 0x10, - 0x90, 0x77, 0x74, 0x77, 0x8b, 0xa2, 0x96, 0x71, 0x46, 0x02, 0xf5, 0x2e, 0xc4, 0x7e, 0x18, 0x6f, - 0x18, 0xb7, 0xfd, 0x27, 0x5e, 0xf4, 0xfa, 0x4f, 0xba, 0xe8, 0xed, 0xa8, 0x45, 0x8f, 0x87, 0x08, - 0xf9, 0x8e, 0xb6, 0xe8, 0xbd, 0xfa, 0xd5, 0x6e, 0xf0, 0x55, 0xaf, 0x76, 0x43, 0x2f, 0xb7, 0xda, - 0x0d, 0xbf, 0xe0, 0x6a, 0x77, 0x1f, 0x26, 0x36, 0x28, 0x6d, 0x6a, 0x77, 0x30, 0x23, 0xf1, 0xee, - 0xe9, 0x51, 0xb4, 0xae, 0x65, 0x5d, 0xc4, 0x24, 0xa8, 0x72, 0x57, 0x4d, 0xf8, 0xeb, 0x59, 0x35, - 0x47, 0x5f, 0xf1, 0xaa, 0x39, 0xf6, 0x32, 0xab, 0x66, 0x6a, 0xe9, 0x1b, 0x3f, 0xf5, 0xd2, 0xf7, - 0x32, 0xab, 0xd5, 0xc7, 0xe8, 0xad, 0x58, 0xab, 0xad, 0x08, 0xc7, 0x14, 0xcd, 0x13, 0x64, 0xc5, - 0x0f, 0xa5, 0x33, 0x37, 0xfe, 0xcd, 0x60, 0x5b, 0x7e, 0x20, 0x6f, 0xd3, 0xf1, 0x6f, 0x6b, 0x1e, - 0x7d, 0x14, 0x75, 0x7a, 0xf5, 0xe8, 0x61, 0x48, 0xbc, 0x98, 0x14, 0x6b, 0x5c, 0xf2, 0x18, 0x65, - 0xcb, 0x72, 0xeb, 0xcf, 0x0a, 0xfc, 0xbe, 0xf3, 0x7f, 0xc5, 0xa5, 0xf2, 0x65, 0xee, 0x20, 0x7f, - 0x33, 0x8e, 0xa4, 0x20, 0xa2, 0x3e, 0x04, 0x4e, 0xe3, 0x49, 0x7c, 0x09, 0xfc, 0x43, 0xf6, 0x9d, - 0xeb, 0x05, 0x18, 0x34, 0x37, 0x3e, 0x2b, 0x9a, 0x85, 0xbb, 0xf7, 0xe4, 0x02, 0x20, 0x02, 0x4a, - 0x70, 0xb0, 0xb9, 0x00, 0xe8, 0x04, 0xe8, 0x86, 0x77, 0xd6, 0xb2, 0x79, 0x20, 0x80, 0xcc, 0x16, - 0xbc, 0x9b, 0x7e, 0xca, 0x8e, 0x87, 0x91, 0xf8, 0x29, 0xbb, 0x2e, 0xc6, 0xf8, 0x51, 0xfb, 0x0e, - 0x5c, 0xb4, 0xe9, 0xa1, 0xff, 0x94, 0xbe, 0x5a, 0xb6, 0x5f, 0xc1, 0x05, 0x93, 0x21, 0x7f, 0xf4, - 0xc4, 0x23, 0xf4, 0x7f, 0x9c, 0x1d, 0xd7, 0x5f, 0x10, 0xf0, 0xb8, 0xfe, 0x3c, 0x3c, 0x38, 0xfb, - 0x53, 0xdf, 0x37, 0xb0, 0xcc, 0xf2, 0xe1, 0x92, 0xc9, 0xbc, 0xda, 0x6c, 0x62, 0x7e, 0xcf, 0x86, - 0xdb, 0x76, 0xbc, 0x88, 0x6c, 0xc2, 0xa8, 0xf6, 0x33, 0x61, 0x2a, 0xd0, 0x4a, 0x84, 0x4e, 0x13, - 0x03, 0x8c, 0xf0, 0xaa, 0x31, 0xd8, 0xa2, 0x50, 0x49, 0x8a, 0x87, 0x89, 0x4c, 0xaf, 0x73, 0x1e, - 0xc6, 0xb5, 0x9f, 0xca, 0x1a, 0x8a, 0x1f, 0xbf, 0x56, 0x83, 0x29, 0x30, 0x93, 0xc4, 0x6a, 0xc0, - 0x6c, 0x96, 0xd0, 0x78, 0x1c, 0x6e, 0xb2, 0x14, 0x87, 0xd9, 0xea, 0xed, 0xc8, 0x77, 0x36, 0x2f, - 0xc4, 0x96, 0xf5, 0x37, 0xfa, 0xe1, 0xa2, 0x18, 0x8c, 0x57, 0x39, 0xe2, 0xe4, 0x47, 0x30, 0xaa, - 0x8d, 0xb1, 0x10, 0xfa, 0x55, 0xf9, 0x64, 0x29, 0x6f, 0x2e, 0x70, 0x93, 0x46, 0x07, 0x01, 0xf5, - 0xc4, 0x70, 0xaf, 0x9c, 0xb1, 0x75, 0x96, 0xa4, 0x05, 0x13, 0xe6, 0x40, 0x0b, 0xab, 0xce, 0xf5, - 0xcc, 0x4a, 0x4c, 0x54, 0x19, 0xa4, 0xbb, 0x59, 0xcf, 0x1c, 0xee, 0x95, 0x33, 0x76, 0x82, 0x37, - 0xf9, 0x06, 0xce, 0xa5, 0x46, 0x59, 0x18, 0xeb, 0x5e, 0xcf, 0xac, 0x30, 0x85, 0xcd, 0x2d, 0xbd, - 0x01, 0x82, 0x73, 0xab, 0x4d, 0x57, 0x42, 0x9a, 0x30, 0xa6, 0x0f, 0xbc, 0x30, 0x3b, 0x5d, 0xeb, - 0x22, 0x4a, 0x8e, 0xc8, 0x95, 0x3b, 0x21, 0x4b, 0x1c, 0xfb, 0xe7, 0xa6, 0xf5, 0xda, 0x40, 0x1e, - 0x86, 0x41, 0xfe, 0xdb, 0xfa, 0x83, 0x02, 0x5c, 0xdc, 0x0a, 0x68, 0x48, 0xbd, 0x06, 0x35, 0x9c, - 0xbf, 0x5f, 0x72, 0x46, 0xe4, 0x19, 0x8e, 0x8b, 0x2f, 0x6d, 0x38, 0xb6, 0xfe, 0x65, 0x01, 0xca, - 0x59, 0x4d, 0xae, 0x51, 0xaf, 0x49, 0xb6, 0xa0, 0x94, 0xec, 0x83, 0xf8, 0x62, 0x2c, 0x15, 0x63, - 0x39, 0xb7, 0xb7, 0x2b, 0x67, 0xec, 0x14, 0x35, 0xd9, 0x80, 0x73, 0x1a, 0x4c, 0x18, 0x6e, 0x8b, - 0x27, 0x31, 0xdc, 0xb2, 0x11, 0x4e, 0x91, 0xea, 0x76, 0xef, 0x15, 0xdc, 0x75, 0x17, 0xfd, 0x43, - 0xc7, 0xf5, 0x98, 0x12, 0xad, 0x45, 0xf1, 0x82, 0x18, 0x2a, 0xc4, 0xce, 0x2d, 0xb9, 0x08, 0x95, - 0xef, 0x60, 0x14, 0x8a, 0xf5, 0x11, 0xee, 0x0e, 0xc2, 0xfe, 0xc7, 0x5f, 0x1e, 0x2b, 0x66, 0x57, - 0x61, 0x60, 0x7b, 0xad, 0xb6, 0x50, 0x15, 0xef, 0x98, 0x79, 0xf4, 0x8b, 0x56, 0x58, 0x6f, 0x38, - 0x36, 0x2f, 0xb0, 0x3e, 0x04, 0xb2, 0x4c, 0x23, 0x11, 0xe4, 0x5f, 0xd1, 0xdd, 0x80, 0x21, 0x01, - 0x12, 0x94, 0xe8, 0xd1, 0x27, 0x52, 0x06, 0xd8, 0xb2, 0xcc, 0xda, 0x92, 0x67, 0x90, 0x16, 0x75, - 0x42, 0x6d, 0xd3, 0x7f, 0x0f, 0x86, 0x03, 0x01, 0x13, 0x7b, 0xfe, 0x84, 0xca, 0xe1, 0x82, 0x60, - 0x6e, 0x2b, 0x97, 0x38, 0xb6, 0xfa, 0xcb, 0x5a, 0xc3, 0x48, 0x35, 0x9b, 0xab, 0x8b, 0x0b, 0x4c, - 0xaa, 0x42, 0x58, 0x72, 0x38, 0xee, 0xa0, 0xeb, 0x7b, 0x44, 0xf5, 0x57, 0xcc, 0x28, 0x1a, 0x5c, - 0x40, 0x44, 0x7c, 0x26, 0x0d, 0xc5, 0x7a, 0x4b, 0xc5, 0xbd, 0xc9, 0xe0, 0x96, 0x97, 0x8b, 0x64, - 0x03, 0x23, 0xfa, 0x2c, 0xa3, 0x97, 0xcf, 0xab, 0x68, 0x84, 0x03, 0xb3, 0x5c, 0x85, 0x60, 0xbd, - 0x12, 0xe9, 0x14, 0x7d, 0xb5, 0xec, 0x2e, 0xc0, 0x88, 0x82, 0xa9, 0x2b, 0x3b, 0x2e, 0x2b, 0x03, - 0x7f, 0xf7, 0x2d, 0xfe, 0xe0, 0xbb, 0xa1, 0x18, 0xc4, 0x74, 0xac, 0x0a, 0xfe, 0x4d, 0x7f, 0xcb, - 0x55, 0x84, 0x34, 0x88, 0xbe, 0xd5, 0x2a, 0xe2, 0x90, 0x4f, 0xa7, 0xa9, 0xc2, 0xc0, 0xdf, 0x9d, - 0x3b, 0x89, 0xa0, 0xbe, 0xe5, 0x2a, 0x98, 0xa0, 0xbe, 0xbd, 0x2a, 0xa8, 0x8c, 0x8d, 0xc5, 0x27, - 0x69, 0xaa, 0x92, 0xa5, 0x74, 0x25, 0xd2, 0x28, 0x9e, 0xa0, 0xe8, 0x3a, 0x1e, 0x14, 0x2e, 0x71, - 0x61, 0xfd, 0x02, 0xaa, 0x61, 0x02, 0xfb, 0x76, 0xab, 0xf9, 0xdb, 0x05, 0x1e, 0xa9, 0xab, 0xb6, - 0xa9, 0x25, 0x32, 0xf5, 0x1e, 0xfb, 0x9a, 0x47, 0x81, 0xf6, 0xb5, 0x3f, 0x74, 0xbd, 0xa6, 0xee, - 0x51, 0xe0, 0x74, 0xa2, 0x03, 0x15, 0xc9, 0xfa, 0x89, 0xeb, 0x35, 0xed, 0x24, 0x36, 0x79, 0x1f, - 0xc6, 0x35, 0x90, 0xd2, 0x04, 0x79, 0xae, 0x11, 0x9d, 0xdc, 0x6d, 0xda, 0x26, 0xa6, 0xf5, 0x57, - 0x05, 0x98, 0xcc, 0x48, 0xb1, 0x8d, 0x86, 0x12, 0x3c, 0x61, 0xa9, 0x85, 0x4a, 0x64, 0x07, 0xc3, - 0xa0, 0x21, 0xc6, 0xfe, 0xab, 0x10, 0x31, 0xcb, 0x82, 0x96, 0x0e, 0xbc, 0xa8, 0x25, 0xae, 0xcb, - 0x4e, 0x01, 0xae, 0xa3, 0x93, 0x10, 0x20, 0x6e, 0x89, 0x30, 0x49, 0xd7, 0x98, 0xba, 0xac, 0xe5, - 0x12, 0x7f, 0x25, 0xc9, 0xcc, 0xb5, 0x6a, 0xac, 0xdf, 0x2c, 0xc2, 0xf9, 0x8c, 0xfe, 0xd7, 0x68, - 0xf4, 0xd7, 0x21, 0x82, 0x44, 0x46, 0xf7, 0xbe, 0x5f, 0x50, 0x46, 0x77, 0xeb, 0xdf, 0x15, 0xe1, - 0xfc, 0x4e, 0x3b, 0xc4, 0x87, 0x61, 0xab, 0xde, 0x53, 0xea, 0x45, 0x7e, 0xf0, 0x1c, 0x1f, 0xb3, - 0x90, 0x77, 0x60, 0x60, 0x85, 0xb6, 0x5a, 0xbe, 0x98, 0xff, 0x97, 0xa5, 0x53, 0x47, 0x12, 0x1b, - 0x91, 0x56, 0xce, 0xd8, 0x1c, 0x9b, 0xbc, 0x0f, 0x23, 0x2b, 0xd4, 0x09, 0xa2, 0x3d, 0xea, 0xc8, - 0xe3, 0x90, 0xcc, 0x80, 0xa2, 0x91, 0x08, 0x84, 0x95, 0x33, 0x76, 0x8c, 0x4d, 0xe6, 0xa0, 0x7f, - 0xcb, 0xf7, 0xf6, 0xd5, 0x23, 0xf8, 0x9c, 0x0a, 0x19, 0xce, 0xca, 0x19, 0x1b, 0x71, 0xc9, 0x3a, - 0x8c, 0x57, 0xf7, 0xa9, 0x17, 0xad, 0xd3, 0xc8, 0x69, 0x3a, 0x91, 0x23, 0xd4, 0xe6, 0x1b, 0x79, - 0xc4, 0x06, 0xf2, 0xca, 0x19, 0xdb, 0xa4, 0x26, 0x1f, 0xc2, 0xd0, 0xb2, 0xef, 0x37, 0xf7, 0x9e, - 0xcb, 0x50, 0x0e, 0x95, 0x3c, 0x46, 0x02, 0x6d, 0xe5, 0x8c, 0x2d, 0x29, 0xe6, 0x07, 0xa0, 0x6f, - 0x3d, 0xdc, 0xb7, 0x8e, 0x0a, 0x50, 0x5e, 0xf4, 0x9f, 0x79, 0x99, 0x52, 0xfd, 0xbe, 0x29, 0x55, - 0xc9, 0x3e, 0x03, 0x3f, 0x21, 0xd7, 0xb7, 0xa1, 0x7f, 0xcb, 0xf5, 0xf6, 0x13, 0xaa, 0x60, 0x06, - 0x1d, 0xc3, 0x42, 0xf1, 0xb8, 0xde, 0x3e, 0x59, 0x93, 0xfa, 0xbd, 0xb0, 0x63, 0xf6, 0x19, 0x87, - 0x8a, 0x0c, 0x6a, 0x1d, 0x3b, 0xd6, 0xe3, 0xf9, 0x6f, 0xd9, 0xc1, 0x37, 0x60, 0x26, 0xa7, 0x5e, - 0xf1, 0xaa, 0x9d, 0xf5, 0xad, 0x1f, 0x15, 0x9b, 0xff, 0xa7, 0x00, 0xd3, 0x99, 0x03, 0x98, 0xc4, - 0x64, 0x67, 0x3a, 0x3e, 0x31, 0x17, 0x5a, 0x7e, 0xe3, 0xc9, 0x09, 0x7c, 0xc3, 0x2c, 0x99, 0xfa, - 0x5b, 0x7c, 0x21, 0x0d, 0x46, 0x97, 0xc8, 0x0c, 0xa7, 0xb3, 0xb4, 0xfe, 0x51, 0xd6, 0x5c, 0xe7, - 0xc2, 0x2d, 0xc3, 0x90, 0xcc, 0x3e, 0xc6, 0x4d, 0x57, 0xf2, 0x27, 0x3e, 0x1d, 0x93, 0x6b, 0x81, - 0x0c, 0x0b, 0x23, 0x3f, 0xf9, 0x5d, 0x2d, 0x0c, 0x17, 0xff, 0x62, 0x3f, 0x78, 0x89, 0xef, 0x52, - 0xf1, 0x62, 0x75, 0xae, 0xf8, 0x61, 0xe4, 0x29, 0x9f, 0x64, 0x5b, 0xfd, 0x26, 0xb7, 0xa0, 0x24, - 0x33, 0x8d, 0x88, 0x94, 0x46, 0x22, 0xc5, 0xbd, 0x9d, 0x82, 0x93, 0xf7, 0x60, 0x26, 0x09, 0x93, - 0xbd, 0xe4, 0x6f, 0xff, 0xf2, 0x8a, 0xad, 0x3f, 0x2d, 0x62, 0xa4, 0xf4, 0x2e, 0x9f, 0x0e, 0x1b, - 0xbf, 0xcd, 0x9a, 0x90, 0x56, 0x71, 0xb3, 0x46, 0x2e, 0xc1, 0xc8, 0x66, 0xcd, 0x48, 0xe1, 0x66, - 0xc7, 0x00, 0xd6, 0x6c, 0xd6, 0x85, 0x6a, 0xd0, 0x38, 0x70, 0x23, 0xda, 0x88, 0x3a, 0x81, 0x58, - 0xe8, 0xed, 0x14, 0x9c, 0x58, 0x30, 0xb6, 0xdc, 0x72, 0xf7, 0x1a, 0x92, 0x19, 0x17, 0x81, 0x01, - 0x23, 0xaf, 0xc3, 0xc4, 0xaa, 0x17, 0x46, 0x4e, 0xab, 0xb5, 0x4e, 0xa3, 0x03, 0xbf, 0x29, 0xb2, - 0xcc, 0xda, 0x09, 0x28, 0xab, 0x77, 0xc1, 0xf7, 0x22, 0xc7, 0xf5, 0x68, 0x60, 0x77, 0xbc, 0xc8, - 0x3d, 0xa4, 0xa2, 0xef, 0x29, 0x38, 0x79, 0x1b, 0xa6, 0x15, 0x6c, 0x33, 0x68, 0x1c, 0xd0, 0x30, - 0x0a, 0x30, 0xb1, 0x23, 0x7a, 0x1f, 0xd9, 0xd9, 0x85, 0x58, 0x43, 0xcb, 0xef, 0x34, 0x97, 0xbc, - 0xa7, 0x6e, 0xe0, 0x7b, 0x98, 0x36, 0x65, 0x58, 0xd4, 0x90, 0x80, 0x5b, 0xbf, 0x3f, 0x9c, 0xb9, - 0x32, 0xbc, 0xcc, 0x1c, 0xfc, 0x02, 0xc6, 0x16, 0x9c, 0xb6, 0xb3, 0xe7, 0xb6, 0xdc, 0xc8, 0x55, - 0x19, 0xf0, 0xde, 0xe9, 0xb1, 0xac, 0xc8, 0xdc, 0x33, 0xb4, 0xa9, 0x13, 0xdb, 0x06, 0xab, 0xd9, - 0xbf, 0x1c, 0x84, 0xe9, 0x4c, 0x3c, 0x72, 0x53, 0xa4, 0xca, 0x53, 0x4b, 0xb7, 0xc8, 0xc3, 0x66, - 0x27, 0xc1, 0x6c, 0x2c, 0x11, 0xb4, 0xd0, 0xa2, 0x8e, 0xd7, 0x11, 0x59, 0xd8, 0x6c, 0x03, 0xc6, - 0xc6, 0x92, 0xa9, 0x26, 0x1a, 0x33, 0x74, 0x29, 0xb7, 0x13, 0x50, 0x72, 0x15, 0x46, 0x19, 0x44, - 0xb2, 0xea, 0xe7, 0x8f, 0x1f, 0x35, 0x10, 0xe3, 0xb4, 0xe1, 0x37, 0xa9, 0xc6, 0x69, 0x80, 0x73, - 0x32, 0xa1, 0x8c, 0x13, 0x83, 0x48, 0x4e, 0x83, 0x9c, 0x93, 0x06, 0x22, 0xaf, 0xc1, 0x78, 0xb5, - 0xdd, 0xd6, 0x18, 0x61, 0xfa, 0x35, 0xdb, 0x04, 0x92, 0x2b, 0x00, 0xd5, 0x76, 0x5b, 0xb2, 0xc1, - 0xd4, 0x6a, 0xb6, 0x06, 0x21, 0xb7, 0xe3, 0x60, 0x77, 0x1a, 0x2b, 0xbc, 0x0d, 0xb1, 0x33, 0x4a, - 0x98, 0x5c, 0x55, 0x64, 0x30, 0xc1, 0x14, 0xb8, 0x5c, 0x13, 0x60, 0xf2, 0x11, 0x5c, 0x48, 0xb8, - 0x8d, 0x68, 0x15, 0xe0, 0x4d, 0x85, 0x9d, 0x8f, 0x40, 0xde, 0x85, 0xf3, 0x89, 0x42, 0x59, 0x1d, - 0x5e, 0x4a, 0xd8, 0x39, 0xa5, 0xe4, 0x03, 0x28, 0x27, 0x1e, 0xb4, 0xc7, 0x95, 0xe2, 0x05, 0x84, - 0x9d, 0x5b, 0xce, 0xbe, 0xae, 0xc4, 0xcb, 0x38, 0x51, 0x25, 0xde, 0xb5, 0xda, 0xd9, 0x85, 0x64, - 0x05, 0x2a, 0x99, 0xae, 0x38, 0x5a, 0xc5, 0x98, 0x32, 0xce, 0xee, 0x85, 0x46, 0xe6, 0xe1, 0x52, - 0x26, 0x8a, 0x6c, 0x06, 0x26, 0x92, 0xb3, 0xbb, 0xe2, 0x90, 0x39, 0x98, 0x8a, 0x5d, 0x92, 0xb4, - 0x26, 0x60, 0x0e, 0x39, 0x3b, 0xb3, 0x8c, 0xbc, 0x69, 0x86, 0x2d, 0xe0, 0x95, 0x61, 0x0a, 0x39, - 0x3b, 0x5d, 0x60, 0x1d, 0x17, 0xe0, 0x52, 0xe6, 0x5e, 0x2c, 0x8f, 0x0c, 0xb3, 0x49, 0xdd, 0x54, - 0x5b, 0x0b, 0x6e, 0x41, 0x3f, 0x9e, 0x21, 0xb8, 0xa9, 0x5b, 0x7a, 0xe1, 0x22, 0x3d, 0x67, 0xc5, - 0x4a, 0x6d, 0xc4, 0x21, 0xcb, 0xea, 0x6a, 0xb3, 0x0f, 0x8d, 0x25, 0x77, 0x92, 0x3a, 0x5a, 0x46, - 0xe5, 0xfa, 0x15, 0xa7, 0xbc, 0xcc, 0x7c, 0x99, 0x5b, 0xa4, 0x3f, 0x2d, 0x40, 0xa5, 0x87, 0x0a, - 0xa2, 0xfa, 0x54, 0x38, 0x41, 0x9f, 0x1e, 0xa8, 0x3e, 0xf1, 0x57, 0xc3, 0x73, 0x27, 0x53, 0x73, - 0x5e, 0x75, 0xb7, 0xfe, 0xaa, 0x00, 0x24, 0xad, 0xea, 0x92, 0xef, 0xc1, 0x48, 0xad, 0xb6, 0x62, - 0x38, 0x24, 0xa6, 0x2e, 0xb7, 0x62, 0x0c, 0x72, 0xf7, 0x44, 0x1e, 0x88, 0xba, 0xff, 0xe1, 0x27, - 0x29, 0xb7, 0xc7, 0xbe, 0xae, 0x6e, 0x8f, 0x29, 0xa7, 0xc7, 0xa5, 0x0c, 0x3f, 0xbe, 0xfe, 0x1e, - 0x7e, 0x7c, 0x69, 0x27, 0x3d, 0x6b, 0x11, 0xca, 0x79, 0xda, 0x32, 0xae, 0x70, 0x3c, 0x44, 0x9c, - 0x76, 0x41, 0xc7, 0x57, 0x38, 0x13, 0x6c, 0xbd, 0x0b, 0xe7, 0x15, 0x35, 0xcf, 0x3d, 0xa3, 0xc5, - 0x66, 0x10, 0x47, 0x6c, 0x15, 0x03, 0x22, 0x06, 0x58, 0x7f, 0xd2, 0x9f, 0x22, 0xac, 0x75, 0x0e, - 0x0f, 0x9d, 0xe0, 0x39, 0xa9, 0x9a, 0x84, 0x7d, 0x3d, 0x4f, 0x35, 0xf3, 0xfd, 0x4c, 0xc7, 0xd4, - 0xb8, 0xb3, 0x7d, 0x01, 0x35, 0x0c, 0xaf, 0x41, 0xf9, 0xd5, 0x5e, 0x91, 0xc7, 0x9f, 0x32, 0x80, - 0x64, 0x17, 0xc6, 0xc5, 0xde, 0x8d, 0xbf, 0xe5, 0x37, 0x76, 0x37, 0xf9, 0x8d, 0x19, 0xcd, 0xbb, - 0x6d, 0x90, 0xf0, 0xd9, 0x68, 0xb2, 0x21, 0x5f, 0xc0, 0x84, 0xd4, 0xd4, 0x04, 0x63, 0xee, 0x8c, - 0x75, 0xaf, 0x3b, 0x63, 0x93, 0x86, 0x73, 0x4e, 0x30, 0x62, 0x4d, 0x96, 0x8b, 0x1d, 0xe7, 0x3c, - 0x70, 0x92, 0x26, 0x1b, 0x24, 0xa2, 0xc9, 0x06, 0x6c, 0xf6, 0x53, 0x20, 0xe9, 0x7e, 0xf5, 0xfa, - 0x9c, 0xc6, 0xb5, 0xcf, 0x69, 0xb6, 0x0a, 0x93, 0x19, 0x1d, 0x38, 0x15, 0x8b, 0x4f, 0x81, 0xa4, - 0x5b, 0x7a, 0x1a, 0x0e, 0xd6, 0x4d, 0x78, 0x5d, 0x89, 0x40, 0xcd, 0x06, 0x83, 0xa7, 0x34, 0xb2, - 0xff, 0x7a, 0x11, 0x2a, 0x3d, 0x50, 0xc9, 0xdf, 0x2d, 0x24, 0xa5, 0xcd, 0x67, 0xe3, 0xfb, 0x49, - 0x69, 0x67, 0xd3, 0x67, 0x88, 0x7d, 0xfe, 0x83, 0xdf, 0xf8, 0xf3, 0x17, 0x3e, 0x79, 0xa4, 0x87, - 0xec, 0xf4, 0xd2, 0xea, 0xd7, 0xa5, 0xb5, 0x0b, 0x53, 0xc6, 0xb1, 0xf0, 0x24, 0x9b, 0x97, 0x05, - 0x20, 0xd2, 0xe0, 0xae, 0xf9, 0xfb, 0x22, 0x5b, 0x6f, 0xb1, 0x5c, 0xb0, 0x35, 0xa8, 0x75, 0x1f, - 0xa6, 0x13, 0x7c, 0x85, 0xf1, 0xff, 0x7b, 0xa0, 0xde, 0xe1, 0x23, 0xe3, 0xbe, 0xf9, 0x73, 0x3f, - 0x3f, 0xaa, 0x8c, 0x33, 0xb5, 0xfe, 0x76, 0x9c, 0x0a, 0x41, 0xfe, 0x65, 0xad, 0xeb, 0xd7, 0x17, - 0xd5, 0x96, 0x1e, 0x9f, 0x88, 0xdc, 0x83, 0x41, 0x0e, 0x49, 0x04, 0x1c, 0xd7, 0xb1, 0xc5, 0xba, - 0x20, 0x10, 0xad, 0x69, 0x7c, 0x35, 0x8c, 0x3f, 0xaa, 0x71, 0x94, 0x0b, 0x6b, 0x87, 0x27, 0xe0, - 0x89, 0xc1, 0x2a, 0xa8, 0x79, 0x7f, 0x35, 0x8e, 0xc6, 0x21, 0xfd, 0x58, 0x24, 0x9e, 0xe7, 0x3f, - 0x6b, 0xd1, 0x26, 0xcf, 0x9c, 0x38, 0x3f, 0x26, 0xce, 0xb8, 0xfd, 0x0e, 0x63, 0x80, 0x64, 0xd6, - 0x27, 0x30, 0xcd, 0xb4, 0x85, 0x20, 0x59, 0x1f, 0xa6, 0xdd, 0x60, 0x30, 0xf3, 0x71, 0x80, 0xc3, - 0x40, 0xf8, 0x38, 0x40, 0x14, 0x5a, 0x6b, 0x70, 0x81, 0x1b, 0x3f, 0xf5, 0x2e, 0xc5, 0x57, 0x0d, - 0x03, 0xf8, 0x3b, 0xf1, 0xe6, 0x34, 0xa3, 0xf7, 0x1c, 0xcf, 0xfa, 0x18, 0x1f, 0x35, 0x89, 0x89, - 0xea, 0xfa, 0x5e, 0x6c, 0xe9, 0x3c, 0xd9, 0x2b, 0xe8, 0xff, 0x1d, 0x2e, 0x55, 0xdb, 0x6d, 0xea, - 0x35, 0x63, 0xc2, 0xed, 0xc0, 0x39, 0x61, 0x8c, 0x0a, 0x52, 0x85, 0x01, 0xc4, 0x56, 0x77, 0xc0, - 0xa2, 0xb9, 0x19, 0xcd, 0x41, 0x3c, 0x11, 0x81, 0x16, 0x2b, 0xe0, 0x94, 0x56, 0x13, 0x66, 0x6a, - 0x9d, 0xbd, 0x43, 0x37, 0xc2, 0x27, 0x05, 0x18, 0xe7, 0x45, 0xd6, 0xbd, 0x2a, 0x73, 0xa6, 0x71, - 0x61, 0xdc, 0x8c, 0x1f, 0xbf, 0xe0, 0xab, 0x04, 0x11, 0xfb, 0xe5, 0xe9, 0xbd, 0xdb, 0x31, 0x29, - 0x5a, 0x79, 0x78, 0x2d, 0x58, 0x2c, 0xf2, 0xaa, 0x59, 0x93, 0x70, 0x4e, 0xbf, 0xf3, 0xe2, 0x33, - 0x64, 0x1a, 0x26, 0xcd, 0xbb, 0x2c, 0x0e, 0xfe, 0x1a, 0xa6, 0xb8, 0xad, 0x9d, 0x47, 0x90, 0x9f, - 0x8b, 0x83, 0xa5, 0x17, 0x77, 0xe7, 0x12, 0x6f, 0x19, 0xd0, 0xc5, 0x59, 0xe5, 0x06, 0xd9, 0x9d, - 0xe3, 0x0f, 0x53, 0x9f, 0xce, 0x19, 0xb7, 0xb1, 0xc5, 0xdd, 0xb9, 0xf9, 0x21, 0x11, 0x89, 0x97, - 0x71, 0xe7, 0xc3, 0xff, 0xad, 0x70, 0x9f, 0xc3, 0x58, 0x08, 0x2b, 0xd4, 0xc1, 0x77, 0x4b, 0xd9, - 0x2f, 0xca, 0x27, 0xa0, 0xa8, 0x42, 0x6d, 0x16, 0xdd, 0xa6, 0xf5, 0x87, 0x05, 0xb8, 0xc9, 0x15, - 0xb2, 0x6c, 0x3a, 0xbc, 0xd8, 0xca, 0x21, 0x26, 0xef, 0xc1, 0x40, 0xa8, 0x39, 0x78, 0x58, 0xa2, - 0xe5, 0xdd, 0x38, 0x71, 0x02, 0x52, 0x85, 0x31, 0xfd, 0x79, 0xce, 0xc9, 0xa2, 0xf8, 0xd9, 0xa3, - 0x87, 0x8f, 0x1d, 0xf5, 0x64, 0xe7, 0x09, 0x5c, 0x5c, 0xfa, 0x86, 0x4d, 0x08, 0xb1, 0x43, 0x89, - 0xd3, 0x43, 0xfc, 0x62, 0xf9, 0xec, 0xb6, 0x98, 0x31, 0xe6, 0xd1, 0x3e, 0x09, 0x66, 0xe7, 0x64, - 0xb9, 0xc9, 0x29, 0x15, 0x7e, 0xc4, 0x36, 0x60, 0xd6, 0x9f, 0x14, 0xe0, 0x52, 0x76, 0x6d, 0x62, - 0x61, 0x59, 0x85, 0x73, 0x0b, 0x8e, 0xe7, 0x7b, 0x6e, 0xc3, 0x69, 0xd5, 0x1a, 0x07, 0xb4, 0xd9, - 0x51, 0xf1, 0x7a, 0xd5, 0x2a, 0xb3, 0x4f, 0x3d, 0x49, 0x2e, 0x51, 0xec, 0x34, 0x15, 0x3b, 0x21, - 0xe2, 0x0b, 0x0f, 0xbe, 0xf6, 0xb6, 0x68, 0xa0, 0xf8, 0xf1, 0x96, 0xe5, 0x94, 0x92, 0xbb, 0xf2, - 0x52, 0xa1, 0xb9, 0xe3, 0xb9, 0x91, 0x22, 0xe2, 0xa6, 0x9e, 0xac, 0x22, 0xeb, 0xdf, 0x14, 0xe0, - 0x02, 0xa6, 0xe8, 0x32, 0x92, 0x7e, 0xc6, 0x61, 0xab, 0x65, 0xe4, 0xe5, 0x82, 0xf1, 0x62, 0xc5, - 0xc0, 0x36, 0x43, 0x30, 0x93, 0x37, 0xa1, 0xbf, 0x26, 0x1d, 0xce, 0x26, 0x12, 0xe9, 0x9a, 0x05, - 0x05, 0x2b, 0xb7, 0x11, 0x8b, 0x9d, 0xe1, 0x17, 0x69, 0xd8, 0xa0, 0x1e, 0xe6, 0xd5, 0xe6, 0x96, - 0x07, 0x0d, 0x12, 0x47, 0x94, 0xea, 0xcf, 0x8b, 0x28, 0x35, 0x60, 0x46, 0x94, 0xb2, 0x9e, 0xf2, - 0x04, 0x5d, 0xc9, 0x0e, 0x89, 0x41, 0xfa, 0x38, 0x95, 0x86, 0x9b, 0xef, 0x03, 0xe7, 0xb3, 0x7a, - 0xc6, 0x94, 0xf4, 0x44, 0x86, 0xed, 0xfc, 0x30, 0xd1, 0x5b, 0xf0, 0x9a, 0x81, 0x5b, 0x6d, 0xb5, - 0xfc, 0x67, 0xb4, 0xb9, 0x15, 0xf8, 0x87, 0x7e, 0x64, 0x24, 0x28, 0x12, 0x79, 0xe8, 0xe3, 0x6b, - 0x23, 0x31, 0x2b, 0x13, 0x60, 0xeb, 0x7f, 0x83, 0x1b, 0x3d, 0x38, 0x8a, 0x4e, 0xd5, 0xe0, 0x9c, - 0x93, 0x28, 0x93, 0x9e, 0x43, 0x37, 0xb2, 0xfa, 0x95, 0x64, 0x14, 0xda, 0x69, 0xfa, 0x5b, 0xdb, - 0x46, 0xea, 0x6a, 0x52, 0x86, 0xa9, 0x2d, 0x7b, 0x73, 0x71, 0x67, 0x61, 0xbb, 0xbe, 0xfd, 0xc5, - 0xd6, 0x52, 0x7d, 0x67, 0xe3, 0xe1, 0xc6, 0xe6, 0xa3, 0x0d, 0x1e, 0x67, 0xdd, 0x28, 0xd9, 0x5e, - 0xaa, 0xae, 0x97, 0x0a, 0x64, 0x0a, 0x4a, 0x06, 0x78, 0x69, 0x67, 0xbe, 0x54, 0xbc, 0xf5, 0xb5, - 0x91, 0x92, 0x99, 0x5c, 0x82, 0x72, 0x6d, 0x67, 0x6b, 0x6b, 0xd3, 0x56, 0x5c, 0xf5, 0x28, 0xef, - 0xd3, 0x70, 0xce, 0x28, 0xbd, 0x6f, 0x2f, 0x2d, 0x95, 0x0a, 0xac, 0x29, 0x06, 0x78, 0xcb, 0x5e, - 0x5a, 0x5f, 0xdd, 0x59, 0x2f, 0x15, 0x6f, 0xd5, 0xf5, 0x67, 0x72, 0xe4, 0x22, 0xcc, 0x2c, 0x2e, - 0xed, 0xae, 0x2e, 0x2c, 0x65, 0xf1, 0x9e, 0x82, 0x92, 0x5e, 0xb8, 0xbd, 0xb9, 0xbd, 0xc5, 0x59, - 0xeb, 0xd0, 0x47, 0x4b, 0xf3, 0xd5, 0x9d, 0xed, 0x95, 0x8d, 0x52, 0x9f, 0xd5, 0x3f, 0x5c, 0x2c, - 0x15, 0x6f, 0xfd, 0xc8, 0x78, 0x43, 0xc7, 0x9a, 0x2f, 0xd0, 0x77, 0x6a, 0xd5, 0xe5, 0xfc, 0x2a, - 0x78, 0xe9, 0xfa, 0xfd, 0x6a, 0xa9, 0x40, 0x2e, 0xc3, 0x05, 0x03, 0xba, 0x55, 0xad, 0xd5, 0x1e, - 0x6d, 0xda, 0x8b, 0x6b, 0x4b, 0xb5, 0x5a, 0xa9, 0x78, 0x6b, 0xd7, 0x88, 0xa2, 0xc7, 0x6a, 0x58, - 0xbf, 0x5f, 0xad, 0xdb, 0x4b, 0x9f, 0xed, 0xac, 0xda, 0x4b, 0x8b, 0xe9, 0x1a, 0x8c, 0xd2, 0x2f, - 0x96, 0x6a, 0xa5, 0x02, 0x99, 0x84, 0xb3, 0x06, 0x74, 0x63, 0xb3, 0x54, 0xbc, 0xf5, 0xba, 0x08, - 0xb4, 0x46, 0x26, 0x00, 0x16, 0x97, 0x6a, 0x0b, 0x4b, 0x1b, 0x8b, 0xab, 0x1b, 0xcb, 0xa5, 0x33, - 0x64, 0x1c, 0x46, 0xaa, 0xea, 0x67, 0xe1, 0xd6, 0x07, 0x70, 0x36, 0x71, 0xbc, 0x67, 0x18, 0xea, - 0x60, 0x5c, 0x3a, 0x83, 0xe2, 0x97, 0x3f, 0xd1, 0xc6, 0xca, 0x4f, 0xea, 0xa5, 0xc2, 0xad, 0x79, - 0x99, 0xc5, 0x57, 0xfb, 0xce, 0xc9, 0x28, 0x0c, 0x2d, 0x2e, 0xdd, 0xaf, 0xee, 0xac, 0x6d, 0x97, - 0xce, 0xb0, 0x1f, 0x0b, 0xf6, 0x52, 0x75, 0x7b, 0x69, 0xb1, 0x54, 0x20, 0x23, 0x30, 0x50, 0xdb, - 0xae, 0x6e, 0x2f, 0x95, 0x8a, 0x64, 0x18, 0xfa, 0x77, 0x6a, 0x4b, 0x76, 0xa9, 0x6f, 0xee, 0x9f, - 0xff, 0x9d, 0x02, 0x37, 0x34, 0xca, 0xf7, 0x58, 0x5f, 0x6b, 0x07, 0x4a, 0xb1, 0xe4, 0x89, 0x94, - 0xa5, 0xb9, 0xa7, 0x47, 0xd4, 0x02, 0x66, 0xbb, 0x5c, 0xee, 0x20, 0xc2, 0xcd, 0xc2, 0xdd, 0x02, - 0xb1, 0xd1, 0x19, 0x26, 0x71, 0xbe, 0x52, 0x9c, 0xb3, 0x8f, 0xc0, 0xb3, 0x97, 0xbb, 0x1e, 0xcb, - 0xc8, 0xaf, 0x80, 0xa5, 0xf3, 0xcc, 0x39, 0x85, 0x7c, 0xef, 0x64, 0xa7, 0x0d, 0x59, 0xe7, 0xeb, - 0x27, 0x43, 0x27, 0x0f, 0x60, 0x9c, 0xe9, 0xe6, 0x0a, 0x8d, 0x5c, 0x4c, 0x12, 0x6a, 0x47, 0x82, - 0xd9, 0x4b, 0xd9, 0x85, 0x2a, 0xab, 0xd0, 0x18, 0x76, 0x84, 0x1f, 0xae, 0x43, 0x22, 0x83, 0x71, - 0x48, 0x08, 0x5f, 0xf1, 0x67, 0xcf, 0x25, 0xc0, 0xbb, 0xf7, 0xee, 0x16, 0x48, 0x0d, 0x23, 0xe1, - 0x19, 0x4a, 0x3e, 0x91, 0x0f, 0x04, 0xd3, 0xda, 0x3f, 0x6f, 0x4d, 0x45, 0xe5, 0x00, 0xcd, 0x39, - 0x1d, 0x6c, 0x00, 0x49, 0xeb, 0xce, 0xe4, 0x6a, 0x3c, 0x0f, 0xb2, 0xd5, 0xea, 0xd9, 0xf3, 0xa9, - 0x8b, 0xac, 0x25, 0xa6, 0x3d, 0x91, 0x25, 0x98, 0x10, 0x2f, 0xed, 0x85, 0x36, 0x4f, 0xba, 0x9d, - 0x07, 0x72, 0xd9, 0x2c, 0xa3, 0x9c, 0xd4, 0x89, 0x80, 0xcc, 0xc6, 0xfd, 0x48, 0x1e, 0x13, 0x66, - 0x2f, 0x66, 0x96, 0x89, 0xfe, 0xdd, 0x87, 0x09, 0xf3, 0x70, 0x41, 0xe4, 0x00, 0x65, 0x9e, 0x39, - 0x72, 0x1b, 0x54, 0x87, 0x99, 0x75, 0xc7, 0xc5, 0xfb, 0x12, 0xe1, 0xa4, 0x27, 0xfd, 0xe0, 0x48, - 0xa5, 0x8b, 0x63, 0x5c, 0x8d, 0x7a, 0x4d, 0x35, 0x08, 0x79, 0x19, 0x02, 0xf0, 0xb3, 0xa9, 0x49, - 0x1d, 0xd9, 0xf4, 0x51, 0x24, 0x96, 0x99, 0xd7, 0x39, 0xcb, 0xed, 0x74, 0x36, 0xcf, 0x53, 0x9a, - 0xac, 0xa3, 0x92, 0x9e, 0xe0, 0xa8, 0xcd, 0x89, 0x53, 0xb3, 0x2b, 0x63, 0xbc, 0x07, 0x2d, 0xd9, - 0xbe, 0x28, 0x0c, 0x49, 0x8e, 0xe0, 0x72, 0x99, 0xdd, 0x2d, 0x90, 0xaf, 0xf1, 0xab, 0xce, 0x64, - 0xf7, 0xc8, 0x8d, 0x0e, 0x84, 0xf6, 0x73, 0x31, 0x93, 0x81, 0xf8, 0x50, 0xba, 0x70, 0xb7, 0x61, - 0x2a, 0xcb, 0x39, 0x5b, 0x09, 0xb4, 0x8b, 0xe7, 0x76, 0xee, 0x2c, 0xb0, 0xd9, 0x51, 0xa3, 0x99, - 0x3f, 0x48, 0x5d, 0x7c, 0x83, 0x73, 0x79, 0x7e, 0x04, 0x13, 0x6c, 0x96, 0x3c, 0xa4, 0xb4, 0x5d, - 0x6d, 0xb9, 0x4f, 0x69, 0x48, 0x64, 0x18, 0x63, 0x05, 0xca, 0xa3, 0xbd, 0x59, 0x20, 0xdf, 0x85, - 0xd1, 0x47, 0x4e, 0xd4, 0x38, 0x10, 0xe1, 0x3c, 0x65, 0xb4, 0x4f, 0x84, 0xcd, 0xca, 0x5f, 0x58, - 0x78, 0xb7, 0x40, 0x7e, 0x00, 0x43, 0xcb, 0x34, 0xc2, 0x07, 0xda, 0xd7, 0x94, 0x2f, 0x21, 0xb7, - 0x4f, 0xae, 0x7a, 0xea, 0x15, 0x92, 0x6c, 0x70, 0xd2, 0x98, 0x4b, 0xee, 0x00, 0xf0, 0x05, 0x01, - 0x39, 0x24, 0x8b, 0x67, 0x53, 0xcd, 0x26, 0xcb, 0x4c, 0x79, 0x68, 0xd1, 0x88, 0x9e, 0xb4, 0xca, - 0x3c, 0x19, 0xad, 0xc1, 0x84, 0x4a, 0xc4, 0xb4, 0x81, 0x51, 0x57, 0xac, 0x04, 0xb3, 0xf0, 0x14, - 0xdc, 0x3e, 0x60, 0x5f, 0x05, 0xcf, 0x42, 0x8c, 0xe1, 0x39, 0x70, 0x25, 0x9d, 0xd1, 0x63, 0x7c, - 0xe8, 0x4b, 0xa8, 0x14, 0x22, 0x47, 0xd3, 0x68, 0x57, 0xfc, 0x30, 0x32, 0x69, 0x15, 0x24, 0x9b, - 0xf6, 0x97, 0x61, 0x56, 0xaf, 0xd7, 0x8c, 0x27, 0x1d, 0xaf, 0xb9, 0x79, 0x61, 0xaa, 0x67, 0xaf, - 0x75, 0xc1, 0x10, 0xe7, 0xb7, 0xbe, 0xdf, 0x2a, 0x16, 0x70, 0x39, 0x59, 0x84, 0x49, 0x59, 0xd7, - 0x66, 0x9b, 0x7a, 0xb5, 0xda, 0x0a, 0x26, 0xdd, 0x91, 0x9e, 0x2b, 0x1a, 0x4c, 0x72, 0x27, 0xe9, - 0x22, 0xb6, 0xf5, 0x19, 0x61, 0x38, 0x48, 0xb7, 0xe0, 0x1c, 0xf1, 0xd6, 0x97, 0x19, 0xe8, 0xf8, - 0x21, 0x37, 0x2a, 0x19, 0xca, 0xff, 0xee, 0x1c, 0xe9, 0x72, 0x00, 0x9a, 0xcd, 0x39, 0x42, 0xdc, - 0x2d, 0x90, 0x2f, 0x80, 0xa4, 0x8f, 0x24, 0x4a, 0x84, 0xb9, 0xc7, 0x2f, 0x25, 0xc2, 0x2e, 0xe7, - 0x99, 0x65, 0x98, 0x56, 0x41, 0x78, 0xb4, 0x5a, 0xe7, 0x48, 0x4e, 0x6b, 0xf2, 0x5a, 0x49, 0x3e, - 0x81, 0x49, 0x31, 0x69, 0xf5, 0x02, 0x52, 0x52, 0xeb, 0x8f, 0x38, 0x95, 0xe4, 0xce, 0xd3, 0x07, - 0x30, 0x5d, 0x4b, 0x48, 0x8c, 0x3b, 0xf3, 0x5f, 0x30, 0x59, 0x20, 0xb0, 0x46, 0x23, 0x2e, 0xb2, - 0x6c, 0x5e, 0x0f, 0x81, 0x70, 0xa3, 0x90, 0x64, 0xf7, 0xd4, 0xa5, 0xcf, 0xc8, 0xe5, 0x44, 0xd3, - 0x19, 0x10, 0xd1, 0x70, 0x01, 0xcb, 0xed, 0xd9, 0x36, 0xcf, 0xa1, 0x8d, 0x50, 0xe3, 0x1e, 0xfd, - 0xaa, 0x41, 0x60, 0x5c, 0xc5, 0x8b, 0x01, 0xb8, 0x90, 0x8b, 0x41, 0x7e, 0x0d, 0xa3, 0xdf, 0x76, - 0x3f, 0x56, 0x91, 0xef, 0x66, 0x9d, 0x7e, 0x73, 0x0e, 0x86, 0xb3, 0x6f, 0x9e, 0x0c, 0x59, 0x1d, - 0x64, 0xc7, 0x97, 0x69, 0xb4, 0xd5, 0xea, 0xec, 0xbb, 0x98, 0x5d, 0x95, 0x28, 0xa3, 0x91, 0x02, - 0x89, 0x79, 0x29, 0x83, 0xce, 0xc5, 0x05, 0x35, 0xfa, 0x63, 0xb2, 0x0a, 0x25, 0xbe, 0xfe, 0x6b, - 0x2c, 0x2e, 0xa7, 0x58, 0x08, 0x14, 0x27, 0x70, 0x0e, 0xc3, 0xdc, 0xd1, 0xba, 0xc3, 0x7d, 0xa3, - 0x88, 0xfc, 0x26, 0x75, 0x05, 0x73, 0xd2, 0x80, 0xa9, 0x8c, 0x00, 0x6c, 0x44, 0x6c, 0x1a, 0xd2, - 0x48, 0x86, 0xd9, 0xe1, 0xb9, 0x75, 0xaf, 0xc7, 0x9b, 0x7d, 0xba, 0x34, 0xfe, 0xf4, 0x13, 0x21, - 0xe1, 0x76, 0xdf, 0x22, 0x2a, 0xdf, 0x70, 0x06, 0xd3, 0xd7, 0x0d, 0x9d, 0xe4, 0x74, 0x7c, 0xdf, - 0xc6, 0x3d, 0x08, 0x43, 0x0b, 0x4d, 0xc7, 0x6d, 0x63, 0xbf, 0x25, 0xd5, 0xb8, 0x46, 0xb5, 0x3b, - 0x87, 0x4b, 0x1a, 0xdb, 0x24, 0x99, 0x0a, 0xdb, 0x09, 0x02, 0xea, 0x71, 0xe2, 0x3c, 0x7d, 0x23, - 0x8b, 0xfa, 0x63, 0x5c, 0x7a, 0x34, 0x6a, 0xfe, 0xe6, 0xb0, 0x17, 0x0b, 0x9e, 0x0b, 0xea, 0x6e, - 0x81, 0xbc, 0x07, 0xc3, 0xa2, 0x8d, 0x8c, 0xc8, 0x68, 0x74, 0xd8, 0xa5, 0xd5, 0x48, 0x09, 0x5c, - 0x48, 0xd8, 0x66, 0x13, 0x27, 0x6f, 0xf4, 0x79, 0x9b, 0xdf, 0x63, 0x9b, 0x6d, 0xf3, 0x45, 0x28, - 0x17, 0xe4, 0xae, 0x8b, 0x94, 0x65, 0x15, 0x8e, 0x46, 0x82, 0x7a, 0x6c, 0x8f, 0x9c, 0x09, 0xd3, - 0x9b, 0x31, 0xa6, 0xa3, 0x0a, 0xcd, 0xa6, 0xf4, 0x66, 0x03, 0xdc, 0x6b, 0xaf, 0x5d, 0x85, 0x52, - 0xb5, 0x81, 0x3b, 0x41, 0x8d, 0x1e, 0x3a, 0xed, 0x03, 0x3f, 0xa0, 0xea, 0xd0, 0x92, 0x2c, 0x90, - 0xbc, 0xa6, 0x95, 0x66, 0x21, 0x0a, 0xd6, 0xa8, 0x83, 0x81, 0xaf, 0x67, 0x94, 0x6a, 0x91, 0x28, - 0xca, 0xa6, 0xe8, 0x72, 0x48, 0x99, 0x5a, 0x60, 0xc7, 0xaa, 0xd6, 0xcb, 0xb1, 0xf9, 0x00, 0x17, - 0x0c, 0x85, 0x1c, 0xaa, 0x1d, 0x42, 0x81, 0xd4, 0x71, 0x4e, 0x3e, 0x3f, 0x52, 0xa8, 0x55, 0x79, - 0x6f, 0x1c, 0x8b, 0x25, 0x8f, 0x3a, 0xaf, 0xfa, 0xef, 0xc3, 0xc4, 0x12, 0x5b, 0xd0, 0x3b, 0x4d, - 0x97, 0x07, 0xfb, 0x27, 0x66, 0xf4, 0xf6, 0x5c, 0xc2, 0x15, 0x99, 0x7e, 0x0d, 0x49, 0xc5, 0xd1, - 0x5f, 0xee, 0x29, 0x1a, 0x4c, 0x8e, 0xc7, 0x94, 0x64, 0x2b, 0xf2, 0x2d, 0xe0, 0xd1, 0x5c, 0x9c, - 0xf5, 0x67, 0xb8, 0x46, 0x58, 0x6d, 0xb7, 0x5b, 0xd2, 0x24, 0xcd, 0xef, 0xde, 0x6f, 0x18, 0x47, - 0xc8, 0x54, 0xb9, 0xe4, 0x9d, 0x56, 0x1a, 0x3f, 0xd7, 0xd2, 0x21, 0xe7, 0xf0, 0xcc, 0x29, 0xef, - 0x35, 0x17, 0x55, 0x78, 0xee, 0x6a, 0xab, 0x95, 0x22, 0x0e, 0xc9, 0x1b, 0x26, 0xf7, 0x2c, 0x9c, - 0x5e, 0x35, 0xe0, 0x11, 0x9d, 0x6b, 0x5d, 0xd5, 0x76, 0x9b, 0x2f, 0x96, 0x57, 0xd4, 0x82, 0x61, - 0x16, 0xa4, 0x8f, 0xe8, 0xc9, 0x72, 0xb1, 0xb6, 0x3f, 0xc0, 0x69, 0x16, 0xe7, 0x4c, 0x26, 0xfa, - 0x81, 0x37, 0x99, 0x32, 0x5a, 0x29, 0x61, 0x89, 0x42, 0xb5, 0x4f, 0x9c, 0x45, 0xd5, 0x27, 0x4e, - 0xc0, 0xac, 0x2c, 0x33, 0x09, 0xb8, 0xe4, 0x77, 0x25, 0xaf, 0x58, 0x59, 0x4a, 0x4b, 0xc9, 0xbc, - 0xf4, 0xaa, 0xcb, 0xe9, 0x84, 0xf5, 0x66, 0x97, 0x73, 0x13, 0xda, 0x3f, 0x80, 0x52, 0x32, 0x25, - 0xb6, 0x62, 0x9a, 0x93, 0x2b, 0x3b, 0x77, 0x4c, 0xee, 0xc3, 0x94, 0x3e, 0xa2, 0xaa, 0xdf, 0x79, - 0xab, 0x7f, 0x1e, 0x9f, 0x6d, 0x98, 0xce, 0xcc, 0x60, 0xad, 0xb6, 0xd8, 0x6e, 0xf9, 0xad, 0x73, - 0xb9, 0x52, 0x38, 0x9f, 0x9d, 0xc4, 0x9e, 0xbc, 0x66, 0x1e, 0xfc, 0xb3, 0x53, 0x7a, 0xcf, 0xde, - 0xe8, 0x81, 0x25, 0x04, 0xfa, 0x35, 0xee, 0x80, 0xa9, 0x3a, 0xae, 0x69, 0xa6, 0x80, 0x9c, 0x0a, - 0xac, 0x6e, 0x28, 0x6a, 0x0e, 0x4c, 0x65, 0x14, 0xe7, 0x8b, 0xf8, 0x7a, 0x3e, 0xcf, 0x78, 0x62, - 0xed, 0xca, 0x28, 0xd4, 0xb9, 0x92, 0xe9, 0x9a, 0xec, 0xbc, 0xcb, 0x59, 0x72, 0x56, 0xcd, 0x87, - 0x93, 0x37, 0x39, 0x8f, 0x5b, 0x53, 0x99, 0x6d, 0x8c, 0x4c, 0xe4, 0x49, 0xb3, 0x4d, 0x56, 0x06, - 0x75, 0x25, 0x86, 0x6e, 0x39, 0xfa, 0xf9, 0x6e, 0xfc, 0x15, 0xb7, 0xe3, 0x98, 0x55, 0xe8, 0x76, - 0x9c, 0x4c, 0xfe, 0x57, 0xf3, 0x11, 0x74, 0xe6, 0x0e, 0xbf, 0xb4, 0x4d, 0xa4, 0x52, 0x27, 0xfa, - 0x51, 0x29, 0x3b, 0xcd, 0xba, 0x9a, 0x1b, 0x99, 0x28, 0x7a, 0x15, 0x8f, 0xe4, 0x37, 0x98, 0x23, - 0xa5, 0x2e, 0x79, 0xe6, 0xbb, 0xab, 0x29, 0x9b, 0x50, 0x8e, 0x07, 0x33, 0xd1, 0x81, 0x53, 0x0e, - 0xa5, 0x14, 0xc6, 0x85, 0xdc, 0xec, 0xf2, 0xe4, 0x3b, 0xa9, 0x2f, 0x3d, 0x47, 0x30, 0x5d, 0xab, - 0xe0, 0xeb, 0xb9, 0x16, 0xd5, 0xfa, 0x62, 0x6c, 0xc4, 0xd5, 0x13, 0xd1, 0xa7, 0xd6, 0xf3, 0x8c, - 0x2c, 0xf5, 0xcb, 0xa8, 0x17, 0x6b, 0x99, 0xe6, 0x73, 0x7b, 0x7d, 0x39, 0x8b, 0x4f, 0x98, 0x5e, - 0x71, 0xb5, 0x76, 0x49, 0x3d, 0x2d, 0x59, 0x70, 0x9a, 0x15, 0xf7, 0x24, 0x4d, 0xcb, 0xe3, 0xb3, - 0x08, 0xa3, 0x5a, 0x8a, 0x7a, 0x72, 0xc1, 0x10, 0x93, 0xb1, 0x87, 0xce, 0x1a, 0x9d, 0x33, 0xb7, - 0xcf, 0x05, 0x34, 0x25, 0xab, 0x44, 0xf7, 0xb9, 0xad, 0xb8, 0x98, 0xe6, 0x61, 0x98, 0x91, 0x95, - 0x14, 0x78, 0x6b, 0x2e, 0x25, 0x85, 0x63, 0x34, 0x28, 0xbf, 0x4b, 0x44, 0x17, 0x4d, 0x8f, 0x26, - 0xe5, 0xeb, 0xaf, 0x93, 0x22, 0x0f, 0x2e, 0xa6, 0xa2, 0x91, 0x61, 0x0b, 0xcf, 0x2b, 0x9b, 0x98, - 0x06, 0x45, 0x03, 0x45, 0x36, 0x9b, 0x2d, 0x7c, 0x3e, 0x92, 0x91, 0xb3, 0x5f, 0xad, 0xb0, 0x5d, - 0x53, 0xfa, 0x67, 0xe8, 0x6e, 0x6a, 0xcd, 0xce, 0xe5, 0xd8, 0x35, 0x89, 0x7f, 0x6e, 0x4b, 0x7f, - 0xa8, 0xad, 0xd9, 0xa9, 0xcc, 0xfc, 0xe4, 0x66, 0x52, 0x71, 0xcb, 0x4b, 0xde, 0xdf, 0x65, 0x4f, - 0x98, 0xca, 0x4a, 0xea, 0xaf, 0xd9, 0x75, 0x73, 0x33, 0xfe, 0x67, 0x48, 0xc1, 0x96, 0xf3, 0x3f, - 0x87, 0x5b, 0x97, 0x14, 0xff, 0xb9, 0x2d, 0xfc, 0x52, 0x5b, 0xe8, 0x12, 0xa9, 0xf8, 0xd5, 0x71, - 0xbc, 0x47, 0xae, 0xfe, 0x5c, 0xde, 0x1b, 0xf8, 0xa4, 0x29, 0x9d, 0x47, 0x5f, 0x69, 0x36, 0xdd, - 0xb2, 0xec, 0x67, 0x9a, 0x7d, 0xa7, 0xd3, 0x5d, 0x64, 0xfc, 0xce, 0x27, 0x8c, 0xb6, 0xbd, 0x1a, - 0xf6, 0xb5, 0x5c, 0x8c, 0x33, 0xf2, 0xef, 0x27, 0x16, 0xe3, 0xfc, 0x0c, 0xfd, 0x5d, 0x8e, 0x41, - 0x67, 0x6b, 0xee, 0xbe, 0xa7, 0xa5, 0xcf, 0x57, 0x87, 0xa0, 0x74, 0x46, 0x7f, 0xb5, 0xc4, 0x64, - 0x65, 0xdb, 0xdf, 0x64, 0xfa, 0x0f, 0xd7, 0xde, 0xf5, 0x44, 0xe8, 0x64, 0x36, 0x3f, 0xff, 0xbb, - 0x5a, 0x6e, 0x32, 0x33, 0xa7, 0x6b, 0x0c, 0xf5, 0x2c, 0xe4, 0x8a, 0x61, 0x46, 0x42, 0x74, 0xc5, - 0x30, 0x33, 0x6d, 0xf9, 0x1d, 0xb4, 0xba, 0xd8, 0x7e, 0x8b, 0xea, 0x56, 0x17, 0x2d, 0xad, 0x75, - 0xc2, 0xe8, 0x41, 0x3e, 0x86, 0x11, 0x95, 0xf6, 0x5b, 0xd9, 0xb7, 0x93, 0x99, 0xc7, 0x67, 0xcb, - 0xe9, 0x02, 0x51, 0xe1, 0x3b, 0xd2, 0xf0, 0x81, 0x75, 0x96, 0x4d, 0x83, 0x51, 0x7e, 0xb5, 0xef, - 0x48, 0xab, 0x87, 0x41, 0x96, 0x4a, 0xfa, 0x9d, 0x24, 0xfb, 0x3e, 0x8c, 0xc5, 0x09, 0xbe, 0x77, - 0xe7, 0x34, 0xc2, 0x44, 0xd6, 0xef, 0x24, 0xe1, 0x7b, 0xf2, 0x4a, 0x03, 0xeb, 0x33, 0x0b, 0xbb, - 0xef, 0xe2, 0x1f, 0x4b, 0x2b, 0x8b, 0xd1, 0xd2, 0x54, 0xba, 0xf0, 0x2e, 0x8b, 0xef, 0x98, 0x9e, - 0x71, 0x53, 0x0d, 0x6d, 0x46, 0xce, 0x5c, 0x35, 0xb4, 0x59, 0x39, 0x6f, 0x63, 0x93, 0xff, 0x17, - 0xd2, 0xa4, 0x10, 0x33, 0xbd, 0x6c, 0x34, 0x2b, 0xc5, 0xf7, 0x4a, 0x5e, 0x71, 0x92, 0x75, 0x0d, - 0x4a, 0xc9, 0xf4, 0xa0, 0xea, 0x3c, 0x96, 0x93, 0xc7, 0x55, 0x1d, 0xf2, 0x72, 0xf3, 0x8a, 0x6e, - 0x49, 0xfb, 0xb8, 0xc9, 0xf7, 0x5a, 0x76, 0xa3, 0x74, 0xd6, 0xf9, 0x06, 0xf3, 0x71, 0x23, 0x53, - 0xa8, 0x7e, 0x52, 0x4e, 0x65, 0x22, 0xd5, 0x35, 0xab, 0x8c, 0xe4, 0xa2, 0xae, 0x0c, 0x5a, 0x95, - 0x9d, 0xd4, 0xfd, 0x0d, 0xf3, 0x08, 0xdb, 0x25, 0xac, 0x7c, 0xcf, 0xeb, 0x5f, 0xf2, 0x4b, 0x30, - 0x93, 0x13, 0x26, 0x9b, 0xdc, 0x48, 0x58, 0x5a, 0xb3, 0xc3, 0x68, 0xab, 0x09, 0x92, 0x99, 0xc2, - 0x7b, 0x1d, 0xfd, 0x06, 0x8c, 0x10, 0x12, 0xa9, 0xbb, 0xb8, 0x47, 0x6e, 0x74, 0xc0, 0x33, 0x55, - 0x6b, 0xcb, 0x66, 0x66, 0xec, 0x09, 0x52, 0xc3, 0xb3, 0x88, 0x01, 0xcd, 0xb8, 0x8e, 0xcb, 0x60, - 0x38, 0x9b, 0xcd, 0x90, 0xad, 0x1d, 0x6c, 0x2e, 0x64, 0xc4, 0xf7, 0x50, 0x73, 0x21, 0x3f, 0xf6, - 0x47, 0x6e, 0x33, 0xb7, 0xa4, 0x8e, 0x94, 0xcd, 0x31, 0x3f, 0xd4, 0x47, 0x2e, 0xc7, 0x07, 0x8c, - 0x63, 0x2a, 0x7a, 0x07, 0xc9, 0x41, 0xef, 0xbe, 0x7a, 0xd8, 0x72, 0xcb, 0x35, 0xa9, 0xe6, 0xb4, - 0xf6, 0xe5, 0xc5, 0x09, 0xc9, 0x6d, 0xdf, 0x92, 0xfc, 0x9e, 0xb2, 0xdb, 0x77, 0xd2, 0x4d, 0x57, - 0xdd, 0x7f, 0x25, 0x02, 0xc8, 0x18, 0x1d, 0xd5, 0xe0, 0xb3, 0x39, 0x70, 0xb2, 0x81, 0x8e, 0x40, - 0x49, 0xa8, 0x76, 0x28, 0xcd, 0x8e, 0x50, 0x93, 0xcb, 0x8f, 0xcf, 0x63, 0x23, 0xc2, 0xc7, 0x69, - 0xe6, 0x71, 0x22, 0x34, 0x88, 0x98, 0xc7, 0x06, 0xf4, 0x74, 0xf3, 0x38, 0xc1, 0xd0, 0x9c, 0xc7, - 0xc9, 0x66, 0x26, 0x4f, 0xfa, 0xb9, 0xa3, 0x9a, 0x6c, 0xa6, 0x9a, 0xc7, 0xd9, 0x1c, 0xf3, 0x23, - 0xb1, 0xe4, 0x72, 0x54, 0xf3, 0xd8, 0xe4, 0x98, 0x83, 0x7e, 0xc2, 0x79, 0x9c, 0xac, 0xc4, 0x9c, - 0xc7, 0xa7, 0x6a, 0x9f, 0x9a, 0xc7, 0xd9, 0xed, 0x3b, 0xf5, 0x3c, 0x4e, 0x84, 0x2e, 0x32, 0x3a, - 0x9a, 0x35, 0x8f, 0x93, 0xf8, 0x7c, 0x1e, 0x27, 0xa1, 0x09, 0xe3, 0x4a, 0x97, 0x79, 0x9c, 0xa4, - 0xfc, 0x0c, 0xf9, 0x25, 0xc2, 0xae, 0x9c, 0x64, 0x26, 0xe7, 0x46, 0x6c, 0x21, 0x8f, 0xd0, 0xbc, - 0x97, 0x80, 0x9f, 0x6c, 0x36, 0x5f, 0xca, 0x63, 0x8a, 0xf3, 0x79, 0x57, 0x0a, 0x31, 0xd9, 0x5c, - 0xd3, 0x76, 0x95, 0x1d, 0x75, 0xa6, 0x4b, 0x83, 0x77, 0xd9, 0xbc, 0x69, 0x76, 0xe1, 0xdb, 0x2d, - 0x68, 0x4e, 0x17, 0xbe, 0xea, 0x28, 0x93, 0xe4, 0x9b, 0x4b, 0xd2, 0x7d, 0x7e, 0x7f, 0x2e, 0x2f, - 0x38, 0x92, 0x74, 0x73, 0x89, 0xc3, 0xd1, 0xa9, 0x5b, 0xaa, 0x0e, 0x49, 0xc9, 0x96, 0x9e, 0x76, - 0x9e, 0xaf, 0x4b, 0xed, 0x21, 0x15, 0x6d, 0x2b, 0xd1, 0x69, 0x7d, 0xae, 0xe7, 0x96, 0x90, 0x6d, - 0xb4, 0xe5, 0xa6, 0xe1, 0x9a, 0x1d, 0x38, 0x2f, 0xac, 0x57, 0x4f, 0xae, 0xa9, 0xb8, 0x41, 0x3a, - 0xd7, 0xbc, 0xa0, 0x42, 0x8a, 0x6b, 0x9a, 0xfa, 0x13, 0xb4, 0x7e, 0x89, 0x17, 0x57, 0xde, 0x63, - 0x3f, 0xdf, 0x92, 0x32, 0x69, 0x38, 0x2b, 0x31, 0x5c, 0xf4, 0x11, 0xfb, 0x48, 0xdc, 0xe0, 0x49, - 0x60, 0xae, 0xf0, 0xb3, 0xe8, 0xc9, 0x27, 0x50, 0x12, 0xcb, 0x5b, 0xcc, 0x20, 0x0b, 0x31, 0x77, - 0xe8, 0xe6, 0xa5, 0xd1, 0xed, 0x04, 0x2d, 0x38, 0x89, 0xb1, 0xed, 0x24, 0x92, 0xc8, 0xb7, 0x4c, - 0xb1, 0xed, 0x70, 0x3b, 0xe8, 0x84, 0x11, 0x6d, 0xa6, 0x2d, 0x4a, 0x66, 0x63, 0xa4, 0x67, 0x84, - 0x89, 0xbe, 0x3b, 0x47, 0x56, 0x71, 0x6d, 0x33, 0xc1, 0xdd, 0x4c, 0x6e, 0xd9, 0x6c, 0x70, 0xe9, - 0x59, 0x51, 0xcf, 0x7a, 0xcc, 0x36, 0xe5, 0xd5, 0x9d, 0xdf, 0x28, 0x25, 0xa2, 0x13, 0xf6, 0x2e, - 0x4f, 0x44, 0x1f, 0xa2, 0x1b, 0x00, 0x37, 0xff, 0xf5, 0x92, 0x4c, 0xf2, 0xa1, 0x11, 0xf9, 0x14, - 0x46, 0x24, 0x71, 0x6f, 0x81, 0x24, 0xa9, 0x51, 0x20, 0x8b, 0x30, 0x6e, 0xbc, 0xa2, 0x52, 0xa7, - 0x9b, 0xac, 0xb7, 0x55, 0x5d, 0xc6, 0x79, 0xdc, 0x78, 0x2d, 0xa5, 0xb8, 0x64, 0xbd, 0xa1, 0xca, - 0xe5, 0xf2, 0x03, 0x18, 0x15, 0x22, 0xed, 0x2a, 0x8d, 0x7c, 0x7b, 0xdb, 0xb4, 0xe6, 0x91, 0xdc, - 0x69, 0xba, 0xd1, 0x82, 0xef, 0x3d, 0x76, 0xf7, 0x7b, 0x0a, 0x26, 0x4d, 0xb2, 0x3b, 0x47, 0xbe, - 0xc2, 0xbc, 0xce, 0x32, 0xdb, 0x36, 0x8d, 0x9e, 0xf9, 0xc1, 0x13, 0xd7, 0xdb, 0xef, 0xc1, 0xf2, - 0xaa, 0xc9, 0x32, 0x49, 0x27, 0x7d, 0x47, 0xbe, 0x82, 0xd9, 0x5a, 0x3e, 0xf3, 0x9e, 0x4c, 0xba, - 0x6f, 0x2f, 0x35, 0xb8, 0x84, 0xde, 0x33, 0xa7, 0x6d, 0x7b, 0x57, 0xa6, 0x5f, 0xf0, 0x80, 0x8d, - 0xd2, 0x56, 0xdf, 0xf0, 0x83, 0x66, 0x6f, 0x8e, 0x15, 0xd3, 0x91, 0x36, 0x41, 0x26, 0x85, 0xf1, - 0x05, 0x5c, 0xa8, 0xe5, 0xb2, 0xee, 0xc5, 0xa2, 0x97, 0x26, 0x79, 0x11, 0x45, 0x71, 0xca, 0x76, - 0x77, 0xe5, 0xb9, 0x8a, 0x6b, 0x1a, 0xdb, 0x87, 0xb6, 0x02, 0xfa, 0x98, 0x06, 0xe8, 0xae, 0xdd, - 0xcb, 0x51, 0xd9, 0x44, 0x97, 0x3d, 0x5f, 0x85, 0x73, 0xb5, 0x14, 0xab, 0x3c, 0x92, 0x5e, 0xf7, - 0x3f, 0x93, 0xd8, 0xd3, 0x13, 0xb6, 0xab, 0x87, 0x97, 0xd0, 0xe8, 0x32, 0x8d, 0x76, 0x56, 0x7b, - 0x48, 0x49, 0xbe, 0x27, 0x90, 0x88, 0xbb, 0xf7, 0x18, 0x65, 0x4d, 0xa3, 0x4c, 0x63, 0xe4, 0x7e, - 0xbc, 0x9f, 0xca, 0xbb, 0x90, 0x9e, 0xd5, 0xe6, 0x71, 0x78, 0x0b, 0xd7, 0x42, 0xe1, 0xb2, 0x3c, - 0x13, 0xab, 0x00, 0x1c, 0x12, 0x9b, 0xea, 0x34, 0xef, 0xe5, 0x90, 0x54, 0xf9, 0xf1, 0x8f, 0x4f, - 0x0f, 0x01, 0xbb, 0x92, 0x72, 0x65, 0xef, 0xca, 0x82, 0x5b, 0x41, 0xd7, 0xfc, 0xc6, 0x13, 0xdd, - 0x0a, 0xaa, 0x65, 0xfe, 0x9f, 0x35, 0xf3, 0xf2, 0x8b, 0x15, 0x1f, 0x93, 0xf3, 0xeb, 0x8e, 0x5f, - 0x7a, 0xee, 0xff, 0xd9, 0x99, 0x14, 0x5c, 0x58, 0x90, 0xde, 0x92, 0xb6, 0x45, 0xac, 0xd0, 0xe4, - 0x9c, 0x2b, 0x1a, 0x65, 0x56, 0x44, 0x22, 0xd3, 0xac, 0xa8, 0x37, 0x34, 0xdf, 0x96, 0x4f, 0x6c, - 0xda, 0x6e, 0xa1, 0x17, 0xf4, 0xa1, 0xcf, 0x69, 0x62, 0xc7, 0xd8, 0x74, 0x51, 0x6f, 0xff, 0xad, - 0x49, 0xe1, 0xf5, 0x63, 0x08, 0x5e, 0x05, 0x54, 0x4e, 0x97, 0xc5, 0xa2, 0xd4, 0x9d, 0x91, 0xee, - 0x16, 0xc8, 0x06, 0x9c, 0x5f, 0xa6, 0x91, 0x58, 0xe3, 0x6c, 0x1a, 0x46, 0x81, 0xdb, 0x88, 0xba, - 0x5e, 0x0c, 0xca, 0xb3, 0x49, 0x06, 0xcd, 0xee, 0xdb, 0x8c, 0x5f, 0x2d, 0x9b, 0x5f, 0x57, 0xba, - 0x2e, 0x2e, 0xb2, 0xe2, 0xb6, 0xe1, 0x34, 0x4d, 0xcc, 0x9f, 0xe2, 0x43, 0xdc, 0x03, 0x27, 0x9f, - 0xb4, 0x14, 0x47, 0x3f, 0x11, 0xa7, 0xad, 0xdb, 0x30, 0xc8, 0x89, 0x72, 0x37, 0xd4, 0x31, 0x9d, - 0x86, 0xdc, 0x83, 0x11, 0xe5, 0x42, 0x43, 0x8c, 0xa2, 0xdc, 0x76, 0xdd, 0x83, 0x11, 0x7e, 0xb4, - 0x3a, 0x39, 0xc9, 0x87, 0x30, 0xa2, 0x7c, 0x6e, 0x4e, 0xbd, 0xd3, 0x7f, 0x02, 0xe3, 0xba, 0xf7, - 0xcd, 0xe9, 0x05, 0xf9, 0x03, 0xbc, 0xbe, 0x95, 0xb7, 0x24, 0xf9, 0xf4, 0xd3, 0x89, 0xa0, 0x30, - 0x42, 0xa4, 0x7c, 0x81, 0x94, 0xc0, 0xdc, 0xe6, 0x9f, 0x4b, 0x51, 0x93, 0x0f, 0xe5, 0x4b, 0x26, - 0x45, 0x9c, 0x46, 0xea, 0x22, 0xb3, 0x09, 0x2e, 0xe6, 0x17, 0x21, 0x56, 0x0b, 0x6c, 0xcf, 0x66, - 0x9f, 0xe4, 0x9a, 0xb9, 0xb7, 0xe8, 0xf2, 0xb8, 0x6c, 0xa2, 0x96, 0x96, 0xca, 0xa5, 0x97, 0xcf, - 0xe8, 0x4a, 0x7e, 0xfa, 0x3d, 0x1c, 0x8c, 0x07, 0x78, 0x0a, 0x4c, 0x95, 0xe6, 0x76, 0xaf, 0x4b, - 0x3a, 0xbf, 0xf8, 0xd8, 0x9b, 0x66, 0xd7, 0x85, 0xac, 0xdb, 0x29, 0x5a, 0xbc, 0xcf, 0x7c, 0x25, - 0xec, 0x56, 0xa5, 0x13, 0xe3, 0xc9, 0x3b, 0x9b, 0xdf, 0xb2, 0x8b, 0x19, 0x17, 0xdb, 0x3d, 0xc7, - 0x22, 0x8f, 0xdd, 0x2f, 0xa1, 0x76, 0x98, 0x19, 0x15, 0x2c, 0x9f, 0xd9, 0x4d, 0xcd, 0x37, 0x22, - 0x93, 0x52, 0x6d, 0x7a, 0x4f, 0xf0, 0x89, 0x58, 0x76, 0xb6, 0xc1, 0xd7, 0x7b, 0x70, 0x91, 0x92, - 0xf8, 0x4e, 0x4f, 0x3c, 0x75, 0x4d, 0x7a, 0x91, 0xef, 0xb0, 0xd9, 0xf5, 0xf5, 0xc8, 0x9e, 0x98, - 0x71, 0x73, 0xad, 0x3c, 0x44, 0xb3, 0x19, 0x9a, 0x1e, 0xa2, 0x5d, 0xfb, 0x90, 0x27, 0xfe, 0xcf, - 0xa0, 0x12, 0x3b, 0x80, 0x9c, 0x6e, 0x10, 0xf2, 0x1d, 0x13, 0x49, 0x4a, 0x52, 0x21, 0xe9, 0x96, - 0x4e, 0x68, 0xf6, 0x5a, 0x9e, 0x84, 0xf5, 0x67, 0x30, 0xc2, 0xb1, 0x2d, 0x91, 0x77, 0x33, 0x2f, - 0x83, 0x67, 0x17, 0x3b, 0xac, 0x78, 0x33, 0xf7, 0x4a, 0x18, 0xa5, 0x47, 0xfb, 0xf4, 0x8c, 0x94, - 0x7f, 0x46, 0x82, 0x91, 0xd5, 0x65, 0x78, 0x7b, 0x5f, 0x3d, 0x96, 0x73, 0xc6, 0xf5, 0xf4, 0x03, - 0xea, 0xc4, 0xef, 0xc4, 0x12, 0x41, 0x04, 0xf5, 0xb7, 0xb9, 0xe9, 0xa2, 0xe4, 0x23, 0xa7, 0x2c, - 0x0c, 0xe5, 0x14, 0x55, 0x96, 0x55, 0x30, 0x38, 0x3b, 0x8a, 0xf8, 0x81, 0x1b, 0x3d, 0x5f, 0xb0, - 0xd7, 0x62, 0xb3, 0x82, 0x5e, 0x20, 0x79, 0x83, 0x2c, 0xb4, 0xd7, 0xc8, 0x97, 0xb8, 0x94, 0x08, - 0xf6, 0xf3, 0xbe, 0x1f, 0x85, 0x51, 0xe0, 0xb4, 0x6b, 0x8d, 0xc0, 0x6d, 0x47, 0xb9, 0x9d, 0x8e, - 0x7d, 0xb8, 0xb3, 0xc8, 0x34, 0x97, 0x52, 0x11, 0xc7, 0x3e, 0x2b, 0xf2, 0x8d, 0x7a, 0x56, 0x93, - 0x55, 0xd8, 0xe5, 0xe4, 0x52, 0x93, 0x91, 0xeb, 0x5f, 0x25, 0xd3, 0x3a, 0xcc, 0xe4, 0xc4, 0x0b, - 0x52, 0xb7, 0xb7, 0xdd, 0xe3, 0x09, 0xcd, 0x76, 0xaf, 0x98, 0x7c, 0x05, 0xd3, 0x99, 0x01, 0x85, - 0x94, 0x05, 0xba, 0x5b, 0xb8, 0xa1, 0x5e, 0xcc, 0x9f, 0x40, 0x99, 0x3f, 0xe8, 0x40, 0xbf, 0x65, - 0x23, 0xb6, 0x4c, 0xfc, 0xcc, 0x27, 0x07, 0x21, 0xb9, 0x5e, 0xe7, 0xe3, 0xa9, 0xc7, 0xe6, 0x53, - 0x18, 0x54, 0x24, 0x91, 0x31, 0x5e, 0x7d, 0x78, 0x59, 0x85, 0xdd, 0xde, 0x12, 0x6d, 0xc1, 0xf4, - 0x2e, 0x0d, 0xdc, 0xc7, 0xcf, 0x93, 0x0c, 0xa5, 0x64, 0x32, 0x4b, 0xbb, 0x71, 0xfc, 0x1c, 0x66, - 0x16, 0xfc, 0xc3, 0xb6, 0x78, 0xb5, 0x67, 0xf0, 0x54, 0x57, 0xf1, 0xd9, 0xe5, 0xbd, 0x7d, 0x99, - 0x66, 0xf3, 0x73, 0xfb, 0x2b, 0x17, 0xb6, 0x9e, 0xe9, 0xff, 0xd5, 0xdb, 0x33, 0x93, 0x7e, 0x1b, - 0x27, 0x61, 0x56, 0xb2, 0x7f, 0x7d, 0x12, 0x66, 0x95, 0x77, 0x7f, 0x03, 0x36, 0x93, 0x93, 0xdf, - 0xbf, 0x0b, 0xd7, 0x13, 0xb4, 0x76, 0x43, 0xee, 0x2d, 0x66, 0xba, 0xf2, 0x84, 0xd3, 0x74, 0x66, - 0x2e, 0xf3, 0xcc, 0x76, 0x6a, 0x51, 0x15, 0x5a, 0xad, 0x2e, 0x2a, 0x16, 0xd1, 0xc3, 0x2a, 0x30, - 0x4c, 0x34, 0xe2, 0x8f, 0xeb, 0xb4, 0xdd, 0x56, 0xeb, 0x14, 0x31, 0x2a, 0xb5, 0x1f, 0xc0, 0x58, - 0x4d, 0xaf, 0x3c, 0xa3, 0x92, 0xdc, 0x49, 0xa1, 0x5e, 0x01, 0xf5, 0x6e, 0x7b, 0x17, 0x5f, 0x50, - 0xb5, 0xf1, 0x9c, 0xa8, 0x17, 0xb9, 0xae, 0x33, 0x46, 0xee, 0x39, 0xb5, 0x0b, 0x64, 0xa5, 0x86, - 0x54, 0xae, 0x33, 0xd9, 0xe9, 0xea, 0xea, 0x3c, 0xa3, 0x4d, 0x32, 0xf3, 0x27, 0xb1, 0x7a, 0xa7, - 0xd8, 0x55, 0x3e, 0xf1, 0x5d, 0x53, 0x87, 0x72, 0x3f, 0x9f, 0x38, 0xdb, 0x9e, 0xee, 0xe7, 0x93, - 0xca, 0xe1, 0xa7, 0xfb, 0xf9, 0x64, 0x24, 0xe8, 0x5b, 0x42, 0x5e, 0x71, 0x2a, 0xa0, 0x2e, 0xc6, - 0x08, 0xc5, 0x26, 0x23, 0xe3, 0xd0, 0x43, 0x3d, 0x38, 0x07, 0x4f, 0x20, 0xd4, 0xc5, 0xd6, 0x9a, - 0x0c, 0xca, 0x91, 0xc8, 0x38, 0x74, 0x1f, 0x4a, 0x3c, 0x97, 0x42, 0x1c, 0xd3, 0x30, 0x76, 0xfd, - 0x4b, 0xa7, 0x78, 0xe8, 0x32, 0xa8, 0xa5, 0x64, 0x24, 0x38, 0x65, 0x32, 0xcb, 0x09, 0x11, 0xd7, - 0x65, 0xaa, 0x42, 0x1c, 0xef, 0x4d, 0x19, 0xa6, 0x52, 0x21, 0xe0, 0x66, 0x2f, 0x64, 0x94, 0x28, - 0x95, 0x72, 0x4c, 0x8f, 0x0e, 0xa7, 0xba, 0x94, 0x11, 0x32, 0x6e, 0xf6, 0x62, 0x66, 0x99, 0x60, - 0x14, 0xf1, 0x2c, 0xd3, 0xd9, 0xb9, 0xb1, 0xe3, 0x87, 0x5c, 0x5d, 0x70, 0x64, 0x35, 0xb7, 0x4e, - 0x82, 0x2a, 0x6a, 0xa5, 0x2a, 0x11, 0x52, 0x46, 0x42, 0xee, 0xef, 0x64, 0xbc, 0xb5, 0x30, 0x30, - 0x62, 0x6f, 0xb0, 0xee, 0xd9, 0xc1, 0xc9, 0x23, 0x99, 0x98, 0x26, 0xa7, 0xa6, 0x5e, 0x0c, 0x72, - 0x47, 0xf0, 0x91, 0x4c, 0x45, 0xf3, 0xaa, 0x19, 0xef, 0xc1, 0xa5, 0xc4, 0x03, 0x0e, 0x93, 0xf1, - 0xad, 0xec, 0x57, 0x1e, 0x99, 0xe2, 0xc9, 0xd7, 0xd9, 0xaf, 0xa6, 0x1f, 0x7a, 0x24, 0xc6, 0xfd, - 0xb4, 0x6b, 0xde, 0x3a, 0x4c, 0xe0, 0x32, 0x23, 0x53, 0xcb, 0xc7, 0xb1, 0x61, 0x4c, 0x70, 0x32, - 0x48, 0x51, 0xb2, 0x54, 0xbd, 0x1f, 0x1f, 0x13, 0x8f, 0x82, 0x79, 0xa2, 0xfa, 0x59, 0xf3, 0xa5, - 0x30, 0x02, 0xb3, 0x76, 0x31, 0x91, 0xff, 0x9e, 0xfc, 0x00, 0xce, 0xc6, 0x6f, 0x85, 0x39, 0x8b, - 0x0c, 0xb4, 0x2e, 0x86, 0xb2, 0xb3, 0xf1, 0x83, 0xe1, 0xd3, 0x93, 0xaf, 0xc8, 0xad, 0x28, 0x26, - 0xbf, 0x9c, 0x7a, 0xee, 0x62, 0xf4, 0xe1, 0x24, 0x3b, 0x92, 0x26, 0xdb, 0xd3, 0x8e, 0x4e, 0x03, - 0x3f, 0xb7, 0xec, 0xb0, 0x87, 0xfa, 0xe7, 0xd6, 0x35, 0x34, 0xa3, 0x52, 0x7f, 0x73, 0xf8, 0xac, - 0xc3, 0x75, 0x0c, 0x95, 0xb2, 0xc5, 0x83, 0xe3, 0x65, 0x63, 0xe5, 0xb7, 0x3d, 0x19, 0x60, 0xa5, - 0x05, 0xd7, 0x7a, 0xc6, 0x7d, 0x24, 0x77, 0x0c, 0x17, 0x97, 0xde, 0x11, 0x22, 0xbb, 0x9c, 0x3c, - 0xa6, 0xb2, 0xc2, 0x27, 0xaa, 0x7d, 0xb6, 0x4b, 0x24, 0x47, 0xb5, 0xcf, 0x76, 0x8d, 0xbf, 0xf8, - 0x39, 0x66, 0x7b, 0x12, 0x7b, 0x14, 0x86, 0x3f, 0xa2, 0x1e, 0x0f, 0x0a, 0xdd, 0xf5, 0xda, 0xe7, - 0x9a, 0x79, 0x29, 0x9a, 0x22, 0xc4, 0x33, 0xcd, 0x15, 0x71, 0x12, 0xcb, 0x63, 0xde, 0x9b, 0x49, - 0x17, 0xd7, 0xea, 0x2b, 0x7c, 0x02, 0x9e, 0xba, 0xe5, 0x39, 0xf0, 0xf9, 0xc5, 0x9f, 0xfe, 0xa7, - 0x2b, 0x85, 0x9f, 0xfe, 0xec, 0x4a, 0xe1, 0xdf, 0xfe, 0xec, 0x4a, 0xe1, 0x3f, 0xfe, 0xec, 0x4a, - 0xe1, 0xcb, 0xb9, 0x93, 0x85, 0x26, 0xe6, 0xf9, 0x19, 0xef, 0x70, 0x76, 0x83, 0xf8, 0xdf, 0x5b, - 0xff, 0x33, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xb2, 0x8d, 0xcb, 0xde, 0xeb, 0x00, 0x00, + 0x3a, 0xa3, 0xa3, 0x39, 0xa3, 0x07, 0xcf, 0x63, 0xce, 0x6b, 0xce, 0x39, 0xdd, 0x24, 0x25, 0x52, + 0xe2, 0xeb, 0xec, 0x26, 0xa9, 0xf3, 0xf2, 0xf4, 0x6c, 0x75, 0x97, 0xc8, 0x6d, 0x35, 0xf7, 0xee, + 0xd9, 0x7b, 0xb7, 0x74, 0x34, 0xbe, 0xf6, 0x85, 0xed, 0xfb, 0xf0, 0xc5, 0xc5, 0xbd, 0xb1, 0x81, + 0x24, 0x70, 0x92, 0x0f, 0x27, 0x40, 0x02, 0x04, 0x01, 0x02, 0xf8, 0x27, 0xf0, 0x97, 0x11, 0xe4, + 0x2b, 0x13, 0x03, 0x41, 0x62, 0xd8, 0xfe, 0x09, 0x10, 0x3a, 0x19, 0xc0, 0x3f, 0x44, 0x12, 0xc0, + 0x08, 0x12, 0x20, 0x03, 0x18, 0x08, 0x6a, 0xd5, 0x63, 0x57, 0xed, 0x47, 0x37, 0x29, 0xe9, 0x8c, + 0xf3, 0x23, 0xb1, 0x57, 0xad, 0xb5, 0xaa, 0x6a, 0x55, 0xed, 0xaa, 0x55, 0xab, 0x56, 0xad, 0x05, + 0x37, 0x23, 0xda, 0xa6, 0x1d, 0x3f, 0x88, 0x6e, 0xb5, 0xe9, 0x9e, 0xd3, 0x7c, 0x7e, 0xab, 0xd9, + 0x76, 0xa9, 0x17, 0xdd, 0xea, 0x04, 0x7e, 0xe4, 0xdf, 0x72, 0xba, 0xd1, 0x7e, 0x48, 0x83, 0xa7, + 0x6e, 0x93, 0xde, 0x44, 0x08, 0x19, 0xc2, 0xff, 0xe6, 0x67, 0xf6, 0xfc, 0x3d, 0x9f, 0xe3, 0xb0, + 0xbf, 0x78, 0xe1, 0xfc, 0xf9, 0x3d, 0xdf, 0xdf, 0x6b, 0x53, 0x4e, 0xfc, 0xa8, 0xfb, 0xf8, 0x16, + 0x3d, 0xe8, 0x44, 0xcf, 0x45, 0x61, 0x25, 0x59, 0x18, 0xb9, 0x07, 0x34, 0x8c, 0x9c, 0x83, 0x8e, + 0x40, 0x78, 0x43, 0x35, 0xc5, 0x89, 0x22, 0x56, 0x12, 0xb9, 0xbe, 0x77, 0xeb, 0xe9, 0x1d, 0xfd, + 0xa7, 0x40, 0xbd, 0xde, 0xb3, 0xd5, 0x4d, 0x1a, 0x44, 0xe1, 0xb1, 0x30, 0xe9, 0x53, 0xea, 0x45, + 0xa9, 0xea, 0x05, 0x66, 0xf4, 0xbc, 0x43, 0x43, 0x8e, 0x22, 0xff, 0x13, 0xa8, 0x57, 0xb2, 0x51, + 0xf1, 0x5f, 0x81, 0xf2, 0xbd, 0x6c, 0x94, 0x67, 0xf4, 0x11, 0x93, 0xa9, 0xa7, 0xfe, 0xe8, 0x83, + 0x1e, 0x38, 0x9d, 0x0e, 0x0d, 0xe2, 0x3f, 0x04, 0xfa, 0x39, 0x85, 0x7e, 0xf0, 0xd8, 0x61, 0x22, + 0x3a, 0x78, 0xec, 0xa4, 0xba, 0xd1, 0x0d, 0x9d, 0x3d, 0x2a, 0x9a, 0xff, 0xf4, 0x8e, 0xfe, 0x93, + 0xa3, 0x5a, 0xbf, 0x57, 0x80, 0xa1, 0x87, 0x4e, 0xd4, 0xdc, 0x27, 0x9f, 0xc0, 0xd0, 0x03, 0xd7, + 0x6b, 0x85, 0xe5, 0xc2, 0xe5, 0x81, 0xeb, 0xe3, 0x0b, 0xa5, 0x9b, 0xbc, 0x2b, 0x58, 0xc8, 0x0a, + 0x6a, 0x73, 0x3f, 0x3d, 0xac, 0x9c, 0x3a, 0x3a, 0xac, 0x9c, 0x7e, 0xc2, 0xd0, 0xde, 0xf4, 0x0f, + 0xdc, 0x08, 0xc7, 0xd6, 0xe6, 0x74, 0x64, 0x07, 0xa6, 0xab, 0xed, 0xb6, 0xff, 0x6c, 0xcb, 0x09, + 0x22, 0xd7, 0x69, 0xd7, 0xbb, 0xcd, 0x26, 0x0d, 0xc3, 0x72, 0xf1, 0x72, 0xe1, 0xfa, 0x68, 0xed, + 0xea, 0xd1, 0x61, 0xa5, 0xe2, 0xb0, 0xe2, 0x46, 0x87, 0x97, 0x37, 0x42, 0x8e, 0xa0, 0x31, 0xca, + 0xa2, 0xb7, 0xfe, 0x68, 0x18, 0x4a, 0x2b, 0x7e, 0x18, 0x2d, 0xb2, 0x11, 0xb5, 0xe9, 0x8f, 0xbb, + 0x34, 0x8c, 0xc8, 0x55, 0x18, 0x66, 0xb0, 0xd5, 0xa5, 0x72, 0xe1, 0x72, 0xe1, 0xfa, 0x58, 0x6d, + 0xfc, 0xe8, 0xb0, 0x32, 0xb2, 0xef, 0x87, 0x51, 0xc3, 0x6d, 0xd9, 0xa2, 0x88, 0xbc, 0x01, 0xa3, + 0x1b, 0x7e, 0x8b, 0x6e, 0x38, 0x07, 0x14, 0x5b, 0x31, 0x56, 0x9b, 0x3c, 0x3a, 0xac, 0x8c, 0x79, + 0x7e, 0x8b, 0x36, 0x3c, 0xe7, 0x80, 0xda, 0xaa, 0x98, 0xec, 0xc2, 0xa0, 0xed, 0xb7, 0x69, 0x79, + 0x00, 0xd1, 0x6a, 0x47, 0x87, 0x95, 0xc1, 0xc0, 0x6f, 0xd3, 0x9f, 0x1f, 0x56, 0xde, 0xdd, 0x73, + 0xa3, 0xfd, 0xee, 0xa3, 0x9b, 0x4d, 0xff, 0xe0, 0xd6, 0x5e, 0xe0, 0x3c, 0x75, 0xf9, 0x24, 0x74, + 0xda, 0xb7, 0xe2, 0xa9, 0xda, 0x71, 0xc5, 0xb8, 0xd7, 0x9f, 0x87, 0x11, 0x3d, 0x60, 0x9c, 0x6c, + 0xe4, 0x47, 0x1e, 0xc2, 0x4c, 0xb5, 0xd5, 0x72, 0x39, 0xc5, 0x56, 0xe0, 0x7a, 0x4d, 0xb7, 0xe3, + 0xb4, 0xc3, 0xf2, 0xe0, 0xe5, 0x81, 0xeb, 0x63, 0x42, 0x28, 0xaa, 0xbc, 0xd1, 0x51, 0x08, 0x9a, + 0x50, 0x32, 0x19, 0x90, 0xb7, 0x60, 0x74, 0x69, 0xa3, 0xce, 0xda, 0x1e, 0x96, 0x87, 0x90, 0xd9, + 0xdc, 0xd1, 0x61, 0x65, 0xba, 0xe5, 0x85, 0xd8, 0x35, 0x9d, 0x81, 0x42, 0x24, 0xef, 0xc2, 0xc4, + 0x56, 0xf7, 0x51, 0xdb, 0x6d, 0x6e, 0xaf, 0xd5, 0x1f, 0xd0, 0xe7, 0xe5, 0xe1, 0xcb, 0x85, 0xeb, + 0x13, 0x35, 0x72, 0x74, 0x58, 0x99, 0xea, 0x20, 0xbc, 0x11, 0xb5, 0xc3, 0xc6, 0x13, 0xfa, 0xdc, + 0x36, 0xf0, 0x62, 0xba, 0x7a, 0x7d, 0x85, 0xd1, 0x8d, 0xa4, 0xe8, 0xc2, 0x70, 0x5f, 0xa7, 0xe3, + 0x78, 0xe4, 0x16, 0x80, 0x4d, 0x0f, 0xfc, 0x88, 0x56, 0x5b, 0xad, 0xa0, 0x3c, 0x8a, 0xb2, 0x3d, + 0x7d, 0x74, 0x58, 0x19, 0x0f, 0x10, 0xda, 0x70, 0x5a, 0xad, 0xc0, 0xd6, 0x50, 0xc8, 0x22, 0x8c, + 0xda, 0x3e, 0x17, 0x70, 0x79, 0xec, 0x72, 0xe1, 0xfa, 0xf8, 0xc2, 0x69, 0x31, 0x0d, 0x25, 0xb8, + 0x76, 0xf6, 0xe8, 0xb0, 0x42, 0x02, 0xf1, 0x4b, 0xef, 0xa5, 0xc4, 0x20, 0x15, 0x18, 0xd9, 0xf0, + 0x17, 0x9d, 0xe6, 0x3e, 0x2d, 0x03, 0xce, 0xbd, 0xa1, 0xa3, 0xc3, 0x4a, 0xe1, 0x7b, 0xb6, 0x84, + 0x92, 0xa7, 0x30, 0x1e, 0x0f, 0x54, 0x58, 0x1e, 0x47, 0xf1, 0x6d, 0x1f, 0x1d, 0x56, 0xce, 0x86, + 0x08, 0x6e, 0xb0, 0xa1, 0xd7, 0x24, 0xf8, 0x12, 0xb3, 0x40, 0xaf, 0x88, 0x7c, 0x0d, 0xb3, 0xf1, + 0xcf, 0x6a, 0x18, 0xd2, 0x80, 0xf1, 0x58, 0x5d, 0x2a, 0x4f, 0xa2, 0x64, 0x5e, 0x3f, 0x3a, 0xac, + 0x58, 0x5a, 0x0b, 0x1a, 0x8e, 0x44, 0x69, 0xb8, 0x2d, 0xad, 0xa7, 0xd9, 0x4c, 0xee, 0x0f, 0x8e, + 0x4e, 0x94, 0x26, 0xed, 0x8b, 0x3b, 0x5e, 0x18, 0x39, 0x8f, 0xda, 0x34, 0x13, 0xc9, 0xfa, 0xab, + 0x02, 0x90, 0xcd, 0x0e, 0xf5, 0xea, 0xf5, 0x15, 0xf6, 0x3d, 0xc9, 0xcf, 0xe9, 0x4d, 0x18, 0xe3, + 0x03, 0xc7, 0x46, 0xb7, 0x88, 0xa3, 0x3b, 0x75, 0x74, 0x58, 0x01, 0x31, 0xba, 0x6c, 0x64, 0x63, + 0x04, 0x72, 0x0d, 0x06, 0xb6, 0xb7, 0xd7, 0xf0, 0x5b, 0x19, 0xa8, 0x4d, 0x1f, 0x1d, 0x56, 0x06, + 0xa2, 0xa8, 0xfd, 0xf3, 0xc3, 0xca, 0xe8, 0x52, 0x37, 0x40, 0xb1, 0xd8, 0xac, 0x9c, 0x5c, 0x83, + 0x91, 0xc5, 0x76, 0x37, 0x8c, 0x68, 0x50, 0x1e, 0x8c, 0x3f, 0xd2, 0x26, 0x07, 0xd9, 0xb2, 0x8c, + 0x7c, 0x17, 0x06, 0x77, 0x42, 0x1a, 0x94, 0x87, 0x70, 0xbc, 0x27, 0xc5, 0x78, 0x33, 0xd0, 0xee, + 0x42, 0x6d, 0x94, 0x7d, 0x89, 0xdd, 0x90, 0x06, 0x36, 0x22, 0x91, 0x9b, 0x30, 0xc4, 0x07, 0x6d, + 0x18, 0x17, 0xa9, 0x49, 0x35, 0x3b, 0xda, 0x74, 0xf7, 0xdd, 0xda, 0xd8, 0xd1, 0x61, 0x65, 0x08, + 0x07, 0xcf, 0xe6, 0x68, 0xf7, 0x07, 0x47, 0x0b, 0xa5, 0xa2, 0x3d, 0xca, 0x68, 0xd9, 0x67, 0x61, + 0x7d, 0x17, 0xc6, 0xb5, 0xee, 0x93, 0x0b, 0x30, 0xc8, 0xfe, 0xc7, 0x45, 0x64, 0x82, 0x57, 0xc6, + 0x36, 0x0e, 0x1b, 0xa1, 0xd6, 0xdf, 0x9f, 0x86, 0x12, 0xa3, 0x34, 0x56, 0x9e, 0x9b, 0xba, 0xa8, + 0x38, 0x5d, 0xc9, 0x14, 0x55, 0xb9, 0xa0, 0x0b, 0xeb, 0x3a, 0xa8, 0xda, 0xc5, 0x22, 0x34, 0x71, + 0x74, 0x58, 0x19, 0xed, 0x0a, 0x58, 0xdc, 0x36, 0x52, 0x87, 0x91, 0xe5, 0x6f, 0x3a, 0x6e, 0x40, + 0x43, 0x14, 0xed, 0xf8, 0xc2, 0xfc, 0x4d, 0xbe, 0x5d, 0xde, 0x94, 0xdb, 0xe5, 0xcd, 0x6d, 0xb9, + 0x5d, 0xd6, 0x2e, 0x8a, 0xc5, 0xf8, 0x0c, 0xe5, 0x24, 0xf1, 0xfc, 0xf8, 0xed, 0x3f, 0xaf, 0x14, + 0x6c, 0xc9, 0x89, 0xbc, 0x09, 0xc3, 0x77, 0xfd, 0xe0, 0xc0, 0x89, 0xc4, 0x18, 0xcc, 0x1c, 0x1d, + 0x56, 0x4a, 0x8f, 0x11, 0xa2, 0x4d, 0x29, 0x81, 0x43, 0xee, 0xc2, 0x94, 0xed, 0x77, 0x23, 0xba, + 0xed, 0xcb, 0x91, 0x1b, 0x42, 0xaa, 0x4b, 0x47, 0x87, 0x95, 0xf9, 0x80, 0x95, 0x34, 0x22, 0xbf, + 0x21, 0x86, 0x50, 0xa3, 0x4f, 0x50, 0x91, 0x65, 0x98, 0xaa, 0xe2, 0xea, 0x2d, 0xa4, 0xc6, 0xc7, + 0x6b, 0xac, 0x76, 0xf1, 0xe8, 0xb0, 0x72, 0xce, 0xc1, 0x92, 0x46, 0x20, 0x8a, 0x74, 0x36, 0x26, + 0x11, 0xd9, 0x80, 0x33, 0x0f, 0xba, 0x8f, 0x68, 0xe0, 0xd1, 0x88, 0x86, 0xb2, 0x45, 0x23, 0xd8, + 0xa2, 0xcb, 0x47, 0x87, 0x95, 0x0b, 0x4f, 0x54, 0x61, 0x46, 0x9b, 0xd2, 0xa4, 0x84, 0xc2, 0x69, + 0xd1, 0xd0, 0x25, 0x27, 0x72, 0x1e, 0x39, 0x21, 0xc5, 0x45, 0x69, 0x7c, 0xe1, 0x2c, 0x17, 0xf1, + 0xcd, 0x44, 0x69, 0xed, 0xaa, 0x90, 0xf2, 0x79, 0xd5, 0xf7, 0x96, 0x28, 0xd2, 0x2a, 0x4a, 0xf2, + 0x64, 0x6b, 0xb3, 0xda, 0x77, 0xc6, 0xb0, 0xb5, 0xb8, 0x36, 0xab, 0x7d, 0x47, 0x5f, 0xb5, 0xd4, + 0x0e, 0xb4, 0x06, 0x43, 0x3b, 0x6c, 0x77, 0xc6, 0x35, 0x6b, 0x6a, 0xe1, 0x8a, 0x68, 0x51, 0x72, + 0xfe, 0xdd, 0x64, 0x3f, 0x10, 0x11, 0xbf, 0xbc, 0xd3, 0xb8, 0xa3, 0xeb, 0x7b, 0x31, 0x96, 0x91, + 0xcf, 0x00, 0x44, 0xab, 0xaa, 0x9d, 0x4e, 0x79, 0x1c, 0x3b, 0x79, 0xc6, 0xec, 0x64, 0xb5, 0xd3, + 0xa9, 0x5d, 0x12, 0xfd, 0x3b, 0xab, 0xfa, 0xe7, 0x74, 0x3a, 0x1a, 0x37, 0x8d, 0x09, 0xf9, 0x04, + 0x26, 0x70, 0x49, 0x93, 0x23, 0x3a, 0x81, 0x23, 0x7a, 0xfe, 0xe8, 0xb0, 0x32, 0x87, 0xab, 0x55, + 0xc6, 0x78, 0x1a, 0x04, 0xe4, 0xd7, 0x60, 0x56, 0xb0, 0x7b, 0xe8, 0x7a, 0x2d, 0xff, 0x59, 0xb8, + 0x44, 0xc3, 0x27, 0x91, 0xdf, 0xc1, 0xe5, 0x6f, 0x7c, 0xe1, 0x82, 0xd9, 0x3c, 0x13, 0xa7, 0x76, + 0x43, 0xb4, 0xd4, 0x52, 0x2d, 0x7d, 0xc6, 0x11, 0x1a, 0x2d, 0x8e, 0xa1, 0x2f, 0x90, 0x99, 0x2c, + 0xc8, 0x2a, 0x9c, 0xde, 0x09, 0xa9, 0xd1, 0x87, 0x29, 0xdc, 0x1f, 0x2a, 0x6c, 0x84, 0xbb, 0x21, + 0x6d, 0xe4, 0xf5, 0x23, 0x49, 0x47, 0x6c, 0x20, 0x4b, 0x81, 0xdf, 0x49, 0xcc, 0xf1, 0xd3, 0x28, + 0x11, 0xeb, 0xe8, 0xb0, 0x72, 0xa9, 0x15, 0xf8, 0x9d, 0x46, 0xfe, 0x44, 0xcf, 0xa0, 0x26, 0x3f, + 0x84, 0xb3, 0x8b, 0xbe, 0xe7, 0xd1, 0x26, 0x5b, 0x41, 0x97, 0x5c, 0x67, 0xcf, 0xf3, 0xc3, 0xc8, + 0x6d, 0xae, 0x2e, 0x95, 0x4b, 0xf1, 0xf6, 0xd0, 0x54, 0x18, 0x8d, 0x96, 0x42, 0x31, 0xb7, 0x87, + 0x1c, 0x2e, 0xe4, 0x2b, 0x98, 0x14, 0x75, 0xd1, 0x00, 0xa7, 0xe6, 0x99, 0xde, 0x13, 0x4d, 0x21, + 0xf3, 0x8d, 0x3e, 0x90, 0x3f, 0xb9, 0xea, 0x64, 0xf2, 0x22, 0x5f, 0xc3, 0xf8, 0xfa, 0xdd, 0xaa, + 0x4d, 0xc3, 0x8e, 0xef, 0x85, 0xb4, 0x4c, 0x70, 0x44, 0x2f, 0x09, 0xd6, 0xeb, 0x77, 0xab, 0xd5, + 0x6e, 0xb4, 0x4f, 0xbd, 0xc8, 0x6d, 0x3a, 0x11, 0x95, 0x58, 0xb5, 0x79, 0x36, 0xf3, 0x0e, 0x1e, + 0x3b, 0x8d, 0x40, 0x40, 0xb4, 0x5e, 0xe8, 0xec, 0xc8, 0x3c, 0x8c, 0xd6, 0xeb, 0x2b, 0x6b, 0xfe, + 0x9e, 0xeb, 0x95, 0xa7, 0x99, 0x30, 0x6c, 0xf5, 0x9b, 0x3c, 0x86, 0x59, 0xed, 0x6c, 0xd0, 0x60, + 0xff, 0xd3, 0x03, 0xea, 0x45, 0xe5, 0x19, 0x6c, 0xc3, 0xf7, 0xd4, 0xe1, 0xe6, 0xa6, 0x7e, 0x84, + 0x78, 0x7a, 0xe7, 0x66, 0x35, 0xfe, 0x59, 0x97, 0x44, 0xb5, 0x62, 0xb9, 0x60, 0xcf, 0x38, 0x19, + 0x25, 0x64, 0x1b, 0x46, 0xb6, 0xba, 0x41, 0xc7, 0x0f, 0x69, 0x79, 0x16, 0x05, 0x77, 0xb5, 0xd7, + 0x17, 0x2a, 0x50, 0x6b, 0xb3, 0x6c, 0x89, 0xee, 0xf0, 0x1f, 0x5a, 0xef, 0x24, 0x2b, 0xf2, 0x29, + 0x4c, 0xd4, 0xeb, 0x2b, 0xf1, 0x86, 0x72, 0x16, 0x37, 0x94, 0x0b, 0x47, 0x87, 0x95, 0x32, 0x53, + 0xa9, 0xe2, 0x4d, 0x45, 0xff, 0xaa, 0x74, 0x0a, 0xc6, 0x61, 0x7b, 0xad, 0x1e, 0x73, 0x98, 0x8b, + 0x39, 0x30, 0x65, 0x2e, 0x9b, 0x83, 0x4e, 0x41, 0xfe, 0x69, 0x01, 0x2e, 0xeb, 0x2c, 0xb3, 0x04, + 0x53, 0x3e, 0xf7, 0x22, 0xd2, 0x5c, 0x38, 0x3a, 0xac, 0xdc, 0x34, 0xfb, 0xd1, 0xc8, 0x1c, 0x2c, + 0xad, 0x6d, 0x7d, 0x9b, 0x82, 0xed, 0xd5, 0x3b, 0x90, 0xd9, 0xde, 0xf9, 0x17, 0x6e, 0xaf, 0x29, + 0xb5, 0xfe, 0xed, 0xed, 0xd7, 0x14, 0xeb, 0x73, 0x18, 0x53, 0x8b, 0x36, 0x19, 0x81, 0x81, 0x6a, + 0xbb, 0x5d, 0x3a, 0xc5, 0xfe, 0xa8, 0xd7, 0x57, 0x4a, 0x05, 0x32, 0x05, 0x10, 0xef, 0x54, 0xa5, + 0x22, 0x99, 0x80, 0x51, 0xb9, 0x93, 0x94, 0x06, 0x10, 0xbf, 0xd3, 0x29, 0x0d, 0x12, 0x02, 0x53, + 0xe6, 0x7a, 0x56, 0x1a, 0xb2, 0x7e, 0xa7, 0x00, 0x63, 0xea, 0x3b, 0x24, 0xa7, 0x61, 0x7c, 0x67, + 0xa3, 0xbe, 0xb5, 0xbc, 0xb8, 0x7a, 0x77, 0x75, 0x79, 0xa9, 0x74, 0x8a, 0x5c, 0x84, 0x73, 0xdb, + 0xf5, 0x95, 0xc6, 0x52, 0xad, 0xb1, 0xb6, 0xb9, 0x58, 0x5d, 0x6b, 0x6c, 0xd9, 0x9b, 0x9f, 0x7f, + 0xd1, 0xd8, 0xde, 0xd9, 0xd8, 0x58, 0x5e, 0x2b, 0x15, 0x48, 0x19, 0x66, 0x58, 0xf1, 0x83, 0x9d, + 0xda, 0xb2, 0x8e, 0x50, 0x2a, 0x92, 0x2b, 0x70, 0x31, 0xab, 0xa4, 0xb1, 0xb2, 0x5c, 0x5d, 0x5a, + 0x5b, 0xae, 0xd7, 0x4b, 0x03, 0x64, 0x0e, 0xa6, 0x19, 0x4a, 0x75, 0x6b, 0xcb, 0xa0, 0x1d, 0xb4, + 0xda, 0x30, 0xae, 0x7d, 0x00, 0xe4, 0x02, 0x94, 0x17, 0x97, 0xed, 0xed, 0xc6, 0xd6, 0x8e, 0xbd, + 0xb5, 0x59, 0x5f, 0x6e, 0x98, 0x2d, 0x4c, 0x96, 0xae, 0x6d, 0xde, 0x5b, 0xdd, 0x68, 0x30, 0x50, + 0xbd, 0x54, 0x60, 0xcd, 0x30, 0x4a, 0xeb, 0xab, 0x1b, 0xf7, 0xd6, 0x96, 0x1b, 0x3b, 0xf5, 0x65, + 0x81, 0x52, 0xb4, 0x7e, 0xa3, 0x98, 0xda, 0xd2, 0xc9, 0x02, 0x8c, 0xd7, 0xb9, 0xbd, 0x02, 0x97, + 0x39, 0x7e, 0x40, 0x64, 0x3a, 0xda, 0x84, 0x30, 0x63, 0xf0, 0x15, 0x4c, 0x47, 0x62, 0x5a, 0xda, + 0x16, 0xfb, 0x9a, 0x9b, 0x7e, 0x5b, 0xd7, 0xd2, 0x3a, 0x02, 0x66, 0xab, 0x52, 0xb2, 0xa0, 0xe9, + 0x73, 0xfc, 0xb4, 0x88, 0x27, 0x12, 0xa9, 0xcf, 0xe9, 0x7b, 0xbb, 0xd2, 0xec, 0x16, 0xe2, 0x21, + 0x15, 0x6a, 0x18, 0xd2, 0x64, 0xe8, 0x12, 0x0a, 0x8f, 0xbc, 0x21, 0x35, 0x5d, 0x7e, 0xba, 0xc3, + 0xcd, 0x3e, 0x71, 0x2e, 0x11, 0x4a, 0xae, 0xd5, 0xcd, 0xd9, 0x58, 0xc9, 0x87, 0xc9, 0x39, 0x23, + 0x84, 0x81, 0xcc, 0x12, 0xfb, 0xa7, 0x9d, 0x40, 0x25, 0x15, 0x18, 0xe2, 0x2b, 0x2e, 0x97, 0x07, + 0xea, 0xd6, 0x6d, 0x06, 0xb0, 0x39, 0xdc, 0xfa, 0xe3, 0x01, 0x5d, 0xc9, 0x60, 0xba, 0xb4, 0x26, + 0x6f, 0xd4, 0xa5, 0x51, 0xce, 0x08, 0x65, 0x47, 0x41, 0xfe, 0x95, 0xe0, 0x51, 0x70, 0x20, 0x3e, + 0x0a, 0x8a, 0x4f, 0x8d, 0x1f, 0x05, 0x63, 0x14, 0x36, 0x8a, 0x42, 0x6d, 0x43, 0xae, 0x83, 0xf1, + 0x28, 0x0a, 0x55, 0x4f, 0x8c, 0xa2, 0x86, 0x44, 0x3e, 0x00, 0xa8, 0x3e, 0xac, 0xe3, 0x99, 0xc7, + 0xde, 0x10, 0xaa, 0x2b, 0x6e, 0x32, 0xce, 0xb3, 0x50, 0x1c, 0xa9, 0x02, 0xfd, 0xcc, 0xa8, 0x61, + 0x93, 0x1a, 0x4c, 0x56, 0x7f, 0xd2, 0x0d, 0xe8, 0x6a, 0x8b, 0xed, 0x53, 0x11, 0x3f, 0x1c, 0x8f, + 0xf1, 0x85, 0xd4, 0x61, 0x05, 0x0d, 0x57, 0x94, 0x68, 0x0c, 0x4c, 0x12, 0xb2, 0x09, 0x67, 0xee, + 0x2d, 0x6e, 0x89, 0x79, 0x55, 0x6d, 0x36, 0xfd, 0xae, 0x17, 0x09, 0x7d, 0xf5, 0xca, 0xd1, 0x61, + 0xe5, 0xe2, 0x5e, 0xb3, 0xd3, 0x90, 0x73, 0xd0, 0xe1, 0xc5, 0xba, 0xc2, 0x9a, 0xa2, 0x25, 0x57, + 0x61, 0x60, 0xc7, 0x5e, 0x15, 0x27, 0xe7, 0x33, 0x47, 0x87, 0x95, 0xc9, 0x6e, 0xe0, 0x6a, 0x24, + 0xac, 0x94, 0xbc, 0x0f, 0xb0, 0xed, 0x04, 0x7b, 0x34, 0xda, 0xf2, 0x83, 0x08, 0x15, 0xce, 0xc9, + 0xda, 0xb9, 0xa3, 0xc3, 0xca, 0x6c, 0x84, 0xd0, 0x06, 0x5b, 0xfe, 0xf4, 0x4e, 0xc7, 0xc8, 0xf7, + 0x07, 0x47, 0x8b, 0xa5, 0x01, 0x7b, 0xac, 0x4e, 0xc3, 0x90, 0x9f, 0x0f, 0xdb, 0x30, 0x75, 0x8f, + 0x46, 0x6c, 0xe2, 0xca, 0xf3, 0x4e, 0xef, 0x61, 0xfd, 0x08, 0xc6, 0x1f, 0xba, 0xd1, 0x7e, 0x9d, + 0x36, 0x03, 0x1a, 0x49, 0x5b, 0x0f, 0x8a, 0xfc, 0x99, 0x1b, 0xed, 0x37, 0x42, 0x0e, 0xd7, 0xf7, + 0x75, 0x0d, 0xdd, 0x5a, 0x86, 0xd3, 0xa2, 0x36, 0x75, 0xbc, 0x5a, 0x30, 0x19, 0x16, 0x90, 0x21, + 0x0e, 0xbb, 0xce, 0xd0, 0x64, 0xf3, 0xcf, 0x8a, 0x30, 0xbb, 0xb8, 0xef, 0x78, 0x7b, 0x74, 0xcb, + 0x09, 0xc3, 0x67, 0x7e, 0xd0, 0xd2, 0x1a, 0x8f, 0x67, 0xcb, 0x54, 0xe3, 0xf1, 0x30, 0xb9, 0x00, + 0xe3, 0x9b, 0xed, 0x96, 0xa4, 0x11, 0xe7, 0x5e, 0xac, 0xcb, 0x6f, 0xb7, 0x1a, 0x1d, 0xc9, 0x4b, + 0x47, 0x62, 0x34, 0x1b, 0xf4, 0x99, 0xa2, 0x19, 0x88, 0x69, 0x3c, 0xfa, 0x4c, 0xa3, 0xd1, 0x90, + 0xc8, 0x32, 0x9c, 0xa9, 0xd3, 0xa6, 0xef, 0xb5, 0xee, 0x3a, 0xcd, 0xc8, 0x0f, 0xb6, 0xfd, 0x27, + 0xd4, 0x13, 0x13, 0x1a, 0x0f, 0x06, 0x21, 0x16, 0x36, 0x1e, 0x63, 0x69, 0x23, 0x62, 0xc5, 0x76, + 0x9a, 0x82, 0x6c, 0xc2, 0xe8, 0x43, 0x61, 0x31, 0x14, 0x87, 0xe5, 0x6b, 0x37, 0x95, 0x09, 0x71, + 0x31, 0xa0, 0x38, 0x0b, 0x9d, 0xb6, 0x3a, 0xee, 0x2b, 0x3d, 0x0b, 0x97, 0x32, 0x89, 0x69, 0x2b, + 0x26, 0xd6, 0x0e, 0x4c, 0x6e, 0xb5, 0xbb, 0x7b, 0xae, 0xc7, 0x16, 0x9d, 0x3a, 0xfd, 0x31, 0x59, + 0x02, 0x88, 0x01, 0xc2, 0x0e, 0x38, 0x2d, 0x8e, 0xd8, 0x71, 0xc1, 0xee, 0x5b, 0xe2, 0xcb, 0x45, + 0x08, 0x9e, 0x88, 0x6c, 0x8d, 0xce, 0xfa, 0x1f, 0x03, 0x40, 0xc4, 0x00, 0xe0, 0x26, 0x58, 0xa7, + 0x11, 0xdb, 0x9e, 0xce, 0x42, 0x51, 0x99, 0xeb, 0x86, 0x8f, 0x0e, 0x2b, 0x45, 0xb7, 0x65, 0x17, + 0x57, 0x97, 0xc8, 0xdb, 0x30, 0x84, 0x68, 0x28, 0xff, 0x29, 0x55, 0x9f, 0xce, 0x81, 0x2f, 0x3e, + 0xb8, 0xfb, 0xda, 0x1c, 0x99, 0xbc, 0x03, 0x63, 0x4b, 0xb4, 0x4d, 0xf7, 0x9c, 0xc8, 0x97, 0xcb, + 0x09, 0x37, 0x80, 0x49, 0xa0, 0x36, 0xe7, 0x62, 0x4c, 0x76, 0x1c, 0xb6, 0xa9, 0x13, 0xfa, 0x9e, + 0x7e, 0x1c, 0x0e, 0x10, 0xa2, 0x1f, 0x87, 0x39, 0x0e, 0xf9, 0x5b, 0x05, 0x18, 0xaf, 0x7a, 0x9e, + 0x30, 0x2c, 0x85, 0x42, 0xea, 0xb3, 0x37, 0x95, 0x25, 0x76, 0xcd, 0x79, 0x44, 0xdb, 0xbb, 0x4e, + 0xbb, 0x4b, 0xc3, 0xda, 0xd7, 0xec, 0x84, 0xf2, 0xef, 0x0e, 0x2b, 0x1f, 0x9e, 0xc0, 0x54, 0x14, + 0xdb, 0x74, 0xb7, 0x03, 0xc7, 0x8d, 0x42, 0xf6, 0xd5, 0x3a, 0x71, 0x85, 0xfa, 0x77, 0xa3, 0xb5, + 0x23, 0xde, 0x1b, 0x86, 0xfb, 0xed, 0x0d, 0xe4, 0x00, 0x4e, 0x57, 0xc3, 0xb0, 0x7b, 0x40, 0xeb, + 0x91, 0x13, 0x44, 0xdb, 0xee, 0x01, 0xc5, 0x05, 0xa9, 0xb7, 0x71, 0xe1, 0x3b, 0x3f, 0x3d, 0xac, + 0x14, 0xd8, 0xa1, 0xc8, 0x41, 0x52, 0xa6, 0xf7, 0x04, 0x51, 0x23, 0x72, 0xf5, 0xed, 0x0d, 0xcd, + 0x0c, 0x49, 0xde, 0xd6, 0x55, 0xa5, 0x90, 0xac, 0x2e, 0xe5, 0x8d, 0xb8, 0xb5, 0x08, 0x17, 0xee, + 0xd1, 0xc8, 0xa6, 0x21, 0x8d, 0xe4, 0x37, 0x82, 0x33, 0x3c, 0x36, 0xee, 0x8e, 0xe0, 0x6f, 0x45, + 0x8c, 0xc3, 0xcf, 0xbf, 0x0b, 0x59, 0x62, 0xfd, 0x1f, 0x05, 0xa8, 0x2c, 0x06, 0x94, 0x9f, 0x27, + 0x72, 0x18, 0xf5, 0x5e, 0xbb, 0x2e, 0xc0, 0xe0, 0xf6, 0xf3, 0x8e, 0xb4, 0xca, 0x60, 0x29, 0x1b, + 0x14, 0x1b, 0xa1, 0xc7, 0x34, 0x72, 0x59, 0x8f, 0x61, 0xd6, 0xa6, 0x1e, 0x7d, 0xe6, 0x3c, 0x6a, + 0x53, 0xc3, 0x4e, 0x54, 0x81, 0x21, 0xfe, 0xa1, 0xa7, 0xba, 0xc0, 0xe1, 0x27, 0xb3, 0xb9, 0x59, + 0x93, 0x30, 0xbe, 0xe5, 0x7a, 0x7b, 0x82, 0xbb, 0xf5, 0x17, 0x83, 0x30, 0xc1, 0x7f, 0x8b, 0x23, + 0x52, 0x62, 0xbb, 0x2c, 0x1c, 0x67, 0xbb, 0x7c, 0x0f, 0x26, 0xd9, 0x7e, 0x43, 0x83, 0x5d, 0x1a, + 0xb0, 0xf5, 0x5f, 0x48, 0x02, 0x8f, 0x7b, 0x21, 0x16, 0x34, 0x9e, 0xf2, 0x12, 0xdb, 0x44, 0x24, + 0x6b, 0x30, 0xc5, 0x01, 0x77, 0xa9, 0x13, 0x75, 0x63, 0x8b, 0xd5, 0x69, 0x71, 0x26, 0x92, 0x60, + 0x3e, 0x35, 0x05, 0xaf, 0xc7, 0x02, 0x68, 0x27, 0x68, 0xc9, 0x27, 0x70, 0x7a, 0x2b, 0xf0, 0xbf, + 0x79, 0xae, 0x29, 0x08, 0xfc, 0xeb, 0xe4, 0xa7, 0x27, 0x56, 0xd4, 0xd0, 0xd5, 0x84, 0x24, 0x36, + 0x79, 0x03, 0x46, 0x57, 0xc3, 0x9a, 0x1f, 0xb8, 0xde, 0x1e, 0x7e, 0xa3, 0xa3, 0xdc, 0xd0, 0xef, + 0x86, 0x8d, 0x47, 0x08, 0xb4, 0x55, 0x71, 0xc2, 0x24, 0x3d, 0xd2, 0xdf, 0x24, 0x7d, 0x1b, 0x60, + 0xcd, 0x77, 0x5a, 0xd5, 0x76, 0x7b, 0xb1, 0x1a, 0xe2, 0x4e, 0x2c, 0xf6, 0xa3, 0xb6, 0xef, 0xb4, + 0x1a, 0x4e, 0xbb, 0xdd, 0x68, 0x3a, 0xa1, 0xad, 0xe1, 0x90, 0x2f, 0xe1, 0x5c, 0xe8, 0xee, 0x79, + 0xd8, 0xb9, 0x86, 0xd3, 0xde, 0xf3, 0x03, 0x37, 0xda, 0x3f, 0x68, 0x84, 0x5d, 0x37, 0xe2, 0xf6, + 0xa0, 0xa9, 0x85, 0x4b, 0x62, 0x91, 0xab, 0x4b, 0xbc, 0xaa, 0x44, 0xab, 0x33, 0x2c, 0x7b, 0x2e, + 0xcc, 0x2e, 0x20, 0x0f, 0x61, 0x72, 0xcd, 0x6d, 0x52, 0x2f, 0xa4, 0x68, 0xe0, 0x7b, 0x8e, 0xd6, + 0xa2, 0xde, 0x1f, 0x33, 0x13, 0xe2, 0x64, 0x5b, 0x27, 0xc2, 0x4f, 0xd7, 0xe4, 0x73, 0x7f, 0x70, + 0x74, 0xb8, 0x34, 0x62, 0x9f, 0x16, 0xc0, 0x87, 0x4e, 0xe0, 0xb9, 0xde, 0x5e, 0x68, 0xfd, 0xbf, + 0x04, 0x46, 0xd5, 0x38, 0xdd, 0xd4, 0x4f, 0x2a, 0x62, 0x6b, 0xc6, 0x29, 0x1b, 0xdb, 0xe1, 0x6c, + 0x0d, 0x83, 0x9c, 0xc3, 0xb3, 0x8b, 0x50, 0x0a, 0x46, 0xd8, 0x27, 0xe4, 0x74, 0x3a, 0x36, 0x83, + 0xb1, 0xa5, 0x61, 0xa9, 0x86, 0x93, 0x66, 0x94, 0x2f, 0x0d, 0xad, 0x47, 0x76, 0x71, 0xa9, 0xc6, + 0xbe, 0xc9, 0xcd, 0xd5, 0xa5, 0x45, 0x1c, 0xff, 0x51, 0xfe, 0x4d, 0xfa, 0x6e, 0xab, 0x69, 0x23, + 0x94, 0x95, 0xd6, 0xab, 0xeb, 0x6b, 0x62, 0x8c, 0xb1, 0x34, 0x74, 0x0e, 0xda, 0x36, 0x42, 0x99, + 0xb6, 0xcb, 0x4d, 0x2a, 0x8b, 0xbe, 0x17, 0x05, 0x7e, 0x3b, 0x44, 0x15, 0x6e, 0x94, 0xcf, 0x41, + 0x61, 0x8b, 0x69, 0x8a, 0x22, 0x3b, 0x81, 0x4a, 0x1e, 0xc2, 0x5c, 0xb5, 0xf5, 0xd4, 0xf1, 0x9a, + 0xb4, 0xc5, 0x4b, 0x1e, 0xfa, 0xc1, 0x93, 0xc7, 0x6d, 0xff, 0x59, 0x88, 0x93, 0x64, 0x54, 0x98, + 0x2e, 0x05, 0x8a, 0x34, 0xed, 0x3c, 0x93, 0x48, 0x76, 0x1e, 0x35, 0x5b, 0x07, 0x16, 0xdb, 0x7e, + 0xb7, 0x25, 0xa6, 0x0e, 0xae, 0x03, 0x4d, 0x06, 0xb0, 0x39, 0x9c, 0x49, 0x69, 0xa5, 0xbe, 0x8e, + 0x13, 0x43, 0x48, 0x69, 0x3f, 0x3c, 0xb0, 0x19, 0x8c, 0x5c, 0x83, 0x11, 0xa9, 0xb8, 0xf3, 0x9b, + 0x0c, 0xb4, 0xa0, 0x4b, 0x85, 0x5d, 0x96, 0xb1, 0xef, 0xd8, 0xa6, 0x4d, 0xff, 0x29, 0x0d, 0x9e, + 0x2f, 0xfa, 0x2d, 0x2a, 0xcd, 0x5a, 0xc2, 0x6c, 0xc3, 0x0b, 0x1a, 0x4d, 0x56, 0x62, 0x9b, 0x88, + 0xac, 0x02, 0xbe, 0x71, 0x87, 0xe5, 0xd3, 0x71, 0x05, 0x7c, 0x63, 0x0f, 0x6d, 0x59, 0x46, 0x96, + 0xe0, 0x4c, 0xb5, 0x1b, 0xf9, 0x07, 0x4e, 0xe4, 0x36, 0x77, 0x3a, 0x7b, 0x81, 0xc3, 0x2a, 0x29, + 0x21, 0x01, 0x1e, 0x64, 0x1c, 0x59, 0xd8, 0xe8, 0x8a, 0x52, 0x3b, 0x4d, 0x40, 0xde, 0x85, 0x89, + 0xd5, 0x90, 0x9b, 0x2e, 0x9d, 0x90, 0xb6, 0xd0, 0xfe, 0x24, 0x5a, 0xe9, 0x86, 0x0d, 0x34, 0x64, + 0x36, 0xd8, 0xd1, 0xa7, 0x65, 0x1b, 0x78, 0xc4, 0x82, 0xe1, 0x6a, 0x18, 0xba, 0x61, 0x84, 0x66, + 0xa5, 0xd1, 0x1a, 0x1c, 0x1d, 0x56, 0x86, 0x1d, 0x84, 0xd8, 0xa2, 0x84, 0x3c, 0x84, 0xf1, 0x25, + 0xca, 0x34, 0xe7, 0xed, 0xa0, 0x1b, 0x46, 0x68, 0x24, 0x1a, 0x5f, 0x38, 0x27, 0x56, 0x23, 0xad, + 0x44, 0xcc, 0x65, 0xae, 0xa2, 0xb6, 0x10, 0xde, 0x88, 0x58, 0x81, 0xbe, 0xd5, 0x6a, 0xf8, 0xec, + 0x58, 0x20, 0x68, 0x56, 0xdc, 0x16, 0x5b, 0x5f, 0x66, 0xb0, 0x0d, 0x78, 0x2c, 0x10, 0x0b, 0x5a, + 0x63, 0x1f, 0x4b, 0xf4, 0x63, 0x81, 0x41, 0x42, 0x9a, 0x29, 0x6b, 0xf8, 0xac, 0x61, 0xf1, 0x34, + 0x0b, 0x65, 0x13, 0x4f, 0x68, 0x2b, 0xff, 0x08, 0xc6, 0x17, 0xbb, 0x61, 0xe4, 0x1f, 0x6c, 0xef, + 0xd3, 0x03, 0x8a, 0x86, 0x24, 0x71, 0xf8, 0x69, 0x22, 0xb8, 0x11, 0x31, 0xb8, 0xde, 0x4d, 0x0d, + 0x9d, 0x7c, 0x06, 0x44, 0x9e, 0x62, 0xee, 0xb1, 0xf9, 0xe1, 0xb1, 0xb9, 0x8c, 0xb6, 0xa4, 0x51, + 0x7e, 0x74, 0x91, 0x87, 0x9f, 0xc6, 0x9e, 0x2a, 0xd6, 0xed, 0x99, 0x69, 0x62, 0xd6, 0x20, 0xde, + 0xc4, 0x7b, 0x81, 0xd3, 0xd9, 0x2f, 0x97, 0xe3, 0xa3, 0x81, 0xe8, 0xd4, 0x1e, 0x83, 0x1b, 0x2a, + 0x4e, 0x8c, 0x4e, 0xea, 0x00, 0xfc, 0xe7, 0x1a, 0x1b, 0x78, 0x6e, 0x7d, 0x2a, 0x1b, 0xf2, 0x62, + 0x05, 0x52, 0x56, 0x78, 0xdc, 0x11, 0x6c, 0xdb, 0xae, 0x31, 0x9a, 0x1a, 0x1b, 0xf2, 0x04, 0x4a, + 0xfc, 0xd7, 0xba, 0xef, 0xb9, 0x11, 0xdf, 0x2f, 0xe6, 0x0d, 0x53, 0x65, 0xb2, 0x58, 0x56, 0x80, + 0x26, 0x62, 0x51, 0xc1, 0x81, 0x2a, 0xd5, 0xaa, 0x49, 0x31, 0x26, 0x5b, 0x30, 0xbe, 0x15, 0xf8, + 0xad, 0x6e, 0x33, 0x42, 0x2d, 0xe3, 0x3c, 0x2e, 0xfc, 0x44, 0xd4, 0xa3, 0x95, 0x70, 0x99, 0x74, + 0x38, 0xa0, 0xc1, 0xf6, 0x05, 0x5d, 0x26, 0x1a, 0x22, 0xa9, 0xc1, 0xf0, 0x96, 0xdf, 0x76, 0x9b, + 0xcf, 0xcb, 0x17, 0xb0, 0xd1, 0x33, 0x92, 0x19, 0x02, 0x65, 0x53, 0x51, 0xa5, 0xed, 0x20, 0x48, + 0x57, 0x69, 0x39, 0x12, 0xa9, 0xc2, 0xe4, 0x67, 0x6c, 0xc2, 0xb8, 0xbe, 0xe7, 0x39, 0x6e, 0x40, + 0xcb, 0x17, 0x71, 0x5c, 0xd0, 0x8c, 0xff, 0x63, 0xbd, 0x40, 0x9f, 0xce, 0x06, 0x05, 0x59, 0x85, + 0xd3, 0xab, 0x61, 0x3d, 0x0a, 0xdc, 0x0e, 0x5d, 0x77, 0x3c, 0x67, 0x8f, 0xb6, 0xca, 0x97, 0x62, + 0x3b, 0xba, 0x1b, 0x36, 0x42, 0x2c, 0x6b, 0x1c, 0xf0, 0x42, 0xdd, 0x8e, 0x9e, 0xa0, 0x23, 0x9f, + 0xc3, 0xcc, 0xf2, 0x37, 0x11, 0x9b, 0x31, 0xed, 0x6a, 0xb7, 0xe5, 0x46, 0xf5, 0xc8, 0x0f, 0x9c, + 0x3d, 0x5a, 0xae, 0x20, 0xbf, 0xd7, 0x8e, 0x0e, 0x2b, 0x97, 0xa9, 0x28, 0x6f, 0x38, 0x0c, 0xa1, + 0x11, 0x72, 0x0c, 0xfd, 0x7e, 0x3c, 0x8b, 0x03, 0x93, 0x7e, 0xbd, 0xdb, 0x61, 0xda, 0x36, 0x4a, + 0xff, 0xb2, 0x21, 0x7d, 0xad, 0x84, 0x4b, 0x3f, 0xe4, 0x80, 0x94, 0xf4, 0x35, 0x44, 0x62, 0x03, + 0xb9, 0xef, 0xbb, 0x5e, 0xb5, 0x19, 0xb9, 0x4f, 0xa9, 0x38, 0x31, 0x87, 0xe5, 0x2b, 0xd8, 0x52, + 0xb4, 0xf9, 0xff, 0xb2, 0xef, 0x7a, 0x0d, 0x07, 0x8b, 0x1b, 0xa1, 0x28, 0xd7, 0xbf, 0x91, 0x34, + 0x35, 0xf9, 0x21, 0x9c, 0x5d, 0xf7, 0x1f, 0xb9, 0x6d, 0xca, 0x97, 0x1c, 0x2e, 0x16, 0xb4, 0x5f, + 0x5a, 0xc8, 0x17, 0x6d, 0xfe, 0x07, 0x88, 0xd1, 0x10, 0xab, 0xd5, 0x81, 0xc2, 0xd1, 0x6d, 0xfe, + 0xd9, 0x5c, 0xc8, 0x32, 0x4c, 0xe0, 0x77, 0xd9, 0xc6, 0x9f, 0x61, 0xf9, 0x2a, 0x1e, 0xe9, 0xae, + 0x24, 0xb4, 0xb4, 0x9b, 0xcb, 0x1a, 0xce, 0xb2, 0x17, 0x05, 0xcf, 0x6d, 0x83, 0x8c, 0x7c, 0x0c, + 0xf3, 0xc9, 0xe9, 0xbd, 0xe8, 0x7b, 0x8f, 0xdd, 0xbd, 0x6e, 0x40, 0x5b, 0xe5, 0xd7, 0x58, 0x53, + 0xed, 0x1e, 0x18, 0xe4, 0x2b, 0x98, 0xc5, 0xbd, 0xae, 0xea, 0xf9, 0xde, 0xf3, 0x03, 0xf7, 0x27, + 0xa8, 0x3f, 0x33, 0xb5, 0xf7, 0x1a, 0xaa, 0xbd, 0xd7, 0x8e, 0x0e, 0x2b, 0x57, 0x70, 0x4f, 0x6c, + 0x38, 0x3a, 0x46, 0xc2, 0x6a, 0x9d, 0xcd, 0x63, 0xfe, 0x21, 0x9c, 0x49, 0xb5, 0x9f, 0x94, 0x60, + 0xe0, 0x89, 0xb8, 0x9f, 0x1d, 0xb3, 0xd9, 0x9f, 0xe4, 0x4d, 0x18, 0x7a, 0xca, 0x0e, 0x6a, 0xa8, + 0x8e, 0xc4, 0x37, 0x7e, 0x1a, 0xe9, 0xaa, 0xf7, 0xd8, 0xb7, 0x39, 0xd2, 0x07, 0xc5, 0xf7, 0x0a, + 0xf7, 0x07, 0x47, 0xc7, 0x4b, 0x13, 0xfc, 0x5a, 0xfd, 0xfe, 0xe0, 0xe8, 0x64, 0x69, 0xca, 0xaa, + 0xc2, 0xe9, 0x04, 0x3e, 0x29, 0xc3, 0x08, 0xf5, 0x98, 0xf2, 0xdf, 0xe2, 0x0a, 0x91, 0x2d, 0x7f, + 0x92, 0x19, 0x18, 0x6a, 0xbb, 0x07, 0x6e, 0x84, 0x15, 0x0e, 0xd9, 0xfc, 0x87, 0xf5, 0xbb, 0x05, + 0x20, 0xe9, 0xfd, 0x88, 0xdc, 0x4a, 0xb0, 0xe1, 0xaa, 0xaf, 0x00, 0xe9, 0x17, 0x07, 0x92, 0xfb, + 0x67, 0x30, 0xcd, 0x27, 0x84, 0xdc, 0x39, 0xb5, 0xba, 0xf8, 0x8a, 0x9d, 0x51, 0xac, 0x1b, 0x9b, + 0x44, 0x31, 0xee, 0xb3, 0x6b, 0xd8, 0xb4, 0x2e, 0xcc, 0x66, 0xee, 0x44, 0x64, 0x1d, 0x66, 0x0f, + 0x7c, 0x2f, 0xda, 0x6f, 0x3f, 0x97, 0x1b, 0x91, 0xa8, 0xad, 0x80, 0xb5, 0xe1, 0xe2, 0x9b, 0x89, + 0x60, 0x4f, 0x0b, 0xb0, 0xe0, 0x88, 0xf5, 0x08, 0xa3, 0x93, 0xec, 0x89, 0x65, 0xc3, 0x99, 0xd4, + 0x82, 0x4e, 0x7e, 0x00, 0x13, 0x4d, 0x3c, 0xdc, 0x19, 0x35, 0xf1, 0xed, 0x4c, 0x83, 0xeb, 0xdf, + 0x2a, 0x87, 0xf3, 0xae, 0xfc, 0xa3, 0x02, 0xcc, 0xe5, 0x2c, 0xe5, 0x27, 0x17, 0xf5, 0x17, 0x70, + 0xf6, 0xc0, 0xf9, 0xa6, 0x11, 0xe0, 0xd9, 0xbd, 0x11, 0x38, 0x5e, 0x42, 0xda, 0xb8, 0x4c, 0x65, + 0x63, 0xe8, 0xbe, 0x4d, 0x07, 0xce, 0x37, 0x36, 0x22, 0xd8, 0xac, 0x9c, 0xb7, 0xf3, 0x53, 0x98, + 0x34, 0x16, 0xef, 0x13, 0x37, 0xce, 0xba, 0x03, 0x67, 0x96, 0x68, 0x9b, 0x46, 0xf4, 0xd8, 0x36, + 0x3b, 0x6b, 0x0b, 0xa0, 0x4e, 0x0f, 0x9c, 0xce, 0xbe, 0xcf, 0x94, 0xfa, 0x9a, 0xfe, 0x4b, 0xd8, + 0x7c, 0x88, 0x3c, 0x9e, 0xc8, 0x82, 0xdd, 0xb7, 0xb8, 0xa2, 0x1f, 0x2a, 0x4c, 0x5b, 0xa3, 0xb2, + 0xfe, 0x75, 0x11, 0x88, 0x58, 0x7d, 0x03, 0xea, 0x1c, 0xc8, 0x66, 0xbc, 0x0f, 0x13, 0xfc, 0x84, + 0xce, 0xc1, 0xd8, 0x9c, 0xf1, 0x85, 0x69, 0xf1, 0xe5, 0xe9, 0x45, 0x2b, 0xa7, 0x6c, 0x03, 0x95, + 0x91, 0xda, 0x94, 0x9b, 0x16, 0x90, 0xb4, 0x68, 0x90, 0xea, 0x45, 0x8c, 0x54, 0xff, 0x4d, 0x3e, + 0x81, 0xa9, 0x45, 0xff, 0xa0, 0xc3, 0x64, 0x22, 0x88, 0x07, 0x84, 0xd9, 0x46, 0xd4, 0x6b, 0x14, + 0xae, 0x9c, 0xb2, 0x13, 0xe8, 0x64, 0x03, 0xa6, 0xef, 0xb6, 0xbb, 0xe1, 0x7e, 0xd5, 0x6b, 0x2d, + 0xb6, 0xfd, 0x50, 0x72, 0x19, 0x14, 0x27, 0x2d, 0xb1, 0x76, 0xa6, 0x31, 0x56, 0x4e, 0xd9, 0x59, + 0x84, 0xe4, 0x1a, 0x0c, 0x2d, 0x3f, 0x65, 0x6b, 0xba, 0xf4, 0x70, 0x11, 0x0e, 0x78, 0x9b, 0x1e, + 0xdd, 0x7c, 0xbc, 0x72, 0xca, 0xe6, 0xa5, 0xb5, 0x31, 0x18, 0x91, 0xa7, 0xfb, 0x5b, 0x4c, 0xdf, + 0x56, 0xe2, 0xac, 0x47, 0x4e, 0xd4, 0x0d, 0xc9, 0x3c, 0x8c, 0xee, 0x74, 0xd8, 0xa1, 0x53, 0x9a, + 0x45, 0x6c, 0xf5, 0xdb, 0x7a, 0xd3, 0x94, 0x34, 0xb9, 0x00, 0xb1, 0x4d, 0x57, 0x20, 0x6b, 0x46, + 0xde, 0x15, 0x53, 0xb8, 0xbd, 0xb1, 0x8d, 0x7a, 0x8b, 0x89, 0x7a, 0x4b, 0x49, 0x59, 0x5b, 0xb3, + 0x99, 0xc2, 0xb3, 0x3e, 0x87, 0x4b, 0x3b, 0x9d, 0x90, 0x06, 0x51, 0xb5, 0xd3, 0x69, 0xbb, 0x4d, + 0x7e, 0x43, 0x86, 0x56, 0x00, 0x39, 0x59, 0xde, 0x85, 0x61, 0x0e, 0x10, 0xd3, 0x44, 0xce, 0xc1, + 0x6a, 0xa7, 0x23, 0x6c, 0x0f, 0x6f, 0x71, 0xcd, 0x9f, 0x5b, 0x13, 0x6c, 0x81, 0x6d, 0xfd, 0x76, + 0x01, 0x2e, 0xf1, 0x2f, 0x20, 0x97, 0xf5, 0x77, 0x61, 0x0c, 0xfd, 0xdf, 0x3a, 0x4e, 0x53, 0x7e, + 0x13, 0xdc, 0x11, 0x50, 0x02, 0xed, 0xb8, 0x5c, 0xf3, 0x2c, 0x2c, 0xe6, 0x7b, 0x16, 0xca, 0x0f, + 0x6c, 0x20, 0xf3, 0x03, 0xfb, 0x0c, 0x2c, 0xd1, 0xa2, 0x76, 0x3b, 0xd5, 0xa8, 0xf0, 0x45, 0x5a, + 0x65, 0xfd, 0xe7, 0x22, 0xcc, 0xdd, 0xa3, 0x1e, 0x0d, 0x1c, 0xec, 0xa7, 0x61, 0xe5, 0xd2, 0x3d, + 0x8c, 0x0a, 0x3d, 0x3d, 0x8c, 0x2a, 0xd2, 0x6e, 0x58, 0x44, 0xbb, 0x61, 0xca, 0x5d, 0x8a, 0x9d, + 0x45, 0x77, 0xec, 0x55, 0xd1, 0x2d, 0x3c, 0x8b, 0x76, 0x03, 0x97, 0xdf, 0x32, 0xac, 0xc6, 0xde, + 0x49, 0x83, 0x7d, 0x6d, 0x0e, 0xd3, 0xc2, 0x5b, 0x63, 0x44, 0x78, 0x27, 0x99, 0x3e, 0x49, 0x1b, + 0x30, 0xcc, 0xcd, 0x9d, 0x78, 0xb7, 0x35, 0xbe, 0x70, 0x43, 0x7c, 0x53, 0x39, 0x1d, 0x14, 0xb6, + 0x51, 0xdc, 0xd8, 0xf9, 0x14, 0x88, 0x10, 0x60, 0x0b, 0x2e, 0xf3, 0x9f, 0xc1, 0xb8, 0x86, 0x72, + 0x9c, 0xbd, 0x5f, 0x99, 0x5d, 0x99, 0x3a, 0xea, 0xed, 0x71, 0x0b, 0xae, 0xb6, 0xf7, 0x5b, 0x1f, + 0x42, 0x39, 0xdd, 0x1a, 0x61, 0x6a, 0xeb, 0x67, 0xd9, 0xb3, 0x96, 0x60, 0xe6, 0x1e, 0x8d, 0x70, + 0xe2, 0xe2, 0x47, 0xa4, 0x79, 0xd9, 0x25, 0xbe, 0x33, 0xb9, 0xaa, 0x22, 0x90, 0x4d, 0x30, 0xed, + 0x2b, 0xad, 0xc3, 0x6c, 0x82, 0x8b, 0xa8, 0xff, 0x03, 0x18, 0x11, 0x20, 0xb5, 0xa2, 0x0a, 0x57, + 0x5d, 0xfa, 0x48, 0x14, 0xec, 0x2e, 0xf0, 0x79, 0x2b, 0x38, 0xdb, 0x92, 0xc0, 0xda, 0x87, 0xb3, + 0x6c, 0x9b, 0x8d, 0xb9, 0xaa, 0xe9, 0x78, 0x1e, 0xc6, 0x3a, 0x4c, 0x51, 0x08, 0xdd, 0x9f, 0xf0, + 0x69, 0x34, 0x64, 0x8f, 0x32, 0x40, 0xdd, 0xfd, 0x09, 0x25, 0x17, 0x01, 0xb0, 0x10, 0xbb, 0x29, + 0x56, 0x01, 0x44, 0xe7, 0xa6, 0x4c, 0x02, 0xe8, 0xa3, 0xc7, 0xe7, 0x8d, 0x8d, 0x7f, 0x5b, 0x01, + 0xcc, 0xa5, 0x6a, 0x12, 0x1d, 0xb8, 0x05, 0xa3, 0x52, 0x3f, 0x4e, 0x5c, 0x32, 0xe8, 0x3d, 0xb0, + 0x15, 0x12, 0x79, 0x1d, 0x4e, 0x7b, 0xf4, 0x9b, 0xa8, 0x91, 0x6a, 0xc3, 0x24, 0x03, 0x6f, 0xc9, + 0x76, 0x58, 0xbf, 0x84, 0x86, 0xe5, 0xba, 0xe7, 0x3f, 0x7b, 0xdc, 0x76, 0x9e, 0xd0, 0x54, 0xc5, + 0x3f, 0x80, 0xd1, 0x7a, 0xff, 0x8a, 0xf9, 0xe7, 0x23, 0x2b, 0xb7, 0x15, 0x89, 0xd5, 0x86, 0x79, + 0xd6, 0xa5, 0x7a, 0x75, 0x7d, 0x6d, 0xb5, 0xb5, 0xf5, 0x6d, 0x0b, 0xf0, 0x29, 0x9c, 0xcf, 0xac, + 0xed, 0xdb, 0x16, 0xe2, 0x1f, 0x0e, 0xc2, 0x1c, 0xdf, 0x4c, 0xd2, 0x33, 0xf8, 0xf8, 0x4b, 0xcd, + 0x2f, 0xe4, 0xbe, 0xf7, 0x76, 0xc6, 0x7d, 0x2f, 0x92, 0xe8, 0xf7, 0xbd, 0xc6, 0x2d, 0xef, 0x7b, + 0xd9, 0xb7, 0xbc, 0x68, 0x84, 0x32, 0x6f, 0x79, 0x93, 0x77, 0xbb, 0xcb, 0xf9, 0x77, 0xbb, 0x78, + 0xf1, 0x94, 0x71, 0xb7, 0x9b, 0x75, 0xa3, 0x9b, 0x70, 0x94, 0x1a, 0x7d, 0xb5, 0x8e, 0x52, 0xaf, + 0xc3, 0x48, 0xb5, 0xd3, 0xd1, 0x1c, 0x0f, 0x71, 0x78, 0x9c, 0x4e, 0x87, 0x0b, 0x4f, 0x16, 0xca, + 0x75, 0x1e, 0x32, 0xd6, 0xf9, 0xf7, 0x01, 0x16, 0xf1, 0x79, 0x04, 0x0e, 0xdc, 0x38, 0x62, 0xa0, + 0x86, 0xcf, 0x1f, 0x4d, 0xe0, 0xc0, 0xe9, 0xe6, 0x95, 0x18, 0x99, 0x2b, 0xf6, 0xd6, 0x2e, 0x94, + 0xd3, 0xd3, 0xe7, 0x15, 0x2c, 0x5d, 0x7f, 0x50, 0x80, 0x8b, 0x42, 0xc9, 0x49, 0x7c, 0xe0, 0x27, + 0x9f, 0x9d, 0xef, 0xc0, 0x84, 0xa0, 0xdd, 0x8e, 0x3f, 0x04, 0x7e, 0xc1, 0x2e, 0x17, 0x63, 0xbe, + 0xa2, 0x1b, 0x68, 0xe4, 0x1d, 0x18, 0xc5, 0x3f, 0xe2, 0x8b, 0x21, 0x26, 0x99, 0x31, 0x44, 0x6d, + 0x24, 0xaf, 0x87, 0x14, 0xaa, 0xf5, 0x35, 0x5c, 0xca, 0x6b, 0xf8, 0x2b, 0x90, 0xcb, 0xbf, 0x28, + 0xc0, 0x79, 0xc1, 0xde, 0x58, 0x2a, 0x5e, 0x68, 0xd7, 0x39, 0x81, 0xbb, 0xf2, 0x7d, 0x18, 0x67, + 0x15, 0xca, 0x76, 0x0f, 0x88, 0xad, 0x55, 0x9c, 0x1c, 0xe2, 0x92, 0x25, 0x27, 0x72, 0x84, 0xfb, + 0x8d, 0x73, 0xd0, 0x96, 0x96, 0x11, 0x5b, 0x27, 0xb6, 0xbe, 0x84, 0x0b, 0xd9, 0x5d, 0x78, 0x05, + 0xf2, 0xb9, 0x0f, 0xf3, 0x19, 0x9b, 0xc2, 0x8b, 0xed, 0xc9, 0x5f, 0xc0, 0xf9, 0x4c, 0x5e, 0xaf, + 0xa0, 0x99, 0x2b, 0x4c, 0xe3, 0x88, 0x5e, 0xc1, 0x10, 0x5a, 0x0f, 0xe1, 0x5c, 0x06, 0xa7, 0x57, + 0xd0, 0xc4, 0x7b, 0x30, 0xa7, 0x34, 0xed, 0x97, 0x6a, 0xe1, 0x3a, 0x5c, 0xe4, 0x8c, 0x5e, 0xcd, + 0xa8, 0x3c, 0x80, 0xf3, 0x82, 0xdd, 0x2b, 0x90, 0xde, 0x0a, 0x5c, 0x88, 0x0f, 0xd4, 0x19, 0x7a, + 0xd2, 0xb1, 0x17, 0x19, 0x6b, 0x0d, 0x2e, 0xc7, 0x9c, 0x72, 0x94, 0x86, 0xe3, 0x73, 0xe3, 0xea, + 0x60, 0x3c, 0x4a, 0xaf, 0x64, 0x44, 0x1f, 0xc2, 0x59, 0x83, 0xe9, 0x2b, 0x53, 0x95, 0x56, 0x61, + 0x9a, 0x33, 0x36, 0x55, 0xe7, 0x05, 0x5d, 0x75, 0x1e, 0x5f, 0x38, 0x13, 0xb3, 0x44, 0xf0, 0xee, + 0x5b, 0x19, 0xda, 0xf4, 0x3a, 0x6a, 0xd3, 0x12, 0x25, 0x6e, 0xe1, 0x3b, 0x30, 0xcc, 0x21, 0xa2, + 0x7d, 0x19, 0xcc, 0xf8, 0x61, 0x81, 0x93, 0x09, 0x64, 0xeb, 0x87, 0x70, 0x91, 0x9f, 0x44, 0xe3, + 0x8b, 0x4a, 0xf3, 0xb4, 0xf8, 0x83, 0xc4, 0x41, 0xf4, 0x9c, 0xe0, 0x9b, 0xc4, 0xcf, 0x39, 0x8f, + 0x3e, 0x92, 0x73, 0x3b, 0x8f, 0xff, 0xb1, 0x9e, 0xae, 0xc9, 0x03, 0x66, 0x31, 0xf3, 0x80, 0x79, + 0x15, 0xae, 0xa8, 0x03, 0x66, 0xb2, 0x1a, 0x39, 0xb5, 0xac, 0x2f, 0xe1, 0x3c, 0xef, 0xa8, 0x74, + 0x29, 0x34, 0x9b, 0xf1, 0x61, 0xa2, 0x9b, 0x73, 0xa2, 0x9b, 0x26, 0x76, 0x4e, 0x27, 0xff, 0xbf, + 0x82, 0xfc, 0xe4, 0xb2, 0x99, 0xff, 0xa2, 0x4f, 0xdc, 0x1b, 0x50, 0x51, 0x02, 0x31, 0x5b, 0xf4, + 0x62, 0xc7, 0xed, 0x75, 0x98, 0xd5, 0xd9, 0xb8, 0x4d, 0xba, 0x7b, 0x07, 0x6f, 0x90, 0xde, 0x66, + 0x9f, 0x05, 0x02, 0xe4, 0xb4, 0x2b, 0x67, 0xc8, 0x0d, 0xf1, 0x6d, 0x85, 0x69, 0x35, 0xe0, 0x42, + 0x7a, 0x28, 0xdc, 0xa6, 0x7c, 0x4f, 0x40, 0x3e, 0x61, 0x9f, 0x30, 0x42, 0xc4, 0x60, 0xe4, 0x32, + 0x95, 0xdf, 0x31, 0x27, 0x97, 0x54, 0x96, 0x25, 0x97, 0x9a, 0x44, 0xff, 0x59, 0xed, 0x72, 0x3e, + 0xfc, 0x2a, 0x10, 0x59, 0xb4, 0x58, 0xb7, 0x65, 0xd5, 0xe7, 0x60, 0x60, 0xb1, 0x6e, 0x8b, 0x87, + 0x4c, 0xa8, 0x09, 0x36, 0xc3, 0xc0, 0x66, 0xb0, 0xa4, 0x46, 0x5e, 0x3c, 0x86, 0x46, 0x7e, 0x7f, + 0x70, 0x74, 0xa0, 0x34, 0x68, 0x93, 0xba, 0xbb, 0xe7, 0x3d, 0x74, 0xa3, 0x7d, 0x55, 0x61, 0xd5, + 0xfa, 0x0a, 0xa6, 0x8d, 0xea, 0xc5, 0x57, 0xdc, 0xf3, 0x05, 0x16, 0xd3, 0x67, 0x17, 0xab, 0xe8, + 0x56, 0x83, 0x26, 0x8b, 0x09, 0xbe, 0xde, 0x34, 0x9d, 0x06, 0x3e, 0xef, 0xb5, 0x65, 0xa1, 0xf5, + 0x0f, 0x07, 0x35, 0xee, 0xda, 0xbb, 0xb6, 0x1e, 0xbd, 0xbb, 0x03, 0xc0, 0x67, 0x88, 0xd6, 0x39, + 0xa6, 0x00, 0x8e, 0x0b, 0x6f, 0x15, 0xbe, 0x24, 0xdb, 0x1a, 0xd2, 0x71, 0xdf, 0xbd, 0x09, 0xff, + 0x63, 0x4e, 0x24, 0x9f, 0x7a, 0x2a, 0xff, 0x63, 0xc1, 0x3a, 0xb4, 0x75, 0x24, 0xf2, 0xc3, 0xe4, + 0xe3, 0x8c, 0x21, 0xbc, 0xb0, 0x7a, 0x4d, 0xde, 0x60, 0xa7, 0xfb, 0x76, 0xb2, 0xf7, 0x19, 0xcf, + 0x60, 0x96, 0xd1, 0xba, 0x8f, 0xf1, 0x60, 0xb1, 0xfc, 0x4d, 0x44, 0x3d, 0xbe, 0xb6, 0x0f, 0x63, + 0x3d, 0xd7, 0x7a, 0xd4, 0x13, 0x23, 0x0b, 0xfb, 0x7b, 0xcc, 0xa7, 0x41, 0x55, 0x99, 0x9d, 0xcd, + 0x1f, 0x27, 0x91, 0xbd, 0xb6, 0xec, 0xb5, 0x3a, 0xbe, 0xab, 0x0e, 0x4c, 0x7c, 0x12, 0x05, 0xed, + 0x06, 0x15, 0x70, 0x5b, 0x47, 0xb2, 0x5e, 0xef, 0xe9, 0xd5, 0x3e, 0x0a, 0x83, 0xdb, 0x8b, 0xdb, + 0x6b, 0xa5, 0x82, 0x75, 0x0b, 0x40, 0xab, 0x09, 0x60, 0x78, 0x63, 0xd3, 0x5e, 0xaf, 0xae, 0x95, + 0x4e, 0x91, 0x59, 0x38, 0xf3, 0x70, 0x75, 0x63, 0x69, 0xf3, 0x61, 0xbd, 0x51, 0x5f, 0xaf, 0xda, + 0xdb, 0x8b, 0x55, 0x7b, 0xa9, 0x54, 0xb0, 0xbe, 0x86, 0x19, 0xb3, 0x87, 0xaf, 0x74, 0x12, 0x46, + 0x30, 0xad, 0xf4, 0x99, 0xfb, 0x0f, 0xb7, 0x35, 0x8f, 0x56, 0x71, 0xf8, 0x4b, 0x7a, 0x66, 0x89, + 0x63, 0xa2, 0xf8, 0x8c, 0x34, 0x24, 0xf2, 0x06, 0x57, 0x0b, 0x92, 0x2f, 0x97, 0x99, 0x5a, 0xd0, + 0x88, 0xf5, 0x02, 0x5c, 0xfa, 0xbe, 0x0f, 0x33, 0x66, 0xad, 0xc7, 0xb5, 0x52, 0xbd, 0x86, 0xae, + 0xbe, 0xda, 0xb3, 0x26, 0x42, 0xf4, 0x6b, 0x03, 0xb1, 0xb2, 0x7e, 0x1f, 0x4a, 0x02, 0x2b, 0xde, + 0x79, 0xaf, 0x4a, 0x33, 0x62, 0x21, 0xe3, 0x11, 0xa6, 0x74, 0x4a, 0xf7, 0xa1, 0xc4, 0x56, 0x4c, + 0x41, 0xc9, 0x2b, 0x98, 0x81, 0xa1, 0xb5, 0xf8, 0x3a, 0xc7, 0xe6, 0x3f, 0xf0, 0x75, 0x4f, 0xe4, + 0x04, 0x91, 0xf4, 0x83, 0x1b, 0xb3, 0xd5, 0x6f, 0xf2, 0x06, 0x0c, 0xdf, 0x75, 0xdb, 0x91, 0x30, + 0x8d, 0xc4, 0x9b, 0x3c, 0x63, 0xcb, 0x0b, 0x6c, 0x81, 0x60, 0xd9, 0x70, 0x46, 0xab, 0xf0, 0x04, + 0x4d, 0x25, 0x65, 0x18, 0xd9, 0xa0, 0xdf, 0x68, 0xf5, 0xcb, 0x9f, 0xd6, 0xbb, 0x70, 0x46, 0xf8, + 0x18, 0x6a, 0x62, 0xba, 0x22, 0xde, 0x8a, 0x17, 0x8c, 0x07, 0xab, 0x82, 0x25, 0x16, 0x31, 0xba, + 0x9d, 0x4e, 0xeb, 0x05, 0xe9, 0xd8, 0x46, 0x71, 0x42, 0xba, 0xef, 0xc8, 0x5b, 0xa0, 0x7e, 0xc3, + 0xf9, 0x7f, 0x15, 0xa1, 0x9c, 0xb0, 0x32, 0x2c, 0xee, 0x3b, 0xed, 0x36, 0xf5, 0xf6, 0x28, 0xb9, + 0x0e, 0x83, 0xdb, 0x9b, 0xdb, 0x5b, 0xc2, 0x4a, 0x2a, 0xbd, 0x0b, 0x18, 0x48, 0xe1, 0xd8, 0x88, + 0x41, 0x1e, 0xc0, 0x19, 0xe9, 0x45, 0xac, 0x8a, 0xc4, 0x08, 0x5d, 0xec, 0xed, 0x93, 0x9c, 0xa6, + 0x23, 0x6f, 0x0b, 0x93, 0xc8, 0x8f, 0xbb, 0x6e, 0x40, 0x5b, 0x68, 0xf9, 0x89, 0xaf, 0xea, 0xb5, + 0x12, 0x5b, 0x47, 0x23, 0xdf, 0x87, 0x89, 0x7a, 0x7d, 0x33, 0xae, 0x7d, 0xc8, 0xb8, 0x21, 0xd2, + 0x8b, 0x6c, 0x03, 0x91, 0x3f, 0x09, 0xb6, 0xfe, 0xb0, 0x00, 0x73, 0x39, 0xe6, 0x16, 0xf2, 0x86, + 0x21, 0x87, 0x69, 0x4d, 0x0e, 0x12, 0x65, 0xe5, 0x94, 0x10, 0xc4, 0xa2, 0xe6, 0x93, 0x3d, 0x70, + 0x02, 0x9f, 0xec, 0x95, 0x53, 0xb1, 0x1f, 0x36, 0x79, 0x1d, 0x06, 0xea, 0xf5, 0x4d, 0x61, 0x56, + 0x27, 0x71, 0x0f, 0x34, 0x64, 0x86, 0x50, 0x03, 0x18, 0x95, 0x20, 0xeb, 0x34, 0x4c, 0x1a, 0x03, + 0x63, 0x59, 0x30, 0xa1, 0xb7, 0x90, 0x8d, 0xfe, 0xa2, 0xdf, 0x52, 0xa3, 0xcf, 0xfe, 0xb6, 0x7e, + 0xd5, 0x94, 0x19, 0xb9, 0x08, 0x20, 0xef, 0x6b, 0xdd, 0x96, 0xbc, 0xf9, 0x11, 0x90, 0xd5, 0x16, + 0xb9, 0x02, 0x13, 0x01, 0x6d, 0xb9, 0x01, 0x6d, 0x46, 0x8d, 0x6e, 0x20, 0x1e, 0xc6, 0xd8, 0xe3, + 0x12, 0xb6, 0x13, 0xb4, 0xc9, 0x77, 0x61, 0x98, 0x5f, 0x24, 0x8b, 0xde, 0xcb, 0x43, 0x42, 0xbd, + 0xbe, 0xb9, 0x7e, 0xb7, 0xca, 0x2f, 0xba, 0x6d, 0x81, 0x62, 0xd5, 0x60, 0x5c, 0xeb, 0x55, 0xbf, + 0xda, 0x67, 0x60, 0x48, 0xb7, 0x52, 0xf2, 0x1f, 0xd6, 0xef, 0x14, 0x60, 0x06, 0xa7, 0xc1, 0x9e, + 0xcb, 0xb6, 0x87, 0xb8, 0x2f, 0x0b, 0xc6, 0xa0, 0x5d, 0x30, 0x06, 0x2d, 0x81, 0xab, 0x46, 0xef, + 0x83, 0xd4, 0xe8, 0x5d, 0xc8, 0x1a, 0x3d, 0x5c, 0x02, 0x5c, 0xdf, 0xd3, 0x07, 0x4d, 0xbf, 0xae, + 0xfb, 0xdd, 0x02, 0x4c, 0x6b, 0x6d, 0x52, 0x1d, 0xbc, 0x63, 0x34, 0xe9, 0x7c, 0x46, 0x93, 0x52, + 0xf3, 0xa9, 0x96, 0x6a, 0xd1, 0x6b, 0xbd, 0x5a, 0x94, 0x35, 0x9d, 0x8c, 0x69, 0xf2, 0x17, 0x05, + 0x98, 0xcd, 0x94, 0x01, 0x39, 0xcb, 0xf4, 0xff, 0x66, 0x40, 0x23, 0x21, 0x79, 0xf1, 0x8b, 0xc1, + 0x57, 0xc3, 0xb0, 0x4b, 0x03, 0x21, 0x77, 0xf1, 0x8b, 0xbc, 0x06, 0x93, 0x5b, 0x34, 0x70, 0xfd, + 0x16, 0x7f, 0x98, 0xc0, 0x3d, 0x7e, 0x27, 0x6d, 0x13, 0x48, 0x2e, 0xc0, 0x98, 0xf2, 0x58, 0xe5, + 0x36, 0x5c, 0x3b, 0x06, 0x30, 0xde, 0x4b, 0xee, 0x1e, 0xbf, 0xf8, 0x61, 0xc4, 0xe2, 0x17, 0x5b, + 0x80, 0xa5, 0x45, 0x75, 0x98, 0x2f, 0xc0, 0xd2, 0x5c, 0x7a, 0x16, 0x86, 0x3f, 0xb3, 0x71, 0x1e, + 0x63, 0xcc, 0x09, 0x5b, 0xfc, 0x22, 0x53, 0xe8, 0x5a, 0x8e, 0xef, 0x62, 0xd0, 0xa5, 0xfc, 0x03, + 0x98, 0xc9, 0x92, 0x6b, 0xd6, 0x57, 0x20, 0x68, 0x8b, 0x8a, 0xf6, 0x4b, 0x98, 0xae, 0xb6, 0x5a, + 0xf1, 0x74, 0xe5, 0xa3, 0xca, 0xd7, 0x09, 0x6e, 0xd3, 0x14, 0x6a, 0xed, 0xe0, 0xaa, 0xe7, 0x46, + 0xf6, 0xf4, 0xf2, 0x37, 0x6e, 0x18, 0xb9, 0xde, 0x9e, 0x66, 0x78, 0xb5, 0xcf, 0x6e, 0xd0, 0x67, + 0x19, 0x53, 0x80, 0x69, 0x1c, 0x26, 0x6f, 0x0e, 0xcf, 0x60, 0x3e, 0xa3, 0xb1, 0x8d, 0x97, 0xae, + 0x39, 0x93, 0x6f, 0x5c, 0x30, 0x50, 0x6d, 0x3e, 0xb1, 0xbe, 0x0f, 0x67, 0xf9, 0xb2, 0xdf, 0xab, + 0xf1, 0xa2, 0xd9, 0xba, 0x9d, 0xd8, 0x7a, 0x4f, 0x5a, 0x72, 0x7a, 0xb6, 0xcc, 0x9e, 0x30, 0xda, + 0x82, 0x55, 0xfe, 0xa7, 0x02, 0xcc, 0x27, 0x48, 0xeb, 0xcf, 0xbd, 0xa6, 0xdc, 0x73, 0x5e, 0x4f, + 0xba, 0xee, 0xa3, 0xae, 0xc4, 0x0d, 0xa4, 0x6e, 0x4b, 0x79, 0xef, 0x93, 0x5b, 0x00, 0x9c, 0x58, + 0x53, 0x71, 0xf0, 0x7a, 0x40, 0x78, 0x39, 0xa1, 0x92, 0xa3, 0xa1, 0x90, 0x2e, 0x64, 0xc9, 0x5d, + 0x7c, 0x23, 0xfd, 0xec, 0xe7, 0x18, 0x67, 0x85, 0x0a, 0xf2, 0x46, 0x8e, 0x21, 0x3d, 0x8b, 0xbf, + 0xf5, 0xff, 0x0f, 0xc0, 0x9c, 0x3e, 0x80, 0x2f, 0xd2, 0xd7, 0x2d, 0x18, 0x5f, 0xf4, 0xbd, 0x88, + 0x7e, 0x13, 0x69, 0x71, 0x2e, 0x88, 0xf2, 0x46, 0x50, 0x25, 0x42, 0xbd, 0xe6, 0x80, 0x06, 0xd3, + 0xf5, 0x0c, 0x6f, 0xcd, 0x18, 0x91, 0x2c, 0xc2, 0xe4, 0x06, 0x7d, 0x96, 0x12, 0x20, 0x7a, 0x8c, + 0x7a, 0xf4, 0x59, 0x43, 0x13, 0xa2, 0xee, 0xc6, 0x67, 0xd0, 0x90, 0x47, 0x30, 0x25, 0x27, 0x97, + 0x21, 0xcc, 0x79, 0x7d, 0xe7, 0x35, 0xa7, 0x33, 0x8f, 0x03, 0xc1, 0x6a, 0xc8, 0x91, 0x61, 0x82, + 0x23, 0xeb, 0x3a, 0xaf, 0x91, 0x87, 0x36, 0x30, 0xb7, 0x76, 0xad, 0xc4, 0xf0, 0xc7, 0x4d, 0x86, + 0x34, 0xd0, 0x59, 0x58, 0x5b, 0x50, 0x4e, 0x8f, 0x87, 0xa8, 0xed, 0x6d, 0x18, 0xe6, 0x50, 0xa1, + 0x2a, 0xc9, 0x10, 0x46, 0x0a, 0x9b, 0xdb, 0x32, 0x5a, 0x62, 0x57, 0xe2, 0x30, 0x6b, 0x05, 0xed, + 0x4b, 0x0a, 0x47, 0x29, 0xab, 0xb7, 0x93, 0xc3, 0x8b, 0xae, 0xce, 0x72, 0x78, 0x75, 0x5f, 0x1c, + 0xf9, 0x24, 0x65, 0x11, 0x4d, 0x74, 0x3a, 0x27, 0xd1, 0xb0, 0x1b, 0x30, 0x22, 0x40, 0x89, 0xe0, + 0x4a, 0xf1, 0xe7, 0x27, 0x11, 0xac, 0x0f, 0xe0, 0x1c, 0xda, 0x0b, 0x5d, 0x6f, 0xaf, 0x4d, 0x77, + 0x42, 0xe3, 0x51, 0x49, 0xbf, 0xcf, 0xfa, 0x23, 0x98, 0xcf, 0xa2, 0xed, 0xfb, 0x65, 0xf3, 0x70, + 0x27, 0x7f, 0x56, 0x84, 0x99, 0xd5, 0x50, 0x57, 0xb8, 0x54, 0xc8, 0x93, 0x8c, 0x30, 0x1c, 0x28, + 0x93, 0x95, 0x53, 0x59, 0x61, 0x36, 0xde, 0xd6, 0x9e, 0xbb, 0x16, 0x7b, 0xc5, 0xd7, 0x60, 0xdb, + 0x96, 0x7a, 0xf0, 0xfa, 0x3a, 0x0c, 0x6e, 0xb0, 0xa5, 0x7a, 0x40, 0x8c, 0x1d, 0xa7, 0x60, 0x20, + 0x7c, 0x6e, 0xca, 0xb6, 0x48, 0xf6, 0x83, 0xdc, 0x4d, 0x3d, 0x6a, 0x1d, 0xec, 0x1f, 0x3f, 0x62, + 0xe5, 0x54, 0xea, 0x7d, 0xeb, 0xbb, 0x30, 0x5e, 0x6d, 0x1d, 0x70, 0x97, 0x4c, 0xdf, 0x4b, 0x7c, + 0x96, 0x5a, 0xc9, 0xca, 0x29, 0x5b, 0x47, 0x24, 0xd7, 0xf8, 0xab, 0x86, 0xe1, 0x9c, 0x98, 0x1a, + 0x4c, 0x59, 0xab, 0x76, 0x3a, 0xb5, 0x51, 0x18, 0xe6, 0x0f, 0x2d, 0xad, 0x2f, 0x61, 0x5e, 0x38, + 0xf2, 0x70, 0xeb, 0x28, 0xba, 0xfb, 0x84, 0xb1, 0xaf, 0x56, 0x2f, 0xe7, 0x9b, 0x4b, 0x00, 0x78, + 0x16, 0x5a, 0xf5, 0x5a, 0xf4, 0x1b, 0xe1, 0x49, 0xa8, 0x41, 0xac, 0x77, 0x60, 0x4c, 0x49, 0x08, + 0x15, 0x7e, 0x6d, 0xb3, 0x43, 0x69, 0xcd, 0x18, 0xaf, 0x78, 0xe5, 0xd3, 0xdd, 0x73, 0x46, 0xdf, + 0x45, 0x94, 0x1c, 0x7e, 0x42, 0x70, 0x61, 0x36, 0x31, 0x09, 0xe2, 0x20, 0x0c, 0x4a, 0x47, 0xe7, + 0xae, 0x8e, 0xea, 0x77, 0x52, 0x85, 0x2f, 0x1e, 0x4b, 0x85, 0xb7, 0xfe, 0x49, 0x11, 0x0f, 0x97, + 0x29, 0x79, 0x24, 0xec, 0x74, 0xba, 0xad, 0xb0, 0x06, 0x63, 0xd8, 0xfb, 0x25, 0xf9, 0x60, 0xb0, + 0xb7, 0x1f, 0xca, 0xe8, 0x4f, 0x0f, 0x2b, 0xa7, 0xd0, 0xf9, 0x24, 0x26, 0x23, 0x1f, 0xc3, 0xc8, + 0xb2, 0xd7, 0x42, 0x0e, 0x03, 0x27, 0xe0, 0x20, 0x89, 0xd8, 0x98, 0x60, 0x93, 0xb7, 0xd9, 0x27, + 0xcc, 0xcd, 0x3b, 0xb6, 0x06, 0x89, 0x4f, 0xb9, 0x43, 0x79, 0xa7, 0xdc, 0xe1, 0xc4, 0x29, 0xd7, + 0x82, 0xa1, 0xcd, 0xa0, 0x25, 0x62, 0xdb, 0x4c, 0x2d, 0x4c, 0x08, 0xc1, 0x21, 0xcc, 0xe6, 0x45, + 0xd6, 0x7f, 0x2d, 0xc0, 0xdc, 0x3d, 0x1a, 0x65, 0xce, 0x21, 0x43, 0x2a, 0x85, 0x97, 0x96, 0x4a, + 0xf1, 0x45, 0xa4, 0xa2, 0x7a, 0x3d, 0x90, 0xd7, 0xeb, 0xc1, 0xbc, 0x5e, 0x0f, 0xe5, 0xf7, 0xfa, + 0x1e, 0x0c, 0xf3, 0xae, 0xb2, 0x93, 0xfc, 0x6a, 0x44, 0x0f, 0xe2, 0x93, 0xbc, 0xee, 0x45, 0x67, + 0xf3, 0x32, 0xa6, 0x48, 0xae, 0x39, 0xa1, 0x7e, 0x92, 0x17, 0x3f, 0xad, 0x1f, 0xe1, 0x53, 0xe3, + 0x35, 0xbf, 0xf9, 0x44, 0xb3, 0x08, 0x8f, 0xf0, 0x2f, 0x34, 0x79, 0x83, 0xc0, 0xb0, 0x78, 0x89, + 0x2d, 0x31, 0xc8, 0x65, 0x18, 0x5f, 0xf5, 0xee, 0xfa, 0x41, 0x93, 0x6e, 0x7a, 0x6d, 0xce, 0x7d, + 0xd4, 0xd6, 0x41, 0xc2, 0x52, 0x22, 0x6a, 0x88, 0xcd, 0x0f, 0x08, 0x48, 0x98, 0x1f, 0x18, 0x6c, + 0x77, 0xc1, 0xe6, 0x65, 0xc2, 0x10, 0xc3, 0xfe, 0xee, 0x75, 0x72, 0x57, 0x47, 0xfc, 0x7e, 0x88, + 0x8f, 0xe0, 0x9c, 0x4d, 0x3b, 0x6d, 0x87, 0xe9, 0x74, 0x07, 0x3e, 0xc7, 0x57, 0x7d, 0xbe, 0x9c, + 0xf1, 0x4c, 0xd0, 0xf4, 0xa9, 0x50, 0x4d, 0x2e, 0xf6, 0x68, 0xf2, 0x01, 0x5c, 0xb9, 0x47, 0x23, + 0x73, 0x41, 0x8d, 0xed, 0xcd, 0xa2, 0xf3, 0x2b, 0x30, 0x1a, 0x9a, 0xb6, 0x72, 0xf9, 0xec, 0x2d, + 0x93, 0x70, 0xf7, 0x2d, 0x79, 0x9b, 0x24, 0xf8, 0xa8, 0xbf, 0xac, 0x4f, 0xa0, 0x92, 0x57, 0xdd, + 0xf1, 0x5c, 0x5e, 0x5d, 0xb8, 0x9c, 0xcf, 0x40, 0x34, 0x77, 0x19, 0xa4, 0x5d, 0x5d, 0x7c, 0x42, + 0xfd, 0x5a, 0x6b, 0x9a, 0xe2, 0xc5, 0x1f, 0x56, 0x4d, 0x3a, 0xff, 0xbd, 0x44, 0x73, 0x1b, 0x78, + 0x65, 0x6d, 0x32, 0x88, 0xe5, 0x5a, 0x85, 0x51, 0x09, 0x13, 0x72, 0x9d, 0xcb, 0x6c, 0xa9, 0x14, + 0x68, 0x4b, 0x32, 0x50, 0x64, 0xd6, 0x8f, 0xe4, 0xf5, 0x8d, 0x49, 0x71, 0xbc, 0x77, 0xb3, 0xc7, + 0xb9, 0xaf, 0xb1, 0x7c, 0x38, 0x67, 0xf2, 0xd6, 0xcd, 0xf2, 0x25, 0xcd, 0x2c, 0xcf, 0xad, 0xf1, + 0x97, 0x4d, 0x33, 0xb1, 0xb0, 0x34, 0x68, 0x20, 0x72, 0x49, 0x37, 0xbe, 0x4f, 0xa4, 0x1f, 0xe2, + 0xde, 0x86, 0xf9, 0xac, 0x0a, 0xb5, 0x73, 0xa0, 0xb2, 0xf0, 0x0a, 0x7d, 0x67, 0x09, 0x2e, 0xc9, + 0xe8, 0x52, 0xbe, 0x1f, 0x85, 0x51, 0xe0, 0x74, 0xea, 0xcd, 0xc0, 0xed, 0xc4, 0x54, 0x16, 0x0c, + 0x73, 0x88, 0x90, 0x04, 0xbf, 0x0a, 0xe3, 0x38, 0xa2, 0xc4, 0xfa, 0xf5, 0x02, 0x58, 0x86, 0x9f, + 0x16, 0x8e, 0xf3, 0x56, 0xe0, 0x3f, 0x75, 0x5b, 0xda, 0xf5, 0xd3, 0x1b, 0x86, 0xe9, 0x93, 0xbf, + 0x49, 0x4c, 0xba, 0x88, 0x8b, 0x35, 0xf3, 0x76, 0xc2, 0x1c, 0xc9, 0x15, 0x4f, 0xf4, 0xdd, 0x32, + 0x1f, 0x44, 0x28, 0x33, 0xe5, 0x7f, 0x2f, 0xc0, 0xd5, 0x9e, 0x6d, 0x10, 0xfd, 0x79, 0x04, 0xa5, + 0x64, 0x99, 0x98, 0x41, 0x15, 0xcd, 0x6f, 0x23, 0xcd, 0x61, 0xf7, 0x0e, 0xf7, 0x43, 0x97, 0xfe, + 0x4d, 0x1d, 0xc5, 0x39, 0xc5, 0xef, 0xe4, 0xad, 0xc7, 0xf8, 0x15, 0x7e, 0xe4, 0xb4, 0x17, 0xd1, + 0x00, 0x30, 0x10, 0xbf, 0x29, 0x88, 0x18, 0xb4, 0x91, 0x0c, 0x93, 0xa1, 0x21, 0x5b, 0x9f, 0xe2, + 0x77, 0x9d, 0xdd, 0xe8, 0xe3, 0x7d, 0x6a, 0x8b, 0x70, 0x35, 0xe1, 0x3b, 0xf0, 0x02, 0x4c, 0x22, + 0x98, 0x65, 0xe2, 0x67, 0xba, 0xf7, 0xbd, 0xc0, 0xef, 0x76, 0x7e, 0x31, 0xa3, 0xfe, 0x47, 0x05, + 0xee, 0xcc, 0xa9, 0x57, 0x2b, 0x06, 0x7a, 0x11, 0x20, 0x86, 0x26, 0x9c, 0xfa, 0x55, 0xc1, 0xee, + 0x1d, 0x7e, 0xe4, 0xc6, 0x5b, 0x85, 0x3d, 0xce, 0x40, 0x23, 0xfb, 0xc5, 0x8e, 0xe4, 0x5b, 0xe8, + 0x30, 0xa0, 0x6a, 0x3f, 0x9e, 0xdc, 0xdf, 0x95, 0xf6, 0x8f, 0x13, 0xd2, 0xed, 0xc3, 0x0c, 0x5b, + 0x01, 0xaa, 0xdd, 0x68, 0xdf, 0x0f, 0xdc, 0x48, 0x3e, 0x4f, 0x21, 0x5b, 0x22, 0x22, 0x00, 0xa7, + 0xfa, 0xe8, 0xe7, 0x87, 0x95, 0xf7, 0x4e, 0x12, 0xf7, 0x53, 0xf2, 0xdc, 0x56, 0x51, 0x04, 0xac, + 0x39, 0x18, 0x58, 0xb4, 0xd7, 0x70, 0xc1, 0xb3, 0xd7, 0xd4, 0x82, 0x67, 0xaf, 0x59, 0x7f, 0x59, + 0x84, 0x0a, 0x8f, 0x59, 0x82, 0x7e, 0x26, 0xb1, 0xd5, 0x42, 0x73, 0x5c, 0x39, 0xae, 0x81, 0x21, + 0x11, 0x93, 0xa4, 0x78, 0x9c, 0x98, 0x24, 0xbf, 0x02, 0x39, 0x26, 0xab, 0x63, 0x58, 0x01, 0xbe, + 0x73, 0x74, 0x58, 0xb9, 0x1a, 0x5b, 0x01, 0x78, 0x69, 0x96, 0x39, 0x20, 0xa7, 0x8a, 0xb4, 0xfd, + 0x62, 0xf0, 0x05, 0xec, 0x17, 0xb7, 0x61, 0x04, 0x0f, 0x33, 0xab, 0x5b, 0xc2, 0xf3, 0x13, 0xa7, + 0x27, 0x46, 0x28, 0x6a, 0xb8, 0x7a, 0x38, 0x40, 0x89, 0x66, 0xfd, 0xed, 0x22, 0x5c, 0xce, 0x97, + 0xb9, 0x68, 0xdb, 0x12, 0x40, 0xec, 0xe1, 0xd2, 0xcb, 0xa3, 0x06, 0xbf, 0x9d, 0x67, 0xf4, 0x91, + 0xf2, 0x68, 0xd3, 0xe8, 0x98, 0xee, 0x23, 0x5f, 0x5a, 0x27, 0xae, 0x53, 0x8c, 0x07, 0xd8, 0x22, + 0x9a, 0xad, 0x00, 0x19, 0xd1, 0x6c, 0x05, 0x8c, 0x3c, 0x82, 0xb9, 0xad, 0xc0, 0x7d, 0xea, 0x44, + 0xf4, 0x01, 0x7d, 0xce, 0x1f, 0x0b, 0x2d, 0x8b, 0x17, 0x42, 0xfc, 0xf9, 0xfc, 0xf5, 0xa3, 0xc3, + 0xca, 0x6b, 0x1d, 0x8e, 0x82, 0x11, 0xcb, 0xf8, 0xdb, 0xcf, 0x46, 0xfa, 0xd1, 0x50, 0x1e, 0x23, + 0xeb, 0x5f, 0x15, 0xe0, 0x3c, 0xaa, 0xe5, 0xc2, 0xec, 0x2a, 0x2b, 0x7f, 0x21, 0xc7, 0x4a, 0xbd, + 0x83, 0x62, 0x2e, 0xa2, 0x63, 0xa5, 0xf1, 0x12, 0xdd, 0x36, 0xd0, 0xc8, 0x2a, 0x8c, 0x8b, 0xdf, + 0xf8, 0xfd, 0x0d, 0xe0, 0x81, 0x60, 0x56, 0x5b, 0xb0, 0x70, 0xaa, 0x73, 0x53, 0x11, 0x4e, 0x6c, + 0xc1, 0x0c, 0x1f, 0x6c, 0xda, 0x3a, 0xad, 0xf5, 0xb3, 0x22, 0x5c, 0xd8, 0xa5, 0x81, 0xfb, 0xf8, + 0x79, 0x4e, 0x67, 0x36, 0x61, 0x46, 0x82, 0x78, 0xdc, 0x12, 0xe3, 0x13, 0xe3, 0xf1, 0x2c, 0x65, + 0x53, 0x45, 0xe0, 0x13, 0xf9, 0xc5, 0x65, 0x12, 0x9e, 0xc0, 0x65, 0xf2, 0x6d, 0x18, 0x4d, 0x44, + 0x0e, 0xc2, 0xf1, 0x97, 0x5f, 0x68, 0x3c, 0x54, 0x2b, 0xa7, 0x6c, 0x85, 0x49, 0x7e, 0x33, 0xff, + 0xaa, 0x4a, 0x98, 0x3e, 0xfa, 0xd9, 0x3f, 0xf1, 0x83, 0x65, 0x1f, 0xab, 0xa3, 0x95, 0x66, 0x7c, + 0xb0, 0x2b, 0xa7, 0xec, 0xbc, 0x9a, 0x6a, 0xe3, 0x30, 0x56, 0xc5, 0x7b, 0x3b, 0x76, 0x72, 0xff, + 0x6f, 0x45, 0xb8, 0x24, 0x1f, 0xfe, 0xe4, 0x88, 0xf9, 0x73, 0x98, 0x93, 0xa0, 0x6a, 0x87, 0x29, + 0x0c, 0xb4, 0x65, 0x4a, 0x9a, 0xc7, 0x94, 0x95, 0x92, 0x76, 0x04, 0x4e, 0x2c, 0xec, 0x3c, 0xf2, + 0x57, 0x63, 0xfd, 0xfc, 0x38, 0x2b, 0x8e, 0x13, 0x5a, 0x21, 0xf5, 0x35, 0xd3, 0x10, 0x8d, 0xb1, + 0x7e, 0xb6, 0x52, 0xd6, 0xd3, 0xc1, 0x97, 0xb5, 0x9e, 0xae, 0x9c, 0x4a, 0xda, 0x4f, 0x6b, 0x53, + 0x30, 0xb1, 0x41, 0x9f, 0xc5, 0x72, 0xff, 0x3f, 0x0b, 0x89, 0x50, 0x0f, 0x4c, 0xc3, 0xe0, 0x31, + 0x1f, 0x0a, 0x71, 0x28, 0x20, 0x0c, 0xf5, 0xa0, 0x6b, 0x18, 0x1c, 0x75, 0x15, 0x46, 0xf8, 0x65, + 0x76, 0xeb, 0x18, 0x27, 0x7c, 0xf5, 0x82, 0x87, 0x3f, 0xab, 0x6c, 0xf1, 0xc3, 0xbe, 0xa0, 0xb7, + 0x1e, 0xc0, 0x15, 0xe1, 0xe3, 0x6d, 0x0e, 0x3e, 0x56, 0x74, 0xc2, 0xed, 0xcb, 0x72, 0xe0, 0xd2, + 0x3d, 0x9a, 0x5c, 0x7a, 0x8c, 0x17, 0x4e, 0x9f, 0xc0, 0x69, 0x03, 0xae, 0x38, 0xa2, 0x56, 0xaa, + 0xe6, 0x90, 0x62, 0x9d, 0xc4, 0xb6, 0x2e, 0x67, 0x55, 0xa1, 0x37, 0xd6, 0xa2, 0x18, 0x1c, 0x36, + 0x88, 0xaf, 0xd8, 0xc2, 0x13, 0xac, 0x7a, 0xd7, 0xb5, 0xef, 0x9a, 0xaf, 0x78, 0x3c, 0x7a, 0xa0, + 0xdc, 0x79, 0x55, 0xa9, 0x35, 0x69, 0xdc, 0x05, 0x58, 0x53, 0x30, 0x21, 0x8b, 0xda, 0x34, 0x0c, + 0xad, 0x7f, 0x3f, 0x04, 0x96, 0x10, 0x6c, 0xd6, 0x0d, 0xbd, 0x94, 0xc7, 0xa3, 0x54, 0x63, 0xc5, + 0x46, 0x75, 0x56, 0x8f, 0x49, 0x1a, 0x97, 0xf2, 0x99, 0x87, 0x7a, 0x5e, 0x33, 0x86, 0x1a, 0x33, + 0x2f, 0xd5, 0xfb, 0xaf, 0x72, 0x96, 0x49, 0xfe, 0xb1, 0xe1, 0x93, 0xed, 0x9c, 0x65, 0xd2, 0xe0, + 0x9b, 0xbd, 0x64, 0xda, 0xe6, 0x95, 0xc8, 0xc0, 0x8b, 0x5c, 0x89, 0xb0, 0x2f, 0x52, 0xbf, 0x14, + 0xd9, 0x31, 0x65, 0x29, 0xbe, 0x47, 0x79, 0x7b, 0xaf, 0x17, 0x89, 0x88, 0x0b, 0x1a, 0xc4, 0xe0, + 0x6a, 0xb0, 0x21, 0x2e, 0x94, 0x34, 0x9b, 0xe5, 0xe2, 0x3e, 0x6d, 0x3e, 0x11, 0xb6, 0x62, 0x79, + 0xa1, 0x9b, 0x65, 0x33, 0xe7, 0xf1, 0xa9, 0xf9, 0x77, 0xce, 0x0b, 0x1a, 0x4d, 0x46, 0xaa, 0x47, + 0x8c, 0x48, 0xb2, 0x25, 0x3f, 0x81, 0x69, 0x35, 0xd4, 0x09, 0x17, 0xad, 0xf1, 0x85, 0xd7, 0xe2, + 0x50, 0xa6, 0x07, 0x8f, 0x9d, 0x9b, 0x4f, 0xef, 0xdc, 0xcc, 0xc0, 0xe5, 0x81, 0x08, 0x9a, 0xb2, + 0x40, 0xf3, 0xcf, 0xd2, 0x2f, 0xba, 0x32, 0x08, 0xc9, 0x17, 0x30, 0x53, 0xaf, 0x6f, 0xf2, 0xc7, + 0x1c, 0xb6, 0xbc, 0xe0, 0xb7, 0xd7, 0x84, 0xc3, 0x16, 0x0e, 0x77, 0x18, 0xfa, 0x0d, 0xf1, 0x08, + 0x44, 0x77, 0x0b, 0xd0, 0x43, 0x31, 0x64, 0xb1, 0xd0, 0x6f, 0xca, 0xff, 0xa6, 0x7a, 0xab, 0xc0, + 0x54, 0x11, 0xb7, 0x4d, 0xc5, 0xa3, 0x23, 0x39, 0xb1, 0x73, 0x6e, 0xf9, 0x0a, 0xdf, 0xf2, 0x2d, + 0xdf, 0xef, 0x17, 0xe5, 0x0b, 0x8d, 0xf4, 0x45, 0xeb, 0x89, 0x2f, 0xfb, 0x32, 0x7b, 0x70, 0xac, + 0x7d, 0x3a, 0xb3, 0x71, 0xa4, 0x26, 0xaf, 0x4a, 0x55, 0xb0, 0xb2, 0x29, 0x75, 0xed, 0x10, 0x17, + 0x18, 0xb7, 0xa7, 0xa8, 0x15, 0x69, 0x54, 0xc9, 0x7b, 0xb8, 0x81, 0x97, 0xbf, 0x87, 0xfb, 0x2f, + 0x63, 0x70, 0x66, 0xcb, 0xd9, 0x73, 0x3d, 0xb6, 0x1f, 0xd8, 0x34, 0xf4, 0xbb, 0x41, 0x93, 0x92, + 0x2a, 0x4c, 0x99, 0xee, 0xb7, 0x7d, 0x9c, 0x8b, 0xd9, 0x96, 0x67, 0xc2, 0xc8, 0x02, 0x8c, 0xa9, + 0x27, 0xbf, 0x62, 0x9f, 0xca, 0x78, 0x0a, 0xbc, 0x72, 0xca, 0x8e, 0xd1, 0xc8, 0xfb, 0xc6, 0xd5, + 0xd1, 0x69, 0xf5, 0x7a, 0x1d, 0x71, 0x17, 0xb8, 0x7f, 0xa4, 0xe7, 0xb7, 0xcc, 0xbd, 0x96, 0xdf, + 0x8f, 0xfc, 0x28, 0x75, 0x9b, 0x34, 0x64, 0xb4, 0x38, 0x65, 0x52, 0x43, 0x35, 0x23, 0x37, 0xf6, + 0x78, 0xc6, 0x3d, 0xd3, 0x97, 0x30, 0xfe, 0xa0, 0xfb, 0x88, 0xca, 0x7b, 0xb3, 0x61, 0xb1, 0xf5, + 0x26, 0x9d, 0xca, 0x45, 0xf9, 0xee, 0x5b, 0x7c, 0x0c, 0x9e, 0x74, 0x1f, 0xd1, 0x74, 0x50, 0x7b, + 0xb6, 0xe6, 0x69, 0xcc, 0xc8, 0x3e, 0x94, 0x92, 0xfe, 0xdf, 0x22, 0xbc, 0x5f, 0x0f, 0xaf, 0x75, + 0x0c, 0xd3, 0xa2, 0x85, 0xce, 0xe7, 0x5e, 0xa9, 0x46, 0x25, 0x29, 0xae, 0xe4, 0x57, 0x61, 0x36, + 0xd3, 0xa0, 0xa9, 0x5e, 0xb0, 0xf5, 0xb6, 0x95, 0xe2, 0x02, 0x92, 0x90, 0x9a, 0x7c, 0x2e, 0x67, + 0xd4, 0x9c, 0x5d, 0x0b, 0x69, 0xc1, 0xe9, 0x84, 0x5f, 0xb3, 0xc8, 0x0f, 0x92, 0xef, 0x29, 0x8d, + 0x7b, 0x9e, 0x0c, 0xb1, 0x9b, 0x59, 0x57, 0x92, 0x25, 0x59, 0x83, 0x31, 0x65, 0x49, 0x10, 0x91, + 0xd5, 0xb2, 0xac, 0x26, 0xe5, 0xa3, 0xc3, 0xca, 0x4c, 0x6c, 0x35, 0x31, 0x78, 0xc6, 0x0c, 0xc8, + 0xaf, 0xc1, 0x15, 0x35, 0x45, 0x37, 0x83, 0x6c, 0xfb, 0x92, 0x08, 0xcd, 0x7f, 0x23, 0x39, 0xc3, + 0xf3, 0xf0, 0x77, 0xef, 0xd4, 0x8a, 0xe5, 0xc2, 0xca, 0x29, 0xbb, 0x3f, 0x6b, 0xf2, 0x1b, 0x05, + 0x38, 0x9b, 0x53, 0xeb, 0x04, 0xd6, 0xda, 0xd7, 0xe8, 0x87, 0xe7, 0x06, 0x7c, 0xb5, 0xe5, 0xb6, + 0xe2, 0xd7, 0x8d, 0xd2, 0xfa, 0x67, 0xf4, 0x3b, 0xa7, 0x26, 0x72, 0x1b, 0x60, 0xcf, 0x8d, 0xc4, + 0x1c, 0xc3, 0x20, 0x63, 0xe9, 0x0f, 0x94, 0x89, 0x6d, 0xcf, 0x8d, 0xc4, 0x4c, 0x7b, 0x13, 0x86, + 0xf1, 0xc0, 0x1e, 0x96, 0x27, 0x51, 0xa5, 0xc5, 0x78, 0x46, 0x78, 0xac, 0xd7, 0x37, 0x31, 0x81, + 0x43, 0x56, 0x98, 0x6a, 0x88, 0x9b, 0xa8, 0x54, 0xe5, 0x44, 0xf4, 0x33, 0x71, 0xbc, 0xe0, 0x45, + 0x32, 0x2c, 0x89, 0x91, 0xb5, 0xc1, 0x24, 0xab, 0x01, 0x8c, 0x06, 0x62, 0x1d, 0xbb, 0x3f, 0x38, + 0x3a, 0x58, 0x1a, 0xe2, 0x9f, 0x9a, 0x74, 0xb1, 0xff, 0xad, 0x51, 0xfe, 0x1e, 0x77, 0xc7, 0x73, + 0x1f, 0xbb, 0xf1, 0x92, 0xa7, 0x9b, 0xfa, 0xe2, 0xf4, 0x49, 0x42, 0x11, 0xcf, 0x49, 0x94, 0xa4, + 0xac, 0x82, 0xc5, 0xbe, 0x56, 0xc1, 0xb7, 0xb4, 0xfb, 0x33, 0x2d, 0xca, 0x29, 0x57, 0xb8, 0x4c, + 0x2b, 0x5c, 0x7c, 0xb1, 0xf6, 0x35, 0x0c, 0x63, 0x60, 0x52, 0x7e, 0x39, 0x39, 0xbe, 0x70, 0x53, + 0x2c, 0xf4, 0x3d, 0x9a, 0xcf, 0x23, 0x99, 0x8a, 0x37, 0xf6, 0x5c, 0xe2, 0x08, 0x30, 0x24, 0x8e, + 0x10, 0xb2, 0x0d, 0xd3, 0x5b, 0x6c, 0xff, 0xe7, 0x8e, 0xde, 0x9d, 0x40, 0x58, 0x4a, 0xb8, 0x0d, + 0x06, 0xf5, 0x8f, 0x8e, 0x2c, 0x6e, 0x50, 0x55, 0xae, 0x6f, 0xc1, 0x19, 0xe4, 0x64, 0x19, 0xa6, + 0xea, 0xd4, 0x09, 0x9a, 0xfb, 0x0f, 0xe8, 0x73, 0xa6, 0x7b, 0x19, 0x19, 0x43, 0x42, 0x2c, 0x61, + 0xfd, 0xc5, 0x22, 0xdd, 0xe1, 0xc4, 0x24, 0x22, 0x9f, 0xc2, 0x70, 0xdd, 0x0f, 0xa2, 0xda, 0x73, + 0xb1, 0x0c, 0xca, 0xeb, 0x2b, 0x0e, 0xac, 0x9d, 0x93, 0x59, 0x53, 0x42, 0x3f, 0x88, 0x1a, 0x8f, + 0x8c, 0x00, 0x59, 0x1c, 0x85, 0x3c, 0x87, 0x19, 0x73, 0x09, 0x12, 0xfe, 0xc7, 0xa3, 0x42, 0xe7, + 0xcb, 0x5a, 0xe7, 0x38, 0x4a, 0xed, 0xba, 0xe0, 0x7e, 0x39, 0xb9, 0xd0, 0x3d, 0xc6, 0x72, 0x5d, + 0x51, 0xca, 0xa2, 0x27, 0xeb, 0x98, 0x6e, 0x86, 0xf7, 0xa8, 0x1a, 0x72, 0xbf, 0xe5, 0xb1, 0x38, + 0x04, 0x5b, 0x17, 0x97, 0x31, 0x94, 0x84, 0x13, 0x26, 0x73, 0x14, 0xd9, 0x29, 0x52, 0xb2, 0x05, + 0x67, 0x76, 0x42, 0xba, 0x15, 0xd0, 0xa7, 0x2e, 0x7d, 0x26, 0xf9, 0x41, 0x1c, 0xaf, 0x8a, 0xf1, + 0xeb, 0xf0, 0xd2, 0x2c, 0x86, 0x69, 0x62, 0xf2, 0x3e, 0xc0, 0x96, 0xeb, 0x79, 0xb4, 0x85, 0x77, + 0xa0, 0xe3, 0xc8, 0x0a, 0xed, 0xbb, 0x1d, 0x84, 0x36, 0x7c, 0xaf, 0xad, 0x8b, 0x54, 0x43, 0x26, + 0x35, 0x98, 0x5c, 0xf5, 0x9a, 0xed, 0xae, 0xf0, 0x55, 0x08, 0x71, 0x09, 0x12, 0x71, 0xf4, 0x5c, + 0x5e, 0xd0, 0x48, 0x7d, 0xe4, 0x26, 0x09, 0x79, 0x00, 0x44, 0x00, 0xc4, 0xac, 0x75, 0x1e, 0xb5, + 0xa9, 0xf8, 0xdc, 0xd1, 0x6e, 0x23, 0x19, 0xe1, 0x74, 0x37, 0xc2, 0xd3, 0xa5, 0xc8, 0xe6, 0xdf, + 0x87, 0x71, 0x6d, 0xce, 0x67, 0x04, 0x8d, 0x98, 0xd1, 0x83, 0x46, 0x8c, 0xe9, 0xc1, 0x21, 0xfe, + 0x41, 0x01, 0x2e, 0x64, 0x7f, 0x4b, 0x42, 0x65, 0xdb, 0x84, 0x31, 0x05, 0x54, 0xcf, 0x84, 0xe4, + 0x39, 0x24, 0xa1, 0x33, 0xf1, 0x0f, 0x5a, 0xae, 0x3c, 0x7a, 0xef, 0x63, 0x1e, 0x2f, 0x70, 0x39, + 0xf0, 0x7f, 0x8f, 0xc2, 0x0c, 0xba, 0xc3, 0x27, 0xd7, 0xa9, 0x4f, 0x30, 0xf8, 0x0b, 0xc2, 0x34, + 0x5b, 0xb7, 0x30, 0x7b, 0x71, 0x78, 0x32, 0x0c, 0x9a, 0x41, 0x40, 0xde, 0xd1, 0x1d, 0x34, 0x8a, + 0x5a, 0x7a, 0x1b, 0x09, 0xd4, 0xbb, 0x10, 0x7b, 0x6e, 0xbc, 0x61, 0xf8, 0x07, 0x1c, 0x7b, 0xd1, + 0x1b, 0x3c, 0xee, 0xa2, 0xb7, 0xa3, 0x16, 0x3d, 0x1e, 0x54, 0xe4, 0x3b, 0xda, 0xa2, 0xf7, 0xea, + 0x57, 0xbb, 0xe1, 0x57, 0xbd, 0xda, 0x8d, 0xbc, 0xdc, 0x6a, 0x37, 0xfa, 0x82, 0xab, 0xdd, 0x5d, + 0x98, 0xda, 0xa0, 0xb4, 0xa5, 0xdd, 0xda, 0x8c, 0xc5, 0xbb, 0xa7, 0x47, 0xd1, 0x1e, 0x97, 0x75, + 0x75, 0x93, 0xa0, 0xca, 0x5d, 0x35, 0xe1, 0xaf, 0x67, 0xd5, 0x1c, 0x7f, 0xc5, 0xab, 0xe6, 0xc4, + 0xcb, 0xac, 0x9a, 0xa9, 0xa5, 0x6f, 0xf2, 0xc4, 0x4b, 0xdf, 0xcb, 0xac, 0x56, 0x1f, 0xa3, 0x7f, + 0x63, 0xbd, 0xbe, 0x22, 0x5c, 0x59, 0x34, 0xdf, 0x91, 0x15, 0x3f, 0x94, 0xee, 0xdf, 0xf8, 0x37, + 0x83, 0x61, 0x12, 0x01, 0xce, 0x04, 0xff, 0xb6, 0x6a, 0xe8, 0xd5, 0xa8, 0xd3, 0xab, 0x67, 0x12, + 0x23, 0xe2, 0x8d, 0xa5, 0x58, 0xe3, 0x92, 0x7a, 0x9d, 0x2d, 0xcb, 0xad, 0x3f, 0x2b, 0xf0, 0x1b, + 0xd2, 0xff, 0x15, 0x97, 0xca, 0x97, 0xb9, 0xb5, 0xfc, 0xcd, 0x38, 0xf6, 0x82, 0x88, 0x13, 0x11, + 0x38, 0xcd, 0x27, 0xf1, 0xb5, 0xf1, 0x0f, 0xd9, 0x77, 0xae, 0x17, 0x08, 0x0d, 0x78, 0x4e, 0x49, + 0x4a, 0x2f, 0xdc, 0xbd, 0x23, 0x17, 0x00, 0x11, 0x82, 0x82, 0x83, 0xcd, 0x05, 0x40, 0x27, 0x40, + 0xc7, 0xbd, 0xd3, 0x96, 0xcd, 0x43, 0x07, 0x64, 0xb6, 0xe0, 0xdd, 0xf4, 0xe3, 0x77, 0x3c, 0xbe, + 0xc4, 0x8f, 0xdf, 0x75, 0x31, 0xc6, 0xcf, 0xe0, 0x77, 0xe0, 0xbc, 0x4d, 0x0f, 0xfc, 0xa7, 0xf4, + 0xd5, 0xb2, 0xfd, 0x0a, 0xce, 0x99, 0x0c, 0xf9, 0x33, 0x29, 0x1e, 0xd3, 0xff, 0xe3, 0xec, 0x4c, + 0x00, 0x82, 0x80, 0x67, 0x02, 0xe0, 0x01, 0xc5, 0xd9, 0x9f, 0xfa, 0xbe, 0x81, 0x65, 0x96, 0x0f, + 0x17, 0x4c, 0xe6, 0xd5, 0x56, 0x0b, 0x93, 0x89, 0x36, 0xdd, 0x8e, 0xe3, 0x45, 0x64, 0x13, 0xc6, + 0xb5, 0x9f, 0x09, 0xe3, 0x82, 0x56, 0x22, 0x74, 0x9a, 0x18, 0x60, 0x04, 0x64, 0x8d, 0xc1, 0x16, + 0x85, 0x4a, 0x52, 0x3c, 0x4c, 0x64, 0x7a, 0x9d, 0x35, 0x98, 0xd4, 0x7e, 0x2a, 0xfb, 0x29, 0x7e, + 0xfc, 0x5a, 0x0d, 0xa6, 0xc0, 0x4c, 0x12, 0xab, 0x09, 0xf3, 0x59, 0x42, 0xe3, 0x91, 0xbb, 0xc9, + 0x72, 0x1c, 0x98, 0xab, 0xbf, 0xeb, 0xdf, 0xe9, 0xbc, 0xa0, 0x5c, 0xd6, 0xdf, 0x18, 0x84, 0xf3, + 0x62, 0x30, 0x5e, 0xe5, 0x88, 0x93, 0x1f, 0xc1, 0xb8, 0x36, 0xc6, 0x42, 0xe8, 0x97, 0xe5, 0x23, + 0xa7, 0xbc, 0xb9, 0xc0, 0x8d, 0x20, 0x5d, 0x04, 0x34, 0x12, 0xc3, 0xbd, 0x72, 0xca, 0xd6, 0x59, + 0x92, 0x36, 0x4c, 0x99, 0x03, 0x2d, 0xec, 0x40, 0x57, 0x33, 0x2b, 0x31, 0x51, 0x65, 0x58, 0xef, + 0x56, 0x23, 0x73, 0xb8, 0x57, 0x4e, 0xd9, 0x09, 0xde, 0xe4, 0x1b, 0x38, 0x93, 0x1a, 0x65, 0x61, + 0xde, 0x7b, 0x3d, 0xb3, 0xc2, 0x14, 0x36, 0xb7, 0x0d, 0x07, 0x08, 0xce, 0xad, 0x36, 0x5d, 0x09, + 0x69, 0xc1, 0x84, 0x3e, 0xf0, 0xc2, 0x50, 0x75, 0xa5, 0x87, 0x28, 0x39, 0x22, 0x57, 0xee, 0x84, + 0x2c, 0x71, 0xec, 0x9f, 0x9b, 0xf6, 0x6e, 0x03, 0x79, 0x14, 0x86, 0xf9, 0x6f, 0xeb, 0xf7, 0x0b, + 0x70, 0x7e, 0x2b, 0xa0, 0x21, 0xf5, 0x9a, 0xd4, 0x70, 0x17, 0x7f, 0xc9, 0x19, 0x91, 0x67, 0x6a, + 0x2e, 0xbe, 0xb4, 0xa9, 0xd9, 0xfa, 0x97, 0x05, 0x28, 0x67, 0x35, 0xb9, 0x4e, 0xbd, 0x16, 0xd9, + 0x82, 0x52, 0xb2, 0x0f, 0xe2, 0x8b, 0xb1, 0x54, 0x54, 0xe6, 0xdc, 0xde, 0xae, 0x9c, 0xb2, 0x53, + 0xd4, 0x64, 0x03, 0xce, 0x68, 0x30, 0x61, 0xea, 0x2d, 0x1e, 0xc7, 0xd4, 0xcb, 0x46, 0x38, 0x45, + 0xaa, 0x5b, 0xca, 0x57, 0x70, 0xd7, 0x5d, 0xf2, 0x0f, 0x1c, 0xd7, 0x63, 0x4a, 0xb4, 0x16, 0xf7, + 0x0b, 0x62, 0xa8, 0x10, 0x3b, 0xb7, 0xfd, 0x22, 0x54, 0xbe, 0x9c, 0x51, 0x28, 0xd6, 0x47, 0xb8, + 0x3b, 0x08, 0x8b, 0x21, 0x7f, 0xab, 0xac, 0x98, 0x5d, 0x86, 0xa1, 0xed, 0xb5, 0xfa, 0x62, 0x55, + 0xbc, 0x7c, 0xe6, 0xf1, 0x32, 0xda, 0x61, 0xa3, 0xe9, 0xd8, 0xbc, 0xc0, 0xfa, 0x10, 0xc8, 0x3d, + 0x1a, 0x89, 0xb4, 0x00, 0x8a, 0xee, 0x1a, 0x8c, 0x08, 0x90, 0xa0, 0x44, 0x1f, 0x40, 0x91, 0x64, + 0xc0, 0x96, 0x65, 0xd6, 0x96, 0x3c, 0x83, 0xb4, 0xa9, 0x13, 0x6a, 0x9b, 0xfe, 0x7b, 0x30, 0x1a, + 0x08, 0x98, 0xd8, 0xf3, 0xa7, 0x54, 0xd6, 0x17, 0x04, 0x73, 0xeb, 0xba, 0xc4, 0xb1, 0xd5, 0x5f, + 0xd6, 0x1a, 0xc6, 0xb6, 0xd9, 0x5c, 0x5d, 0x5a, 0x64, 0x52, 0x15, 0xc2, 0x92, 0xc3, 0x71, 0x0b, + 0x9d, 0xe5, 0x23, 0xaa, 0xbf, 0x7b, 0x46, 0xd1, 0xe0, 0x02, 0x22, 0x22, 0x3a, 0x69, 0x28, 0xd6, + 0x5b, 0x2a, 0x52, 0x4e, 0x06, 0xb7, 0xbc, 0xec, 0x25, 0x1b, 0x18, 0x03, 0xe8, 0x1e, 0xfa, 0x05, + 0xbd, 0x8a, 0x46, 0x38, 0x30, 0xcf, 0x55, 0x08, 0xd6, 0x2b, 0x91, 0xbb, 0xd1, 0x57, 0xcb, 0xee, + 0x22, 0x8c, 0x29, 0x98, 0xba, 0xe4, 0xe3, 0xb2, 0x32, 0xf0, 0x77, 0xdf, 0xe2, 0x4f, 0xc4, 0x9b, + 0x8a, 0x41, 0x4c, 0xc7, 0xaa, 0xe0, 0xdf, 0xf4, 0xb7, 0x5c, 0x45, 0x48, 0x83, 0xe8, 0x5b, 0xad, + 0x22, 0x0e, 0x12, 0x75, 0x92, 0x2a, 0x0c, 0xfc, 0xdd, 0x85, 0xe3, 0x08, 0xea, 0x5b, 0xae, 0x82, + 0x09, 0xea, 0xdb, 0xab, 0x82, 0xca, 0x68, 0x5a, 0x7c, 0x92, 0xa6, 0x2a, 0x59, 0x4e, 0x57, 0x22, + 0xcd, 0xe8, 0x09, 0x8a, 0x9e, 0xe3, 0x41, 0xe1, 0x02, 0x17, 0xd6, 0x2f, 0xa0, 0x1a, 0x26, 0xb0, + 0x6f, 0xb7, 0x9a, 0xbf, 0x53, 0xe0, 0xb1, 0xbd, 0xea, 0x9b, 0x5a, 0xd6, 0x54, 0xef, 0xb1, 0xaf, + 0xf9, 0x20, 0x68, 0x5f, 0xfb, 0x03, 0xd7, 0x6b, 0xe9, 0x3e, 0x08, 0x4e, 0x37, 0xda, 0x57, 0xb1, + 0xaf, 0x9f, 0xb8, 0x5e, 0xcb, 0x4e, 0x62, 0x93, 0xf7, 0x61, 0x52, 0x03, 0x29, 0x4d, 0x90, 0x67, + 0x27, 0xd1, 0xc9, 0xdd, 0x96, 0x6d, 0x62, 0x5a, 0x7f, 0x55, 0x80, 0xe9, 0x8c, 0x7c, 0xde, 0x68, + 0x28, 0xc1, 0x13, 0x96, 0x5a, 0xa8, 0x44, 0x3e, 0x31, 0x0c, 0x33, 0x62, 0xec, 0xbf, 0x0a, 0x11, + 0xf3, 0x32, 0x68, 0xb9, 0xc7, 0x8b, 0x5a, 0x96, 0xbc, 0xec, 0x7c, 0xe3, 0x3a, 0x3a, 0x09, 0x01, + 0xe2, 0x96, 0x08, 0x93, 0x74, 0x9d, 0xa9, 0xcb, 0x5a, 0xe2, 0xf2, 0x57, 0x92, 0x39, 0x5d, 0xab, + 0xc6, 0xfa, 0xcd, 0x22, 0x9c, 0xcd, 0xe8, 0x7f, 0x9d, 0x46, 0x7f, 0x1d, 0x22, 0x48, 0xa4, 0x8f, + 0x1f, 0xf8, 0x05, 0xa5, 0x8f, 0xb7, 0xfe, 0xb8, 0x08, 0x67, 0x77, 0x3a, 0x21, 0x3e, 0x25, 0x5b, + 0xf5, 0x9e, 0x52, 0x2f, 0xf2, 0x83, 0xe7, 0xf8, 0xfc, 0x85, 0xbc, 0x03, 0x43, 0x2b, 0xb4, 0xdd, + 0xf6, 0xc5, 0xfc, 0xbf, 0x28, 0xdd, 0x40, 0x92, 0xd8, 0x88, 0xb4, 0x72, 0xca, 0xe6, 0xd8, 0xe4, + 0x7d, 0x18, 0x5b, 0xa1, 0x4e, 0x10, 0x3d, 0xa2, 0x8e, 0x3c, 0x0e, 0xc9, 0x9c, 0x29, 0x1a, 0x89, + 0x40, 0x58, 0x39, 0x65, 0xc7, 0xd8, 0x64, 0x01, 0x06, 0xb7, 0x7c, 0x6f, 0x4f, 0x3d, 0x9b, 0xcf, + 0xa9, 0x90, 0xe1, 0xac, 0x9c, 0xb2, 0x11, 0x97, 0xac, 0xc3, 0x64, 0x75, 0x8f, 0x7a, 0xd1, 0x3a, + 0x8d, 0x9c, 0x96, 0x13, 0x39, 0x42, 0x6d, 0xbe, 0x96, 0x47, 0x6c, 0x20, 0xaf, 0x9c, 0xb2, 0x4d, + 0x6a, 0xf2, 0x21, 0x8c, 0xdc, 0xf3, 0xfd, 0xd6, 0xa3, 0xe7, 0x32, 0xf8, 0x43, 0x25, 0x8f, 0x91, + 0x40, 0x5b, 0x39, 0x65, 0x4b, 0x8a, 0xda, 0x10, 0x0c, 0xac, 0x87, 0x7b, 0xd6, 0x61, 0x01, 0xca, + 0x4b, 0xfe, 0x33, 0x2f, 0x53, 0xaa, 0xdf, 0x37, 0xa5, 0x2a, 0xd9, 0x67, 0xe0, 0x27, 0xe4, 0xfa, + 0x36, 0x0c, 0x6e, 0xb9, 0xde, 0x5e, 0x42, 0x15, 0xcc, 0xa0, 0x63, 0x58, 0x28, 0x1e, 0xd7, 0xdb, + 0x23, 0x6b, 0x52, 0xbf, 0x17, 0x76, 0xcc, 0x01, 0xe3, 0x50, 0x91, 0x41, 0xad, 0x63, 0xc7, 0x7a, + 0x3c, 0xff, 0x2d, 0x3b, 0xf8, 0x06, 0xcc, 0xe5, 0xd4, 0x2b, 0xde, 0xc1, 0xb3, 0xbe, 0x0d, 0xa2, + 0x62, 0xf3, 0xff, 0x14, 0x60, 0x36, 0x73, 0x00, 0x93, 0x98, 0xec, 0x4c, 0xc7, 0x27, 0xe6, 0x62, + 0xdb, 0x6f, 0x3e, 0x39, 0x86, 0x37, 0x99, 0x25, 0xf3, 0x8c, 0x8b, 0x2f, 0xa4, 0xc9, 0xe8, 0x12, + 0xb9, 0xe4, 0x74, 0x96, 0xd6, 0x3f, 0xce, 0x9a, 0xeb, 0x5c, 0xb8, 0x65, 0x18, 0x91, 0xf9, 0xca, + 0xb8, 0xe9, 0x4a, 0xfe, 0xc4, 0xc7, 0x66, 0x72, 0x2d, 0x90, 0x81, 0x64, 0xe4, 0x27, 0xbf, 0xab, + 0x05, 0xee, 0xe2, 0x5f, 0xec, 0x07, 0x2f, 0xf1, 0x5d, 0x2a, 0x5e, 0xac, 0xce, 0x15, 0x3f, 0x8c, + 0x3c, 0xe5, 0xc5, 0x6c, 0xab, 0xdf, 0xe4, 0x06, 0x94, 0x64, 0x6e, 0x12, 0x91, 0x04, 0x49, 0xe4, + 0xd3, 0xb7, 0x53, 0x70, 0xf2, 0x1e, 0xcc, 0x25, 0x61, 0xb2, 0x97, 0xfc, 0xb5, 0x60, 0x5e, 0xb1, + 0xf5, 0xa7, 0x45, 0x8c, 0xad, 0xde, 0xe3, 0xd3, 0x61, 0xe3, 0xb7, 0x59, 0x17, 0xd2, 0x2a, 0x6e, + 0xd6, 0xc9, 0x05, 0x18, 0xdb, 0xac, 0x1b, 0x49, 0xdf, 0xec, 0x18, 0xc0, 0x9a, 0xcd, 0xba, 0x50, + 0x0d, 0x9a, 0xfb, 0x6e, 0x44, 0x9b, 0x51, 0x37, 0x10, 0x0b, 0xbd, 0x9d, 0x82, 0x13, 0x0b, 0x26, + 0xee, 0xb5, 0xdd, 0x47, 0x4d, 0xc9, 0x8c, 0x8b, 0xc0, 0x80, 0x91, 0xd7, 0x61, 0x6a, 0xd5, 0x0b, + 0x23, 0xa7, 0xdd, 0x5e, 0xa7, 0xd1, 0xbe, 0xdf, 0x12, 0x29, 0x6d, 0xed, 0x04, 0x94, 0xd5, 0xbb, + 0xe8, 0x7b, 0x91, 0xe3, 0x7a, 0x34, 0xb0, 0xbb, 0x5e, 0xe4, 0x1e, 0x50, 0xd1, 0xf7, 0x14, 0x9c, + 0xbc, 0x0d, 0xb3, 0x0a, 0xb6, 0x19, 0x34, 0xf7, 0x69, 0x18, 0x05, 0x98, 0x0a, 0x12, 0xfd, 0x95, + 0xec, 0xec, 0x42, 0xac, 0xa1, 0xed, 0x77, 0x5b, 0xcb, 0xde, 0x53, 0x37, 0xf0, 0x3d, 0x4c, 0xb4, + 0x32, 0x2a, 0x6a, 0x48, 0xc0, 0xad, 0xdf, 0x1b, 0xcd, 0x5c, 0x19, 0x5e, 0x66, 0x0e, 0x7e, 0x01, + 0x13, 0x8b, 0x4e, 0xc7, 0x79, 0xe4, 0xb6, 0xdd, 0xc8, 0x55, 0x39, 0xf3, 0xde, 0xe9, 0xb3, 0xac, + 0xc8, 0x6c, 0x35, 0xb4, 0xa5, 0x13, 0xdb, 0x06, 0xab, 0xf9, 0xbf, 0x1c, 0x86, 0xd9, 0x4c, 0x3c, + 0x72, 0x5d, 0x24, 0xd7, 0x53, 0x4b, 0xb7, 0xc8, 0xdc, 0x66, 0x27, 0xc1, 0x6c, 0x2c, 0x11, 0xb4, + 0xd8, 0xa6, 0x8e, 0xd7, 0x15, 0x79, 0xdb, 0x6c, 0x03, 0xc6, 0xc6, 0x92, 0xa9, 0x26, 0x1a, 0x33, + 0x74, 0x42, 0xb7, 0x13, 0x50, 0x72, 0x19, 0xc6, 0x19, 0x44, 0xb2, 0x1a, 0xe4, 0xcf, 0x25, 0x35, + 0x10, 0xe3, 0xb4, 0xe1, 0xb7, 0xa8, 0xc6, 0x69, 0x88, 0x73, 0x32, 0xa1, 0x8c, 0x13, 0x83, 0x48, + 0x4e, 0xc3, 0x9c, 0x93, 0x06, 0x22, 0xaf, 0xc1, 0x64, 0xb5, 0xd3, 0xd1, 0x18, 0x61, 0xc2, 0x36, + 0xdb, 0x04, 0x92, 0x4b, 0x00, 0xd5, 0x4e, 0x47, 0xb2, 0xc1, 0x64, 0x6c, 0xb6, 0x06, 0x21, 0x37, + 0xe3, 0xf0, 0x78, 0x1a, 0x2b, 0xbc, 0x0d, 0xb1, 0x33, 0x4a, 0x98, 0x5c, 0x55, 0x2c, 0x31, 0xc1, + 0x14, 0xb8, 0x5c, 0x13, 0x60, 0xf2, 0x11, 0x9c, 0x4b, 0x38, 0x9a, 0x68, 0x15, 0xe0, 0x4d, 0x85, + 0x9d, 0x8f, 0x40, 0xde, 0x85, 0xb3, 0x89, 0x42, 0x59, 0x1d, 0x5e, 0x4a, 0xd8, 0x39, 0xa5, 0xe4, + 0x03, 0x28, 0x27, 0x9e, 0xc0, 0xc7, 0x95, 0xe2, 0x05, 0x84, 0x9d, 0x5b, 0xce, 0xbe, 0xae, 0xc4, + 0x5b, 0x3a, 0x51, 0x25, 0xde, 0xb5, 0xda, 0xd9, 0x85, 0x64, 0x05, 0x2a, 0x99, 0xce, 0x3b, 0x5a, + 0xc5, 0x98, 0x64, 0xce, 0xee, 0x87, 0x46, 0x6a, 0x70, 0x21, 0x13, 0x45, 0x36, 0x03, 0x53, 0xcf, + 0xd9, 0x3d, 0x71, 0xc8, 0x02, 0xcc, 0xc4, 0x4e, 0x4c, 0x5a, 0x13, 0x30, 0xeb, 0x9c, 0x9d, 0x59, + 0x46, 0xde, 0x34, 0x03, 0x1d, 0xf0, 0xca, 0x30, 0xe9, 0x9c, 0x9d, 0x2e, 0xb0, 0x8e, 0x0a, 0x70, + 0x21, 0x73, 0x2f, 0x96, 0x47, 0x86, 0xf9, 0xa4, 0x6e, 0xaa, 0xad, 0x05, 0x37, 0x60, 0x10, 0xcf, + 0x10, 0xdc, 0xd4, 0x2d, 0xfd, 0x76, 0x91, 0x9e, 0xb3, 0x62, 0xa5, 0x36, 0xe2, 0x90, 0x7b, 0xea, + 0x6a, 0x73, 0x00, 0x8d, 0x25, 0xb7, 0x92, 0x3a, 0x5a, 0x46, 0xe5, 0xfa, 0x15, 0xa7, 0xbc, 0xcc, + 0x7c, 0x99, 0x5b, 0xa4, 0x3f, 0x2d, 0x40, 0xa5, 0x8f, 0x0a, 0xa2, 0xfa, 0x54, 0x38, 0x46, 0x9f, + 0xee, 0xab, 0x3e, 0xf1, 0x77, 0xc6, 0x0b, 0xc7, 0x53, 0x73, 0x5e, 0x75, 0xb7, 0xfe, 0xaa, 0x00, + 0x24, 0xad, 0xea, 0x92, 0xef, 0xc1, 0x58, 0xbd, 0xbe, 0x62, 0xb8, 0x30, 0xa6, 0x2e, 0xb7, 0x62, + 0x0c, 0x72, 0xfb, 0x58, 0x3e, 0x8b, 0xba, 0xc7, 0xe2, 0x27, 0x29, 0x47, 0xc9, 0x81, 0x9e, 0x8e, + 0x92, 0x29, 0x37, 0xc9, 0xe5, 0x0c, 0xcf, 0xbf, 0xc1, 0x3e, 0x9e, 0x7f, 0x69, 0xb7, 0x3e, 0x6b, + 0x09, 0xca, 0x79, 0xda, 0x32, 0xae, 0x70, 0x3c, 0xa8, 0x9c, 0x76, 0x41, 0xc7, 0x57, 0x38, 0x13, + 0x6c, 0xbd, 0x0b, 0x67, 0x15, 0x35, 0xcf, 0x56, 0xa3, 0x45, 0x73, 0x10, 0x47, 0x6c, 0x15, 0x35, + 0x22, 0x06, 0x58, 0x7f, 0x32, 0x98, 0x22, 0xac, 0x77, 0x0f, 0x0e, 0x9c, 0xe0, 0x39, 0xa9, 0x9a, + 0x84, 0x03, 0x7d, 0x4f, 0x35, 0xb5, 0x41, 0xa6, 0x63, 0x6a, 0xdc, 0xd9, 0xbe, 0x80, 0x1a, 0x86, + 0xd7, 0xa4, 0xfc, 0x6a, 0xaf, 0xc8, 0x23, 0x56, 0x19, 0x40, 0xb2, 0x0b, 0x93, 0x62, 0xef, 0xc6, + 0xdf, 0xf2, 0x1b, 0xbb, 0x9d, 0xfc, 0xc6, 0x8c, 0xe6, 0xdd, 0x34, 0x48, 0xf8, 0x6c, 0x34, 0xd9, + 0x90, 0x2f, 0x60, 0x4a, 0x6a, 0x6a, 0x82, 0x31, 0x77, 0xc6, 0xba, 0xd3, 0x9b, 0xb1, 0x49, 0xc3, + 0x39, 0x27, 0x18, 0xb1, 0x26, 0xcb, 0xc5, 0x8e, 0x73, 0x1e, 0x3a, 0x4e, 0x93, 0x0d, 0x12, 0xd1, + 0x64, 0x03, 0x36, 0xff, 0x29, 0x90, 0x74, 0xbf, 0xfa, 0x7d, 0x4e, 0x93, 0xda, 0xe7, 0x34, 0x5f, + 0x85, 0xe9, 0x8c, 0x0e, 0x9c, 0x88, 0xc5, 0xa7, 0x40, 0xd2, 0x2d, 0x3d, 0x09, 0x07, 0xeb, 0x3a, + 0xbc, 0xae, 0x44, 0xa0, 0x66, 0x83, 0xc1, 0x53, 0x1a, 0xd9, 0x7f, 0xbd, 0x08, 0x95, 0x3e, 0xa8, + 0xe4, 0xef, 0x15, 0x92, 0xd2, 0xe6, 0xb3, 0xf1, 0xfd, 0xa4, 0xb4, 0xb3, 0xe9, 0x33, 0xc4, 0x5e, + 0xfb, 0xe0, 0x37, 0xfe, 0xfc, 0x85, 0x4f, 0x1e, 0xe9, 0x21, 0x3b, 0xb9, 0xb4, 0x06, 0x75, 0x69, + 0xed, 0xc2, 0x8c, 0x71, 0x2c, 0x3c, 0xce, 0xe6, 0x65, 0x01, 0x88, 0xc4, 0xb9, 0x6b, 0xfe, 0x9e, + 0xc8, 0xef, 0x5b, 0x2c, 0x17, 0x6c, 0x0d, 0x6a, 0xdd, 0x85, 0xd9, 0x04, 0x5f, 0x61, 0xfc, 0xff, + 0x1e, 0xa8, 0x97, 0xfb, 0xc8, 0x78, 0xa0, 0x76, 0xe6, 0xe7, 0x87, 0x95, 0x49, 0xa6, 0xd6, 0xdf, + 0x8c, 0x93, 0x27, 0xc8, 0xbf, 0xac, 0x75, 0xfd, 0xfa, 0xa2, 0xda, 0xd6, 0x23, 0x1a, 0x91, 0x3b, + 0x30, 0xcc, 0x21, 0x89, 0x10, 0xe5, 0x3a, 0xb6, 0x58, 0x17, 0x04, 0xa2, 0x35, 0x8b, 0xef, 0x8c, + 0xf1, 0x47, 0x35, 0x8e, 0x8b, 0x61, 0xed, 0xf0, 0x94, 0x3d, 0x31, 0x58, 0x85, 0x41, 0x1f, 0xac, + 0xc6, 0xf1, 0x3b, 0xa4, 0x1f, 0x8b, 0xc4, 0xf3, 0xfc, 0x67, 0x6d, 0xda, 0xe2, 0xb9, 0x16, 0x6b, + 0x13, 0xe2, 0x8c, 0x3b, 0xe8, 0x30, 0x06, 0x48, 0x66, 0x7d, 0x02, 0xb3, 0x4c, 0x5b, 0x08, 0x92, + 0xf5, 0x61, 0xa2, 0x0e, 0x06, 0x33, 0x9f, 0x13, 0x38, 0x0c, 0x84, 0xcf, 0x09, 0x44, 0xa1, 0xb5, + 0x06, 0xe7, 0xb8, 0xf1, 0x53, 0xef, 0x52, 0x7c, 0xd5, 0x30, 0x84, 0xbf, 0x13, 0xaf, 0x54, 0x33, + 0x7a, 0xcf, 0xf1, 0xac, 0x8f, 0xf1, 0x19, 0x94, 0x98, 0xa8, 0xae, 0xef, 0xc5, 0x96, 0xce, 0xe3, + 0xbd, 0x9b, 0xfe, 0xdf, 0xe1, 0x42, 0xb5, 0xd3, 0xa1, 0x5e, 0x2b, 0x26, 0xdc, 0x0e, 0x9c, 0x63, + 0x46, 0xb5, 0x20, 0x55, 0x18, 0x42, 0x6c, 0x75, 0x07, 0x2c, 0x9a, 0x9b, 0xd1, 0x1c, 0xc4, 0x13, + 0x31, 0x6b, 0xb1, 0x02, 0x4e, 0x69, 0xb5, 0x60, 0xae, 0xde, 0x7d, 0x74, 0xe0, 0x46, 0xf8, 0x08, + 0x01, 0x23, 0xc3, 0xc8, 0xba, 0x57, 0x65, 0x96, 0x35, 0x2e, 0x8c, 0xeb, 0xf1, 0x73, 0x19, 0x7c, + 0xc7, 0x20, 0xa2, 0xc5, 0x3c, 0xbd, 0x73, 0x33, 0x26, 0x45, 0x2b, 0x0f, 0xaf, 0x05, 0x8b, 0x45, + 0x26, 0x36, 0x6b, 0x1a, 0xce, 0xe8, 0x77, 0x5e, 0x7c, 0x86, 0xcc, 0xc2, 0xb4, 0x79, 0x97, 0xc5, + 0xc1, 0x5f, 0xc3, 0x0c, 0xb7, 0xb5, 0xf3, 0x98, 0xf3, 0x0b, 0x71, 0x78, 0xf5, 0xe2, 0xee, 0x42, + 0xe2, 0xf5, 0x03, 0x3a, 0x45, 0xab, 0x6c, 0x22, 0xbb, 0x0b, 0xfc, 0x29, 0xeb, 0xd3, 0x05, 0xe3, + 0x36, 0xb6, 0xb8, 0xbb, 0x50, 0x1b, 0x11, 0xb1, 0x7b, 0x19, 0x77, 0x3e, 0xfc, 0xdf, 0x0a, 0xf7, + 0x05, 0x8c, 0x9e, 0xb0, 0x42, 0x1d, 0x7c, 0xe9, 0x94, 0xfd, 0x06, 0x7d, 0x0a, 0x8a, 0x2a, 0x38, + 0x67, 0xd1, 0x6d, 0x59, 0x7f, 0x50, 0x80, 0xeb, 0x5c, 0x21, 0xcb, 0xa6, 0xc3, 0x8b, 0xad, 0x1c, + 0x62, 0xf2, 0x1e, 0x0c, 0x85, 0x9a, 0x83, 0x87, 0x25, 0x5a, 0xde, 0x8b, 0x13, 0x27, 0x20, 0x55, + 0x98, 0xd0, 0x1f, 0xf4, 0x1c, 0x2f, 0xee, 0x9f, 0x3d, 0x7e, 0xf0, 0xd8, 0x51, 0x8f, 0x7c, 0x9e, + 0xc0, 0xf9, 0xe5, 0x6f, 0xd8, 0x84, 0x10, 0x3b, 0x94, 0x38, 0x3d, 0xc4, 0x6f, 0x9c, 0x4f, 0x6f, + 0x8b, 0x19, 0x63, 0x1e, 0xed, 0x93, 0x60, 0x76, 0x4e, 0x96, 0x9b, 0x9c, 0x52, 0xe1, 0xc7, 0x6c, + 0x03, 0x66, 0xfd, 0x49, 0x01, 0x2e, 0x64, 0xd7, 0x26, 0x16, 0x96, 0x55, 0x38, 0xb3, 0xe8, 0x78, + 0xbe, 0xe7, 0x36, 0x9d, 0x76, 0xbd, 0xb9, 0x4f, 0x5b, 0x5d, 0x15, 0xe1, 0x57, 0xad, 0x32, 0x7b, + 0xd4, 0x93, 0xe4, 0x12, 0xc5, 0x4e, 0x53, 0xb1, 0x13, 0x22, 0xbe, 0x09, 0xe1, 0x6b, 0x6f, 0x9b, + 0x06, 0x8a, 0x1f, 0x6f, 0x59, 0x4e, 0x29, 0xb9, 0x2d, 0x2f, 0x15, 0x5a, 0x3b, 0x9e, 0x1b, 0x29, + 0x22, 0x6e, 0xea, 0xc9, 0x2a, 0xb2, 0xfe, 0x4d, 0x01, 0xce, 0x61, 0x52, 0x2f, 0x23, 0x4d, 0x68, + 0x1c, 0xe8, 0x5a, 0xc6, 0x6a, 0x2e, 0x18, 0x6f, 0x5c, 0x0c, 0x6c, 0x33, 0x68, 0x33, 0x79, 0x13, + 0x06, 0xeb, 0xd2, 0xe1, 0x6c, 0x2a, 0x91, 0xe0, 0x59, 0x50, 0xb0, 0x72, 0x1b, 0xb1, 0xd8, 0x19, + 0x7e, 0x89, 0x86, 0x4d, 0xea, 0x61, 0x26, 0x6e, 0x6e, 0x79, 0xd0, 0x20, 0x71, 0x0c, 0xaa, 0xc1, + 0xbc, 0x18, 0x54, 0x43, 0x66, 0x0c, 0x2a, 0xeb, 0x29, 0x4f, 0xe9, 0x95, 0xec, 0x90, 0x18, 0xa4, + 0x8f, 0x53, 0x89, 0xbb, 0xf9, 0x3e, 0x70, 0x36, 0xab, 0x67, 0x4c, 0x49, 0x4f, 0xe4, 0xe4, 0xce, + 0x0f, 0x2c, 0xbd, 0x05, 0xaf, 0x19, 0xb8, 0xd5, 0x76, 0xdb, 0x7f, 0x46, 0x5b, 0x5b, 0x81, 0x7f, + 0xe0, 0x47, 0x46, 0x4a, 0x23, 0x91, 0xb9, 0x3e, 0xbe, 0x36, 0x12, 0xb3, 0x32, 0x01, 0xb6, 0xfe, + 0x37, 0xb8, 0xd6, 0x87, 0xa3, 0xe8, 0x54, 0x1d, 0xce, 0x38, 0x89, 0x32, 0xe9, 0x39, 0x74, 0x2d, + 0xab, 0x5f, 0x49, 0x46, 0xa1, 0x9d, 0xa6, 0xbf, 0xb1, 0x6d, 0x24, 0xbb, 0x26, 0x65, 0x98, 0xd9, + 0xb2, 0x37, 0x97, 0x76, 0x16, 0xb7, 0x1b, 0xdb, 0x5f, 0x6c, 0x2d, 0x37, 0x76, 0x36, 0x1e, 0x6c, + 0x6c, 0x3e, 0xdc, 0xe0, 0x91, 0xd9, 0x8d, 0x92, 0xed, 0xe5, 0xea, 0x7a, 0xa9, 0x40, 0x66, 0xa0, + 0x64, 0x80, 0x97, 0x77, 0x6a, 0xa5, 0xe2, 0x8d, 0xaf, 0x8d, 0x24, 0xce, 0xe4, 0x02, 0x94, 0xeb, + 0x3b, 0x5b, 0x5b, 0x9b, 0xb6, 0xe2, 0xaa, 0xc7, 0x85, 0x9f, 0x85, 0x33, 0x46, 0xe9, 0x5d, 0x7b, + 0x79, 0xb9, 0x54, 0x60, 0x4d, 0x31, 0xc0, 0x5b, 0xf6, 0xf2, 0xfa, 0xea, 0xce, 0x7a, 0xa9, 0x78, + 0xa3, 0xa1, 0x3f, 0xac, 0x23, 0xe7, 0x61, 0x6e, 0x69, 0x79, 0x77, 0x75, 0x71, 0x39, 0x8b, 0xf7, + 0x0c, 0x94, 0xf4, 0xc2, 0xed, 0xcd, 0xed, 0x2d, 0xce, 0x5a, 0x87, 0x3e, 0x5c, 0xae, 0x55, 0x77, + 0xb6, 0x57, 0x36, 0x4a, 0x03, 0xd6, 0xe0, 0x68, 0xb1, 0x54, 0xbc, 0xf1, 0x23, 0xe3, 0xd5, 0x1d, + 0x6b, 0xbe, 0x40, 0xdf, 0xa9, 0x57, 0xef, 0xe5, 0x57, 0xc1, 0x4b, 0xd7, 0xef, 0x56, 0x4b, 0x05, + 0x72, 0x11, 0xce, 0x19, 0xd0, 0xad, 0x6a, 0xbd, 0xfe, 0x70, 0xd3, 0x5e, 0x5a, 0x5b, 0xae, 0xd7, + 0x4b, 0xc5, 0x1b, 0xbb, 0x46, 0xdc, 0x3d, 0x56, 0xc3, 0xfa, 0xdd, 0x6a, 0xc3, 0x5e, 0xfe, 0x6c, + 0x67, 0xd5, 0x5e, 0x5e, 0x4a, 0xd7, 0x60, 0x94, 0x7e, 0xb1, 0x5c, 0x2f, 0x15, 0xc8, 0x34, 0x9c, + 0x36, 0xa0, 0x1b, 0x9b, 0xa5, 0xe2, 0x8d, 0xd7, 0x45, 0x68, 0x36, 0x32, 0x05, 0xb0, 0xb4, 0x5c, + 0x5f, 0x5c, 0xde, 0x58, 0x5a, 0xdd, 0xb8, 0x57, 0x3a, 0x45, 0x26, 0x61, 0xac, 0xaa, 0x7e, 0x16, + 0x6e, 0x7c, 0x00, 0xa7, 0x13, 0xc7, 0x7b, 0x86, 0xa1, 0x0e, 0xc6, 0xa5, 0x53, 0x28, 0x7e, 0xf9, + 0x13, 0x6d, 0xac, 0xfc, 0xa4, 0x5e, 0x2a, 0xdc, 0xa8, 0xc9, 0xbc, 0xbf, 0xda, 0x77, 0x4e, 0xc6, + 0x61, 0x64, 0x69, 0xf9, 0x6e, 0x75, 0x67, 0x6d, 0xbb, 0x74, 0x8a, 0xfd, 0x58, 0xb4, 0x97, 0xab, + 0xdb, 0xcb, 0x4b, 0xa5, 0x02, 0x19, 0x83, 0xa1, 0xfa, 0x76, 0x75, 0x7b, 0xb9, 0x54, 0x24, 0xa3, + 0x30, 0xb8, 0x53, 0x5f, 0xb6, 0x4b, 0x03, 0x0b, 0xff, 0xfc, 0xef, 0x16, 0xb8, 0xa1, 0x51, 0xbe, + 0xe0, 0xfa, 0x5a, 0x3b, 0x50, 0x8a, 0x25, 0x4f, 0x24, 0x39, 0xcd, 0x3d, 0x3d, 0xa2, 0x16, 0x30, + 0xdf, 0xe3, 0x72, 0x07, 0x11, 0xae, 0x17, 0x6e, 0x17, 0x88, 0x8d, 0xce, 0x30, 0x89, 0xf3, 0x95, + 0xe2, 0x9c, 0x7d, 0x04, 0x9e, 0xbf, 0xd8, 0xf3, 0x58, 0x46, 0x7e, 0x05, 0x2c, 0x9d, 0x67, 0xce, + 0x29, 0xe4, 0x7b, 0xc7, 0x3b, 0x6d, 0xc8, 0x3a, 0x5f, 0x3f, 0x1e, 0x3a, 0xb9, 0x0f, 0x93, 0x4c, + 0x37, 0x57, 0x68, 0xe4, 0x7c, 0x92, 0x50, 0x3b, 0x12, 0xcc, 0x5f, 0xc8, 0x2e, 0x54, 0x79, 0x88, + 0x26, 0xb0, 0x23, 0xfc, 0x70, 0x1d, 0x12, 0x19, 0xbe, 0x43, 0x42, 0xf8, 0x8a, 0x3f, 0x7f, 0x26, + 0x01, 0xde, 0xbd, 0x73, 0xbb, 0x40, 0xea, 0x18, 0x3b, 0xcf, 0x50, 0xf2, 0x89, 0x7c, 0x52, 0x98, + 0xd6, 0xfe, 0x79, 0x6b, 0x2a, 0x2a, 0x6b, 0x68, 0xce, 0xe9, 0x60, 0x03, 0x48, 0x5a, 0x77, 0x26, + 0x97, 0xe3, 0x79, 0x90, 0xad, 0x56, 0xcf, 0x9f, 0x4d, 0x5d, 0x64, 0x2d, 0x33, 0xed, 0x89, 0x2c, + 0xc3, 0x94, 0x78, 0x9b, 0x2f, 0xb4, 0x79, 0xd2, 0xeb, 0x3c, 0x90, 0xcb, 0xe6, 0x1e, 0xca, 0x49, + 0x9d, 0x08, 0xc8, 0x7c, 0xdc, 0x8f, 0xe4, 0x31, 0x61, 0xfe, 0x7c, 0x66, 0x99, 0xe8, 0xdf, 0x5d, + 0x98, 0x32, 0x0f, 0x17, 0x44, 0x0e, 0x50, 0xe6, 0x99, 0x23, 0xb7, 0x41, 0x0d, 0x98, 0x5b, 0x77, + 0x5c, 0xbc, 0x2f, 0x11, 0x4e, 0x7a, 0xd2, 0x0f, 0x8e, 0x54, 0x7a, 0x38, 0xc6, 0xd5, 0xa9, 0xd7, + 0x52, 0x83, 0x90, 0x97, 0x53, 0x00, 0x3f, 0x9b, 0xba, 0xd4, 0x91, 0x4d, 0x1f, 0x45, 0x62, 0x99, + 0x99, 0xa0, 0xb3, 0xdc, 0x4e, 0xe7, 0xf3, 0x3c, 0xa5, 0xc9, 0x3a, 0x2a, 0xe9, 0x09, 0x8e, 0xda, + 0x9c, 0x38, 0x31, 0xbb, 0x32, 0x46, 0x88, 0xd0, 0xd2, 0xf3, 0x8b, 0xc2, 0x90, 0xe4, 0x08, 0x2e, + 0x97, 0xd9, 0xed, 0x02, 0xf9, 0x1a, 0xbf, 0xea, 0x4c, 0x76, 0x0f, 0xdd, 0x68, 0x5f, 0x68, 0x3f, + 0xe7, 0x33, 0x19, 0x88, 0x0f, 0xa5, 0x07, 0x77, 0x1b, 0x66, 0xb2, 0x9c, 0xb3, 0x95, 0x40, 0x7b, + 0x78, 0x6e, 0xe7, 0xce, 0x02, 0x9b, 0x1d, 0x35, 0x5a, 0xf9, 0x83, 0xd4, 0xc3, 0x37, 0x38, 0x97, + 0xe7, 0x47, 0x30, 0xc5, 0x66, 0xc9, 0x03, 0x4a, 0x3b, 0xd5, 0xb6, 0xfb, 0x94, 0x86, 0x44, 0x06, + 0x3e, 0x56, 0xa0, 0x3c, 0xda, 0xeb, 0x05, 0xf2, 0x5d, 0x18, 0x7f, 0xe8, 0x44, 0xcd, 0x7d, 0x11, + 0x00, 0x54, 0xc6, 0x07, 0x45, 0xd8, 0xbc, 0xfc, 0x85, 0x85, 0xb7, 0x0b, 0xe4, 0x07, 0x30, 0x72, + 0x8f, 0x46, 0xf8, 0xa4, 0xfb, 0x8a, 0xf2, 0x25, 0xe4, 0xf6, 0xc9, 0x55, 0x4f, 0xbd, 0x42, 0x92, + 0x0d, 0x4e, 0x1a, 0x73, 0xc9, 0x2d, 0x00, 0xbe, 0x20, 0x20, 0x87, 0x64, 0xf1, 0x7c, 0xaa, 0xd9, + 0xe4, 0x1e, 0x53, 0x1e, 0xda, 0x34, 0xa2, 0xc7, 0xad, 0x32, 0x4f, 0x46, 0x6b, 0x30, 0xa5, 0x52, + 0x37, 0x6d, 0x60, 0x9c, 0x16, 0x2b, 0xc1, 0x2c, 0x3c, 0x01, 0xb7, 0x0f, 0xd8, 0x57, 0xc1, 0xf3, + 0x16, 0x63, 0x40, 0x0f, 0x5c, 0x49, 0xe7, 0xf4, 0xa8, 0x20, 0xfa, 0x12, 0x2a, 0x85, 0xc8, 0xd1, + 0x34, 0xda, 0x15, 0x3f, 0x8c, 0x4c, 0x5a, 0x05, 0xc9, 0xa6, 0xfd, 0x65, 0x98, 0xd7, 0xeb, 0x35, + 0x23, 0x50, 0xc7, 0x6b, 0x6e, 0x5e, 0x60, 0xeb, 0xf9, 0x2b, 0x3d, 0x30, 0xc4, 0xf9, 0x6d, 0xe0, + 0xb7, 0x8a, 0x05, 0x5c, 0x4e, 0x96, 0x60, 0x5a, 0xd6, 0xb5, 0xd9, 0xa1, 0x5e, 0xbd, 0xbe, 0x82, + 0x69, 0x7a, 0xa4, 0xe7, 0x8a, 0x06, 0x93, 0xdc, 0x49, 0xba, 0x88, 0x6d, 0x7d, 0x46, 0xe0, 0x0e, + 0xd2, 0x2b, 0x9c, 0x47, 0xbc, 0xf5, 0x65, 0x86, 0x46, 0x7e, 0xc0, 0x8d, 0x4a, 0x86, 0xf2, 0xbf, + 0xbb, 0x40, 0x7a, 0x1c, 0x80, 0xe6, 0x73, 0x8e, 0x10, 0xb7, 0x0b, 0xe4, 0x0b, 0x20, 0xe9, 0x23, + 0x89, 0x12, 0x61, 0xee, 0xf1, 0x4b, 0x89, 0xb0, 0xc7, 0x79, 0xe6, 0x1e, 0xcc, 0xaa, 0xb0, 0x3d, + 0x5a, 0xad, 0x0b, 0x24, 0xa7, 0x35, 0x79, 0xad, 0x24, 0x9f, 0xc0, 0xb4, 0x98, 0xb4, 0x7a, 0x01, + 0x29, 0xa9, 0xf5, 0x47, 0x9c, 0x4a, 0x72, 0xe7, 0xe9, 0x7d, 0x98, 0xad, 0x27, 0x24, 0xc6, 0x9d, + 0xf9, 0xcf, 0x99, 0x2c, 0x10, 0x58, 0xa7, 0x11, 0x17, 0x59, 0x36, 0xaf, 0x07, 0x40, 0xb8, 0x51, + 0x48, 0xb2, 0x7b, 0xea, 0xd2, 0x67, 0xe4, 0x62, 0xa2, 0xe9, 0x0c, 0x88, 0x68, 0xb8, 0x80, 0xe5, + 0xf6, 0x6c, 0x9b, 0x67, 0xdd, 0x46, 0xa8, 0x71, 0x8f, 0x7e, 0xd9, 0x20, 0x30, 0xae, 0xe2, 0xc5, + 0x00, 0x9c, 0xcb, 0xc5, 0x20, 0xbf, 0x86, 0xf1, 0x72, 0x7b, 0x1f, 0xab, 0xc8, 0x77, 0xb3, 0x4e, + 0xbf, 0x39, 0x07, 0xc3, 0xf9, 0x37, 0x8f, 0x87, 0xac, 0x0e, 0xb2, 0x93, 0xf7, 0x68, 0xb4, 0xd5, + 0xee, 0xee, 0xb9, 0x98, 0x8f, 0x95, 0x28, 0xa3, 0x91, 0x02, 0x89, 0x79, 0x29, 0xc3, 0xd4, 0xc5, + 0x05, 0x75, 0xfa, 0x63, 0xb2, 0x0a, 0x25, 0xbe, 0xfe, 0x6b, 0x2c, 0x2e, 0xa6, 0x58, 0x08, 0x14, + 0x27, 0x70, 0x0e, 0xc2, 0xdc, 0xd1, 0xba, 0xc5, 0x7d, 0xa3, 0x88, 0xfc, 0x26, 0x75, 0x05, 0x73, + 0xda, 0x80, 0xa9, 0x1c, 0x02, 0x6c, 0x44, 0x6c, 0x1a, 0xd2, 0x48, 0x06, 0xe6, 0xe1, 0xd9, 0x78, + 0xaf, 0xc6, 0x9b, 0x7d, 0xba, 0x34, 0xfe, 0xf4, 0x13, 0x41, 0xe4, 0x76, 0xdf, 0x22, 0x2a, 0x43, + 0x71, 0x06, 0xd3, 0xd7, 0x0d, 0x9d, 0xe4, 0x64, 0x7c, 0xdf, 0xc6, 0x3d, 0x08, 0x83, 0x11, 0xcd, + 0xc6, 0x6d, 0x63, 0xbf, 0x25, 0xd5, 0xa4, 0x46, 0xb5, 0xbb, 0x80, 0x4b, 0x1a, 0xdb, 0x24, 0x99, + 0x0a, 0xdb, 0x0d, 0x02, 0xea, 0x71, 0xe2, 0x3c, 0x7d, 0x23, 0x8b, 0xfa, 0x63, 0x5c, 0x7a, 0x34, + 0x6a, 0xfe, 0xe6, 0xb0, 0x1f, 0x0b, 0x9e, 0x3d, 0xea, 0x76, 0x81, 0xbc, 0x07, 0xa3, 0xa2, 0x8d, + 0x8c, 0xc8, 0x68, 0x74, 0xd8, 0xa3, 0xd5, 0x48, 0x09, 0x5c, 0x48, 0xd8, 0x66, 0x13, 0x27, 0x6f, + 0xf4, 0x79, 0x9b, 0xdf, 0x63, 0x9b, 0x6d, 0xeb, 0x45, 0x28, 0x17, 0xe5, 0xae, 0x8b, 0x94, 0x65, + 0x15, 0xc0, 0x46, 0x82, 0xfa, 0x6c, 0x8f, 0x9c, 0x09, 0xd3, 0x9b, 0x31, 0x0a, 0xa4, 0x0a, 0xe6, + 0xa6, 0xf4, 0x66, 0x03, 0xdc, 0x6f, 0xaf, 0x5d, 0x85, 0x52, 0xb5, 0x89, 0x3b, 0x41, 0x9d, 0x1e, + 0x38, 0x9d, 0x7d, 0x3f, 0xa0, 0xea, 0xd0, 0x92, 0x2c, 0x90, 0xbc, 0x66, 0x95, 0x66, 0x21, 0x0a, + 0xd6, 0xa8, 0x83, 0xa1, 0xb2, 0xe7, 0x94, 0x6a, 0x91, 0x28, 0xca, 0xa6, 0xe8, 0x71, 0x48, 0x99, + 0x59, 0x64, 0xc7, 0xaa, 0xf6, 0xcb, 0xb1, 0xf9, 0x00, 0x17, 0x0c, 0x85, 0x1c, 0xaa, 0x1d, 0x42, + 0x81, 0xd4, 0x71, 0x4e, 0x3e, 0x3f, 0x52, 0xa8, 0x55, 0x79, 0x6f, 0x1c, 0x8b, 0x25, 0x8f, 0x3a, + 0xaf, 0xfa, 0xef, 0xc3, 0xd4, 0x32, 0x5b, 0xd0, 0xbb, 0x2d, 0x97, 0xa7, 0x07, 0x20, 0x66, 0xbc, + 0xf7, 0x5c, 0xc2, 0x15, 0x99, 0xb0, 0x0d, 0x49, 0xc5, 0xd1, 0x5f, 0xee, 0x29, 0x1a, 0x4c, 0x8e, + 0xc7, 0x8c, 0x64, 0x2b, 0x32, 0x34, 0xe0, 0xd1, 0x5c, 0x9c, 0xf5, 0xe7, 0xb8, 0x46, 0x58, 0xed, + 0x74, 0xda, 0xd2, 0x24, 0xcd, 0xef, 0xde, 0xaf, 0x19, 0x47, 0xc8, 0x54, 0xb9, 0xe4, 0x9d, 0x56, + 0x1a, 0x3f, 0xd7, 0x12, 0x28, 0xe7, 0xf0, 0xcc, 0x29, 0xef, 0x37, 0x17, 0x55, 0x40, 0xef, 0x6a, + 0xbb, 0x9d, 0x22, 0x0e, 0xc9, 0x1b, 0x26, 0xf7, 0x2c, 0x9c, 0x7e, 0x35, 0xe0, 0x11, 0x9d, 0x6b, + 0x5d, 0xd5, 0x4e, 0x87, 0x2f, 0x96, 0x97, 0xd4, 0x82, 0x61, 0x16, 0xa4, 0x8f, 0xe8, 0xc9, 0x72, + 0xb1, 0xb6, 0xdf, 0xc7, 0x69, 0x16, 0x67, 0x59, 0x26, 0xfa, 0x81, 0x37, 0x99, 0x64, 0x5a, 0x29, + 0x61, 0x89, 0x42, 0xb5, 0x4f, 0x9c, 0x46, 0xd5, 0x27, 0x4e, 0xd9, 0xac, 0x2c, 0x33, 0x09, 0xb8, + 0xe4, 0x77, 0x29, 0xaf, 0x58, 0x59, 0x4a, 0x4b, 0xc9, 0x4c, 0xf6, 0xaa, 0xcb, 0xe9, 0x14, 0xf7, + 0x66, 0x97, 0x73, 0x53, 0xe0, 0xdf, 0x87, 0x52, 0x32, 0x89, 0xb6, 0x62, 0x9a, 0x93, 0x5d, 0x3b, + 0x77, 0x4c, 0xee, 0xc2, 0x8c, 0x3e, 0xa2, 0xaa, 0xdf, 0x79, 0xab, 0x7f, 0x1e, 0x9f, 0x6d, 0x98, + 0xcd, 0xcc, 0x79, 0xad, 0xb6, 0xd8, 0x5e, 0x19, 0xb1, 0x73, 0xb9, 0x52, 0x38, 0x9b, 0x9d, 0xf6, + 0x9e, 0xbc, 0x66, 0x1e, 0xfc, 0xb3, 0x93, 0x80, 0xcf, 0x5f, 0xeb, 0x83, 0x25, 0x04, 0xfa, 0x35, + 0xee, 0x80, 0xa9, 0x3a, 0xae, 0x68, 0xa6, 0x80, 0x9c, 0x0a, 0xac, 0x5e, 0x28, 0x6a, 0x0e, 0xcc, + 0x64, 0x14, 0xe7, 0x8b, 0xf8, 0x6a, 0x3e, 0xcf, 0x78, 0x62, 0xed, 0xca, 0xb8, 0xd5, 0xb9, 0x92, + 0xe9, 0x99, 0x1e, 0xbd, 0xc7, 0x59, 0x72, 0x5e, 0xcd, 0x87, 0xe3, 0x37, 0x39, 0x8f, 0x5b, 0x4b, + 0x99, 0x6d, 0x8c, 0xdc, 0xe5, 0x49, 0xb3, 0x4d, 0x56, 0xce, 0x75, 0x25, 0x86, 0x5e, 0x59, 0xfd, + 0xf9, 0x6e, 0xfc, 0x15, 0xb7, 0xe3, 0x98, 0x55, 0xe8, 0x76, 0x9c, 0x4c, 0xfe, 0x97, 0xf3, 0x11, + 0x74, 0xe6, 0x0e, 0xbf, 0xb4, 0x4d, 0x24, 0x5f, 0x27, 0xfa, 0x51, 0x29, 0x3b, 0x31, 0xbb, 0x9a, + 0x1b, 0x99, 0x28, 0x7a, 0x15, 0x0f, 0xe5, 0x37, 0x98, 0x23, 0xa5, 0x1e, 0x99, 0xe9, 0x7b, 0xab, + 0x29, 0x9b, 0x50, 0x8e, 0x07, 0x33, 0xd1, 0x81, 0x13, 0x0e, 0xa5, 0x14, 0xc6, 0xb9, 0xdc, 0x7c, + 0xf4, 0xe4, 0x3b, 0xa9, 0x2f, 0x3d, 0x47, 0x30, 0x3d, 0xab, 0xe0, 0xeb, 0xb9, 0x16, 0x07, 0xfb, + 0x7c, 0x6c, 0xc4, 0xd5, 0x53, 0xd7, 0xa7, 0xd6, 0xf3, 0x8c, 0xbc, 0xf6, 0xf7, 0x50, 0x2f, 0xd6, + 0x72, 0xd3, 0xe7, 0xf6, 0xfa, 0x62, 0x16, 0x9f, 0x30, 0xbd, 0xe2, 0x6a, 0xed, 0x92, 0x7a, 0x5a, + 0xb2, 0xe0, 0x24, 0x2b, 0xee, 0x71, 0x9a, 0x96, 0xc7, 0x67, 0x09, 0xc6, 0xb5, 0xa4, 0xf6, 0xe4, + 0x9c, 0x21, 0x26, 0x63, 0x0f, 0x9d, 0x37, 0x3a, 0x67, 0x6e, 0x9f, 0x8b, 0x68, 0x4a, 0x56, 0xa9, + 0xf1, 0x73, 0x5b, 0x71, 0x3e, 0xcd, 0xc3, 0x30, 0x23, 0x2b, 0x29, 0xf0, 0xd6, 0x5c, 0x48, 0x0a, + 0xc7, 0x68, 0x50, 0x7e, 0x97, 0x88, 0x2e, 0x9a, 0x3e, 0x4d, 0xca, 0xd7, 0x5f, 0xa7, 0x45, 0xe6, + 0x5c, 0x4c, 0x5e, 0x23, 0x03, 0x1d, 0x9e, 0x55, 0x36, 0x31, 0x0d, 0x8a, 0x06, 0x8a, 0x6c, 0x36, + 0x5b, 0xf8, 0x7c, 0x24, 0x23, 0xcb, 0xbf, 0x5a, 0x61, 0xb3, 0x8b, 0xf3, 0x75, 0x37, 0xb5, 0x66, + 0xe7, 0x72, 0xec, 0x99, 0xf6, 0x3f, 0xb7, 0xa5, 0x3f, 0xd4, 0xd6, 0xec, 0x54, 0x2e, 0x7f, 0x72, + 0x3d, 0xa9, 0xb8, 0xe5, 0xa5, 0xfb, 0xef, 0xb1, 0x27, 0xcc, 0xa4, 0x73, 0xcf, 0x1b, 0x76, 0xdd, + 0x74, 0x61, 0xbe, 0x14, 0x6c, 0x39, 0xff, 0x73, 0xb8, 0x65, 0x15, 0xf6, 0x6b, 0xe1, 0x97, 0xda, + 0x42, 0x97, 0x48, 0xde, 0xaf, 0x8e, 0xe3, 0x7d, 0xb2, 0xfb, 0xe7, 0xf2, 0xde, 0xc0, 0x27, 0x4d, + 0xe9, 0xcc, 0xfb, 0x4a, 0xb3, 0xe9, 0x95, 0x97, 0x3f, 0xd3, 0xec, 0x3b, 0x9b, 0xee, 0x22, 0xe3, + 0x77, 0x36, 0x61, 0xb4, 0xed, 0xd7, 0xb0, 0xaf, 0xe5, 0x62, 0x9c, 0x91, 0xb1, 0x3f, 0xb1, 0x18, + 0xe7, 0xe7, 0xf4, 0xef, 0x71, 0x0c, 0x3a, 0x5d, 0x77, 0xf7, 0x3c, 0x2d, 0xe1, 0xbe, 0x3a, 0x04, + 0x19, 0x49, 0xf8, 0xcd, 0x25, 0x26, 0x2b, 0x3f, 0xff, 0x26, 0xd3, 0x7f, 0xb8, 0xf6, 0xae, 0xa7, + 0x4e, 0x27, 0xf3, 0xf9, 0x19, 0xe3, 0xd5, 0x72, 0x93, 0x99, 0x6b, 0x5d, 0x63, 0xa8, 0xe7, 0x2d, + 0x57, 0x0c, 0x33, 0x52, 0xa8, 0x2b, 0x86, 0x99, 0x89, 0xce, 0x6f, 0xa1, 0xd5, 0xc5, 0xf6, 0xdb, + 0x54, 0xb7, 0xba, 0x68, 0x89, 0xb0, 0x13, 0x46, 0x0f, 0xf2, 0x31, 0x8c, 0xa9, 0x44, 0xe1, 0xca, + 0xbe, 0x9d, 0xcc, 0x55, 0x3e, 0x5f, 0x4e, 0x17, 0x88, 0x0a, 0xdf, 0x91, 0x86, 0x0f, 0xac, 0xb3, + 0x6c, 0x1a, 0x8c, 0xf2, 0xab, 0x7d, 0x47, 0x5a, 0x3d, 0x0c, 0xb2, 0x54, 0x9a, 0xf0, 0x24, 0xd9, + 0xf7, 0x61, 0x22, 0x4e, 0x09, 0xbe, 0xbb, 0xa0, 0x11, 0x26, 0xf2, 0x84, 0x27, 0x09, 0xdf, 0x93, + 0x57, 0x1a, 0x58, 0x9f, 0x59, 0xd8, 0x7b, 0x17, 0xff, 0x58, 0x5a, 0x59, 0x8c, 0x96, 0xa6, 0x12, + 0x8c, 0xf7, 0x58, 0x7c, 0x27, 0xf4, 0x1c, 0x9d, 0x6a, 0x68, 0x33, 0xb2, 0xec, 0xaa, 0xa1, 0xcd, + 0xca, 0x92, 0x1b, 0x9b, 0xfc, 0xbf, 0x90, 0x26, 0x85, 0x98, 0xe9, 0x45, 0xa3, 0x59, 0x29, 0xbe, + 0x97, 0xf2, 0x8a, 0x93, 0xac, 0xeb, 0x50, 0x4a, 0x26, 0x14, 0x55, 0xe7, 0xb1, 0x9c, 0xcc, 0xaf, + 0xea, 0x90, 0x97, 0x9b, 0x89, 0x74, 0x4b, 0xda, 0xc7, 0x4d, 0xbe, 0x57, 0xb2, 0x1b, 0xa5, 0xb3, + 0xce, 0x37, 0x98, 0x4f, 0x1a, 0xb9, 0x45, 0xf5, 0x93, 0x72, 0x2a, 0x77, 0xa9, 0xae, 0x59, 0x65, + 0xa4, 0x23, 0x75, 0x65, 0xd0, 0xaa, 0xec, 0x34, 0xf0, 0x6f, 0x98, 0x47, 0xd8, 0x1e, 0x81, 0xe8, + 0xfb, 0x5e, 0xff, 0x92, 0x5f, 0x82, 0xb9, 0x9c, 0xc0, 0xda, 0xe4, 0x5a, 0xc2, 0xd2, 0x9a, 0x1d, + 0x78, 0x5b, 0x4d, 0x90, 0xcc, 0xa4, 0xdf, 0xeb, 0xe8, 0x37, 0x60, 0x84, 0x90, 0x48, 0xdd, 0xc5, + 0x3d, 0x74, 0xa3, 0x7d, 0x9e, 0xdb, 0x5a, 0x5b, 0x36, 0x33, 0x63, 0x4f, 0x90, 0x3a, 0x9e, 0x45, + 0x0c, 0x68, 0xc6, 0x75, 0x5c, 0x06, 0xc3, 0xf9, 0x6c, 0x86, 0x6c, 0xed, 0x60, 0x73, 0x21, 0x23, + 0xbe, 0x87, 0x9a, 0x0b, 0xf9, 0xb1, 0x3f, 0x72, 0x9b, 0xb9, 0x25, 0x75, 0xa4, 0x6c, 0x8e, 0xf9, + 0xa1, 0x3e, 0x72, 0x39, 0xde, 0x67, 0x1c, 0x53, 0xd1, 0x3b, 0x48, 0x0e, 0x7a, 0xef, 0xd5, 0xc3, + 0x96, 0x5b, 0xae, 0x49, 0xb5, 0xa0, 0xb5, 0x2f, 0x2f, 0x4e, 0x48, 0x6e, 0xfb, 0x96, 0xe5, 0xf7, + 0x94, 0xdd, 0xbe, 0xe3, 0x6e, 0xba, 0xea, 0xfe, 0x2b, 0x11, 0x40, 0xc6, 0xe8, 0xa8, 0x06, 0x9f, + 0xcf, 0x81, 0x93, 0x0d, 0x74, 0x04, 0x4a, 0x42, 0xb5, 0x43, 0x69, 0x76, 0x84, 0x9a, 0x5c, 0x7e, + 0x7c, 0x1e, 0x1b, 0x11, 0x3e, 0x4e, 0x32, 0x8f, 0x13, 0xa1, 0x41, 0xc4, 0x3c, 0x36, 0xa0, 0x27, + 0x9b, 0xc7, 0x09, 0x86, 0xe6, 0x3c, 0x4e, 0x36, 0x33, 0x79, 0xd2, 0xcf, 0x1d, 0xd5, 0x64, 0x33, + 0xd5, 0x3c, 0xce, 0xe6, 0x98, 0x1f, 0x89, 0x25, 0x97, 0xa3, 0x9a, 0xc7, 0x26, 0xc7, 0x1c, 0xf4, + 0x63, 0xce, 0xe3, 0x64, 0x25, 0xe6, 0x3c, 0x3e, 0x51, 0xfb, 0xd4, 0x3c, 0xce, 0x6e, 0xdf, 0x89, + 0xe7, 0x71, 0x22, 0x74, 0x91, 0xd1, 0xd1, 0xac, 0x79, 0x9c, 0xc4, 0xe7, 0xf3, 0x38, 0x09, 0x4d, + 0x18, 0x57, 0x7a, 0xcc, 0xe3, 0x24, 0xe5, 0x67, 0xc8, 0x2f, 0x11, 0x76, 0xe5, 0x38, 0x33, 0x39, + 0x37, 0x62, 0x0b, 0x79, 0x88, 0xe6, 0xbd, 0x04, 0xfc, 0x78, 0xb3, 0xf9, 0x42, 0x1e, 0x53, 0x9c, + 0xcf, 0xbb, 0x52, 0x88, 0xc9, 0xe6, 0x9a, 0xb6, 0xab, 0xec, 0xa8, 0x33, 0x3d, 0x1a, 0xbc, 0xcb, + 0xe6, 0x4d, 0xab, 0x07, 0xdf, 0x5e, 0x41, 0x73, 0x7a, 0xf0, 0x55, 0x47, 0x99, 0x24, 0xdf, 0x5c, + 0x92, 0xde, 0xf3, 0xfb, 0x73, 0x79, 0xc1, 0x91, 0xa4, 0x5b, 0x48, 0x1c, 0x8e, 0x4e, 0xdc, 0x52, + 0x75, 0x48, 0x4a, 0xb6, 0xf4, 0xa4, 0xf3, 0x7c, 0x5d, 0x6a, 0x0f, 0xa9, 0x68, 0x5b, 0x89, 0x4e, + 0xeb, 0x73, 0x3d, 0xb7, 0x84, 0x6c, 0xa3, 0x2d, 0x37, 0x0d, 0xd7, 0xec, 0xc0, 0x79, 0x61, 0xbd, + 0xfa, 0x72, 0x4d, 0xc5, 0x0d, 0xd2, 0xb9, 0xe6, 0x05, 0x15, 0x52, 0x5c, 0xd3, 0xd4, 0x9f, 0xa0, + 0xf5, 0x4b, 0xbc, 0xb8, 0xf2, 0x1e, 0xfb, 0xf9, 0x96, 0x94, 0x69, 0xc3, 0x59, 0x89, 0xe1, 0xa2, + 0x8f, 0xd8, 0x47, 0xe2, 0x06, 0x4f, 0x02, 0x73, 0x85, 0x9f, 0x45, 0x4f, 0x3e, 0x81, 0x92, 0x58, + 0xde, 0x62, 0x06, 0x59, 0x88, 0xb9, 0x43, 0x57, 0x93, 0x46, 0xb7, 0x63, 0xb4, 0xe0, 0x38, 0xc6, + 0xb6, 0xe3, 0x48, 0x22, 0xdf, 0x32, 0xc5, 0xb6, 0xc3, 0xed, 0xa0, 0x1b, 0x46, 0xb4, 0x95, 0xb6, + 0x28, 0x99, 0x8d, 0x91, 0x9e, 0x11, 0x26, 0xfa, 0xee, 0x02, 0x59, 0xc5, 0xb5, 0xcd, 0x04, 0xf7, + 0x32, 0xb9, 0x65, 0xb3, 0xc1, 0xa5, 0x67, 0x45, 0x3d, 0xeb, 0x31, 0xdb, 0x94, 0x57, 0x77, 0x7e, + 0xa3, 0x94, 0x88, 0x8e, 0xd9, 0xbb, 0x3c, 0x11, 0x7d, 0x88, 0x6e, 0x00, 0xdc, 0xfc, 0xd7, 0x4f, + 0x32, 0xc9, 0x87, 0x46, 0xe4, 0x53, 0x18, 0x93, 0xc4, 0xfd, 0x05, 0x92, 0xa4, 0x46, 0x81, 0x2c, + 0xc1, 0xa4, 0xf1, 0x8a, 0x4a, 0x9d, 0x6e, 0xb2, 0xde, 0x56, 0xf5, 0x18, 0xe7, 0x49, 0xe3, 0xb5, + 0x94, 0xe2, 0x92, 0xf5, 0x86, 0x2a, 0x97, 0xcb, 0x0f, 0x60, 0x5c, 0x88, 0xb4, 0xa7, 0x34, 0xf2, + 0xed, 0x6d, 0xb3, 0x9a, 0x47, 0x72, 0xb7, 0xe5, 0x46, 0x8b, 0xbe, 0xf7, 0xd8, 0xdd, 0xeb, 0x2b, + 0x98, 0x34, 0xc9, 0xee, 0x02, 0xf9, 0x0a, 0x33, 0x41, 0xcb, 0xfc, 0xdc, 0x34, 0x7a, 0xe6, 0x07, + 0x4f, 0x5c, 0x6f, 0xaf, 0x0f, 0xcb, 0xcb, 0x26, 0xcb, 0x24, 0x9d, 0xf4, 0x1d, 0xf9, 0x0a, 0xe6, + 0xeb, 0xf9, 0xcc, 0xfb, 0x32, 0xe9, 0xbd, 0xbd, 0xd4, 0xe1, 0x02, 0x7a, 0xcf, 0x9c, 0xb4, 0xed, + 0x3d, 0x99, 0x7e, 0xc1, 0x03, 0x36, 0x4a, 0x5b, 0x7d, 0xd3, 0x0f, 0x5a, 0xfd, 0x39, 0x56, 0x4c, + 0x47, 0xda, 0x04, 0x99, 0x14, 0xc6, 0x17, 0x70, 0xae, 0x9e, 0xcb, 0xba, 0x1f, 0x8b, 0x7e, 0x9a, + 0xe4, 0x79, 0x14, 0xc5, 0x09, 0xdb, 0xdd, 0x93, 0xe7, 0x2a, 0xae, 0x69, 0x6c, 0x1f, 0xda, 0x0a, + 0xe8, 0x63, 0x1a, 0xa0, 0xbb, 0x76, 0x3f, 0x47, 0x65, 0x13, 0x5d, 0xf6, 0x7c, 0x15, 0xce, 0xd4, + 0x53, 0xac, 0xf2, 0x48, 0xfa, 0xdd, 0xff, 0x4c, 0x63, 0x4f, 0x8f, 0xd9, 0xae, 0x3e, 0x5e, 0x42, + 0xe3, 0xf7, 0x68, 0xb4, 0xb3, 0xda, 0x47, 0x4a, 0xf2, 0x3d, 0x81, 0x44, 0xdc, 0xbd, 0xc3, 0x28, + 0xeb, 0x1a, 0x65, 0x1a, 0x23, 0xf7, 0xe3, 0xfd, 0x54, 0xde, 0x85, 0xf4, 0xad, 0x36, 0x8f, 0xc3, + 0x5b, 0xb8, 0x16, 0x0a, 0x97, 0xe5, 0xb9, 0x58, 0x05, 0xe0, 0x90, 0xd8, 0x54, 0xa7, 0x79, 0x2f, + 0x87, 0xa4, 0xca, 0x8f, 0x7f, 0x7c, 0x7a, 0x08, 0xd8, 0xa5, 0x94, 0x2b, 0x7b, 0x4f, 0x16, 0xdc, + 0x0a, 0xba, 0xe6, 0x37, 0x9f, 0xe8, 0x56, 0x50, 0xf6, 0x3b, 0x69, 0x1e, 0xe4, 0x99, 0xfc, 0xc5, + 0x8a, 0x8f, 0xe9, 0xfc, 0x75, 0xc7, 0x2f, 0x04, 0xc4, 0x2b, 0x7e, 0x12, 0x2e, 0x2c, 0x48, 0x6f, + 0x49, 0xdb, 0x22, 0x56, 0x68, 0x72, 0xce, 0x15, 0x8d, 0x32, 0x2b, 0x22, 0x91, 0x69, 0x56, 0xd4, + 0x1b, 0x9a, 0x6f, 0xcb, 0x27, 0x36, 0xed, 0xb4, 0xd1, 0x0b, 0xfa, 0xc0, 0xe7, 0x34, 0xb1, 0x63, + 0x6c, 0xba, 0xa8, 0xbf, 0xff, 0xd6, 0xb4, 0xf0, 0xfa, 0x31, 0x04, 0xaf, 0x02, 0x2a, 0xa7, 0xcb, + 0x62, 0x51, 0xea, 0xce, 0x48, 0xb7, 0x0b, 0x64, 0x03, 0xce, 0xde, 0xa3, 0x91, 0x58, 0xe3, 0x6c, + 0x1a, 0x46, 0x81, 0xdb, 0x8c, 0x7a, 0x5e, 0x0c, 0xca, 0xb3, 0x49, 0x06, 0xcd, 0xee, 0xdb, 0x8c, + 0x5f, 0x3d, 0x9b, 0x5f, 0x4f, 0xba, 0x1e, 0x2e, 0xb2, 0xe2, 0xb6, 0xe1, 0x24, 0x4d, 0xcc, 0x9f, + 0xe2, 0x23, 0xdc, 0x03, 0x27, 0x9f, 0xb4, 0x14, 0x47, 0x3f, 0x11, 0xa7, 0xad, 0x9b, 0x30, 0xcc, + 0x89, 0x72, 0x37, 0xd4, 0x09, 0x9d, 0x86, 0xdc, 0x81, 0x31, 0xe5, 0x42, 0x43, 0x8c, 0xa2, 0xdc, + 0x76, 0xdd, 0x81, 0x31, 0x7e, 0xb4, 0x3a, 0x3e, 0xc9, 0x87, 0x30, 0xa6, 0x7c, 0x6e, 0x4e, 0xbc, + 0xd3, 0x7f, 0x02, 0x93, 0xba, 0xf7, 0xcd, 0xc9, 0x05, 0xf9, 0x03, 0xbc, 0xbe, 0x95, 0xb7, 0x24, + 0xf9, 0xf4, 0xb3, 0x89, 0xa0, 0x30, 0x42, 0xa4, 0x7c, 0x81, 0x94, 0xc0, 0xdc, 0xe6, 0x9f, 0x49, + 0x51, 0x93, 0x0f, 0xe5, 0x4b, 0x26, 0x45, 0x9c, 0x46, 0xea, 0x21, 0xb3, 0x29, 0x2e, 0xe6, 0x17, + 0x21, 0x56, 0x0b, 0x6c, 0xdf, 0x66, 0x1f, 0xe7, 0x9a, 0xb9, 0xbf, 0xe8, 0xf2, 0xb8, 0x6c, 0xa2, + 0x96, 0x96, 0xca, 0xbe, 0x97, 0xcf, 0xe8, 0x52, 0x7e, 0xc2, 0x3e, 0x1c, 0x8c, 0xfb, 0x78, 0x0a, + 0x4c, 0x95, 0xe6, 0x76, 0xaf, 0x47, 0x02, 0xc0, 0xf8, 0xd8, 0x9b, 0x66, 0xd7, 0x83, 0xac, 0xd7, + 0x29, 0x5a, 0xbc, 0xcf, 0x7c, 0x25, 0xec, 0x56, 0xa5, 0x13, 0xe3, 0xf1, 0x3b, 0x9b, 0xdf, 0xb2, + 0xf3, 0x19, 0x17, 0xdb, 0x7d, 0xc7, 0x22, 0x8f, 0xdd, 0x2f, 0xa1, 0x76, 0x98, 0x19, 0x15, 0x2c, + 0x9f, 0xd9, 0x75, 0xcd, 0x37, 0x22, 0x93, 0x52, 0x6d, 0x7a, 0x4f, 0xf0, 0x89, 0x58, 0x76, 0x7e, + 0xc2, 0xd7, 0xfb, 0x70, 0x91, 0x92, 0xf8, 0x4e, 0x5f, 0x3c, 0x75, 0x4d, 0x7a, 0x9e, 0xef, 0xb0, + 0xd9, 0xf5, 0xf5, 0xc9, 0xb7, 0x98, 0x71, 0x73, 0xad, 0x3c, 0x44, 0xb3, 0x19, 0x9a, 0x1e, 0xa2, + 0x3d, 0xfb, 0x90, 0x27, 0xfe, 0xcf, 0xa0, 0x12, 0x3b, 0x80, 0x9c, 0x6c, 0x10, 0xf2, 0x1d, 0x13, + 0x49, 0x4a, 0x52, 0x21, 0xe9, 0x95, 0x4e, 0x68, 0xfe, 0x4a, 0x9e, 0x84, 0xf5, 0x67, 0x30, 0xc2, + 0xb1, 0x2d, 0x91, 0xa9, 0x33, 0x2f, 0xe7, 0x67, 0x0f, 0x3b, 0xac, 0x78, 0x33, 0xf7, 0x4a, 0x18, + 0xa5, 0x47, 0xfb, 0xe4, 0x8c, 0x94, 0x7f, 0x46, 0x82, 0x91, 0xd5, 0x63, 0x78, 0xfb, 0x5f, 0x3d, + 0x96, 0x73, 0xc6, 0xf5, 0xe4, 0x03, 0xea, 0xc4, 0xef, 0xc4, 0x12, 0x41, 0x04, 0xf5, 0xb7, 0xb9, + 0xe9, 0xa2, 0xe4, 0x23, 0xa7, 0x2c, 0x0c, 0xe5, 0x14, 0x55, 0x96, 0x55, 0x30, 0x38, 0x3b, 0x8a, + 0xf8, 0x81, 0x1b, 0x3d, 0x5f, 0xb4, 0xd7, 0x62, 0xb3, 0x82, 0x5e, 0x20, 0x79, 0x83, 0x2c, 0xb4, + 0xd7, 0xc8, 0x97, 0xb8, 0x94, 0x08, 0xf6, 0x35, 0xdf, 0x8f, 0xc2, 0x28, 0x70, 0x3a, 0xf5, 0x66, + 0xe0, 0x76, 0xa2, 0xdc, 0x4e, 0xc7, 0x3e, 0xdc, 0x59, 0x64, 0x9a, 0x4b, 0xa9, 0x88, 0x63, 0x9f, + 0x15, 0xf9, 0x46, 0x3d, 0xab, 0xc9, 0x2a, 0xec, 0x71, 0x72, 0xa9, 0xcb, 0xc8, 0xf5, 0xaf, 0x92, + 0x69, 0x03, 0xe6, 0x72, 0xe2, 0x05, 0xa9, 0xdb, 0xdb, 0xde, 0xf1, 0x84, 0xe6, 0x7b, 0x57, 0x4c, + 0xbe, 0x82, 0xd9, 0xcc, 0x80, 0x42, 0xca, 0x02, 0xdd, 0x2b, 0xdc, 0x50, 0x3f, 0xe6, 0x4f, 0xa0, + 0xcc, 0x1f, 0x74, 0xa0, 0xdf, 0xb2, 0x11, 0x5b, 0x26, 0x7e, 0xe6, 0x93, 0x83, 0x90, 0x5c, 0xaf, + 0xf3, 0xf1, 0xd4, 0x63, 0xf3, 0x19, 0x0c, 0x2a, 0x92, 0xc8, 0x31, 0xaf, 0x3e, 0xbc, 0xac, 0xc2, + 0x5e, 0x6f, 0x89, 0xb6, 0x60, 0x76, 0x97, 0x06, 0xee, 0xe3, 0xe7, 0x49, 0x86, 0x52, 0x32, 0x99, + 0xa5, 0xbd, 0x38, 0x7e, 0x0e, 0x73, 0x8b, 0xfe, 0x41, 0x47, 0xbc, 0xda, 0x33, 0x78, 0xaa, 0xab, + 0xf8, 0xec, 0xf2, 0xfe, 0xbe, 0x4c, 0xf3, 0xea, 0x59, 0x61, 0x2a, 0xc1, 0xbe, 0x72, 0x61, 0xcb, + 0x47, 0x89, 0x1f, 0x63, 0xc8, 0xa3, 0x9c, 0x4e, 0xbf, 0x8d, 0x93, 0x30, 0x41, 0xc7, 0x6d, 0x73, + 0xda, 0x24, 0xcc, 0x2a, 0xef, 0xfd, 0x06, 0x2c, 0x83, 0x2b, 0xaf, 0x30, 0x9f, 0xeb, 0x31, 0x5a, + 0xbb, 0x21, 0xf7, 0x16, 0x33, 0xc1, 0x79, 0xc2, 0x69, 0x3a, 0x33, 0xfb, 0x79, 0x66, 0x3b, 0xb5, + 0xa8, 0x0a, 0xed, 0x76, 0x0f, 0x15, 0x8b, 0xe8, 0x61, 0x15, 0x18, 0x26, 0x1a, 0xf1, 0x27, 0x75, + 0xda, 0x5e, 0xab, 0x75, 0x8a, 0x18, 0x95, 0xda, 0x0f, 0x60, 0xa2, 0xae, 0x57, 0x9e, 0x51, 0x49, + 0xee, 0xa4, 0x50, 0xaf, 0x80, 0xfa, 0xb7, 0xbd, 0x87, 0x2f, 0xa8, 0xda, 0x78, 0x8e, 0xd5, 0x8b, + 0x5c, 0xd7, 0x19, 0x23, 0xf7, 0x9c, 0xda, 0x05, 0xb2, 0x52, 0x43, 0x2a, 0xd7, 0x99, 0xec, 0x74, + 0x75, 0x0d, 0x9e, 0xd1, 0x26, 0x99, 0xf9, 0x93, 0x58, 0xfd, 0x53, 0xec, 0x2a, 0x9f, 0xf8, 0x9e, + 0xa9, 0x43, 0xb9, 0x9f, 0x4f, 0x9c, 0x6d, 0x4f, 0xf7, 0xf3, 0x49, 0xe5, 0xf0, 0xd3, 0xfd, 0x7c, + 0x32, 0x12, 0xf4, 0x2d, 0x23, 0xaf, 0x38, 0x15, 0x50, 0x0f, 0x63, 0x84, 0x62, 0x93, 0x91, 0x71, + 0xe8, 0x81, 0x1e, 0x9c, 0x83, 0x27, 0x10, 0xea, 0x61, 0x6b, 0x4d, 0x06, 0xe5, 0x48, 0x64, 0x1c, + 0xba, 0x0b, 0x25, 0x9e, 0x4b, 0x21, 0x8e, 0x69, 0x18, 0xbb, 0xfe, 0xa5, 0x53, 0x3c, 0xf4, 0x18, + 0xd4, 0x52, 0x32, 0x12, 0x9c, 0x32, 0x99, 0xe5, 0x84, 0x88, 0xeb, 0x31, 0x55, 0x21, 0x8e, 0xf7, + 0xa6, 0x0c, 0x53, 0xa9, 0x10, 0x70, 0xf3, 0xe7, 0x32, 0x4a, 0x94, 0x4a, 0x39, 0xa1, 0x47, 0x87, + 0x53, 0x5d, 0xca, 0x08, 0x19, 0x37, 0x7f, 0x3e, 0xb3, 0x4c, 0x30, 0x8a, 0x78, 0x96, 0xe9, 0xec, + 0x6c, 0xda, 0xf1, 0x43, 0xae, 0x1e, 0x38, 0xb2, 0x9a, 0x1b, 0xc7, 0x41, 0x15, 0xb5, 0x52, 0x95, + 0x08, 0x29, 0x23, 0x85, 0xf7, 0x77, 0x32, 0xde, 0x5a, 0x18, 0x18, 0xb1, 0x37, 0x58, 0xef, 0x7c, + 0xe2, 0xe4, 0xa1, 0x4c, 0x4c, 0x93, 0x53, 0x53, 0x3f, 0x06, 0xb9, 0x23, 0xf8, 0x50, 0xa6, 0xa2, + 0x79, 0xd5, 0x8c, 0x1f, 0xc1, 0x85, 0xc4, 0x03, 0x0e, 0x93, 0xf1, 0x8d, 0xec, 0x57, 0x1e, 0x99, + 0xe2, 0xc9, 0xd7, 0xd9, 0x2f, 0xa7, 0x1f, 0x7a, 0x24, 0xc6, 0xfd, 0xa4, 0x6b, 0xde, 0x3a, 0x4c, + 0xe1, 0x32, 0x23, 0x93, 0xd1, 0xc7, 0xb1, 0x61, 0x4c, 0x70, 0x32, 0x48, 0x51, 0xb2, 0x54, 0xbd, + 0x1f, 0x9f, 0x10, 0x8f, 0x82, 0x79, 0x6a, 0xfb, 0x79, 0xf3, 0xa5, 0x30, 0x02, 0xb3, 0x76, 0x31, + 0x91, 0x31, 0x9f, 0xfc, 0x00, 0x4e, 0xc7, 0x6f, 0x85, 0x39, 0x8b, 0x0c, 0xb4, 0x1e, 0x86, 0xb2, + 0xd3, 0xf1, 0x83, 0xe1, 0x93, 0x93, 0xaf, 0xc8, 0xad, 0x28, 0x26, 0xbf, 0x98, 0x7a, 0xee, 0x62, + 0xf4, 0xe1, 0x38, 0x3b, 0x92, 0x26, 0xdb, 0x93, 0x8e, 0x4e, 0x13, 0x3f, 0xb7, 0xec, 0xb0, 0x87, + 0xfa, 0xe7, 0xd6, 0x33, 0x34, 0xa3, 0x52, 0x7f, 0x73, 0xf8, 0xac, 0xc3, 0x55, 0x0c, 0x95, 0xb2, + 0xc5, 0x83, 0xe3, 0x65, 0x63, 0xe5, 0xb7, 0x3d, 0x19, 0x60, 0xa5, 0x0d, 0x57, 0xfa, 0xc6, 0x7d, + 0x24, 0xb7, 0x0c, 0x17, 0x97, 0xfe, 0x11, 0x22, 0x7b, 0x9c, 0x3c, 0x66, 0xb2, 0xc2, 0x27, 0xaa, + 0x7d, 0xb6, 0x47, 0x24, 0x47, 0xb5, 0xcf, 0xf6, 0x8c, 0xbf, 0xf8, 0x39, 0x66, 0x7b, 0x12, 0x7b, + 0x14, 0x86, 0x3f, 0xa2, 0x1e, 0x0f, 0x0a, 0xdd, 0xf3, 0xda, 0xe7, 0x8a, 0x79, 0x29, 0x9a, 0x22, + 0xc4, 0x33, 0xcd, 0x25, 0x71, 0x12, 0xcb, 0x63, 0xde, 0x9f, 0x49, 0x0f, 0xd7, 0xea, 0x4b, 0x7c, + 0x02, 0x9e, 0xb8, 0xe5, 0x39, 0xf0, 0xda, 0xd2, 0x4f, 0xff, 0xe3, 0xa5, 0xc2, 0x4f, 0x7f, 0x76, + 0xa9, 0xf0, 0x6f, 0x7f, 0x76, 0xa9, 0xf0, 0x1f, 0x7e, 0x76, 0xa9, 0xf0, 0xe5, 0xc2, 0xf1, 0x42, + 0x13, 0xf3, 0xfc, 0x8c, 0xb7, 0x38, 0xbb, 0x61, 0xfc, 0xef, 0xad, 0xff, 0x19, 0x00, 0x00, 0xff, + 0xff, 0x07, 0xa9, 0xac, 0xef, 0x4b, 0xec, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -27989,6 +28018,11 @@ func (m *RouteToApp) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.TargetPort != 0 { + i = encodeVarintAuthservice(dAtA, i, uint64(m.TargetPort)) + i-- + dAtA[i] = 0x48 + } if len(m.URI) > 0 { i -= len(m.URI) copy(dAtA[i:], m.URI) @@ -35162,6 +35196,15 @@ func (m *PaginatedResource) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Resource != nil { + { + size := m.Resource.Size() + i -= size + if _, err := m.Resource.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } if m.RequiresRequest { i-- if m.RequiresRequest { @@ -35181,15 +35224,6 @@ func (m *PaginatedResource) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x6a } } - if m.Resource != nil { - { - size := m.Resource.Size() - i -= size - if _, err := m.Resource.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } return len(dAtA) - i, nil } @@ -35424,6 +35458,27 @@ func (m *PaginatedResource_SAMLIdPServiceProvider) MarshalToSizedBuffer(dAtA []b } return len(dAtA) - i, nil } +func (m *PaginatedResource_GitServer) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PaginatedResource_GitServer) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.GitServer != nil { + { + size, err := m.GitServer.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } + return len(dAtA) - i, nil +} func (m *ListUnifiedResourcesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -36145,12 +36200,12 @@ func (m *SessionTrackerUpdateExpiry) MarshalToSizedBuffer(dAtA []byte) (int, err copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n102, err102 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err102 != nil { - return 0, err102 + n103, err103 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err103 != nil { + return 0, err103 } - i -= n102 - i = encodeVarintAuthservice(dAtA, i, uint64(n102)) + i -= n103 + i = encodeVarintAuthservice(dAtA, i, uint64(n103)) i-- dAtA[i] = 0xa } @@ -37434,12 +37489,12 @@ func (m *UpstreamInventoryPong) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n126, err126 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SystemClock, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SystemClock):]) - if err126 != nil { - return 0, err126 + n127, err127 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SystemClock, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SystemClock):]) + if err127 != nil { + return 0, err127 } - i -= n126 - i = encodeVarintAuthservice(dAtA, i, uint64(n126)) + i -= n127 + i = encodeVarintAuthservice(dAtA, i, uint64(n127)) i-- dAtA[i] = 0x12 if m.ID != 0 { @@ -39547,6 +39602,9 @@ func (m *RouteToApp) Size() (n int) { if l > 0 { n += 1 + l + sovAuthservice(uint64(l)) } + if m.TargetPort != 0 { + n += 1 + sovAuthservice(uint64(m.TargetPort)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -42959,6 +43017,18 @@ func (m *PaginatedResource_SAMLIdPServiceProvider) Size() (n int) { } return n } +func (m *PaginatedResource_GitServer) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.GitServer != nil { + l = m.GitServer.Size() + n += 1 + l + sovAuthservice(uint64(l)) + } + return n +} func (m *ListUnifiedResourcesRequest) Size() (n int) { if m == nil { return 0 @@ -46895,6 +46965,25 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { } m.URI = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetPort", wireType) + } + m.TargetPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TargetPort |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipAuthservice(dAtA[iNdEx:]) @@ -64645,6 +64734,41 @@ func (m *PaginatedResource) Unmarshal(dAtA []byte) error { } } m.RequiresRequest = bool(v != 0) + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GitServer", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &types.ServerV2{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Resource = &PaginatedResource_GitServer{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAuthservice(dAtA[iNdEx:]) diff --git a/api/client/proto/event.pb.go b/api/client/proto/event.pb.go index 8cb8416436e6f..ac3157f00894e 100644 --- a/api/client/proto/event.pb.go +++ b/api/client/proto/event.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/legacy/client/proto/event.proto @@ -186,6 +186,7 @@ type Event struct { // *Event_IdentityCenterAccount // *Event_IdentityCenterPrincipalAssignment // *Event_IdentityCenterAccountAssignment + // *Event_PluginStaticCredentials Resource isEvent_Resource `protobuf_oneof:"Resource"` } @@ -716,6 +717,13 @@ func (x *Event) GetIdentityCenterAccountAssignment() *v114.AccountAssignment { return nil } +func (x *Event) GetPluginStaticCredentials() *types.PluginStaticCredentialsV1 { + if x, ok := x.GetResource().(*Event_PluginStaticCredentials); ok { + return x.PluginStaticCredentials + } + return nil +} + type isEvent_Resource interface { isEvent_Resource() } @@ -1071,6 +1079,11 @@ type Event_IdentityCenterAccountAssignment struct { IdentityCenterAccountAssignment *v114.AccountAssignment `protobuf:"bytes,74,opt,name=IdentityCenterAccountAssignment,proto3,oneof"` } +type Event_PluginStaticCredentials struct { + // PluginStaticCredentials is filled in PluginStaticCredentials related events + PluginStaticCredentials *types.PluginStaticCredentialsV1 `protobuf:"bytes,75,opt,name=PluginStaticCredentials,proto3,oneof"` +} + func (*Event_ResourceHeader) isEvent_Resource() {} func (*Event_CertAuthority) isEvent_Resource() {} @@ -1209,6 +1222,8 @@ func (*Event_IdentityCenterPrincipalAssignment) isEvent_Resource() {} func (*Event_IdentityCenterAccountAssignment) isEvent_Resource() {} +func (*Event_PluginStaticCredentials) isEvent_Resource() {} + var File_teleport_legacy_client_proto_event_proto protoreflect.FileDescriptor var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ @@ -1267,7 +1282,7 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0xcf, 0x28, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, 0x79, + 0x22, 0xad, 0x29, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, @@ -1586,19 +1601,25 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x31, 0x10, 0x32, 0x4a, 0x04, 0x08, - 0x3f, 0x10, 0x40, 0x4a, 0x04, 0x08, 0x44, 0x10, 0x45, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x0e, 0x53, - 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x13, 0x41, - 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6c, - 0x61, 0x6e, 0x2a, 0x2a, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x42, 0x34, - 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, - 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x5c, 0x0a, 0x17, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x18, 0x4b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x56, 0x31, 0x48, 0x00, 0x52, 0x17, 0x50, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, + 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x31, 0x10, 0x32, 0x4a, 0x04, 0x08, 0x3f, 0x10, + 0x40, 0x4a, 0x04, 0x08, 0x44, 0x10, 0x45, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x0e, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x13, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6c, 0x61, 0x6e, + 0x2a, 0x2a, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, + 0x04, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x42, 0x34, 0x5a, 0x32, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1684,6 +1705,7 @@ var file_teleport_legacy_client_proto_event_proto_goTypes = []any{ (*v114.Account)(nil), // 65: teleport.identitycenter.v1.Account (*v114.PrincipalAssignment)(nil), // 66: teleport.identitycenter.v1.PrincipalAssignment (*v114.AccountAssignment)(nil), // 67: teleport.identitycenter.v1.AccountAssignment + (*types.PluginStaticCredentialsV1)(nil), // 68: types.PluginStaticCredentialsV1 } var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 0, // 0: proto.Event.Type:type_name -> proto.Operation @@ -1756,11 +1778,12 @@ var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 65, // 67: proto.Event.IdentityCenterAccount:type_name -> teleport.identitycenter.v1.Account 66, // 68: proto.Event.IdentityCenterPrincipalAssignment:type_name -> teleport.identitycenter.v1.PrincipalAssignment 67, // 69: proto.Event.IdentityCenterAccountAssignment:type_name -> teleport.identitycenter.v1.AccountAssignment - 70, // [70:70] is the sub-list for method output_type - 70, // [70:70] is the sub-list for method input_type - 70, // [70:70] is the sub-list for extension type_name - 70, // [70:70] is the sub-list for extension extendee - 0, // [0:70] is the sub-list for field type_name + 68, // 70: proto.Event.PluginStaticCredentials:type_name -> types.PluginStaticCredentialsV1 + 71, // [71:71] is the sub-list for method output_type + 71, // [71:71] is the sub-list for method input_type + 71, // [71:71] is the sub-list for extension type_name + 71, // [71:71] is the sub-list for extension extendee + 0, // [0:71] is the sub-list for field type_name } func init() { file_teleport_legacy_client_proto_event_proto_init() } @@ -1838,6 +1861,7 @@ func file_teleport_legacy_client_proto_event_proto_init() { (*Event_IdentityCenterAccount)(nil), (*Event_IdentityCenterPrincipalAssignment)(nil), (*Event_IdentityCenterAccountAssignment)(nil), + (*Event_PluginStaticCredentials)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/api/client/webclient/webclient.go b/api/client/webclient/webclient.go index 6b7d7153a7136..78d4c80c9aebc 100644 --- a/api/client/webclient/webclient.go +++ b/api/client/webclient/webclient.go @@ -47,6 +47,15 @@ import ( "github.com/gravitational/teleport/api/utils/keys" ) +const ( + // AgentUpdateGroupParameter is the parameter used to specify the updater + // group when doing a Ping() or Find() query. + // The proxy server will modulate the auto_update part of the PingResponse + // based on the specified group. e.g. some groups might need to update + // before others. + AgentUpdateGroupParameter = "group" +) + // Config specifies information when building requests with the // webclient. type Config struct { @@ -183,7 +192,7 @@ func findWithClient(cfg *Config, clt *http.Client) (*PingResponse, error) { } if cfg.UpdateGroup != "" { endpoint.RawQuery = url.Values{ - "group": []string{cfg.UpdateGroup}, + AgentUpdateGroupParameter: []string{cfg.UpdateGroup}, }.Encode() } @@ -232,7 +241,7 @@ func pingWithClient(cfg *Config, clt *http.Client) (*PingResponse, error) { } if cfg.UpdateGroup != "" { endpoint.RawQuery = url.Values{ - "group": []string{cfg.UpdateGroup}, + AgentUpdateGroupParameter: []string{cfg.UpdateGroup}, }.Encode() } if cfg.ConnectorName != "" { diff --git a/api/gen/proto/go/teleport/accessgraph/v1/authorized_key.pb.go b/api/gen/proto/go/teleport/accessgraph/v1/authorized_key.pb.go index d715597c415be..7faf6ed13191a 100644 --- a/api/gen/proto/go/teleport/accessgraph/v1/authorized_key.pb.go +++ b/api/gen/proto/go/teleport/accessgraph/v1/authorized_key.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/access_graph/v1/authorized_key.proto diff --git a/api/gen/proto/go/teleport/accessgraph/v1/private_key.pb.go b/api/gen/proto/go/teleport/accessgraph/v1/private_key.pb.go index 1f1185b94e606..ccd6bc6e07d65 100644 --- a/api/gen/proto/go/teleport/accessgraph/v1/private_key.pb.go +++ b/api/gen/proto/go/teleport/accessgraph/v1/private_key.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/access_graph/v1/private_key.proto diff --git a/api/gen/proto/go/teleport/accessgraph/v1/secrets_service.pb.go b/api/gen/proto/go/teleport/accessgraph/v1/secrets_service.pb.go index 49f2f458424e4..4ba2cdc6468bd 100644 --- a/api/gen/proto/go/teleport/accessgraph/v1/secrets_service.pb.go +++ b/api/gen/proto/go/teleport/accessgraph/v1/secrets_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/access_graph/v1/secrets_service.proto diff --git a/api/gen/proto/go/teleport/accesslist/v1/accesslist.pb.go b/api/gen/proto/go/teleport/accesslist/v1/accesslist.pb.go index 4634ef46f0f91..d4e38657e67df 100644 --- a/api/gen/proto/go/teleport/accesslist/v1/accesslist.pb.go +++ b/api/gen/proto/go/teleport/accesslist/v1/accesslist.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/accesslist/v1/accesslist.proto diff --git a/api/gen/proto/go/teleport/accesslist/v1/accesslist_service.pb.go b/api/gen/proto/go/teleport/accesslist/v1/accesslist_service.pb.go index bcf1939552470..78e95ef9aac09 100644 --- a/api/gen/proto/go/teleport/accesslist/v1/accesslist_service.pb.go +++ b/api/gen/proto/go/teleport/accesslist/v1/accesslist_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/accesslist/v1/accesslist_service.proto diff --git a/api/gen/proto/go/teleport/accessmonitoringrules/v1/access_monitoring_rules.pb.go b/api/gen/proto/go/teleport/accessmonitoringrules/v1/access_monitoring_rules.pb.go index 0693f6fb0a382..e2c72145f46f0 100644 --- a/api/gen/proto/go/teleport/accessmonitoringrules/v1/access_monitoring_rules.pb.go +++ b/api/gen/proto/go/teleport/accessmonitoringrules/v1/access_monitoring_rules.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/accessmonitoringrules/v1/access_monitoring_rules.proto diff --git a/api/gen/proto/go/teleport/accessmonitoringrules/v1/access_monitoring_rules_service.pb.go b/api/gen/proto/go/teleport/accessmonitoringrules/v1/access_monitoring_rules_service.pb.go index 01082b4353d3d..f71afe8a1ab93 100644 --- a/api/gen/proto/go/teleport/accessmonitoringrules/v1/access_monitoring_rules_service.pb.go +++ b/api/gen/proto/go/teleport/accessmonitoringrules/v1/access_monitoring_rules_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/accessmonitoringrules/v1/access_monitoring_rules_service.proto diff --git a/api/gen/proto/go/teleport/auditlog/v1/auditlog.pb.go b/api/gen/proto/go/teleport/auditlog/v1/auditlog.pb.go index 5bba628048bf6..cec63b9c760ef 100644 --- a/api/gen/proto/go/teleport/auditlog/v1/auditlog.pb.go +++ b/api/gen/proto/go/teleport/auditlog/v1/auditlog.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/auditlog/v1/auditlog.proto diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go index e01283cc82414..eab6a3f5830fc 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/autoupdate/v1/autoupdate.proto diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go index fe03262d93800..5b4a4d5d34dfa 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/autoupdate/v1/autoupdate_service.proto diff --git a/api/gen/proto/go/teleport/clusterconfig/v1/access_graph.pb.go b/api/gen/proto/go/teleport/clusterconfig/v1/access_graph.pb.go index 78b48bee62c91..facfcae6f6eb0 100644 --- a/api/gen/proto/go/teleport/clusterconfig/v1/access_graph.pb.go +++ b/api/gen/proto/go/teleport/clusterconfig/v1/access_graph.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/clusterconfig/v1/access_graph.proto diff --git a/api/gen/proto/go/teleport/clusterconfig/v1/access_graph_settings.pb.go b/api/gen/proto/go/teleport/clusterconfig/v1/access_graph_settings.pb.go index 126632efd3d2f..25f276870dcba 100644 --- a/api/gen/proto/go/teleport/clusterconfig/v1/access_graph_settings.pb.go +++ b/api/gen/proto/go/teleport/clusterconfig/v1/access_graph_settings.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/clusterconfig/v1/access_graph_settings.proto diff --git a/api/gen/proto/go/teleport/clusterconfig/v1/clusterconfig_service.pb.go b/api/gen/proto/go/teleport/clusterconfig/v1/clusterconfig_service.pb.go index 725275a66ec63..a63f18abdb757 100644 --- a/api/gen/proto/go/teleport/clusterconfig/v1/clusterconfig_service.pb.go +++ b/api/gen/proto/go/teleport/clusterconfig/v1/clusterconfig_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/clusterconfig/v1/clusterconfig_service.proto diff --git a/api/gen/proto/go/teleport/crownjewel/v1/crownjewel.pb.go b/api/gen/proto/go/teleport/crownjewel/v1/crownjewel.pb.go index 40ad46da0a7e7..b04c2a9c2a15b 100644 --- a/api/gen/proto/go/teleport/crownjewel/v1/crownjewel.pb.go +++ b/api/gen/proto/go/teleport/crownjewel/v1/crownjewel.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/crownjewel/v1/crownjewel.proto diff --git a/api/gen/proto/go/teleport/crownjewel/v1/crownjewel_service.pb.go b/api/gen/proto/go/teleport/crownjewel/v1/crownjewel_service.pb.go index 3f6424c31be53..c5a89b49883b0 100644 --- a/api/gen/proto/go/teleport/crownjewel/v1/crownjewel_service.pb.go +++ b/api/gen/proto/go/teleport/crownjewel/v1/crownjewel_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/crownjewel/v1/crownjewel_service.proto diff --git a/api/gen/proto/go/teleport/dbobject/v1/dbobject.pb.go b/api/gen/proto/go/teleport/dbobject/v1/dbobject.pb.go index 763cd4461ad30..02d5ed7140f30 100644 --- a/api/gen/proto/go/teleport/dbobject/v1/dbobject.pb.go +++ b/api/gen/proto/go/teleport/dbobject/v1/dbobject.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/dbobject/v1/dbobject.proto diff --git a/api/gen/proto/go/teleport/dbobject/v1/dbobject_service.pb.go b/api/gen/proto/go/teleport/dbobject/v1/dbobject_service.pb.go index 4ae716189e29f..42358af82f392 100644 --- a/api/gen/proto/go/teleport/dbobject/v1/dbobject_service.pb.go +++ b/api/gen/proto/go/teleport/dbobject/v1/dbobject_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/dbobject/v1/dbobject_service.proto diff --git a/api/gen/proto/go/teleport/dbobjectimportrule/v1/dbobjectimportrule.pb.go b/api/gen/proto/go/teleport/dbobjectimportrule/v1/dbobjectimportrule.pb.go index 6243b78e8c346..f21d1221c259d 100644 --- a/api/gen/proto/go/teleport/dbobjectimportrule/v1/dbobjectimportrule.pb.go +++ b/api/gen/proto/go/teleport/dbobjectimportrule/v1/dbobjectimportrule.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/dbobjectimportrule/v1/dbobjectimportrule.proto diff --git a/api/gen/proto/go/teleport/dbobjectimportrule/v1/dbobjectimportrule_service.pb.go b/api/gen/proto/go/teleport/dbobjectimportrule/v1/dbobjectimportrule_service.pb.go index 7e2236613734f..339b581f7d78f 100644 --- a/api/gen/proto/go/teleport/dbobjectimportrule/v1/dbobjectimportrule_service.pb.go +++ b/api/gen/proto/go/teleport/dbobjectimportrule/v1/dbobjectimportrule_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/dbobjectimportrule/v1/dbobjectimportrule_service.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/assert.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/assert.pb.go index f5343d9006120..6d60b2d5beafe 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/assert.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/assert.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/assert.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/authenticate_challenge.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/authenticate_challenge.pb.go index c473cf7b49a08..8a3aaa6109564 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/authenticate_challenge.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/authenticate_challenge.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/authenticate_challenge.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/device.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/device.pb.go index 24c02765961a8..c8da1a0fc0614 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/device.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/device.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/device.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/device_collected_data.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/device_collected_data.pb.go index 8ca550e362fe2..3f71c39f960ac 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/device_collected_data.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/device_collected_data.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/device_collected_data.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/device_confirmation_token.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/device_confirmation_token.pb.go index 8a4661ef07dac..ca229fbc1ae73 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/device_confirmation_token.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/device_confirmation_token.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/device_confirmation_token.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/device_enroll_token.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/device_enroll_token.pb.go index e497718aeb1ef..d93cda5260ae2 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/device_enroll_token.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/device_enroll_token.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/device_enroll_token.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/device_profile.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/device_profile.pb.go index 87f9bf5e5c54a..3c76934c72bb9 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/device_profile.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/device_profile.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/device_profile.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/device_source.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/device_source.pb.go index 53298788348c2..87df579a4a1de 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/device_source.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/device_source.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/device_source.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/device_web_token.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/device_web_token.pb.go index a531bf1684a09..c41d6d7635813 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/device_web_token.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/device_web_token.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/device_web_token.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/devicetrust_service.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/devicetrust_service.pb.go index d2543df0f5c5e..49cd30957b19d 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/devicetrust_service.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/devicetrust_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/devicetrust_service.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/os_type.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/os_type.pb.go index 2803520716687..25b6721ef8877 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/os_type.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/os_type.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/os_type.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/tpm.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/tpm.pb.go index 7ebe5e66de69d..74d60031c5bd3 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/tpm.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/tpm.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/tpm.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/usage.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/usage.pb.go index 1fe8a1323302c..d38958b631391 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/usage.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/usage.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/usage.proto diff --git a/api/gen/proto/go/teleport/devicetrust/v1/user_certificates.pb.go b/api/gen/proto/go/teleport/devicetrust/v1/user_certificates.pb.go index ab8f971b34a3b..e44f55e93ea78 100644 --- a/api/gen/proto/go/teleport/devicetrust/v1/user_certificates.pb.go +++ b/api/gen/proto/go/teleport/devicetrust/v1/user_certificates.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/devicetrust/v1/user_certificates.proto diff --git a/api/gen/proto/go/teleport/discoveryconfig/v1/discoveryconfig.pb.go b/api/gen/proto/go/teleport/discoveryconfig/v1/discoveryconfig.pb.go index 59097796ebaa7..7b91e39ff14c6 100644 --- a/api/gen/proto/go/teleport/discoveryconfig/v1/discoveryconfig.pb.go +++ b/api/gen/proto/go/teleport/discoveryconfig/v1/discoveryconfig.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/discoveryconfig/v1/discoveryconfig.proto diff --git a/api/gen/proto/go/teleport/discoveryconfig/v1/discoveryconfig_service.pb.go b/api/gen/proto/go/teleport/discoveryconfig/v1/discoveryconfig_service.pb.go index 25ec459cdf876..62b8377cc2046 100644 --- a/api/gen/proto/go/teleport/discoveryconfig/v1/discoveryconfig_service.pb.go +++ b/api/gen/proto/go/teleport/discoveryconfig/v1/discoveryconfig_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/discoveryconfig/v1/discoveryconfig_service.proto diff --git a/api/gen/proto/go/teleport/dynamicwindows/v1/dynamicwindows_service.pb.go b/api/gen/proto/go/teleport/dynamicwindows/v1/dynamicwindows_service.pb.go index 3523ac1e79d57..c303b24c43fe8 100644 --- a/api/gen/proto/go/teleport/dynamicwindows/v1/dynamicwindows_service.pb.go +++ b/api/gen/proto/go/teleport/dynamicwindows/v1/dynamicwindows_service.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/dynamicwindows/v1/dynamicwindows_service.proto diff --git a/api/gen/proto/go/teleport/embedding/v1/embedding.pb.go b/api/gen/proto/go/teleport/embedding/v1/embedding.pb.go index 10c437248a7dd..a7c0ad2881238 100644 --- a/api/gen/proto/go/teleport/embedding/v1/embedding.pb.go +++ b/api/gen/proto/go/teleport/embedding/v1/embedding.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/embedding/v1/embedding.proto diff --git a/api/gen/proto/go/teleport/externalauditstorage/v1/externalauditstorage.pb.go b/api/gen/proto/go/teleport/externalauditstorage/v1/externalauditstorage.pb.go index d40ab25141b72..1eb579369de1f 100644 --- a/api/gen/proto/go/teleport/externalauditstorage/v1/externalauditstorage.pb.go +++ b/api/gen/proto/go/teleport/externalauditstorage/v1/externalauditstorage.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/externalauditstorage/v1/externalauditstorage.proto diff --git a/api/gen/proto/go/teleport/externalauditstorage/v1/externalauditstorage_service.pb.go b/api/gen/proto/go/teleport/externalauditstorage/v1/externalauditstorage_service.pb.go index e3045ad0f68f9..7e6f805a8e0bb 100644 --- a/api/gen/proto/go/teleport/externalauditstorage/v1/externalauditstorage_service.pb.go +++ b/api/gen/proto/go/teleport/externalauditstorage/v1/externalauditstorage_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/externalauditstorage/v1/externalauditstorage_service.proto diff --git a/api/gen/proto/go/teleport/gitserver/v1/git_server_service.pb.go b/api/gen/proto/go/teleport/gitserver/v1/git_server_service.pb.go index 2752f92890be8..8cdb18948e202 100644 --- a/api/gen/proto/go/teleport/gitserver/v1/git_server_service.pb.go +++ b/api/gen/proto/go/teleport/gitserver/v1/git_server_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/gitserver/v1/git_server_service.proto diff --git a/api/gen/proto/go/teleport/header/v1/metadata.pb.go b/api/gen/proto/go/teleport/header/v1/metadata.pb.go index 62f3d65879249..21778b86bd82d 100644 --- a/api/gen/proto/go/teleport/header/v1/metadata.pb.go +++ b/api/gen/proto/go/teleport/header/v1/metadata.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/header/v1/metadata.proto diff --git a/api/gen/proto/go/teleport/header/v1/resourceheader.pb.go b/api/gen/proto/go/teleport/header/v1/resourceheader.pb.go index a9fa609602c36..991cd0cc2c18c 100644 --- a/api/gen/proto/go/teleport/header/v1/resourceheader.pb.go +++ b/api/gen/proto/go/teleport/header/v1/resourceheader.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/header/v1/resourceheader.proto diff --git a/api/gen/proto/go/teleport/identitycenter/v1/identitycenter.pb.go b/api/gen/proto/go/teleport/identitycenter/v1/identitycenter.pb.go index 8e43d83ade7bf..9a8580947c5b8 100644 --- a/api/gen/proto/go/teleport/identitycenter/v1/identitycenter.pb.go +++ b/api/gen/proto/go/teleport/identitycenter/v1/identitycenter.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/identitycenter/v1/identitycenter.proto @@ -166,6 +166,9 @@ type PermissionSetInfo struct { // Role is an optional ARN indicating role provisioned to this account. May be // empty if the permission set is not provisioned or is not relevant in the Role string `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"` + // AssignmentID is the name of a Teleport Account Assignment resource + // representing this permission set assigned to the enclosing Account. + AssignmentId string `protobuf:"bytes,4,opt,name=assignment_id,json=assignmentId,proto3" json:"assignment_id,omitempty"` } func (x *PermissionSetInfo) Reset() { @@ -219,6 +222,13 @@ func (x *PermissionSetInfo) GetRole() string { return "" } +func (x *PermissionSetInfo) GetAssignmentId() string { + if x != nil { + return x.AssignmentId + } + return "" +} + // AccountStatus represents any commonly-changing data about an Identity // Center account. type AccountStatus struct { @@ -257,7 +267,7 @@ func (*AccountStatus) Descriptor() ([]byte, []int) { return file_teleport_identitycenter_v1_identitycenter_proto_rawDescGZIP(), []int{1} } -// Account is an Identity-Ceneter-managed AWS account +// Account is an Identity-Center-managed AWS account type Account struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1071,177 +1081,180 @@ var file_teleport_identitycenter_v1_identitycenter_proto_rawDesc = []byte{ 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0x4d, 0x0a, 0x11, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x22, 0x72, 0x0a, 0x11, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, - 0x0f, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x8c, 0x02, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x3b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x41, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0x95, 0x02, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x61, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x55, 0x72, 0x6c, 0x12, 0x5d, 0x0a, 0x13, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x11, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x32, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x69, 0x73, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0xd5, 0x01, 0x0a, 0x0d, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, - 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, - 0x5b, 0x0a, 0x11, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x53, 0x70, 0x65, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x61, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x22, 0x0f, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x8c, 0x02, 0x0a, 0x07, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x12, 0x41, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x95, 0x02, 0x0a, 0x0b, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x61, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xdd, 0x01, 0x0a, - 0x11, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, - 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x45, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xc9, 0x01, 0x0a, - 0x15, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, - 0x12, 0x54, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x5d, 0x0a, 0x13, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x32, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x69, 0x73, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, 0xd5, 0x01, 0x0a, + 0x0d, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x22, 0x5b, 0x0a, 0x11, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xdd, 0x01, 0x0a, 0x11, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, + 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, + 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x45, 0x0a, 0x04, 0x73, 0x70, + 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xb0, 0x02, 0x0a, 0x13, 0x50, 0x72, 0x69, - 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x47, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x22, 0xc9, 0x01, 0x0a, 0x15, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x12, 0x54, 0x0a, 0x0e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x70, 0x65, + 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xb0, 0x02, + 0x0a, 0x13, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, + 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x47, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, + 0x63, 0x12, 0x4d, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x4d, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, - 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, - 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xdd, 0x01, 0x0a, 0x17, - 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x50, 0x0a, 0x0e, 0x70, 0x72, 0x69, 0x6e, 0x63, - 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, - 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6e, - 0x63, 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, - 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x49, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x22, 0xb6, 0x01, 0x0a, 0x14, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x66, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x74, 0x41, 0x72, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x02, 0x0a, 0x19, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, - 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x5c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x11, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x52, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x52, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x70, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2a, 0x68, - 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x17, 0x0a, 0x13, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x49, 0x4e, - 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, - 0x53, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x2a, 0x99, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, - 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, - 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x45, 0x10, 0x01, - 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, - 0x45, 0x44, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, - 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, - 0x45, 0x44, 0x10, 0x03, 0x42, 0x60, 0x5a, 0x5e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, - 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x22, 0xdd, 0x01, 0x0a, 0x17, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x50, 0x0a, 0x0e, + 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0d, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x49, + 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, + 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, + 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, + 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x72, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x41, 0x72, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x87, 0x02, 0x0a, 0x19, 0x50, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, + 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x66, 0x52, 0x0b, 0x61, 0x73, + 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x70, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0c, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x2a, 0x68, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, + 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, + 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1e, 0x0a, + 0x1a, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x2a, 0x99, 0x01, + 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, + 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x56, 0x49, + 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, + 0x41, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, + 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x56, + 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, + 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, 0x42, 0x60, 0x5a, 0x5e, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service.pb.go b/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service.pb.go index d6c0b413c3521..33b5d435e5fc1 100644 --- a/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service.pb.go +++ b/api/gen/proto/go/teleport/identitycenter/v1/identitycenter_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/identitycenter/v1/identitycenter_service.proto diff --git a/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go b/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go index e7ef95b4352e2..b53ec83abff7e 100644 --- a/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go +++ b/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/integration/v1/awsoidc_service.proto diff --git a/api/gen/proto/go/teleport/integration/v1/integration_service.pb.go b/api/gen/proto/go/teleport/integration/v1/integration_service.pb.go index 4bf4813a11236..c1b233cacd289 100644 --- a/api/gen/proto/go/teleport/integration/v1/integration_service.pb.go +++ b/api/gen/proto/go/teleport/integration/v1/integration_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/integration/v1/integration_service.proto @@ -24,6 +24,7 @@ import ( types "github.com/gravitational/teleport/api/types" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" sync "sync" @@ -494,6 +495,233 @@ func (x *GenerateAWSOIDCTokenResponse) GetToken() string { return "" } +// GenerateGitHubUserCertRequest is a request to sign a client certificate used by +// GitHub integration to authenticate with GitHub enterprise. +type GenerateGitHubUserCertRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Integration is the name of the integration; + Integration string `protobuf:"bytes,1,opt,name=integration,proto3" json:"integration,omitempty"` + // PublicKey is the public key to be signed. + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + // UserId is the GitHub user id. + UserId string `protobuf:"bytes,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + // KeyId is the certificate ID, usually the Teleport username. + KeyId string `protobuf:"bytes,4,opt,name=key_id,json=keyId,proto3" json:"key_id,omitempty"` + // Ttl is the duration the certificate will be valid for. + Ttl *durationpb.Duration `protobuf:"bytes,5,opt,name=ttl,proto3" json:"ttl,omitempty"` +} + +func (x *GenerateGitHubUserCertRequest) Reset() { + *x = GenerateGitHubUserCertRequest{} + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GenerateGitHubUserCertRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenerateGitHubUserCertRequest) ProtoMessage() {} + +func (x *GenerateGitHubUserCertRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenerateGitHubUserCertRequest.ProtoReflect.Descriptor instead. +func (*GenerateGitHubUserCertRequest) Descriptor() ([]byte, []int) { + return file_teleport_integration_v1_integration_service_proto_rawDescGZIP(), []int{9} +} + +func (x *GenerateGitHubUserCertRequest) GetIntegration() string { + if x != nil { + return x.Integration + } + return "" +} + +func (x *GenerateGitHubUserCertRequest) GetPublicKey() []byte { + if x != nil { + return x.PublicKey + } + return nil +} + +func (x *GenerateGitHubUserCertRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *GenerateGitHubUserCertRequest) GetKeyId() string { + if x != nil { + return x.KeyId + } + return "" +} + +func (x *GenerateGitHubUserCertRequest) GetTtl() *durationpb.Duration { + if x != nil { + return x.Ttl + } + return nil +} + +// GenerateGitHubUserCertResponse contains a signed certificate. +type GenerateGitHubUserCertResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // AuthorizedKey is the signed certificate. + AuthorizedKey []byte `protobuf:"bytes,1,opt,name=authorized_key,json=authorizedKey,proto3" json:"authorized_key,omitempty"` +} + +func (x *GenerateGitHubUserCertResponse) Reset() { + *x = GenerateGitHubUserCertResponse{} + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GenerateGitHubUserCertResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenerateGitHubUserCertResponse) ProtoMessage() {} + +func (x *GenerateGitHubUserCertResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GenerateGitHubUserCertResponse.ProtoReflect.Descriptor instead. +func (*GenerateGitHubUserCertResponse) Descriptor() ([]byte, []int) { + return file_teleport_integration_v1_integration_service_proto_rawDescGZIP(), []int{10} +} + +func (x *GenerateGitHubUserCertResponse) GetAuthorizedKey() []byte { + if x != nil { + return x.AuthorizedKey + } + return nil +} + +// ExportIntegrationCertAuthoritiesRequest is the request to export cert +// authorities for an integration. +type ExportIntegrationCertAuthoritiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Integration is the name of the integration; + Integration string `protobuf:"bytes,1,opt,name=integration,proto3" json:"integration,omitempty"` +} + +func (x *ExportIntegrationCertAuthoritiesRequest) Reset() { + *x = ExportIntegrationCertAuthoritiesRequest{} + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExportIntegrationCertAuthoritiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportIntegrationCertAuthoritiesRequest) ProtoMessage() {} + +func (x *ExportIntegrationCertAuthoritiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportIntegrationCertAuthoritiesRequest.ProtoReflect.Descriptor instead. +func (*ExportIntegrationCertAuthoritiesRequest) Descriptor() ([]byte, []int) { + return file_teleport_integration_v1_integration_service_proto_rawDescGZIP(), []int{11} +} + +func (x *ExportIntegrationCertAuthoritiesRequest) GetIntegration() string { + if x != nil { + return x.Integration + } + return "" +} + +// ExportIntegrationCertAuthoritiesResponse is the response to +// ExportIntegrationCertAuthorities. +type ExportIntegrationCertAuthoritiesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // CertAuthorities are the CA key sets used to sign any new certificates. + CertAuthorities *types.CAKeySet `protobuf:"bytes,1,opt,name=cert_authorities,json=certAuthorities,proto3" json:"cert_authorities,omitempty"` +} + +func (x *ExportIntegrationCertAuthoritiesResponse) Reset() { + *x = ExportIntegrationCertAuthoritiesResponse{} + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExportIntegrationCertAuthoritiesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportIntegrationCertAuthoritiesResponse) ProtoMessage() {} + +func (x *ExportIntegrationCertAuthoritiesResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_integration_v1_integration_service_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportIntegrationCertAuthoritiesResponse.ProtoReflect.Descriptor instead. +func (*ExportIntegrationCertAuthoritiesResponse) Descriptor() ([]byte, []int) { + return file_teleport_integration_v1_integration_service_proto_rawDescGZIP(), []int{12} +} + +func (x *ExportIntegrationCertAuthoritiesResponse) GetCertAuthorities() *types.CAKeySet { + if x != nil { + return x.CertAuthorities + } + return nil +} + var File_teleport_integration_v1_integration_service_proto protoreflect.FileDescriptor var file_teleport_integration_v1_integration_service_proto_rawDesc = []byte{ @@ -501,7 +729,9 @@ var file_teleport_integration_v1_integration_service_proto_rawDesc = []byte{ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x1a, 0x1e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, @@ -547,60 +777,107 @@ var file_teleport_integration_v1_integration_service_proto_rawDesc = []byte{ 0x1c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x32, 0xef, 0x05, 0x0a, 0x12, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x77, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, + 0x6b, 0x65, 0x6e, 0x22, 0xbd, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x15, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, + 0x74, 0x74, 0x6c, 0x22, 0x47, 0x0a, 0x1e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, + 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x22, 0x4b, 0x0a, 0x27, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x66, 0x0a, 0x28, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x65, + 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x10, 0x63, 0x65, 0x72, 0x74, 0x5f, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x41, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, + 0x52, 0x0f, 0x63, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x32, 0xa5, 0x08, 0x0a, 0x12, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x77, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5c, 0x0a, 0x11, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x56, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5c, 0x0a, 0x11, 0x55, 0x70, 0x64, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5c, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5c, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x66, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x83, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, - 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, - 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, + 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x12, 0x5e, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x66, 0x0a, 0x15, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x6c, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x6c, 0x6c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x83, 0x01, + 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, + 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x41, + 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x5a, 0x5a, 0x58, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, - 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x76, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x47, 0x69, 0x74, 0x48, 0x75, 0x62, 0x55, + 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0xa7, 0x01, 0x0a, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x40, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x5a, 0x5a, 0x58, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -615,43 +892,55 @@ func file_teleport_integration_v1_integration_service_proto_rawDescGZIP() []byte return file_teleport_integration_v1_integration_service_proto_rawDescData } -var file_teleport_integration_v1_integration_service_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_teleport_integration_v1_integration_service_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_teleport_integration_v1_integration_service_proto_goTypes = []any{ - (*ListIntegrationsRequest)(nil), // 0: teleport.integration.v1.ListIntegrationsRequest - (*ListIntegrationsResponse)(nil), // 1: teleport.integration.v1.ListIntegrationsResponse - (*GetIntegrationRequest)(nil), // 2: teleport.integration.v1.GetIntegrationRequest - (*CreateIntegrationRequest)(nil), // 3: teleport.integration.v1.CreateIntegrationRequest - (*UpdateIntegrationRequest)(nil), // 4: teleport.integration.v1.UpdateIntegrationRequest - (*DeleteIntegrationRequest)(nil), // 5: teleport.integration.v1.DeleteIntegrationRequest - (*DeleteAllIntegrationsRequest)(nil), // 6: teleport.integration.v1.DeleteAllIntegrationsRequest - (*GenerateAWSOIDCTokenRequest)(nil), // 7: teleport.integration.v1.GenerateAWSOIDCTokenRequest - (*GenerateAWSOIDCTokenResponse)(nil), // 8: teleport.integration.v1.GenerateAWSOIDCTokenResponse - (*types.IntegrationV1)(nil), // 9: types.IntegrationV1 - (*emptypb.Empty)(nil), // 10: google.protobuf.Empty + (*ListIntegrationsRequest)(nil), // 0: teleport.integration.v1.ListIntegrationsRequest + (*ListIntegrationsResponse)(nil), // 1: teleport.integration.v1.ListIntegrationsResponse + (*GetIntegrationRequest)(nil), // 2: teleport.integration.v1.GetIntegrationRequest + (*CreateIntegrationRequest)(nil), // 3: teleport.integration.v1.CreateIntegrationRequest + (*UpdateIntegrationRequest)(nil), // 4: teleport.integration.v1.UpdateIntegrationRequest + (*DeleteIntegrationRequest)(nil), // 5: teleport.integration.v1.DeleteIntegrationRequest + (*DeleteAllIntegrationsRequest)(nil), // 6: teleport.integration.v1.DeleteAllIntegrationsRequest + (*GenerateAWSOIDCTokenRequest)(nil), // 7: teleport.integration.v1.GenerateAWSOIDCTokenRequest + (*GenerateAWSOIDCTokenResponse)(nil), // 8: teleport.integration.v1.GenerateAWSOIDCTokenResponse + (*GenerateGitHubUserCertRequest)(nil), // 9: teleport.integration.v1.GenerateGitHubUserCertRequest + (*GenerateGitHubUserCertResponse)(nil), // 10: teleport.integration.v1.GenerateGitHubUserCertResponse + (*ExportIntegrationCertAuthoritiesRequest)(nil), // 11: teleport.integration.v1.ExportIntegrationCertAuthoritiesRequest + (*ExportIntegrationCertAuthoritiesResponse)(nil), // 12: teleport.integration.v1.ExportIntegrationCertAuthoritiesResponse + (*types.IntegrationV1)(nil), // 13: types.IntegrationV1 + (*durationpb.Duration)(nil), // 14: google.protobuf.Duration + (*types.CAKeySet)(nil), // 15: types.CAKeySet + (*emptypb.Empty)(nil), // 16: google.protobuf.Empty } var file_teleport_integration_v1_integration_service_proto_depIdxs = []int32{ - 9, // 0: teleport.integration.v1.ListIntegrationsResponse.integrations:type_name -> types.IntegrationV1 - 9, // 1: teleport.integration.v1.CreateIntegrationRequest.integration:type_name -> types.IntegrationV1 - 9, // 2: teleport.integration.v1.UpdateIntegrationRequest.integration:type_name -> types.IntegrationV1 - 0, // 3: teleport.integration.v1.IntegrationService.ListIntegrations:input_type -> teleport.integration.v1.ListIntegrationsRequest - 2, // 4: teleport.integration.v1.IntegrationService.GetIntegration:input_type -> teleport.integration.v1.GetIntegrationRequest - 3, // 5: teleport.integration.v1.IntegrationService.CreateIntegration:input_type -> teleport.integration.v1.CreateIntegrationRequest - 4, // 6: teleport.integration.v1.IntegrationService.UpdateIntegration:input_type -> teleport.integration.v1.UpdateIntegrationRequest - 5, // 7: teleport.integration.v1.IntegrationService.DeleteIntegration:input_type -> teleport.integration.v1.DeleteIntegrationRequest - 6, // 8: teleport.integration.v1.IntegrationService.DeleteAllIntegrations:input_type -> teleport.integration.v1.DeleteAllIntegrationsRequest - 7, // 9: teleport.integration.v1.IntegrationService.GenerateAWSOIDCToken:input_type -> teleport.integration.v1.GenerateAWSOIDCTokenRequest - 1, // 10: teleport.integration.v1.IntegrationService.ListIntegrations:output_type -> teleport.integration.v1.ListIntegrationsResponse - 9, // 11: teleport.integration.v1.IntegrationService.GetIntegration:output_type -> types.IntegrationV1 - 9, // 12: teleport.integration.v1.IntegrationService.CreateIntegration:output_type -> types.IntegrationV1 - 9, // 13: teleport.integration.v1.IntegrationService.UpdateIntegration:output_type -> types.IntegrationV1 - 10, // 14: teleport.integration.v1.IntegrationService.DeleteIntegration:output_type -> google.protobuf.Empty - 10, // 15: teleport.integration.v1.IntegrationService.DeleteAllIntegrations:output_type -> google.protobuf.Empty - 8, // 16: teleport.integration.v1.IntegrationService.GenerateAWSOIDCToken:output_type -> teleport.integration.v1.GenerateAWSOIDCTokenResponse - 10, // [10:17] is the sub-list for method output_type - 3, // [3:10] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 13, // 0: teleport.integration.v1.ListIntegrationsResponse.integrations:type_name -> types.IntegrationV1 + 13, // 1: teleport.integration.v1.CreateIntegrationRequest.integration:type_name -> types.IntegrationV1 + 13, // 2: teleport.integration.v1.UpdateIntegrationRequest.integration:type_name -> types.IntegrationV1 + 14, // 3: teleport.integration.v1.GenerateGitHubUserCertRequest.ttl:type_name -> google.protobuf.Duration + 15, // 4: teleport.integration.v1.ExportIntegrationCertAuthoritiesResponse.cert_authorities:type_name -> types.CAKeySet + 0, // 5: teleport.integration.v1.IntegrationService.ListIntegrations:input_type -> teleport.integration.v1.ListIntegrationsRequest + 2, // 6: teleport.integration.v1.IntegrationService.GetIntegration:input_type -> teleport.integration.v1.GetIntegrationRequest + 3, // 7: teleport.integration.v1.IntegrationService.CreateIntegration:input_type -> teleport.integration.v1.CreateIntegrationRequest + 4, // 8: teleport.integration.v1.IntegrationService.UpdateIntegration:input_type -> teleport.integration.v1.UpdateIntegrationRequest + 5, // 9: teleport.integration.v1.IntegrationService.DeleteIntegration:input_type -> teleport.integration.v1.DeleteIntegrationRequest + 6, // 10: teleport.integration.v1.IntegrationService.DeleteAllIntegrations:input_type -> teleport.integration.v1.DeleteAllIntegrationsRequest + 7, // 11: teleport.integration.v1.IntegrationService.GenerateAWSOIDCToken:input_type -> teleport.integration.v1.GenerateAWSOIDCTokenRequest + 9, // 12: teleport.integration.v1.IntegrationService.GenerateGitHubUserCert:input_type -> teleport.integration.v1.GenerateGitHubUserCertRequest + 11, // 13: teleport.integration.v1.IntegrationService.ExportIntegrationCertAuthorities:input_type -> teleport.integration.v1.ExportIntegrationCertAuthoritiesRequest + 1, // 14: teleport.integration.v1.IntegrationService.ListIntegrations:output_type -> teleport.integration.v1.ListIntegrationsResponse + 13, // 15: teleport.integration.v1.IntegrationService.GetIntegration:output_type -> types.IntegrationV1 + 13, // 16: teleport.integration.v1.IntegrationService.CreateIntegration:output_type -> types.IntegrationV1 + 13, // 17: teleport.integration.v1.IntegrationService.UpdateIntegration:output_type -> types.IntegrationV1 + 16, // 18: teleport.integration.v1.IntegrationService.DeleteIntegration:output_type -> google.protobuf.Empty + 16, // 19: teleport.integration.v1.IntegrationService.DeleteAllIntegrations:output_type -> google.protobuf.Empty + 8, // 20: teleport.integration.v1.IntegrationService.GenerateAWSOIDCToken:output_type -> teleport.integration.v1.GenerateAWSOIDCTokenResponse + 10, // 21: teleport.integration.v1.IntegrationService.GenerateGitHubUserCert:output_type -> teleport.integration.v1.GenerateGitHubUserCertResponse + 12, // 22: teleport.integration.v1.IntegrationService.ExportIntegrationCertAuthorities:output_type -> teleport.integration.v1.ExportIntegrationCertAuthoritiesResponse + 14, // [14:23] is the sub-list for method output_type + 5, // [5:14] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_teleport_integration_v1_integration_service_proto_init() } @@ -665,7 +954,7 @@ func file_teleport_integration_v1_integration_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_integration_v1_integration_service_proto_rawDesc, NumEnums: 0, - NumMessages: 9, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, diff --git a/api/gen/proto/go/teleport/integration/v1/integration_service_grpc.pb.go b/api/gen/proto/go/teleport/integration/v1/integration_service_grpc.pb.go index f88c39e9d6154..e003922829236 100644 --- a/api/gen/proto/go/teleport/integration/v1/integration_service_grpc.pb.go +++ b/api/gen/proto/go/teleport/integration/v1/integration_service_grpc.pb.go @@ -35,13 +35,15 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - IntegrationService_ListIntegrations_FullMethodName = "/teleport.integration.v1.IntegrationService/ListIntegrations" - IntegrationService_GetIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/GetIntegration" - IntegrationService_CreateIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/CreateIntegration" - IntegrationService_UpdateIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/UpdateIntegration" - IntegrationService_DeleteIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/DeleteIntegration" - IntegrationService_DeleteAllIntegrations_FullMethodName = "/teleport.integration.v1.IntegrationService/DeleteAllIntegrations" - IntegrationService_GenerateAWSOIDCToken_FullMethodName = "/teleport.integration.v1.IntegrationService/GenerateAWSOIDCToken" + IntegrationService_ListIntegrations_FullMethodName = "/teleport.integration.v1.IntegrationService/ListIntegrations" + IntegrationService_GetIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/GetIntegration" + IntegrationService_CreateIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/CreateIntegration" + IntegrationService_UpdateIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/UpdateIntegration" + IntegrationService_DeleteIntegration_FullMethodName = "/teleport.integration.v1.IntegrationService/DeleteIntegration" + IntegrationService_DeleteAllIntegrations_FullMethodName = "/teleport.integration.v1.IntegrationService/DeleteAllIntegrations" + IntegrationService_GenerateAWSOIDCToken_FullMethodName = "/teleport.integration.v1.IntegrationService/GenerateAWSOIDCToken" + IntegrationService_GenerateGitHubUserCert_FullMethodName = "/teleport.integration.v1.IntegrationService/GenerateGitHubUserCert" + IntegrationService_ExportIntegrationCertAuthorities_FullMethodName = "/teleport.integration.v1.IntegrationService/ExportIntegrationCertAuthorities" ) // IntegrationServiceClient is the client API for IntegrationService service. @@ -65,6 +67,10 @@ type IntegrationServiceClient interface { DeleteAllIntegrations(ctx context.Context, in *DeleteAllIntegrationsRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // GenerateAWSOIDCToken generates a token to be used when executing an AWS OIDC Integration action. GenerateAWSOIDCToken(ctx context.Context, in *GenerateAWSOIDCTokenRequest, opts ...grpc.CallOption) (*GenerateAWSOIDCTokenResponse, error) + // GenerateGitHubUserCert signs a SSH certificate for GitHub integration. + GenerateGitHubUserCert(ctx context.Context, in *GenerateGitHubUserCertRequest, opts ...grpc.CallOption) (*GenerateGitHubUserCertResponse, error) + // ExportIntegrationCertAuthorities exports cert authorities for an integration. + ExportIntegrationCertAuthorities(ctx context.Context, in *ExportIntegrationCertAuthoritiesRequest, opts ...grpc.CallOption) (*ExportIntegrationCertAuthoritiesResponse, error) } type integrationServiceClient struct { @@ -145,6 +151,26 @@ func (c *integrationServiceClient) GenerateAWSOIDCToken(ctx context.Context, in return out, nil } +func (c *integrationServiceClient) GenerateGitHubUserCert(ctx context.Context, in *GenerateGitHubUserCertRequest, opts ...grpc.CallOption) (*GenerateGitHubUserCertResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GenerateGitHubUserCertResponse) + err := c.cc.Invoke(ctx, IntegrationService_GenerateGitHubUserCert_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *integrationServiceClient) ExportIntegrationCertAuthorities(ctx context.Context, in *ExportIntegrationCertAuthoritiesRequest, opts ...grpc.CallOption) (*ExportIntegrationCertAuthoritiesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ExportIntegrationCertAuthoritiesResponse) + err := c.cc.Invoke(ctx, IntegrationService_ExportIntegrationCertAuthorities_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // IntegrationServiceServer is the server API for IntegrationService service. // All implementations must embed UnimplementedIntegrationServiceServer // for forward compatibility. @@ -166,6 +192,10 @@ type IntegrationServiceServer interface { DeleteAllIntegrations(context.Context, *DeleteAllIntegrationsRequest) (*emptypb.Empty, error) // GenerateAWSOIDCToken generates a token to be used when executing an AWS OIDC Integration action. GenerateAWSOIDCToken(context.Context, *GenerateAWSOIDCTokenRequest) (*GenerateAWSOIDCTokenResponse, error) + // GenerateGitHubUserCert signs a SSH certificate for GitHub integration. + GenerateGitHubUserCert(context.Context, *GenerateGitHubUserCertRequest) (*GenerateGitHubUserCertResponse, error) + // ExportIntegrationCertAuthorities exports cert authorities for an integration. + ExportIntegrationCertAuthorities(context.Context, *ExportIntegrationCertAuthoritiesRequest) (*ExportIntegrationCertAuthoritiesResponse, error) mustEmbedUnimplementedIntegrationServiceServer() } @@ -197,6 +227,12 @@ func (UnimplementedIntegrationServiceServer) DeleteAllIntegrations(context.Conte func (UnimplementedIntegrationServiceServer) GenerateAWSOIDCToken(context.Context, *GenerateAWSOIDCTokenRequest) (*GenerateAWSOIDCTokenResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GenerateAWSOIDCToken not implemented") } +func (UnimplementedIntegrationServiceServer) GenerateGitHubUserCert(context.Context, *GenerateGitHubUserCertRequest) (*GenerateGitHubUserCertResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GenerateGitHubUserCert not implemented") +} +func (UnimplementedIntegrationServiceServer) ExportIntegrationCertAuthorities(context.Context, *ExportIntegrationCertAuthoritiesRequest) (*ExportIntegrationCertAuthoritiesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExportIntegrationCertAuthorities not implemented") +} func (UnimplementedIntegrationServiceServer) mustEmbedUnimplementedIntegrationServiceServer() {} func (UnimplementedIntegrationServiceServer) testEmbeddedByValue() {} @@ -344,6 +380,42 @@ func _IntegrationService_GenerateAWSOIDCToken_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } +func _IntegrationService_GenerateGitHubUserCert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GenerateGitHubUserCertRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IntegrationServiceServer).GenerateGitHubUserCert(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IntegrationService_GenerateGitHubUserCert_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IntegrationServiceServer).GenerateGitHubUserCert(ctx, req.(*GenerateGitHubUserCertRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _IntegrationService_ExportIntegrationCertAuthorities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExportIntegrationCertAuthoritiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IntegrationServiceServer).ExportIntegrationCertAuthorities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IntegrationService_ExportIntegrationCertAuthorities_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IntegrationServiceServer).ExportIntegrationCertAuthorities(ctx, req.(*ExportIntegrationCertAuthoritiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + // IntegrationService_ServiceDesc is the grpc.ServiceDesc for IntegrationService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -379,6 +451,14 @@ var IntegrationService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GenerateAWSOIDCToken", Handler: _IntegrationService_GenerateAWSOIDCToken_Handler, }, + { + MethodName: "GenerateGitHubUserCert", + Handler: _IntegrationService_GenerateGitHubUserCert_Handler, + }, + { + MethodName: "ExportIntegrationCertAuthorities", + Handler: _IntegrationService_ExportIntegrationCertAuthorities_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "teleport/integration/v1/integration_service.proto", diff --git a/api/gen/proto/go/teleport/kube/v1/kube_service.pb.go b/api/gen/proto/go/teleport/kube/v1/kube_service.pb.go index 1882e4a542a53..7b7683743b6c0 100644 --- a/api/gen/proto/go/teleport/kube/v1/kube_service.pb.go +++ b/api/gen/proto/go/teleport/kube/v1/kube_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/kube/v1/kube_service.proto diff --git a/api/gen/proto/go/teleport/kubewaitingcontainer/v1/kubewaitingcontainer.pb.go b/api/gen/proto/go/teleport/kubewaitingcontainer/v1/kubewaitingcontainer.pb.go index 3d7410d93aeaa..4374b97376abb 100644 --- a/api/gen/proto/go/teleport/kubewaitingcontainer/v1/kubewaitingcontainer.pb.go +++ b/api/gen/proto/go/teleport/kubewaitingcontainer/v1/kubewaitingcontainer.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/kubewaitingcontainer/v1/kubewaitingcontainer.proto diff --git a/api/gen/proto/go/teleport/kubewaitingcontainer/v1/kubewaitingcontainer_service.pb.go b/api/gen/proto/go/teleport/kubewaitingcontainer/v1/kubewaitingcontainer_service.pb.go index 6741515f5f38a..e121095cc35d3 100644 --- a/api/gen/proto/go/teleport/kubewaitingcontainer/v1/kubewaitingcontainer_service.pb.go +++ b/api/gen/proto/go/teleport/kubewaitingcontainer/v1/kubewaitingcontainer_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/kubewaitingcontainer/v1/kubewaitingcontainer_service.proto diff --git a/api/gen/proto/go/teleport/label/v1/label.pb.go b/api/gen/proto/go/teleport/label/v1/label.pb.go index 5b7276a6222d8..20827519ef60f 100644 --- a/api/gen/proto/go/teleport/label/v1/label.pb.go +++ b/api/gen/proto/go/teleport/label/v1/label.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/label/v1/label.proto diff --git a/api/gen/proto/go/teleport/loginrule/v1/loginrule.pb.go b/api/gen/proto/go/teleport/loginrule/v1/loginrule.pb.go index 042615f79816d..de0cde420865e 100644 --- a/api/gen/proto/go/teleport/loginrule/v1/loginrule.pb.go +++ b/api/gen/proto/go/teleport/loginrule/v1/loginrule.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/loginrule/v1/loginrule.proto diff --git a/api/gen/proto/go/teleport/loginrule/v1/loginrule_service.pb.go b/api/gen/proto/go/teleport/loginrule/v1/loginrule_service.pb.go index 3e32d6896f922..f527dab36667b 100644 --- a/api/gen/proto/go/teleport/loginrule/v1/loginrule_service.pb.go +++ b/api/gen/proto/go/teleport/loginrule/v1/loginrule_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/loginrule/v1/loginrule_service.proto diff --git a/api/gen/proto/go/teleport/machineid/v1/bot.pb.go b/api/gen/proto/go/teleport/machineid/v1/bot.pb.go index 3d1ccbb61d45c..5b305a784a709 100644 --- a/api/gen/proto/go/teleport/machineid/v1/bot.pb.go +++ b/api/gen/proto/go/teleport/machineid/v1/bot.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/machineid/v1/bot.proto diff --git a/api/gen/proto/go/teleport/machineid/v1/bot_instance.pb.go b/api/gen/proto/go/teleport/machineid/v1/bot_instance.pb.go index b3ddcf33db525..ea4b3b6942f67 100644 --- a/api/gen/proto/go/teleport/machineid/v1/bot_instance.pb.go +++ b/api/gen/proto/go/teleport/machineid/v1/bot_instance.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/machineid/v1/bot_instance.proto diff --git a/api/gen/proto/go/teleport/machineid/v1/bot_instance_service.pb.go b/api/gen/proto/go/teleport/machineid/v1/bot_instance_service.pb.go index 67e143375793e..f0e9c6173a435 100644 --- a/api/gen/proto/go/teleport/machineid/v1/bot_instance_service.pb.go +++ b/api/gen/proto/go/teleport/machineid/v1/bot_instance_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/machineid/v1/bot_instance_service.proto diff --git a/api/gen/proto/go/teleport/machineid/v1/bot_service.pb.go b/api/gen/proto/go/teleport/machineid/v1/bot_service.pb.go index 043cac8ee4f20..0ae0736d7cb82 100644 --- a/api/gen/proto/go/teleport/machineid/v1/bot_service.pb.go +++ b/api/gen/proto/go/teleport/machineid/v1/bot_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/machineid/v1/bot_service.proto diff --git a/api/gen/proto/go/teleport/machineid/v1/federation.pb.go b/api/gen/proto/go/teleport/machineid/v1/federation.pb.go index 1080a03039a11..d097f09e2b360 100644 --- a/api/gen/proto/go/teleport/machineid/v1/federation.pb.go +++ b/api/gen/proto/go/teleport/machineid/v1/federation.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/machineid/v1/federation.proto diff --git a/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go b/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go index 99893b4710271..f37f85b4e1087 100644 --- a/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go +++ b/api/gen/proto/go/teleport/machineid/v1/federation_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/machineid/v1/federation_service.proto diff --git a/api/gen/proto/go/teleport/machineid/v1/workload_identity_service.pb.go b/api/gen/proto/go/teleport/machineid/v1/workload_identity_service.pb.go index af324eb25605c..6f4e9778854fb 100644 --- a/api/gen/proto/go/teleport/machineid/v1/workload_identity_service.pb.go +++ b/api/gen/proto/go/teleport/machineid/v1/workload_identity_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/machineid/v1/workload_identity_service.proto diff --git a/api/gen/proto/go/teleport/notifications/v1/notifications.pb.go b/api/gen/proto/go/teleport/notifications/v1/notifications.pb.go index fdcb4e14831d7..2feeab6bad3e0 100644 --- a/api/gen/proto/go/teleport/notifications/v1/notifications.pb.go +++ b/api/gen/proto/go/teleport/notifications/v1/notifications.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/notifications/v1/notifications.proto diff --git a/api/gen/proto/go/teleport/notifications/v1/notifications_service.pb.go b/api/gen/proto/go/teleport/notifications/v1/notifications_service.pb.go index 76d63df78a23d..74ffc7426ac02 100644 --- a/api/gen/proto/go/teleport/notifications/v1/notifications_service.pb.go +++ b/api/gen/proto/go/teleport/notifications/v1/notifications_service.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/notifications/v1/notifications_service.proto diff --git a/api/gen/proto/go/teleport/okta/v1/okta_service.pb.go b/api/gen/proto/go/teleport/okta/v1/okta_service.pb.go index a854773fa5c58..c228d1cb59b1f 100644 --- a/api/gen/proto/go/teleport/okta/v1/okta_service.pb.go +++ b/api/gen/proto/go/teleport/okta/v1/okta_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/okta/v1/okta_service.proto diff --git a/api/gen/proto/go/teleport/plugins/v1/plugin_service.pb.go b/api/gen/proto/go/teleport/plugins/v1/plugin_service.pb.go index 6e87d9bb643c9..06e1f06309604 100644 --- a/api/gen/proto/go/teleport/plugins/v1/plugin_service.pb.go +++ b/api/gen/proto/go/teleport/plugins/v1/plugin_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/plugins/v1/plugin_service.proto diff --git a/api/gen/proto/go/teleport/presence/v1/service.pb.go b/api/gen/proto/go/teleport/presence/v1/service.pb.go index 1f6d6303e921b..95b129b6df23e 100644 --- a/api/gen/proto/go/teleport/presence/v1/service.pb.go +++ b/api/gen/proto/go/teleport/presence/v1/service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/presence/v1/service.proto diff --git a/api/gen/proto/go/teleport/provisioning/v1/provisioning.pb.go b/api/gen/proto/go/teleport/provisioning/v1/provisioning.pb.go index 910d748d230ea..3773d3b0c1e18 100644 --- a/api/gen/proto/go/teleport/provisioning/v1/provisioning.pb.go +++ b/api/gen/proto/go/teleport/provisioning/v1/provisioning.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/provisioning/v1/provisioning.proto diff --git a/api/gen/proto/go/teleport/provisioning/v1/provisioning_service.pb.go b/api/gen/proto/go/teleport/provisioning/v1/provisioning_service.pb.go index 27972626d5da9..236c187b95687 100644 --- a/api/gen/proto/go/teleport/provisioning/v1/provisioning_service.pb.go +++ b/api/gen/proto/go/teleport/provisioning/v1/provisioning_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/provisioning/v1/provisioning_service.proto diff --git a/api/gen/proto/go/teleport/resourceusage/v1/access_requests.pb.go b/api/gen/proto/go/teleport/resourceusage/v1/access_requests.pb.go index 6e89994a6e0e6..0a449c6db7f62 100644 --- a/api/gen/proto/go/teleport/resourceusage/v1/access_requests.pb.go +++ b/api/gen/proto/go/teleport/resourceusage/v1/access_requests.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/resourceusage/v1/access_requests.proto diff --git a/api/gen/proto/go/teleport/resourceusage/v1/account_usage_type.pb.go b/api/gen/proto/go/teleport/resourceusage/v1/account_usage_type.pb.go index eacb7497d249b..d984461bf4e38 100644 --- a/api/gen/proto/go/teleport/resourceusage/v1/account_usage_type.pb.go +++ b/api/gen/proto/go/teleport/resourceusage/v1/account_usage_type.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/resourceusage/v1/account_usage_type.proto diff --git a/api/gen/proto/go/teleport/resourceusage/v1/device_trust.pb.go b/api/gen/proto/go/teleport/resourceusage/v1/device_trust.pb.go index f67b27ffdee11..cddbe71f5e6da 100644 --- a/api/gen/proto/go/teleport/resourceusage/v1/device_trust.pb.go +++ b/api/gen/proto/go/teleport/resourceusage/v1/device_trust.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/resourceusage/v1/device_trust.proto diff --git a/api/gen/proto/go/teleport/resourceusage/v1/resourceusage_service.pb.go b/api/gen/proto/go/teleport/resourceusage/v1/resourceusage_service.pb.go index c90c0eccfeb94..56a37f293890f 100644 --- a/api/gen/proto/go/teleport/resourceusage/v1/resourceusage_service.pb.go +++ b/api/gen/proto/go/teleport/resourceusage/v1/resourceusage_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/resourceusage/v1/resourceusage_service.proto diff --git a/api/gen/proto/go/teleport/samlidp/v1/samlidp.pb.go b/api/gen/proto/go/teleport/samlidp/v1/samlidp.pb.go index b8281638a623f..808e2974597c0 100644 --- a/api/gen/proto/go/teleport/samlidp/v1/samlidp.pb.go +++ b/api/gen/proto/go/teleport/samlidp/v1/samlidp.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/samlidp/v1/samlidp.proto diff --git a/api/gen/proto/go/teleport/scim/v1/scim_service.pb.go b/api/gen/proto/go/teleport/scim/v1/scim_service.pb.go index 95512991d811a..04b8b420babe4 100644 --- a/api/gen/proto/go/teleport/scim/v1/scim_service.pb.go +++ b/api/gen/proto/go/teleport/scim/v1/scim_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/scim/v1/scim_service.proto diff --git a/api/gen/proto/go/teleport/secreports/v1/secreports.pb.go b/api/gen/proto/go/teleport/secreports/v1/secreports.pb.go index c87fc33fbc8b5..6094c7dcfeb69 100644 --- a/api/gen/proto/go/teleport/secreports/v1/secreports.pb.go +++ b/api/gen/proto/go/teleport/secreports/v1/secreports.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/secreports/v1/secreports.proto diff --git a/api/gen/proto/go/teleport/secreports/v1/secreports_service.pb.go b/api/gen/proto/go/teleport/secreports/v1/secreports_service.pb.go index 5bae12dc9e646..7e73f94b63162 100644 --- a/api/gen/proto/go/teleport/secreports/v1/secreports_service.pb.go +++ b/api/gen/proto/go/teleport/secreports/v1/secreports_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/secreports/v1/secreports_service.proto diff --git a/api/gen/proto/go/teleport/trait/v1/trait.pb.go b/api/gen/proto/go/teleport/trait/v1/trait.pb.go index 42af578af130a..dcbf3b85a22f5 100644 --- a/api/gen/proto/go/teleport/trait/v1/trait.pb.go +++ b/api/gen/proto/go/teleport/trait/v1/trait.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/trait/v1/trait.proto diff --git a/api/gen/proto/go/teleport/transport/v1/transport_service.pb.go b/api/gen/proto/go/teleport/transport/v1/transport_service.pb.go index 111bb322658e0..335a2240bfd3b 100644 --- a/api/gen/proto/go/teleport/transport/v1/transport_service.pb.go +++ b/api/gen/proto/go/teleport/transport/v1/transport_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/transport/v1/transport_service.proto diff --git a/api/gen/proto/go/teleport/trust/v1/trust_service.pb.go b/api/gen/proto/go/teleport/trust/v1/trust_service.pb.go index b319737c27fe3..059d839a5a363 100644 --- a/api/gen/proto/go/teleport/trust/v1/trust_service.pb.go +++ b/api/gen/proto/go/teleport/trust/v1/trust_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/trust/v1/trust_service.proto diff --git a/api/gen/proto/go/teleport/userloginstate/v1/userloginstate.pb.go b/api/gen/proto/go/teleport/userloginstate/v1/userloginstate.pb.go index 86dce5291377c..79853d736ff0a 100644 --- a/api/gen/proto/go/teleport/userloginstate/v1/userloginstate.pb.go +++ b/api/gen/proto/go/teleport/userloginstate/v1/userloginstate.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userloginstate/v1/userloginstate.proto diff --git a/api/gen/proto/go/teleport/userloginstate/v1/userloginstate_service.pb.go b/api/gen/proto/go/teleport/userloginstate/v1/userloginstate_service.pb.go index 43870060724d6..a6fa27f993eaa 100644 --- a/api/gen/proto/go/teleport/userloginstate/v1/userloginstate_service.pb.go +++ b/api/gen/proto/go/teleport/userloginstate/v1/userloginstate_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userloginstate/v1/userloginstate_service.proto diff --git a/api/gen/proto/go/teleport/userprovisioning/v2/statichostuser.pb.go b/api/gen/proto/go/teleport/userprovisioning/v2/statichostuser.pb.go index ea0c35de4dbe6..a16634e2e6545 100644 --- a/api/gen/proto/go/teleport/userprovisioning/v2/statichostuser.pb.go +++ b/api/gen/proto/go/teleport/userprovisioning/v2/statichostuser.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userprovisioning/v2/statichostuser.proto diff --git a/api/gen/proto/go/teleport/userprovisioning/v2/statichostuser_service.pb.go b/api/gen/proto/go/teleport/userprovisioning/v2/statichostuser_service.pb.go index 49a0ec31de7bf..ebe42f93979af 100644 --- a/api/gen/proto/go/teleport/userprovisioning/v2/statichostuser_service.pb.go +++ b/api/gen/proto/go/teleport/userprovisioning/v2/statichostuser_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userprovisioning/v2/statichostuser_service.proto diff --git a/api/gen/proto/go/teleport/users/v1/users_service.pb.go b/api/gen/proto/go/teleport/users/v1/users_service.pb.go index 869eb5a7a8a7e..8c09c561bc1f7 100644 --- a/api/gen/proto/go/teleport/users/v1/users_service.pb.go +++ b/api/gen/proto/go/teleport/users/v1/users_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/users/v1/users_service.proto diff --git a/api/gen/proto/go/teleport/usertasks/v1/user_tasks.pb.go b/api/gen/proto/go/teleport/usertasks/v1/user_tasks.pb.go index d24dcbae031c6..b51dd76c1399b 100644 --- a/api/gen/proto/go/teleport/usertasks/v1/user_tasks.pb.go +++ b/api/gen/proto/go/teleport/usertasks/v1/user_tasks.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/usertasks/v1/user_tasks.proto diff --git a/api/gen/proto/go/teleport/usertasks/v1/user_tasks_service.pb.go b/api/gen/proto/go/teleport/usertasks/v1/user_tasks_service.pb.go index 19d6d691f2324..b60cd4b324c55 100644 --- a/api/gen/proto/go/teleport/usertasks/v1/user_tasks_service.pb.go +++ b/api/gen/proto/go/teleport/usertasks/v1/user_tasks_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/usertasks/v1/user_tasks_service.proto diff --git a/api/gen/proto/go/teleport/vnet/v1/vnet_config.pb.go b/api/gen/proto/go/teleport/vnet/v1/vnet_config.pb.go index e24296cd3f7ca..a1ac8a65e6dcb 100644 --- a/api/gen/proto/go/teleport/vnet/v1/vnet_config.pb.go +++ b/api/gen/proto/go/teleport/vnet/v1/vnet_config.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/vnet/v1/vnet_config.proto diff --git a/api/gen/proto/go/teleport/vnet/v1/vnet_config_service.pb.go b/api/gen/proto/go/teleport/vnet/v1/vnet_config_service.pb.go index c048585a1d6ce..d27e6b9aa3ce3 100644 --- a/api/gen/proto/go/teleport/vnet/v1/vnet_config_service.pb.go +++ b/api/gen/proto/go/teleport/vnet/v1/vnet_config_service.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/vnet/v1/vnet_config_service.proto diff --git a/api/gen/proto/go/userpreferences/v1/access_graph.pb.go b/api/gen/proto/go/userpreferences/v1/access_graph.pb.go index c4b738e94b48b..bff430df5f2c4 100644 --- a/api/gen/proto/go/userpreferences/v1/access_graph.pb.go +++ b/api/gen/proto/go/userpreferences/v1/access_graph.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userpreferences/v1/access_graph.proto diff --git a/api/gen/proto/go/userpreferences/v1/assist.pb.go b/api/gen/proto/go/userpreferences/v1/assist.pb.go index 7128b54ac2e28..aa879a2f0bf52 100644 --- a/api/gen/proto/go/userpreferences/v1/assist.pb.go +++ b/api/gen/proto/go/userpreferences/v1/assist.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userpreferences/v1/assist.proto diff --git a/api/gen/proto/go/userpreferences/v1/cluster_preferences.pb.go b/api/gen/proto/go/userpreferences/v1/cluster_preferences.pb.go index ad3ed2d1fce36..95bb2eca50684 100644 --- a/api/gen/proto/go/userpreferences/v1/cluster_preferences.pb.go +++ b/api/gen/proto/go/userpreferences/v1/cluster_preferences.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userpreferences/v1/cluster_preferences.proto diff --git a/api/gen/proto/go/userpreferences/v1/onboard.pb.go b/api/gen/proto/go/userpreferences/v1/onboard.pb.go index 96a12fb23609e..9a68b306b00d5 100644 --- a/api/gen/proto/go/userpreferences/v1/onboard.pb.go +++ b/api/gen/proto/go/userpreferences/v1/onboard.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userpreferences/v1/onboard.proto diff --git a/api/gen/proto/go/userpreferences/v1/sidenav_preferences.pb.go b/api/gen/proto/go/userpreferences/v1/sidenav_preferences.pb.go index 7e4ecb079a216..bf4c84711f633 100644 --- a/api/gen/proto/go/userpreferences/v1/sidenav_preferences.pb.go +++ b/api/gen/proto/go/userpreferences/v1/sidenav_preferences.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userpreferences/v1/sidenav_preferences.proto diff --git a/api/gen/proto/go/userpreferences/v1/theme.pb.go b/api/gen/proto/go/userpreferences/v1/theme.pb.go index 99d9f969b52be..068202385c591 100644 --- a/api/gen/proto/go/userpreferences/v1/theme.pb.go +++ b/api/gen/proto/go/userpreferences/v1/theme.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userpreferences/v1/theme.proto diff --git a/api/gen/proto/go/userpreferences/v1/unified_resource_preferences.pb.go b/api/gen/proto/go/userpreferences/v1/unified_resource_preferences.pb.go index b40f3c2f1bff5..28c19d56798ea 100644 --- a/api/gen/proto/go/userpreferences/v1/unified_resource_preferences.pb.go +++ b/api/gen/proto/go/userpreferences/v1/unified_resource_preferences.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userpreferences/v1/unified_resource_preferences.proto diff --git a/api/gen/proto/go/userpreferences/v1/userpreferences.pb.go b/api/gen/proto/go/userpreferences/v1/userpreferences.pb.go index 62eaf64e6e225..973b207060acd 100644 --- a/api/gen/proto/go/userpreferences/v1/userpreferences.pb.go +++ b/api/gen/proto/go/userpreferences/v1/userpreferences.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/userpreferences/v1/userpreferences.proto diff --git a/api/go.mod b/api/go.mod index 104e04b8f766f..31e931385e11a 100644 --- a/api/go.mod +++ b/api/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/api -go 1.22.0 +go 1.22.7 require ( github.com/coreos/go-semver v0.3.1 @@ -12,23 +12,23 @@ require ( github.com/gravitational/trace v1.4.0 github.com/jonboulle/clockwork v0.4.0 github.com/russellhaering/gosaml2 v0.9.1 - github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 - go.opentelemetry.io/otel v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 - go.opentelemetry.io/otel/metric v1.30.0 - go.opentelemetry.io/otel/sdk v1.30.0 - go.opentelemetry.io/otel/trace v1.30.0 - go.opentelemetry.io/proto/otlp v1.3.1 - golang.org/x/crypto v0.28.0 - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c - golang.org/x/net v0.30.0 - golang.org/x/term v0.25.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 - google.golang.org/grpc v1.66.3 - google.golang.org/protobuf v1.35.1 + github.com/stretchr/testify v1.10.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/metric v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 + go.opentelemetry.io/proto/otlp v1.4.0 + golang.org/x/crypto v0.29.0 + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f + golang.org/x/net v0.31.0 + golang.org/x/term v0.26.0 + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 + google.golang.org/grpc v1.68.0 + google.golang.org/protobuf v1.35.2 gopkg.in/yaml.v2 v2.4.0 ) @@ -41,12 +41,12 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gobwas/httphead v0.1.0 // indirect github.com/gobwas/pool v0.2.1 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/russellhaering/goxmldsig v1.4.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + golang.org/x/sys v0.27.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/api/go.sum b/api/go.sum index 226e2deb24b7e..8d2982e63ce17 100644 --- a/api/go.sum +++ b/api/go.sum @@ -728,6 +728,8 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -798,8 +800,8 @@ github.com/gravitational/trace v1.4.0/go.mod h1:g79NZzwCjWS/VVubYowaFAQsTjVTohGi github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= 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.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= 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/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= @@ -859,8 +861,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russellhaering/gosaml2 v0.9.1 h1:H/whrl8NuSoxyW46Ww5lKPskm+5K+qYLw9afqJ/Zef0= github.com/russellhaering/gosaml2 v0.9.1/go.mod h1:ja+qgbayxm+0mxBRLMSUuX3COqy+sb0RRhIGun/W2kc= github.com/russellhaering/goxmldsig v1.3.0/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw= @@ -884,8 +886,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -903,27 +905,27 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -936,8 +938,8 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm 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.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= 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= @@ -953,8 +955,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 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-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= 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= @@ -1056,8 +1058,8 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1183,8 +1185,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -1195,8 +1197,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= 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= @@ -1215,8 +1217,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1498,10 +1500,10 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1543,8 +1545,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.66.3 h1:TWlsh8Mv0QI/1sIbs1W36lqRclxrmF+eFJ4DbI0fuhA= -google.golang.org/grpc v1.66.3/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= 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= @@ -1563,8 +1565,8 @@ google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/api/proto/teleport/identitycenter/v1/identitycenter.proto b/api/proto/teleport/identitycenter/v1/identitycenter.proto index 94efabeeb81a4..64c25c13aa27f 100644 --- a/api/proto/teleport/identitycenter/v1/identitycenter.proto +++ b/api/proto/teleport/identitycenter/v1/identitycenter.proto @@ -34,13 +34,17 @@ message PermissionSetInfo { // Role is an optional ARN indicating role provisioned to this account. May be // empty if the permission set is not provisioned or is not relevant in the string role = 3; + + // AssignmentID is the name of a Teleport Account Assignment resource + // representing this permission set assigned to the enclosing Account. + string assignment_id = 4; } // AccountStatus represents any commonly-changing data about an Identity // Center account. message AccountStatus {} -// Account is an Identity-Ceneter-managed AWS account +// Account is an Identity-Center-managed AWS account message Account { string kind = 1; string sub_kind = 2; diff --git a/api/proto/teleport/integration/v1/integration_service.proto b/api/proto/teleport/integration/v1/integration_service.proto index 6306a204a79d7..0528f521f684e 100644 --- a/api/proto/teleport/integration/v1/integration_service.proto +++ b/api/proto/teleport/integration/v1/integration_service.proto @@ -16,6 +16,7 @@ syntax = "proto3"; package teleport.integration.v1; +import "google/protobuf/duration.proto"; import "google/protobuf/empty.proto"; import "teleport/legacy/types/types.proto"; @@ -44,6 +45,12 @@ service IntegrationService { // GenerateAWSOIDCToken generates a token to be used when executing an AWS OIDC Integration action. rpc GenerateAWSOIDCToken(GenerateAWSOIDCTokenRequest) returns (GenerateAWSOIDCTokenResponse); + + // GenerateGitHubUserCert signs a SSH certificate for GitHub integration. + rpc GenerateGitHubUserCert(GenerateGitHubUserCertRequest) returns (GenerateGitHubUserCertResponse); + + // ExportIntegrationCertAuthorities exports cert authorities for an integration. + rpc ExportIntegrationCertAuthorities(ExportIntegrationCertAuthoritiesRequest) returns (ExportIntegrationCertAuthoritiesResponse); } // ListIntegrationsRequest is a request for a paginated list of Integrations. @@ -111,3 +118,38 @@ message GenerateAWSOIDCTokenResponse { // Token is the signed JWT ready to be used string token = 1; } + +// GenerateGitHubUserCertRequest is a request to sign a client certificate used by +// GitHub integration to authenticate with GitHub enterprise. +message GenerateGitHubUserCertRequest { + // Integration is the name of the integration; + string integration = 1; + // PublicKey is the public key to be signed. + bytes public_key = 2; + // UserId is the GitHub user id. + string user_id = 3; + // KeyId is the certificate ID, usually the Teleport username. + string key_id = 4; + // Ttl is the duration the certificate will be valid for. + google.protobuf.Duration ttl = 5; +} + +// GenerateGitHubUserCertResponse contains a signed certificate. +message GenerateGitHubUserCertResponse { + // AuthorizedKey is the signed certificate. + bytes authorized_key = 1; +} + +// ExportIntegrationCertAuthoritiesRequest is the request to export cert +// authorities for an integration. +message ExportIntegrationCertAuthoritiesRequest { + // Integration is the name of the integration; + string integration = 1; +} + +// ExportIntegrationCertAuthoritiesResponse is the response to +// ExportIntegrationCertAuthorities. +message ExportIntegrationCertAuthoritiesResponse { + // CertAuthorities are the CA key sets used to sign any new certificates. + types.CAKeySet cert_authorities = 1; +} diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index f375f4f00edcc..8c07c01145455 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -333,7 +333,13 @@ message RouteToApp { // GCPServiceAccount is the GCP service account to assume when accessing GCP API. string GCPServiceAccount = 7 [(gogoproto.jsontag) = "gcp_service_account,omitempty"]; // URI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. + // Used merely for audit events and mirrors the URI from the app spec. Not used as a source of + // truth when routing connections. string URI = 8 [(gogoproto.jsontag) = "uri,omitempty"]; + // TargetPort signifies that the cert grants access to a specific port in a multi-port TCP app, as + // long as the port is defined in the app spec. When specified, it must be between 1 and 65535. + // Used only for routing, should not be used in other contexts (e.g., access requests). + uint32 TargetPort = 9 [(gogoproto.jsontag) = "target_port,omitempty"]; } // GetUserRequest specifies parameters for the GetUser method. @@ -1962,6 +1968,8 @@ message PaginatedResource { types.AppServerOrSAMLIdPServiceProviderV1 AppServerOrSAMLIdPServiceProvider = 11 [deprecated = true]; // SAMLIdPServiceProvider represents a SAML IdP service provider resource. types.SAMLIdPServiceProviderV1 SAMLIdPServiceProvider = 12 [(gogoproto.jsontag) = "saml_idp_service_provider,omitempty"]; + // GitServer represents a Git server resource. + types.ServerV2 git_server = 15; } // Logins allowed for the included resource. Only to be populated for SSH and Desktops. diff --git a/api/proto/teleport/legacy/client/proto/event.proto b/api/proto/teleport/legacy/client/proto/event.proto index 7c0cd043eb13d..4c790ce6fdbc3 100644 --- a/api/proto/teleport/legacy/client/proto/event.proto +++ b/api/proto/teleport/legacy/client/proto/event.proto @@ -206,5 +206,7 @@ message Event { // IdentityCenterAccountlAssignment is a resource representing a potential // Permission Set grant on a specific AWS account. teleport.identitycenter.v1.AccountAssignment IdentityCenterAccountAssignment = 74; + // PluginStaticCredentials is filled in PluginStaticCredentials related events + types.PluginStaticCredentialsV1 PluginStaticCredentials = 75; } } diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 4fdba25e8bd13..e7a7bc0440546 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -2675,6 +2675,9 @@ message AppMetadata { ]; // AppName is the configured application name. string AppName = 4 [(gogoproto.jsontag) = "app_name,omitempty"]; + // AppTargetPort signifies that the app is a multi-port TCP app and says which port was used to + // access the app. This field is not set for other types of apps, including single-port TCP apps. + uint32 AppTargetPort = 5 [(gogoproto.jsontag) = "app_target_port,omitempty"]; } // AppCreate is emitted when a new application resource is created. @@ -4684,6 +4687,8 @@ message OneOf { events.UserTaskUpdate UserTaskUpdate = 189; events.UserTaskDelete UserTaskDelete = 190; events.SFTPSummary SFTPSummary = 191; + events.ContactCreate ContactCreate = 192; + events.ContactDelete ContactDelete = 193; } } @@ -4837,6 +4842,9 @@ message RouteToApp { string GCPServiceAccount = 7 [(gogoproto.jsontag) = "gcp_service_account,omitempty"]; // URI is the application URI. string URI = 8 [(gogoproto.jsontag) = "uri,omitempty"]; + // TargetPort signifies that the user accessed a specific port in a multi-port TCP app. The value + // must be between 1 and 65535. + uint32 TargetPort = 9 [(gogoproto.jsontag) = "target_port,omitempty"]; } // RouteToDatabase combines parameters for database service routing information. @@ -7574,3 +7582,98 @@ message UserTaskDelete { (gogoproto.jsontag) = "" ]; } + +// ContactCreate is emitted when a contact is created. +message ContactCreate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the creation was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Email is the Email of the contact being deleted + string Email = 6 [(gogoproto.jsontag) = "email"]; + + // ContactType is the type of the contact being deleted ('Business' or 'Security') + ContactType ContactType = 7 [(gogoproto.jsontag) = "contact_type"]; +} + +// ContactDelete is emitted when a contact is deleted. +message ContactDelete { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the deletion was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Email is the Email of the contact being deleted + string Email = 6 [(gogoproto.jsontag) = "email"]; + + // ContactType is the type of the contact being deleted ('Business' or 'Security') + ContactType ContactType = 7 [(gogoproto.jsontag) = "contact_type"]; +} + +// ContactType is the type of contact being added. +enum ContactType { + CONTACT_TYPE_UNSPECIFIED = 0; + CONTACT_TYPE_BUSINESS = 1; + CONTACT_TYPE_SECURITY = 2; +} diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 8f19712b48b6f..530d8315a4bdf 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -1009,6 +1009,10 @@ message IdentityCenterPermissionSet { // Name is the human-readable name of the Permission Set. string Name = 2 [(gogoproto.jsontag) = "name,omitempty"]; + + // AssignmentID is the ID of the Teelport Account Assignment resource that + // represents this permission being assigned on the enclosing Account. + string AssignmentID = 3 [(gogoproto.jsontag) = "assignment_name,omitempty"]; } // AppIdentityCenter encapsulates information about an AWS Identity Center @@ -1054,6 +1058,11 @@ message AppSpecV3 { // IdentityCenter encasulates AWS identity-center specific information. Only // valid for Identity Center account apps. AppIdentityCenter IdentityCenter = 12 [(gogoproto.jsontag) = "identity_center,omitempty"]; + // TCPPorts is a list of ports and port ranges that an app agent can forward connections to. + // Only applicable to TCP App Access. + // If this field is not empty, URI is expected to contain no port number and start with the tcp + // protocol. + repeated PortRange TCPPorts = 13 [(gogoproto.jsontag) = "tcp_ports,omitempty"]; } // AppServerOrSAMLIdPServiceProviderV1 holds either an AppServerV3 or a SAMLIdPServiceProviderV1 resource (never both). @@ -1095,6 +1104,18 @@ message Header { string Value = 2 [(gogoproto.jsontag) = "value"]; } +// PortRange describes a port range for TCP apps. The range starts with Port and ends with EndPort. +// PortRange can be used to describe a single port in which case the Port field is the port and the +// EndPort field is 0. +message PortRange { + // Port describes the start of the range. It must be between 1 and 65535. + uint32 Port = 1 [(gogoproto.jsontag) = "port"]; + // EndPort describes the end of the range, inclusive. If set, it must be between 2 and 65535 and + // be greater than Port when describing a port range. When omitted or set to zero, it signifies + // that the port range defines a single port. + uint32 EndPort = 2 [(gogoproto.jsontag) = "end_port,omitempty"]; +} + // CommandLabelV2 is a label that has a value as a result of the // output generated by running command, e.g. hostname message CommandLabelV2 { diff --git a/api/types/app.go b/api/types/app.go index 7806d54c2b899..75b6283d2e514 100644 --- a/api/types/app.go +++ b/api/types/app.go @@ -27,6 +27,7 @@ import ( "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types/compare" "github.com/gravitational/teleport/api/utils" + netutils "github.com/gravitational/teleport/api/utils/net" ) var _ compare.IsEqual[Application] = (*AppV3)(nil) @@ -86,6 +87,12 @@ type Application interface { GetRequiredAppNames() []string // GetCORS returns the CORS configuration for the app. GetCORS() *CORSPolicy + // GetTCPPorts returns port ranges supported by the app to which connections can be forwarded to. + GetTCPPorts() []*PortRange + // SetTCPPorts sets port ranges to which connections can be forwarded to. + SetTCPPorts([]*PortRange) + // GetIdentityCenter fetches identity center info for the app, if any. + GetIdentityCenter() *AppIdentityCenter } // NewAppV3 creates a new app resource. @@ -306,6 +313,16 @@ func (a *AppV3) SetUserGroups(userGroups []string) { a.Spec.UserGroups = userGroups } +// GetTCPPorts returns port ranges supported by the app to which connections can be forwarded to. +func (a *AppV3) GetTCPPorts() []*PortRange { + return a.Spec.TCPPorts +} + +// SetTCPPorts sets port ranges to which connections can be forwarded to. +func (a *AppV3) SetTCPPorts(ports []*PortRange) { + a.Spec.TCPPorts = ports +} + // GetIntegration will return the Integration. // If present, the Application must use the Integration's credentials instead of ambient credentials to access Cloud APIs. func (a *AppV3) GetIntegration() string { @@ -379,13 +396,13 @@ func (a *AppV3) CheckAndSetDefaults() error { if !strings.Contains(publicAddr, "//") && strings.Contains(publicAddr, ":") { publicAddr = "//" + publicAddr } - url, err := url.Parse(publicAddr) + publicAddrURL, err := url.Parse(publicAddr) if err != nil { return trace.BadParameter("invalid PublicAddr format: %v", err) } host := a.Spec.PublicAddr - if url.Host != "" { - host = url.Host + if publicAddrURL.Host != "" { + host = publicAddrURL.Host } if strings.HasPrefix(host, constants.KubeTeleportProxyALPNPrefix) { @@ -402,9 +419,62 @@ func (a *AppV3) CheckAndSetDefaults() error { } } + if len(a.Spec.TCPPorts) != 0 { + if err := a.checkTCPPorts(); err != nil { + return trace.Wrap(err) + } + } + return nil } +func (a *AppV3) checkTCPPorts() error { + // Parsing the URI here does not break compatibility. The URI is parsed only if Ports are present. + // This means that old apps that do have invalid URIs but don't use Ports can continue existing. + uri, err := url.Parse(a.Spec.URI) + if err != nil { + return trace.BadParameter("invalid app URI format: %v", err) + } + + // The scheme of URI is enforced to be "tcp" on purpose. This way in the future we can add + // multi-port support to web apps without throwing hard errors when a cluster with a multi-port + // web app gets downgraded to a version which supports multi-port only for TCP apps. + // + // For now, we simply ignore the Ports field set on non-TCP apps. + if uri.Scheme != "tcp" { + return nil + } + + if uri.Port() != "" { + return trace.BadParameter("TCP app URI %q must not include a port number when the app spec defines a list of ports", a.Spec.URI) + } + + for _, portRange := range a.Spec.TCPPorts { + if err := netutils.ValidatePortRange(int(portRange.Port), int(portRange.EndPort)); err != nil { + return trace.Wrap(err, "validating a port range of a TCP app") + } + } + + return nil +} + +// GetIdentityCenter returns the Identity Center information for the app, if any. +// May be nil. +func (a *AppV3) GetIdentityCenter() *AppIdentityCenter { + return a.Spec.IdentityCenter +} + +// GetDisplayName fetches a human-readable display name for the App. +func (a *AppV3) GetDisplayName() string { + // Only Identity Center apps have a display name at this point. Returning + // the empty string signals to the caller they should fall back to whatever + // they have been using in the past. + if a.Spec.IdentityCenter == nil { + return "" + } + return a.GetName() +} + // IsEqual determines if two application resources are equivalent to one another. func (a *AppV3) IsEqual(i Application) bool { if other, ok := i.(*AppV3); ok { @@ -458,3 +528,12 @@ func (a Apps) Less(i, j int) bool { return a[i].GetName() < a[j].GetName() } // Swap swaps two apps. func (a Apps) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + +// GetPermissionSets fetches the list of permission sets from the Identity Center +// app information. Handles nil identity center values. +func (a *AppIdentityCenter) GetPermissionSets() []*IdentityCenterPermissionSet { + if a == nil { + return nil + } + return a.PermissionSets +} diff --git a/api/types/app_test.go b/api/types/app_test.go index 269b41686b3c2..cf3a9518c1ba5 100644 --- a/api/types/app_test.go +++ b/api/types/app_test.go @@ -29,58 +29,45 @@ import ( // TestAppPublicAddrValidation tests PublicAddr field validation to make sure that // an app with internal "kube-teleport-proxy-alpn." ServerName prefix won't be created. func TestAppPublicAddrValidation(t *testing.T) { - type check func(t *testing.T, err error) - - hasNoErr := func() check { - return func(t *testing.T, err error) { - require.NoError(t, err) - } - } - hasErrTypeBadParameter := func() check { - return func(t *testing.T, err error) { - require.True(t, trace.IsBadParameter(err)) - } - } - tests := []struct { name string publicAddr string - check check + check require.ErrorAssertionFunc }{ { name: "kubernetes app", publicAddr: "kubernetes.example.com:3080", - check: hasNoErr(), + check: hasNoErr, }, { name: "kubernetes app public addr without port", publicAddr: "kubernetes.example.com", - check: hasNoErr(), + check: hasNoErr, }, { name: "kubernetes app http", publicAddr: "http://kubernetes.example.com:3080", - check: hasNoErr(), + check: hasNoErr, }, { name: "kubernetes app https", publicAddr: "https://kubernetes.example.com:3080", - check: hasNoErr(), + check: hasNoErr, }, { name: "public address with internal kube ServerName prefix", publicAddr: constants.KubeTeleportProxyALPNPrefix + "example.com:3080", - check: hasErrTypeBadParameter(), + check: hasErrTypeBadParameter, }, { name: "https public address with internal kube ServerName prefix", publicAddr: "https://" + constants.KubeTeleportProxyALPNPrefix + "example.com:3080", - check: hasErrTypeBadParameter(), + check: hasErrTypeBadParameter, }, { name: "addr with numbers in the host", publicAddr: "123456789012.teleport.example.com:3080", - check: hasNoErr(), + check: hasNoErr, }, } @@ -97,6 +84,112 @@ func TestAppPublicAddrValidation(t *testing.T) { } } +func TestAppPortsValidation(t *testing.T) { + tests := []struct { + name string + tcpPorts []*PortRange + uri string + check require.ErrorAssertionFunc + }{ + { + name: "valid ranges and single ports", + tcpPorts: []*PortRange{ + &PortRange{Port: 22, EndPort: 25}, + &PortRange{Port: 26}, + &PortRange{Port: 65535}, + }, + check: hasNoErr, + }, + { + name: "valid overlapping ranges", + tcpPorts: []*PortRange{ + &PortRange{Port: 100, EndPort: 200}, + &PortRange{Port: 150, EndPort: 175}, + &PortRange{Port: 111}, + &PortRange{Port: 150, EndPort: 210}, + &PortRange{Port: 1, EndPort: 65535}, + }, + check: hasNoErr, + }, + { + name: "valid non-TCP app with ports ignored", + uri: "http://localhost:8000", + tcpPorts: []*PortRange{ + &PortRange{Port: 123456789}, + &PortRange{Port: 10, EndPort: 2}, + }, + check: hasNoErr, + }, + // Test cases for invalid ports. + { + name: "port smaller than 1", + tcpPorts: []*PortRange{ + &PortRange{Port: 0}, + }, + check: hasErrTypeBadParameter, + }, + { + name: "port bigger than 65535", + tcpPorts: []*PortRange{ + &PortRange{Port: 78787}, + }, + check: hasErrTypeBadParameter, + }, + { + name: "end port smaller than 2", + tcpPorts: []*PortRange{ + &PortRange{Port: 5, EndPort: 1}, + }, + check: hasErrTypeBadParameterAndContains("end port must be between 6 and 65535"), + }, + { + name: "end port bigger than 65535", + tcpPorts: []*PortRange{ + &PortRange{Port: 1, EndPort: 78787}, + }, + check: hasErrTypeBadParameter, + }, + { + name: "end port smaller than port", + tcpPorts: []*PortRange{ + &PortRange{Port: 10, EndPort: 5}, + }, + check: hasErrTypeBadParameterAndContains("end port must be between 11 and 65535"), + }, + { + name: "uri specifies port", + uri: "tcp://localhost:1234", + tcpPorts: []*PortRange{ + &PortRange{Port: 1000, EndPort: 1500}, + }, + check: hasErrTypeBadParameterAndContains("must not include a port number"), + }, + { + name: "invalid uri", + uri: "%", + tcpPorts: []*PortRange{ + &PortRange{Port: 1000, EndPort: 1500}, + }, + check: hasErrAndContains("invalid URL escape"), + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + spec := AppSpecV3{ + URI: "tcp://localhost", + TCPPorts: tc.tcpPorts, + } + if tc.uri != "" { + spec.URI = tc.uri + } + + _, err := NewAppV3(Metadata{Name: "TestApp"}, spec) + tc.check(t, err) + }) + } +} + func TestAppServerSorter(t *testing.T) { t.Parallel() @@ -469,3 +562,24 @@ func TestNewAppV3(t *testing.T) { }) } } + +func hasNoErr(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.NoError(t, err, msgAndArgs...) +} + +func hasErrTypeBadParameter(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.True(t, trace.IsBadParameter(err), "expected bad parameter error, got %+v", err) +} + +func hasErrTypeBadParameterAndContains(msg string) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.True(t, trace.IsBadParameter(err), "err should be trace.BadParameter") + require.ErrorContains(t, err, msg, msgAndArgs...) + } +} + +func hasErrAndContains(msg string) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.ErrorContains(t, err, msg, msgAndArgs...) + } +} diff --git a/api/types/constants.go b/api/types/constants.go index 4940e67999bf9..e8beb81d0bec0 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -593,6 +593,10 @@ const ( // pair that can be requested by a Teleport User. KindIdentityCenterAccountAssignment = "aws_ic_account_assignment" + // KindContact is a resource that holds contact information + // for Teleport Enterprise customers. + KindContact = "contact" + // KindGitServer represents a Git server that can proxy git commands. KindGitServer = "git_server" // SubKindGitHub specifies the GitHub subkind of a Git server. diff --git a/api/types/derived.gen.go b/api/types/derived.gen.go index 3466910f675bd..ee13f9580a399 100644 --- a/api/types/derived.gen.go +++ b/api/types/derived.gen.go @@ -195,7 +195,8 @@ func deriveTeleportEqual(this, that *AppSpecV3) bool { this.Integration == that.Integration && deriveTeleportEqual_21(this.RequiredAppNames, that.RequiredAppNames) && deriveTeleportEqual_22(this.CORS, that.CORS) && - deriveTeleportEqual_23(this.IdentityCenter, that.IdentityCenter) + deriveTeleportEqual_23(this.IdentityCenter, that.IdentityCenter) && + deriveTeleportEqual_24(this.TCPPorts, that.TCPPorts) } // deriveTeleportEqual_ returns whether this and that are equal. @@ -320,12 +321,12 @@ func deriveTeleportEqual_11(this, that *DatabaseSpecV3) bool { deriveTeleportEqualAWS(&this.AWS, &that.AWS) && deriveTeleportEqualGCPCloudSQL(&this.GCP, &that.GCP) && deriveTeleportEqualAzure(&this.Azure, &that.Azure) && - deriveTeleportEqual_24(&this.TLS, &that.TLS) && - deriveTeleportEqual_25(&this.AD, &that.AD) && - deriveTeleportEqual_26(&this.MySQL, &that.MySQL) && - deriveTeleportEqual_27(this.AdminUser, that.AdminUser) && - deriveTeleportEqual_28(&this.MongoAtlas, &that.MongoAtlas) && - deriveTeleportEqual_29(&this.Oracle, &that.Oracle) + deriveTeleportEqual_25(&this.TLS, &that.TLS) && + deriveTeleportEqual_26(&this.AD, &that.AD) && + deriveTeleportEqual_27(&this.MySQL, &that.MySQL) && + deriveTeleportEqual_28(this.AdminUser, that.AdminUser) && + deriveTeleportEqual_29(&this.MongoAtlas, &that.MongoAtlas) && + deriveTeleportEqual_30(&this.Oracle, &that.Oracle) } // deriveTeleportEqual_12 returns whether this and that are equal. @@ -335,7 +336,7 @@ func deriveTeleportEqual_12(this, that *DynamicWindowsDesktopSpecV1) bool { this.Addr == that.Addr && this.Domain == that.Domain && this.NonAD == that.NonAD && - deriveTeleportEqual_30(this.ScreenSize, that.ScreenSize) + deriveTeleportEqual_31(this.ScreenSize, that.ScreenSize) } // deriveTeleportEqual_13 returns whether this and that are equal. @@ -346,7 +347,7 @@ func deriveTeleportEqual_13(this, that *WindowsDesktopSpecV3) bool { this.Domain == that.Domain && this.HostID == that.HostID && this.NonAD == that.NonAD && - deriveTeleportEqual_30(this.ScreenSize, that.ScreenSize) + deriveTeleportEqual_31(this.ScreenSize, that.ScreenSize) } // deriveTeleportEqual_14 returns whether this and that are equal. @@ -367,7 +368,7 @@ func deriveTeleportEqual_15(this, that *KubernetesServerSpecV3) bool { this.Version == that.Version && this.Hostname == that.Hostname && this.HostID == that.HostID && - deriveTeleportEqual_31(&this.Rotation, &that.Rotation) && + deriveTeleportEqual_32(&this.Rotation, &that.Rotation) && deriveTeleportEqualKubernetesClusterV3(this.Cluster, that.Cluster) && deriveTeleportEqual_21(this.ProxyIDs, that.ProxyIDs) } @@ -377,7 +378,7 @@ func deriveTeleportEqual_16(this, that *OktaAssignmentSpecV1) bool { return (this == nil && that == nil) || this != nil && that != nil && this.User == that.User && - deriveTeleportEqual_32(this.Targets, that.Targets) && + deriveTeleportEqual_33(this.Targets, that.Targets) && this.CleanupTime.Equal(that.CleanupTime) && this.Status == that.Status && this.LastTransition.Equal(that.LastTransition) && @@ -404,7 +405,7 @@ func deriveTeleportEqual_18(this, that map[string]CommandLabelV2) bool { if !ok { return false } - if !(deriveTeleportEqual_33(&v, &thatv)) { + if !(deriveTeleportEqual_34(&v, &thatv)) { return false } } @@ -416,7 +417,7 @@ func deriveTeleportEqual_19(this, that *Rewrite) bool { return (this == nil && that == nil) || this != nil && that != nil && deriveTeleportEqual_21(this.Redirect, that.Redirect) && - deriveTeleportEqual_34(this.Headers, that.Headers) && + deriveTeleportEqual_35(this.Headers, that.Headers) && this.JWTClaims == that.JWTClaims } @@ -460,11 +461,27 @@ func deriveTeleportEqual_23(this, that *AppIdentityCenter) bool { return (this == nil && that == nil) || this != nil && that != nil && this.AccountID == that.AccountID && - deriveTeleportEqual_35(this.PermissionSets, that.PermissionSets) + deriveTeleportEqual_36(this.PermissionSets, that.PermissionSets) } // deriveTeleportEqual_24 returns whether this and that are equal. -func deriveTeleportEqual_24(this, that *DatabaseTLS) bool { +func deriveTeleportEqual_24(this, that []*PortRange) bool { + if this == nil || that == nil { + return this == nil && that == nil + } + if len(this) != len(that) { + return false + } + for i := 0; i < len(this); i++ { + if !(deriveTeleportEqual_37(this[i], that[i])) { + return false + } + } + return true +} + +// deriveTeleportEqual_25 returns whether this and that are equal. +func deriveTeleportEqual_25(this, that *DatabaseTLS) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Mode == that.Mode && @@ -473,8 +490,8 @@ func deriveTeleportEqual_24(this, that *DatabaseTLS) bool { this.TrustSystemCertPool == that.TrustSystemCertPool } -// deriveTeleportEqual_25 returns whether this and that are equal. -func deriveTeleportEqual_25(this, that *AD) bool { +// deriveTeleportEqual_26 returns whether this and that are equal. +func deriveTeleportEqual_26(this, that *AD) bool { return (this == nil && that == nil) || this != nil && that != nil && this.KeytabFile == that.KeytabFile && @@ -485,45 +502,45 @@ func deriveTeleportEqual_25(this, that *AD) bool { this.KDCHostName == that.KDCHostName } -// deriveTeleportEqual_26 returns whether this and that are equal. -func deriveTeleportEqual_26(this, that *MySQLOptions) bool { +// deriveTeleportEqual_27 returns whether this and that are equal. +func deriveTeleportEqual_27(this, that *MySQLOptions) bool { return (this == nil && that == nil) || this != nil && that != nil && this.ServerVersion == that.ServerVersion } -// deriveTeleportEqual_27 returns whether this and that are equal. -func deriveTeleportEqual_27(this, that *DatabaseAdminUser) bool { +// deriveTeleportEqual_28 returns whether this and that are equal. +func deriveTeleportEqual_28(this, that *DatabaseAdminUser) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Name == that.Name && this.DefaultDatabase == that.DefaultDatabase } -// deriveTeleportEqual_28 returns whether this and that are equal. -func deriveTeleportEqual_28(this, that *MongoAtlas) bool { +// deriveTeleportEqual_29 returns whether this and that are equal. +func deriveTeleportEqual_29(this, that *MongoAtlas) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Name == that.Name } -// deriveTeleportEqual_29 returns whether this and that are equal. -func deriveTeleportEqual_29(this, that *OracleOptions) bool { +// deriveTeleportEqual_30 returns whether this and that are equal. +func deriveTeleportEqual_30(this, that *OracleOptions) bool { return (this == nil && that == nil) || this != nil && that != nil && this.AuditUser == that.AuditUser } -// deriveTeleportEqual_30 returns whether this and that are equal. -func deriveTeleportEqual_30(this, that *Resolution) bool { +// deriveTeleportEqual_31 returns whether this and that are equal. +func deriveTeleportEqual_31(this, that *Resolution) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Width == that.Width && this.Height == that.Height } -// deriveTeleportEqual_31 returns whether this and that are equal. -func deriveTeleportEqual_31(this, that *Rotation) bool { +// deriveTeleportEqual_32 returns whether this and that are equal. +func deriveTeleportEqual_32(this, that *Rotation) bool { return (this == nil && that == nil) || this != nil && that != nil && this.State == that.State && @@ -533,11 +550,11 @@ func deriveTeleportEqual_31(this, that *Rotation) bool { this.Started.Equal(that.Started) && this.GracePeriod == that.GracePeriod && this.LastRotated.Equal(that.LastRotated) && - deriveTeleportEqual_36(&this.Schedule, &that.Schedule) + deriveTeleportEqual_38(&this.Schedule, &that.Schedule) } -// deriveTeleportEqual_32 returns whether this and that are equal. -func deriveTeleportEqual_32(this, that []*OktaAssignmentTargetV1) bool { +// deriveTeleportEqual_33 returns whether this and that are equal. +func deriveTeleportEqual_33(this, that []*OktaAssignmentTargetV1) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -545,15 +562,15 @@ func deriveTeleportEqual_32(this, that []*OktaAssignmentTargetV1) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_37(this[i], that[i])) { + if !(deriveTeleportEqual_39(this[i], that[i])) { return false } } return true } -// deriveTeleportEqual_33 returns whether this and that are equal. -func deriveTeleportEqual_33(this, that *CommandLabelV2) bool { +// deriveTeleportEqual_34 returns whether this and that are equal. +func deriveTeleportEqual_34(this, that *CommandLabelV2) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Period == that.Period && @@ -561,8 +578,8 @@ func deriveTeleportEqual_33(this, that *CommandLabelV2) bool { this.Result == that.Result } -// deriveTeleportEqual_34 returns whether this and that are equal. -func deriveTeleportEqual_34(this, that []*Header) bool { +// deriveTeleportEqual_35 returns whether this and that are equal. +func deriveTeleportEqual_35(this, that []*Header) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -570,15 +587,15 @@ func deriveTeleportEqual_34(this, that []*Header) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_38(this[i], that[i])) { + if !(deriveTeleportEqual_40(this[i], that[i])) { return false } } return true } -// deriveTeleportEqual_35 returns whether this and that are equal. -func deriveTeleportEqual_35(this, that []*IdentityCenterPermissionSet) bool { +// deriveTeleportEqual_36 returns whether this and that are equal. +func deriveTeleportEqual_36(this, that []*IdentityCenterPermissionSet) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -586,15 +603,23 @@ func deriveTeleportEqual_35(this, that []*IdentityCenterPermissionSet) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_39(this[i], that[i])) { + if !(deriveTeleportEqual_41(this[i], that[i])) { return false } } return true } -// deriveTeleportEqual_36 returns whether this and that are equal. -func deriveTeleportEqual_36(this, that *RotationSchedule) bool { +// deriveTeleportEqual_37 returns whether this and that are equal. +func deriveTeleportEqual_37(this, that *PortRange) bool { + return (this == nil && that == nil) || + this != nil && that != nil && + this.Port == that.Port && + this.EndPort == that.EndPort +} + +// deriveTeleportEqual_38 returns whether this and that are equal. +func deriveTeleportEqual_38(this, that *RotationSchedule) bool { return (this == nil && that == nil) || this != nil && that != nil && this.UpdateClients.Equal(that.UpdateClients) && @@ -602,26 +627,27 @@ func deriveTeleportEqual_36(this, that *RotationSchedule) bool { this.Standby.Equal(that.Standby) } -// deriveTeleportEqual_37 returns whether this and that are equal. -func deriveTeleportEqual_37(this, that *OktaAssignmentTargetV1) bool { +// deriveTeleportEqual_39 returns whether this and that are equal. +func deriveTeleportEqual_39(this, that *OktaAssignmentTargetV1) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Type == that.Type && this.Id == that.Id } -// deriveTeleportEqual_38 returns whether this and that are equal. -func deriveTeleportEqual_38(this, that *Header) bool { +// deriveTeleportEqual_40 returns whether this and that are equal. +func deriveTeleportEqual_40(this, that *Header) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Name == that.Name && this.Value == that.Value } -// deriveTeleportEqual_39 returns whether this and that are equal. -func deriveTeleportEqual_39(this, that *IdentityCenterPermissionSet) bool { +// deriveTeleportEqual_41 returns whether this and that are equal. +func deriveTeleportEqual_41(this, that *IdentityCenterPermissionSet) bool { return (this == nil && that == nil) || this != nil && that != nil && this.ARN == that.ARN && - this.Name == that.Name + this.Name == that.Name && + this.AssignmentID == that.AssignmentID } diff --git a/api/types/events/events.go b/api/types/events/events.go index 19cc44b5e8981..1b11c68e58d56 100644 --- a/api/types/events/events.go +++ b/api/types/events/events.go @@ -2352,3 +2352,11 @@ func (m *AutoUpdateVersionUpdate) TrimToMaxSize(_ int) AuditEvent { func (m *AutoUpdateVersionDelete) TrimToMaxSize(_ int) AuditEvent { return m } + +func (m *ContactCreate) TrimToMaxSize(_ int) AuditEvent { + return m +} + +func (m *ContactDelete) TrimToMaxSize(_ int) AuditEvent { + return m +} diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index a5a2226582149..c8d1db9a2e430 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -350,6 +350,35 @@ func (AdminActionsMFAStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor_007ba1c3d6266d56, []int{7} } +// ContactType is the type of contact being added. +type ContactType int32 + +const ( + ContactType_CONTACT_TYPE_UNSPECIFIED ContactType = 0 + ContactType_CONTACT_TYPE_BUSINESS ContactType = 1 + ContactType_CONTACT_TYPE_SECURITY ContactType = 2 +) + +var ContactType_name = map[int32]string{ + 0: "CONTACT_TYPE_UNSPECIFIED", + 1: "CONTACT_TYPE_BUSINESS", + 2: "CONTACT_TYPE_SECURITY", +} + +var ContactType_value = map[string]int32{ + "CONTACT_TYPE_UNSPECIFIED": 0, + "CONTACT_TYPE_BUSINESS": 1, + "CONTACT_TYPE_SECURITY": 2, +} + +func (x ContactType) String() string { + return proto.EnumName(ContactType_name, int32(x)) +} + +func (ContactType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{8} +} + // Operation is the network operation that was performed or attempted type SessionNetwork_NetworkOperation int32 @@ -4606,7 +4635,10 @@ type AppMetadata struct { // AppLabels are the configured application labels. AppLabels map[string]string `protobuf:"bytes,3,rep,name=AppLabels,proto3" json:"app_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // AppName is the configured application name. - AppName string `protobuf:"bytes,4,opt,name=AppName,proto3" json:"app_name,omitempty"` + AppName string `protobuf:"bytes,4,opt,name=AppName,proto3" json:"app_name,omitempty"` + // AppTargetPort signifies that the app is a multi-port TCP app and says which port was used to + // access the app. This field is not set for other types of apps, including single-port TCP apps. + AppTargetPort uint32 `protobuf:"varint,5,opt,name=AppTargetPort,proto3" json:"app_target_port,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -7878,6 +7910,8 @@ type OneOf struct { // *OneOf_UserTaskUpdate // *OneOf_UserTaskDelete // *OneOf_SFTPSummary + // *OneOf_ContactCreate + // *OneOf_ContactDelete Event isOneOf_Event `protobuf_oneof:"Event"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -8484,6 +8518,12 @@ type OneOf_UserTaskDelete struct { type OneOf_SFTPSummary struct { SFTPSummary *SFTPSummary `protobuf:"bytes,191,opt,name=SFTPSummary,proto3,oneof" json:"SFTPSummary,omitempty"` } +type OneOf_ContactCreate struct { + ContactCreate *ContactCreate `protobuf:"bytes,192,opt,name=ContactCreate,proto3,oneof" json:"ContactCreate,omitempty"` +} +type OneOf_ContactDelete struct { + ContactDelete *ContactDelete `protobuf:"bytes,193,opt,name=ContactDelete,proto3,oneof" json:"ContactDelete,omitempty"` +} func (*OneOf_UserLogin) isOneOf_Event() {} func (*OneOf_UserCreate) isOneOf_Event() {} @@ -8672,6 +8712,8 @@ func (*OneOf_UserTaskCreate) isOneOf_Event() {} func (*OneOf_UserTaskUpdate) isOneOf_Event() {} func (*OneOf_UserTaskDelete) isOneOf_Event() {} func (*OneOf_SFTPSummary) isOneOf_Event() {} +func (*OneOf_ContactCreate) isOneOf_Event() {} +func (*OneOf_ContactDelete) isOneOf_Event() {} func (m *OneOf) GetEvent() isOneOf_Event { if m != nil { @@ -9989,6 +10031,20 @@ func (m *OneOf) GetSFTPSummary() *SFTPSummary { return nil } +func (m *OneOf) GetContactCreate() *ContactCreate { + if x, ok := m.GetEvent().(*OneOf_ContactCreate); ok { + return x.ContactCreate + } + return nil +} + +func (m *OneOf) GetContactDelete() *ContactDelete { + if x, ok := m.GetEvent().(*OneOf_ContactDelete); ok { + return x.ContactDelete + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*OneOf) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -10179,6 +10235,8 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_UserTaskUpdate)(nil), (*OneOf_UserTaskDelete)(nil), (*OneOf_SFTPSummary)(nil), + (*OneOf_ContactCreate)(nil), + (*OneOf_ContactDelete)(nil), } } @@ -10410,7 +10468,10 @@ type RouteToApp struct { // GCPServiceAccount is the GCP service account to assume when accessing GCP API. GCPServiceAccount string `protobuf:"bytes,7,opt,name=GCPServiceAccount,proto3" json:"gcp_service_account,omitempty"` // URI is the application URI. - URI string `protobuf:"bytes,8,opt,name=URI,proto3" json:"uri,omitempty"` + URI string `protobuf:"bytes,8,opt,name=URI,proto3" json:"uri,omitempty"` + // TargetPort signifies that the user accessed a specific port in a multi-port TCP app. The value + // must be between 1 and 65535. + TargetPort uint32 `protobuf:"varint,9,opt,name=TargetPort,proto3" json:"target_port,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -14919,6 +14980,114 @@ func (m *UserTaskDelete) XXX_DiscardUnknown() { var xxx_messageInfo_UserTaskDelete proto.InternalMessageInfo +// ContactCreate is emitted when a contact is created. +type ContactCreate struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // Status indicates whether the creation was successful. + Status `protobuf:"bytes,5,opt,name=Status,proto3,embedded=Status" json:""` + // Email is the Email of the contact being deleted + Email string `protobuf:"bytes,6,opt,name=Email,proto3" json:"email"` + // ContactType is the type of the contact being deleted ('Business' or 'Security') + ContactType ContactType `protobuf:"varint,7,opt,name=ContactType,proto3,enum=events.ContactType" json:"contact_type"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ContactCreate) Reset() { *m = ContactCreate{} } +func (m *ContactCreate) String() string { return proto.CompactTextString(m) } +func (*ContactCreate) ProtoMessage() {} +func (*ContactCreate) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{234} +} +func (m *ContactCreate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContactCreate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ContactCreate.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ContactCreate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContactCreate.Merge(m, src) +} +func (m *ContactCreate) XXX_Size() int { + return m.Size() +} +func (m *ContactCreate) XXX_DiscardUnknown() { + xxx_messageInfo_ContactCreate.DiscardUnknown(m) +} + +var xxx_messageInfo_ContactCreate proto.InternalMessageInfo + +// ContactDelete is emitted when a contact is deleted. +type ContactDelete struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // Status indicates whether the deletion was successful. + Status `protobuf:"bytes,5,opt,name=Status,proto3,embedded=Status" json:""` + // Email is the Email of the contact being deleted + Email string `protobuf:"bytes,6,opt,name=Email,proto3" json:"email"` + // ContactType is the type of the contact being deleted ('Business' or 'Security') + ContactType ContactType `protobuf:"varint,7,opt,name=ContactType,proto3,enum=events.ContactType" json:"contact_type"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ContactDelete) Reset() { *m = ContactDelete{} } +func (m *ContactDelete) String() string { return proto.CompactTextString(m) } +func (*ContactDelete) ProtoMessage() {} +func (*ContactDelete) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{235} +} +func (m *ContactDelete) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContactDelete) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ContactDelete.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ContactDelete) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContactDelete.Merge(m, src) +} +func (m *ContactDelete) XXX_Size() int { + return m.Size() +} +func (m *ContactDelete) XXX_DiscardUnknown() { + xxx_messageInfo_ContactDelete.DiscardUnknown(m) +} + +var xxx_messageInfo_ContactDelete proto.InternalMessageInfo + func init() { proto.RegisterEnum("events.UserKind", UserKind_name, UserKind_value) proto.RegisterEnum("events.EventAction", EventAction_name, EventAction_value) @@ -14928,6 +15097,7 @@ func init() { proto.RegisterEnum("events.ElasticsearchCategory", ElasticsearchCategory_name, ElasticsearchCategory_value) proto.RegisterEnum("events.OpenSearchCategory", OpenSearchCategory_name, OpenSearchCategory_value) proto.RegisterEnum("events.AdminActionsMFAStatus", AdminActionsMFAStatus_name, AdminActionsMFAStatus_value) + proto.RegisterEnum("events.ContactType", ContactType_name, ContactType_value) proto.RegisterEnum("events.SessionNetwork_NetworkOperation", SessionNetwork_NetworkOperation_name, SessionNetwork_NetworkOperation_value) proto.RegisterType((*Metadata)(nil), "events.Metadata") proto.RegisterType((*SessionMetadata)(nil), "events.SessionMetadata") @@ -15177,6 +15347,8 @@ func init() { proto.RegisterType((*UserTaskUpdate)(nil), "events.UserTaskUpdate") proto.RegisterType((*UserTaskMetadata)(nil), "events.UserTaskMetadata") proto.RegisterType((*UserTaskDelete)(nil), "events.UserTaskDelete") + proto.RegisterType((*ContactCreate)(nil), "events.ContactCreate") + proto.RegisterType((*ContactDelete)(nil), "events.ContactDelete") } func init() { @@ -15184,1066 +15356,1077 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 16942 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x5b, 0x74, 0x24, 0x49, - 0x76, 0x18, 0x86, 0x7a, 0xa0, 0x00, 0x5c, 0x3c, 0x1a, 0x1d, 0xfd, 0xca, 0xee, 0xe9, 0x69, 0xcc, - 0xe4, 0xec, 0xf6, 0x76, 0xcf, 0xce, 0xa0, 0x77, 0x7a, 0x7a, 0x66, 0x76, 0x5e, 0x3b, 0x5b, 0x40, - 0x01, 0x8d, 0xea, 0xc6, 0x6b, 0xb2, 0xd0, 0xdd, 0x3b, 0xbb, 0xdc, 0x2d, 0x26, 0x2a, 0x03, 0x85, - 0x9c, 0xae, 0xca, 0x2c, 0x66, 0x66, 0x35, 0x1a, 0xe3, 0x17, 0x97, 0xa6, 0x28, 0x52, 0x5c, 0xae, - 0xd6, 0x4b, 0x53, 0xa4, 0x1e, 0xb6, 0x96, 0x7a, 0xd8, 0x14, 0x45, 0x71, 0x4d, 0x89, 0x26, 0xb9, - 0x24, 0xd7, 0x92, 0x4c, 0x3f, 0x56, 0xe4, 0x31, 0x0f, 0x29, 0xdb, 0x3a, 0x3a, 0xb6, 0x8c, 0x95, - 0x69, 0xeb, 0x07, 0xc7, 0x3e, 0x87, 0xc7, 0xe6, 0xb1, 0xd6, 0xb2, 0xec, 0xe3, 0x13, 0x37, 0x22, - 0x33, 0x23, 0x5f, 0x85, 0xe7, 0x10, 0x83, 0x6d, 0xfc, 0x74, 0xa3, 0xee, 0xbd, 0x71, 0x23, 0xf2, - 0xc6, 0x8d, 0x88, 0x1b, 0x11, 0x37, 0xee, 0x85, 0xeb, 0x1e, 0x6d, 0xd1, 0x8e, 0xed, 0x78, 0x37, - 0x5a, 0xb4, 0xa9, 0x37, 0x36, 0x6f, 0x78, 0x9b, 0x1d, 0xea, 0xde, 0xa0, 0x8f, 0xa8, 0xe5, 0xf9, - 0xff, 0x4d, 0x76, 0x1c, 0xdb, 0xb3, 0x49, 0x89, 0xff, 0xba, 0x74, 0xb6, 0x69, 0x37, 0x6d, 0x04, - 0xdd, 0x60, 0x7f, 0x71, 0xec, 0xa5, 0xcb, 0x4d, 0xdb, 0x6e, 0xb6, 0xe8, 0x0d, 0xfc, 0xb5, 0xda, - 0x5d, 0xbb, 0xe1, 0x7a, 0x4e, 0xb7, 0xe1, 0x09, 0xec, 0x44, 0x1c, 0xeb, 0x99, 0x6d, 0xea, 0x7a, - 0x7a, 0xbb, 0x23, 0x08, 0xae, 0xc4, 0x09, 0x36, 0x1c, 0xbd, 0xd3, 0xa1, 0x8e, 0xa8, 0xfc, 0xd2, - 0x27, 0x82, 0x76, 0xea, 0x8d, 0x06, 0x75, 0xdd, 0x96, 0xe9, 0x7a, 0x37, 0x1e, 0xbd, 0x24, 0xfd, - 0x12, 0x84, 0xcf, 0xa6, 0x7f, 0x10, 0xfe, 0x2b, 0x48, 0x5e, 0x4c, 0x27, 0xf1, 0x6b, 0x8c, 0x55, - 0xad, 0x7e, 0x3d, 0x0f, 0x83, 0x0b, 0xd4, 0xd3, 0x0d, 0xdd, 0xd3, 0xc9, 0x65, 0xe8, 0xaf, 0x5a, - 0x06, 0x7d, 0xac, 0xe4, 0x9e, 0xc9, 0x5d, 0x2b, 0x4c, 0x95, 0xb6, 0xb7, 0x26, 0xf2, 0xd4, 0xd4, - 0x38, 0x90, 0x3c, 0x0d, 0xc5, 0x95, 0xcd, 0x0e, 0x55, 0xf2, 0xcf, 0xe4, 0xae, 0x0d, 0x4d, 0x0d, - 0x6d, 0x6f, 0x4d, 0xf4, 0xa3, 0xd0, 0x34, 0x04, 0x93, 0x67, 0x21, 0x5f, 0xad, 0x28, 0x05, 0x44, - 0x9e, 0xde, 0xde, 0x9a, 0x18, 0xed, 0x9a, 0xc6, 0x0b, 0x76, 0xdb, 0xf4, 0x68, 0xbb, 0xe3, 0x6d, - 0x6a, 0xf9, 0x6a, 0x85, 0x5c, 0x85, 0xe2, 0xb4, 0x6d, 0x50, 0xa5, 0x88, 0x44, 0x64, 0x7b, 0x6b, - 0x62, 0xac, 0x61, 0x1b, 0x54, 0xa2, 0x42, 0x3c, 0xf9, 0x2c, 0x14, 0x57, 0xcc, 0x36, 0x55, 0xfa, - 0x9f, 0xc9, 0x5d, 0x1b, 0xbe, 0x79, 0x69, 0x92, 0x8b, 0x6f, 0xd2, 0x17, 0xdf, 0xe4, 0x8a, 0x2f, - 0xdf, 0xa9, 0xf1, 0xef, 0x6c, 0x4d, 0xf4, 0x6d, 0x6f, 0x4d, 0x14, 0x99, 0xc8, 0xbf, 0xf6, 0xdd, - 0x89, 0x9c, 0x86, 0x25, 0xc9, 0x5b, 0x30, 0x3c, 0xdd, 0xea, 0xba, 0x1e, 0x75, 0x16, 0xf5, 0x36, - 0x55, 0x4a, 0x58, 0xe1, 0xa5, 0xed, 0xad, 0x89, 0xf3, 0x0d, 0x0e, 0xae, 0x5b, 0x7a, 0x5b, 0xae, - 0x58, 0x26, 0x57, 0x7f, 0x23, 0x07, 0xa7, 0x6a, 0xd4, 0x75, 0x4d, 0xdb, 0x0a, 0x64, 0xf3, 0x71, - 0x18, 0x12, 0xa0, 0x6a, 0x05, 0xe5, 0x33, 0x34, 0x35, 0xb0, 0xbd, 0x35, 0x51, 0x70, 0x4d, 0x43, - 0x0b, 0x31, 0xe4, 0x53, 0x30, 0xf0, 0xc0, 0xf4, 0xd6, 0x17, 0x66, 0xcb, 0x42, 0x4e, 0xe7, 0xb7, - 0xb7, 0x26, 0xc8, 0x86, 0xe9, 0xad, 0xd7, 0xdb, 0x6b, 0xba, 0x54, 0xa1, 0x4f, 0x46, 0xe6, 0x61, - 0x7c, 0xd9, 0x31, 0x1f, 0xe9, 0x1e, 0xbd, 0x4b, 0x37, 0x97, 0xed, 0x96, 0xd9, 0xd8, 0x14, 0x52, - 0x7c, 0x66, 0x7b, 0x6b, 0xe2, 0x72, 0x87, 0xe3, 0xea, 0x0f, 0xe9, 0x66, 0xbd, 0x83, 0x58, 0x89, - 0x49, 0xa2, 0xa4, 0xfa, 0x9b, 0x25, 0x18, 0xb9, 0xe7, 0x52, 0x27, 0x68, 0xf7, 0x55, 0x28, 0xb2, - 0xdf, 0xa2, 0xc9, 0x28, 0xf3, 0xae, 0x4b, 0x1d, 0x59, 0xe6, 0x0c, 0x4f, 0xae, 0x43, 0xff, 0xbc, - 0xdd, 0x34, 0x2d, 0xd1, 0xec, 0x33, 0xdb, 0x5b, 0x13, 0xa7, 0x5a, 0x0c, 0x20, 0x51, 0x72, 0x0a, - 0xf2, 0x19, 0x18, 0xa9, 0xb6, 0x99, 0x0e, 0xd9, 0x96, 0xee, 0xd9, 0x8e, 0x68, 0x2d, 0x4a, 0xd7, - 0x94, 0xe0, 0x52, 0xc1, 0x08, 0x3d, 0x79, 0x03, 0xa0, 0xfc, 0xa0, 0xa6, 0xd9, 0x2d, 0x5a, 0xd6, - 0x16, 0x85, 0x32, 0x60, 0x69, 0x7d, 0xc3, 0xad, 0x3b, 0x76, 0x8b, 0xd6, 0x75, 0x47, 0xae, 0x56, - 0xa2, 0x26, 0x33, 0x30, 0x56, 0xc6, 0x51, 0xa1, 0xd1, 0x1f, 0xea, 0x52, 0xd7, 0x73, 0x95, 0xfe, - 0x67, 0x0a, 0xd7, 0x86, 0xa6, 0x9e, 0xde, 0xde, 0x9a, 0xb8, 0xc8, 0xc7, 0x4b, 0xdd, 0x11, 0x28, - 0x89, 0x45, 0xac, 0x10, 0x99, 0x82, 0xd1, 0xf2, 0x07, 0x5d, 0x87, 0x56, 0x0d, 0x6a, 0x79, 0xa6, - 0xb7, 0x29, 0x34, 0xe4, 0xf2, 0xf6, 0xd6, 0x84, 0xa2, 0x33, 0x44, 0xdd, 0x14, 0x18, 0x89, 0x49, - 0xb4, 0x08, 0x59, 0x82, 0xd3, 0xb7, 0xa7, 0x97, 0x6b, 0xd4, 0x79, 0x64, 0x36, 0x68, 0xb9, 0xd1, - 0xb0, 0xbb, 0x96, 0xa7, 0x0c, 0x20, 0x9f, 0x67, 0xb7, 0xb7, 0x26, 0x9e, 0x6e, 0x36, 0x3a, 0x75, - 0x97, 0x63, 0xeb, 0x3a, 0x47, 0x4b, 0xcc, 0x92, 0x65, 0xc9, 0xe7, 0x61, 0x74, 0xc5, 0x61, 0x5a, - 0x68, 0x54, 0x28, 0x83, 0x2b, 0x83, 0xa8, 0xff, 0xe7, 0x27, 0xc5, 0x4c, 0xc5, 0xa1, 0x7e, 0xcf, - 0xf2, 0xc6, 0x7a, 0xbc, 0x40, 0xdd, 0x40, 0x9c, 0xdc, 0xd8, 0x08, 0x2b, 0x42, 0x41, 0x61, 0x1f, - 0x6f, 0x3a, 0xd4, 0x48, 0x68, 0xdb, 0x10, 0xb6, 0xf9, 0xfa, 0xf6, 0xd6, 0xc4, 0xc7, 0x1d, 0x41, - 0x53, 0xef, 0xa9, 0x76, 0x99, 0xac, 0xc8, 0x0c, 0x0c, 0x32, 0x6d, 0xba, 0x6b, 0x5a, 0x86, 0x02, - 0xcf, 0xe4, 0xae, 0x8d, 0xdd, 0x1c, 0xf7, 0x5b, 0xef, 0xc3, 0xa7, 0x2e, 0x6c, 0x6f, 0x4d, 0x9c, - 0x61, 0x3a, 0x58, 0x7f, 0x68, 0x5a, 0xf2, 0x14, 0x11, 0x14, 0x65, 0xa3, 0x68, 0xca, 0xf6, 0x70, - 0xe8, 0x0e, 0x87, 0xa3, 0x68, 0xd5, 0xf6, 0xe2, 0xc3, 0xd6, 0x27, 0x23, 0xd3, 0x30, 0x3a, 0x65, - 0x7b, 0x55, 0xcb, 0xf5, 0x74, 0xab, 0x41, 0xab, 0x15, 0x65, 0x04, 0xcb, 0xa1, 0x5a, 0xb0, 0x72, - 0xa6, 0xc0, 0xd4, 0x23, 0x93, 0x52, 0xb4, 0x8c, 0xfa, 0x2f, 0x8b, 0x30, 0xc6, 0xfa, 0x44, 0x1a, - 0x3e, 0x65, 0x36, 0x13, 0x30, 0x08, 0xab, 0xc5, 0xed, 0xe8, 0x0d, 0x2a, 0x46, 0x12, 0x7e, 0x85, - 0xe5, 0x03, 0x25, 0x9e, 0x71, 0x7a, 0x72, 0x1d, 0x06, 0x39, 0xa8, 0x5a, 0x11, 0x83, 0x6b, 0x74, - 0x7b, 0x6b, 0x62, 0xc8, 0x45, 0x58, 0xdd, 0x34, 0xb4, 0x00, 0xcd, 0xb4, 0x9b, 0xff, 0x3d, 0x67, - 0xbb, 0x1e, 0x63, 0x2e, 0xc6, 0x16, 0x7e, 0x86, 0x28, 0xb0, 0x2e, 0x50, 0xb2, 0x76, 0x47, 0x0b, - 0x91, 0xd7, 0x01, 0x38, 0xa4, 0x6c, 0x18, 0x8e, 0x18, 0x60, 0x17, 0xb7, 0xb7, 0x26, 0xce, 0x09, - 0x16, 0xba, 0x61, 0xc8, 0xa3, 0x53, 0x22, 0x26, 0x6d, 0x18, 0xe1, 0xbf, 0xe6, 0xf5, 0x55, 0xda, - 0xe2, 0xa3, 0x6b, 0xf8, 0xe6, 0x35, 0xbf, 0x13, 0xa3, 0xd2, 0x99, 0x94, 0x49, 0x67, 0x2c, 0xcf, - 0xd9, 0x9c, 0x9a, 0x10, 0x13, 0xf2, 0x05, 0x51, 0x55, 0x0b, 0x71, 0xf2, 0x54, 0x20, 0x97, 0x61, - 0xf3, 0xf4, 0xac, 0xed, 0x6c, 0xe8, 0x8e, 0x41, 0x8d, 0xa9, 0x4d, 0x79, 0x9e, 0x5e, 0xf3, 0xc1, - 0xf5, 0x55, 0x59, 0xf5, 0x64, 0x72, 0xd6, 0xe9, 0x9c, 0x5b, 0xad, 0xbb, 0x8a, 0x2a, 0x37, 0x90, - 0x90, 0x96, 0xdb, 0x5d, 0x8d, 0xab, 0x59, 0xb4, 0x0c, 0x9b, 0x0a, 0x38, 0xe0, 0x3e, 0x75, 0xd8, - 0x24, 0x8e, 0xa3, 0x4e, 0x4c, 0x05, 0x82, 0xc9, 0x23, 0x8e, 0x49, 0xf2, 0x10, 0x45, 0x2e, 0xbd, - 0x03, 0xa7, 0x13, 0xa2, 0x20, 0xe3, 0x50, 0x78, 0x48, 0x37, 0xb9, 0xba, 0x68, 0xec, 0x4f, 0x72, - 0x16, 0xfa, 0x1f, 0xe9, 0xad, 0xae, 0x58, 0x42, 0x35, 0xfe, 0xe3, 0x8d, 0xfc, 0xa7, 0x73, 0x6c, - 0xc5, 0x21, 0xd3, 0xb6, 0x65, 0xd1, 0x86, 0x27, 0x2f, 0x3a, 0xaf, 0xc2, 0xd0, 0xbc, 0xdd, 0xd0, - 0x5b, 0xd8, 0x8f, 0x5c, 0xef, 0x94, 0xed, 0xad, 0x89, 0xb3, 0xac, 0x03, 0x27, 0x5b, 0x0c, 0x23, - 0xb5, 0x29, 0x24, 0x65, 0x0a, 0xa0, 0xd1, 0xb6, 0xed, 0x51, 0x2c, 0x98, 0x0f, 0x15, 0x00, 0x0b, - 0x3a, 0x88, 0x92, 0x15, 0x20, 0x24, 0x26, 0x37, 0x60, 0x70, 0x99, 0xad, 0xb3, 0x0d, 0xbb, 0x25, - 0x94, 0x0f, 0x97, 0x02, 0x5c, 0x7b, 0xe5, 0xb1, 0xea, 0x13, 0xa9, 0x73, 0x30, 0x36, 0xdd, 0x32, - 0xa9, 0xe5, 0xc9, 0xad, 0x66, 0x23, 0xb9, 0xdc, 0xa4, 0x96, 0x27, 0xb7, 0x1a, 0xc7, 0xbc, 0xce, - 0xa0, 0x72, 0xab, 0x03, 0x52, 0xf5, 0xf7, 0x0b, 0x70, 0xf1, 0x6e, 0x77, 0x95, 0x3a, 0x16, 0xf5, - 0xa8, 0x2b, 0x16, 0xe4, 0x80, 0xeb, 0x22, 0x9c, 0x4e, 0x20, 0x05, 0x77, 0x5c, 0x28, 0x1f, 0x06, - 0xc8, 0xba, 0x58, 0xe3, 0xe5, 0xd9, 0x36, 0x51, 0x94, 0xcc, 0xc1, 0xa9, 0x10, 0xc8, 0x1a, 0xe1, - 0x2a, 0x79, 0x5c, 0x4a, 0xae, 0x6c, 0x6f, 0x4d, 0x5c, 0x92, 0xb8, 0xb1, 0x66, 0xcb, 0x1a, 0x1c, - 0x2f, 0x46, 0xee, 0xc2, 0x78, 0x08, 0xba, 0xed, 0xd8, 0xdd, 0x8e, 0xab, 0x14, 0x90, 0xd5, 0xc4, - 0xf6, 0xd6, 0xc4, 0x53, 0x12, 0xab, 0x26, 0x22, 0xe5, 0x05, 0x3c, 0x5e, 0x90, 0xfc, 0x68, 0x4e, - 0xe6, 0x26, 0x46, 0x61, 0x11, 0x47, 0xe1, 0x6b, 0xfe, 0x28, 0xcc, 0x14, 0xd2, 0x64, 0xbc, 0xa4, - 0x18, 0x94, 0xb1, 0x66, 0x24, 0x06, 0x65, 0xa2, 0xc6, 0x4b, 0xd3, 0x70, 0x2e, 0x95, 0xd7, 0x9e, - 0xb4, 0xfa, 0x5f, 0x14, 0x64, 0x2e, 0xcb, 0xb6, 0x11, 0x74, 0xe6, 0x92, 0xdc, 0x99, 0xcb, 0xb6, - 0x81, 0x53, 0x7d, 0x2e, 0x5c, 0x3b, 0xa5, 0xc6, 0x76, 0x6c, 0x23, 0x3e, 0xeb, 0x27, 0xcb, 0x92, - 0x2f, 0xc1, 0xf9, 0x04, 0x90, 0x4f, 0xd7, 0x5c, 0xfb, 0xaf, 0x6e, 0x6f, 0x4d, 0xa8, 0x29, 0x5c, - 0xe3, 0xb3, 0x77, 0x06, 0x17, 0xa2, 0xc3, 0x05, 0x49, 0xea, 0xb6, 0xe5, 0xe9, 0xa6, 0x25, 0x8c, - 0x4b, 0x3e, 0x4a, 0x3e, 0xb1, 0xbd, 0x35, 0xf1, 0x9c, 0xac, 0x83, 0x3e, 0x4d, 0xbc, 0xf1, 0x59, - 0x7c, 0x88, 0x01, 0x4a, 0x0a, 0xaa, 0xda, 0xd6, 0x9b, 0xbe, 0xc5, 0x7c, 0x6d, 0x7b, 0x6b, 0xe2, - 0x63, 0xa9, 0x75, 0x98, 0x8c, 0x4a, 0x5e, 0xa1, 0xb3, 0x38, 0x11, 0x0d, 0x48, 0x88, 0x5b, 0xb4, - 0x0d, 0x8a, 0xdf, 0xd0, 0x8f, 0xfc, 0xd5, 0xed, 0xad, 0x89, 0x2b, 0x12, 0x7f, 0xcb, 0x36, 0x68, - 0xbc, 0xf9, 0x29, 0xa5, 0xd5, 0xdf, 0x28, 0xc0, 0x95, 0x5a, 0x79, 0x61, 0xbe, 0x6a, 0xf8, 0x26, - 0xcd, 0xb2, 0x63, 0x3f, 0x32, 0x0d, 0x69, 0xf4, 0xae, 0xc2, 0x85, 0x18, 0x6a, 0x06, 0xad, 0xa8, - 0xc0, 0x98, 0xc6, 0x6f, 0xf3, 0xcd, 0xa5, 0x8e, 0xa0, 0xa9, 0x73, 0x53, 0x2b, 0xba, 0x68, 0x67, - 0x31, 0x62, 0x7d, 0x14, 0x43, 0xd5, 0xd6, 0x6d, 0xc7, 0x6b, 0x74, 0x3d, 0xa1, 0x04, 0xd8, 0x47, - 0x89, 0x3a, 0x5c, 0x41, 0xd4, 0xa3, 0x0a, 0x9f, 0x0f, 0xf9, 0x89, 0x1c, 0x8c, 0x97, 0x3d, 0xcf, - 0x31, 0x57, 0xbb, 0x1e, 0x5d, 0xd0, 0x3b, 0x1d, 0xd3, 0x6a, 0xe2, 0x58, 0x1f, 0xbe, 0xf9, 0x56, - 0xb0, 0x46, 0xf6, 0x94, 0xc4, 0x64, 0xbc, 0xb8, 0x34, 0x44, 0x75, 0x1f, 0x55, 0x6f, 0x73, 0x9c, - 0x3c, 0x44, 0xe3, 0xe5, 0xd8, 0x10, 0x4d, 0xe5, 0xb5, 0xa7, 0x21, 0xfa, 0xf5, 0x02, 0x5c, 0x5e, - 0x7a, 0xe8, 0xe9, 0x1a, 0x75, 0xed, 0xae, 0xd3, 0xa0, 0xee, 0xbd, 0x8e, 0xa1, 0x7b, 0x34, 0x1c, - 0xa9, 0x13, 0xd0, 0x5f, 0x36, 0x0c, 0x6a, 0x20, 0xbb, 0x7e, 0xbe, 0xed, 0xd3, 0x19, 0x40, 0xe3, - 0x70, 0xf2, 0x71, 0x18, 0x10, 0x65, 0x90, 0x7b, 0xff, 0xd4, 0xf0, 0xf6, 0xd6, 0xc4, 0x40, 0x97, - 0x83, 0x34, 0x1f, 0xc7, 0xc8, 0x2a, 0xb4, 0x45, 0x19, 0x59, 0x21, 0x24, 0x33, 0x38, 0x48, 0xf3, - 0x71, 0xe4, 0x5d, 0x18, 0x43, 0xb6, 0x41, 0x7b, 0xc4, 0xdc, 0x77, 0xd6, 0x97, 0xae, 0xdc, 0x58, - 0xbe, 0x34, 0x61, 0x6b, 0xea, 0x8e, 0x5f, 0x40, 0x8b, 0x31, 0x20, 0x0f, 0x60, 0x5c, 0x34, 0x22, - 0x64, 0xda, 0xdf, 0x83, 0xe9, 0xb9, 0xed, 0xad, 0x89, 0xd3, 0xa2, 0xfd, 0x12, 0xdb, 0x04, 0x13, - 0xc6, 0x58, 0x34, 0x3b, 0x64, 0x5c, 0xda, 0x89, 0xb1, 0xf8, 0x62, 0x99, 0x71, 0x9c, 0x89, 0xfa, - 0x1e, 0x8c, 0xc8, 0x05, 0xc9, 0x79, 0xdc, 0x5a, 0xf3, 0x71, 0x82, 0x9b, 0x72, 0xd3, 0xc0, 0xfd, - 0xf4, 0x4b, 0x30, 0x5c, 0xa1, 0x6e, 0xc3, 0x31, 0x3b, 0xcc, 0x6a, 0x10, 0x4a, 0x7e, 0x6a, 0x7b, - 0x6b, 0x62, 0xd8, 0x08, 0xc1, 0x9a, 0x4c, 0xa3, 0xfe, 0x5f, 0x39, 0x38, 0xcf, 0x78, 0x97, 0x5d, - 0xd7, 0x6c, 0x5a, 0x6d, 0x79, 0xd9, 0x7e, 0x01, 0x4a, 0x35, 0xac, 0x4f, 0xd4, 0x74, 0x76, 0x7b, - 0x6b, 0x62, 0x9c, 0xb7, 0x40, 0xd2, 0x43, 0x41, 0x13, 0xec, 0x2b, 0xf3, 0x3b, 0xec, 0x2b, 0x99, - 0x49, 0xeb, 0xe9, 0x8e, 0x67, 0x5a, 0xcd, 0x9a, 0xa7, 0x7b, 0x5d, 0x37, 0x62, 0xd2, 0x0a, 0x4c, - 0xdd, 0x45, 0x54, 0xc4, 0xa4, 0x8d, 0x14, 0x22, 0xef, 0xc0, 0xc8, 0x8c, 0x65, 0x84, 0x4c, 0xf8, - 0x84, 0xf8, 0x14, 0xb3, 0x34, 0x29, 0xc2, 0x93, 0x2c, 0x22, 0x05, 0xd4, 0xbf, 0x93, 0x03, 0x85, - 0x6f, 0x02, 0xe7, 0x4d, 0xd7, 0x5b, 0xa0, 0xed, 0x55, 0x69, 0x76, 0x9a, 0xf5, 0x77, 0x95, 0x0c, - 0x27, 0xad, 0x45, 0x68, 0x0a, 0x88, 0x5d, 0x65, 0xcb, 0x74, 0x13, 0xdb, 0x8f, 0x58, 0x29, 0x52, - 0x85, 0x01, 0xce, 0x99, 0xdb, 0x12, 0xc3, 0x37, 0x15, 0x5f, 0x11, 0xe2, 0x55, 0x73, 0x65, 0x68, - 0x73, 0x62, 0x79, 0x43, 0x23, 0xca, 0xab, 0xdf, 0x28, 0xc0, 0x78, 0xbc, 0x10, 0x79, 0x00, 0x83, - 0x77, 0x6c, 0xd3, 0xa2, 0xc6, 0x92, 0x85, 0x2d, 0xec, 0x7d, 0x38, 0xe2, 0xdb, 0xe2, 0x67, 0xde, - 0xc7, 0x32, 0x75, 0xd9, 0x82, 0xc5, 0xb3, 0x92, 0x80, 0x19, 0xf9, 0x3c, 0x0c, 0x31, 0x1b, 0xf0, - 0x11, 0x72, 0xce, 0xef, 0xc8, 0xf9, 0x19, 0xc1, 0xf9, 0xac, 0xc3, 0x0b, 0x25, 0x59, 0x87, 0xec, - 0x98, 0x5e, 0x69, 0x54, 0x77, 0x6d, 0x4b, 0xf4, 0x3c, 0xea, 0x95, 0x83, 0x10, 0x59, 0xaf, 0x38, - 0x0d, 0x33, 0x5d, 0xf9, 0xc7, 0x62, 0x37, 0x48, 0x7b, 0x17, 0x2e, 0xab, 0x78, 0x0f, 0x48, 0xc4, - 0xc4, 0x82, 0x53, 0x42, 0xa0, 0xeb, 0x66, 0x07, 0xad, 0x7e, 0x5c, 0xd7, 0xc6, 0x6e, 0x5e, 0x9d, - 0xf4, 0x0f, 0xc5, 0x26, 0xa5, 0x23, 0xb5, 0x47, 0x2f, 0x4d, 0x2e, 0x04, 0xe4, 0xb8, 0x33, 0x45, - 0x9d, 0x8c, 0xb1, 0x90, 0x7b, 0xbb, 0x1d, 0x21, 0x57, 0x7f, 0x2c, 0x0f, 0x2f, 0x86, 0x5d, 0xa4, - 0xd1, 0x47, 0x26, 0xdd, 0x08, 0x39, 0x8a, 0x3d, 0x32, 0x1b, 0x62, 0xee, 0xf4, 0xba, 0x6e, 0x35, - 0xa9, 0x41, 0xae, 0x43, 0xbf, 0x66, 0xb7, 0xa8, 0xab, 0xe4, 0xd0, 0x3c, 0xc4, 0xe9, 0xcb, 0x61, - 0x00, 0xf9, 0x90, 0x05, 0x29, 0x88, 0x0d, 0xa5, 0x15, 0x47, 0x37, 0x3d, 0x5f, 0x93, 0xca, 0x49, - 0x4d, 0xda, 0x45, 0x8d, 0x93, 0x9c, 0x07, 0x5f, 0x63, 0x50, 0xf0, 0x1e, 0x02, 0x64, 0xc1, 0x73, - 0x92, 0x4b, 0xaf, 0xc3, 0xb0, 0x44, 0xbc, 0xa7, 0x45, 0xe4, 0x5b, 0x45, 0x79, 0x6c, 0xf9, 0xcd, - 0x12, 0x63, 0xeb, 0x06, 0x1b, 0x13, 0xae, 0xcb, 0xac, 0x18, 0x3e, 0xa8, 0x84, 0xe6, 0x23, 0x28, - 0xaa, 0xf9, 0x08, 0x22, 0x2f, 0xc3, 0x20, 0x67, 0x11, 0xec, 0x97, 0x71, 0xaf, 0xed, 0x20, 0x2c, - 0x6a, 0x0a, 0x04, 0x84, 0xe4, 0x17, 0x73, 0xf0, 0x74, 0x4f, 0x49, 0xa0, 0xf2, 0x0d, 0xdf, 0x7c, - 0x65, 0x5f, 0x62, 0x9c, 0x7a, 0x71, 0x7b, 0x6b, 0xe2, 0xba, 0xa4, 0x19, 0x8e, 0x44, 0x53, 0x6f, - 0x70, 0x22, 0xa9, 0x5d, 0xbd, 0x9b, 0xc2, 0x8c, 0x55, 0x5e, 0xe9, 0x2c, 0x1e, 0x55, 0x59, 0x8d, - 0x4d, 0xbf, 0x91, 0xc5, 0xd0, 0x58, 0x15, 0xdf, 0xbb, 0xe6, 0x93, 0xa4, 0x54, 0x93, 0xc1, 0x85, - 0x34, 0xe0, 0x02, 0xc7, 0x54, 0xf4, 0xcd, 0xa5, 0xb5, 0x05, 0xdb, 0xf2, 0xd6, 0xfd, 0x0a, 0xfa, - 0xe5, 0xb3, 0x1e, 0xac, 0xc0, 0xd0, 0x37, 0xeb, 0xf6, 0x5a, 0xbd, 0xcd, 0xa8, 0x52, 0xea, 0xc8, - 0xe2, 0xc4, 0x26, 0x76, 0x31, 0xc6, 0xfd, 0x29, 0xaf, 0x14, 0x9e, 0xc4, 0xf9, 0xf3, 0x42, 0x72, - 0x82, 0x8b, 0x15, 0x52, 0xab, 0x30, 0x32, 0x6f, 0x37, 0x1e, 0x06, 0xea, 0xf2, 0x3a, 0x94, 0x56, - 0x74, 0xa7, 0x49, 0x3d, 0x94, 0xc5, 0xf0, 0xcd, 0xd3, 0x93, 0xfc, 0x74, 0x9b, 0x11, 0x71, 0xc4, - 0xd4, 0x98, 0x98, 0x7d, 0x4a, 0x1e, 0xfe, 0xd6, 0x44, 0x01, 0xf5, 0xbb, 0xfd, 0x30, 0x22, 0x4e, - 0x62, 0x71, 0xf5, 0x20, 0x6f, 0x84, 0x67, 0xdb, 0x62, 0xba, 0x0c, 0x4e, 0xa3, 0x82, 0x53, 0xb4, - 0x11, 0xc6, 0xec, 0x0f, 0xb6, 0x26, 0x72, 0xdb, 0x5b, 0x13, 0x7d, 0xda, 0xa0, 0xb4, 0x89, 0x0d, - 0xd7, 0x37, 0x69, 0x41, 0x97, 0xcf, 0x56, 0x63, 0x65, 0xf9, 0x7a, 0xf7, 0x0e, 0x0c, 0x88, 0x36, - 0x08, 0x8d, 0xbb, 0x10, 0x9e, 0x9d, 0x44, 0x4e, 0x94, 0x63, 0xa5, 0xfd, 0x52, 0xe4, 0x2d, 0x28, - 0xf1, 0xb3, 0x04, 0x21, 0x80, 0xf3, 0xe9, 0x67, 0x2f, 0xb1, 0xe2, 0xa2, 0x0c, 0x99, 0x03, 0x08, - 0xcf, 0x11, 0x82, 0x03, 0x74, 0xc1, 0x21, 0x79, 0xc2, 0x10, 0xe3, 0x22, 0x95, 0x25, 0xaf, 0xc2, - 0xc8, 0x0a, 0x75, 0xda, 0xa6, 0xa5, 0xb7, 0x6a, 0xe6, 0x07, 0xfe, 0x19, 0x3a, 0x2e, 0xf4, 0xae, - 0xf9, 0x81, 0x3c, 0x72, 0x23, 0x74, 0xe4, 0x8b, 0x69, 0xfb, 0xf4, 0x01, 0x6c, 0xc8, 0xb3, 0x3b, - 0x6e, 0x60, 0x63, 0xed, 0x49, 0xd9, 0xb6, 0xbf, 0x0b, 0xa3, 0x91, 0x2d, 0x9a, 0x38, 0x24, 0x7d, - 0x3a, 0xc9, 0x5a, 0xda, 0x6f, 0xc6, 0xd8, 0x46, 0x39, 0x30, 0x4d, 0xae, 0x5a, 0xa6, 0x67, 0xea, - 0xad, 0x69, 0xbb, 0xdd, 0xd6, 0x2d, 0x43, 0x19, 0x0a, 0x35, 0xd9, 0xe4, 0x98, 0x7a, 0x83, 0xa3, - 0x64, 0x4d, 0x8e, 0x16, 0x22, 0x77, 0x61, 0x5c, 0xf4, 0xa1, 0x46, 0x1b, 0xb6, 0xc3, 0x6c, 0x0f, - 0x3c, 0x03, 0x15, 0xc7, 0x00, 0x2e, 0xc7, 0xd5, 0x1d, 0x1f, 0x29, 0x1b, 0xf7, 0xf1, 0x82, 0x77, - 0x8a, 0x83, 0xc3, 0xe3, 0x23, 0xf1, 0x63, 0x6b, 0xf5, 0x6f, 0x15, 0x60, 0x58, 0x90, 0xb2, 0xa5, - 0xfb, 0x44, 0xc1, 0x0f, 0xa2, 0xe0, 0xa9, 0x8a, 0x5a, 0x3a, 0x2c, 0x45, 0x55, 0xbf, 0x92, 0x0f, - 0x66, 0xa3, 0x65, 0xc7, 0xb4, 0x0e, 0x36, 0x1b, 0x5d, 0x05, 0x98, 0x5e, 0xef, 0x5a, 0x0f, 0xf9, - 0xf5, 0x5c, 0x3e, 0xbc, 0x9e, 0x6b, 0x98, 0x9a, 0x84, 0x21, 0x4f, 0x43, 0xb1, 0xc2, 0xf8, 0xb3, - 0x9e, 0x19, 0x99, 0x1a, 0xfa, 0x0e, 0xe7, 0x94, 0x7b, 0x51, 0x43, 0x30, 0xdb, 0xcc, 0x4d, 0x6d, - 0x7a, 0x94, 0x9b, 0xcf, 0x05, 0xbe, 0x99, 0x5b, 0x65, 0x00, 0x8d, 0xc3, 0xc9, 0x2d, 0x38, 0x5d, - 0xa1, 0x2d, 0x7d, 0x73, 0xc1, 0x6c, 0xb5, 0x4c, 0x97, 0x36, 0x6c, 0xcb, 0x70, 0x51, 0xc8, 0xa2, - 0xba, 0xb6, 0xab, 0x25, 0x09, 0x88, 0x0a, 0xa5, 0xa5, 0xb5, 0x35, 0x97, 0x7a, 0x28, 0xbe, 0xc2, - 0x14, 0xb0, 0xc9, 0xd9, 0x46, 0x88, 0x26, 0x30, 0xea, 0x37, 0x73, 0x6c, 0xb7, 0xe4, 0x3e, 0xf4, - 0xec, 0x4e, 0xa0, 0xe5, 0x07, 0x12, 0xc9, 0xf5, 0xd0, 0xae, 0xc8, 0xe3, 0xd7, 0x9e, 0x12, 0x5f, - 0x3b, 0x20, 0x6c, 0x8b, 0xd0, 0xa2, 0x48, 0xfd, 0xaa, 0xc2, 0x0e, 0x5f, 0xa5, 0xfe, 0x71, 0x1e, - 0x2e, 0x88, 0x16, 0x4f, 0xb7, 0xcc, 0xce, 0xaa, 0xad, 0x3b, 0x86, 0x46, 0x1b, 0xd4, 0x7c, 0x44, - 0x8f, 0xe7, 0xc0, 0x8b, 0x0e, 0x9d, 0xe2, 0x01, 0x86, 0xce, 0x4d, 0xdc, 0x78, 0x32, 0xc9, 0xe0, - 0x01, 0x33, 0x37, 0x2a, 0xc6, 0xb7, 0xb7, 0x26, 0x46, 0x0c, 0x0e, 0xc6, 0x2b, 0x06, 0x4d, 0x26, - 0x62, 0x4a, 0x32, 0x4f, 0xad, 0xa6, 0xb7, 0x8e, 0x4a, 0xd2, 0xcf, 0x95, 0xa4, 0x85, 0x10, 0x4d, - 0x60, 0xd4, 0xff, 0x3d, 0x0f, 0x67, 0xe3, 0x22, 0xaf, 0x51, 0xcb, 0x38, 0x91, 0xf7, 0x87, 0x23, - 0xef, 0x3f, 0x29, 0xc0, 0x53, 0xa2, 0x4c, 0x6d, 0x5d, 0x77, 0xa8, 0x51, 0x31, 0x1d, 0xda, 0xf0, - 0x6c, 0x67, 0xf3, 0x18, 0x1b, 0x50, 0x87, 0x27, 0xf6, 0x5b, 0x50, 0x12, 0xc7, 0x0d, 0x7c, 0x9d, - 0x19, 0x0b, 0x5a, 0x82, 0xd0, 0xc4, 0x0a, 0xc5, 0x8f, 0x2a, 0x62, 0x9d, 0x55, 0xda, 0x4d, 0x67, - 0x7d, 0x1a, 0x46, 0x03, 0xd1, 0xe3, 0xc6, 0x77, 0x20, 0xb4, 0xb6, 0x0c, 0x1f, 0x81, 0x7b, 0x5f, - 0x2d, 0x4a, 0x88, 0xb5, 0xf9, 0x80, 0x6a, 0x05, 0xad, 0xa1, 0x51, 0x51, 0x5b, 0x50, 0xce, 0x34, - 0x34, 0x99, 0x48, 0xdd, 0x2a, 0xc2, 0xa5, 0xf4, 0x6e, 0xd7, 0xa8, 0x6e, 0x9c, 0xf4, 0xfa, 0xf7, - 0x65, 0xaf, 0x93, 0x67, 0xa1, 0xb8, 0xac, 0x7b, 0xeb, 0xe2, 0xba, 0x1f, 0xef, 0xa0, 0xd7, 0xcc, - 0x16, 0xad, 0x77, 0x74, 0x6f, 0x5d, 0x43, 0x94, 0x34, 0x67, 0x00, 0x72, 0x4c, 0x99, 0x33, 0xa4, - 0xc5, 0x7e, 0xf8, 0x99, 0xdc, 0xb5, 0x62, 0xea, 0x62, 0xff, 0xdd, 0x62, 0xd6, 0xbc, 0xf2, 0xc0, - 0x31, 0x3d, 0x7a, 0xa2, 0x61, 0x27, 0x1a, 0x76, 0x40, 0x0d, 0xfb, 0xc7, 0x79, 0x18, 0x0d, 0x36, - 0x4d, 0xef, 0xd3, 0xc6, 0xd1, 0xac, 0x55, 0xe1, 0x56, 0xa6, 0x70, 0xe0, 0xad, 0xcc, 0x41, 0x14, - 0x4a, 0x0d, 0x8e, 0x58, 0xb9, 0x69, 0x80, 0x12, 0xe3, 0x47, 0xac, 0xc1, 0xc1, 0xea, 0xb3, 0x30, - 0xb0, 0xa0, 0x3f, 0x36, 0xdb, 0xdd, 0xb6, 0xb0, 0xd2, 0xd1, 0x7d, 0xad, 0xad, 0x3f, 0xd6, 0x7c, - 0xb8, 0xfa, 0xdf, 0xe5, 0x60, 0x4c, 0x08, 0x55, 0x30, 0x3f, 0x90, 0x54, 0x43, 0xe9, 0xe4, 0x0f, - 0x2c, 0x9d, 0xc2, 0xfe, 0xa5, 0xa3, 0xfe, 0x95, 0x02, 0x28, 0xb3, 0x66, 0x8b, 0xae, 0x38, 0xba, - 0xe5, 0xae, 0x51, 0x47, 0x6c, 0xa7, 0x67, 0x18, 0xab, 0x03, 0x7d, 0xa0, 0x34, 0xa5, 0xe4, 0xf7, - 0x35, 0xa5, 0x7c, 0x12, 0x86, 0x44, 0x63, 0x02, 0xd7, 0x49, 0x1c, 0x35, 0x8e, 0x0f, 0xd4, 0x42, - 0x3c, 0x23, 0x2e, 0x77, 0x3a, 0x8e, 0xfd, 0x88, 0x3a, 0xfc, 0x56, 0x4c, 0x10, 0xeb, 0x3e, 0x50, - 0x0b, 0xf1, 0x12, 0x67, 0xea, 0xdb, 0x8b, 0x32, 0x67, 0xea, 0x68, 0x21, 0x9e, 0x5c, 0x83, 0xc1, - 0x79, 0xbb, 0xa1, 0xa3, 0xa0, 0xf9, 0xb4, 0x32, 0xb2, 0xbd, 0x35, 0x31, 0xd8, 0x12, 0x30, 0x2d, - 0xc0, 0x32, 0xca, 0x8a, 0xbd, 0x61, 0xb5, 0x6c, 0x9d, 0x3b, 0xdb, 0x0c, 0x72, 0x4a, 0x43, 0xc0, - 0xb4, 0x00, 0xcb, 0x28, 0x99, 0xcc, 0xd1, 0x89, 0x69, 0x30, 0xe4, 0xb9, 0x26, 0x60, 0x5a, 0x80, - 0x55, 0xbf, 0x59, 0x64, 0xda, 0xeb, 0x9a, 0x1f, 0x3c, 0xf1, 0xeb, 0x42, 0x38, 0x60, 0xfa, 0xf7, - 0x31, 0x60, 0x9e, 0x98, 0x03, 0x3b, 0xf5, 0x5f, 0x0e, 0x00, 0x08, 0xe9, 0xcf, 0x9c, 0x6c, 0x0e, - 0x0f, 0xa6, 0x35, 0x15, 0x38, 0x3d, 0x63, 0xad, 0xeb, 0x56, 0x83, 0x1a, 0xe1, 0xb1, 0x65, 0x09, - 0x87, 0x36, 0x3a, 0x5d, 0x52, 0x81, 0x0c, 0xcf, 0x2d, 0xb5, 0x64, 0x01, 0xf2, 0x12, 0x0c, 0x57, - 0x2d, 0x8f, 0x3a, 0x7a, 0xc3, 0x33, 0x1f, 0x51, 0x31, 0x35, 0xe0, 0x4d, 0xb4, 0x19, 0x82, 0x35, - 0x99, 0x86, 0xdc, 0x82, 0x91, 0x65, 0xdd, 0xf1, 0xcc, 0x86, 0xd9, 0xd1, 0x2d, 0xcf, 0x55, 0x06, - 0x71, 0x46, 0x43, 0x0b, 0xa3, 0x23, 0xc1, 0xb5, 0x08, 0x15, 0xf9, 0x22, 0x0c, 0xe1, 0xd6, 0x14, - 0xfd, 0xc3, 0x87, 0x76, 0xbc, 0xa8, 0x7c, 0x2e, 0x74, 0x47, 0xe4, 0xa7, 0xaf, 0x78, 0xe3, 0x1c, - 0xbf, 0xab, 0x0c, 0x38, 0x92, 0xcf, 0xc1, 0xc0, 0x8c, 0x65, 0x20, 0x73, 0xd8, 0x91, 0xb9, 0x2a, - 0x98, 0x9f, 0x0f, 0x99, 0xdb, 0x9d, 0x18, 0x6f, 0x9f, 0x5d, 0xfa, 0x28, 0x1b, 0xfe, 0xf0, 0x46, - 0xd9, 0xc8, 0x87, 0x70, 0x2c, 0x3e, 0x7a, 0x58, 0xc7, 0xe2, 0x63, 0xfb, 0x3c, 0x16, 0x57, 0x3f, - 0x80, 0xe1, 0xa9, 0xe5, 0xd9, 0x60, 0xf4, 0x5e, 0x84, 0xc2, 0xb2, 0xf0, 0x8c, 0x28, 0x72, 0x7b, - 0xa6, 0x63, 0x1a, 0x1a, 0x83, 0x91, 0xeb, 0x30, 0x38, 0x8d, 0xee, 0x76, 0xe2, 0x16, 0xb1, 0xc8, - 0xd7, 0xbf, 0x06, 0xc2, 0xd0, 0xeb, 0xd6, 0x47, 0x93, 0x8f, 0xc3, 0xc0, 0xb2, 0x63, 0x37, 0x1d, - 0xbd, 0x2d, 0xd6, 0x60, 0x74, 0x4d, 0xe9, 0x70, 0x90, 0xe6, 0xe3, 0xd4, 0x9f, 0xce, 0xf9, 0x66, - 0x3b, 0x2b, 0x51, 0xeb, 0xe2, 0xd1, 0x3c, 0xd6, 0x3d, 0xc8, 0x4b, 0xb8, 0x1c, 0xa4, 0xf9, 0x38, - 0x72, 0x1d, 0xfa, 0x67, 0x1c, 0xc7, 0x76, 0x64, 0x9f, 0x7a, 0xca, 0x00, 0xf2, 0x75, 0x2f, 0x52, - 0x90, 0xd7, 0x60, 0x98, 0xcf, 0x39, 0xfc, 0x44, 0xb3, 0xd0, 0xeb, 0xa6, 0x54, 0xa6, 0x54, 0x7f, - 0xa7, 0x20, 0xd9, 0x6c, 0x5c, 0xe2, 0x4f, 0xe0, 0xad, 0xc0, 0xcb, 0x50, 0x98, 0x5a, 0x9e, 0x15, - 0x13, 0xe0, 0x19, 0xbf, 0xa8, 0xa4, 0x2a, 0xb1, 0x72, 0x8c, 0x9a, 0x5c, 0x86, 0xe2, 0x32, 0x53, - 0x9f, 0x12, 0xaa, 0xc7, 0xe0, 0xf6, 0xd6, 0x44, 0xb1, 0xc3, 0xf4, 0x07, 0xa1, 0x88, 0x65, 0x9b, - 0x19, 0xbe, 0x63, 0xe2, 0xd8, 0x70, 0x1f, 0x73, 0x19, 0x8a, 0x65, 0xa7, 0xf9, 0x48, 0xcc, 0x5a, - 0x88, 0xd5, 0x9d, 0xe6, 0x23, 0x0d, 0xa1, 0xe4, 0x06, 0x80, 0x46, 0xbd, 0xae, 0x63, 0xe1, 0x73, - 0x97, 0x21, 0x3c, 0x7f, 0xc3, 0xd9, 0xd0, 0x41, 0x68, 0xbd, 0x61, 0x1b, 0x54, 0x93, 0x48, 0xd4, - 0xbf, 0x19, 0x5e, 0xec, 0x54, 0x4c, 0xf7, 0xe1, 0x49, 0x17, 0xee, 0xa1, 0x0b, 0x75, 0x71, 0xc4, - 0x99, 0xec, 0xa4, 0x09, 0xe8, 0x9f, 0x6d, 0xe9, 0x4d, 0x17, 0xfb, 0x50, 0xf8, 0xae, 0xad, 0x31, - 0x80, 0xc6, 0xe1, 0xb1, 0x7e, 0x1a, 0xdc, 0xb9, 0x9f, 0x7e, 0xb6, 0x3f, 0x18, 0x6d, 0x8b, 0xd4, - 0xdb, 0xb0, 0x9d, 0x93, 0xae, 0xda, 0x6d, 0x57, 0x5d, 0x85, 0x81, 0x9a, 0xd3, 0x90, 0x8e, 0x2e, - 0x70, 0x3f, 0xe0, 0x3a, 0x0d, 0x7e, 0x6c, 0xe1, 0x23, 0x19, 0x5d, 0xc5, 0xf5, 0x90, 0x6e, 0x20, - 0xa4, 0x33, 0x5c, 0x4f, 0xd0, 0x09, 0xa4, 0xa0, 0x5b, 0xb6, 0x1d, 0x4f, 0x74, 0x5c, 0x40, 0xd7, - 0xb1, 0x1d, 0x4f, 0xf3, 0x91, 0xe4, 0x93, 0x00, 0x2b, 0xd3, 0xcb, 0xbe, 0x73, 0xff, 0x50, 0xe8, - 0x7b, 0x28, 0xbc, 0xfa, 0x35, 0x09, 0x4d, 0x56, 0x60, 0x68, 0xa9, 0x43, 0x1d, 0xbe, 0x15, 0xe2, - 0x0f, 0x58, 0x3e, 0x11, 0x13, 0xad, 0xe8, 0xf7, 0x49, 0xf1, 0x7f, 0x40, 0xce, 0xd7, 0x17, 0xdb, - 0xff, 0xa9, 0x85, 0x8c, 0xc8, 0x6b, 0x50, 0x2a, 0x73, 0x3b, 0x6f, 0x18, 0x59, 0x06, 0x22, 0xc3, - 0x2d, 0x28, 0x47, 0xf1, 0x3d, 0xbb, 0x8e, 0x7f, 0x6b, 0x82, 0x5c, 0xbd, 0x0e, 0xe3, 0xf1, 0x6a, - 0xc8, 0x30, 0x0c, 0x4c, 0x2f, 0x2d, 0x2e, 0xce, 0x4c, 0xaf, 0x8c, 0xf7, 0x91, 0x41, 0x28, 0xd6, - 0x66, 0x16, 0x2b, 0xe3, 0x39, 0xf5, 0x97, 0xa4, 0x19, 0x84, 0xa9, 0xd6, 0xc9, 0xd5, 0xf0, 0x81, - 0xee, 0x5b, 0xc6, 0xf1, 0x3e, 0x14, 0x4f, 0x0c, 0xda, 0xa6, 0xe7, 0x51, 0x43, 0xac, 0x12, 0x78, - 0x5f, 0xe8, 0x3d, 0xd6, 0x12, 0x78, 0xf2, 0x02, 0x8c, 0x22, 0x4c, 0x5c, 0x11, 0xf2, 0xfd, 0xb1, - 0x28, 0xe0, 0x3c, 0xd6, 0xa2, 0x48, 0xf5, 0xf7, 0xc2, 0xdb, 0xe1, 0x79, 0xaa, 0x1f, 0xd7, 0x1b, - 0xc5, 0x8f, 0x48, 0x7f, 0xa9, 0xff, 0xba, 0xc8, 0x9f, 0x9c, 0xf0, 0xf7, 0x89, 0x47, 0x21, 0xca, - 0xf0, 0x48, 0xb7, 0xb0, 0x87, 0x23, 0xdd, 0x17, 0xa0, 0xb4, 0x40, 0xbd, 0x75, 0xdb, 0x77, 0xfc, - 0x42, 0x0f, 0xbd, 0x36, 0x42, 0x64, 0x0f, 0x3d, 0x4e, 0x43, 0x1e, 0x02, 0xf1, 0x1f, 0x1f, 0x06, - 0x8e, 0xdf, 0xfe, 0x11, 0xf2, 0x85, 0xc4, 0x3e, 0xa5, 0x86, 0x4f, 0x94, 0xd1, 0xa7, 0xff, 0x6c, - 0xe0, 0x58, 0x2e, 0x79, 0x62, 0xfd, 0xab, 0xad, 0x89, 0x12, 0xa7, 0xd1, 0x52, 0xd8, 0x92, 0x77, - 0x61, 0x68, 0x61, 0xb6, 0x2c, 0x1e, 0x22, 0x72, 0xaf, 0x88, 0x8b, 0x81, 0x14, 0x7d, 0x44, 0x20, - 0x12, 0x7c, 0xdf, 0xd3, 0x5e, 0xd3, 0x93, 0xef, 0x10, 0x43, 0x2e, 0x4c, 0x5b, 0xf8, 0x4b, 0x21, - 0x71, 0xba, 0x10, 0x68, 0x4b, 0xf4, 0xfd, 0x50, 0x5c, 0x56, 0x1c, 0x1b, 0xd3, 0x96, 0xc1, 0x03, - 0x8c, 0xee, 0x25, 0x38, 0x5d, 0xee, 0x74, 0x5a, 0x26, 0x35, 0x50, 0x5f, 0xb4, 0x6e, 0x8b, 0xba, - 0xc2, 0xe5, 0x07, 0x1f, 0x9f, 0xe8, 0x1c, 0x59, 0xc7, 0xe7, 0xaf, 0x75, 0xa7, 0x1b, 0xf5, 0xcf, - 0x4c, 0x96, 0x55, 0xff, 0x42, 0x1e, 0xce, 0x4f, 0x3b, 0x54, 0xf7, 0xe8, 0xc2, 0x6c, 0xb9, 0xdc, - 0x45, 0x1f, 0xb9, 0x56, 0x8b, 0x5a, 0xcd, 0xa3, 0x19, 0xd6, 0x6f, 0xc2, 0x58, 0xd0, 0x80, 0x5a, - 0xc3, 0xee, 0x50, 0xf9, 0x21, 0x57, 0xc3, 0xc7, 0xd4, 0x5d, 0x86, 0xd2, 0x62, 0xa4, 0xe4, 0x2e, - 0x9c, 0x09, 0x20, 0xe5, 0x56, 0xcb, 0xde, 0xd0, 0x68, 0xd7, 0xe5, 0x8e, 0xb8, 0x83, 0xdc, 0x11, - 0x37, 0xe4, 0xa0, 0x33, 0x7c, 0xdd, 0x61, 0x04, 0x5a, 0x5a, 0x29, 0xf5, 0x1b, 0x05, 0xb8, 0x70, - 0x5f, 0x6f, 0x99, 0x46, 0x28, 0x1a, 0x8d, 0xba, 0x1d, 0xdb, 0x72, 0xe9, 0x31, 0x1a, 0xa5, 0x91, - 0xa1, 0x50, 0x3c, 0x94, 0xa1, 0x90, 0xec, 0xa2, 0xfe, 0x03, 0x77, 0x51, 0x69, 0x5f, 0x5d, 0xf4, - 0xbf, 0xe5, 0x60, 0xdc, 0x7f, 0x68, 0x20, 0x3f, 0x1a, 0x97, 0xbc, 0xe0, 0xf1, 0x08, 0x31, 0xe6, - 0x77, 0x8d, 0x78, 0x52, 0x83, 0x81, 0x99, 0xc7, 0x1d, 0xd3, 0xa1, 0xee, 0x2e, 0x9c, 0xc6, 0x9f, - 0x16, 0xc7, 0x25, 0xa7, 0x29, 0x2f, 0x92, 0x38, 0x29, 0xe1, 0x60, 0x7c, 0x3e, 0xc8, 0x9f, 0x5a, - 0x4c, 0xf9, 0x2f, 0xe1, 0xf9, 0xf3, 0x41, 0xf1, 0x24, 0x23, 0xf2, 0x1e, 0x34, 0x24, 0x25, 0xcf, - 0x41, 0x61, 0x65, 0x65, 0x5e, 0xcc, 0xa4, 0x18, 0x81, 0xc0, 0xf3, 0xe4, 0xf7, 0x91, 0x0c, 0xab, - 0xfe, 0xb3, 0x3c, 0x00, 0x53, 0x05, 0x3e, 0x5c, 0x8f, 0x44, 0x09, 0xa7, 0x60, 0xd0, 0x17, 0xb8, - 0x50, 0xc3, 0xe0, 0x95, 0x40, 0xbc, 0x23, 0xe2, 0x75, 0x07, 0x2f, 0x42, 0x26, 0x7c, 0x47, 0x72, - 0x7e, 0x0f, 0x80, 0x3b, 0x1b, 0x74, 0x24, 0xf7, 0xdd, 0xc7, 0x3f, 0x09, 0x43, 0x62, 0xc6, 0xb3, - 0x23, 0xe7, 0xff, 0x0d, 0x1f, 0xa8, 0x85, 0xf8, 0xd8, 0xd4, 0x5a, 0x3a, 0xc0, 0x42, 0xec, 0x8b, - 0x97, 0xf7, 0xca, 0x89, 0x78, 0x0f, 0x59, 0xbc, 0x5f, 0x15, 0xe2, 0xe5, 0x2f, 0x86, 0x8e, 0xad, - 0x78, 0x0f, 0xed, 0xec, 0x5b, 0xfd, 0xc7, 0x39, 0x20, 0xac, 0x59, 0xcb, 0xba, 0xeb, 0x6e, 0xd8, - 0x8e, 0xc1, 0x9d, 0xd3, 0x8f, 0x44, 0x30, 0x87, 0x77, 0x5f, 0xf9, 0x3b, 0x83, 0x70, 0x26, 0xe2, - 0xf8, 0x7b, 0xcc, 0x27, 0xab, 0xeb, 0xd1, 0xd1, 0xd4, 0xeb, 0xd5, 0xcb, 0xc7, 0xe4, 0x0b, 0xd1, - 0xfe, 0xc8, 0x83, 0x37, 0xe9, 0x26, 0xf4, 0x45, 0x18, 0x11, 0x3f, 0xd8, 0x0a, 0xed, 0xdf, 0x74, - 0xe1, 0x28, 0x75, 0x19, 0x40, 0x8b, 0xa0, 0xc9, 0x2b, 0x30, 0xc4, 0x06, 0x4c, 0x13, 0x83, 0x95, - 0x0c, 0x84, 0x2f, 0x4a, 0x0c, 0x1f, 0x28, 0xaf, 0x27, 0x01, 0xa5, 0xf4, 0x6e, 0x69, 0x70, 0x17, - 0xef, 0x96, 0xbe, 0x04, 0xc3, 0x65, 0xcb, 0xb2, 0x3d, 0xdc, 0xa4, 0xbb, 0xe2, 0x6a, 0x22, 0xd3, - 0x2a, 0x7f, 0x0e, 0x1f, 0xe3, 0x87, 0xf4, 0xa9, 0x66, 0xb9, 0xcc, 0x90, 0xdc, 0xf4, 0x5f, 0xc5, - 0x50, 0x47, 0x78, 0x95, 0xe3, 0xf5, 0x8c, 0x23, 0x60, 0xc9, 0x47, 0x31, 0xd8, 0x79, 0xa3, 0xcb, - 0x8e, 0xdd, 0xb1, 0x5d, 0x6a, 0x70, 0x41, 0x0d, 0x87, 0xa1, 0x0d, 0x3a, 0x02, 0x81, 0xef, 0xe6, - 0x22, 0x81, 0x43, 0x22, 0x45, 0xc8, 0x1a, 0x9c, 0xf5, 0x2f, 0x8a, 0x83, 0x17, 0x8a, 0xd5, 0x8a, - 0xab, 0x8c, 0xe0, 0xab, 0x24, 0x12, 0x57, 0x86, 0x6a, 0x65, 0xea, 0x8a, 0x7f, 0x2d, 0xe2, 0x3f, - 0x71, 0xac, 0x9b, 0x86, 0xdc, 0xd5, 0xa9, 0xfc, 0xc8, 0x0f, 0xc2, 0xf0, 0x82, 0xfe, 0xb8, 0xd2, - 0x15, 0x67, 0x2f, 0xa3, 0xbb, 0xbf, 0x7d, 0x69, 0xeb, 0x8f, 0xeb, 0x86, 0x28, 0x17, 0xb3, 0x29, - 0x64, 0x96, 0xa4, 0x0e, 0xe7, 0x97, 0x1d, 0xbb, 0x6d, 0x7b, 0xd4, 0x88, 0x3d, 0xf6, 0x3b, 0x15, - 0xbe, 0x0e, 0xee, 0x08, 0x8a, 0x7a, 0x8f, 0x57, 0x7f, 0x19, 0x6c, 0x48, 0x1b, 0x4e, 0x95, 0x5d, - 0xb7, 0xdb, 0xa6, 0xe1, 0x0d, 0xd5, 0xf8, 0x8e, 0x9f, 0xf1, 0x09, 0xe1, 0xb5, 0xfc, 0x94, 0x8e, - 0x45, 0xf9, 0x05, 0x55, 0xdd, 0x33, 0xe5, 0x1a, 0xf1, 0x5b, 0xe2, 0xbc, 0xef, 0x14, 0x07, 0xc7, - 0xc6, 0x4f, 0x69, 0x17, 0x92, 0x8d, 0x59, 0x31, 0xbd, 0x16, 0x55, 0xbf, 0x9d, 0x03, 0x08, 0x05, - 0x4c, 0x5e, 0x8c, 0x46, 0x44, 0xca, 0x85, 0x17, 0x1d, 0x22, 0x5a, 0x42, 0x24, 0x04, 0x12, 0xb9, - 0x0c, 0x45, 0x8c, 0xa8, 0x91, 0x0f, 0x0f, 0x56, 0x1f, 0x9a, 0x96, 0xa1, 0x21, 0x94, 0x61, 0xa5, - 0xa7, 0xef, 0x88, 0xc5, 0x4b, 0x7d, 0x6e, 0x15, 0x56, 0xe0, 0x54, 0xad, 0xbb, 0xea, 0xd7, 0x2d, - 0xbd, 0xe3, 0xc3, 0xc0, 0x1e, 0x6e, 0x77, 0x35, 0x78, 0xfc, 0x1a, 0x09, 0x9b, 0x12, 0x2d, 0xa2, - 0x7e, 0x33, 0x17, 0x9b, 0x05, 0x8f, 0x70, 0xd1, 0xfb, 0x58, 0xd2, 0x4f, 0x23, 0x39, 0x2d, 0xa9, - 0x7f, 0x35, 0x0f, 0xc3, 0xcb, 0xb6, 0xe3, 0x89, 0x10, 0x25, 0xc7, 0x7b, 0x15, 0x92, 0xf6, 0x4a, - 0xc5, 0x3d, 0xec, 0x95, 0x2e, 0x43, 0x51, 0x72, 0x51, 0xe6, 0xf7, 0x22, 0x86, 0xe1, 0x68, 0x08, - 0x55, 0x7f, 0x38, 0x0f, 0xf0, 0xb9, 0x97, 0x5e, 0x7a, 0x82, 0x05, 0xa4, 0xfe, 0xe5, 0x1c, 0x9c, - 0x12, 0x17, 0x75, 0x52, 0x6c, 0xb1, 0x01, 0xff, 0x8a, 0x55, 0x1e, 0x97, 0x1c, 0xa4, 0xf9, 0x38, - 0xb6, 0x04, 0xcc, 0x3c, 0x36, 0x3d, 0xbc, 0xab, 0x90, 0x82, 0x8b, 0x51, 0x01, 0x93, 0x97, 0x00, - 0x9f, 0x8e, 0xbc, 0xe8, 0x5f, 0x41, 0x16, 0xc2, 0x75, 0x8f, 0x15, 0x98, 0x49, 0xbd, 0x86, 0x54, - 0x7f, 0xad, 0x08, 0xc5, 0x99, 0xc7, 0xb4, 0x71, 0xcc, 0xbb, 0x46, 0x3a, 0xd8, 0x2c, 0x1e, 0xf0, - 0x60, 0x73, 0x3f, 0x3e, 0x15, 0xef, 0x84, 0xfd, 0x59, 0x8a, 0x56, 0x1f, 0xeb, 0xf9, 0x78, 0xf5, - 0x7e, 0x4f, 0x1f, 0x3f, 0x97, 0x9c, 0xff, 0xb2, 0x00, 0x85, 0xda, 0xf4, 0xf2, 0x89, 0xde, 0x1c, - 0xa9, 0xde, 0xf4, 0xbe, 0xb3, 0x56, 0x83, 0x6b, 0xa8, 0xc1, 0xd0, 0x4b, 0x34, 0x76, 0xe3, 0xf4, - 0x27, 0x05, 0x18, 0xab, 0xcd, 0xae, 0x2c, 0x4b, 0x27, 0xc1, 0x77, 0xb9, 0x27, 0x1f, 0xfa, 0x94, - 0xf1, 0x2e, 0xbd, 0x9c, 0xb0, 0x67, 0xee, 0x55, 0x2d, 0xef, 0xd5, 0x5b, 0xf7, 0xf5, 0x56, 0x97, - 0xe2, 0xd1, 0x0b, 0xf7, 0xfb, 0x75, 0xcd, 0x0f, 0xe8, 0x37, 0x30, 0xd0, 0x80, 0xcf, 0x80, 0xbc, - 0x09, 0x85, 0x7b, 0xc2, 0x23, 0x23, 0x8b, 0xcf, 0xcb, 0x37, 0x39, 0x1f, 0x36, 0x09, 0x16, 0xba, - 0xa6, 0x81, 0x1c, 0x58, 0x29, 0x56, 0xf8, 0xb6, 0x58, 0x80, 0x77, 0x55, 0xb8, 0xe9, 0x17, 0xbe, - 0x5d, 0xad, 0x90, 0x1a, 0x0c, 0x2f, 0x53, 0xa7, 0x6d, 0x62, 0x47, 0xf9, 0x73, 0x76, 0x6f, 0x26, - 0x6c, 0xa7, 0x32, 0xdc, 0x09, 0x0b, 0x21, 0x33, 0x99, 0x0b, 0x79, 0x0f, 0x80, 0xdb, 0x28, 0xbb, - 0x8c, 0x57, 0xf9, 0x34, 0xda, 0xfd, 0xdc, 0xb4, 0x4c, 0xb1, 0xf1, 0x24, 0x66, 0xe4, 0x21, 0x8c, - 0x2f, 0xd8, 0x86, 0xb9, 0x66, 0x72, 0xd7, 0x4b, 0xac, 0xa0, 0xb4, 0xb3, 0xc3, 0x13, 0x33, 0x25, - 0xdb, 0x52, 0xb9, 0xb4, 0x6a, 0x12, 0x8c, 0xd5, 0xbf, 0xdf, 0x0f, 0x45, 0xd6, 0xed, 0x27, 0xe3, - 0xf7, 0x20, 0xe3, 0xb7, 0x0c, 0xe3, 0x0f, 0x6c, 0xe7, 0xa1, 0x69, 0x35, 0x03, 0xaf, 0x78, 0xb1, - 0x37, 0x45, 0x4f, 0x9e, 0x0d, 0x8e, 0xab, 0x07, 0x0e, 0xf4, 0x5a, 0x82, 0x7c, 0x87, 0x11, 0xfc, - 0x3a, 0x00, 0x7f, 0xeb, 0x8e, 0x34, 0x83, 0x61, 0x70, 0x0c, 0xfe, 0x12, 0x1e, 0x1d, 0xed, 0xe5, - 0xe0, 0x18, 0x21, 0x31, 0xdb, 0x84, 0x73, 0x5f, 0x88, 0x21, 0xf4, 0xbb, 0xc7, 0x4d, 0x38, 0xfa, - 0x42, 0xc8, 0x46, 0x00, 0xf7, 0x8a, 0x58, 0x06, 0x90, 0xee, 0x97, 0x20, 0x26, 0x88, 0xc8, 0xe4, - 0x20, 0xc2, 0xd1, 0xa5, 0x5c, 0x2f, 0x69, 0x12, 0x0f, 0xf2, 0x6a, 0xec, 0x02, 0x9c, 0x44, 0xb8, - 0x65, 0xde, 0x7f, 0x87, 0x0e, 0x54, 0x23, 0x3b, 0x39, 0x50, 0xa9, 0x7f, 0xbb, 0x00, 0xc3, 0x8c, - 0x5b, 0xad, 0xdb, 0x6e, 0xeb, 0xce, 0xe6, 0x89, 0x22, 0x1f, 0x44, 0x91, 0xeb, 0x70, 0x5a, 0x76, - 0x98, 0x67, 0xa6, 0xab, 0x1f, 0xda, 0x28, 0x38, 0xfe, 0x89, 0x13, 0x70, 0xdb, 0x12, 0xe7, 0x7d, - 0x4f, 0x80, 0xf1, 0x6c, 0xc1, 0xd5, 0x92, 0xbc, 0xd4, 0x9f, 0xc9, 0xc1, 0x78, 0x1c, 0x1a, 0xe8, - 0x7e, 0x2e, 0x55, 0xf7, 0x5f, 0x80, 0x21, 0x71, 0x85, 0xae, 0x1b, 0xc2, 0xa3, 0x6f, 0x6c, 0x7b, - 0x6b, 0x02, 0xf0, 0xfd, 0x72, 0xdd, 0xa1, 0xba, 0xa1, 0x85, 0x04, 0xe4, 0x15, 0x18, 0xc1, 0x1f, - 0x0f, 0x1c, 0xd3, 0xf3, 0x28, 0xef, 0x8c, 0x22, 0xbf, 0x15, 0xe0, 0x05, 0x36, 0x38, 0x42, 0x8b, - 0x90, 0xa9, 0xbf, 0x9b, 0x87, 0xa1, 0x5a, 0x77, 0xd5, 0xdd, 0x74, 0x3d, 0xda, 0x3e, 0xe6, 0x3a, - 0xe4, 0x6f, 0xd2, 0x8b, 0xa9, 0x9b, 0xf4, 0xe7, 0xfc, 0xa1, 0x25, 0x9d, 0x5e, 0x07, 0x1b, 0x03, - 0xdf, 0x2b, 0x31, 0xd4, 0xa2, 0xd2, 0xde, 0xb5, 0x48, 0xfd, 0xbb, 0x79, 0x18, 0xe7, 0x97, 0xb7, - 0x15, 0xd3, 0x6d, 0x1c, 0xc2, 0x83, 0x92, 0xa3, 0x97, 0xe9, 0xc1, 0x1c, 0x1e, 0x76, 0xf1, 0x4c, - 0x47, 0xfd, 0x72, 0x1e, 0x86, 0xcb, 0x5d, 0x6f, 0xbd, 0xec, 0xe1, 0xfc, 0xf6, 0x44, 0xee, 0x91, - 0xff, 0x51, 0x0e, 0x4e, 0xb1, 0x86, 0xac, 0xd8, 0x0f, 0xa9, 0x75, 0x08, 0x87, 0xdf, 0xf2, 0x21, - 0x76, 0x7e, 0x9f, 0x87, 0xd8, 0xbe, 0x2c, 0x0b, 0x7b, 0x93, 0x25, 0x5e, 0xd9, 0x68, 0x76, 0x8b, - 0x1e, 0xef, 0xcf, 0x38, 0xc4, 0x2b, 0x1b, 0x5f, 0x20, 0x87, 0x70, 0x45, 0xf8, 0xfd, 0x25, 0x90, - 0x43, 0x38, 0xdf, 0xfc, 0xfe, 0x10, 0xc8, 0xef, 0xe4, 0x60, 0x68, 0xca, 0xf6, 0x8e, 0xf9, 0xc0, - 0x17, 0x5f, 0x71, 0xbc, 0xd5, 0xdc, 0xff, 0x8a, 0xe3, 0xad, 0x9b, 0xea, 0xcf, 0xe5, 0xe1, 0xac, - 0x88, 0x87, 0x2f, 0xce, 0xc0, 0x4e, 0xa6, 0x63, 0x31, 0xd8, 0x92, 0xa2, 0x39, 0x99, 0x87, 0x84, - 0x68, 0x7e, 0xa1, 0x00, 0x67, 0x31, 0x7c, 0x2f, 0xdb, 0x51, 0x7d, 0x1f, 0xd8, 0x22, 0xa4, 0x11, - 0xbd, 0x88, 0x5f, 0x48, 0xb9, 0x88, 0xff, 0x57, 0x5b, 0x13, 0xaf, 0x36, 0x4d, 0x6f, 0xbd, 0xbb, - 0x3a, 0xd9, 0xb0, 0xdb, 0x37, 0x9a, 0x8e, 0xfe, 0xc8, 0xe4, 0x57, 0xd0, 0x7a, 0xeb, 0x46, 0x98, - 0xa6, 0xa6, 0x63, 0x8a, 0xa4, 0x33, 0x35, 0xdc, 0x29, 0x31, 0xae, 0xfe, 0x15, 0xbe, 0x0b, 0x70, - 0xc7, 0x36, 0x2d, 0xe1, 0xd7, 0xca, 0x0d, 0xdd, 0xda, 0xf6, 0xd6, 0xc4, 0xb9, 0xf7, 0x6d, 0xd3, - 0xaa, 0xc7, 0x9d, 0x5b, 0xf7, 0x5a, 0x5f, 0xc8, 0x5a, 0x93, 0xaa, 0x51, 0xff, 0xdb, 0x1c, 0x5c, - 0x8c, 0x6a, 0xf1, 0xf7, 0x83, 0xed, 0xf8, 0x17, 0xf3, 0x70, 0xee, 0x36, 0x0a, 0x27, 0x70, 0x26, - 0x3a, 0x99, 0xb7, 0xc4, 0xe0, 0x4c, 0x91, 0xcd, 0x89, 0x45, 0x99, 0x2d, 0x9b, 0x93, 0x49, 0x5d, - 0xc8, 0xe6, 0xbf, 0xc9, 0xc1, 0x99, 0xa5, 0x6a, 0x65, 0xfa, 0xfb, 0x64, 0x44, 0x25, 0xbf, 0xe7, - 0x98, 0x1b, 0x9c, 0x89, 0xef, 0x39, 0xe6, 0xa6, 0xe7, 0xd7, 0xf3, 0x70, 0xa6, 0x56, 0x5e, 0x98, - 0xff, 0x7e, 0x99, 0xc1, 0xa7, 0x65, 0xcf, 0x57, 0xff, 0x10, 0x4c, 0xd8, 0x02, 0xf2, 0x67, 0xde, - 0xbf, 0x99, 0xed, 0x11, 0x9b, 0x14, 0xca, 0x31, 0x9f, 0xba, 0x0f, 0x45, 0x28, 0x4c, 0xf3, 0x23, - 0xd4, 0xc7, 0x5c, 0xf3, 0xff, 0x8b, 0x12, 0x0c, 0xdf, 0xed, 0xae, 0x52, 0xe1, 0x20, 0xf5, 0x44, - 0x9f, 0xfc, 0xde, 0x84, 0x61, 0x21, 0x06, 0xbc, 0xe1, 0x90, 0x02, 0x38, 0x8a, 0x80, 0x3c, 0x3c, - 0x46, 0x96, 0x4c, 0x44, 0x2e, 0x43, 0xf1, 0x3e, 0x75, 0x56, 0xe5, 0xb7, 0xcd, 0x8f, 0xa8, 0xb3, - 0xaa, 0x21, 0x94, 0xcc, 0x87, 0xcf, 0x36, 0xca, 0xcb, 0x55, 0x4c, 0x1e, 0x24, 0x2e, 0x0d, 0x31, - 0x1b, 0x52, 0xe0, 0x7b, 0xa9, 0x77, 0x4c, 0x9e, 0x76, 0x48, 0x8e, 0xab, 0x10, 0x2f, 0x49, 0x16, - 0xe1, 0xb4, 0xec, 0x7c, 0xc7, 0x33, 0xe7, 0x0c, 0xa6, 0xb0, 0x4b, 0xcb, 0x99, 0x93, 0x2c, 0x4a, - 0xde, 0x81, 0x11, 0x1f, 0x88, 0x6e, 0x84, 0x43, 0x61, 0xba, 0x86, 0x80, 0x55, 0x2c, 0xba, 0x7e, - 0xa4, 0x80, 0xcc, 0x00, 0x2f, 0x31, 0x20, 0x85, 0x41, 0xcc, 0x2d, 0x33, 0x52, 0x80, 0xbc, 0x82, - 0x0c, 0xf0, 0xa9, 0x11, 0x3a, 0x4c, 0x0d, 0xe3, 0xc3, 0x5f, 0xbc, 0x00, 0x72, 0x04, 0x9c, 0x3f, - 0xef, 0x8e, 0x90, 0x91, 0x25, 0x80, 0xd0, 0xb1, 0x45, 0x04, 0xd1, 0xd8, 0xb3, 0xcb, 0x8d, 0xc4, - 0x42, 0xbe, 0xc9, 0x1b, 0xdd, 0xcf, 0x4d, 0x9e, 0xfa, 0x87, 0x79, 0x18, 0x2e, 0x77, 0x3a, 0xc1, - 0x50, 0x78, 0x11, 0x4a, 0xe5, 0x4e, 0xe7, 0x9e, 0x56, 0x95, 0xc3, 0xe9, 0xeb, 0x9d, 0x4e, 0xbd, - 0xeb, 0x98, 0xb2, 0x5f, 0x32, 0x27, 0x22, 0xd3, 0x30, 0x5a, 0xee, 0x74, 0x96, 0xbb, 0xab, 0x2d, - 0xb3, 0x21, 0x65, 0x03, 0xe3, 0xf9, 0x12, 0x3b, 0x9d, 0x7a, 0x07, 0x31, 0xf1, 0x94, 0x70, 0xd1, - 0x32, 0xe4, 0x4b, 0x18, 0x7a, 0x4a, 0x24, 0xa3, 0xe2, 0xe9, 0x6e, 0xd4, 0x20, 0x90, 0x7e, 0xd8, - 0xb6, 0xc9, 0x80, 0x88, 0x27, 0x1c, 0xb8, 0xec, 0xa7, 0x89, 0x60, 0x15, 0x25, 0x92, 0x4e, 0x85, - 0x2c, 0xc9, 0xa7, 0x60, 0xa0, 0xdc, 0xe9, 0x48, 0xb7, 0x55, 0xe8, 0xd8, 0xc6, 0x4a, 0xc5, 0xf3, - 0xfd, 0x09, 0xb2, 0x4b, 0x6f, 0xc1, 0x58, 0xb4, 0xb2, 0x3d, 0x25, 0x2c, 0xf8, 0x5e, 0x0e, 0x3f, - 0xe8, 0x98, 0xfb, 0xd5, 0xbf, 0x0c, 0x85, 0x72, 0xa7, 0x23, 0xe6, 0xa3, 0x33, 0x29, 0xfd, 0x11, - 0x7f, 0x86, 0x5f, 0xee, 0x74, 0xfc, 0x4f, 0x3f, 0xe6, 0x0f, 0x74, 0xf6, 0xf5, 0xe9, 0xbf, 0xc3, - 0x3f, 0xfd, 0x78, 0x3f, 0x9e, 0x51, 0x7f, 0xad, 0x00, 0xa7, 0xca, 0x9d, 0xce, 0x49, 0xa2, 0x83, - 0xc3, 0x7a, 0xec, 0xff, 0x12, 0x80, 0x34, 0x3d, 0x0e, 0x04, 0xcf, 0x07, 0x87, 0xa5, 0xa9, 0x51, - 0xc9, 0x69, 0x12, 0x91, 0xaf, 0x7e, 0x83, 0x7b, 0x52, 0xbf, 0x2f, 0x17, 0x70, 0x2a, 0x3e, 0xee, - 0x81, 0xcb, 0x3e, 0x2a, 0xdd, 0x26, 0xfa, 0xa0, 0xb4, 0xa7, 0x3e, 0xf8, 0x87, 0x91, 0xc1, 0x83, - 0x81, 0xf3, 0x4f, 0x7a, 0xa1, 0xff, 0x40, 0x66, 0xf1, 0x98, 0x2c, 0x4c, 0x11, 0x4d, 0xc9, 0x4f, - 0x1e, 0x26, 0x62, 0x7b, 0x35, 0x18, 0xaa, 0x6e, 0x1a, 0x5a, 0x8c, 0xd6, 0xef, 0xc3, 0x81, 0x3d, - 0xf5, 0xe1, 0x56, 0x1e, 0xdf, 0xef, 0x07, 0xb1, 0xc1, 0x0e, 0xbe, 0xbb, 0xb8, 0x01, 0xc0, 0x3d, - 0x0f, 0x02, 0xd7, 0xfa, 0x51, 0x1e, 0x06, 0x88, 0xe7, 0x14, 0x13, 0x61, 0x80, 0x42, 0x92, 0xc0, - 0x53, 0xa9, 0x90, 0xea, 0xa9, 0x74, 0x1d, 0x06, 0x35, 0x7d, 0xe3, 0xdd, 0x2e, 0x75, 0x36, 0x85, - 0x39, 0xc3, 0x43, 0x6f, 0xea, 0x1b, 0xf5, 0x1f, 0x62, 0x40, 0x2d, 0x40, 0x13, 0x35, 0x08, 0x00, - 0x21, 0x79, 0x84, 0xf0, 0x33, 0xf2, 0x20, 0xec, 0xc3, 0x7e, 0x14, 0x9d, 0xbc, 0x01, 0x85, 0xf2, - 0x83, 0x9a, 0x90, 0x6c, 0xd0, 0xb5, 0xe5, 0x07, 0x35, 0x21, 0xaf, 0xcc, 0xb2, 0x0f, 0x6a, 0xea, - 0x97, 0xf3, 0x40, 0x92, 0x94, 0xe4, 0x55, 0x18, 0x42, 0x68, 0x93, 0xe9, 0x8c, 0x9c, 0x8c, 0x76, - 0xc3, 0xad, 0x3b, 0x08, 0x8d, 0x18, 0x77, 0x3e, 0x29, 0x79, 0x1d, 0xd3, 0x7d, 0x8b, 0x74, 0x88, - 0x91, 0x64, 0xb4, 0x1b, 0xae, 0x9f, 0x20, 0x3b, 0x96, 0xed, 0x5b, 0x10, 0xa3, 0x5d, 0xf8, 0xa0, - 0x36, 0x67, 0xbb, 0x9e, 0x10, 0x35, 0xb7, 0x0b, 0x37, 0x5c, 0xcc, 0x82, 0x1c, 0xb1, 0x0b, 0x39, - 0x19, 0x66, 0x72, 0x7b, 0x50, 0xe3, 0x4f, 0xa5, 0x0c, 0xcd, 0x6e, 0xf9, 0x06, 0x25, 0xcf, 0xe4, - 0xb6, 0xe1, 0xd6, 0xf9, 0x33, 0x2b, 0x03, 0xf3, 0x8c, 0x47, 0x32, 0xb9, 0x45, 0x4a, 0xa9, 0x3f, - 0x35, 0x08, 0xe3, 0x15, 0xdd, 0xd3, 0x57, 0x75, 0x97, 0x4a, 0xbb, 0xe9, 0x53, 0x3e, 0xcc, 0xff, - 0x1c, 0x49, 0x0e, 0xc6, 0x6a, 0xca, 0xd7, 0xc4, 0x0b, 0x90, 0x37, 0x43, 0xbe, 0x41, 0x9e, 0x5d, - 0x39, 0x71, 0xdf, 0x6a, 0xbd, 0x23, 0xc0, 0x5a, 0x82, 0x90, 0xbc, 0x00, 0xc3, 0x3e, 0x8c, 0x6d, - 0x00, 0x0a, 0xa1, 0xce, 0x18, 0xab, 0xcc, 0xfe, 0xd7, 0x64, 0x34, 0x79, 0x1d, 0x46, 0xfc, 0x9f, - 0x92, 0x69, 0xcd, 0xb3, 0x10, 0xae, 0x26, 0x76, 0x4f, 0x32, 0xa9, 0x5c, 0x14, 0xe7, 0xb7, 0xfe, - 0x48, 0xd1, 0x58, 0xa2, 0xbf, 0x08, 0x29, 0xf9, 0x21, 0x18, 0xf3, 0x7f, 0x8b, 0x0d, 0x03, 0x77, - 0x1c, 0x7c, 0x21, 0x48, 0x63, 0x1e, 0x13, 0xeb, 0x64, 0x94, 0x9c, 0x6f, 0x1d, 0x9e, 0xf2, 0x73, - 0xd7, 0x19, 0xab, 0xc9, 0x9d, 0x43, 0xac, 0x02, 0x52, 0x85, 0xd3, 0x3e, 0x24, 0xd4, 0xd0, 0x81, - 0x70, 0xc7, 0x68, 0xac, 0xd6, 0x53, 0x95, 0x34, 0x59, 0x8a, 0xb4, 0xe0, 0x72, 0x04, 0x68, 0xb8, - 0xeb, 0xe6, 0x9a, 0x27, 0xb6, 0x7b, 0x22, 0x0e, 0xb6, 0x48, 0x56, 0x1a, 0x70, 0xe5, 0x34, 0x7e, - 0xd6, 0xe1, 0x68, 0x86, 0xb2, 0x9e, 0xdc, 0x48, 0x0d, 0xce, 0xfa, 0xf8, 0xdb, 0xd3, 0xcb, 0xcb, - 0x8e, 0xfd, 0x3e, 0x6d, 0x78, 0xd5, 0x8a, 0xd8, 0x2e, 0x63, 0x7c, 0x44, 0x63, 0xb5, 0xde, 0x6c, - 0x74, 0x98, 0x52, 0x30, 0x5c, 0x94, 0x79, 0x6a, 0x61, 0x72, 0x1f, 0xce, 0x49, 0x70, 0x29, 0x25, - 0x3a, 0x84, 0xfb, 0x79, 0xc1, 0x35, 0x3d, 0x2b, 0x7a, 0x7a, 0x71, 0xf2, 0x16, 0x8c, 0xfa, 0x08, - 0x7e, 0x8b, 0x38, 0x8c, 0xb7, 0x88, 0x38, 0x24, 0x8d, 0xd5, 0x7a, 0xfc, 0x45, 0x6f, 0x94, 0x58, - 0xd6, 0xa8, 0x95, 0xcd, 0x0e, 0x15, 0x1e, 0xbd, 0xbe, 0x46, 0x79, 0x9b, 0x9d, 0x54, 0x65, 0x64, - 0xa4, 0xe4, 0x9d, 0x50, 0xa3, 0x96, 0x1c, 0xb3, 0x69, 0xf2, 0x9d, 0xb4, 0xff, 0x88, 0x77, 0xb5, - 0x6e, 0x23, 0x30, 0x4d, 0x3f, 0x38, 0xf9, 0xa5, 0x32, 0x9c, 0x49, 0xd1, 0xb1, 0x3d, 0xed, 0x18, - 0xbf, 0x92, 0x0f, 0x1b, 0x71, 0xcc, 0xb7, 0x8d, 0x53, 0x30, 0xe8, 0x7f, 0x89, 0x30, 0x1e, 0x94, - 0xac, 0xa1, 0x19, 0xe7, 0xe1, 0xe3, 0x23, 0xe2, 0x38, 0xe6, 0x5b, 0xc9, 0xc3, 0x10, 0xc7, 0x77, - 0x72, 0xa1, 0x38, 0x8e, 0xf9, 0xf6, 0xf2, 0x27, 0x8b, 0xe1, 0x9c, 0x74, 0xb2, 0xc7, 0x3c, 0x2c, - 0x33, 0x39, 0xf4, 0x83, 0x2d, 0xed, 0xe1, 0x31, 0xad, 0xac, 0x9a, 0x03, 0xfb, 0x53, 0x4d, 0xf2, - 0x16, 0x0c, 0x2f, 0xdb, 0xae, 0xd7, 0x74, 0xa8, 0xbb, 0x1c, 0xe4, 0x71, 0xc0, 0x87, 0xd8, 0x1d, - 0x01, 0xae, 0x77, 0x22, 0xb3, 0xbf, 0x4c, 0xae, 0xfe, 0x93, 0x42, 0x42, 0x1b, 0xb8, 0xe1, 0x7a, - 0x2c, 0xb5, 0xe1, 0x10, 0x86, 0x3a, 0xb9, 0x19, 0xae, 0x82, 0xdc, 0xc2, 0xef, 0x97, 0x82, 0x54, - 0xae, 0x0a, 0x03, 0x3f, 0x4a, 0x42, 0xbe, 0x00, 0x17, 0x22, 0x80, 0x65, 0xdd, 0xd1, 0xdb, 0xd4, - 0x0b, 0x73, 0x66, 0x62, 0xd8, 0x31, 0xbf, 0x74, 0xbd, 0x13, 0xa0, 0xe5, 0x3c, 0x9c, 0x19, 0x1c, - 0x24, 0xd5, 0x1a, 0xd8, 0x83, 0x8b, 0xf5, 0xcf, 0x16, 0x42, 0x43, 0x27, 0x1a, 0x3e, 0x58, 0xa3, - 0x6e, 0xb7, 0xe5, 0x3d, 0xb9, 0x1d, 0xbc, 0xbf, 0xe4, 0x2c, 0x73, 0x70, 0xaa, 0xbc, 0xb6, 0x46, - 0x1b, 0x9e, 0x1f, 0x15, 0xdd, 0x15, 0x01, 0x23, 0xf9, 0xc6, 0x43, 0xa0, 0x44, 0x94, 0x6b, 0xb9, - 0x5f, 0xe3, 0xc5, 0xd4, 0x7f, 0x5a, 0x04, 0x25, 0x30, 0xfc, 0x83, 0xa7, 0x86, 0x47, 0xb8, 0xc8, - 0x7e, 0x24, 0x7a, 0xc5, 0x84, 0xd3, 0xa1, 0x30, 0xc4, 0x1b, 0x2f, 0x91, 0xc5, 0x7d, 0x22, 0xce, - 0x2c, 0x24, 0xe4, 0x7b, 0x89, 0x4b, 0x62, 0x2f, 0x41, 0xc2, 0xa7, 0x9c, 0x75, 0x97, 0xb3, 0xd0, - 0x92, 0x5c, 0xc9, 0x57, 0x73, 0x70, 0xd6, 0xef, 0x94, 0xa5, 0x55, 0x66, 0x54, 0x4f, 0xdb, 0x5d, - 0x2b, 0x78, 0x00, 0xf5, 0x46, 0x76, 0x75, 0xbc, 0x93, 0x26, 0xd3, 0x0a, 0xf3, 0x96, 0x04, 0xa1, - 0x51, 0x02, 0x85, 0xb0, 0x91, 0xa6, 0xde, 0x40, 0x22, 0x2d, 0xb5, 0xde, 0x4b, 0xb7, 0xe1, 0x62, - 0x26, 0xcb, 0x9d, 0x8c, 0xd8, 0x7e, 0xd9, 0x88, 0xfd, 0xef, 0x73, 0xe1, 0x44, 0x14, 0x13, 0x12, - 0x99, 0x04, 0x08, 0x41, 0x62, 0x5b, 0x8b, 0xef, 0xab, 0x42, 0xa1, 0x69, 0x12, 0x05, 0x59, 0x82, - 0x92, 0x10, 0x0b, 0xcf, 0x4f, 0xfd, 0xc9, 0x1d, 0x7a, 0x61, 0x52, 0x96, 0x03, 0x6e, 0x59, 0xc5, - 0x37, 0x0b, 0x36, 0x97, 0x5e, 0x87, 0xe1, 0xfd, 0x7e, 0xd7, 0x57, 0x0b, 0x40, 0xe4, 0x3d, 0xe8, - 0x11, 0x1a, 0xe8, 0xc7, 0x78, 0x0a, 0xbb, 0x06, 0x83, 0xec, 0x13, 0x30, 0x63, 0x8b, 0x14, 0xa1, - 0xb9, 0x2b, 0x60, 0x5a, 0x80, 0x0d, 0xc3, 0xa3, 0x0d, 0xa4, 0x87, 0x47, 0x53, 0x7f, 0xa6, 0x00, - 0xe7, 0xe5, 0x0e, 0xa9, 0x50, 0x4c, 0xfa, 0x70, 0xd2, 0x29, 0x1f, 0x62, 0xa7, 0xa8, 0x50, 0xe2, - 0x5b, 0x0f, 0x91, 0x7d, 0x83, 0x1f, 0x0b, 0x21, 0x44, 0x13, 0x18, 0xf5, 0x7f, 0xc9, 0xc3, 0x68, - 0x60, 0xde, 0xe9, 0x8e, 0xfb, 0x04, 0x77, 0xc7, 0xa7, 0x61, 0x14, 0x03, 0x5c, 0xb5, 0xa9, 0xc5, - 0x83, 0x40, 0xf5, 0x4b, 0xe9, 0x72, 0x7c, 0x84, 0xc8, 0x8c, 0x16, 0x21, 0x64, 0xda, 0xcf, 0x2d, - 0x3f, 0x29, 0xec, 0x18, 0x37, 0xfb, 0x38, 0x5c, 0xfd, 0x6b, 0x05, 0x18, 0xf1, 0xa5, 0x3c, 0x65, - 0x1e, 0xd7, 0x7b, 0x9e, 0xa3, 0x15, 0xf2, 0x0d, 0x80, 0x65, 0xdb, 0xf1, 0xf4, 0xd6, 0x62, 0xa8, - 0xf9, 0x78, 0x40, 0xda, 0x41, 0x28, 0x2f, 0x23, 0x91, 0xe0, 0xfa, 0x15, 0x9a, 0xd5, 0x7c, 0x62, - 0xe2, 0xeb, 0x57, 0x00, 0xd5, 0x24, 0x0a, 0xf5, 0xb7, 0xf2, 0x70, 0xca, 0xef, 0xa4, 0x99, 0xc7, - 0xb4, 0xd1, 0x7d, 0x92, 0xe7, 0xa6, 0xa8, 0xb4, 0xfb, 0x77, 0x94, 0xb6, 0xfa, 0x7f, 0x4a, 0x13, - 0xc9, 0x74, 0xcb, 0x3e, 0x99, 0x48, 0xfe, 0x34, 0x74, 0x5c, 0xfd, 0xd1, 0x02, 0x9c, 0xf5, 0xa5, - 0x3e, 0xdb, 0xb5, 0xf0, 0x68, 0x61, 0x5a, 0x6f, 0xb5, 0x9e, 0xe4, 0xdd, 0xf8, 0xb0, 0x2f, 0x88, - 0x25, 0x11, 0x31, 0x52, 0x64, 0xa9, 0x5c, 0x13, 0xe0, 0xba, 0x6d, 0x1a, 0x9a, 0x4c, 0x44, 0xde, - 0x81, 0x11, 0xff, 0x67, 0xd9, 0x69, 0xfa, 0x5b, 0x70, 0xbc, 0x28, 0x08, 0x0a, 0xe9, 0x4e, 0x24, - 0x30, 0x46, 0xa4, 0x80, 0xfa, 0xe5, 0x01, 0xb8, 0xf4, 0xc0, 0xb4, 0x0c, 0x7b, 0xc3, 0xf5, 0x93, - 0x9c, 0x1e, 0xfb, 0x83, 0xb2, 0xa3, 0x4e, 0x6e, 0xfa, 0x2e, 0x9c, 0x8b, 0x8b, 0xd4, 0x09, 0x42, - 0xcf, 0x8b, 0xde, 0xd9, 0xe0, 0x04, 0x75, 0x3f, 0xdd, 0xa9, 0xb8, 0x6d, 0xd3, 0xd2, 0x4b, 0xc6, - 0xf3, 0xa5, 0x0e, 0xec, 0x26, 0x5f, 0xea, 0xf3, 0x50, 0xaa, 0xd8, 0x6d, 0xdd, 0xf4, 0x43, 0x24, - 0xe1, 0x28, 0x0e, 0xea, 0x45, 0x8c, 0x26, 0x28, 0x18, 0x7f, 0x51, 0x31, 0x76, 0xd9, 0x50, 0xc8, - 0xdf, 0x2f, 0xc0, 0xac, 0x34, 0x4d, 0x26, 0x22, 0x36, 0x8c, 0x8a, 0xea, 0xc4, 0xdd, 0x18, 0xe0, - 0xe6, 0xe9, 0x15, 0x5f, 0x46, 0xd9, 0x6a, 0x35, 0x19, 0x29, 0xc7, 0xb7, 0x51, 0x3c, 0x8d, 0xab, - 0xf8, 0x18, 0x7e, 0x4b, 0xa6, 0x45, 0xf9, 0x4b, 0x42, 0xc0, 0x49, 0x66, 0x38, 0x29, 0x04, 0x9c, - 0x65, 0x64, 0x22, 0x32, 0x03, 0xa7, 0x31, 0x40, 0x78, 0xb0, 0x95, 0x62, 0x2a, 0x31, 0x82, 0x46, - 0x25, 0x5e, 0xb9, 0xf0, 0x98, 0xe2, 0xec, 0xe3, 0xea, 0x0d, 0x81, 0xd6, 0x92, 0x25, 0xc8, 0x45, - 0x28, 0x2c, 0xce, 0x97, 0xf1, 0xae, 0x66, 0x90, 0x27, 0xe7, 0xb2, 0x5a, 0xba, 0xc6, 0x60, 0x97, - 0x3e, 0x0b, 0x24, 0xf9, 0x39, 0x7b, 0xba, 0x8f, 0xf9, 0xaf, 0xa4, 0x2d, 0xdf, 0x71, 0xf7, 0xa8, - 0x39, 0x8c, 0x89, 0x30, 0x92, 0x17, 0xaf, 0xff, 0xc3, 0xcc, 0x8b, 0x57, 0x3a, 0xd4, 0xbc, 0x78, - 0xea, 0x2f, 0xe7, 0xe0, 0x74, 0x22, 0x88, 0x3e, 0x79, 0x19, 0x80, 0x43, 0xa4, 0x60, 0xa5, 0x18, - 0xfd, 0x27, 0x0c, 0xac, 0x2f, 0x96, 0xc7, 0x90, 0x8c, 0xdc, 0x80, 0x41, 0xfe, 0x4b, 0x04, 0x18, - 0x4b, 0x16, 0xe9, 0x76, 0x4d, 0x43, 0x0b, 0x88, 0xc2, 0x5a, 0xf0, 0x46, 0xb2, 0x90, 0x5a, 0xc4, - 0xdb, 0xec, 0x04, 0xb5, 0x30, 0x32, 0xf5, 0xa7, 0xf2, 0x30, 0x12, 0x34, 0xb8, 0x6c, 0x1c, 0x95, - 0xce, 0x95, 0x44, 0x3e, 0x82, 0xc2, 0x4e, 0xf9, 0x08, 0x62, 0xf3, 0xad, 0x48, 0x40, 0x70, 0x78, - 0x0f, 0xaa, 0xbe, 0x96, 0x87, 0x53, 0x41, 0xad, 0x47, 0x78, 0xf9, 0xf5, 0x11, 0x12, 0xc9, 0x57, - 0x73, 0xa0, 0x4c, 0x99, 0xad, 0x96, 0x69, 0x35, 0xab, 0xd6, 0x9a, 0xed, 0xb4, 0x71, 0x42, 0x3c, - 0xba, 0x23, 0x5c, 0xf5, 0xcf, 0xe6, 0xe0, 0xb4, 0x68, 0xd0, 0xb4, 0xee, 0x18, 0x47, 0x77, 0x3e, - 0x16, 0x6f, 0xc9, 0xd1, 0xe9, 0x8b, 0xfa, 0xad, 0x3c, 0xc0, 0xbc, 0xdd, 0x78, 0x78, 0xcc, 0xdf, - 0x63, 0xbd, 0x09, 0x25, 0x1e, 0xe5, 0x4d, 0x68, 0xec, 0x69, 0xf1, 0xee, 0x88, 0x7d, 0x1a, 0x47, - 0x4c, 0x8d, 0x8b, 0xf9, 0xb8, 0xc4, 0xa3, 0xc4, 0x29, 0x39, 0x4d, 0x14, 0x61, 0x95, 0x32, 0x3a, - 0xb1, 0x60, 0x04, 0x95, 0x32, 0x58, 0xb4, 0xd2, 0xed, 0xad, 0x89, 0x62, 0xcb, 0x6e, 0x3c, 0xd4, - 0x90, 0x5e, 0xfd, 0xd7, 0x39, 0x2e, 0xbb, 0x63, 0xfe, 0xaa, 0xd4, 0xff, 0xfc, 0xe2, 0x1e, 0x3f, - 0xff, 0xcf, 0xe5, 0xe0, 0xac, 0x46, 0x1b, 0xf6, 0x23, 0xea, 0x6c, 0x4e, 0xdb, 0x06, 0xbd, 0x4d, - 0x2d, 0xea, 0x1c, 0xd5, 0x88, 0xfa, 0x6d, 0x4c, 0xe0, 0x12, 0x36, 0xe6, 0x9e, 0x4b, 0x8d, 0xe3, - 0x93, 0x5c, 0x47, 0xfd, 0xd5, 0x01, 0x50, 0x52, 0xad, 0xde, 0x63, 0x6b, 0xce, 0x65, 0x6e, 0x65, - 0x8a, 0x87, 0xb5, 0x95, 0xe9, 0xdf, 0xdb, 0x56, 0xa6, 0xb4, 0xd7, 0xad, 0xcc, 0xc0, 0x6e, 0xb6, - 0x32, 0xed, 0xf8, 0x56, 0x66, 0x10, 0xb7, 0x32, 0x2f, 0xf7, 0xdc, 0xca, 0xcc, 0x58, 0xc6, 0x3e, - 0x37, 0x32, 0xc7, 0x36, 0xf1, 0xf3, 0x7e, 0x76, 0x60, 0xd7, 0xd8, 0xa4, 0xd8, 0xb0, 0x1d, 0x83, - 0x1a, 0x62, 0xe3, 0x85, 0xa7, 0xfe, 0x8e, 0x80, 0x69, 0x01, 0x36, 0x91, 0x45, 0x7b, 0x74, 0x37, - 0x59, 0xb4, 0x0f, 0x61, 0xff, 0xf5, 0x95, 0x3c, 0x9c, 0x9e, 0xa6, 0x8e, 0xc7, 0xc3, 0xc8, 0x1e, - 0x86, 0x4b, 0x5c, 0x19, 0x4e, 0x49, 0x0c, 0xd1, 0x22, 0xcf, 0x87, 0x6e, 0x7e, 0x0d, 0xea, 0x78, - 0x71, 0x2f, 0xc1, 0x38, 0x3d, 0xab, 0xde, 0xcf, 0x64, 0x27, 0xc6, 0x6e, 0x50, 0xbd, 0x0f, 0xe7, - 0x82, 0x34, 0xc5, 0x2f, 0x2d, 0xa0, 0x97, 0x92, 0xd3, 0x15, 0xf7, 0x9e, 0x9c, 0x4e, 0xfd, 0xa5, - 0x1c, 0x5c, 0xd5, 0xa8, 0x45, 0x37, 0xf4, 0xd5, 0x16, 0x95, 0x9a, 0x25, 0x56, 0x06, 0x36, 0x6b, - 0x98, 0x6e, 0x5b, 0xf7, 0x1a, 0xeb, 0x07, 0x92, 0xd1, 0x2c, 0x8c, 0xc8, 0xf3, 0xd7, 0x1e, 0xe6, - 0xb6, 0x48, 0x39, 0xf5, 0x57, 0x8b, 0x30, 0x30, 0x65, 0x7b, 0x77, 0xec, 0x03, 0x66, 0x4b, 0x0c, - 0xa7, 0xfc, 0xfc, 0x1e, 0xce, 0x7a, 0x3e, 0x85, 0x95, 0x4b, 0x09, 0x24, 0xd0, 0x85, 0x74, 0xd5, - 0x4e, 0x24, 0xda, 0xf0, 0xc9, 0xf6, 0x98, 0x27, 0xf1, 0x55, 0x18, 0xc2, 0xe8, 0x2f, 0xd2, 0x69, - 0x2c, 0x3a, 0x68, 0x7b, 0x0c, 0x18, 0xaf, 0x23, 0x24, 0x25, 0x5f, 0x88, 0xc4, 0xbd, 0x2d, 0x1d, - 0x3c, 0xaf, 0xa2, 0x1c, 0x02, 0xf7, 0x65, 0x7e, 0x91, 0x87, 0x6d, 0x92, 0x72, 0xd0, 0xe0, 0x29, - 0x4a, 0xac, 0x49, 0x01, 0xe1, 0x21, 0xe6, 0x3c, 0x9c, 0x86, 0xd1, 0x29, 0xdb, 0x93, 0x9c, 0x81, - 0x87, 0xc2, 0x67, 0xa0, 0x4c, 0xf2, 0xe9, 0x9e, 0xc0, 0xd1, 0x32, 0xea, 0x9f, 0x14, 0x61, 0xc4, - 0xff, 0x79, 0x44, 0xba, 0xf3, 0x22, 0x94, 0xe6, 0x6c, 0x29, 0x0d, 0x07, 0x3a, 0x10, 0xaf, 0xdb, - 0x6e, 0xcc, 0x33, 0x5a, 0x10, 0x31, 0xa9, 0x2f, 0xda, 0x86, 0xec, 0xfe, 0x8e, 0x52, 0xb7, 0x6c, - 0x23, 0xf1, 0x7c, 0x38, 0x20, 0x24, 0x57, 0xa1, 0x88, 0x2f, 0x07, 0xa4, 0x83, 0xfc, 0xd8, 0x6b, - 0x01, 0xc4, 0x4b, 0x5a, 0x59, 0xda, 0xab, 0x56, 0x0e, 0xec, 0x57, 0x2b, 0x07, 0x0f, 0x57, 0x2b, - 0xdf, 0x83, 0x11, 0xac, 0xc9, 0xcf, 0xe2, 0xb7, 0xf3, 0xc2, 0x7a, 0x51, 0xac, 0x7d, 0xa3, 0xbc, - 0xdd, 0x22, 0x97, 0x1f, 0x2e, 0x79, 0x11, 0x56, 0x31, 0xdd, 0x85, 0x03, 0x6c, 0xa7, 0xff, 0x49, - 0x0e, 0x06, 0xee, 0x59, 0x0f, 0x2d, 0x7b, 0xe3, 0x60, 0x1a, 0xf7, 0x32, 0x0c, 0x0b, 0x36, 0xd2, - 0xea, 0x82, 0x2f, 0xc2, 0xbb, 0x1c, 0x5c, 0x47, 0x4e, 0x9a, 0x4c, 0x45, 0xde, 0x0a, 0x0a, 0xe1, - 0xe3, 0xa0, 0x42, 0x98, 0xc8, 0xc6, 0x2f, 0xd4, 0x88, 0xe6, 0xde, 0x90, 0xc9, 0xc9, 0x65, 0x28, - 0x56, 0x58, 0x53, 0xa5, 0x18, 0xbc, 0xac, 0x29, 0x1a, 0x42, 0xd5, 0xaf, 0x14, 0x61, 0x2c, 0x76, - 0xf0, 0xf5, 0x3c, 0x0c, 0x89, 0x83, 0x27, 0xd3, 0x4f, 0x06, 0x82, 0x8f, 0x87, 0x02, 0xa0, 0x36, - 0xc8, 0xff, 0xac, 0x1a, 0xe4, 0x33, 0x30, 0x60, 0xbb, 0xb8, 0x28, 0xe2, 0xb7, 0x8c, 0x85, 0x43, - 0x68, 0xa9, 0xc6, 0xda, 0xce, 0x07, 0x87, 0x20, 0x91, 0x35, 0xd2, 0x76, 0xf1, 0xd3, 0x6e, 0xc1, - 0x90, 0xee, 0xba, 0xd4, 0xab, 0x7b, 0x7a, 0x53, 0xce, 0x0f, 0x12, 0x00, 0xe5, 0xd1, 0x81, 0xc0, - 0x15, 0xbd, 0x49, 0x3e, 0x0b, 0xa3, 0x0d, 0x87, 0xe2, 0xb2, 0xa9, 0xb7, 0x58, 0x2b, 0x25, 0xb3, - 0x36, 0x82, 0x90, 0xef, 0x4f, 0x42, 0x44, 0xd5, 0x20, 0xf7, 0x61, 0x54, 0x7c, 0x0e, 0xf7, 0xdc, - 0xc7, 0x81, 0x36, 0x16, 0x2e, 0x63, 0x5c, 0x24, 0xdc, 0x77, 0x5f, 0x3c, 0xe0, 0x90, 0xc9, 0x65, - 0xbe, 0x86, 0x44, 0x4a, 0x96, 0x80, 0x6c, 0xd0, 0xd5, 0xba, 0xde, 0xf5, 0xd6, 0x59, 0x5d, 0x3c, - 0xbc, 0xbd, 0x48, 0x8b, 0x89, 0xaf, 0x1e, 0x92, 0x58, 0xf9, 0x31, 0xc8, 0x06, 0x5d, 0x2d, 0x47, - 0x90, 0xe4, 0x01, 0x9c, 0x4b, 0x16, 0x61, 0x9f, 0xcc, 0x2f, 0x07, 0x9e, 0xdb, 0xde, 0x9a, 0x98, - 0x48, 0x25, 0x90, 0xd8, 0x9e, 0x49, 0xb0, 0xad, 0x1a, 0x77, 0x8a, 0x83, 0x03, 0xe3, 0x83, 0xda, - 0x18, 0x2b, 0xeb, 0x9b, 0x90, 0xa6, 0xa1, 0xfe, 0x5e, 0x8e, 0x99, 0x8a, 0xec, 0x83, 0x30, 0x2f, - 0x38, 0xd3, 0xf5, 0xf6, 0x1e, 0x75, 0xbd, 0x1d, 0x66, 0xf0, 0x2c, 0xb9, 0x3d, 0x66, 0x57, 0x4d, - 0x60, 0xc9, 0x24, 0x94, 0x0c, 0xf9, 0xd4, 0xec, 0x7c, 0xb4, 0x13, 0xfc, 0x7a, 0x34, 0x41, 0x45, - 0xae, 0x41, 0x91, 0x2d, 0x59, 0xf1, 0x2d, 0xb3, 0x6c, 0x5d, 0x68, 0x48, 0xa1, 0xfe, 0x70, 0x1e, - 0x46, 0xa4, 0xaf, 0xb9, 0x79, 0xa0, 0xcf, 0x79, 0x63, 0x77, 0xcd, 0xf4, 0x9d, 0x5e, 0x70, 0x2f, - 0xe5, 0x37, 0xf9, 0x56, 0x20, 0x8a, 0x5d, 0x5d, 0x48, 0x09, 0xc1, 0xbc, 0x2a, 0x3e, 0xb4, 0xb4, - 0xfb, 0xed, 0x23, 0xa3, 0xbf, 0x53, 0x1c, 0xcc, 0x8f, 0x17, 0xee, 0x14, 0x07, 0x8b, 0xe3, 0xfd, - 0x18, 0x87, 0x0b, 0x43, 0x5f, 0xf3, 0xbd, 0xb9, 0xb5, 0x66, 0x36, 0x8f, 0xf9, 0xdb, 0x91, 0xc3, - 0x8d, 0x51, 0x16, 0x93, 0xcd, 0x31, 0x7f, 0x48, 0xf2, 0xa1, 0xca, 0xe6, 0x24, 0xe3, 0xa7, 0x90, - 0xcd, 0x3f, 0xcd, 0x81, 0x92, 0x2a, 0x9b, 0xf2, 0x11, 0xf9, 0x41, 0x1c, 0x5e, 0xde, 0xcf, 0x3f, - 0xca, 0xc3, 0xe9, 0xaa, 0xe5, 0xd1, 0x26, 0xdf, 0x31, 0x1e, 0xf3, 0xa9, 0xe2, 0x2e, 0x0c, 0x4b, - 0x1f, 0x23, 0xfa, 0xfc, 0xa9, 0x60, 0x3f, 0x1e, 0xa2, 0x32, 0x38, 0xc9, 0xa5, 0x0f, 0xef, 0x25, - 0x4e, 0x5c, 0xc8, 0xc7, 0x7c, 0xce, 0x39, 0x1e, 0x42, 0x3e, 0xe6, 0x93, 0xd7, 0x47, 0x54, 0xc8, - 0xff, 0x79, 0x1e, 0xce, 0xa4, 0x54, 0x4e, 0xae, 0xc2, 0x40, 0xad, 0xbb, 0x8a, 0x61, 0xb7, 0x72, - 0xa1, 0xc7, 0xb0, 0xdb, 0x5d, 0xc5, 0x88, 0x5b, 0x9a, 0x8f, 0x24, 0x2b, 0xf8, 0xb8, 0x7e, 0xa9, - 0x5a, 0x99, 0x16, 0x52, 0x55, 0xa5, 0x30, 0x01, 0x0c, 0x9c, 0xf6, 0x65, 0xc1, 0x03, 0x7c, 0xdb, - 0x34, 0x1a, 0xb1, 0x07, 0xf8, 0xac, 0x0c, 0xf9, 0x01, 0x18, 0x2a, 0x7f, 0xd0, 0x75, 0x28, 0xf2, - 0xe5, 0x12, 0xff, 0x58, 0xc0, 0xd7, 0x47, 0xa4, 0x71, 0xe6, 0xb1, 0x04, 0x18, 0x45, 0x9c, 0x77, - 0xc8, 0x90, 0x2c, 0x41, 0xe9, 0xb6, 0xe9, 0xcd, 0x75, 0x57, 0x45, 0x2f, 0x04, 0xa1, 0xb9, 0x38, - 0x34, 0x8d, 0x2f, 0xee, 0xca, 0x79, 0x88, 0x61, 0x79, 0x0f, 0xc4, 0x0b, 0xa8, 0x3f, 0x95, 0x83, - 0x4b, 0xd9, 0x9f, 0x4b, 0x3e, 0x05, 0x03, 0x6c, 0xab, 0x5f, 0xd6, 0x16, 0x85, 0x2c, 0x79, 0xd2, - 0x5d, 0xbb, 0x45, 0xeb, 0xba, 0x23, 0xef, 0x1e, 0x7c, 0x32, 0xf2, 0x36, 0x0c, 0x57, 0x5d, 0xb7, - 0x4b, 0x9d, 0xda, 0xcb, 0xf7, 0xb4, 0xaa, 0xd8, 0x64, 0xe2, 0x26, 0xc6, 0x44, 0x70, 0xdd, 0x7d, - 0x39, 0x16, 0xa9, 0x4b, 0xa6, 0x57, 0x7f, 0x3c, 0x07, 0x97, 0x7b, 0x89, 0x89, 0xbc, 0x0c, 0x83, - 0x2b, 0xd4, 0xd2, 0x2d, 0xaf, 0x5a, 0x11, 0x4d, 0xc2, 0x3d, 0x9b, 0x87, 0xb0, 0xe8, 0xd6, 0x23, - 0x20, 0x64, 0x85, 0xf8, 0x41, 0x65, 0xe0, 0x19, 0xc1, 0x0f, 0x55, 0x11, 0x16, 0x2b, 0xe4, 0x13, - 0xaa, 0x5f, 0x80, 0x8b, 0x99, 0x52, 0x25, 0x9f, 0x81, 0x91, 0x25, 0xa7, 0xa9, 0x5b, 0xe6, 0x07, - 0x7c, 0x50, 0xe4, 0xc2, 0x7d, 0xb1, 0x2d, 0xc1, 0xe5, 0xbd, 0x9a, 0x4c, 0xaf, 0xfe, 0x7e, 0x1e, - 0x46, 0x96, 0x5b, 0xdd, 0xa6, 0x29, 0x2d, 0x73, 0xfb, 0xde, 0x1d, 0xf8, 0xb6, 0x7a, 0x7e, 0x6f, - 0xb6, 0x3a, 0x9b, 0x1c, 0x9c, 0x7d, 0x4e, 0x0e, 0x7e, 0x39, 0xf2, 0x16, 0x94, 0x3a, 0xf8, 0x1d, - 0xf1, 0x73, 0x63, 0xfe, 0x75, 0x59, 0xe7, 0xc6, 0xbc, 0x0c, 0x9b, 0x0d, 0x1a, 0x07, 0x98, 0x0d, - 0xc2, 0xb2, 0x92, 0x40, 0xc3, 0x25, 0xed, 0x44, 0xa0, 0x87, 0x22, 0xd0, 0x70, 0xf9, 0x3a, 0x11, - 0xe8, 0x01, 0x04, 0xfa, 0xab, 0x79, 0x18, 0x8b, 0x56, 0x49, 0x3e, 0x05, 0xc3, 0xbc, 0x1a, 0x7e, - 0x8a, 0x95, 0x93, 0x5c, 0xa0, 0x43, 0xb0, 0x06, 0xfc, 0x87, 0x38, 0x8e, 0x3b, 0xb5, 0xae, 0xbb, - 0xf5, 0xf0, 0x3c, 0x89, 0xdf, 0x36, 0x0f, 0x72, 0xbf, 0xad, 0x18, 0x4a, 0x1b, 0x5b, 0xd7, 0xdd, - 0xe9, 0xf0, 0x37, 0x99, 0x01, 0xe2, 0xd0, 0xae, 0x4b, 0xa3, 0x0c, 0x8a, 0xc8, 0x40, 0xa4, 0x53, - 0x8f, 0x63, 0xb5, 0xd3, 0x1c, 0x26, 0xb3, 0xf9, 0x62, 0xd0, 0x6c, 0x54, 0x86, 0xfe, 0x5d, 0xe4, - 0x7a, 0x97, 0xe8, 0xd3, 0x0f, 0x65, 0x39, 0x41, 0x45, 0xf7, 0x74, 0x7e, 0x84, 0xe0, 0x77, 0x80, - 0xfa, 0x23, 0x1d, 0xe8, 0x5f, 0xb2, 0xe8, 0xd2, 0x1a, 0x79, 0x09, 0x86, 0x98, 0xc2, 0xcc, 0xdb, - 0xac, 0x2f, 0x73, 0xc2, 0xdb, 0x43, 0xd2, 0x24, 0x44, 0xcc, 0xf5, 0x69, 0x21, 0x15, 0xb9, 0x05, - 0x10, 0x3e, 0x88, 0x13, 0xda, 0x47, 0xe4, 0x32, 0x1c, 0x33, 0xd7, 0xa7, 0x49, 0x74, 0x7e, 0x29, - 0xf1, 0x9c, 0xa8, 0x90, 0x2c, 0xc5, 0x31, 0x7e, 0x29, 0x31, 0x3e, 0xe6, 0x81, 0xb0, 0x5f, 0xcb, - 0xba, 0xeb, 0x6e, 0xd8, 0x8e, 0x31, 0xbd, 0xae, 0x5b, 0x4d, 0x1a, 0xdf, 0xeb, 0x25, 0x29, 0xe6, - 0xfa, 0xb4, 0x94, 0x72, 0xe4, 0x0d, 0x18, 0x91, 0xdd, 0x5f, 0xe3, 0x2e, 0x2a, 0x32, 0x6e, 0xae, - 0x4f, 0x8b, 0xd0, 0x92, 0xd7, 0x60, 0x58, 0xfc, 0xbe, 0x63, 0x8b, 0xfb, 0x6f, 0x29, 0x72, 0x92, - 0x84, 0x9a, 0xeb, 0xd3, 0x64, 0x4a, 0xa9, 0xd2, 0x65, 0xc7, 0xb4, 0x3c, 0xf1, 0xa2, 0x3a, 0x5e, - 0x29, 0xe2, 0xa4, 0x4a, 0xf1, 0x37, 0x79, 0x1b, 0x46, 0x83, 0x90, 0x54, 0xef, 0xd3, 0x86, 0x27, - 0x8e, 0xea, 0xcf, 0xc5, 0x0a, 0x73, 0xe4, 0x5c, 0x9f, 0x16, 0xa5, 0x26, 0xd7, 0xa0, 0xa4, 0x51, - 0xd7, 0xfc, 0xc0, 0xbf, 0xdc, 0x1e, 0x93, 0xc6, 0xb9, 0xf9, 0x01, 0x93, 0x92, 0xc0, 0xb3, 0xde, - 0x09, 0x6f, 0xd3, 0xc5, 0xc1, 0x3a, 0x89, 0xd5, 0x32, 0x63, 0x19, 0xac, 0x77, 0x24, 0x57, 0x8a, - 0xcf, 0x86, 0x81, 0xba, 0x44, 0x8a, 0xd9, 0xe1, 0x78, 0x44, 0x04, 0x19, 0x3b, 0xd7, 0xa7, 0xc5, - 0xe8, 0x25, 0xa9, 0x56, 0x4c, 0xf7, 0xa1, 0x88, 0x8d, 0x1a, 0x97, 0x2a, 0x43, 0x49, 0x52, 0x65, - 0x3f, 0xa5, 0xaa, 0x17, 0xa9, 0xb7, 0x61, 0x3b, 0x0f, 0x45, 0x24, 0xd4, 0x78, 0xd5, 0x02, 0x2b, - 0x55, 0x2d, 0x20, 0x72, 0xd5, 0x6c, 0xc0, 0x8d, 0xa5, 0x57, 0xad, 0x7b, 0xba, 0x5c, 0x35, 0x3f, - 0x37, 0xf4, 0x3b, 0x69, 0x9e, 0xea, 0x8f, 0x78, 0xa6, 0xff, 0x64, 0x87, 0x22, 0x4e, 0xea, 0x50, - 0xfc, 0xcd, 0x2a, 0x95, 0xb2, 0xb9, 0x8b, 0x54, 0xfe, 0x41, 0xa5, 0x12, 0x8a, 0x55, 0x2a, 0xe7, - 0x7d, 0xbf, 0x25, 0x27, 0x39, 0x57, 0x4e, 0x47, 0x3b, 0x28, 0xc4, 0xb0, 0x0e, 0x92, 0x92, 0xa1, - 0x4f, 0x60, 0x02, 0x65, 0x85, 0x20, 0xf9, 0x70, 0xd0, 0xc2, 0xe9, 0xe5, 0xb9, 0x3e, 0x0d, 0x53, - 0x2b, 0xab, 0x3c, 0x35, 0xb7, 0x72, 0x06, 0x29, 0x46, 0x7c, 0x0a, 0x06, 0x9b, 0xeb, 0xd3, 0x78, - 0xda, 0xee, 0x97, 0xa4, 0xf4, 0x85, 0xca, 0xd9, 0xe8, 0x14, 0x11, 0x20, 0xd8, 0x14, 0x11, 0x26, - 0x39, 0x9c, 0x4d, 0x26, 0xe9, 0x53, 0xce, 0x45, 0x97, 0x9a, 0x38, 0x7e, 0xae, 0x4f, 0x4b, 0x26, - 0xf6, 0x7b, 0x2d, 0x92, 0xb7, 0x4e, 0x39, 0x1f, 0x0b, 0x57, 0x16, 0xa2, 0x98, 0xb8, 0xe4, 0x0c, - 0x77, 0x4b, 0xb1, 0x3c, 0xff, 0x62, 0xb2, 0xba, 0x10, 0xdd, 0x66, 0xa5, 0x90, 0xcc, 0xf5, 0x69, - 0x69, 0x25, 0xc9, 0x74, 0x22, 0x7b, 0x9c, 0xa2, 0x44, 0x3d, 0x79, 0x62, 0xe8, 0xb9, 0x3e, 0x2d, - 0x91, 0x6f, 0xee, 0x96, 0x9c, 0xb6, 0x4d, 0xb9, 0x18, 0xed, 0xc4, 0x10, 0xc3, 0x3a, 0x51, 0x4a, - 0xef, 0x76, 0x4b, 0x4e, 0xe5, 0xa5, 0x5c, 0x4a, 0x96, 0x0a, 0x67, 0x4e, 0x29, 0xe5, 0x97, 0x96, - 0x9e, 0x9d, 0x48, 0x79, 0x4a, 0xe4, 0x28, 0x16, 0xe5, 0xd3, 0x68, 0xe6, 0xfa, 0xb4, 0xf4, 0xcc, - 0x46, 0x5a, 0x7a, 0x5a, 0x1f, 0xe5, 0x72, 0x2f, 0x9e, 0x41, 0xeb, 0xd2, 0x53, 0x02, 0xe9, 0x3d, - 0x92, 0xac, 0x28, 0x4f, 0x47, 0x37, 0x64, 0x99, 0x84, 0x73, 0x7d, 0x5a, 0x8f, 0x54, 0x2d, 0xf7, - 0x32, 0x32, 0x9e, 0x28, 0x57, 0xa2, 0x29, 0xca, 0x53, 0x89, 0xe6, 0xfa, 0xb4, 0x8c, 0x7c, 0x29, - 0xf7, 0x32, 0x12, 0x62, 0x28, 0x13, 0x3d, 0xd9, 0x06, 0xf2, 0xc8, 0x48, 0xa7, 0xb1, 0x94, 0x9a, - 0x4b, 0x42, 0x79, 0x26, 0xaa, 0xba, 0x29, 0x24, 0x4c, 0x75, 0xd3, 0xb2, 0x50, 0x2c, 0xa5, 0x26, - 0x3f, 0x50, 0x9e, 0xed, 0xc1, 0x30, 0x68, 0x63, 0x6a, 0xda, 0x84, 0xa5, 0xd4, 0xec, 0x03, 0x8a, - 0x1a, 0x65, 0x98, 0x42, 0xc2, 0x18, 0xa6, 0xe5, 0x2d, 0x58, 0x4a, 0x0d, 0x52, 0xaf, 0x3c, 0xd7, - 0x83, 0x61, 0xd8, 0xc2, 0xb4, 0xf0, 0xf6, 0xaf, 0x45, 0xa2, 0xc4, 0x2b, 0x1f, 0x8b, 0xce, 0x1b, - 0x12, 0x8a, 0xcd, 0x1b, 0x72, 0x3c, 0xf9, 0xe9, 0x44, 0x1c, 0x5c, 0xe5, 0xe3, 0xd1, 0x61, 0x1e, - 0x43, 0xb3, 0x61, 0x1e, 0x8f, 0x9c, 0x3b, 0x9d, 0x88, 0x07, 0xaa, 0x5c, 0xcd, 0x62, 0x82, 0xe8, - 0x28, 0x13, 0x1e, 0x41, 0xb4, 0x9a, 0x12, 0x90, 0x52, 0xf9, 0x44, 0xd4, 0x0b, 0x3d, 0x41, 0x30, - 0xd7, 0xa7, 0xa5, 0x84, 0xb1, 0xd4, 0xd2, 0xa3, 0x2f, 0x29, 0xd7, 0xa2, 0xc3, 0x36, 0x8d, 0x86, - 0x0d, 0xdb, 0xd4, 0xc8, 0x4d, 0xf3, 0x69, 0x4f, 0x65, 0x94, 0xeb, 0x51, 0xc3, 0x2c, 0x49, 0xc1, - 0x0c, 0xb3, 0x94, 0x27, 0x36, 0x5a, 0x7a, 0x44, 0x20, 0xe5, 0xf9, 0x9e, 0x2d, 0x44, 0x9a, 0x94, - 0x16, 0xf2, 0x00, 0x39, 0xa1, 0xed, 0x74, 0xaf, 0xd3, 0xb2, 0x75, 0x43, 0xf9, 0x64, 0xaa, 0xed, - 0xc4, 0x91, 0x92, 0xed, 0xc4, 0x01, 0x6c, 0x95, 0x97, 0x5f, 0x64, 0x28, 0x2f, 0x44, 0x57, 0x79, - 0x19, 0xc7, 0x56, 0xf9, 0xc8, 0xeb, 0x8d, 0xe9, 0xc4, 0xeb, 0x05, 0xe5, 0xc5, 0xa8, 0x02, 0xc4, - 0xd0, 0x4c, 0x01, 0xe2, 0xef, 0x1d, 0xbe, 0x94, 0xed, 0xef, 0xaf, 0x4c, 0x22, 0xb7, 0x67, 0x7c, - 0x6e, 0x59, 0x74, 0x73, 0x7d, 0x5a, 0xf6, 0x9b, 0x81, 0x6a, 0x8a, 0xfb, 0xbe, 0x72, 0x23, 0xaa, - 0x60, 0x09, 0x02, 0xa6, 0x60, 0x49, 0xa7, 0xff, 0x6a, 0x8a, 0xff, 0xbd, 0xf2, 0xa9, 0x4c, 0x56, - 0xc1, 0x37, 0xa7, 0x78, 0xed, 0xdf, 0x92, 0x1d, 0xe8, 0x95, 0x97, 0xa2, 0x8b, 0x5d, 0x88, 0x61, - 0x8b, 0x9d, 0xe4, 0x68, 0x7f, 0x4b, 0x76, 0x1d, 0x57, 0x6e, 0x26, 0x4b, 0x85, 0x4b, 0xa4, 0xe4, - 0x62, 0xae, 0xa5, 0x7b, 0x5c, 0x2b, 0x2f, 0x47, 0xb5, 0x2e, 0x8d, 0x86, 0x69, 0x5d, 0xaa, 0xb7, - 0xf6, 0x6c, 0xd2, 0x71, 0x5a, 0xb9, 0x15, 0xdf, 0x64, 0x47, 0xf1, 0xcc, 0xf2, 0x49, 0x38, 0x5b, - 0x7f, 0x36, 0x1e, 0x1a, 0x50, 0x79, 0x25, 0x76, 0x49, 0x1d, 0xc1, 0x32, 0xfb, 0x36, 0x16, 0x4a, - 0xf0, 0xb3, 0xf1, 0x68, 0x7a, 0xca, 0xab, 0xe9, 0x1c, 0x02, 0x5d, 0x89, 0x47, 0xdf, 0xfb, 0x6c, - 0x3c, 0x00, 0x9d, 0xf2, 0x5a, 0x3a, 0x87, 0x40, 0xba, 0xf1, 0x80, 0x75, 0x2f, 0x49, 0x21, 0xf1, - 0x95, 0x4f, 0x47, 0x4d, 0xc7, 0x00, 0xc1, 0x4c, 0xc7, 0x30, 0x70, 0xfe, 0x4b, 0x52, 0x28, 0x79, - 0xe5, 0xf5, 0x44, 0x91, 0xa0, 0xb1, 0x52, 0xc0, 0xf9, 0x97, 0xa4, 0x10, 0xec, 0xca, 0x1b, 0x89, - 0x22, 0x41, 0xeb, 0xa4, 0x40, 0xed, 0x46, 0xaf, 0xd7, 0xb6, 0xca, 0x9b, 0xd1, 0xa3, 0xeb, 0x6c, - 0xca, 0xb9, 0x3e, 0xad, 0xd7, 0xab, 0xdd, 0x2f, 0x65, 0xbb, 0xa1, 0x2b, 0x6f, 0x45, 0x87, 0x70, - 0x16, 0x1d, 0x1b, 0xc2, 0x99, 0xae, 0xec, 0x6f, 0xc7, 0x22, 0x6f, 0x28, 0x6f, 0x47, 0xa7, 0xb8, - 0x08, 0x92, 0x4d, 0x71, 0xf1, 0x38, 0x1d, 0x91, 0x90, 0x12, 0xca, 0x67, 0xa2, 0x53, 0x9c, 0x8c, - 0x63, 0x53, 0x5c, 0x24, 0xfc, 0xc4, 0x74, 0x22, 0xd2, 0x81, 0xf2, 0x4e, 0x74, 0x8a, 0x8b, 0xa1, - 0xd9, 0x14, 0x17, 0x8f, 0x8d, 0xf0, 0x76, 0xec, 0xc1, 0xbf, 0xf2, 0xd9, 0xf4, 0xf6, 0x23, 0x52, - 0x6e, 0x3f, 0x0f, 0x0f, 0xa0, 0xa5, 0xbf, 0x5c, 0x57, 0xca, 0xd1, 0xf1, 0x9b, 0x46, 0xc3, 0xc6, - 0x6f, 0xea, 0xab, 0xf7, 0xf8, 0xc6, 0x41, 0x68, 0xd5, 0x54, 0x8f, 0x8d, 0x43, 0x68, 0x8a, 0xa4, - 0x80, 0x23, 0x7b, 0x64, 0xbe, 0x11, 0x9a, 0xce, 0xd8, 0x23, 0xfb, 0xdb, 0xa0, 0x18, 0x3d, 0x9b, - 0x5d, 0x13, 0x5e, 0xd1, 0x4a, 0x25, 0x3a, 0xbb, 0x26, 0x08, 0xd8, 0xec, 0x9a, 0xf4, 0xa5, 0x9e, - 0x85, 0x71, 0xa1, 0x45, 0xdc, 0xd9, 0xdb, 0xb4, 0x9a, 0xca, 0x4c, 0xec, 0x75, 0x68, 0x0c, 0xcf, - 0x66, 0xa7, 0x38, 0x0c, 0xd7, 0x6b, 0x0e, 0x9b, 0x6e, 0x99, 0x9d, 0x55, 0x5b, 0x77, 0x8c, 0x1a, - 0xb5, 0x0c, 0x65, 0x36, 0xb6, 0x5e, 0xa7, 0xd0, 0xe0, 0x7a, 0x9d, 0x02, 0xc7, 0x80, 0x76, 0x31, - 0xb8, 0x46, 0x1b, 0xd4, 0x7c, 0x44, 0x95, 0xdb, 0xc8, 0x76, 0x22, 0x8b, 0xad, 0x20, 0x9b, 0xeb, - 0xd3, 0xb2, 0x38, 0x30, 0x5b, 0x7d, 0x61, 0xb3, 0xf6, 0xee, 0x7c, 0x10, 0x2c, 0x61, 0xd9, 0xa1, - 0x1d, 0xdd, 0xa1, 0xca, 0x5c, 0xd4, 0x56, 0x4f, 0x25, 0x62, 0xb6, 0x7a, 0x2a, 0x22, 0xc9, 0xd6, - 0x1f, 0x0b, 0xd5, 0x5e, 0x6c, 0xc3, 0x11, 0x91, 0x5e, 0x9a, 0xcd, 0x4e, 0x51, 0x04, 0x13, 0xd0, - 0xbc, 0x6d, 0x35, 0xf1, 0xa4, 0xe2, 0x4e, 0x74, 0x76, 0xca, 0xa6, 0x64, 0xb3, 0x53, 0x36, 0x96, - 0xa9, 0x7a, 0x14, 0xcb, 0xc7, 0xe0, 0xdd, 0xa8, 0xaa, 0xa7, 0x90, 0x30, 0x55, 0x4f, 0x01, 0x27, - 0x19, 0x6a, 0xd4, 0xa5, 0x9e, 0x32, 0xdf, 0x8b, 0x21, 0x92, 0x24, 0x19, 0x22, 0x38, 0xc9, 0x70, - 0x96, 0x7a, 0x8d, 0x75, 0x65, 0xa1, 0x17, 0x43, 0x24, 0x49, 0x32, 0x44, 0x30, 0xdb, 0x6c, 0x46, - 0xc1, 0x53, 0xdd, 0xd6, 0x43, 0xbf, 0xcf, 0x16, 0xa3, 0x9b, 0xcd, 0x4c, 0x42, 0xb6, 0xd9, 0xcc, - 0x44, 0x92, 0x1f, 0xdf, 0xb5, 0xd7, 0xbe, 0xb2, 0x84, 0x15, 0x4e, 0x86, 0x76, 0xc1, 0x6e, 0x4a, - 0xcd, 0xf5, 0x69, 0xbb, 0x7d, 0x15, 0xf0, 0xc9, 0xc0, 0xc5, 0x55, 0x59, 0xc6, 0xaa, 0x4e, 0x05, - 0x67, 0x15, 0x1c, 0x3c, 0xd7, 0xa7, 0x05, 0x4e, 0xb0, 0xaf, 0xc1, 0x30, 0x7e, 0x54, 0xd5, 0x32, - 0xbd, 0xca, 0x94, 0xf2, 0x6e, 0x74, 0xcb, 0x24, 0xa1, 0xd8, 0x96, 0x49, 0xfa, 0xc9, 0x26, 0x71, - 0xfc, 0xc9, 0xa7, 0x98, 0xca, 0x94, 0xa2, 0x45, 0x27, 0xf1, 0x08, 0x92, 0x4d, 0xe2, 0x11, 0x40, - 0x50, 0x6f, 0xc5, 0xb1, 0x3b, 0x95, 0x29, 0xa5, 0x96, 0x52, 0x2f, 0x47, 0x05, 0xf5, 0xf2, 0x9f, - 0x41, 0xbd, 0xb5, 0xf5, 0xae, 0x57, 0x61, 0xdf, 0xb8, 0x92, 0x52, 0xaf, 0x8f, 0x0c, 0xea, 0xf5, - 0x01, 0x6c, 0x2a, 0x44, 0xc0, 0xb2, 0x63, 0xb3, 0x49, 0xfb, 0xae, 0xd9, 0x6a, 0x29, 0xf7, 0xa2, - 0x53, 0x61, 0x1c, 0xcf, 0xa6, 0xc2, 0x38, 0x8c, 0x99, 0x9e, 0xbc, 0x55, 0x74, 0xb5, 0xdb, 0x54, - 0xee, 0x47, 0x4d, 0xcf, 0x10, 0xc3, 0x4c, 0xcf, 0xf0, 0x17, 0xee, 0x2e, 0xd8, 0x2f, 0x8d, 0xae, - 0x39, 0xd4, 0x5d, 0x57, 0x1e, 0xc4, 0x76, 0x17, 0x12, 0x0e, 0x77, 0x17, 0xd2, 0x6f, 0xd2, 0x84, - 0xa7, 0x22, 0x0b, 0x8d, 0x7f, 0x69, 0x53, 0xa3, 0xba, 0xd3, 0x58, 0x57, 0x3e, 0x87, 0xac, 0x9e, - 0x4b, 0x5d, 0xaa, 0xa2, 0xa4, 0x73, 0x7d, 0x5a, 0x2f, 0x4e, 0xb8, 0x2d, 0x7f, 0x77, 0x9e, 0xc7, - 0xad, 0xd5, 0x96, 0xa7, 0xfd, 0x4d, 0xe8, 0x7b, 0xb1, 0x6d, 0x79, 0x92, 0x04, 0xb7, 0xe5, 0x49, - 0x30, 0xe9, 0xc0, 0x95, 0xd8, 0x56, 0x6d, 0x41, 0x6f, 0xb1, 0x7d, 0x09, 0x35, 0x96, 0xf5, 0xc6, - 0x43, 0xea, 0x29, 0x9f, 0x47, 0xde, 0x57, 0x33, 0x36, 0x7c, 0x31, 0xea, 0xb9, 0x3e, 0x6d, 0x07, - 0x7e, 0x44, 0x85, 0x62, 0x6d, 0x76, 0x65, 0x59, 0xf9, 0x42, 0xf4, 0x7c, 0x93, 0xc1, 0xe6, 0xfa, - 0x34, 0xc4, 0x31, 0x2b, 0xed, 0x5e, 0xa7, 0xe9, 0xe8, 0x06, 0xe5, 0x86, 0x16, 0xda, 0x6e, 0xc2, - 0x00, 0xfd, 0x81, 0xa8, 0x95, 0x96, 0x45, 0xc7, 0xac, 0xb4, 0x2c, 0x1c, 0x53, 0xd4, 0x48, 0x8a, - 0x16, 0xe5, 0x8b, 0x51, 0x45, 0x8d, 0x20, 0x99, 0xa2, 0x46, 0x13, 0xba, 0x7c, 0x0e, 0xce, 0x07, - 0xfb, 0x79, 0xb1, 0xfe, 0xf2, 0x4e, 0x53, 0xbe, 0x84, 0x7c, 0xae, 0x24, 0x2e, 0x03, 0x22, 0x54, - 0x73, 0x7d, 0x5a, 0x46, 0x79, 0xb6, 0xe2, 0x26, 0xb2, 0x8f, 0x09, 0xf3, 0xe2, 0x07, 0xa3, 0x2b, - 0x6e, 0x06, 0x19, 0x5b, 0x71, 0x33, 0x50, 0xa9, 0xcc, 0x85, 0x50, 0xf5, 0x1d, 0x98, 0x07, 0x32, - 0xcd, 0xe2, 0x90, 0xca, 0x5c, 0x58, 0x6a, 0xab, 0x3b, 0x30, 0x0f, 0xac, 0xb5, 0x2c, 0x0e, 0xe4, - 0x1a, 0x94, 0x6a, 0xb5, 0x05, 0xad, 0x6b, 0x29, 0x8d, 0x98, 0x6f, 0x2f, 0x42, 0xe7, 0xfa, 0x34, - 0x81, 0x67, 0x66, 0xd0, 0x4c, 0x4b, 0x77, 0x3d, 0xb3, 0xe1, 0xe2, 0x88, 0xf1, 0x47, 0x88, 0x11, - 0x35, 0x83, 0xd2, 0x68, 0x98, 0x19, 0x94, 0x06, 0x67, 0xf6, 0xe2, 0xb4, 0xee, 0xba, 0xba, 0x65, - 0x38, 0xfa, 0x14, 0x2e, 0x13, 0x34, 0xf6, 0x76, 0x2c, 0x82, 0x65, 0xf6, 0x62, 0x14, 0x82, 0x87, - 0xef, 0x3e, 0xc4, 0x37, 0x73, 0xd6, 0x62, 0x87, 0xef, 0x31, 0x3c, 0x1e, 0xbe, 0xc7, 0x60, 0x68, - 0x77, 0xfa, 0x30, 0x8d, 0x36, 0x4d, 0x26, 0x22, 0xa5, 0x19, 0xb3, 0x3b, 0xe3, 0x04, 0x68, 0x77, - 0xc6, 0x81, 0x91, 0x26, 0xf9, 0xcb, 0xed, 0x7a, 0x46, 0x93, 0xc2, 0x55, 0x36, 0x51, 0x86, 0xad, - 0xdf, 0xe1, 0xe0, 0xa8, 0x6c, 0x5a, 0x7a, 0xdb, 0xae, 0x4c, 0xf9, 0x52, 0x37, 0xa3, 0xeb, 0x77, - 0x26, 0x21, 0x5b, 0xbf, 0x33, 0x91, 0x6c, 0x76, 0xf5, 0x37, 0x5a, 0xeb, 0xba, 0x43, 0x8d, 0x8a, - 0xe9, 0xe0, 0xc9, 0xe2, 0x26, 0xdf, 0x1a, 0xbe, 0x1f, 0x9d, 0x5d, 0x7b, 0x90, 0xb2, 0xd9, 0xb5, - 0x07, 0x9a, 0x19, 0x79, 0xe9, 0x68, 0x8d, 0xea, 0x86, 0xf2, 0x30, 0x6a, 0xe4, 0x65, 0x53, 0x32, - 0x23, 0x2f, 0x1b, 0x9b, 0xfd, 0x39, 0x0f, 0x1c, 0xd3, 0xa3, 0x4a, 0x6b, 0x37, 0x9f, 0x83, 0xa4, - 0xd9, 0x9f, 0x83, 0x68, 0xb6, 0x21, 0x8c, 0x77, 0x48, 0x3b, 0xba, 0x21, 0x4c, 0x76, 0x43, 0xbc, - 0x04, 0xb3, 0x58, 0xc4, 0x13, 0x42, 0xc5, 0x8a, 0x5a, 0x2c, 0x02, 0xcc, 0x2c, 0x96, 0xf0, 0x91, - 0x61, 0xe4, 0xe1, 0x98, 0x62, 0x47, 0xd7, 0x50, 0x19, 0xc7, 0xd6, 0xd0, 0xc8, 0x23, 0xb3, 0xd7, - 0x22, 0xaf, 0x22, 0x94, 0x4e, 0xd4, 0xea, 0x90, 0x50, 0xcc, 0xea, 0x90, 0xdf, 0x4f, 0x4c, 0xc3, - 0x29, 0xbc, 0x05, 0xd7, 0xba, 0xc1, 0x3d, 0xce, 0x0f, 0x45, 0x3f, 0x33, 0x86, 0x66, 0x9f, 0x19, - 0x03, 0x45, 0x98, 0x88, 0x69, 0xcb, 0xc9, 0x60, 0x12, 0x9e, 0x0f, 0xc6, 0x40, 0x64, 0x1e, 0x48, - 0xad, 0xbc, 0x30, 0x5f, 0x35, 0x96, 0xe5, 0x2b, 0x32, 0x37, 0x7a, 0x02, 0x9b, 0xa4, 0x98, 0xeb, - 0xd3, 0x52, 0xca, 0x91, 0xf7, 0xe1, 0xb2, 0x80, 0x8a, 0xf7, 0xe1, 0xcb, 0x8e, 0xfd, 0xc8, 0x34, - 0x82, 0x05, 0xc1, 0x8b, 0x7a, 0xdd, 0xf5, 0xa2, 0x9d, 0xeb, 0xd3, 0x7a, 0xf2, 0xca, 0xae, 0x4b, - 0xac, 0x0f, 0xdd, 0xdd, 0xd4, 0x15, 0x2c, 0x12, 0x3d, 0x79, 0x65, 0xd7, 0x25, 0xe4, 0xfe, 0x68, - 0x37, 0x75, 0x05, 0x9d, 0xd0, 0x93, 0x17, 0x71, 0x61, 0xa2, 0x17, 0xbe, 0xdc, 0x6a, 0x29, 0x1b, - 0x58, 0xdd, 0x27, 0x76, 0x53, 0x5d, 0x19, 0x0d, 0xce, 0x9d, 0x38, 0xb2, 0x59, 0x7a, 0xa9, 0x43, - 0xad, 0x5a, 0x64, 0x01, 0x7a, 0x1c, 0x9d, 0xa5, 0x13, 0x04, 0x6c, 0x96, 0x4e, 0x00, 0xd9, 0x80, - 0x92, 0x1f, 0xd7, 0x28, 0x9b, 0xd1, 0x01, 0x25, 0xe3, 0xd8, 0x80, 0x8a, 0x3c, 0xc4, 0x59, 0x82, - 0x33, 0x4b, 0x0f, 0x3d, 0xdd, 0xb7, 0x20, 0x5d, 0xd1, 0x95, 0x1f, 0xc4, 0x2e, 0x99, 0x92, 0x24, - 0x78, 0xc9, 0x94, 0x04, 0xb3, 0x31, 0xc2, 0xc0, 0xb5, 0x4d, 0xab, 0x31, 0xab, 0x9b, 0xad, 0xae, - 0x43, 0x95, 0x7f, 0x23, 0x3a, 0x46, 0x62, 0x68, 0x36, 0x46, 0x62, 0x20, 0xb6, 0x40, 0x33, 0x50, - 0xd9, 0x75, 0xcd, 0xa6, 0x25, 0xf6, 0x95, 0xdd, 0x96, 0xa7, 0xfc, 0x9b, 0xd1, 0x05, 0x3a, 0x8d, - 0x86, 0x2d, 0xd0, 0x69, 0x70, 0x3c, 0x75, 0x62, 0xbd, 0xc0, 0x16, 0x0f, 0xf9, 0xae, 0xf2, 0xdf, - 0x8a, 0x9d, 0x3a, 0xa5, 0xd0, 0xe0, 0xa9, 0x53, 0x0a, 0x9c, 0xad, 0x8f, 0xdc, 0x26, 0x9b, 0x37, - 0x83, 0xbb, 0xea, 0x7f, 0x3b, 0xba, 0x3e, 0xc6, 0xf1, 0x6c, 0x7d, 0x8c, 0xc3, 0xa2, 0x7c, 0x44, - 0x17, 0xfc, 0x3b, 0x59, 0x7c, 0x02, 0xf9, 0x27, 0xca, 0x90, 0xdb, 0x32, 0x1f, 0x31, 0x52, 0x7e, - 0x38, 0x97, 0xc5, 0x28, 0x18, 0x1e, 0x89, 0x42, 0x51, 0x46, 0x1a, 0x7d, 0x64, 0xd2, 0x0d, 0xe5, - 0xcb, 0x99, 0x8c, 0x38, 0x41, 0x94, 0x11, 0x87, 0x91, 0xf7, 0xe0, 0x7c, 0x08, 0x5b, 0xa0, 0xed, - 0xd5, 0x60, 0x66, 0xfa, 0x91, 0x5c, 0xd4, 0x0c, 0x4e, 0x27, 0x63, 0x66, 0x70, 0x3a, 0x26, 0x8d, - 0xb5, 0x10, 0xdd, 0xbf, 0xbb, 0x03, 0xeb, 0x40, 0x82, 0x19, 0x0c, 0xd2, 0x58, 0x0b, 0x69, 0xfe, - 0xe8, 0x0e, 0xac, 0x03, 0x99, 0x66, 0x30, 0x20, 0x3f, 0x91, 0x83, 0xab, 0xe9, 0xa8, 0x72, 0xab, - 0x35, 0x6b, 0x3b, 0x21, 0x4e, 0xf9, 0x33, 0xb9, 0xe8, 0x41, 0xc3, 0xee, 0x8a, 0xcd, 0xf5, 0x69, - 0xbb, 0xac, 0x80, 0x7c, 0x06, 0x46, 0xcb, 0x5d, 0xc3, 0xf4, 0xf0, 0xe2, 0x8d, 0x19, 0xce, 0x3f, - 0x96, 0x8b, 0x6d, 0x71, 0x64, 0x2c, 0x6e, 0x71, 0x64, 0x00, 0xb9, 0x03, 0xa7, 0x6b, 0xb4, 0xd1, - 0x75, 0x4c, 0x6f, 0x53, 0xa3, 0x1d, 0xdb, 0xf1, 0x18, 0x8f, 0x3f, 0x9b, 0x8b, 0x4e, 0x62, 0x09, - 0x0a, 0x36, 0x89, 0x25, 0x80, 0xe4, 0x7e, 0xe2, 0x56, 0x5e, 0x74, 0xe6, 0x8f, 0xe7, 0x7a, 0x5e, - 0xcb, 0x07, 0x7d, 0x99, 0x5e, 0x9c, 0x2c, 0xc7, 0x6e, 0xd1, 0x05, 0xd7, 0x9f, 0xc8, 0xf5, 0xb8, - 0x46, 0x97, 0x66, 0xb8, 0x24, 0x98, 0x71, 0x4c, 0xc9, 0x57, 0xaf, 0xfc, 0xb9, 0x5c, 0x8f, 0x6b, - 0xef, 0x90, 0x63, 0x5a, 0xaa, 0xfb, 0x57, 0xb8, 0xa7, 0x88, 0x60, 0xf4, 0x93, 0xb9, 0xa4, 0xab, - 0x48, 0x50, 0x5e, 0x22, 0x64, 0xc5, 0xee, 0xb9, 0x81, 0xd2, 0x7f, 0x25, 0x97, 0xf4, 0xcd, 0x0b, - 0x8b, 0x85, 0xbf, 0x08, 0x85, 0x4b, 0x33, 0x8f, 0x3d, 0xea, 0x58, 0x7a, 0x0b, 0xbb, 0xb3, 0xe6, - 0xd9, 0x8e, 0xde, 0xa4, 0x33, 0x96, 0xbe, 0xda, 0xa2, 0xca, 0x4f, 0xe5, 0xa2, 0x16, 0x6c, 0x36, - 0x29, 0xb3, 0x60, 0xb3, 0xb1, 0x64, 0x1d, 0x9e, 0x4a, 0xc3, 0x56, 0x4c, 0x17, 0xeb, 0xf9, 0x6a, - 0x2e, 0x6a, 0xc2, 0xf6, 0xa0, 0x65, 0x26, 0x6c, 0x0f, 0x34, 0xb9, 0x09, 0x43, 0x53, 0xb6, 0x3f, - 0xfd, 0xfe, 0xf9, 0x98, 0x33, 0x64, 0x80, 0x99, 0xeb, 0xd3, 0x42, 0x32, 0x51, 0x46, 0x0c, 0xea, - 0xaf, 0x25, 0xcb, 0x84, 0x97, 0x4f, 0xc1, 0x0f, 0x51, 0x46, 0x88, 0xfb, 0xdf, 0x4b, 0x96, 0x09, - 0xef, 0xb8, 0x82, 0x1f, 0x6c, 0x26, 0xe1, 0x35, 0x2e, 0xcc, 0x96, 0x99, 0xdd, 0x36, 0xbd, 0xae, - 0xb7, 0x5a, 0xd4, 0x6a, 0x52, 0xe5, 0xeb, 0xb1, 0x99, 0x24, 0x9d, 0x8c, 0xcd, 0x24, 0xe9, 0x18, - 0xf2, 0x03, 0x70, 0xe1, 0xbe, 0xde, 0x32, 0x8d, 0x10, 0xe7, 0x67, 0x2f, 0x57, 0x7e, 0x3a, 0x17, - 0xdd, 0x4d, 0x67, 0xd0, 0xb1, 0xdd, 0x74, 0x06, 0x8a, 0x2c, 0x00, 0xc1, 0x65, 0x34, 0x98, 0x2d, - 0xd8, 0xfa, 0xac, 0xfc, 0xfb, 0xb9, 0xa8, 0x9d, 0x9a, 0x24, 0x61, 0x76, 0x6a, 0x12, 0x4a, 0xea, - 0xd9, 0x89, 0x4c, 0x94, 0x9f, 0xc9, 0x45, 0x4f, 0x6b, 0xb2, 0x08, 0xe7, 0xfa, 0xb4, 0xec, 0x6c, - 0x28, 0xb7, 0x61, 0xbc, 0xb6, 0x5c, 0x9d, 0x9d, 0x9d, 0xa9, 0xdd, 0xaf, 0x56, 0xf0, 0x15, 0x85, - 0xa1, 0xfc, 0x85, 0xd8, 0x8a, 0x15, 0x27, 0x60, 0x2b, 0x56, 0x1c, 0x46, 0xde, 0x84, 0x11, 0xd6, - 0x7e, 0x36, 0x60, 0xf0, 0x93, 0x7f, 0x36, 0x17, 0x35, 0xa7, 0x64, 0x24, 0x33, 0xa7, 0xe4, 0xdf, - 0xa4, 0x06, 0x67, 0x99, 0x14, 0x97, 0x1d, 0xba, 0x46, 0x1d, 0x6a, 0x35, 0xfc, 0x31, 0xfd, 0x73, - 0xb9, 0xa8, 0x95, 0x91, 0x46, 0xc4, 0xac, 0x8c, 0x34, 0x38, 0x79, 0x08, 0x97, 0xe3, 0x27, 0x41, - 0xf2, 0x23, 0x59, 0xe5, 0x2f, 0xe6, 0x62, 0xc6, 0x70, 0x0f, 0x62, 0x34, 0x86, 0x7b, 0xe0, 0x89, - 0x05, 0x4f, 0x8b, 0x63, 0x15, 0xe1, 0x70, 0x19, 0xaf, 0xed, 0x2f, 0xf1, 0xda, 0x3e, 0x1e, 0x3a, - 0x04, 0xf6, 0xa0, 0x9e, 0xeb, 0xd3, 0x7a, 0xb3, 0x63, 0x7a, 0x96, 0x4c, 0xd7, 0xa1, 0xfc, 0xe5, - 0x5c, 0xba, 0x47, 0x4a, 0xc4, 0x4d, 0x39, 0x2d, 0xcf, 0xc7, 0x7b, 0x59, 0xc9, 0x26, 0x94, 0xbf, - 0x12, 0x1b, 0x6f, 0xe9, 0x64, 0x6c, 0xbc, 0x65, 0x64, 0xab, 0xb8, 0x03, 0xa7, 0xb9, 0x52, 0x2f, - 0xeb, 0x38, 0x0c, 0xad, 0x26, 0x35, 0x94, 0xff, 0x20, 0xb6, 0xda, 0x25, 0x28, 0xd0, 0xb5, 0x27, - 0x0e, 0x64, 0x53, 0x77, 0xad, 0xa3, 0x5b, 0x16, 0x1e, 0xb3, 0x2a, 0xff, 0x61, 0x6c, 0xea, 0x0e, - 0x51, 0xe8, 0xb8, 0x1b, 0xfc, 0x62, 0x9a, 0xd0, 0x2b, 0x51, 0x93, 0xf2, 0x57, 0x63, 0x9a, 0xd0, - 0x8b, 0x98, 0x69, 0x42, 0xcf, 0xac, 0x4f, 0xf7, 0x33, 0x1e, 0xac, 0x2b, 0xdf, 0x88, 0xad, 0xc8, - 0xa9, 0x54, 0x6c, 0x45, 0x4e, 0x7f, 0xef, 0x7e, 0x3f, 0xe3, 0xb1, 0xb7, 0xf2, 0xf3, 0xbd, 0xf9, - 0x86, 0x2b, 0x7d, 0xfa, 0x5b, 0xf1, 0xfb, 0x19, 0x0f, 0xa5, 0x95, 0xbf, 0xd6, 0x9b, 0x6f, 0xe8, - 0xd8, 0x97, 0xfe, 0xce, 0xba, 0x9e, 0xfd, 0xc8, 0x58, 0xf9, 0xeb, 0xf1, 0xa9, 0x2b, 0x83, 0x10, - 0xa7, 0xae, 0xac, 0x97, 0xca, 0xab, 0x70, 0x91, 0x6b, 0xc8, 0x6d, 0x47, 0xef, 0xac, 0xd7, 0xa8, - 0xe7, 0x99, 0x56, 0xd3, 0xdf, 0x89, 0xfd, 0x8d, 0x5c, 0xec, 0x78, 0x2c, 0x8b, 0x12, 0x8f, 0xc7, - 0xb2, 0x90, 0x4c, 0x79, 0x13, 0xcf, 0x89, 0x95, 0xbf, 0x19, 0x53, 0xde, 0x04, 0x05, 0x53, 0xde, - 0xe4, 0x2b, 0xe4, 0x3b, 0x29, 0xaf, 0x66, 0x95, 0xff, 0x28, 0x9b, 0x57, 0xd0, 0xbe, 0x94, 0xc7, - 0xb6, 0x77, 0x52, 0x1e, 0x87, 0x2a, 0xff, 0x71, 0x36, 0xaf, 0xd0, 0x07, 0x29, 0xf9, 0xa6, 0xf4, - 0x3d, 0x38, 0xcf, 0x67, 0xf3, 0x59, 0x6a, 0xd0, 0xc8, 0x87, 0xfe, 0x42, 0x6c, 0xec, 0xa7, 0x93, - 0xe1, 0x91, 0x7b, 0x2a, 0x26, 0x8d, 0xb5, 0x68, 0xeb, 0xdf, 0xda, 0x81, 0x75, 0xb8, 0x21, 0x48, - 0xc7, 0xb0, 0xf5, 0x46, 0x7e, 0xfc, 0xa6, 0xfc, 0x62, 0x6c, 0xbd, 0x91, 0x91, 0xe8, 0xce, 0x21, - 0xbf, 0x94, 0x7b, 0x33, 0xfa, 0xd0, 0x4b, 0xf9, 0xdb, 0xa9, 0x85, 0x83, 0x0e, 0x88, 0xbe, 0x0a, - 0x7b, 0x33, 0xfa, 0xa8, 0x49, 0xf9, 0xa5, 0xd4, 0xc2, 0xc1, 0x07, 0x44, 0x5f, 0x40, 0xb1, 0x2d, - 0x52, 0xd7, 0xb3, 0x39, 0xab, 0xc8, 0xf4, 0xf0, 0x77, 0xe2, 0x5b, 0xa4, 0x54, 0x32, 0xdc, 0x22, - 0xa5, 0x62, 0xd2, 0x58, 0x8b, 0xcf, 0xfb, 0xe5, 0x1d, 0x58, 0x4b, 0x1b, 0xbb, 0x54, 0x4c, 0x1a, - 0x6b, 0xf1, 0xf1, 0xdf, 0xdc, 0x81, 0xb5, 0xb4, 0xb1, 0x4b, 0xc5, 0x30, 0x73, 0x2c, 0xc4, 0xdc, - 0xa7, 0x8e, 0x1b, 0xaa, 0xdf, 0x7f, 0x12, 0x33, 0xc7, 0x32, 0xe8, 0x98, 0x39, 0x96, 0x81, 0x4a, - 0xe5, 0x2e, 0x84, 0xf2, 0x2b, 0x3b, 0x71, 0x0f, 0xef, 0x65, 0x32, 0x50, 0xa9, 0xdc, 0x85, 0x5c, - 0xfe, 0xee, 0x4e, 0xdc, 0xc3, 0x8b, 0x99, 0x0c, 0x14, 0x33, 0x8a, 0x6a, 0x9e, 0xee, 0x99, 0x8d, - 0x39, 0xdb, 0xf5, 0xa4, 0x45, 0xfe, 0xef, 0xc5, 0x8c, 0xa2, 0x34, 0x22, 0x66, 0x14, 0xa5, 0xc1, - 0x93, 0x4c, 0x85, 0x34, 0x7e, 0xb5, 0x27, 0xd3, 0xd0, 0xd2, 0x4a, 0x83, 0x27, 0x99, 0x0a, 0x21, - 0xfc, 0xa7, 0x3d, 0x99, 0x86, 0x9e, 0xf2, 0x69, 0x70, 0x66, 0x99, 0x4e, 0x3b, 0xf6, 0x86, 0x75, - 0x87, 0x6e, 0xd0, 0x96, 0xf8, 0xf4, 0x5f, 0x8b, 0x59, 0xa6, 0x71, 0x02, 0xbc, 0x45, 0x89, 0xc1, - 0xa2, 0x8c, 0xc4, 0xe7, 0xfe, 0x7a, 0x26, 0xa3, 0xf0, 0x98, 0x28, 0x0e, 0x8b, 0x32, 0x12, 0x9f, - 0xf8, 0x1b, 0x99, 0x8c, 0xc2, 0x63, 0xa2, 0x38, 0x8c, 0x94, 0x61, 0x0c, 0xdf, 0x4a, 0xe8, 0xae, - 0xef, 0xf9, 0xf9, 0xdb, 0xb9, 0xe8, 0xad, 0x57, 0x14, 0x3d, 0xd7, 0xa7, 0xc5, 0x0a, 0xc8, 0x2c, - 0xc4, 0x27, 0x7d, 0x3b, 0x83, 0x45, 0xe8, 0xef, 0x18, 0x85, 0xc8, 0x2c, 0xc4, 0xc7, 0xfc, 0x67, - 0x19, 0x2c, 0x42, 0x87, 0xc7, 0x28, 0x84, 0x7c, 0x1a, 0x86, 0x6b, 0xb3, 0x2b, 0xcb, 0x7e, 0x32, - 0xc1, 0xbf, 0x9f, 0x8b, 0xbd, 0x2a, 0x0a, 0x71, 0xf8, 0xaa, 0x28, 0xfc, 0x39, 0x35, 0x00, 0xfd, - 0x78, 0x94, 0x7a, 0xa7, 0x34, 0xf8, 0xad, 0xdc, 0xf8, 0x6f, 0xe6, 0xee, 0x94, 0x06, 0x7f, 0x33, - 0x37, 0xfe, 0x5b, 0xec, 0xff, 0xdf, 0xca, 0x8d, 0xff, 0x76, 0x4e, 0xbb, 0x18, 0x0e, 0x8b, 0x72, - 0x93, 0x5a, 0xde, 0x72, 0x4b, 0x17, 0x83, 0x3a, 0x15, 0xc5, 0x7f, 0xa6, 0xa2, 0x44, 0xe2, 0xae, - 0x6f, 0xe4, 0x60, 0xa4, 0xe6, 0x39, 0x54, 0x6f, 0x8b, 0x38, 0x78, 0x97, 0x60, 0x90, 0x3b, 0x3f, - 0xfb, 0xcf, 0xc0, 0xb5, 0xe0, 0x37, 0xb9, 0x0a, 0x63, 0xf3, 0xba, 0xeb, 0x61, 0x13, 0xab, 0x96, - 0x41, 0x1f, 0xe3, 0xc3, 0xbf, 0x82, 0x16, 0x83, 0x92, 0x79, 0x4e, 0xc7, 0xcb, 0x61, 0xe8, 0xd3, - 0xc2, 0x8e, 0xe1, 0xdf, 0x06, 0xbf, 0xb3, 0x35, 0xd1, 0x87, 0xd1, 0xde, 0x62, 0x65, 0xd5, 0xdf, - 0xcb, 0x41, 0xc2, 0x2d, 0x7b, 0xff, 0xf1, 0x1e, 0x96, 0xe0, 0x54, 0x2c, 0xdc, 0xae, 0x78, 0xbd, - 0xb8, 0xcb, 0x68, 0xbc, 0xf1, 0xd2, 0xe4, 0x13, 0xc1, 0xab, 0xb9, 0x7b, 0xda, 0xbc, 0x08, 0xed, - 0x87, 0x49, 0x29, 0xba, 0x4e, 0x4b, 0x93, 0x50, 0x22, 0x74, 0xd3, 0xf7, 0xc6, 0xc3, 0x58, 0xa2, - 0xe4, 0xaa, 0x08, 0x3e, 0x91, 0x0b, 0x03, 0x02, 0xc6, 0x52, 0xe0, 0xf3, 0x60, 0x13, 0x9f, 0x81, - 0x91, 0x6a, 0xbb, 0x43, 0x1d, 0xd7, 0xb6, 0x74, 0xcf, 0x76, 0xc4, 0x53, 0x7b, 0x7c, 0x14, 0x6f, - 0x4a, 0x70, 0xf9, 0x51, 0xbc, 0x4c, 0x4f, 0xae, 0xfb, 0x79, 0xf5, 0x0a, 0x18, 0xc5, 0x15, 0x9f, - 0xb4, 0xc6, 0xd3, 0xaa, 0x73, 0x0a, 0x46, 0x7a, 0xcf, 0xd5, 0xf1, 0x7d, 0x65, 0x40, 0xda, 0x65, - 0x00, 0x99, 0x14, 0x29, 0xc8, 0x0b, 0x50, 0xc2, 0xfb, 0x28, 0x17, 0xf3, 0x65, 0x8a, 0x30, 0x85, - 0x2d, 0x84, 0xc8, 0x01, 0x11, 0x38, 0x0d, 0xb9, 0x0b, 0xe3, 0xe1, 0x65, 0xfb, 0x6d, 0xc7, 0xee, - 0x76, 0xfc, 0x0c, 0x39, 0x98, 0x8e, 0xfe, 0x61, 0x80, 0xab, 0x37, 0x11, 0x29, 0xb1, 0x48, 0x14, - 0x24, 0x73, 0x70, 0x2a, 0x84, 0x31, 0x11, 0xf9, 0x99, 0xb9, 0x30, 0x2b, 0xaa, 0xc4, 0x8b, 0x89, - 0x33, 0x92, 0x15, 0x35, 0x56, 0x8c, 0x54, 0x61, 0xc0, 0x8f, 0x51, 0x38, 0xb8, 0xa3, 0x92, 0x9e, - 0x11, 0x31, 0x0a, 0x07, 0xe4, 0xe8, 0x84, 0x7e, 0x79, 0x32, 0x0b, 0x63, 0x9a, 0xdd, 0xf5, 0xe8, - 0x8a, 0x2d, 0x76, 0xa9, 0x22, 0x16, 0x26, 0xb6, 0xc9, 0x61, 0x98, 0xba, 0x67, 0xfb, 0xd9, 0xfc, - 0xe5, 0xac, 0xf2, 0xd1, 0x52, 0x64, 0x11, 0x4e, 0x27, 0xdc, 0x12, 0xe4, 0x1c, 0xfb, 0xd2, 0xe7, - 0x25, 0x99, 0x25, 0x8b, 0x92, 0x1f, 0xcb, 0x41, 0x69, 0xc5, 0xd1, 0x4d, 0xcf, 0x15, 0x4f, 0x33, - 0xcf, 0x4d, 0x6e, 0x38, 0x7a, 0x87, 0xe9, 0xc7, 0x24, 0x86, 0xe9, 0xbd, 0xaf, 0xb7, 0xba, 0xd4, - 0x9d, 0x7a, 0xc0, 0xbe, 0xee, 0x7f, 0xd8, 0x9a, 0x78, 0x93, 0x07, 0xb5, 0x98, 0x6c, 0xd8, 0xed, - 0x1b, 0x4d, 0x47, 0x7f, 0x64, 0x7a, 0x68, 0x62, 0xea, 0xad, 0x1b, 0x1e, 0x6d, 0xe1, 0x19, 0xeb, - 0x0d, 0xbd, 0x63, 0xde, 0xc0, 0x70, 0xf0, 0x37, 0x02, 0x4e, 0xbc, 0x06, 0xa6, 0x02, 0x1e, 0xfe, - 0x25, 0xab, 0x00, 0xc7, 0x91, 0x45, 0x00, 0xf1, 0xa9, 0xe5, 0x4e, 0x47, 0xbc, 0xf3, 0x94, 0x4e, - 0x26, 0x7d, 0x0c, 0x57, 0xec, 0x40, 0x60, 0x7a, 0x47, 0x0a, 0x81, 0xac, 0x49, 0x1c, 0x98, 0x16, - 0xac, 0x88, 0x16, 0xf9, 0x62, 0x1a, 0x0d, 0x25, 0xee, 0x37, 0x36, 0x45, 0x48, 0xf1, 0x62, 0x64, - 0x15, 0x4e, 0x09, 0xbe, 0x41, 0xc2, 0x94, 0xb1, 0xe8, 0xac, 0x10, 0x43, 0x73, 0xa5, 0x0d, 0xda, - 0x68, 0x08, 0xb0, 0x5c, 0x47, 0xac, 0x04, 0x99, 0x0a, 0x13, 0x3c, 0x2f, 0xea, 0x6d, 0xea, 0x2a, - 0xa7, 0x50, 0x63, 0x2f, 0x6f, 0x6f, 0x4d, 0x28, 0x7e, 0x79, 0x0c, 0xd7, 0x29, 0x8b, 0x2e, 0x5a, - 0x44, 0xe6, 0xc1, 0xb5, 0x7e, 0x3c, 0x85, 0x47, 0x5c, 0xe7, 0xa3, 0x45, 0xc8, 0x34, 0x8c, 0x06, - 0xcf, 0x4c, 0xee, 0xdd, 0xab, 0x56, 0xf0, 0x21, 0xa9, 0x88, 0xd8, 0x1a, 0x4b, 0x69, 0x22, 0x33, - 0x89, 0x94, 0x91, 0x02, 0x7f, 0xf0, 0x97, 0xa5, 0xb1, 0xc0, 0x1f, 0x9d, 0x94, 0xc0, 0x1f, 0xcb, - 0xe4, 0x6d, 0x18, 0x2e, 0x3f, 0xa8, 0x89, 0x80, 0x26, 0xae, 0x72, 0x26, 0xcc, 0x8f, 0xa5, 0x6f, - 0xb8, 0x75, 0x3f, 0xf8, 0x89, 0xdc, 0x74, 0x99, 0x9e, 0xcc, 0xc0, 0x58, 0xc4, 0x53, 0xcd, 0x55, - 0xce, 0x22, 0x07, 0x6c, 0xb9, 0x8e, 0x98, 0xba, 0x23, 0x50, 0xf2, 0xf0, 0x8a, 0x16, 0x62, 0x5a, - 0x53, 0x31, 0x5d, 0xcc, 0x35, 0xa4, 0x51, 0x8c, 0x9d, 0x82, 0xcf, 0x52, 0x07, 0xb9, 0xd6, 0x18, - 0x02, 0x55, 0x77, 0x38, 0x4e, 0xee, 0xd1, 0x58, 0x31, 0xf2, 0x3e, 0x10, 0xcc, 0x4e, 0x44, 0x0d, - 0xff, 0xe2, 0xb2, 0x5a, 0x71, 0x95, 0xf3, 0x18, 0xae, 0x9c, 0xc4, 0xc3, 0x29, 0x54, 0x2b, 0x53, - 0x57, 0xc5, 0xf4, 0x71, 0x45, 0xe7, 0xa5, 0xea, 0x7e, 0x28, 0x85, 0xba, 0x19, 0x49, 0xdd, 0x9c, - 0xc2, 0x95, 0x6c, 0xc0, 0x85, 0x65, 0x87, 0x3e, 0x32, 0xed, 0xae, 0xeb, 0x2f, 0x1f, 0xfe, 0xbc, - 0x75, 0x61, 0xc7, 0x79, 0xeb, 0x59, 0x51, 0xf1, 0xb9, 0x8e, 0x43, 0x1f, 0xd5, 0xfd, 0x20, 0xd5, - 0x91, 0x18, 0xab, 0x59, 0xdc, 0x31, 0x01, 0xf5, 0x07, 0x5d, 0x87, 0x0a, 0xb8, 0x49, 0x5d, 0x45, - 0x09, 0xa7, 0x5a, 0x1e, 0x57, 0xc7, 0x0c, 0x70, 0x91, 0x04, 0xd4, 0xd1, 0x62, 0x44, 0x03, 0x72, - 0x7b, 0xda, 0xbf, 0xc4, 0x2e, 0x37, 0x78, 0x9a, 0x5e, 0xe5, 0x22, 0x32, 0x53, 0x99, 0x58, 0x9a, - 0x8d, 0x20, 0x60, 0x7d, 0x5d, 0x17, 0x78, 0x59, 0x2c, 0xc9, 0xd2, 0x64, 0x1e, 0xc6, 0x97, 0x1d, - 0x3c, 0x52, 0xbb, 0x4b, 0x37, 0x97, 0xed, 0x96, 0xd9, 0xd8, 0xc4, 0xd7, 0xb1, 0x62, 0xaa, 0xec, - 0x70, 0x5c, 0xfd, 0x21, 0xdd, 0xac, 0x77, 0x10, 0x2b, 0x2f, 0x2b, 0xf1, 0x92, 0x72, 0x00, 0xe9, - 0xa7, 0x76, 0x17, 0x40, 0x9a, 0xc2, 0xb8, 0xb8, 0x02, 0x7f, 0xec, 0x51, 0x8b, 0x2d, 0xf5, 0xae, - 0x78, 0x09, 0xab, 0xc4, 0xae, 0xcc, 0x03, 0x3c, 0x9f, 0x3a, 0xc4, 0x28, 0xa3, 0x01, 0x58, 0x6e, - 0x58, 0xbc, 0x48, 0x32, 0xca, 0xf2, 0xd3, 0xfb, 0x88, 0xb2, 0xfc, 0xf7, 0x0a, 0xf2, 0xfc, 0x4b, - 0x2e, 0x43, 0x51, 0x4a, 0x82, 0x84, 0x21, 0x64, 0x31, 0x60, 0x7c, 0x51, 0x44, 0xc6, 0x1e, 0x12, - 0xb6, 0x4b, 0x10, 0xda, 0x07, 0xb3, 0x5e, 0x86, 0x61, 0x45, 0xb5, 0x90, 0x00, 0x33, 0x0e, 0x76, - 0x57, 0x5b, 0x66, 0x03, 0xd3, 0x08, 0x14, 0xa4, 0x70, 0x1b, 0x08, 0xe5, 0x59, 0x04, 0x24, 0x12, - 0x72, 0x13, 0x86, 0xfd, 0xa3, 0xdc, 0x30, 0x84, 0x32, 0x46, 0x97, 0x17, 0xb3, 0xb5, 0x08, 0x5e, - 0x2f, 0x11, 0x91, 0x37, 0x00, 0xc2, 0xe9, 0x40, 0x58, 0x5a, 0xb8, 0x54, 0xc8, 0xb3, 0x87, 0xbc, - 0x54, 0x84, 0xd4, 0x6c, 0xe2, 0x94, 0xd5, 0xd1, 0xcf, 0xb1, 0x8a, 0x13, 0x67, 0x44, 0x87, 0x65, - 0x05, 0x89, 0x16, 0x21, 0x4b, 0x70, 0x3a, 0xa1, 0x81, 0x22, 0xe0, 0x32, 0xe6, 0xd9, 0x4f, 0x51, - 0x5f, 0x79, 0x61, 0x4e, 0x94, 0x25, 0xcf, 0x41, 0xe1, 0x9e, 0x56, 0x15, 0x41, 0x5f, 0x79, 0xbc, - 0xe0, 0x48, 0x00, 0x27, 0x86, 0x55, 0x7f, 0x24, 0x9f, 0x58, 0x9b, 0x98, 0xf4, 0x04, 0x2b, 0xa9, - 0x07, 0x51, 0x7a, 0x7e, 0xfd, 0x5c, 0x7a, 0x12, 0x11, 0xb9, 0x06, 0x83, 0xcb, 0x6c, 0x66, 0x68, - 0xd8, 0x2d, 0xd1, 0x9f, 0x18, 0xbe, 0xab, 0x23, 0x60, 0x5a, 0x80, 0x25, 0x37, 0xa5, 0xd4, 0xc0, - 0x52, 0x1c, 0x75, 0x3f, 0x35, 0x70, 0x3c, 0xa0, 0x38, 0x26, 0x09, 0xbe, 0x19, 0x4b, 0x35, 0x26, - 0xca, 0xa4, 0xac, 0x8b, 0x61, 0x6a, 0xb1, 0xc0, 0x2a, 0xed, 0xdf, 0xc9, 0x2a, 0x55, 0xff, 0x41, - 0x2e, 0x39, 0xce, 0xc8, 0xad, 0x64, 0x48, 0x63, 0x5c, 0x84, 0x02, 0xa0, 0x5c, 0x6b, 0x10, 0xdc, - 0x38, 0x12, 0x9c, 0x38, 0xbf, 0xef, 0xe0, 0xc4, 0x85, 0x3d, 0x06, 0x27, 0x56, 0xff, 0x9f, 0x62, - 0x4f, 0x97, 0xed, 0x23, 0x09, 0x62, 0xf7, 0x3a, 0xdb, 0x59, 0xb1, 0xda, 0xcb, 0x6e, 0x62, 0x7f, - 0xc0, 0x3d, 0x52, 0xeb, 0x3a, 0x1f, 0x5a, 0xae, 0x16, 0xa5, 0x24, 0xef, 0xc0, 0x88, 0xff, 0x01, - 0x18, 0xf4, 0x5a, 0x0a, 0xd6, 0x1c, 0xac, 0x6a, 0xb1, 0xf0, 0xd0, 0x91, 0x02, 0xe4, 0x15, 0x18, - 0x42, 0x9b, 0xa6, 0xa3, 0x37, 0xfc, 0x88, 0xe8, 0x3c, 0x84, 0xba, 0x0f, 0x94, 0x03, 0xb5, 0x05, - 0x94, 0xe4, 0x8b, 0x50, 0x12, 0x69, 0x41, 0x78, 0xd6, 0xfc, 0x1b, 0xbb, 0xf0, 0x71, 0x9f, 0x94, - 0x53, 0x82, 0xf0, 0x5d, 0x0a, 0x02, 0x22, 0xbb, 0x14, 0x9e, 0x0d, 0x64, 0x05, 0xce, 0x2c, 0x3b, - 0xd4, 0xc0, 0xd7, 0x14, 0x33, 0x8f, 0x3b, 0x8e, 0x48, 0xd8, 0xc2, 0x47, 0x39, 0x2e, 0x52, 0x1d, - 0x1f, 0xcd, 0x96, 0x4f, 0x81, 0x97, 0xc3, 0x32, 0xa7, 0x14, 0x67, 0x96, 0x0b, 0x6f, 0xc9, 0x5d, - 0xba, 0xb9, 0x61, 0x3b, 0x06, 0xcf, 0x69, 0x22, 0xe6, 0x6f, 0x21, 0xe8, 0x87, 0x02, 0x25, 0x5b, - 0x2e, 0xd1, 0x42, 0x97, 0x5e, 0x87, 0xe1, 0xfd, 0xa6, 0xd5, 0xf8, 0x95, 0x7c, 0xc6, 0xe3, 0xa7, - 0x27, 0x37, 0xb3, 0x61, 0x90, 0x6e, 0xbb, 0x3f, 0x23, 0xdd, 0xf6, 0x9f, 0xe4, 0x33, 0x5e, 0x76, - 0x3d, 0xd1, 0x69, 0x71, 0x03, 0x61, 0x44, 0xd3, 0xe2, 0x86, 0x19, 0x89, 0x4d, 0x43, 0x93, 0x89, - 0x62, 0x09, 0xb4, 0x4b, 0x3b, 0x26, 0xd0, 0xfe, 0x85, 0x42, 0xaf, 0x97, 0x6f, 0x27, 0xb2, 0xdf, - 0x8b, 0xec, 0x6f, 0xc2, 0x70, 0x20, 0xd9, 0x6a, 0x05, 0x8d, 0x9e, 0xd1, 0x20, 0x89, 0x0f, 0x07, - 0x63, 0x19, 0x89, 0x88, 0x5c, 0xe7, 0x6d, 0xad, 0x99, 0x1f, 0xf0, 0x74, 0x12, 0xa3, 0x22, 0x51, - 0x80, 0xee, 0xe9, 0x75, 0xd7, 0xfc, 0x80, 0x6a, 0x01, 0x1a, 0x23, 0x85, 0xa6, 0x3d, 0x02, 0x3c, - 0xe9, 0xa3, 0xdd, 0xf7, 0x51, 0x8a, 0x10, 0xf9, 0xc3, 0xc7, 0x13, 0x21, 0xee, 0x41, 0x88, 0x7f, - 0x9c, 0x4f, 0x7d, 0x26, 0x7a, 0x22, 0xc4, 0xbd, 0xcc, 0x16, 0x2f, 0xc0, 0x90, 0x66, 0x6f, 0xb8, - 0xd3, 0xb8, 0xb1, 0xe1, 0x73, 0x05, 0x4e, 0xd4, 0x8e, 0xbd, 0xe1, 0xd6, 0x71, 0xcb, 0xa2, 0x85, - 0x04, 0xea, 0xf7, 0xf2, 0x3d, 0x1e, 0xd2, 0x9e, 0x08, 0xfe, 0xc3, 0x5c, 0x22, 0x7f, 0x3d, 0x1f, - 0x79, 0xa8, 0xfb, 0xe4, 0x0a, 0xfb, 0x06, 0x40, 0xad, 0xb1, 0x4e, 0xdb, 0xba, 0x94, 0x92, 0x0b, - 0xcf, 0x1d, 0x5c, 0x84, 0x8a, 0x54, 0xce, 0x21, 0x89, 0xfa, 0xad, 0x7c, 0xec, 0xa5, 0xf2, 0x89, - 0xec, 0x76, 0x2d, 0xbb, 0x40, 0xeb, 0xc4, 0xe3, 0xeb, 0x13, 0xc9, 0xed, 0x56, 0x72, 0x3f, 0x9e, - 0x8f, 0xbd, 0x53, 0x7f, 0x62, 0x65, 0xc7, 0x06, 0x60, 0xf2, 0xfd, 0xfc, 0x13, 0xab, 0x49, 0x2f, - 0xc0, 0x90, 0x90, 0x43, 0xb0, 0x54, 0xf0, 0x79, 0x9f, 0x03, 0xf1, 0x94, 0x35, 0x20, 0x50, 0xff, - 0x4c, 0x1e, 0xa2, 0xf1, 0x03, 0x9e, 0x50, 0x1d, 0xfa, 0xf5, 0x7c, 0x34, 0x72, 0xc2, 0x93, 0xab, - 0x3f, 0x93, 0x00, 0xb5, 0xee, 0x6a, 0x43, 0x04, 0xde, 0xed, 0x97, 0x8e, 0xe9, 0x03, 0xa8, 0x26, - 0x51, 0xa8, 0xff, 0x6f, 0x3e, 0x35, 0x9c, 0xc3, 0x93, 0x2b, 0xc0, 0x97, 0xf1, 0x54, 0xbc, 0x61, - 0x85, 0x13, 0x39, 0x1e, 0x42, 0xb2, 0xf1, 0x97, 0xc8, 0xe3, 0xe8, 0x13, 0x92, 0x4f, 0xa7, 0x98, - 0x6b, 0x98, 0x65, 0x22, 0x34, 0xd7, 0xe4, 0x6b, 0x08, 0xc9, 0x70, 0xfb, 0xdd, 0xfc, 0x4e, 0xd1, - 0x2f, 0x9e, 0xe4, 0x55, 0x75, 0x60, 0x59, 0xdf, 0xc4, 0x28, 0x8d, 0xac, 0x27, 0x46, 0x78, 0x96, - 0xc1, 0x0e, 0x07, 0xc9, 0x77, 0x6f, 0x82, 0x4a, 0xfd, 0x17, 0xfd, 0xe9, 0xa1, 0x17, 0x9e, 0x5c, - 0x11, 0x5e, 0x86, 0xe2, 0xb2, 0xee, 0xad, 0x0b, 0x4d, 0xc6, 0x2b, 0xbd, 0x8e, 0xee, 0xad, 0x6b, - 0x08, 0x25, 0xd7, 0x61, 0x50, 0xd3, 0x37, 0xf8, 0x99, 0x67, 0x29, 0xcc, 0x00, 0xe9, 0xe8, 0x1b, - 0x75, 0x7e, 0xee, 0x19, 0xa0, 0x89, 0x1a, 0x64, 0x20, 0xe5, 0x27, 0xdf, 0x98, 0xfe, 0x8e, 0x67, - 0x20, 0x0d, 0xf2, 0x8e, 0x5e, 0x86, 0xe2, 0x94, 0x6d, 0x6c, 0xe2, 0xf5, 0xd5, 0x08, 0xaf, 0x6c, - 0xd5, 0x36, 0x36, 0x35, 0x84, 0x92, 0x9f, 0xc8, 0xc1, 0xc0, 0x1c, 0xd5, 0x0d, 0x36, 0x42, 0x86, - 0x7a, 0x79, 0x9d, 0x7c, 0xee, 0x70, 0xbc, 0x4e, 0x4e, 0xaf, 0xf3, 0xca, 0x64, 0x45, 0x11, 0xf5, - 0x93, 0xdb, 0x30, 0x38, 0xad, 0x7b, 0xb4, 0x69, 0x3b, 0x9b, 0xe8, 0x47, 0x33, 0x16, 0xba, 0xef, - 0x47, 0xf4, 0xc7, 0x27, 0xe2, 0x37, 0x63, 0x0d, 0xf1, 0x4b, 0x0b, 0x0a, 0x33, 0xb1, 0xac, 0xe8, - 0x4e, 0x93, 0x7a, 0x22, 0xdb, 0x36, 0x8a, 0xc5, 0x43, 0x88, 0x26, 0x30, 0xe1, 0xb1, 0xf2, 0x48, - 0xfa, 0xb1, 0x32, 0x5a, 0x8f, 0xe8, 0x6b, 0x87, 0x79, 0x3f, 0x47, 0x71, 0xd1, 0xe7, 0xd6, 0x23, - 0x42, 0x31, 0xed, 0xa7, 0x26, 0x91, 0xa8, 0xdf, 0xed, 0x87, 0xd4, 0x87, 0xda, 0x27, 0x4a, 0x7e, - 0xa2, 0xe4, 0xa1, 0x92, 0x57, 0x12, 0x4a, 0x7e, 0x29, 0xf9, 0xf4, 0xff, 0x23, 0xaa, 0xe1, 0x3f, - 0x5b, 0x4c, 0x04, 0x0e, 0x79, 0xb2, 0x77, 0x97, 0xa1, 0xf4, 0xfa, 0x77, 0x94, 0x5e, 0x30, 0x20, - 0x4a, 0x3b, 0x0e, 0x88, 0x81, 0xdd, 0x0e, 0x88, 0xc1, 0xcc, 0x01, 0x11, 0x2a, 0xc8, 0x50, 0xa6, - 0x82, 0x54, 0xc5, 0xa0, 0x81, 0xde, 0xf9, 0x4b, 0x2e, 0x6f, 0x6f, 0x4d, 0x8c, 0xb1, 0xd1, 0x94, - 0x9a, 0xb8, 0x04, 0x59, 0xa8, 0xbf, 0x57, 0xec, 0x11, 0xed, 0xe7, 0x48, 0x74, 0xe4, 0x65, 0x28, - 0x94, 0x3b, 0x1d, 0xa1, 0x1f, 0x67, 0xa4, 0x40, 0x43, 0x19, 0xa5, 0x18, 0x35, 0x79, 0x03, 0x0a, - 0xe5, 0x07, 0xb5, 0x78, 0xce, 0x92, 0xf2, 0x83, 0x9a, 0xf8, 0x92, 0xcc, 0xb2, 0x0f, 0x6a, 0xe4, - 0xad, 0x30, 0x78, 0xe8, 0x7a, 0xd7, 0x7a, 0x28, 0x36, 0x8a, 0xc2, 0xdd, 0xd6, 0x77, 0xc7, 0x69, - 0x30, 0x14, 0xdb, 0x2e, 0xc6, 0x68, 0x63, 0xda, 0x54, 0xda, 0xbd, 0x36, 0x0d, 0xec, 0xa8, 0x4d, - 0x83, 0xbb, 0xd5, 0xa6, 0xa1, 0x5d, 0x68, 0x13, 0xec, 0xa8, 0x4d, 0xc3, 0x07, 0xd7, 0xa6, 0x0e, - 0x5c, 0x4a, 0x46, 0x68, 0x0b, 0x34, 0x42, 0x03, 0x92, 0xc4, 0x0a, 0xc7, 0x12, 0xbc, 0xfa, 0xef, - 0x72, 0x6c, 0x7d, 0x03, 0xd1, 0x75, 0x97, 0xe1, 0x65, 0xff, 0xb4, 0x64, 0x69, 0xf5, 0x57, 0xf2, - 0xd9, 0x81, 0xe5, 0x8e, 0xe7, 0x14, 0xf7, 0x83, 0xa9, 0x52, 0x2a, 0x46, 0x1f, 0xfa, 0x67, 0x4b, - 0x39, 0xc6, 0x36, 0x4d, 0x66, 0xdf, 0xcc, 0x67, 0x45, 0xbb, 0x3b, 0x90, 0xc4, 0x3e, 0x9e, 0xf4, - 0x68, 0x43, 0x3f, 0x7d, 0x37, 0xea, 0xca, 0x36, 0x0b, 0x23, 0xb2, 0x10, 0x85, 0x94, 0x76, 0x23, - 0xe0, 0x48, 0x39, 0xf2, 0x56, 0x90, 0x5a, 0x46, 0xf2, 0x8f, 0x41, 0x77, 0x35, 0x7f, 0xcc, 0xc6, - 0xdc, 0x63, 0x64, 0x72, 0xf2, 0x02, 0x94, 0x66, 0x31, 0x56, 0xbb, 0x3c, 0xd8, 0x79, 0xf4, 0x76, - 0xd9, 0x6b, 0x85, 0xd3, 0xa8, 0xff, 0x20, 0x07, 0x67, 0xee, 0x76, 0x57, 0xa9, 0xf0, 0x96, 0x0b, - 0xda, 0xf0, 0x3e, 0x00, 0x03, 0x0b, 0x87, 0x99, 0x1c, 0x3a, 0xcc, 0x7c, 0x52, 0x8e, 0x8a, 0x17, - 0x2b, 0x30, 0x19, 0x52, 0x73, 0x67, 0x99, 0xa7, 0x7d, 0xc7, 0xd1, 0x87, 0xdd, 0x55, 0x5a, 0x4f, - 0x78, 0xcd, 0x48, 0xdc, 0x2f, 0xbd, 0xcd, 0x5d, 0xf2, 0xf7, 0xeb, 0xa0, 0xf2, 0xcb, 0xf9, 0xcc, - 0x40, 0x84, 0xc7, 0x36, 0xbf, 0xe7, 0x17, 0x52, 0x7b, 0x25, 0x9e, 0xe7, 0x33, 0x85, 0x24, 0xc6, - 0x31, 0x8d, 0x4b, 0xba, 0xc0, 0x8e, 0x79, 0xd6, 0xd9, 0x0f, 0x55, 0x60, 0x7f, 0x98, 0xcb, 0x0c, - 0x18, 0x79, 0x5c, 0x05, 0xa6, 0xfe, 0xaf, 0x05, 0x3f, 0x4e, 0xe5, 0x81, 0x3e, 0xe1, 0x05, 0x18, - 0x12, 0xcf, 0xf5, 0xa3, 0xce, 0xbe, 0xe2, 0xd8, 0x10, 0x8f, 0xa1, 0x03, 0x02, 0x66, 0x52, 0x48, - 0x9e, 0xc8, 0x92, 0xb3, 0xaf, 0xe4, 0x85, 0xac, 0x49, 0x24, 0xcc, 0x68, 0x98, 0x79, 0x6c, 0x7a, - 0x68, 0x81, 0xb0, 0xbe, 0x2c, 0x70, 0xa3, 0x81, 0x3e, 0x36, 0x3d, 0x6e, 0x7f, 0x04, 0x68, 0x66, - 0x10, 0xd4, 0xc2, 0x9c, 0xfa, 0xc2, 0x20, 0xe0, 0xa6, 0x8a, 0x26, 0x30, 0xac, 0xb5, 0xc2, 0x83, - 0x56, 0xb8, 0xb4, 0x88, 0xd6, 0x0a, 0x9f, 0x5b, 0x6c, 0x6d, 0x40, 0xc0, 0x38, 0x6a, 0xb4, 0x19, - 0x3a, 0xf1, 0x21, 0x47, 0x07, 0x21, 0x9a, 0xc0, 0x90, 0x9b, 0x30, 0x56, 0xf3, 0x74, 0xcb, 0xd0, - 0x1d, 0x63, 0xa9, 0xeb, 0x75, 0xba, 0x9e, 0x6c, 0x00, 0xbb, 0x9e, 0x61, 0x77, 0x3d, 0x2d, 0x46, - 0x41, 0x3e, 0x05, 0xa3, 0x3e, 0x64, 0xc6, 0x71, 0x6c, 0x47, 0xb6, 0x72, 0x5c, 0xcf, 0xa0, 0x8e, - 0xa3, 0x45, 0x09, 0xc8, 0xa7, 0x61, 0xb4, 0x6a, 0x3d, 0xb2, 0x1b, 0xfc, 0xc9, 0xba, 0x36, 0x2f, - 0x6c, 0x1e, 0x7c, 0xf6, 0x65, 0x06, 0x88, 0x7a, 0xd7, 0x69, 0x69, 0x51, 0x42, 0x75, 0x3b, 0x9f, - 0x0c, 0xe7, 0xf9, 0xe4, 0x6e, 0x90, 0xae, 0x47, 0x1d, 0xf7, 0xd0, 0x5b, 0x15, 0x8d, 0x4f, 0xd9, - 0x6f, 0x98, 0xdb, 0xa0, 0x37, 0x61, 0xf0, 0x2e, 0xdd, 0xe4, 0x3e, 0xa6, 0xa5, 0xd0, 0x2d, 0xf9, - 0xa1, 0x80, 0xc9, 0xa7, 0xbb, 0x3e, 0x9d, 0xfa, 0xed, 0x7c, 0x32, 0x50, 0xe9, 0x93, 0x2b, 0xec, - 0x4f, 0xc1, 0x00, 0x8a, 0xb2, 0xea, 0x5f, 0x2f, 0xa0, 0x00, 0x51, 0xdc, 0x51, 0x6f, 0x67, 0x9f, - 0x4c, 0xfd, 0xf9, 0x52, 0x3c, 0x7a, 0xed, 0x93, 0x2b, 0xbd, 0x37, 0x61, 0x78, 0xda, 0xb6, 0x5c, - 0xd3, 0xf5, 0xa8, 0xd5, 0xf0, 0x15, 0xf6, 0x22, 0x33, 0xa8, 0x1a, 0x21, 0x58, 0xb6, 0x01, 0x25, - 0xea, 0xfd, 0x28, 0x2f, 0x79, 0x15, 0x86, 0x50, 0xe4, 0x68, 0x73, 0xf2, 0x09, 0x0f, 0x6f, 0x26, - 0x56, 0x19, 0x30, 0x6e, 0x71, 0x86, 0xa4, 0xe4, 0x1e, 0x0c, 0x4e, 0xaf, 0x9b, 0x2d, 0xc3, 0xa1, - 0x16, 0xfa, 0x26, 0x4b, 0x41, 0x42, 0xa2, 0x7d, 0x39, 0x89, 0xff, 0x22, 0x2d, 0x6f, 0x4e, 0x43, - 0x14, 0x8b, 0xbc, 0xf8, 0x12, 0xb0, 0x4b, 0x3f, 0x93, 0x07, 0x08, 0x0b, 0x90, 0x67, 0x20, 0x1f, - 0x64, 0x97, 0x46, 0x97, 0x98, 0x88, 0x06, 0xe5, 0x71, 0xa9, 0x10, 0x63, 0x3b, 0xbf, 0xe3, 0xd8, - 0xbe, 0x07, 0x25, 0x7e, 0xba, 0x86, 0x5e, 0xeb, 0x52, 0x40, 0xcd, 0xcc, 0x06, 0x4f, 0x22, 0x3d, - 0xb7, 0xa5, 0xd1, 0xf2, 0x8c, 0x78, 0x80, 0x73, 0x66, 0x97, 0x1a, 0xd0, 0x8f, 0x7f, 0x91, 0xab, - 0x50, 0x5c, 0xf1, 0x93, 0xc7, 0x8e, 0xf2, 0x59, 0x3a, 0x26, 0x3f, 0xc4, 0xb3, 0x6e, 0x9a, 0xb6, - 0x2d, 0x8f, 0x55, 0x8d, 0xad, 0x1e, 0x11, 0x72, 0x11, 0xb0, 0x88, 0x5c, 0x04, 0x4c, 0xfd, 0xaf, - 0xf3, 0x29, 0x71, 0x95, 0x9f, 0xdc, 0x61, 0xf2, 0x3a, 0x00, 0x3e, 0x1f, 0x67, 0xf2, 0xf4, 0x9f, - 0x83, 0xe0, 0x28, 0x41, 0x46, 0xa8, 0xb6, 0x91, 0x6d, 0x47, 0x48, 0xac, 0xfe, 0xa3, 0x5c, 0x22, - 0x18, 0xef, 0x81, 0xe4, 0x28, 0x5b, 0x65, 0xf9, 0x7d, 0x9a, 0xb1, 0x7e, 0x5f, 0x14, 0xf6, 0xd6, - 0x17, 0xd1, 0x6f, 0x39, 0x04, 0xcb, 0xf4, 0x28, 0xbf, 0xe5, 0xbb, 0xf9, 0xb4, 0xd0, 0xc4, 0xc7, - 0x53, 0xc5, 0x6f, 0x05, 0x46, 0x69, 0x31, 0x16, 0x0c, 0x1e, 0xa1, 0xf1, 0x04, 0xd7, 0xc2, 0x4c, - 0xfd, 0x12, 0x9c, 0x8a, 0x05, 0xec, 0x15, 0xb9, 0x86, 0xaf, 0xf6, 0x8e, 0xfc, 0x9b, 0x1d, 0x78, - 0x20, 0x42, 0xa6, 0xfe, 0x7f, 0xb9, 0xde, 0xe1, 0x9a, 0x8f, 0x5c, 0x75, 0x52, 0x04, 0x50, 0xf8, - 0xd3, 0x11, 0xc0, 0x21, 0x6c, 0x83, 0x8f, 0xb7, 0x00, 0x3e, 0x22, 0x93, 0xc7, 0x87, 0x2d, 0x80, - 0x9f, 0xcf, 0xed, 0x18, 0x6d, 0xfb, 0xa8, 0x65, 0xa0, 0xfe, 0x4f, 0xb9, 0xd4, 0xa8, 0xd8, 0x07, - 0x6a, 0xd7, 0x5b, 0x50, 0xe2, 0x2e, 0x3c, 0xa2, 0x55, 0x52, 0x1e, 0x31, 0x06, 0xcd, 0xca, 0xbc, - 0xcf, 0xb1, 0x64, 0x1e, 0x06, 0x78, 0x1b, 0x0c, 0xd1, 0x1b, 0x1f, 0xeb, 0x11, 0x9a, 0xdb, 0xc8, - 0x9a, 0x1c, 0x05, 0x5a, 0xfd, 0x87, 0xb9, 0x44, 0x90, 0xee, 0x23, 0xfc, 0xb6, 0x70, 0xaa, 0x2e, - 0xec, 0x7e, 0xaa, 0x56, 0xff, 0x79, 0x3e, 0x3d, 0x46, 0xf8, 0x11, 0x7e, 0xc8, 0x61, 0x1c, 0xa7, - 0xed, 0x6f, 0xdd, 0x5a, 0x81, 0xb1, 0xa8, 0x2c, 0xc4, 0xb2, 0x75, 0x25, 0x3d, 0x52, 0x7a, 0x46, - 0x2b, 0x62, 0x3c, 0xd4, 0xef, 0xe4, 0x92, 0xe1, 0xcd, 0x8f, 0x7c, 0x7e, 0xda, 0x9f, 0xb6, 0x44, - 0x3f, 0xe5, 0x23, 0xb2, 0xd6, 0x1c, 0xc6, 0xa7, 0x7c, 0x44, 0x56, 0x8d, 0xfd, 0x7d, 0xca, 0x2f, - 0xe6, 0xb3, 0xa2, 0xc3, 0x1f, 0xf9, 0x07, 0x7d, 0x5e, 0x16, 0x32, 0x6f, 0x99, 0xf8, 0xb4, 0x67, - 0xb2, 0xc2, 0xb1, 0x67, 0xf0, 0x4c, 0xf0, 0xd9, 0xdf, 0x18, 0x4f, 0x15, 0xd6, 0x47, 0x44, 0x91, - 0x8f, 0x87, 0xb0, 0x3e, 0x22, 0x43, 0xe5, 0xa3, 0x27, 0xac, 0xdf, 0xcc, 0xef, 0x36, 0x25, 0xc1, - 0x89, 0xf0, 0x12, 0xc2, 0xfb, 0x5a, 0x3e, 0x99, 0x2a, 0xe3, 0xc8, 0xc5, 0x34, 0x0b, 0x25, 0x91, - 0xb4, 0x23, 0x53, 0x38, 0x1c, 0x9f, 0x65, 0xd1, 0x88, 0xef, 0xb8, 0x05, 0xe2, 0x22, 0x67, 0x77, - 0x22, 0xe1, 0xb4, 0xea, 0xf7, 0x72, 0xb1, 0xbc, 0x12, 0x47, 0x72, 0x84, 0xb0, 0xaf, 0x25, 0x89, - 0xbc, 0xed, 0x1f, 0x66, 0x16, 0x63, 0x71, 0xbd, 0x83, 0xef, 0xa9, 0x50, 0x4f, 0x37, 0x5b, 0xf1, - 0xf2, 0x22, 0xfe, 0xc0, 0xb7, 0xf3, 0x70, 0x3a, 0x41, 0x4a, 0xae, 0x46, 0xc2, 0xf6, 0xe0, 0xb1, - 0x64, 0xcc, 0x51, 0x9d, 0x07, 0xf0, 0xd9, 0xc3, 0x49, 0xea, 0x55, 0x28, 0x56, 0xf4, 0x4d, 0xfe, - 0x6d, 0xfd, 0x9c, 0xa5, 0xa1, 0x6f, 0xca, 0x27, 0x6e, 0x88, 0x27, 0xab, 0x70, 0x8e, 0xdf, 0x87, - 0x98, 0xb6, 0xb5, 0x62, 0xb6, 0x69, 0xd5, 0x5a, 0x30, 0x5b, 0x2d, 0xd3, 0x15, 0x97, 0x7a, 0x2f, - 0x6c, 0x6f, 0x4d, 0x5c, 0xf3, 0x6c, 0x4f, 0x6f, 0xd5, 0xa9, 0x4f, 0x56, 0xf7, 0xcc, 0x36, 0xad, - 0x9b, 0x56, 0xbd, 0x8d, 0x94, 0x12, 0xcb, 0x74, 0x56, 0xa4, 0xca, 0x43, 0xb8, 0xd7, 0x1a, 0xba, - 0x65, 0x51, 0xa3, 0x6a, 0x4d, 0x6d, 0x7a, 0x94, 0x5f, 0x06, 0x16, 0xf8, 0x91, 0x20, 0x7f, 0x87, - 0xce, 0xd1, 0x8c, 0xf1, 0x2a, 0x23, 0xd0, 0x52, 0x0a, 0xa9, 0xbf, 0x55, 0x4c, 0x49, 0x29, 0x72, - 0x8c, 0xd4, 0xc7, 0xef, 0xe9, 0xe2, 0x0e, 0x3d, 0x7d, 0x03, 0x06, 0x44, 0x8c, 0x5c, 0x71, 0xc1, - 0x80, 0x8e, 0xf3, 0x8f, 0x38, 0x48, 0xbe, 0xa1, 0x11, 0x54, 0xa4, 0x05, 0x97, 0x56, 0x58, 0x37, - 0xa5, 0x77, 0x66, 0x69, 0x1f, 0x9d, 0xd9, 0x83, 0x1f, 0x79, 0x0f, 0x2e, 0x20, 0x36, 0xa5, 0x5b, - 0x07, 0xb0, 0x2a, 0x8c, 0x87, 0xc5, 0xab, 0x4a, 0xef, 0xdc, 0xac, 0xf2, 0xe4, 0xf3, 0x30, 0x12, - 0x0c, 0x10, 0x93, 0xba, 0xe2, 0xe6, 0xa2, 0xc7, 0x38, 0xe3, 0xc1, 0xe6, 0x18, 0x18, 0xdd, 0xd5, - 0xa2, 0x01, 0xcb, 0x22, 0xbc, 0xd4, 0xff, 0x31, 0xd7, 0x2b, 0xb5, 0xc9, 0x91, 0xcf, 0xca, 0x6f, - 0xc3, 0x80, 0xc1, 0x3f, 0x4a, 0xe8, 0x54, 0xef, 0xe4, 0x27, 0x9c, 0x54, 0xf3, 0xcb, 0xa8, 0xff, - 0x2c, 0xd7, 0x33, 0xa3, 0xca, 0x71, 0xff, 0xbc, 0xaf, 0x15, 0x32, 0x3e, 0x4f, 0x4c, 0xa2, 0xd7, - 0x61, 0xdc, 0x0c, 0x43, 0xbe, 0xd7, 0xc3, 0x50, 0x57, 0xda, 0x29, 0x09, 0x8e, 0xa3, 0xeb, 0x16, - 0x04, 0x0e, 0x5b, 0x8e, 0xef, 0x8d, 0xe6, 0xd6, 0xbb, 0x8e, 0xc9, 0xc7, 0xa5, 0x76, 0xd6, 0x8d, - 0xb9, 0xaa, 0xb9, 0xf7, 0x1c, 0x93, 0x55, 0xa0, 0x7b, 0xeb, 0xd4, 0xd2, 0xeb, 0x1b, 0xb6, 0xf3, - 0x10, 0x23, 0x9a, 0xf2, 0xc1, 0xa9, 0x9d, 0xe2, 0xf0, 0x07, 0x3e, 0x98, 0x3c, 0x07, 0xa3, 0xcd, - 0x56, 0x97, 0x06, 0x31, 0x24, 0xf9, 0x5d, 0x9f, 0x36, 0xc2, 0x80, 0xc1, 0x0d, 0xc9, 0xd3, 0x00, - 0x48, 0xe4, 0x61, 0xbe, 0x1b, 0xbc, 0xd8, 0xd3, 0x86, 0x18, 0x64, 0x45, 0x74, 0xd7, 0x25, 0xae, - 0xd5, 0x5c, 0x48, 0xf5, 0x96, 0x6d, 0x35, 0xeb, 0x1e, 0x75, 0xda, 0xd8, 0x50, 0x74, 0x66, 0xd0, - 0xce, 0x23, 0x05, 0x5e, 0x9d, 0xb8, 0xf3, 0xb6, 0xd5, 0x5c, 0xa1, 0x4e, 0x9b, 0x35, 0xf5, 0x05, - 0x20, 0xa2, 0xa9, 0x0e, 0x1e, 0x7a, 0xf0, 0x8f, 0x43, 0x6f, 0x06, 0x4d, 0x7c, 0x04, 0x3f, 0x0d, - 0xc1, 0x0f, 0x9b, 0x80, 0x61, 0x1e, 0x48, 0x8f, 0x0b, 0x0d, 0x5d, 0x18, 0x34, 0xe0, 0x20, 0x94, - 0xd7, 0x79, 0x10, 0xde, 0x15, 0xdc, 0x83, 0x5c, 0x13, 0xbf, 0xd4, 0xaf, 0x14, 0xd2, 0x92, 0xc0, - 0x1c, 0x48, 0xd1, 0xc2, 0x69, 0x35, 0xbf, 0xa7, 0x69, 0xf5, 0x94, 0xd5, 0x6d, 0xd7, 0xf5, 0x4e, - 0xa7, 0xbe, 0x66, 0xb6, 0xf0, 0x09, 0x17, 0x2e, 0x7c, 0xda, 0xa8, 0xd5, 0x6d, 0x97, 0x3b, 0x9d, - 0x59, 0x0e, 0x24, 0xcf, 0xc3, 0x69, 0x46, 0x87, 0x9d, 0x14, 0x50, 0x16, 0x91, 0x92, 0x31, 0xc0, - 0x48, 0xb4, 0x3e, 0xed, 0x45, 0x18, 0x14, 0x3c, 0xf9, 0x5a, 0xd5, 0xaf, 0x0d, 0x70, 0x66, 0x2e, - 0xeb, 0xb9, 0x80, 0x0d, 0x9f, 0x5c, 0xfb, 0xb5, 0x21, 0xbf, 0x3c, 0xc6, 0x5b, 0xb6, 0xba, 0x6d, - 0x1e, 0x7d, 0x6b, 0x00, 0x91, 0xc1, 0x6f, 0x72, 0x15, 0xc6, 0x18, 0x97, 0x40, 0x60, 0x3c, 0x44, - 0x6d, 0xbf, 0x16, 0x83, 0x92, 0x9b, 0x70, 0x36, 0x02, 0xe1, 0x36, 0x28, 0x7f, 0x92, 0xd0, 0xaf, - 0xa5, 0xe2, 0xd4, 0x6f, 0x15, 0xa2, 0xa9, 0x69, 0x8e, 0xa0, 0x23, 0x2e, 0xc0, 0x80, 0xed, 0x34, - 0xeb, 0x5d, 0xa7, 0x25, 0xc6, 0x5e, 0xc9, 0x76, 0x9a, 0xf7, 0x9c, 0x16, 0x39, 0x07, 0x25, 0xd6, - 0x3b, 0xa6, 0x21, 0x86, 0x58, 0xbf, 0xde, 0xe9, 0x54, 0x0d, 0x52, 0xe6, 0x1d, 0x82, 0xe1, 0x4d, - 0xeb, 0x0d, 0xdc, 0xda, 0x73, 0xa7, 0x84, 0x7e, 0xbe, 0xe2, 0x25, 0x90, 0xd8, 0x4f, 0x18, 0xf4, - 0x94, 0x1f, 0x04, 0xc4, 0x58, 0x18, 0xb8, 0x2d, 0x31, 0x78, 0x9f, 0xc4, 0x59, 0x08, 0x64, 0xc8, - 0x82, 0x6f, 0x62, 0x0c, 0x52, 0x01, 0x12, 0x52, 0xb5, 0x6d, 0xc3, 0x5c, 0x33, 0x29, 0x7f, 0x41, - 0xd2, 0xcf, 0x2f, 0x7e, 0x93, 0x58, 0x6d, 0xdc, 0x67, 0xb2, 0x20, 0x20, 0xe4, 0x4d, 0xae, 0x84, - 0x9c, 0x0e, 0xd7, 0x3e, 0xde, 0xb7, 0xdc, 0x4e, 0x8b, 0xa1, 0x50, 0x33, 0xb1, 0x3c, 0x2e, 0x84, - 0xea, 0xdf, 0x28, 0x26, 0xf3, 0x13, 0x1d, 0x89, 0x5d, 0x33, 0x07, 0x20, 0xd2, 0x8f, 0x85, 0x97, - 0x6b, 0x81, 0x77, 0x7b, 0x88, 0xc9, 0xe0, 0x21, 0x95, 0x25, 0xd7, 0x61, 0x90, 0x7f, 0x51, 0xb5, - 0x22, 0xec, 0x1d, 0x74, 0x11, 0x73, 0x3b, 0xe6, 0xda, 0x1a, 0xfa, 0x93, 0x05, 0x68, 0x72, 0x15, - 0x06, 0x2a, 0x8b, 0xb5, 0x5a, 0x79, 0xd1, 0xbf, 0x29, 0xc6, 0xb7, 0x2c, 0x86, 0xe5, 0xd6, 0x5d, - 0xdd, 0x72, 0x35, 0x1f, 0x49, 0x9e, 0x83, 0x52, 0x75, 0x19, 0xc9, 0xf8, 0x0b, 0xcd, 0xe1, 0xed, - 0xad, 0x89, 0x01, 0xb3, 0xc3, 0xa9, 0x04, 0x0a, 0xeb, 0xbd, 0x5f, 0xad, 0x48, 0xee, 0x12, 0xbc, - 0xde, 0x47, 0xa6, 0x81, 0xd7, 0xce, 0x5a, 0x80, 0x26, 0xaf, 0xc0, 0x48, 0x8d, 0x3a, 0xa6, 0xde, - 0x5a, 0xec, 0xe2, 0x56, 0x51, 0x0a, 0xdb, 0xe8, 0x22, 0xbc, 0x6e, 0x21, 0x42, 0x8b, 0x90, 0x91, - 0xcb, 0x50, 0x9c, 0x33, 0x2d, 0xff, 0xb9, 0x04, 0xfa, 0xd3, 0xaf, 0x9b, 0x96, 0xa7, 0x21, 0x94, - 0x3c, 0x07, 0x85, 0x3b, 0x2b, 0x55, 0xe1, 0x09, 0x86, 0xbc, 0xde, 0xf7, 0x22, 0x21, 0x20, 0xef, - 0xac, 0x54, 0xc9, 0x2b, 0x30, 0xc4, 0x16, 0x31, 0x6a, 0x35, 0xa8, 0xab, 0x0c, 0xe3, 0xc7, 0xf0, - 0x90, 0x85, 0x3e, 0x50, 0xf6, 0xe9, 0x08, 0x28, 0xd5, 0xff, 0x23, 0x9f, 0x9e, 0x40, 0xea, 0x08, - 0x86, 0xfa, 0x3e, 0x6f, 0x91, 0x63, 0x0a, 0x56, 0x3c, 0x80, 0x82, 0xad, 0xc1, 0xa9, 0xb2, 0xd1, - 0x36, 0xad, 0x32, 0xfe, 0x74, 0x17, 0x66, 0xcb, 0x38, 0x75, 0x48, 0x4f, 0x01, 0x63, 0x68, 0xf1, - 0x3d, 0x3c, 0xb8, 0x30, 0x43, 0xd5, 0x75, 0x8e, 0xab, 0xb7, 0xd7, 0xf4, 0x7a, 0x83, 0xe7, 0x5e, - 0xd2, 0xe2, 0x4c, 0xd5, 0x9f, 0xce, 0xef, 0x90, 0xf3, 0xea, 0x49, 0x94, 0xbe, 0xfa, 0xf5, 0x7c, - 0xef, 0xb4, 0x63, 0x4f, 0xa4, 0x50, 0xfe, 0x38, 0x9f, 0x92, 0x04, 0xec, 0x40, 0x92, 0xb8, 0x0e, - 0x83, 0x9c, 0x4d, 0xe0, 0xc6, 0x8b, 0xb3, 0x19, 0x57, 0x56, 0x9c, 0x45, 0x7d, 0x34, 0x59, 0x84, - 0xb3, 0xe5, 0xb5, 0x35, 0xda, 0xf0, 0xc2, 0x30, 0xd3, 0x8b, 0x61, 0xc0, 0x57, 0x1e, 0x56, 0x57, - 0xe0, 0xc3, 0x30, 0xd5, 0x18, 0xd8, 0x24, 0xb5, 0x1c, 0x59, 0x81, 0xf3, 0x71, 0x78, 0x8d, 0x6f, - 0x01, 0x8a, 0x52, 0xa4, 0xdd, 0x04, 0x47, 0xfe, 0x9f, 0x96, 0x51, 0x36, 0xad, 0x95, 0x38, 0x55, - 0xf7, 0xf7, 0x6a, 0x25, 0xce, 0xdb, 0xa9, 0xe5, 0xd4, 0x6f, 0x17, 0xe4, 0x5c, 0x69, 0x4f, 0xae, - 0xc3, 0xd5, 0xad, 0x88, 0x9b, 0xf5, 0x6e, 0x87, 0xcc, 0x2b, 0x22, 0x5a, 0x89, 0xd1, 0x75, 0x7c, - 0x8f, 0xc4, 0x20, 0x5a, 0x02, 0x02, 0xe5, 0x75, 0x28, 0xa0, 0x24, 0x55, 0x28, 0x96, 0x9d, 0x26, - 0x37, 0x6f, 0x77, 0x7a, 0xc0, 0xa5, 0x3b, 0x4d, 0x37, 0xfd, 0x01, 0x17, 0x63, 0xa1, 0xfe, 0xf9, - 0x7c, 0x8f, 0xf4, 0x66, 0x4f, 0xe4, 0x24, 0xf2, 0x97, 0xf2, 0x59, 0x89, 0xca, 0x8e, 0xab, 0xeb, - 0xd8, 0x87, 0x2c, 0x9c, 0xe3, 0xed, 0x57, 0x77, 0x88, 0xc2, 0xf9, 0x83, 0x7c, 0x56, 0xd6, 0xb5, - 0x13, 0xe1, 0xec, 0x6f, 0x82, 0x4c, 0x15, 0xe9, 0x13, 0x6c, 0x73, 0xcb, 0xaa, 0xd0, 0xbf, 0x4f, - 0xf7, 0xa9, 0x34, 0x91, 0x9e, 0x0c, 0xe1, 0x03, 0x69, 0xe9, 0x1f, 0xe6, 0x33, 0xb3, 0x0b, 0x9e, - 0xc8, 0xf4, 0x30, 0x65, 0x7a, 0x32, 0xf4, 0x0f, 0x34, 0xf4, 0x53, 0x65, 0x7a, 0x32, 0xf6, 0x0f, - 0xa4, 0xa7, 0xbf, 0x9f, 0x4f, 0xcf, 0x9f, 0x79, 0x04, 0x4a, 0x7a, 0x18, 0x1e, 0x8e, 0x7e, 0x37, - 0x14, 0x0f, 0xd4, 0x0d, 0xfd, 0x07, 0xb0, 0xa2, 0x92, 0x02, 0x3d, 0xb2, 0x51, 0xff, 0xfd, 0x2a, - 0xd0, 0x43, 0x18, 0xf2, 0x4f, 0xb2, 0x40, 0x7f, 0xb2, 0x90, 0xcc, 0x19, 0xfb, 0xa4, 0xae, 0x49, - 0xce, 0x3e, 0xd7, 0x24, 0xbf, 0x1c, 0x79, 0x07, 0x4e, 0x85, 0xb2, 0x94, 0xa3, 0x8c, 0xe1, 0xf5, - 0x51, 0x83, 0xa1, 0xea, 0xef, 0x33, 0x9c, 0x08, 0x87, 0x13, 0xa7, 0x56, 0xbf, 0x57, 0x48, 0x26, - 0xde, 0x3d, 0xe9, 0x8d, 0x7d, 0xf6, 0xc6, 0x3d, 0x38, 0x3f, 0xdd, 0x75, 0x1c, 0x6a, 0x79, 0xe9, - 0x9d, 0x82, 0x87, 0xf7, 0x0d, 0x4e, 0x51, 0x4f, 0x76, 0x4e, 0x46, 0x61, 0xc6, 0x56, 0xbc, 0x6e, - 0x88, 0xb3, 0x1d, 0x08, 0xd9, 0x76, 0x39, 0x45, 0x1a, 0xdb, 0xf4, 0xc2, 0xea, 0xef, 0xe6, 0x93, - 0xa9, 0x92, 0x4f, 0xba, 0x7e, 0x7f, 0x5d, 0xaf, 0x7e, 0xa5, 0x10, 0x4f, 0x17, 0x7d, 0xb2, 0x40, - 0xec, 0xbf, 0x3b, 0x7c, 0x49, 0xe2, 0xb8, 0x91, 0xbe, 0xc2, 0x87, 0x67, 0x7d, 0x85, 0x8f, 0x57, - 0x7f, 0xb9, 0x18, 0x4f, 0xbd, 0x7d, 0xd2, 0x1d, 0x47, 0xd7, 0x1d, 0x64, 0x09, 0xce, 0x8a, 0xb9, - 0xcd, 0x07, 0x61, 0xba, 0x09, 0x31, 0x7f, 0xf1, 0xac, 0x75, 0x62, 0x5a, 0xec, 0xba, 0xd4, 0xa9, - 0x7b, 0xba, 0xfb, 0xb0, 0x8e, 0xf9, 0x29, 0xb4, 0xd4, 0x82, 0x8c, 0xa1, 0x98, 0xd5, 0xa2, 0x0c, - 0x07, 0x43, 0x86, 0xfe, 0x84, 0x98, 0x60, 0x98, 0x56, 0x50, 0xfd, 0xf5, 0x1c, 0x8c, 0xc7, 0x3f, - 0x87, 0x4c, 0xc2, 0x20, 0xfb, 0x1d, 0x3c, 0xbb, 0x97, 0x72, 0x62, 0x73, 0x8e, 0xfc, 0x4a, 0xde, - 0xa7, 0x21, 0xaf, 0xc2, 0x10, 0x7a, 0x3f, 0x60, 0x81, 0x7c, 0x18, 0xed, 0x20, 0x2c, 0x80, 0x89, - 0x5a, 0x79, 0xb1, 0x90, 0x94, 0xbc, 0x09, 0xc3, 0xd5, 0xd0, 0xcd, 0x4b, 0xdc, 0x79, 0xa1, 0x77, - 0xa9, 0x54, 0x32, 0x24, 0xd0, 0x64, 0x6a, 0xf5, 0x3b, 0xf9, 0x78, 0x8a, 0xf8, 0x13, 0x55, 0xdf, - 0x9f, 0xaa, 0x3f, 0xbf, 0xc0, 0x55, 0xfd, 0xae, 0x69, 0x19, 0xe4, 0x22, 0x9c, 0xbb, 0x57, 0x9b, - 0xd1, 0xea, 0x77, 0xab, 0x8b, 0x95, 0xfa, 0xbd, 0xc5, 0xda, 0xf2, 0xcc, 0x74, 0x75, 0xb6, 0x3a, - 0x53, 0x19, 0xef, 0x23, 0x67, 0xe0, 0x54, 0x88, 0x9a, 0xbb, 0xb7, 0x50, 0x5e, 0x1c, 0xcf, 0x91, - 0xd3, 0x30, 0x1a, 0x02, 0xa7, 0x96, 0x56, 0xc6, 0xf3, 0xcf, 0x7f, 0x02, 0x86, 0xd1, 0xbd, 0x8d, - 0x5f, 0xc7, 0x93, 0x11, 0x18, 0x5c, 0x9a, 0xaa, 0xcd, 0x68, 0xf7, 0x91, 0x09, 0x40, 0xa9, 0x32, - 0xb3, 0xc8, 0x18, 0xe6, 0x9e, 0xff, 0xbf, 0x73, 0x00, 0xb5, 0xd9, 0x95, 0x65, 0x41, 0x38, 0x0c, - 0x03, 0xd5, 0xc5, 0xfb, 0xe5, 0xf9, 0x2a, 0xa3, 0x1b, 0x84, 0xe2, 0xd2, 0xf2, 0x0c, 0xab, 0x61, - 0x08, 0xfa, 0xa7, 0xe7, 0x97, 0x6a, 0x33, 0xe3, 0x79, 0x06, 0xd4, 0x66, 0xca, 0x95, 0xf1, 0x02, - 0x03, 0x3e, 0xd0, 0xaa, 0x2b, 0x33, 0xe3, 0x45, 0xf6, 0xe7, 0x7c, 0x6d, 0xa5, 0xbc, 0x32, 0xde, - 0xcf, 0xfe, 0x9c, 0xc5, 0x3f, 0x4b, 0x8c, 0x59, 0x6d, 0x66, 0x05, 0x7f, 0x0c, 0xb0, 0x26, 0xcc, - 0xfa, 0xbf, 0x06, 0x19, 0x8a, 0xb1, 0xae, 0x54, 0xb5, 0xf1, 0x21, 0xf6, 0x83, 0xb1, 0x64, 0x3f, - 0x80, 0x35, 0x4e, 0x9b, 0x59, 0x58, 0xba, 0x3f, 0x33, 0x3e, 0xcc, 0x78, 0x2d, 0xdc, 0x65, 0xe0, - 0x11, 0xf6, 0xa7, 0xb6, 0xc0, 0xfe, 0x1c, 0x65, 0x9c, 0xb4, 0x99, 0xf2, 0xfc, 0x72, 0x79, 0x65, - 0x6e, 0x7c, 0x8c, 0xb5, 0x07, 0x79, 0x9e, 0xe2, 0x25, 0x17, 0xcb, 0x0b, 0x33, 0xe3, 0xe3, 0x82, - 0xa6, 0x32, 0x5f, 0x5d, 0xbc, 0x3b, 0x7e, 0x1a, 0x1b, 0xf2, 0xde, 0x02, 0xfe, 0x20, 0xac, 0x00, - 0xfe, 0x75, 0xe6, 0xf9, 0x1f, 0x80, 0xd2, 0x52, 0x0d, 0x47, 0xc1, 0x05, 0x38, 0xb3, 0x54, 0xab, - 0xaf, 0xbc, 0xb7, 0x3c, 0x13, 0x93, 0xf7, 0x69, 0x18, 0xf5, 0x11, 0xf3, 0xd5, 0xc5, 0x7b, 0x9f, - 0xe3, 0xd2, 0xf6, 0x41, 0x0b, 0xe5, 0xe9, 0xa5, 0xda, 0x78, 0x9e, 0xf5, 0x8a, 0x0f, 0x7a, 0x50, - 0x5d, 0xac, 0x2c, 0x3d, 0xa8, 0x8d, 0x17, 0x9e, 0x7f, 0x04, 0x23, 0x3c, 0x4f, 0xe7, 0x92, 0x63, - 0x36, 0x4d, 0x8b, 0x3c, 0x0d, 0x17, 0x2b, 0x33, 0xf7, 0xab, 0xd3, 0x33, 0xf5, 0x25, 0xad, 0x7a, - 0xbb, 0xba, 0x18, 0xab, 0xe9, 0x1c, 0x9c, 0x8e, 0xa2, 0xcb, 0xcb, 0xd5, 0xf1, 0x1c, 0x39, 0x0f, - 0x24, 0x0a, 0xbe, 0x53, 0x5e, 0x98, 0x1d, 0xcf, 0x13, 0x05, 0xce, 0x46, 0xe1, 0xd5, 0xc5, 0x95, - 0x7b, 0x8b, 0x33, 0xe3, 0x85, 0xe7, 0xff, 0x7a, 0x0e, 0xce, 0xa5, 0xc6, 0x72, 0x26, 0x2a, 0x5c, - 0x99, 0x99, 0x2f, 0xd7, 0x56, 0xaa, 0xd3, 0xb5, 0x99, 0xb2, 0x36, 0x3d, 0x57, 0x9f, 0x2e, 0xaf, - 0xcc, 0xdc, 0x5e, 0xd2, 0xde, 0xab, 0xdf, 0x9e, 0x59, 0x9c, 0xd1, 0xca, 0xf3, 0xe3, 0x7d, 0xe4, - 0x39, 0x98, 0xc8, 0xa0, 0xa9, 0xcd, 0x4c, 0xdf, 0xd3, 0xaa, 0x2b, 0xef, 0x8d, 0xe7, 0xc8, 0xb3, - 0xf0, 0x74, 0x26, 0x11, 0xfb, 0x3d, 0x9e, 0x27, 0x57, 0xe0, 0x52, 0x16, 0xc9, 0xbb, 0xf3, 0xe3, - 0x85, 0xe7, 0x7f, 0x2e, 0x07, 0x24, 0x19, 0x8c, 0x97, 0x3c, 0x03, 0x97, 0x99, 0x5e, 0xd4, 0xb3, - 0x1b, 0xf8, 0x2c, 0x3c, 0x9d, 0x4a, 0x21, 0x35, 0x6f, 0x02, 0x9e, 0xca, 0x20, 0x11, 0x8d, 0xbb, - 0x0c, 0x4a, 0x3a, 0x01, 0x36, 0xed, 0xd7, 0x72, 0x70, 0x2e, 0xd5, 0x03, 0x86, 0x5c, 0x83, 0x8f, - 0x95, 0x2b, 0x0b, 0xac, 0x6f, 0xa6, 0x57, 0xaa, 0x4b, 0x8b, 0xb5, 0xfa, 0xc2, 0x6c, 0xb9, 0xce, - 0xb4, 0xef, 0x5e, 0x2d, 0xd6, 0x9b, 0x57, 0x41, 0xed, 0x41, 0x39, 0x3d, 0x57, 0x5e, 0xbc, 0xcd, - 0x86, 0x1f, 0xf9, 0x18, 0x3c, 0x93, 0x49, 0x37, 0xb3, 0x58, 0x9e, 0x9a, 0x9f, 0xa9, 0x8c, 0xe7, - 0xc9, 0xc7, 0xe1, 0xd9, 0x4c, 0xaa, 0x4a, 0xb5, 0xc6, 0xc9, 0x0a, 0x53, 0x95, 0xef, 0xfc, 0xcf, - 0x57, 0xfa, 0xbe, 0xf3, 0x47, 0x57, 0x72, 0x7f, 0xf0, 0x47, 0x57, 0x72, 0xff, 0xfc, 0x8f, 0xae, - 0xe4, 0x3e, 0x7f, 0x73, 0x2f, 0x41, 0x96, 0xf9, 0xb4, 0xb5, 0x5a, 0xc2, 0xdb, 0xe8, 0x97, 0xff, - 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x11, 0x0e, 0x6f, 0x15, 0xda, 0x81, 0x01, 0x00, + // 17120 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x78, 0x24, 0xc9, + 0x75, 0x20, 0x86, 0x3a, 0x50, 0x00, 0x1e, 0xce, 0x8e, 0xbe, 0xb2, 0x7b, 0x7a, 0x06, 0x33, 0x39, + 0x64, 0xb3, 0x7b, 0x38, 0x83, 0xe6, 0xf4, 0xf4, 0xcc, 0x70, 0x2e, 0x0e, 0x0b, 0x28, 0xa0, 0x51, + 0xdd, 0x38, 0x6a, 0xb2, 0xd0, 0xdd, 0x1c, 0x52, 0x64, 0x29, 0x51, 0x19, 0x0d, 0xe4, 0x74, 0x55, + 0x66, 0x31, 0x33, 0xab, 0xd1, 0x18, 0x5f, 0xa2, 0xac, 0xd5, 0x4a, 0x2b, 0x8a, 0x4b, 0x53, 0xd6, + 0xb1, 0x87, 0xbd, 0xd4, 0x1e, 0xb6, 0x56, 0xab, 0x15, 0xad, 0xb5, 0x2c, 0x89, 0x92, 0xe8, 0x95, + 0x2c, 0x1f, 0x5c, 0xe9, 0xb3, 0x3e, 0xed, 0xda, 0xde, 0x6f, 0x3f, 0x7b, 0x0d, 0xae, 0x65, 0xef, + 0x1f, 0x7c, 0xb6, 0x3f, 0x7d, 0xb6, 0x3e, 0x2f, 0xbd, 0x5e, 0xfb, 0xf3, 0x17, 0x2f, 0x22, 0x33, + 0x23, 0xaf, 0xc2, 0x39, 0xc2, 0x60, 0x1a, 0x7f, 0xba, 0x51, 0xef, 0xbd, 0x78, 0x11, 0xf9, 0xe2, + 0x45, 0xc4, 0x8b, 0x88, 0x17, 0xef, 0xc1, 0x55, 0x8f, 0xb6, 0x68, 0xc7, 0x76, 0xbc, 0x6b, 0x2d, + 0xba, 0xa6, 0x37, 0x37, 0xaf, 0x79, 0x9b, 0x1d, 0xea, 0x5e, 0xa3, 0x0f, 0xa9, 0xe5, 0xf9, 0xff, + 0x4d, 0x75, 0x1c, 0xdb, 0xb3, 0x49, 0x89, 0xff, 0xba, 0x78, 0x66, 0xcd, 0x5e, 0xb3, 0x11, 0x74, + 0x8d, 0xfd, 0xc5, 0xb1, 0x17, 0x2f, 0xad, 0xd9, 0xf6, 0x5a, 0x8b, 0x5e, 0xc3, 0x5f, 0xab, 0xdd, + 0xfb, 0xd7, 0x5c, 0xcf, 0xe9, 0x36, 0x3d, 0x81, 0x9d, 0x8c, 0x63, 0x3d, 0xb3, 0x4d, 0x5d, 0x4f, + 0x6f, 0x77, 0x04, 0xc1, 0x53, 0x71, 0x82, 0x0d, 0x47, 0xef, 0x74, 0xa8, 0x23, 0x2a, 0xbf, 0xf8, + 0x89, 0xa0, 0x9d, 0x7a, 0xb3, 0x49, 0x5d, 0xb7, 0x65, 0xba, 0xde, 0xb5, 0x87, 0x2f, 0x4a, 0xbf, + 0x04, 0xe1, 0x33, 0xe9, 0x1f, 0x84, 0xff, 0x0a, 0x92, 0x17, 0xd2, 0x49, 0xfc, 0x1a, 0x63, 0x55, + 0xab, 0xdf, 0xc8, 0xc3, 0xe0, 0x22, 0xf5, 0x74, 0x43, 0xf7, 0x74, 0x72, 0x09, 0xfa, 0xab, 0x96, + 0x41, 0x1f, 0x29, 0xb9, 0xa7, 0x73, 0x57, 0x0a, 0xd3, 0xa5, 0xed, 0xad, 0xc9, 0x3c, 0x35, 0x35, + 0x0e, 0x24, 0x4f, 0x42, 0x71, 0x65, 0xb3, 0x43, 0x95, 0xfc, 0xd3, 0xb9, 0x2b, 0x43, 0xd3, 0x43, + 0xdb, 0x5b, 0x93, 0xfd, 0x28, 0x34, 0x0d, 0xc1, 0xe4, 0x19, 0xc8, 0x57, 0x2b, 0x4a, 0x01, 0x91, + 0xa7, 0xb6, 0xb7, 0x26, 0x47, 0xbb, 0xa6, 0xf1, 0xbc, 0xdd, 0x36, 0x3d, 0xda, 0xee, 0x78, 0x9b, + 0x5a, 0xbe, 0x5a, 0x21, 0x97, 0xa1, 0x38, 0x63, 0x1b, 0x54, 0x29, 0x22, 0x11, 0xd9, 0xde, 0x9a, + 0x1c, 0x6b, 0xda, 0x06, 0x95, 0xa8, 0x10, 0x4f, 0x3e, 0x0b, 0xc5, 0x15, 0xb3, 0x4d, 0x95, 0xfe, + 0xa7, 0x73, 0x57, 0x86, 0xaf, 0x5f, 0x9c, 0xe2, 0xe2, 0x9b, 0xf2, 0xc5, 0x37, 0xb5, 0xe2, 0xcb, + 0x77, 0x7a, 0xe2, 0xbb, 0x5b, 0x93, 0x7d, 0xdb, 0x5b, 0x93, 0x45, 0x26, 0xf2, 0xaf, 0x7f, 0x6f, + 0x32, 0xa7, 0x61, 0x49, 0xf2, 0x26, 0x0c, 0xcf, 0xb4, 0xba, 0xae, 0x47, 0x9d, 0x25, 0xbd, 0x4d, + 0x95, 0x12, 0x56, 0x78, 0x71, 0x7b, 0x6b, 0xf2, 0x5c, 0x93, 0x83, 0x1b, 0x96, 0xde, 0x96, 0x2b, + 0x96, 0xc9, 0xd5, 0xdf, 0xc8, 0xc1, 0x78, 0x9d, 0xba, 0xae, 0x69, 0x5b, 0x81, 0x6c, 0x3e, 0x0e, + 0x43, 0x02, 0x54, 0xad, 0xa0, 0x7c, 0x86, 0xa6, 0x07, 0xb6, 0xb7, 0x26, 0x0b, 0xae, 0x69, 0x68, + 0x21, 0x86, 0x7c, 0x0a, 0x06, 0xee, 0x99, 0xde, 0xfa, 0xe2, 0x5c, 0x59, 0xc8, 0xe9, 0xdc, 0xf6, + 0xd6, 0x24, 0xd9, 0x30, 0xbd, 0xf5, 0x46, 0xfb, 0xbe, 0x2e, 0x55, 0xe8, 0x93, 0x91, 0x05, 0x98, + 0xa8, 0x39, 0xe6, 0x43, 0xdd, 0xa3, 0xb7, 0xe9, 0x66, 0xcd, 0x6e, 0x99, 0xcd, 0x4d, 0x21, 0xc5, + 0xa7, 0xb7, 0xb7, 0x26, 0x2f, 0x75, 0x38, 0xae, 0xf1, 0x80, 0x6e, 0x36, 0x3a, 0x88, 0x95, 0x98, + 0x24, 0x4a, 0xaa, 0xbf, 0x59, 0x82, 0x91, 0x3b, 0x2e, 0x75, 0x82, 0x76, 0x5f, 0x86, 0x22, 0xfb, + 0x2d, 0x9a, 0x8c, 0x32, 0xef, 0xba, 0xd4, 0x91, 0x65, 0xce, 0xf0, 0xe4, 0x2a, 0xf4, 0x2f, 0xd8, + 0x6b, 0xa6, 0x25, 0x9a, 0x7d, 0x7a, 0x7b, 0x6b, 0x72, 0xbc, 0xc5, 0x00, 0x12, 0x25, 0xa7, 0x20, + 0x9f, 0x81, 0x91, 0x6a, 0x9b, 0xe9, 0x90, 0x6d, 0xe9, 0x9e, 0xed, 0x88, 0xd6, 0xa2, 0x74, 0x4d, + 0x09, 0x2e, 0x15, 0x8c, 0xd0, 0x93, 0xd7, 0x01, 0xca, 0xf7, 0xea, 0x9a, 0xdd, 0xa2, 0x65, 0x6d, + 0x49, 0x28, 0x03, 0x96, 0xd6, 0x37, 0xdc, 0x86, 0x63, 0xb7, 0x68, 0x43, 0x77, 0xe4, 0x6a, 0x25, + 0x6a, 0x32, 0x0b, 0x63, 0x65, 0x1c, 0x15, 0x1a, 0xfd, 0x72, 0x97, 0xba, 0x9e, 0xab, 0xf4, 0x3f, + 0x5d, 0xb8, 0x32, 0x34, 0xfd, 0xe4, 0xf6, 0xd6, 0xe4, 0x05, 0x3e, 0x5e, 0x1a, 0x8e, 0x40, 0x49, + 0x2c, 0x62, 0x85, 0xc8, 0x34, 0x8c, 0x96, 0xdf, 0xef, 0x3a, 0xb4, 0x6a, 0x50, 0xcb, 0x33, 0xbd, + 0x4d, 0xa1, 0x21, 0x97, 0xb6, 0xb7, 0x26, 0x15, 0x9d, 0x21, 0x1a, 0xa6, 0xc0, 0x48, 0x4c, 0xa2, + 0x45, 0xc8, 0x32, 0x9c, 0xba, 0x39, 0x53, 0xab, 0x53, 0xe7, 0xa1, 0xd9, 0xa4, 0xe5, 0x66, 0xd3, + 0xee, 0x5a, 0x9e, 0x32, 0x80, 0x7c, 0x9e, 0xd9, 0xde, 0x9a, 0x7c, 0x72, 0xad, 0xd9, 0x69, 0xb8, + 0x1c, 0xdb, 0xd0, 0x39, 0x5a, 0x62, 0x96, 0x2c, 0x4b, 0x3e, 0x0f, 0xa3, 0x2b, 0x0e, 0xd3, 0x42, + 0xa3, 0x42, 0x19, 0x5c, 0x19, 0x44, 0xfd, 0x3f, 0x37, 0x25, 0x66, 0x2a, 0x0e, 0xf5, 0x7b, 0x96, + 0x37, 0xd6, 0xe3, 0x05, 0x1a, 0x06, 0xe2, 0xe4, 0xc6, 0x46, 0x58, 0x11, 0x0a, 0x0a, 0xfb, 0x78, + 0xd3, 0xa1, 0x46, 0x42, 0xdb, 0x86, 0xb0, 0xcd, 0x57, 0xb7, 0xb7, 0x26, 0x3f, 0xee, 0x08, 0x9a, + 0x46, 0x4f, 0xb5, 0xcb, 0x64, 0x45, 0x66, 0x61, 0x90, 0x69, 0xd3, 0x6d, 0xd3, 0x32, 0x14, 0x78, + 0x3a, 0x77, 0x65, 0xec, 0xfa, 0x84, 0xdf, 0x7a, 0x1f, 0x3e, 0x7d, 0x7e, 0x7b, 0x6b, 0xf2, 0x34, + 0xd3, 0xc1, 0xc6, 0x03, 0xd3, 0x92, 0xa7, 0x88, 0xa0, 0x28, 0x1b, 0x45, 0xd3, 0xb6, 0x87, 0x43, + 0x77, 0x38, 0x1c, 0x45, 0xab, 0xb6, 0x17, 0x1f, 0xb6, 0x3e, 0x19, 0x99, 0x81, 0xd1, 0x69, 0xdb, + 0xab, 0x5a, 0xae, 0xa7, 0x5b, 0x4d, 0x5a, 0xad, 0x28, 0x23, 0x58, 0x0e, 0xd5, 0x82, 0x95, 0x33, + 0x05, 0xa6, 0x11, 0x99, 0x94, 0xa2, 0x65, 0xd4, 0x7f, 0x51, 0x84, 0x31, 0xd6, 0x27, 0xd2, 0xf0, + 0x29, 0xb3, 0x99, 0x80, 0x41, 0x58, 0x2d, 0x6e, 0x47, 0x6f, 0x52, 0x31, 0x92, 0xf0, 0x2b, 0x2c, + 0x1f, 0x28, 0xf1, 0x8c, 0xd3, 0x93, 0xab, 0x30, 0xc8, 0x41, 0xd5, 0x8a, 0x18, 0x5c, 0xa3, 0xdb, + 0x5b, 0x93, 0x43, 0x2e, 0xc2, 0x1a, 0xa6, 0xa1, 0x05, 0x68, 0xa6, 0xdd, 0xfc, 0xef, 0x79, 0xdb, + 0xf5, 0x18, 0x73, 0x31, 0xb6, 0xf0, 0x33, 0x44, 0x81, 0x75, 0x81, 0x92, 0xb5, 0x3b, 0x5a, 0x88, + 0xbc, 0x06, 0xc0, 0x21, 0x65, 0xc3, 0x70, 0xc4, 0x00, 0xbb, 0xb0, 0xbd, 0x35, 0x79, 0x56, 0xb0, + 0xd0, 0x0d, 0x43, 0x1e, 0x9d, 0x12, 0x31, 0x69, 0xc3, 0x08, 0xff, 0xb5, 0xa0, 0xaf, 0xd2, 0x16, + 0x1f, 0x5d, 0xc3, 0xd7, 0xaf, 0xf8, 0x9d, 0x18, 0x95, 0xce, 0x94, 0x4c, 0x3a, 0x6b, 0x79, 0xce, + 0xe6, 0xf4, 0xa4, 0x98, 0x90, 0xcf, 0x8b, 0xaa, 0x5a, 0x88, 0x93, 0xa7, 0x02, 0xb9, 0x0c, 0x9b, + 0xa7, 0xe7, 0x6c, 0x67, 0x43, 0x77, 0x0c, 0x6a, 0x4c, 0x6f, 0xca, 0xf3, 0xf4, 0x7d, 0x1f, 0xdc, + 0x58, 0x95, 0x55, 0x4f, 0x26, 0x67, 0x9d, 0xce, 0xb9, 0xd5, 0xbb, 0xab, 0xa8, 0x72, 0x03, 0x09, + 0x69, 0xb9, 0xdd, 0xd5, 0xb8, 0x9a, 0x45, 0xcb, 0xb0, 0xa9, 0x80, 0x03, 0xee, 0x52, 0x87, 0x4d, + 0xe2, 0x38, 0xea, 0xc4, 0x54, 0x20, 0x98, 0x3c, 0xe4, 0x98, 0x24, 0x0f, 0x51, 0xe4, 0xe2, 0xdb, + 0x70, 0x2a, 0x21, 0x0a, 0x32, 0x01, 0x85, 0x07, 0x74, 0x93, 0xab, 0x8b, 0xc6, 0xfe, 0x24, 0x67, + 0xa0, 0xff, 0xa1, 0xde, 0xea, 0x8a, 0x25, 0x54, 0xe3, 0x3f, 0x5e, 0xcf, 0x7f, 0x3a, 0xc7, 0x56, + 0x1c, 0x32, 0x63, 0x5b, 0x16, 0x6d, 0x7a, 0xf2, 0xa2, 0xf3, 0x0a, 0x0c, 0x2d, 0xd8, 0x4d, 0xbd, + 0x85, 0xfd, 0xc8, 0xf5, 0x4e, 0xd9, 0xde, 0x9a, 0x3c, 0xc3, 0x3a, 0x70, 0xaa, 0xc5, 0x30, 0x52, + 0x9b, 0x42, 0x52, 0xa6, 0x00, 0x1a, 0x6d, 0xdb, 0x1e, 0xc5, 0x82, 0xf9, 0x50, 0x01, 0xb0, 0xa0, + 0x83, 0x28, 0x59, 0x01, 0x42, 0x62, 0x72, 0x0d, 0x06, 0x6b, 0x6c, 0x9d, 0x6d, 0xda, 0x2d, 0xa1, + 0x7c, 0xb8, 0x14, 0xe0, 0xda, 0x2b, 0x8f, 0x55, 0x9f, 0x48, 0x9d, 0x87, 0xb1, 0x99, 0x96, 0x49, + 0x2d, 0x4f, 0x6e, 0x35, 0x1b, 0xc9, 0xe5, 0x35, 0x6a, 0x79, 0x72, 0xab, 0x71, 0xcc, 0xeb, 0x0c, + 0x2a, 0xb7, 0x3a, 0x20, 0x55, 0xff, 0xb0, 0x00, 0x17, 0x6e, 0x77, 0x57, 0xa9, 0x63, 0x51, 0x8f, + 0xba, 0x62, 0x41, 0x0e, 0xb8, 0x2e, 0xc1, 0xa9, 0x04, 0x52, 0x70, 0xc7, 0x85, 0xf2, 0x41, 0x80, + 0x6c, 0x88, 0x35, 0x5e, 0x9e, 0x6d, 0x13, 0x45, 0xc9, 0x3c, 0x8c, 0x87, 0x40, 0xd6, 0x08, 0x57, + 0xc9, 0xe3, 0x52, 0xf2, 0xd4, 0xf6, 0xd6, 0xe4, 0x45, 0x89, 0x1b, 0x6b, 0xb6, 0xac, 0xc1, 0xf1, + 0x62, 0xe4, 0x36, 0x4c, 0x84, 0xa0, 0x9b, 0x8e, 0xdd, 0xed, 0xb8, 0x4a, 0x01, 0x59, 0x4d, 0x6e, + 0x6f, 0x4d, 0x3e, 0x21, 0xb1, 0x5a, 0x43, 0xa4, 0xbc, 0x80, 0xc7, 0x0b, 0x92, 0x1f, 0xc9, 0xc9, + 0xdc, 0xc4, 0x28, 0x2c, 0xe2, 0x28, 0x7c, 0xd5, 0x1f, 0x85, 0x99, 0x42, 0x9a, 0x8a, 0x97, 0x14, + 0x83, 0x32, 0xd6, 0x8c, 0xc4, 0xa0, 0x4c, 0xd4, 0x78, 0x71, 0x06, 0xce, 0xa6, 0xf2, 0xda, 0x93, + 0x56, 0xff, 0xf3, 0x82, 0xcc, 0xa5, 0x66, 0x1b, 0x41, 0x67, 0x2e, 0xcb, 0x9d, 0x59, 0xb3, 0x0d, + 0x9c, 0xea, 0x73, 0xe1, 0xda, 0x29, 0x35, 0xb6, 0x63, 0x1b, 0xf1, 0x59, 0x3f, 0x59, 0x96, 0x7c, + 0x09, 0xce, 0x25, 0x80, 0x7c, 0xba, 0xe6, 0xda, 0x7f, 0x79, 0x7b, 0x6b, 0x52, 0x4d, 0xe1, 0x1a, + 0x9f, 0xbd, 0x33, 0xb8, 0x10, 0x1d, 0xce, 0x4b, 0x52, 0xb7, 0x2d, 0x4f, 0x37, 0x2d, 0x61, 0x5c, + 0xf2, 0x51, 0xf2, 0x89, 0xed, 0xad, 0xc9, 0x67, 0x65, 0x1d, 0xf4, 0x69, 0xe2, 0x8d, 0xcf, 0xe2, + 0x43, 0x0c, 0x50, 0x52, 0x50, 0xd5, 0xb6, 0xbe, 0xe6, 0x5b, 0xcc, 0x57, 0xb6, 0xb7, 0x26, 0x3f, + 0x96, 0x5a, 0x87, 0xc9, 0xa8, 0xe4, 0x15, 0x3a, 0x8b, 0x13, 0xd1, 0x80, 0x84, 0xb8, 0x25, 0xdb, + 0xa0, 0xf8, 0x0d, 0xfd, 0xc8, 0x5f, 0xdd, 0xde, 0x9a, 0x7c, 0x4a, 0xe2, 0x6f, 0xd9, 0x06, 0x8d, + 0x37, 0x3f, 0xa5, 0xb4, 0xfa, 0x1b, 0x05, 0x78, 0xaa, 0x5e, 0x5e, 0x5c, 0xa8, 0x1a, 0xbe, 0x49, + 0x53, 0x73, 0xec, 0x87, 0xa6, 0x21, 0x8d, 0xde, 0x55, 0x38, 0x1f, 0x43, 0xcd, 0xa2, 0x15, 0x15, + 0x18, 0xd3, 0xf8, 0x6d, 0xbe, 0xb9, 0xd4, 0x11, 0x34, 0x0d, 0x6e, 0x6a, 0x45, 0x17, 0xed, 0x2c, + 0x46, 0xac, 0x8f, 0x62, 0xa8, 0xfa, 0xba, 0xed, 0x78, 0xcd, 0xae, 0x27, 0x94, 0x00, 0xfb, 0x28, + 0x51, 0x87, 0x2b, 0x88, 0x7a, 0x54, 0xe1, 0xf3, 0x21, 0x3f, 0x9e, 0x83, 0x89, 0xb2, 0xe7, 0x39, + 0xe6, 0x6a, 0xd7, 0xa3, 0x8b, 0x7a, 0xa7, 0x63, 0x5a, 0x6b, 0x38, 0xd6, 0x87, 0xaf, 0xbf, 0x19, + 0xac, 0x91, 0x3d, 0x25, 0x31, 0x15, 0x2f, 0x2e, 0x0d, 0x51, 0xdd, 0x47, 0x35, 0xda, 0x1c, 0x27, + 0x0f, 0xd1, 0x78, 0x39, 0x36, 0x44, 0x53, 0x79, 0xed, 0x69, 0x88, 0x7e, 0xa3, 0x00, 0x97, 0x96, + 0x1f, 0x78, 0xba, 0x46, 0x5d, 0xbb, 0xeb, 0x34, 0xa9, 0x7b, 0xa7, 0x63, 0xe8, 0x1e, 0x0d, 0x47, + 0xea, 0x24, 0xf4, 0x97, 0x0d, 0x83, 0x1a, 0xc8, 0xae, 0x9f, 0x6f, 0xfb, 0x74, 0x06, 0xd0, 0x38, + 0x9c, 0x7c, 0x1c, 0x06, 0x44, 0x19, 0xe4, 0xde, 0x3f, 0x3d, 0xbc, 0xbd, 0x35, 0x39, 0xd0, 0xe5, + 0x20, 0xcd, 0xc7, 0x31, 0xb2, 0x0a, 0x6d, 0x51, 0x46, 0x56, 0x08, 0xc9, 0x0c, 0x0e, 0xd2, 0x7c, + 0x1c, 0x79, 0x07, 0xc6, 0x90, 0x6d, 0xd0, 0x1e, 0x31, 0xf7, 0x9d, 0xf1, 0xa5, 0x2b, 0x37, 0x96, + 0x2f, 0x4d, 0xd8, 0x9a, 0x86, 0xe3, 0x17, 0xd0, 0x62, 0x0c, 0xc8, 0x3d, 0x98, 0x10, 0x8d, 0x08, + 0x99, 0xf6, 0xf7, 0x60, 0x7a, 0x76, 0x7b, 0x6b, 0xf2, 0x94, 0x68, 0xbf, 0xc4, 0x36, 0xc1, 0x84, + 0x31, 0x16, 0xcd, 0x0e, 0x19, 0x97, 0x76, 0x62, 0x2c, 0xbe, 0x58, 0x66, 0x1c, 0x67, 0xa2, 0xbe, + 0x0b, 0x23, 0x72, 0x41, 0x72, 0x0e, 0xb7, 0xd6, 0x7c, 0x9c, 0xe0, 0xa6, 0xdc, 0x34, 0x70, 0x3f, + 0xfd, 0x22, 0x0c, 0x57, 0xa8, 0xdb, 0x74, 0xcc, 0x0e, 0xb3, 0x1a, 0x84, 0x92, 0x8f, 0x6f, 0x6f, + 0x4d, 0x0e, 0x1b, 0x21, 0x58, 0x93, 0x69, 0xd4, 0xff, 0x2b, 0x07, 0xe7, 0x18, 0xef, 0xb2, 0xeb, + 0x9a, 0x6b, 0x56, 0x5b, 0x5e, 0xb6, 0x9f, 0x87, 0x52, 0x1d, 0xeb, 0x13, 0x35, 0x9d, 0xd9, 0xde, + 0x9a, 0x9c, 0xe0, 0x2d, 0x90, 0xf4, 0x50, 0xd0, 0x04, 0xfb, 0xca, 0xfc, 0x0e, 0xfb, 0x4a, 0x66, + 0xd2, 0x7a, 0xba, 0xe3, 0x99, 0xd6, 0x5a, 0xdd, 0xd3, 0xbd, 0xae, 0x1b, 0x31, 0x69, 0x05, 0xa6, + 0xe1, 0x22, 0x2a, 0x62, 0xd2, 0x46, 0x0a, 0x91, 0xb7, 0x61, 0x64, 0xd6, 0x32, 0x42, 0x26, 0x7c, + 0x42, 0x7c, 0x82, 0x59, 0x9a, 0x14, 0xe1, 0x49, 0x16, 0x91, 0x02, 0xea, 0xdf, 0xcd, 0x81, 0xc2, + 0x37, 0x81, 0x0b, 0xa6, 0xeb, 0x2d, 0xd2, 0xf6, 0xaa, 0x34, 0x3b, 0xcd, 0xf9, 0xbb, 0x4a, 0x86, + 0x93, 0xd6, 0x22, 0x34, 0x05, 0xc4, 0xae, 0xb2, 0x65, 0xba, 0x89, 0xed, 0x47, 0xac, 0x14, 0xa9, + 0xc2, 0x00, 0xe7, 0xcc, 0x6d, 0x89, 0xe1, 0xeb, 0x8a, 0xaf, 0x08, 0xf1, 0xaa, 0xb9, 0x32, 0xb4, + 0x39, 0xb1, 0xbc, 0xa1, 0x11, 0xe5, 0xd5, 0x6f, 0x16, 0x60, 0x22, 0x5e, 0x88, 0xdc, 0x83, 0xc1, + 0x5b, 0xb6, 0x69, 0x51, 0x63, 0xd9, 0xc2, 0x16, 0xf6, 0x3e, 0x1c, 0xf1, 0x6d, 0xf1, 0xd3, 0xef, + 0x61, 0x99, 0x86, 0x6c, 0xc1, 0xe2, 0x59, 0x49, 0xc0, 0x8c, 0x7c, 0x1e, 0x86, 0x98, 0x0d, 0xf8, + 0x10, 0x39, 0xe7, 0x77, 0xe4, 0xfc, 0xb4, 0xe0, 0x7c, 0xc6, 0xe1, 0x85, 0x92, 0xac, 0x43, 0x76, + 0x4c, 0xaf, 0x34, 0xaa, 0xbb, 0xb6, 0x25, 0x7a, 0x1e, 0xf5, 0xca, 0x41, 0x88, 0xac, 0x57, 0x9c, + 0x86, 0x99, 0xae, 0xfc, 0x63, 0xb1, 0x1b, 0xa4, 0xbd, 0x0b, 0x97, 0x55, 0xbc, 0x07, 0x24, 0x62, + 0x62, 0xc1, 0xb8, 0x10, 0xe8, 0xba, 0xd9, 0x41, 0xab, 0x1f, 0xd7, 0xb5, 0xb1, 0xeb, 0x97, 0xa7, + 0xfc, 0x43, 0xb1, 0x29, 0xe9, 0x48, 0xed, 0xe1, 0x8b, 0x53, 0x8b, 0x01, 0x39, 0xee, 0x4c, 0x51, + 0x27, 0x63, 0x2c, 0xe4, 0xde, 0x6e, 0x47, 0xc8, 0xd5, 0x1f, 0xcd, 0xc3, 0x0b, 0x61, 0x17, 0x69, + 0xf4, 0xa1, 0x49, 0x37, 0x42, 0x8e, 0x62, 0x8f, 0xcc, 0x86, 0x98, 0x3b, 0xb3, 0xae, 0x5b, 0x6b, + 0xd4, 0x20, 0x57, 0xa1, 0x5f, 0xb3, 0x5b, 0xd4, 0x55, 0x72, 0x68, 0x1e, 0xe2, 0xf4, 0xe5, 0x30, + 0x80, 0x7c, 0xc8, 0x82, 0x14, 0xc4, 0x86, 0xd2, 0x8a, 0xa3, 0x9b, 0x9e, 0xaf, 0x49, 0xe5, 0xa4, + 0x26, 0xed, 0xa2, 0xc6, 0x29, 0xce, 0x83, 0xaf, 0x31, 0x28, 0x78, 0x0f, 0x01, 0xb2, 0xe0, 0x39, + 0xc9, 0xc5, 0xd7, 0x60, 0x58, 0x22, 0xde, 0xd3, 0x22, 0xf2, 0xed, 0xa2, 0x3c, 0xb6, 0xfc, 0x66, + 0x89, 0xb1, 0x75, 0x8d, 0x8d, 0x09, 0xd7, 0x65, 0x56, 0x0c, 0x1f, 0x54, 0x42, 0xf3, 0x11, 0x14, + 0xd5, 0x7c, 0x04, 0x91, 0x97, 0x60, 0x90, 0xb3, 0x08, 0xf6, 0xcb, 0xb8, 0xd7, 0x76, 0x10, 0x16, + 0x35, 0x05, 0x02, 0x42, 0xf2, 0x8b, 0x39, 0x78, 0xb2, 0xa7, 0x24, 0x50, 0xf9, 0x86, 0xaf, 0xbf, + 0xbc, 0x2f, 0x31, 0x4e, 0xbf, 0xb0, 0xbd, 0x35, 0x79, 0x55, 0xd2, 0x0c, 0x47, 0xa2, 0x69, 0x34, + 0x39, 0x91, 0xd4, 0xae, 0xde, 0x4d, 0x61, 0xc6, 0x2a, 0xaf, 0x74, 0x0e, 0x8f, 0xaa, 0xac, 0xe6, + 0xa6, 0xdf, 0xc8, 0x62, 0x68, 0xac, 0x8a, 0xef, 0xbd, 0xef, 0x93, 0xa4, 0x54, 0x93, 0xc1, 0x85, + 0x34, 0xe1, 0x3c, 0xc7, 0x54, 0xf4, 0xcd, 0xe5, 0xfb, 0x8b, 0xb6, 0xe5, 0xad, 0xfb, 0x15, 0xf4, + 0xcb, 0x67, 0x3d, 0x58, 0x81, 0xa1, 0x6f, 0x36, 0xec, 0xfb, 0x8d, 0x36, 0xa3, 0x4a, 0xa9, 0x23, + 0x8b, 0x13, 0x9b, 0xd8, 0xc5, 0x18, 0xf7, 0xa7, 0xbc, 0x52, 0x78, 0x12, 0xe7, 0xcf, 0x0b, 0xc9, + 0x09, 0x2e, 0x56, 0x48, 0xad, 0xc2, 0xc8, 0x82, 0xdd, 0x7c, 0x10, 0xa8, 0xcb, 0x6b, 0x50, 0x5a, + 0xd1, 0x9d, 0x35, 0xea, 0xa1, 0x2c, 0x86, 0xaf, 0x9f, 0x9a, 0xe2, 0xa7, 0xdb, 0x8c, 0x88, 0x23, + 0xa6, 0xc7, 0xc4, 0xec, 0x53, 0xf2, 0xf0, 0xb7, 0x26, 0x0a, 0xa8, 0xdf, 0xeb, 0x87, 0x11, 0x71, + 0x12, 0x8b, 0xab, 0x07, 0x79, 0x3d, 0x3c, 0xdb, 0x16, 0xd3, 0x65, 0x70, 0x1a, 0x15, 0x9c, 0xa2, + 0x8d, 0x30, 0x66, 0x7f, 0xb4, 0x35, 0x99, 0xdb, 0xde, 0x9a, 0xec, 0xd3, 0x06, 0xa5, 0x4d, 0x6c, + 0xb8, 0xbe, 0x49, 0x0b, 0xba, 0x7c, 0xb6, 0x1a, 0x2b, 0xcb, 0xd7, 0xbb, 0xb7, 0x61, 0x40, 0xb4, + 0x41, 0x68, 0xdc, 0xf9, 0xf0, 0xec, 0x24, 0x72, 0xa2, 0x1c, 0x2b, 0xed, 0x97, 0x22, 0x6f, 0x42, + 0x89, 0x9f, 0x25, 0x08, 0x01, 0x9c, 0x4b, 0x3f, 0x7b, 0x89, 0x15, 0x17, 0x65, 0xc8, 0x3c, 0x40, + 0x78, 0x8e, 0x10, 0x1c, 0xa0, 0x0b, 0x0e, 0xc9, 0x13, 0x86, 0x18, 0x17, 0xa9, 0x2c, 0x79, 0x05, + 0x46, 0x56, 0xa8, 0xd3, 0x36, 0x2d, 0xbd, 0x55, 0x37, 0xdf, 0xf7, 0xcf, 0xd0, 0x71, 0xa1, 0x77, + 0xcd, 0xf7, 0xe5, 0x91, 0x1b, 0xa1, 0x23, 0x5f, 0x4c, 0xdb, 0xa7, 0x0f, 0x60, 0x43, 0x9e, 0xd9, + 0x71, 0x03, 0x1b, 0x6b, 0x4f, 0xca, 0xb6, 0xfd, 0x1d, 0x18, 0x8d, 0x6c, 0xd1, 0xc4, 0x21, 0xe9, + 0x93, 0x49, 0xd6, 0xd2, 0x7e, 0x33, 0xc6, 0x36, 0xca, 0x81, 0x69, 0x72, 0xd5, 0x32, 0x3d, 0x53, + 0x6f, 0xcd, 0xd8, 0xed, 0xb6, 0x6e, 0x19, 0xca, 0x50, 0xa8, 0xc9, 0x26, 0xc7, 0x34, 0x9a, 0x1c, + 0x25, 0x6b, 0x72, 0xb4, 0x10, 0xb9, 0x0d, 0x13, 0xa2, 0x0f, 0x35, 0xda, 0xb4, 0x1d, 0x66, 0x7b, + 0xe0, 0x19, 0xa8, 0x38, 0x06, 0x70, 0x39, 0xae, 0xe1, 0xf8, 0x48, 0xd9, 0xb8, 0x8f, 0x17, 0xbc, + 0x55, 0x1c, 0x1c, 0x9e, 0x18, 0x89, 0x1f, 0x5b, 0xab, 0x7f, 0xbb, 0x00, 0xc3, 0x82, 0x94, 0x2d, + 0xdd, 0x27, 0x0a, 0x7e, 0x10, 0x05, 0x4f, 0x55, 0xd4, 0xd2, 0x61, 0x29, 0xaa, 0xfa, 0xd5, 0x7c, + 0x30, 0x1b, 0xd5, 0x1c, 0xd3, 0x3a, 0xd8, 0x6c, 0x74, 0x19, 0x60, 0x66, 0xbd, 0x6b, 0x3d, 0xe0, + 0xd7, 0x73, 0xf9, 0xf0, 0x7a, 0xae, 0x69, 0x6a, 0x12, 0x86, 0x3c, 0x09, 0xc5, 0x0a, 0xe3, 0xcf, + 0x7a, 0x66, 0x64, 0x7a, 0xe8, 0xbb, 0x9c, 0x53, 0xee, 0x05, 0x0d, 0xc1, 0x6c, 0x33, 0x37, 0xbd, + 0xe9, 0x51, 0x6e, 0x3e, 0x17, 0xf8, 0x66, 0x6e, 0x95, 0x01, 0x34, 0x0e, 0x27, 0x37, 0xe0, 0x54, + 0x85, 0xb6, 0xf4, 0xcd, 0x45, 0xb3, 0xd5, 0x32, 0x5d, 0xda, 0xb4, 0x2d, 0xc3, 0x45, 0x21, 0x8b, + 0xea, 0xda, 0xae, 0x96, 0x24, 0x20, 0x2a, 0x94, 0x96, 0xef, 0xdf, 0x77, 0xa9, 0x87, 0xe2, 0x2b, + 0x4c, 0x03, 0x9b, 0x9c, 0x6d, 0x84, 0x68, 0x02, 0xa3, 0x7e, 0x2b, 0xc7, 0x76, 0x4b, 0xee, 0x03, + 0xcf, 0xee, 0x04, 0x5a, 0x7e, 0x20, 0x91, 0x5c, 0x0d, 0xed, 0x8a, 0x3c, 0x7e, 0xed, 0xb8, 0xf8, + 0xda, 0x01, 0x61, 0x5b, 0x84, 0x16, 0x45, 0xea, 0x57, 0x15, 0x76, 0xf8, 0x2a, 0xf5, 0x4f, 0xf2, + 0x70, 0x5e, 0xb4, 0x78, 0xa6, 0x65, 0x76, 0x56, 0x6d, 0xdd, 0x31, 0x34, 0xda, 0xa4, 0xe6, 0x43, + 0x7a, 0x3c, 0x07, 0x5e, 0x74, 0xe8, 0x14, 0x0f, 0x30, 0x74, 0xae, 0xe3, 0xc6, 0x93, 0x49, 0x06, + 0x0f, 0x98, 0xb9, 0x51, 0x31, 0xb1, 0xbd, 0x35, 0x39, 0x62, 0x70, 0x30, 0x5e, 0x31, 0x68, 0x32, + 0x11, 0x53, 0x92, 0x05, 0x6a, 0xad, 0x79, 0xeb, 0xa8, 0x24, 0xfd, 0x5c, 0x49, 0x5a, 0x08, 0xd1, + 0x04, 0x46, 0xfd, 0xdf, 0xf2, 0x70, 0x26, 0x2e, 0xf2, 0x3a, 0xb5, 0x8c, 0x13, 0x79, 0x7f, 0x30, + 0xf2, 0xfe, 0xd3, 0x02, 0x3c, 0x21, 0xca, 0xd4, 0xd7, 0x75, 0x87, 0x1a, 0x15, 0xd3, 0xa1, 0x4d, + 0xcf, 0x76, 0x36, 0x8f, 0xb1, 0x01, 0x75, 0x78, 0x62, 0xbf, 0x01, 0x25, 0x71, 0xdc, 0xc0, 0xd7, + 0x99, 0xb1, 0xa0, 0x25, 0x08, 0x4d, 0xac, 0x50, 0xfc, 0xa8, 0x22, 0xd6, 0x59, 0xa5, 0xdd, 0x74, + 0xd6, 0xa7, 0x61, 0x34, 0x10, 0x3d, 0x6e, 0x7c, 0x07, 0x42, 0x6b, 0xcb, 0xf0, 0x11, 0xb8, 0xf7, + 0xd5, 0xa2, 0x84, 0x58, 0x9b, 0x0f, 0xa8, 0x56, 0xd0, 0x1a, 0x1a, 0x15, 0xb5, 0x05, 0xe5, 0x4c, + 0x43, 0x93, 0x89, 0xd4, 0xad, 0x22, 0x5c, 0x4c, 0xef, 0x76, 0x8d, 0xea, 0xc6, 0x49, 0xaf, 0x7f, + 0x24, 0x7b, 0x9d, 0x3c, 0x03, 0xc5, 0x9a, 0xee, 0xad, 0x8b, 0xeb, 0x7e, 0xbc, 0x83, 0xbe, 0x6f, + 0xb6, 0x68, 0xa3, 0xa3, 0x7b, 0xeb, 0x1a, 0xa2, 0xa4, 0x39, 0x03, 0x90, 0x63, 0xca, 0x9c, 0x21, + 0x2d, 0xf6, 0xc3, 0x4f, 0xe7, 0xae, 0x14, 0x53, 0x17, 0xfb, 0xef, 0x15, 0xb3, 0xe6, 0x95, 0x7b, + 0x8e, 0xe9, 0xd1, 0x13, 0x0d, 0x3b, 0xd1, 0xb0, 0x03, 0x6a, 0xd8, 0x3f, 0xca, 0xc3, 0x68, 0xb0, + 0x69, 0x7a, 0x8f, 0x36, 0x8f, 0x66, 0xad, 0x0a, 0xb7, 0x32, 0x85, 0x03, 0x6f, 0x65, 0x0e, 0xa2, + 0x50, 0x6a, 0x70, 0xc4, 0xca, 0x4d, 0x03, 0x94, 0x18, 0x3f, 0x62, 0x0d, 0x0e, 0x56, 0x9f, 0x81, + 0x81, 0x45, 0xfd, 0x91, 0xd9, 0xee, 0xb6, 0x85, 0x95, 0x8e, 0xee, 0x6b, 0x6d, 0xfd, 0x91, 0xe6, + 0xc3, 0xd5, 0xff, 0x36, 0x07, 0x63, 0x42, 0xa8, 0x82, 0xf9, 0x81, 0xa4, 0x1a, 0x4a, 0x27, 0x7f, + 0x60, 0xe9, 0x14, 0xf6, 0x2f, 0x1d, 0xf5, 0xaf, 0x16, 0x40, 0x99, 0x33, 0x5b, 0x74, 0xc5, 0xd1, + 0x2d, 0xf7, 0x3e, 0x75, 0xc4, 0x76, 0x7a, 0x96, 0xb1, 0x3a, 0xd0, 0x07, 0x4a, 0x53, 0x4a, 0x7e, + 0x5f, 0x53, 0xca, 0x27, 0x61, 0x48, 0x34, 0x26, 0x70, 0x9d, 0xc4, 0x51, 0xe3, 0xf8, 0x40, 0x2d, + 0xc4, 0x33, 0xe2, 0x72, 0xa7, 0xe3, 0xd8, 0x0f, 0xa9, 0xc3, 0x6f, 0xc5, 0x04, 0xb1, 0xee, 0x03, + 0xb5, 0x10, 0x2f, 0x71, 0xa6, 0xbe, 0xbd, 0x28, 0x73, 0xa6, 0x8e, 0x16, 0xe2, 0xc9, 0x15, 0x18, + 0x5c, 0xb0, 0x9b, 0x3a, 0x0a, 0x9a, 0x4f, 0x2b, 0x23, 0xdb, 0x5b, 0x93, 0x83, 0x2d, 0x01, 0xd3, + 0x02, 0x2c, 0xa3, 0xac, 0xd8, 0x1b, 0x56, 0xcb, 0xd6, 0xb9, 0xb3, 0xcd, 0x20, 0xa7, 0x34, 0x04, + 0x4c, 0x0b, 0xb0, 0x8c, 0x92, 0xc9, 0x1c, 0x9d, 0x98, 0x06, 0x43, 0x9e, 0xf7, 0x05, 0x4c, 0x0b, + 0xb0, 0xea, 0xb7, 0x8a, 0x4c, 0x7b, 0x5d, 0xf3, 0xfd, 0xc7, 0x7e, 0x5d, 0x08, 0x07, 0x4c, 0xff, + 0x3e, 0x06, 0xcc, 0x63, 0x73, 0x60, 0xa7, 0xfe, 0x8b, 0x01, 0x00, 0x21, 0xfd, 0xd9, 0x93, 0xcd, + 0xe1, 0xc1, 0xb4, 0xa6, 0x02, 0xa7, 0x66, 0xad, 0x75, 0xdd, 0x6a, 0x52, 0x23, 0x3c, 0xb6, 0x2c, + 0xe1, 0xd0, 0x46, 0xa7, 0x4b, 0x2a, 0x90, 0xe1, 0xb9, 0xa5, 0x96, 0x2c, 0x40, 0x5e, 0x84, 0xe1, + 0xaa, 0xe5, 0x51, 0x47, 0x6f, 0x7a, 0xe6, 0x43, 0x2a, 0xa6, 0x06, 0xbc, 0x89, 0x36, 0x43, 0xb0, + 0x26, 0xd3, 0x90, 0x1b, 0x30, 0x52, 0xd3, 0x1d, 0xcf, 0x6c, 0x9a, 0x1d, 0xdd, 0xf2, 0x5c, 0x65, + 0x10, 0x67, 0x34, 0xb4, 0x30, 0x3a, 0x12, 0x5c, 0x8b, 0x50, 0x91, 0x2f, 0xc2, 0x10, 0x6e, 0x4d, + 0xd1, 0x3f, 0x7c, 0x68, 0xc7, 0x8b, 0xca, 0x67, 0x43, 0x77, 0x44, 0x7e, 0xfa, 0x8a, 0x37, 0xce, + 0xf1, 0xbb, 0xca, 0x80, 0x23, 0xf9, 0x1c, 0x0c, 0xcc, 0x5a, 0x06, 0x32, 0x87, 0x1d, 0x99, 0xab, + 0x82, 0xf9, 0xb9, 0x90, 0xb9, 0xdd, 0x89, 0xf1, 0xf6, 0xd9, 0xa5, 0x8f, 0xb2, 0xe1, 0x0f, 0x6e, + 0x94, 0x8d, 0x7c, 0x00, 0xc7, 0xe2, 0xa3, 0x87, 0x75, 0x2c, 0x3e, 0xb6, 0xcf, 0x63, 0x71, 0xf5, + 0x7d, 0x18, 0x9e, 0xae, 0xcd, 0x05, 0xa3, 0xf7, 0x02, 0x14, 0x6a, 0xc2, 0x33, 0xa2, 0xc8, 0xed, + 0x99, 0x8e, 0x69, 0x68, 0x0c, 0x46, 0xae, 0xc2, 0xe0, 0x0c, 0xba, 0xdb, 0x89, 0x5b, 0xc4, 0x22, + 0x5f, 0xff, 0x9a, 0x08, 0x43, 0xaf, 0x5b, 0x1f, 0x4d, 0x3e, 0x0e, 0x03, 0x35, 0xc7, 0x5e, 0x73, + 0xf4, 0xb6, 0x58, 0x83, 0xd1, 0x35, 0xa5, 0xc3, 0x41, 0x9a, 0x8f, 0x53, 0x7f, 0x2a, 0xe7, 0x9b, + 0xed, 0xac, 0x44, 0xbd, 0x8b, 0x47, 0xf3, 0x58, 0xf7, 0x20, 0x2f, 0xe1, 0x72, 0x90, 0xe6, 0xe3, + 0xc8, 0x55, 0xe8, 0x9f, 0x75, 0x1c, 0xdb, 0x91, 0x7d, 0xea, 0x29, 0x03, 0xc8, 0xd7, 0xbd, 0x48, + 0x41, 0x5e, 0x85, 0x61, 0x3e, 0xe7, 0xf0, 0x13, 0xcd, 0x42, 0xaf, 0x9b, 0x52, 0x99, 0x52, 0xfd, + 0xbd, 0x82, 0x64, 0xb3, 0x71, 0x89, 0x3f, 0x86, 0xb7, 0x02, 0x2f, 0x41, 0x61, 0xba, 0x36, 0x27, + 0x26, 0xc0, 0xd3, 0x7e, 0x51, 0x49, 0x55, 0x62, 0xe5, 0x18, 0x35, 0xb9, 0x04, 0xc5, 0x1a, 0x53, + 0x9f, 0x12, 0xaa, 0xc7, 0xe0, 0xf6, 0xd6, 0x64, 0xb1, 0xc3, 0xf4, 0x07, 0xa1, 0x88, 0x65, 0x9b, + 0x19, 0xbe, 0x63, 0xe2, 0xd8, 0x70, 0x1f, 0x73, 0x09, 0x8a, 0x65, 0x67, 0xed, 0xa1, 0x98, 0xb5, + 0x10, 0xab, 0x3b, 0x6b, 0x0f, 0x35, 0x84, 0x92, 0x6b, 0x00, 0x1a, 0xf5, 0xba, 0x8e, 0x85, 0xcf, + 0x5d, 0x86, 0xf0, 0xfc, 0x0d, 0x67, 0x43, 0x07, 0xa1, 0x8d, 0xa6, 0x6d, 0x50, 0x4d, 0x22, 0x51, + 0xff, 0x56, 0x78, 0xb1, 0x53, 0x31, 0xdd, 0x07, 0x27, 0x5d, 0xb8, 0x87, 0x2e, 0xd4, 0xc5, 0x11, + 0x67, 0xb2, 0x93, 0x26, 0xa1, 0x7f, 0xae, 0xa5, 0xaf, 0xb9, 0xd8, 0x87, 0xc2, 0x77, 0xed, 0x3e, + 0x03, 0x68, 0x1c, 0x1e, 0xeb, 0xa7, 0xc1, 0x9d, 0xfb, 0xe9, 0x67, 0xfb, 0x83, 0xd1, 0xb6, 0x44, + 0xbd, 0x0d, 0xdb, 0x39, 0xe9, 0xaa, 0xdd, 0x76, 0xd5, 0x65, 0x18, 0xa8, 0x3b, 0x4d, 0xe9, 0xe8, + 0x02, 0xf7, 0x03, 0xae, 0xd3, 0xe4, 0xc7, 0x16, 0x3e, 0x92, 0xd1, 0x55, 0x5c, 0x0f, 0xe9, 0x06, + 0x42, 0x3a, 0xc3, 0xf5, 0x04, 0x9d, 0x40, 0x0a, 0xba, 0x9a, 0xed, 0x78, 0xa2, 0xe3, 0x02, 0xba, + 0x8e, 0xed, 0x78, 0x9a, 0x8f, 0x24, 0x9f, 0x04, 0x58, 0x99, 0xa9, 0xf9, 0xce, 0xfd, 0x43, 0xa1, + 0xef, 0xa1, 0xf0, 0xea, 0xd7, 0x24, 0x34, 0x59, 0x81, 0xa1, 0xe5, 0x0e, 0x75, 0xf8, 0x56, 0x88, + 0x3f, 0x60, 0xf9, 0x44, 0x4c, 0xb4, 0xa2, 0xdf, 0xa7, 0xc4, 0xff, 0x01, 0x39, 0x5f, 0x5f, 0x6c, + 0xff, 0xa7, 0x16, 0x32, 0x22, 0xaf, 0x42, 0xa9, 0xcc, 0xed, 0xbc, 0x61, 0x64, 0x19, 0x88, 0x0c, + 0xb7, 0xa0, 0x1c, 0xc5, 0xf7, 0xec, 0x3a, 0xfe, 0xad, 0x09, 0x72, 0xf5, 0x2a, 0x4c, 0xc4, 0xab, + 0x21, 0xc3, 0x30, 0x30, 0xb3, 0xbc, 0xb4, 0x34, 0x3b, 0xb3, 0x32, 0xd1, 0x47, 0x06, 0xa1, 0x58, + 0x9f, 0x5d, 0xaa, 0x4c, 0xe4, 0xd4, 0x5f, 0x92, 0x66, 0x10, 0xa6, 0x5a, 0x27, 0x57, 0xc3, 0x07, + 0xba, 0x6f, 0x99, 0xc0, 0xfb, 0x50, 0x3c, 0x31, 0x68, 0x9b, 0x9e, 0x47, 0x0d, 0xb1, 0x4a, 0xe0, + 0x7d, 0xa1, 0xf7, 0x48, 0x4b, 0xe0, 0xc9, 0xf3, 0x30, 0x8a, 0x30, 0x71, 0x45, 0xc8, 0xf7, 0xc7, + 0xa2, 0x80, 0xf3, 0x48, 0x8b, 0x22, 0xd5, 0x3f, 0x08, 0x6f, 0x87, 0x17, 0xa8, 0x7e, 0x5c, 0x6f, + 0x14, 0x3f, 0x24, 0xfd, 0xa5, 0xfe, 0xab, 0x22, 0x7f, 0x72, 0xc2, 0xdf, 0x27, 0x1e, 0x85, 0x28, + 0xc3, 0x23, 0xdd, 0xc2, 0x1e, 0x8e, 0x74, 0x9f, 0x87, 0xd2, 0x22, 0xf5, 0xd6, 0x6d, 0xdf, 0xf1, + 0x0b, 0x3d, 0xf4, 0xda, 0x08, 0x91, 0x3d, 0xf4, 0x38, 0x0d, 0x79, 0x00, 0xc4, 0x7f, 0x7c, 0x18, + 0x38, 0x7e, 0xfb, 0x47, 0xc8, 0xe7, 0x13, 0xfb, 0x94, 0x3a, 0x3e, 0x51, 0x46, 0x9f, 0xfe, 0x33, + 0x81, 0x63, 0xb9, 0xe4, 0x89, 0xf5, 0x2f, 0xb7, 0x26, 0x4b, 0x9c, 0x46, 0x4b, 0x61, 0x4b, 0xde, + 0x81, 0xa1, 0xc5, 0xb9, 0xb2, 0x78, 0x88, 0xc8, 0xbd, 0x22, 0x2e, 0x04, 0x52, 0xf4, 0x11, 0x81, + 0x48, 0xf0, 0x7d, 0x4f, 0xfb, 0xbe, 0x9e, 0x7c, 0x87, 0x18, 0x72, 0x61, 0xda, 0xc2, 0x5f, 0x0a, + 0x89, 0xd3, 0x85, 0x40, 0x5b, 0xa2, 0xef, 0x87, 0xe2, 0xb2, 0xe2, 0xd8, 0x98, 0xb6, 0x0c, 0x1e, + 0x60, 0x74, 0x2f, 0xc3, 0xa9, 0x72, 0xa7, 0xd3, 0x32, 0xa9, 0x81, 0xfa, 0xa2, 0x75, 0x5b, 0xd4, + 0x15, 0x2e, 0x3f, 0xf8, 0xf8, 0x44, 0xe7, 0xc8, 0x06, 0x3e, 0x7f, 0x6d, 0x38, 0xdd, 0xa8, 0x7f, + 0x66, 0xb2, 0xac, 0xfa, 0x33, 0x79, 0x38, 0x37, 0xe3, 0x50, 0xdd, 0xa3, 0x8b, 0x73, 0xe5, 0x72, + 0x17, 0x7d, 0xe4, 0x5a, 0x2d, 0x6a, 0xad, 0x1d, 0xcd, 0xb0, 0x7e, 0x03, 0xc6, 0x82, 0x06, 0xd4, + 0x9b, 0x76, 0x87, 0xca, 0x0f, 0xb9, 0x9a, 0x3e, 0xa6, 0xe1, 0x32, 0x94, 0x16, 0x23, 0x25, 0xb7, + 0xe1, 0x74, 0x00, 0x29, 0xb7, 0x5a, 0xf6, 0x86, 0x46, 0xbb, 0x2e, 0x77, 0xc4, 0x1d, 0xe4, 0x8e, + 0xb8, 0x21, 0x07, 0x9d, 0xe1, 0x1b, 0x0e, 0x23, 0xd0, 0xd2, 0x4a, 0xa9, 0xdf, 0x2c, 0xc0, 0xf9, + 0xbb, 0x7a, 0xcb, 0x34, 0x42, 0xd1, 0x68, 0xd4, 0xed, 0xd8, 0x96, 0x4b, 0x8f, 0xd1, 0x28, 0x8d, + 0x0c, 0x85, 0xe2, 0xa1, 0x0c, 0x85, 0x64, 0x17, 0xf5, 0x1f, 0xb8, 0x8b, 0x4a, 0xfb, 0xea, 0xa2, + 0xff, 0x35, 0x07, 0x13, 0xfe, 0x43, 0x03, 0xf9, 0xd1, 0xb8, 0xe4, 0x05, 0x8f, 0x47, 0x88, 0x31, + 0xbf, 0x6b, 0xc4, 0x93, 0x3a, 0x0c, 0xcc, 0x3e, 0xea, 0x98, 0x0e, 0x75, 0x77, 0xe1, 0x34, 0xfe, + 0xa4, 0x38, 0x2e, 0x39, 0x45, 0x79, 0x91, 0xc4, 0x49, 0x09, 0x07, 0xe3, 0xf3, 0x41, 0xfe, 0xd4, + 0x62, 0xda, 0x7f, 0x09, 0xcf, 0x9f, 0x0f, 0x8a, 0x27, 0x19, 0x91, 0xf7, 0xa0, 0x21, 0x29, 0x79, + 0x16, 0x0a, 0x2b, 0x2b, 0x0b, 0x62, 0x26, 0xc5, 0x08, 0x04, 0x9e, 0x27, 0xbf, 0x8f, 0x64, 0x58, + 0xf5, 0x9f, 0xe6, 0x01, 0x98, 0x2a, 0xf0, 0xe1, 0x7a, 0x24, 0x4a, 0x38, 0x0d, 0x83, 0xbe, 0xc0, + 0x85, 0x1a, 0x06, 0xaf, 0x04, 0xe2, 0x1d, 0x11, 0xaf, 0x3b, 0x78, 0x11, 0x32, 0xe9, 0x3b, 0x92, + 0xf3, 0x7b, 0x00, 0xdc, 0xd9, 0xa0, 0x23, 0xb9, 0xef, 0x3e, 0xfe, 0x49, 0x18, 0x12, 0x33, 0x9e, + 0x1d, 0x39, 0xff, 0x6f, 0xfa, 0x40, 0x2d, 0xc4, 0xc7, 0xa6, 0xd6, 0xd2, 0x01, 0x16, 0x62, 0x5f, + 0xbc, 0xbc, 0x57, 0x4e, 0xc4, 0x7b, 0xc8, 0xe2, 0xfd, 0x9a, 0x10, 0x2f, 0x7f, 0x31, 0x74, 0x6c, + 0xc5, 0x7b, 0x68, 0x67, 0xdf, 0xea, 0x3f, 0xca, 0x01, 0x61, 0xcd, 0xaa, 0xe9, 0xae, 0xbb, 0x61, + 0x3b, 0x06, 0x77, 0x4e, 0x3f, 0x12, 0xc1, 0x1c, 0xde, 0x7d, 0xe5, 0xef, 0x0d, 0xc2, 0xe9, 0x88, + 0xe3, 0xef, 0x31, 0x9f, 0xac, 0xae, 0x46, 0x47, 0x53, 0xaf, 0x57, 0x2f, 0x1f, 0x93, 0x2f, 0x44, + 0xfb, 0x23, 0x0f, 0xde, 0xa4, 0x9b, 0xd0, 0x17, 0x60, 0x44, 0xfc, 0x60, 0x2b, 0xb4, 0x7f, 0xd3, + 0x85, 0xa3, 0xd4, 0x65, 0x00, 0x2d, 0x82, 0x26, 0x2f, 0xc3, 0x10, 0x1b, 0x30, 0x6b, 0x18, 0xac, + 0x64, 0x20, 0x7c, 0x51, 0x62, 0xf8, 0x40, 0x79, 0x3d, 0x09, 0x28, 0xa5, 0x77, 0x4b, 0x83, 0xbb, + 0x78, 0xb7, 0xf4, 0x25, 0x18, 0x2e, 0x5b, 0x96, 0xed, 0xe1, 0x26, 0xdd, 0x15, 0x57, 0x13, 0x99, + 0x56, 0xf9, 0xb3, 0xf8, 0x18, 0x3f, 0xa4, 0x4f, 0x35, 0xcb, 0x65, 0x86, 0xe4, 0xba, 0xff, 0x2a, + 0x86, 0x3a, 0xc2, 0xab, 0x1c, 0xaf, 0x67, 0x1c, 0x01, 0x4b, 0x3e, 0x8a, 0xc1, 0xce, 0x1b, 0xad, + 0x39, 0x76, 0xc7, 0x76, 0xa9, 0xc1, 0x05, 0x35, 0x1c, 0x86, 0x36, 0xe8, 0x08, 0x04, 0xbe, 0x9b, + 0x8b, 0x04, 0x0e, 0x89, 0x14, 0x21, 0xf7, 0xe1, 0x8c, 0x7f, 0x51, 0x1c, 0xbc, 0x50, 0xac, 0x56, + 0x5c, 0x65, 0x04, 0x5f, 0x25, 0x91, 0xb8, 0x32, 0x54, 0x2b, 0xd3, 0x4f, 0xf9, 0xd7, 0x22, 0xfe, + 0x13, 0xc7, 0x86, 0x69, 0xc8, 0x5d, 0x9d, 0xca, 0x8f, 0xfc, 0x20, 0x0c, 0x2f, 0xea, 0x8f, 0x2a, + 0x5d, 0x71, 0xf6, 0x32, 0xba, 0xfb, 0xdb, 0x97, 0xb6, 0xfe, 0xa8, 0x61, 0x88, 0x72, 0x31, 0x9b, + 0x42, 0x66, 0x49, 0x1a, 0x70, 0xae, 0xe6, 0xd8, 0x6d, 0xdb, 0xa3, 0x46, 0xec, 0xb1, 0xdf, 0x78, + 0xf8, 0x3a, 0xb8, 0x23, 0x28, 0x1a, 0x3d, 0x5e, 0xfd, 0x65, 0xb0, 0x21, 0x6d, 0x18, 0x2f, 0xbb, + 0x6e, 0xb7, 0x4d, 0xc3, 0x1b, 0xaa, 0x89, 0x1d, 0x3f, 0xe3, 0x13, 0xc2, 0x6b, 0xf9, 0x09, 0x1d, + 0x8b, 0xf2, 0x0b, 0xaa, 0x86, 0x67, 0xca, 0x35, 0xe2, 0xb7, 0xc4, 0x79, 0xdf, 0x2a, 0x0e, 0x8e, + 0x4d, 0x8c, 0x6b, 0xe7, 0x93, 0x8d, 0x59, 0x31, 0xbd, 0x16, 0x55, 0xbf, 0x93, 0x03, 0x08, 0x05, + 0x4c, 0x5e, 0x88, 0x46, 0x44, 0xca, 0x85, 0x17, 0x1d, 0x22, 0x5a, 0x42, 0x24, 0x04, 0x12, 0xb9, + 0x04, 0x45, 0x8c, 0xa8, 0x91, 0x0f, 0x0f, 0x56, 0x1f, 0x98, 0x96, 0xa1, 0x21, 0x94, 0x61, 0xa5, + 0xa7, 0xef, 0x88, 0xc5, 0x4b, 0x7d, 0x6e, 0x15, 0x56, 0x60, 0xbc, 0xde, 0x5d, 0xf5, 0xeb, 0x96, + 0xde, 0xf1, 0x61, 0x60, 0x0f, 0xb7, 0xbb, 0x1a, 0x3c, 0x7e, 0x8d, 0x84, 0x4d, 0x89, 0x16, 0x51, + 0xbf, 0x95, 0x8b, 0xcd, 0x82, 0x47, 0xb8, 0xe8, 0x7d, 0x2c, 0xe9, 0xa7, 0x91, 0x9c, 0x96, 0xd4, + 0xbf, 0x96, 0x87, 0xe1, 0x9a, 0xed, 0x78, 0x22, 0x44, 0xc9, 0xf1, 0x5e, 0x85, 0xa4, 0xbd, 0x52, + 0x71, 0x0f, 0x7b, 0xa5, 0x4b, 0x50, 0x94, 0x5c, 0x94, 0xf9, 0xbd, 0x88, 0x61, 0x38, 0x1a, 0x42, + 0xd5, 0x1f, 0xca, 0x03, 0x7c, 0xee, 0xc5, 0x17, 0x1f, 0x63, 0x01, 0xa9, 0x7f, 0x25, 0x07, 0xe3, + 0xe2, 0xa2, 0x4e, 0x8a, 0x2d, 0x36, 0xe0, 0x5f, 0xb1, 0xca, 0xe3, 0x92, 0x83, 0x34, 0x1f, 0xc7, + 0x96, 0x80, 0xd9, 0x47, 0xa6, 0x87, 0x77, 0x15, 0x52, 0x70, 0x31, 0x2a, 0x60, 0xf2, 0x12, 0xe0, + 0xd3, 0x91, 0x17, 0xfc, 0x2b, 0xc8, 0x42, 0xb8, 0xee, 0xb1, 0x02, 0xb3, 0xa9, 0xd7, 0x90, 0xea, + 0xaf, 0x15, 0xa1, 0x38, 0xfb, 0x88, 0x36, 0x8f, 0x79, 0xd7, 0x48, 0x07, 0x9b, 0xc5, 0x03, 0x1e, + 0x6c, 0xee, 0xc7, 0xa7, 0xe2, 0xed, 0xb0, 0x3f, 0x4b, 0xd1, 0xea, 0x63, 0x3d, 0x1f, 0xaf, 0xde, + 0xef, 0xe9, 0xe3, 0xe7, 0x92, 0xf3, 0x5f, 0x14, 0xa0, 0x50, 0x9f, 0xa9, 0x9d, 0xe8, 0xcd, 0x91, + 0xea, 0x4d, 0xef, 0x3b, 0x6b, 0x35, 0xb8, 0x86, 0x1a, 0x0c, 0xbd, 0x44, 0x63, 0x37, 0x4e, 0x7f, + 0x5a, 0x80, 0xb1, 0xfa, 0xdc, 0x4a, 0x4d, 0x3a, 0x09, 0xbe, 0xcd, 0x3d, 0xf9, 0xd0, 0xa7, 0x8c, + 0x77, 0xe9, 0xa5, 0x84, 0x3d, 0x73, 0xa7, 0x6a, 0x79, 0xaf, 0xdc, 0xb8, 0xab, 0xb7, 0xba, 0x14, + 0x8f, 0x5e, 0xb8, 0xdf, 0xaf, 0x6b, 0xbe, 0x4f, 0xbf, 0x89, 0x81, 0x06, 0x7c, 0x06, 0xe4, 0x0d, + 0x28, 0xdc, 0x11, 0x1e, 0x19, 0x59, 0x7c, 0x5e, 0xba, 0xce, 0xf9, 0xb0, 0x49, 0xb0, 0xd0, 0x35, + 0x0d, 0xe4, 0xc0, 0x4a, 0xb1, 0xc2, 0x37, 0xc5, 0x02, 0xbc, 0xab, 0xc2, 0x6b, 0x7e, 0xe1, 0x9b, + 0xd5, 0x0a, 0xa9, 0xc3, 0x70, 0x8d, 0x3a, 0x6d, 0x13, 0x3b, 0xca, 0x9f, 0xb3, 0x7b, 0x33, 0x61, + 0x3b, 0x95, 0xe1, 0x4e, 0x58, 0x08, 0x99, 0xc9, 0x5c, 0xc8, 0xbb, 0x00, 0xdc, 0x46, 0xd9, 0x65, + 0xbc, 0xca, 0x27, 0xd1, 0xee, 0xe7, 0xa6, 0x65, 0x8a, 0x8d, 0x27, 0x31, 0x23, 0x0f, 0x60, 0x62, + 0xd1, 0x36, 0xcc, 0xfb, 0x26, 0x77, 0xbd, 0xc4, 0x0a, 0x4a, 0x3b, 0x3b, 0x3c, 0x31, 0x53, 0xb2, + 0x2d, 0x95, 0x4b, 0xab, 0x26, 0xc1, 0x58, 0xfd, 0xfb, 0xfd, 0x50, 0x64, 0xdd, 0x7e, 0x32, 0x7e, + 0x0f, 0x32, 0x7e, 0xcb, 0x30, 0x71, 0xcf, 0x76, 0x1e, 0x98, 0xd6, 0x5a, 0xe0, 0x15, 0x2f, 0xf6, + 0xa6, 0xe8, 0xc9, 0xb3, 0xc1, 0x71, 0x8d, 0xc0, 0x81, 0x5e, 0x4b, 0x90, 0xef, 0x30, 0x82, 0x5f, + 0x03, 0xe0, 0x6f, 0xdd, 0x91, 0x66, 0x30, 0x0c, 0x8e, 0xc1, 0x5f, 0xc2, 0xa3, 0xa3, 0xbd, 0x1c, + 0x1c, 0x23, 0x24, 0x66, 0x9b, 0x70, 0xee, 0x0b, 0x31, 0x84, 0x7e, 0xf7, 0xb8, 0x09, 0x47, 0x5f, + 0x08, 0xd9, 0x08, 0xe0, 0x5e, 0x11, 0x35, 0x00, 0xe9, 0x7e, 0x09, 0x62, 0x82, 0x88, 0x4c, 0x0e, + 0x22, 0x1c, 0x5d, 0xca, 0xf5, 0x92, 0x26, 0xf1, 0x20, 0xaf, 0xc4, 0x2e, 0xc0, 0x49, 0x84, 0x5b, + 0xe6, 0xfd, 0x77, 0xe8, 0x40, 0x35, 0xb2, 0x93, 0x03, 0x95, 0xfa, 0x77, 0x0a, 0x30, 0xcc, 0xb8, + 0xd5, 0xbb, 0xed, 0xb6, 0xee, 0x6c, 0x9e, 0x28, 0xf2, 0x41, 0x14, 0xb9, 0x01, 0xa7, 0x64, 0x87, + 0x79, 0x66, 0xba, 0xfa, 0xa1, 0x8d, 0x82, 0xe3, 0x9f, 0x38, 0x01, 0xb7, 0x2d, 0x71, 0xde, 0xf7, + 0x04, 0x18, 0xcf, 0x16, 0x5c, 0x2d, 0xc9, 0x4b, 0xfd, 0xe9, 0x1c, 0x4c, 0xc4, 0xa1, 0x81, 0xee, + 0xe7, 0x52, 0x75, 0xff, 0x79, 0x18, 0x12, 0x57, 0xe8, 0xba, 0x21, 0x3c, 0xfa, 0xc6, 0xb6, 0xb7, + 0x26, 0x01, 0xdf, 0x2f, 0x37, 0x1c, 0xaa, 0x1b, 0x5a, 0x48, 0x40, 0x5e, 0x86, 0x11, 0xfc, 0x71, + 0xcf, 0x31, 0x3d, 0x8f, 0xf2, 0xce, 0x28, 0xf2, 0x5b, 0x01, 0x5e, 0x60, 0x83, 0x23, 0xb4, 0x08, + 0x99, 0xfa, 0xfb, 0x79, 0x18, 0xaa, 0x77, 0x57, 0xdd, 0x4d, 0xd7, 0xa3, 0xed, 0x63, 0xae, 0x43, + 0xfe, 0x26, 0xbd, 0x98, 0xba, 0x49, 0x7f, 0xd6, 0x1f, 0x5a, 0xd2, 0xe9, 0x75, 0xb0, 0x31, 0xf0, + 0xbd, 0x12, 0x43, 0x2d, 0x2a, 0xed, 0x5d, 0x8b, 0xd4, 0xbf, 0x97, 0x87, 0x09, 0x7e, 0x79, 0x5b, + 0x31, 0xdd, 0xe6, 0x21, 0x3c, 0x28, 0x39, 0x7a, 0x99, 0x1e, 0xcc, 0xe1, 0x61, 0x17, 0xcf, 0x74, + 0xd4, 0xaf, 0xe4, 0x61, 0xb8, 0xdc, 0xf5, 0xd6, 0xcb, 0x1e, 0xce, 0x6f, 0x8f, 0xe5, 0x1e, 0xf9, + 0x1f, 0xe4, 0x60, 0x9c, 0x35, 0x64, 0xc5, 0x7e, 0x40, 0xad, 0x43, 0x38, 0xfc, 0x96, 0x0f, 0xb1, + 0xf3, 0xfb, 0x3c, 0xc4, 0xf6, 0x65, 0x59, 0xd8, 0x9b, 0x2c, 0xf1, 0xca, 0x46, 0xb3, 0x5b, 0xf4, + 0x78, 0x7f, 0xc6, 0x21, 0x5e, 0xd9, 0xf8, 0x02, 0x39, 0x84, 0x2b, 0xc2, 0x8f, 0x96, 0x40, 0x0e, + 0xe1, 0x7c, 0xf3, 0xa3, 0x21, 0x90, 0xdf, 0xcb, 0xc1, 0xd0, 0xb4, 0xed, 0x1d, 0xf3, 0x81, 0x2f, + 0xbe, 0xe2, 0x78, 0xab, 0xb9, 0xff, 0x15, 0xc7, 0x5b, 0x37, 0xd5, 0x9f, 0xcb, 0xc3, 0x19, 0x11, + 0x0f, 0x5f, 0x9c, 0x81, 0x9d, 0x4c, 0xc7, 0x62, 0xb0, 0x25, 0x45, 0x73, 0x32, 0x0f, 0x09, 0xd1, + 0xfc, 0x42, 0x01, 0xce, 0x60, 0xf8, 0x5e, 0xb6, 0xa3, 0xfa, 0x08, 0xd8, 0x22, 0xa4, 0x19, 0xbd, + 0x88, 0x5f, 0x4c, 0xb9, 0x88, 0xff, 0x97, 0x5b, 0x93, 0xaf, 0xac, 0x99, 0xde, 0x7a, 0x77, 0x75, + 0xaa, 0x69, 0xb7, 0xaf, 0xad, 0x39, 0xfa, 0x43, 0x93, 0x5f, 0x41, 0xeb, 0xad, 0x6b, 0x61, 0x9a, + 0x9a, 0x8e, 0x29, 0x92, 0xce, 0xd4, 0x71, 0xa7, 0xc4, 0xb8, 0xfa, 0x57, 0xf8, 0x2e, 0xc0, 0x2d, + 0xdb, 0xb4, 0x84, 0x5f, 0x2b, 0x37, 0x74, 0xeb, 0xdb, 0x5b, 0x93, 0x67, 0xdf, 0xb3, 0x4d, 0xab, + 0x11, 0x77, 0x6e, 0xdd, 0x6b, 0x7d, 0x21, 0x6b, 0x4d, 0xaa, 0x46, 0xfd, 0x6f, 0x72, 0x70, 0x21, + 0xaa, 0xc5, 0x1f, 0x05, 0xdb, 0xf1, 0x2f, 0xe5, 0xe1, 0xec, 0x4d, 0x14, 0x4e, 0xe0, 0x4c, 0x74, + 0x32, 0x6f, 0x89, 0xc1, 0x99, 0x22, 0x9b, 0x13, 0x8b, 0x32, 0x5b, 0x36, 0x27, 0x93, 0xba, 0x90, + 0xcd, 0x7f, 0x9d, 0x83, 0xd3, 0xcb, 0xd5, 0xca, 0xcc, 0x47, 0x64, 0x44, 0x25, 0xbf, 0xe7, 0x98, + 0x1b, 0x9c, 0x89, 0xef, 0x39, 0xe6, 0xa6, 0xe7, 0x37, 0xf2, 0x70, 0xba, 0x5e, 0x5e, 0x5c, 0xf8, + 0xa8, 0xcc, 0xe0, 0x33, 0xb2, 0xe7, 0xab, 0x7f, 0x08, 0x26, 0x6c, 0x01, 0xf9, 0x33, 0xef, 0x5e, + 0xcf, 0xf6, 0x88, 0x4d, 0x0a, 0xe5, 0x98, 0x4f, 0xdd, 0x87, 0x22, 0x14, 0xa6, 0xf9, 0x11, 0xea, + 0x63, 0xae, 0xf9, 0xff, 0x79, 0x09, 0x86, 0x6f, 0x77, 0x57, 0xa9, 0x70, 0x90, 0x7a, 0xac, 0x4f, + 0x7e, 0xaf, 0xc3, 0xb0, 0x10, 0x03, 0xde, 0x70, 0x48, 0x01, 0x1c, 0x45, 0x40, 0x1e, 0x1e, 0x23, + 0x4b, 0x26, 0x22, 0x97, 0xa0, 0x78, 0x97, 0x3a, 0xab, 0xf2, 0xdb, 0xe6, 0x87, 0xd4, 0x59, 0xd5, + 0x10, 0x4a, 0x16, 0xc2, 0x67, 0x1b, 0xe5, 0x5a, 0x15, 0x93, 0x07, 0x89, 0x4b, 0x43, 0xcc, 0x86, + 0x14, 0xf8, 0x5e, 0xea, 0x1d, 0x93, 0xa7, 0x1d, 0x92, 0xe3, 0x2a, 0xc4, 0x4b, 0x92, 0x25, 0x38, + 0x25, 0x3b, 0xdf, 0xf1, 0xcc, 0x39, 0x83, 0x29, 0xec, 0xd2, 0x72, 0xe6, 0x24, 0x8b, 0x92, 0xb7, + 0x61, 0xc4, 0x07, 0xa2, 0x1b, 0xe1, 0x50, 0x98, 0xae, 0x21, 0x60, 0x15, 0x8b, 0xae, 0x1f, 0x29, + 0x20, 0x33, 0xc0, 0x4b, 0x0c, 0x48, 0x61, 0x10, 0x73, 0xcb, 0x8c, 0x14, 0x20, 0x2f, 0x23, 0x03, + 0x7c, 0x6a, 0x84, 0x0e, 0x53, 0xc3, 0xf8, 0xf0, 0x17, 0x2f, 0x80, 0x1c, 0x01, 0xe7, 0xcf, 0xbb, + 0x23, 0x64, 0x64, 0x19, 0x20, 0x74, 0x6c, 0x11, 0x41, 0x34, 0xf6, 0xec, 0x72, 0x23, 0xb1, 0x90, + 0x6f, 0xf2, 0x46, 0xf7, 0x73, 0x93, 0xa7, 0xfe, 0x4c, 0x01, 0x86, 0xcb, 0x9d, 0x4e, 0x30, 0x14, + 0x5e, 0x80, 0x52, 0xb9, 0xd3, 0xb9, 0xa3, 0x55, 0xe5, 0x70, 0xfa, 0x7a, 0xa7, 0xd3, 0xe8, 0x3a, + 0xa6, 0xec, 0x97, 0xcc, 0x89, 0xc8, 0x0c, 0x8c, 0x96, 0x3b, 0x9d, 0x5a, 0x77, 0xb5, 0x65, 0x36, + 0xa5, 0x6c, 0x60, 0x3c, 0x5f, 0x62, 0xa7, 0xd3, 0xe8, 0x20, 0x26, 0x9e, 0x12, 0x2e, 0x5a, 0x86, + 0x7c, 0x09, 0x43, 0x4f, 0x89, 0x64, 0x54, 0x3c, 0xdd, 0x8d, 0x1a, 0x04, 0xd2, 0x0f, 0xdb, 0x36, + 0x15, 0x10, 0xf1, 0x84, 0x03, 0x97, 0xfc, 0x34, 0x11, 0xac, 0xa2, 0x44, 0xd2, 0xa9, 0x90, 0x25, + 0xf9, 0x14, 0x0c, 0x94, 0x3b, 0x1d, 0xe9, 0xb6, 0x0a, 0x1d, 0xdb, 0x58, 0xa9, 0x78, 0xbe, 0x3f, + 0x41, 0x26, 0x3e, 0x4b, 0xdc, 0x6f, 0xdb, 0x8e, 0x87, 0x43, 0x6a, 0x34, 0xfc, 0x2c, 0xff, 0x42, + 0xdc, 0x96, 0xa3, 0xbd, 0x68, 0xd1, 0x32, 0x17, 0xdf, 0x84, 0xb1, 0x68, 0x8b, 0xf7, 0x94, 0xf5, + 0xe0, 0xfb, 0x39, 0x94, 0xca, 0x31, 0x77, 0xce, 0x7f, 0x09, 0x0a, 0xe5, 0x4e, 0x47, 0x4c, 0x6a, + 0xa7, 0x53, 0x3a, 0x35, 0xfe, 0x96, 0xbf, 0xdc, 0xe9, 0xf8, 0x9f, 0x7e, 0xcc, 0x5f, 0xf9, 0xec, + 0xeb, 0xd3, 0x7f, 0x8f, 0x7f, 0xfa, 0xf1, 0x7e, 0x81, 0xa3, 0xfe, 0x5a, 0x01, 0xc6, 0xcb, 0x9d, + 0xce, 0x49, 0xb6, 0x84, 0xc3, 0x8a, 0x18, 0xf0, 0x22, 0x80, 0x34, 0xc7, 0x0e, 0x04, 0x6f, 0x10, + 0x87, 0xa5, 0xf9, 0x55, 0xc9, 0x69, 0x12, 0x91, 0xaf, 0x7e, 0x83, 0x7b, 0x52, 0xbf, 0xaf, 0x14, + 0x70, 0xe2, 0x3b, 0xee, 0xd1, 0xcf, 0x3e, 0x2c, 0xdd, 0x26, 0xfa, 0xa0, 0xb4, 0xa7, 0x3e, 0xf8, + 0xdd, 0xc8, 0xe0, 0xc1, 0xe8, 0xfb, 0x27, 0xbd, 0xd0, 0x7f, 0x20, 0xdb, 0x7a, 0x4c, 0x16, 0xa6, + 0x08, 0xc9, 0xe4, 0x67, 0x20, 0x13, 0x01, 0xc2, 0x9a, 0x0c, 0xd5, 0x30, 0x0d, 0x2d, 0x46, 0xeb, + 0xf7, 0xe1, 0xc0, 0x9e, 0xfa, 0x70, 0x2b, 0x8f, 0x41, 0x00, 0x82, 0x00, 0x63, 0x07, 0xdf, 0xa2, + 0x5c, 0x03, 0xe0, 0xee, 0x0b, 0x81, 0x7f, 0xfe, 0x28, 0x8f, 0x25, 0xc4, 0x13, 0x93, 0x89, 0x58, + 0x42, 0x21, 0x49, 0xe0, 0xee, 0x54, 0x48, 0x75, 0x77, 0xba, 0x0a, 0x83, 0x9a, 0xbe, 0xf1, 0x4e, + 0x97, 0x3a, 0x9b, 0xc2, 0x26, 0xe2, 0xf1, 0x3b, 0xf5, 0x8d, 0xc6, 0x97, 0x19, 0x50, 0x0b, 0xd0, + 0x44, 0x0d, 0xa2, 0x48, 0x48, 0x6e, 0x25, 0xfc, 0xa0, 0x3d, 0x88, 0x1d, 0xb1, 0x1f, 0x45, 0x27, + 0xaf, 0x43, 0xa1, 0x7c, 0xaf, 0x2e, 0x24, 0x1b, 0x74, 0x6d, 0xf9, 0x5e, 0x5d, 0xc8, 0x2b, 0xb3, + 0xec, 0xbd, 0xba, 0xfa, 0x95, 0x3c, 0x90, 0x24, 0x25, 0x79, 0x05, 0x86, 0x10, 0xba, 0xc6, 0x74, + 0x46, 0xce, 0x68, 0xbb, 0xe1, 0x36, 0x1c, 0x84, 0x46, 0x2c, 0x44, 0x9f, 0x94, 0xbc, 0x86, 0x39, + 0xc3, 0x45, 0x4e, 0xc5, 0x48, 0x46, 0xdb, 0x0d, 0xd7, 0xcf, 0xb2, 0x1d, 0x4b, 0x19, 0x2e, 0x88, + 0xd1, 0xb8, 0xbc, 0x57, 0x9f, 0xb7, 0x5d, 0x4f, 0x88, 0x9a, 0x1b, 0x97, 0x1b, 0x2e, 0xa6, 0x52, + 0x8e, 0x18, 0x97, 0x9c, 0x0c, 0xd3, 0xc1, 0xdd, 0xab, 0xf3, 0xf7, 0x56, 0x86, 0x66, 0xb7, 0x7c, + 0xab, 0x94, 0xa7, 0x83, 0xdb, 0x70, 0x1b, 0xfc, 0xad, 0x96, 0x81, 0xc9, 0xca, 0x23, 0xe9, 0xe0, + 0x22, 0xa5, 0xd4, 0x9f, 0x1c, 0x84, 0x89, 0x8a, 0xee, 0xe9, 0xab, 0xba, 0x4b, 0xa5, 0x2d, 0xf9, + 0xb8, 0x0f, 0xf3, 0x3f, 0x47, 0x92, 0x83, 0xb1, 0x9a, 0xf2, 0x35, 0xf1, 0x02, 0xe4, 0x8d, 0x90, + 0x6f, 0x90, 0xac, 0x57, 0xce, 0xfe, 0xb7, 0xda, 0xe8, 0x08, 0xb0, 0x96, 0x20, 0x24, 0xcf, 0xc3, + 0xb0, 0x0f, 0x63, 0xbb, 0x88, 0x42, 0xa8, 0x33, 0xc6, 0x2a, 0xdb, 0x44, 0x68, 0x32, 0x9a, 0xbc, + 0x06, 0x23, 0xfe, 0x4f, 0xc9, 0x3e, 0xe7, 0xa9, 0x0c, 0x57, 0x13, 0x5b, 0x30, 0x99, 0x54, 0x2e, + 0x8a, 0xf3, 0x5b, 0x7f, 0xa4, 0x68, 0x2c, 0x5b, 0x60, 0x84, 0x94, 0x7c, 0x19, 0xc6, 0xfc, 0xdf, + 0x62, 0xd7, 0xc1, 0xbd, 0x0f, 0x9f, 0x0f, 0x72, 0xa1, 0xc7, 0xc4, 0x3a, 0x15, 0x25, 0xe7, 0xfb, + 0x8f, 0x27, 0xfc, 0x04, 0x78, 0xc6, 0x6a, 0x72, 0xfb, 0x11, 0xab, 0x80, 0x54, 0xe1, 0x94, 0x0f, + 0x09, 0x35, 0x74, 0x20, 0xdc, 0x76, 0x1a, 0xab, 0x8d, 0x54, 0x25, 0x4d, 0x96, 0x22, 0x2d, 0xb8, + 0x14, 0x01, 0x1a, 0xee, 0xba, 0x79, 0xdf, 0x13, 0x7b, 0x46, 0x11, 0x4c, 0x5b, 0x64, 0x3c, 0x0d, + 0xb8, 0x72, 0x1a, 0x3f, 0x75, 0x71, 0x34, 0xcd, 0x59, 0x4f, 0x6e, 0xa4, 0x0e, 0x67, 0x7c, 0xfc, + 0xcd, 0x99, 0x5a, 0xcd, 0xb1, 0xdf, 0xa3, 0x4d, 0xaf, 0x5a, 0x11, 0x7b, 0x6e, 0x0c, 0xb2, 0x68, + 0xac, 0x36, 0xd6, 0x9a, 0x1d, 0xa6, 0x14, 0x0c, 0x17, 0x65, 0x9e, 0x5a, 0x98, 0xdc, 0x85, 0xb3, + 0x12, 0x5c, 0xca, 0xab, 0x0e, 0xe1, 0xa1, 0x80, 0xe0, 0x9a, 0x9e, 0x5a, 0x3d, 0xbd, 0x38, 0x79, + 0x13, 0x46, 0x7d, 0x04, 0xbf, 0x8a, 0x1c, 0xc6, 0xab, 0x48, 0x1c, 0x92, 0xc6, 0x6a, 0x23, 0xfe, + 0x2c, 0x38, 0x4a, 0x2c, 0x6b, 0xd4, 0xca, 0x66, 0x87, 0x0a, 0xb7, 0x60, 0x5f, 0xa3, 0xbc, 0xcd, + 0x4e, 0xaa, 0x32, 0x32, 0x52, 0xf2, 0x76, 0xa8, 0x51, 0xcb, 0x8e, 0xb9, 0x66, 0xf2, 0xed, 0xb8, + 0xff, 0x12, 0x78, 0xb5, 0x61, 0x23, 0x30, 0x4d, 0x3f, 0x38, 0xf9, 0xc5, 0x32, 0x9c, 0x4e, 0xd1, + 0xb1, 0x3d, 0xed, 0x18, 0xbf, 0x9a, 0x0f, 0x1b, 0x71, 0xcc, 0xb7, 0x8d, 0xd3, 0x30, 0xe8, 0x7f, + 0x89, 0x30, 0x1e, 0x94, 0xac, 0xa1, 0x19, 0xe7, 0xe1, 0xe3, 0x23, 0xe2, 0x38, 0xe6, 0x5b, 0xc9, + 0xc3, 0x10, 0xc7, 0x77, 0x73, 0xa1, 0x38, 0x8e, 0xf9, 0xf6, 0xf2, 0x27, 0x8a, 0xe1, 0x9c, 0x74, + 0xb2, 0xc7, 0x3c, 0x2c, 0x33, 0x39, 0x74, 0xa6, 0x2d, 0xed, 0xe1, 0x45, 0xae, 0xac, 0x9a, 0x03, + 0xfb, 0x53, 0x4d, 0xf2, 0x26, 0x0c, 0xd7, 0x6c, 0xd7, 0x5b, 0x73, 0xa8, 0x5b, 0x0b, 0x92, 0x41, + 0xe0, 0x6b, 0xee, 0x8e, 0x00, 0x37, 0x3a, 0x91, 0xd9, 0x5f, 0x26, 0x57, 0xff, 0x71, 0x21, 0xa1, + 0x0d, 0xdc, 0x70, 0x3d, 0x96, 0xda, 0x70, 0x08, 0x43, 0x9d, 0x5c, 0x0f, 0x57, 0x41, 0x6e, 0xe1, + 0xf7, 0x4b, 0x91, 0x2e, 0x57, 0x85, 0x81, 0x1f, 0x25, 0x21, 0x5f, 0x80, 0xf3, 0x11, 0x40, 0x4d, + 0x77, 0xf4, 0x36, 0xf5, 0xc2, 0xc4, 0x9b, 0x18, 0xbb, 0xcc, 0x2f, 0xdd, 0xe8, 0x04, 0x68, 0x39, + 0x99, 0x67, 0x06, 0x07, 0x49, 0xb5, 0x06, 0xf6, 0xe0, 0xa7, 0xfd, 0xb3, 0x85, 0xd0, 0xd0, 0x89, + 0xc6, 0x20, 0xd6, 0xa8, 0xdb, 0x6d, 0x79, 0x8f, 0x6f, 0x07, 0xef, 0x2f, 0xc3, 0xcb, 0x3c, 0x8c, + 0x97, 0xef, 0xdf, 0xa7, 0x4d, 0xcf, 0x0f, 0xad, 0xee, 0x8a, 0xa8, 0x93, 0x7c, 0xe3, 0x21, 0x50, + 0x22, 0x54, 0xb6, 0xdc, 0xaf, 0xf1, 0x62, 0xea, 0x3f, 0x29, 0x82, 0x12, 0x18, 0xfe, 0xc1, 0x7b, + 0xc5, 0x23, 0x5c, 0x64, 0x3f, 0x14, 0xbd, 0x62, 0xc2, 0xa9, 0x50, 0x18, 0xe2, 0xa1, 0x98, 0x48, + 0x05, 0x3f, 0x19, 0x67, 0x16, 0x12, 0xf2, 0xbd, 0xc4, 0x45, 0xb1, 0x97, 0x20, 0xe1, 0x7b, 0xd0, + 0x86, 0xcb, 0x59, 0x68, 0x49, 0xae, 0xe4, 0x6b, 0x39, 0x38, 0xe3, 0x77, 0xca, 0xf2, 0x2a, 0x33, + 0xaa, 0x67, 0xec, 0xae, 0x15, 0xbc, 0xa2, 0x7a, 0x3d, 0xbb, 0x3a, 0xde, 0x49, 0x53, 0x69, 0x85, + 0x79, 0x4b, 0x82, 0xf8, 0x2a, 0x81, 0x42, 0xd8, 0x48, 0xd3, 0x68, 0x22, 0x91, 0x96, 0x5a, 0xef, + 0xc5, 0x9b, 0x70, 0x21, 0x93, 0xe5, 0x4e, 0x46, 0x6c, 0xbf, 0x6c, 0xc4, 0xfe, 0x77, 0xb9, 0x70, + 0x22, 0x8a, 0x09, 0x89, 0x4c, 0x01, 0x84, 0x20, 0xb1, 0xad, 0xc5, 0x47, 0x5a, 0xa1, 0xd0, 0x34, + 0x89, 0x82, 0x2c, 0x43, 0x49, 0x88, 0x85, 0x27, 0xb9, 0xfe, 0xe4, 0x0e, 0xbd, 0x30, 0x25, 0xcb, + 0x01, 0xb7, 0xac, 0xe2, 0x9b, 0x05, 0x9b, 0x8b, 0xaf, 0xc1, 0xf0, 0x7e, 0xbf, 0xeb, 0x6b, 0x05, + 0x20, 0xf2, 0x1e, 0xf4, 0x08, 0x0d, 0xf4, 0x63, 0x3c, 0x85, 0x5d, 0x81, 0x41, 0xf6, 0x09, 0x98, + 0xf6, 0x45, 0x0a, 0xf3, 0xdc, 0x15, 0x30, 0x2d, 0xc0, 0x86, 0x31, 0xd6, 0x06, 0xd2, 0x63, 0xac, + 0xa9, 0x3f, 0x5d, 0x80, 0x73, 0x72, 0x87, 0x54, 0x28, 0x66, 0x8e, 0x38, 0xe9, 0x94, 0x0f, 0xb0, + 0x53, 0x54, 0x28, 0xf1, 0xad, 0x87, 0x48, 0xe1, 0xc1, 0x8f, 0x85, 0x10, 0xa2, 0x09, 0x8c, 0xfa, + 0x3f, 0xe7, 0x61, 0x34, 0x30, 0xef, 0x74, 0xc7, 0x7d, 0x8c, 0xbb, 0xe3, 0xd3, 0x30, 0x8a, 0x51, + 0xb2, 0xda, 0xd4, 0xe2, 0x91, 0xa4, 0xfa, 0xa5, 0x9c, 0x3b, 0x3e, 0x42, 0xa4, 0x57, 0x8b, 0x10, + 0x32, 0xed, 0xe7, 0x96, 0x9f, 0x14, 0xbb, 0x8c, 0x9b, 0x7d, 0x1c, 0xae, 0xfe, 0xf5, 0x02, 0x8c, + 0xf8, 0x52, 0x9e, 0x36, 0x8f, 0xeb, 0x3d, 0xcf, 0xd1, 0x0a, 0xf9, 0x1a, 0x40, 0xcd, 0x76, 0x3c, + 0xbd, 0xb5, 0x14, 0x6a, 0x3e, 0x1e, 0x90, 0x76, 0x10, 0xca, 0xcb, 0x48, 0x24, 0xb8, 0x7e, 0x85, + 0x66, 0x35, 0x9f, 0x98, 0xf8, 0xfa, 0x15, 0x40, 0x35, 0x89, 0x42, 0xfd, 0xad, 0x3c, 0x8c, 0xfb, + 0x9d, 0x34, 0xfb, 0x88, 0x36, 0xbb, 0x8f, 0xf3, 0xdc, 0x14, 0x95, 0x76, 0xff, 0x8e, 0xd2, 0x56, + 0xff, 0x4f, 0x69, 0x22, 0x99, 0x69, 0xd9, 0x27, 0x13, 0xc9, 0x9f, 0x85, 0x8e, 0xab, 0x3f, 0x52, + 0x80, 0x33, 0xbe, 0xd4, 0xe7, 0xba, 0x16, 0x1e, 0x2d, 0xcc, 0xe8, 0xad, 0xd6, 0xe3, 0xbc, 0x1b, + 0x1f, 0xf6, 0x05, 0xb1, 0x2c, 0xc2, 0x4e, 0x8a, 0x54, 0x97, 0xf7, 0x05, 0xb8, 0x61, 0x9b, 0x86, + 0x26, 0x13, 0x91, 0xb7, 0x61, 0xc4, 0xff, 0x59, 0x76, 0xd6, 0xfc, 0x2d, 0x38, 0x5e, 0x14, 0x04, + 0x85, 0x74, 0x27, 0x12, 0x5d, 0x23, 0x52, 0x40, 0xfd, 0xca, 0x00, 0x5c, 0xbc, 0x67, 0x5a, 0x86, + 0xbd, 0xe1, 0xfa, 0x99, 0x52, 0x8f, 0xfd, 0x41, 0xd9, 0x51, 0x67, 0x48, 0x7d, 0x07, 0xce, 0xc6, + 0x45, 0xea, 0x04, 0xf1, 0xeb, 0x45, 0xef, 0x6c, 0x70, 0x82, 0x86, 0x9f, 0x33, 0x55, 0xdc, 0xb6, + 0x69, 0xe9, 0x25, 0xe3, 0x49, 0x57, 0x07, 0x76, 0x93, 0x74, 0xf5, 0x39, 0x28, 0x55, 0xec, 0xb6, + 0x6e, 0xfa, 0x71, 0x96, 0x70, 0x14, 0x07, 0xf5, 0x22, 0x46, 0x13, 0x14, 0x8c, 0xbf, 0xa8, 0x18, + 0xbb, 0x6c, 0x28, 0xe4, 0xef, 0x17, 0x60, 0x56, 0x9a, 0x26, 0x13, 0x11, 0x1b, 0x46, 0x45, 0x75, + 0xe2, 0x6e, 0x0c, 0x70, 0xf3, 0xf4, 0xb2, 0x2f, 0xa3, 0x6c, 0xb5, 0x9a, 0x8a, 0x94, 0xe3, 0xdb, + 0x28, 0x9e, 0x0b, 0x56, 0x7c, 0x0c, 0xbf, 0x25, 0xd3, 0xa2, 0xfc, 0x25, 0x21, 0xe0, 0x24, 0x33, + 0x9c, 0x14, 0x02, 0xce, 0x32, 0x32, 0x11, 0x99, 0x85, 0x53, 0x18, 0x65, 0x3c, 0xd8, 0x4a, 0x31, + 0x95, 0x18, 0x41, 0xa3, 0x12, 0xaf, 0x5c, 0x78, 0x60, 0x72, 0xf6, 0x71, 0x8d, 0xa6, 0x40, 0x6b, + 0xc9, 0x12, 0xe4, 0x02, 0x14, 0x96, 0x16, 0xca, 0x78, 0x57, 0x33, 0xc8, 0x33, 0x7c, 0x59, 0x2d, + 0x5d, 0x63, 0xb0, 0x8b, 0x9f, 0x05, 0x92, 0xfc, 0x9c, 0x3d, 0xdd, 0xc7, 0xfc, 0x97, 0xd2, 0x96, + 0xef, 0xb8, 0x7b, 0xd4, 0x1c, 0xc6, 0x44, 0x18, 0x49, 0xae, 0xd7, 0xff, 0x41, 0x26, 0xd7, 0x2b, + 0x1d, 0x6a, 0x72, 0x3d, 0xf5, 0x97, 0x73, 0x70, 0x2a, 0x11, 0x89, 0x9f, 0xbc, 0x04, 0xc0, 0x21, + 0x52, 0xc4, 0x53, 0x0c, 0x21, 0x14, 0x46, 0xe7, 0x17, 0xcb, 0x63, 0x48, 0x46, 0xae, 0xc1, 0x20, + 0xff, 0x25, 0xa2, 0x94, 0x25, 0x8b, 0x74, 0xbb, 0xa6, 0xa1, 0x05, 0x44, 0x61, 0x2d, 0x78, 0x23, + 0x59, 0x48, 0x2d, 0xe2, 0x6d, 0x76, 0x82, 0x5a, 0x18, 0x99, 0xfa, 0x93, 0x79, 0x18, 0x09, 0x1a, + 0x5c, 0x36, 0x8e, 0x4a, 0xe7, 0x4a, 0x22, 0xa9, 0x41, 0x61, 0xa7, 0xa4, 0x06, 0xb1, 0xf9, 0x56, + 0x64, 0x31, 0x38, 0xbc, 0x57, 0x59, 0x5f, 0xcf, 0xc3, 0x78, 0x50, 0xeb, 0x11, 0x5e, 0x7e, 0x7d, + 0x88, 0x44, 0xf2, 0xb5, 0x1c, 0x28, 0xd3, 0x66, 0xab, 0x65, 0x5a, 0x6b, 0x55, 0xeb, 0xbe, 0xed, + 0xb4, 0x71, 0x42, 0x3c, 0xba, 0x23, 0x5c, 0xf5, 0xcf, 0xe7, 0xe0, 0x94, 0x68, 0xd0, 0x8c, 0xee, + 0x18, 0x47, 0x77, 0x3e, 0x16, 0x6f, 0xc9, 0xd1, 0xe9, 0x8b, 0xfa, 0xed, 0x3c, 0xc0, 0x82, 0xdd, + 0x7c, 0x70, 0xcc, 0x1f, 0x75, 0xbd, 0x01, 0x25, 0xee, 0x16, 0x2f, 0x34, 0xf6, 0x94, 0x78, 0xbc, + 0xc4, 0x3e, 0x8d, 0x23, 0xa6, 0x27, 0xc4, 0x7c, 0x5c, 0xe2, 0x9e, 0xf5, 0x4a, 0x4e, 0x13, 0x45, + 0x58, 0xa5, 0x8c, 0x4e, 0x2c, 0x18, 0x41, 0xa5, 0x0c, 0x16, 0xad, 0x74, 0x7b, 0x6b, 0xb2, 0xd8, + 0xb2, 0x9b, 0x0f, 0x34, 0xa4, 0x57, 0xff, 0x55, 0x8e, 0xcb, 0xee, 0x98, 0x3f, 0x4d, 0xf5, 0x3f, + 0xbf, 0xb8, 0xc7, 0xcf, 0xff, 0x0b, 0x39, 0x38, 0xa3, 0xd1, 0xa6, 0xfd, 0x90, 0x3a, 0x9b, 0x33, + 0xb6, 0x41, 0x6f, 0x52, 0x8b, 0x3a, 0x47, 0x35, 0xa2, 0x7e, 0x1b, 0xb3, 0xc0, 0x84, 0x8d, 0xb9, + 0xe3, 0x52, 0xe3, 0xf8, 0x64, 0xe8, 0x51, 0x7f, 0x75, 0x00, 0x94, 0x54, 0xab, 0xf7, 0xd8, 0x9a, + 0x73, 0x99, 0x5b, 0x99, 0xe2, 0x61, 0x6d, 0x65, 0xfa, 0xf7, 0xb6, 0x95, 0x29, 0xed, 0x75, 0x2b, + 0x33, 0xb0, 0x9b, 0xad, 0x4c, 0x3b, 0xbe, 0x95, 0x19, 0xc4, 0xad, 0xcc, 0x4b, 0x3d, 0xb7, 0x32, + 0xb3, 0x96, 0xb1, 0xcf, 0x8d, 0xcc, 0xb1, 0xcd, 0x1e, 0xbd, 0x9f, 0x1d, 0xd8, 0x15, 0x36, 0x29, + 0x36, 0x6d, 0xc7, 0xa0, 0x86, 0xd8, 0x78, 0xe1, 0xa9, 0xbf, 0x23, 0x60, 0x5a, 0x80, 0x4d, 0xa4, + 0xe2, 0x1e, 0xdd, 0x4d, 0x2a, 0xee, 0x43, 0xd8, 0x7f, 0x7d, 0x35, 0x0f, 0xa7, 0x66, 0xa8, 0xe3, + 0xf1, 0x58, 0xb4, 0x87, 0xe1, 0x12, 0x57, 0x86, 0x71, 0x89, 0x21, 0x5a, 0xe4, 0xf9, 0xd0, 0xcd, + 0xaf, 0x49, 0x1d, 0x2f, 0xee, 0x25, 0x18, 0xa7, 0x67, 0xd5, 0xfb, 0xe9, 0xf0, 0xc4, 0xd8, 0x0d, + 0xaa, 0xf7, 0xe1, 0x5c, 0x90, 0xa6, 0xf8, 0xa5, 0x05, 0xf4, 0x52, 0x86, 0xbb, 0xe2, 0xde, 0x33, + 0xdc, 0xa9, 0xbf, 0x94, 0x83, 0xcb, 0x1a, 0xb5, 0xe8, 0x86, 0xbe, 0xda, 0xa2, 0x52, 0xb3, 0xc4, + 0xca, 0xc0, 0x66, 0x0d, 0xd3, 0x6d, 0xeb, 0x5e, 0x73, 0xfd, 0x40, 0x32, 0x9a, 0x83, 0x11, 0x79, + 0xfe, 0xda, 0xc3, 0xdc, 0x16, 0x29, 0xa7, 0xfe, 0x6a, 0x11, 0x06, 0xa6, 0x6d, 0xef, 0x96, 0x7d, + 0xc0, 0x94, 0x8b, 0xe1, 0x94, 0x9f, 0xdf, 0xc3, 0x59, 0xcf, 0xa7, 0xb0, 0x72, 0x29, 0x0b, 0x05, + 0xba, 0x90, 0xae, 0xda, 0x89, 0x6c, 0x1d, 0x3e, 0xd9, 0x1e, 0x93, 0x2d, 0xbe, 0x02, 0x43, 0x18, + 0x42, 0x46, 0x3a, 0x8d, 0x45, 0x07, 0x6d, 0x8f, 0x01, 0xe3, 0x75, 0x84, 0xa4, 0xe4, 0x0b, 0x91, + 0xe0, 0xb9, 0xa5, 0x83, 0x27, 0x67, 0x94, 0xe3, 0xe8, 0xbe, 0xc4, 0x2f, 0xf2, 0xb0, 0x4d, 0x52, + 0x22, 0x1b, 0x3c, 0x45, 0x89, 0x35, 0x29, 0x20, 0x3c, 0xc4, 0xc4, 0x89, 0x33, 0x30, 0x3a, 0x6d, + 0x7b, 0x92, 0x33, 0xf0, 0x50, 0xf8, 0x96, 0x94, 0x49, 0x3e, 0xdd, 0x13, 0x38, 0x5a, 0x46, 0xfd, + 0xd3, 0x22, 0x8c, 0xf8, 0x3f, 0x8f, 0x48, 0x77, 0x5e, 0x80, 0xd2, 0xbc, 0x2d, 0xe5, 0xf2, 0x40, + 0x07, 0xe2, 0x75, 0xdb, 0x8d, 0x79, 0x46, 0x0b, 0x22, 0x26, 0xf5, 0x25, 0xdb, 0x90, 0xdd, 0xdf, + 0x51, 0xea, 0x96, 0x6d, 0x24, 0xde, 0x20, 0x07, 0x84, 0xe4, 0x32, 0x14, 0xf1, 0xe5, 0x80, 0x74, + 0x90, 0x1f, 0x7b, 0x2d, 0x80, 0x78, 0x49, 0x2b, 0x4b, 0x7b, 0xd5, 0xca, 0x81, 0xfd, 0x6a, 0xe5, + 0xe0, 0xe1, 0x6a, 0xe5, 0xbb, 0x30, 0x82, 0x35, 0xf9, 0xa9, 0x00, 0x77, 0x5e, 0x58, 0x2f, 0x88, + 0xb5, 0x6f, 0x94, 0xb7, 0x5b, 0x24, 0x04, 0xc4, 0x25, 0x2f, 0xc2, 0x2a, 0xa6, 0xbb, 0x70, 0x80, + 0xed, 0xf4, 0x3f, 0xce, 0xc1, 0xc0, 0x1d, 0xeb, 0x81, 0x65, 0x6f, 0x1c, 0x4c, 0xe3, 0x5e, 0x82, + 0x61, 0xc1, 0x46, 0x5a, 0x5d, 0xf0, 0x59, 0x79, 0x97, 0x83, 0x1b, 0xc8, 0x49, 0x93, 0xa9, 0xc8, + 0x9b, 0x41, 0x21, 0x7c, 0x1c, 0x54, 0x08, 0xb3, 0xe1, 0xf8, 0x85, 0x9a, 0xd1, 0x04, 0x1e, 0x32, + 0x39, 0xb9, 0x04, 0xc5, 0x0a, 0x6b, 0xaa, 0x14, 0xc8, 0x97, 0x35, 0x45, 0x43, 0xa8, 0xfa, 0xd5, + 0x22, 0x8c, 0xc5, 0x0e, 0xbe, 0x9e, 0x83, 0x21, 0x71, 0xf0, 0x64, 0xfa, 0x19, 0x45, 0xf0, 0xf1, + 0x50, 0x00, 0xd4, 0x06, 0xf9, 0x9f, 0x55, 0x83, 0x7c, 0x06, 0x06, 0x6c, 0x17, 0x17, 0x45, 0xfc, + 0x96, 0xb1, 0x70, 0x08, 0x2d, 0xd7, 0x59, 0xdb, 0xf9, 0xe0, 0x10, 0x24, 0xb2, 0x46, 0xda, 0x2e, + 0x7e, 0xda, 0x0d, 0x18, 0xd2, 0x5d, 0x97, 0x7a, 0x0d, 0x4f, 0x5f, 0x93, 0x93, 0x8c, 0x04, 0x40, + 0x79, 0x74, 0x20, 0x70, 0x45, 0x5f, 0x23, 0x9f, 0x85, 0xd1, 0xa6, 0x43, 0x71, 0xd9, 0xd4, 0x5b, + 0xac, 0x95, 0x92, 0x59, 0x1b, 0x41, 0xc8, 0xf7, 0x27, 0x21, 0xa2, 0x6a, 0x90, 0xbb, 0x30, 0x2a, + 0x3e, 0x87, 0x7b, 0xee, 0xe3, 0x40, 0x1b, 0x0b, 0x97, 0x31, 0x2e, 0x12, 0xee, 0xbb, 0x2f, 0x1e, + 0x70, 0xc8, 0xe4, 0x32, 0x5f, 0x43, 0x22, 0x25, 0xcb, 0x40, 0x36, 0xe8, 0x6a, 0x43, 0xef, 0x7a, + 0xeb, 0xac, 0x2e, 0x1e, 0x23, 0x5f, 0xe4, 0xd6, 0xc4, 0x57, 0x0f, 0x49, 0xac, 0xfc, 0x18, 0x64, + 0x83, 0xae, 0x96, 0x23, 0x48, 0x72, 0x0f, 0xce, 0x26, 0x8b, 0xb0, 0x4f, 0xe6, 0x97, 0x03, 0xcf, + 0x6e, 0x6f, 0x4d, 0x4e, 0xa6, 0x12, 0x48, 0x6c, 0x4f, 0x27, 0xd8, 0x56, 0x8d, 0x5b, 0xc5, 0xc1, + 0x81, 0x89, 0x41, 0x6d, 0x8c, 0x95, 0xf5, 0x4d, 0x48, 0xd3, 0x50, 0xff, 0x20, 0xc7, 0x4c, 0x45, + 0xf6, 0x41, 0x98, 0x5c, 0x9c, 0xe9, 0x7a, 0x7b, 0x8f, 0xba, 0xde, 0x0e, 0xd3, 0x80, 0x96, 0xdc, + 0x1e, 0xb3, 0xab, 0x26, 0xb0, 0x64, 0x0a, 0x4a, 0x86, 0x7c, 0x6a, 0x76, 0x2e, 0xda, 0x09, 0x7e, + 0x3d, 0x9a, 0xa0, 0x22, 0x57, 0xa0, 0xc8, 0x96, 0xac, 0xf8, 0x96, 0x59, 0xb6, 0x2e, 0x34, 0xa4, + 0x50, 0x7f, 0x28, 0x0f, 0x23, 0xd2, 0xd7, 0x5c, 0x3f, 0xd0, 0xe7, 0xbc, 0xbe, 0xbb, 0x66, 0xfa, + 0x4e, 0x2f, 0xb8, 0x97, 0xf2, 0x9b, 0x7c, 0x23, 0x10, 0xc5, 0xae, 0x2e, 0xa4, 0x84, 0x60, 0x5e, + 0x11, 0x1f, 0x5a, 0xda, 0xfd, 0xf6, 0x91, 0xd1, 0xdf, 0x2a, 0x0e, 0xe6, 0x27, 0x0a, 0xb7, 0x8a, + 0x83, 0xc5, 0x89, 0x7e, 0x0c, 0xe6, 0x85, 0xf1, 0xb3, 0xf9, 0xde, 0xdc, 0xba, 0x6f, 0xae, 0x1d, + 0xf3, 0xb7, 0x23, 0x87, 0x1b, 0xe8, 0x2c, 0x26, 0x9b, 0x63, 0xfe, 0x90, 0xe4, 0x03, 0x95, 0xcd, + 0x49, 0xda, 0x50, 0x21, 0x9b, 0x7f, 0x92, 0x03, 0x25, 0x55, 0x36, 0xe5, 0x23, 0xf2, 0x83, 0x38, + 0xbc, 0xe4, 0xa1, 0x7f, 0x9c, 0x87, 0x53, 0x55, 0xcb, 0xa3, 0x6b, 0x7c, 0xc7, 0x78, 0xcc, 0xa7, + 0x8a, 0xdb, 0x30, 0x2c, 0x7d, 0x8c, 0xe8, 0xf3, 0x27, 0x82, 0xfd, 0x78, 0x88, 0xca, 0xe0, 0x24, + 0x97, 0x3e, 0xbc, 0x97, 0x38, 0x71, 0x21, 0x1f, 0xf3, 0x39, 0xe7, 0x78, 0x08, 0xf9, 0x98, 0x4f, + 0x5e, 0x1f, 0x52, 0x21, 0xff, 0x67, 0x79, 0x38, 0x9d, 0x52, 0x39, 0xb9, 0x0c, 0x03, 0xf5, 0xee, + 0x2a, 0xc6, 0xee, 0xca, 0x85, 0x1e, 0xc3, 0x6e, 0x77, 0x15, 0xc3, 0x76, 0x69, 0x3e, 0x92, 0xac, + 0xe0, 0xe3, 0xfa, 0xe5, 0x6a, 0x65, 0x46, 0x48, 0x55, 0x95, 0xc2, 0x04, 0x30, 0x70, 0xda, 0x97, + 0x05, 0x0f, 0xf0, 0x6d, 0xd3, 0x68, 0xc6, 0x1e, 0xe0, 0xb3, 0x32, 0xe4, 0x07, 0x60, 0xa8, 0xfc, + 0x7e, 0xd7, 0xa1, 0xc8, 0x97, 0x4b, 0xfc, 0x63, 0x01, 0x5f, 0x1f, 0x91, 0xc6, 0x99, 0xc7, 0x12, + 0x60, 0x14, 0x71, 0xde, 0x21, 0x43, 0xb2, 0x0c, 0xa5, 0x9b, 0xa6, 0x37, 0xdf, 0x5d, 0x15, 0xbd, + 0x10, 0xc4, 0xf7, 0xe2, 0xd0, 0x34, 0xbe, 0xb8, 0x2b, 0xe7, 0x71, 0x8a, 0xe5, 0x3d, 0x10, 0x2f, + 0xa0, 0xfe, 0x64, 0x0e, 0x2e, 0x66, 0x7f, 0x2e, 0xf9, 0x14, 0x0c, 0xb0, 0xad, 0x7e, 0x59, 0x5b, + 0x12, 0xb2, 0xe4, 0x99, 0x7b, 0xed, 0x16, 0x6d, 0xe8, 0x8e, 0xbc, 0x7b, 0xf0, 0xc9, 0xc8, 0x5b, + 0x30, 0x5c, 0x75, 0xdd, 0x2e, 0x75, 0xea, 0x2f, 0xdd, 0xd1, 0xaa, 0x62, 0x93, 0x89, 0x9b, 0x18, + 0x13, 0xc1, 0x0d, 0xf7, 0xa5, 0x58, 0xb8, 0x2f, 0x99, 0x5e, 0xfd, 0xb1, 0x1c, 0x5c, 0xea, 0x25, + 0x26, 0xf2, 0x12, 0x0c, 0xae, 0x50, 0x4b, 0xb7, 0xbc, 0x6a, 0x45, 0x34, 0x09, 0xf7, 0x6c, 0x1e, + 0xc2, 0xa2, 0x5b, 0x8f, 0x80, 0x90, 0x15, 0xe2, 0x07, 0x95, 0x81, 0x67, 0x04, 0x3f, 0x54, 0x45, + 0x58, 0xac, 0x90, 0x4f, 0xa8, 0x7e, 0x01, 0x2e, 0x64, 0x4a, 0x95, 0x7c, 0x06, 0x46, 0x96, 0x9d, + 0x35, 0xdd, 0x32, 0xdf, 0xe7, 0x83, 0x22, 0x17, 0xee, 0x8b, 0x6d, 0x09, 0x2e, 0xef, 0xd5, 0x64, + 0x7a, 0xf5, 0x0f, 0xf3, 0x30, 0x52, 0x6b, 0x75, 0xd7, 0x4c, 0x69, 0x99, 0xdb, 0xf7, 0xee, 0xc0, + 0xb7, 0xd5, 0xf3, 0x7b, 0xb3, 0xd5, 0xd9, 0xe4, 0xe0, 0xec, 0x73, 0x72, 0xf0, 0xcb, 0x91, 0x37, + 0xa1, 0xd4, 0xc1, 0xef, 0x88, 0x9f, 0x1b, 0xf3, 0xaf, 0xcb, 0x3a, 0x37, 0xe6, 0x65, 0xd8, 0x6c, + 0xd0, 0x3c, 0xc0, 0x6c, 0x10, 0x96, 0x95, 0x04, 0x1a, 0x2e, 0x69, 0x27, 0x02, 0x3d, 0x14, 0x81, + 0x86, 0xcb, 0xd7, 0x89, 0x40, 0x0f, 0x20, 0xd0, 0x5f, 0xcd, 0xc3, 0x58, 0xb4, 0x4a, 0xf2, 0x29, + 0x18, 0xe6, 0xd5, 0xf0, 0x53, 0xac, 0x9c, 0xe4, 0x02, 0x1d, 0x82, 0x35, 0xe0, 0x3f, 0xc4, 0x71, + 0xdc, 0xf8, 0xba, 0xee, 0x36, 0xc2, 0xf3, 0x24, 0x7e, 0xdb, 0x3c, 0xc8, 0xfd, 0xb6, 0x62, 0x28, + 0x6d, 0x6c, 0x5d, 0x77, 0x67, 0xc2, 0xdf, 0x64, 0x16, 0x88, 0x43, 0xbb, 0x2e, 0x8d, 0x32, 0x28, + 0x22, 0x03, 0x91, 0x93, 0x3d, 0x8e, 0xd5, 0x4e, 0x71, 0x98, 0xcc, 0xe6, 0x8b, 0x41, 0xb3, 0x51, + 0x19, 0xfa, 0x77, 0x91, 0x30, 0x5e, 0xa2, 0x4f, 0x3f, 0x94, 0xe5, 0x04, 0x15, 0xdd, 0xd3, 0xf9, + 0x11, 0x82, 0xdf, 0x01, 0xea, 0x0f, 0x7f, 0x19, 0xfa, 0x97, 0x2d, 0xba, 0x7c, 0x9f, 0xbc, 0x08, + 0x43, 0x4c, 0x61, 0x16, 0x6c, 0xd6, 0x97, 0x39, 0xe1, 0xed, 0x21, 0x69, 0x12, 0x22, 0xe6, 0xfb, + 0xb4, 0x90, 0x8a, 0xdc, 0x00, 0x08, 0x1f, 0xc4, 0x09, 0xed, 0x23, 0x72, 0x19, 0x8e, 0x99, 0xef, + 0xd3, 0x24, 0x3a, 0xbf, 0x94, 0x78, 0x4e, 0x54, 0x48, 0x96, 0xe2, 0x18, 0xbf, 0x94, 0x18, 0x1f, + 0x0b, 0x40, 0xd8, 0xaf, 0x9a, 0xee, 0xba, 0x1b, 0xb6, 0x63, 0xcc, 0xac, 0xeb, 0xd6, 0x1a, 0x8d, + 0xef, 0xf5, 0x92, 0x14, 0xf3, 0x7d, 0x5a, 0x4a, 0x39, 0xf2, 0x3a, 0x8c, 0xc8, 0xee, 0xaf, 0x71, + 0x17, 0x15, 0x19, 0x37, 0xdf, 0xa7, 0x45, 0x68, 0xc9, 0xab, 0x30, 0x2c, 0x7e, 0xdf, 0xb2, 0xc5, + 0xfd, 0xb7, 0x14, 0x39, 0x49, 0x42, 0xcd, 0xf7, 0x69, 0x32, 0xa5, 0x54, 0x69, 0xcd, 0x31, 0x2d, + 0x4f, 0xbc, 0xa8, 0x8e, 0x57, 0x8a, 0x38, 0xa9, 0x52, 0xfc, 0x4d, 0xde, 0x82, 0xd1, 0x20, 0x24, + 0xd5, 0x7b, 0xb4, 0xe9, 0x89, 0xa3, 0xfa, 0xb3, 0xb1, 0xc2, 0x1c, 0x39, 0xdf, 0xa7, 0x45, 0xa9, + 0xc9, 0x15, 0x28, 0x69, 0xd4, 0x35, 0xdf, 0xf7, 0x2f, 0xb7, 0xc7, 0xa4, 0x71, 0x6e, 0xbe, 0xcf, + 0xa4, 0x24, 0xf0, 0xac, 0x77, 0xc2, 0xdb, 0x74, 0x71, 0xb0, 0x4e, 0x62, 0xb5, 0xcc, 0x5a, 0x06, + 0xeb, 0x1d, 0xc9, 0x95, 0xe2, 0xb3, 0x61, 0xa0, 0x2e, 0x91, 0xa7, 0x76, 0x38, 0x1e, 0x11, 0x41, + 0xc6, 0xce, 0xf7, 0x69, 0x31, 0x7a, 0x49, 0xaa, 0x15, 0xd3, 0x7d, 0x20, 0x02, 0xac, 0xc6, 0xa5, + 0xca, 0x50, 0x92, 0x54, 0xd9, 0x4f, 0xa9, 0xea, 0x25, 0xea, 0x6d, 0xd8, 0xce, 0x03, 0x11, 0x4e, + 0x35, 0x5e, 0xb5, 0xc0, 0x4a, 0x55, 0x0b, 0x88, 0x5c, 0x35, 0x1b, 0x70, 0x63, 0xe9, 0x55, 0xeb, + 0x9e, 0x2e, 0x57, 0xcd, 0xcf, 0x0d, 0xfd, 0x4e, 0x5a, 0xa0, 0xfa, 0x43, 0xaa, 0x8c, 0xa7, 0x76, + 0x28, 0xe2, 0xa4, 0x0e, 0xc5, 0xdf, 0xac, 0x52, 0x29, 0x25, 0xbc, 0x32, 0x11, 0xad, 0x54, 0x42, + 0xb1, 0x4a, 0xe5, 0xe4, 0xf1, 0x37, 0xe4, 0x4c, 0xe9, 0xca, 0xa9, 0x68, 0x07, 0x85, 0x18, 0xd6, + 0x41, 0x52, 0x46, 0xf5, 0x49, 0xcc, 0xc2, 0xac, 0x10, 0x24, 0x1f, 0x0e, 0x5a, 0x38, 0x53, 0x9b, + 0xef, 0xd3, 0x30, 0x3f, 0xb3, 0xca, 0xf3, 0x7b, 0x2b, 0xa7, 0x91, 0x62, 0xc4, 0xa7, 0x60, 0xb0, + 0xf9, 0x3e, 0x8d, 0xe7, 0xfe, 0x7e, 0x51, 0xca, 0x81, 0xa8, 0x9c, 0x89, 0x4e, 0x11, 0x01, 0x82, + 0x4d, 0x11, 0x61, 0xa6, 0xc4, 0xb9, 0x64, 0xa6, 0x3f, 0xe5, 0x6c, 0x74, 0xa9, 0x89, 0xe3, 0xe7, + 0xfb, 0xb4, 0x64, 0x76, 0xc0, 0x57, 0x23, 0xc9, 0xef, 0x94, 0x73, 0xb1, 0x70, 0x65, 0x21, 0x8a, + 0x89, 0x4b, 0x4e, 0x93, 0xb7, 0x0c, 0xa7, 0x79, 0xee, 0x5c, 0x11, 0x70, 0x4c, 0x4c, 0x56, 0xe7, + 0xa3, 0xdb, 0xac, 0x14, 0x92, 0xf9, 0x3e, 0x2d, 0xad, 0x24, 0x99, 0x49, 0xa4, 0xa0, 0x53, 0x94, + 0xa8, 0x27, 0x4f, 0x0c, 0x3d, 0xdf, 0xa7, 0x25, 0x92, 0xd6, 0xdd, 0x90, 0x73, 0xbf, 0x29, 0x17, + 0xa2, 0x9d, 0x18, 0x62, 0x58, 0x27, 0x4a, 0x39, 0xe2, 0x6e, 0xc8, 0xf9, 0xc0, 0x94, 0x8b, 0xc9, + 0x52, 0xe1, 0xcc, 0x29, 0xe5, 0x0d, 0xd3, 0xd2, 0x53, 0x1c, 0x29, 0x4f, 0x88, 0x44, 0xc7, 0xa2, + 0x7c, 0x1a, 0xcd, 0x7c, 0x9f, 0x96, 0x9e, 0x1e, 0x49, 0x4b, 0xcf, 0x0d, 0xa4, 0x5c, 0xea, 0xc5, + 0x33, 0x68, 0x5d, 0x7a, 0x5e, 0x21, 0xbd, 0x47, 0xa6, 0x16, 0xe5, 0xc9, 0xe8, 0x86, 0x2c, 0x93, + 0x70, 0xbe, 0x4f, 0xeb, 0x91, 0xef, 0xe5, 0x4e, 0x46, 0xda, 0x14, 0xe5, 0xa9, 0x68, 0x9e, 0xf3, + 0x54, 0xa2, 0xf9, 0x3e, 0x2d, 0x23, 0xe9, 0xca, 0x9d, 0x8c, 0xac, 0x1a, 0xca, 0x64, 0x4f, 0xb6, + 0x81, 0x3c, 0x32, 0x72, 0x72, 0x2c, 0xa7, 0x26, 0xa4, 0x50, 0x9e, 0x8e, 0xaa, 0x6e, 0x0a, 0x09, + 0x53, 0xdd, 0xb4, 0x54, 0x16, 0xcb, 0xa9, 0x19, 0x14, 0x94, 0x67, 0x7a, 0x30, 0x0c, 0xda, 0x98, + 0x9a, 0x7b, 0x61, 0x39, 0x35, 0x85, 0x81, 0xa2, 0x46, 0x19, 0xa6, 0x90, 0x30, 0x86, 0x69, 0xc9, + 0x0f, 0x96, 0x53, 0x23, 0xdd, 0x2b, 0xcf, 0xf6, 0x60, 0x18, 0xb6, 0x30, 0x2d, 0x46, 0xfe, 0xab, + 0x91, 0x50, 0xf3, 0xca, 0xc7, 0xa2, 0xf3, 0x86, 0x84, 0x62, 0xf3, 0x86, 0x1c, 0x94, 0x7e, 0x26, + 0x11, 0x07, 0x57, 0xf9, 0x78, 0x74, 0x98, 0xc7, 0xd0, 0x6c, 0x98, 0xc7, 0x23, 0xe7, 0xce, 0x24, + 0xe2, 0x81, 0x2a, 0x97, 0xb3, 0x98, 0x20, 0x3a, 0xca, 0x84, 0x47, 0x10, 0xad, 0xa6, 0x04, 0xa4, + 0x54, 0x3e, 0x11, 0xf5, 0x42, 0x4f, 0x10, 0xcc, 0xf7, 0x69, 0x29, 0x61, 0x2c, 0xb5, 0xf4, 0xe8, + 0x4b, 0xca, 0x95, 0xe8, 0xb0, 0x4d, 0xa3, 0x61, 0xc3, 0x36, 0x35, 0x72, 0xd3, 0x42, 0xda, 0x53, + 0x19, 0xe5, 0x6a, 0xd4, 0x30, 0x4b, 0x52, 0x30, 0xc3, 0x2c, 0xe5, 0x89, 0x8d, 0x96, 0x1e, 0x11, + 0x48, 0x79, 0xae, 0x67, 0x0b, 0x91, 0x26, 0xa5, 0x85, 0x3c, 0x40, 0x4e, 0x68, 0x3b, 0xdd, 0xe9, + 0xb4, 0x6c, 0xdd, 0x50, 0x3e, 0x99, 0x6a, 0x3b, 0x71, 0xa4, 0x64, 0x3b, 0x71, 0x00, 0x5b, 0xe5, + 0xe5, 0x17, 0x19, 0xca, 0xf3, 0xd1, 0x55, 0x5e, 0xc6, 0xb1, 0x55, 0x3e, 0xf2, 0x7a, 0x63, 0x26, + 0xf1, 0x7a, 0x41, 0x79, 0x21, 0xaa, 0x00, 0x31, 0x34, 0x53, 0x80, 0xf8, 0x7b, 0x87, 0x2f, 0x65, + 0xfb, 0xfb, 0x2b, 0x53, 0xc8, 0xed, 0x69, 0x9f, 0x5b, 0x16, 0xdd, 0x7c, 0x9f, 0x96, 0xfd, 0x66, + 0xa0, 0x9a, 0xe2, 0xbe, 0xaf, 0x5c, 0x8b, 0x2a, 0x58, 0x82, 0x80, 0x29, 0x58, 0xd2, 0xe9, 0xbf, + 0x9a, 0xe2, 0x7f, 0xaf, 0x7c, 0x2a, 0x93, 0x55, 0xf0, 0xcd, 0x29, 0x5e, 0xfb, 0x37, 0x64, 0x07, + 0x7a, 0xe5, 0xc5, 0xe8, 0x62, 0x17, 0x62, 0xd8, 0x62, 0x27, 0x39, 0xda, 0xdf, 0x90, 0x5d, 0xc7, + 0x95, 0xeb, 0xc9, 0x52, 0xe1, 0x12, 0x29, 0xb9, 0x98, 0x6b, 0xe9, 0x1e, 0xd7, 0xca, 0x4b, 0x51, + 0xad, 0x4b, 0xa3, 0x61, 0x5a, 0x97, 0xea, 0xad, 0x3d, 0x97, 0x74, 0x9c, 0x56, 0x6e, 0xc4, 0x37, + 0xd9, 0x51, 0x3c, 0xb3, 0x7c, 0x12, 0xce, 0xd6, 0x9f, 0x8d, 0x87, 0x06, 0x54, 0x5e, 0x8e, 0x5d, + 0x52, 0x47, 0xb0, 0xcc, 0xbe, 0x8d, 0x85, 0x12, 0xfc, 0x6c, 0x3c, 0x9a, 0x9e, 0xf2, 0x4a, 0x3a, + 0x87, 0x40, 0x57, 0xe2, 0xd1, 0xf7, 0x3e, 0x1b, 0x0f, 0x40, 0xa7, 0xbc, 0x9a, 0xce, 0x21, 0x90, + 0x6e, 0x3c, 0x60, 0xdd, 0x8b, 0x52, 0x48, 0x7c, 0xe5, 0xd3, 0x51, 0xd3, 0x31, 0x40, 0x30, 0xd3, + 0x31, 0x0c, 0x9c, 0xff, 0xa2, 0x14, 0x4a, 0x5e, 0x79, 0x2d, 0x51, 0x24, 0x68, 0xac, 0x14, 0x70, + 0xfe, 0x45, 0x29, 0x04, 0xbb, 0xf2, 0x7a, 0xa2, 0x48, 0xd0, 0x3a, 0x29, 0x50, 0xbb, 0xd1, 0xeb, + 0xb5, 0xad, 0xf2, 0x46, 0xf4, 0xe8, 0x3a, 0x9b, 0x72, 0xbe, 0x4f, 0xeb, 0xf5, 0x6a, 0xf7, 0x4b, + 0xd9, 0x6e, 0xe8, 0xca, 0x9b, 0xd1, 0x21, 0x9c, 0x45, 0xc7, 0x86, 0x70, 0xa6, 0x2b, 0xfb, 0x5b, + 0xb1, 0xc8, 0x1b, 0xca, 0x5b, 0xd1, 0x29, 0x2e, 0x82, 0x64, 0x53, 0x5c, 0x3c, 0x4e, 0x47, 0x24, + 0xa4, 0x84, 0xf2, 0x99, 0xe8, 0x14, 0x27, 0xe3, 0xd8, 0x14, 0x17, 0x09, 0x3f, 0x31, 0x93, 0x88, + 0x74, 0xa0, 0xbc, 0x1d, 0x9d, 0xe2, 0x62, 0x68, 0x36, 0xc5, 0xc5, 0x63, 0x23, 0xbc, 0x15, 0x7b, + 0xf0, 0xaf, 0x7c, 0x36, 0xbd, 0xfd, 0x88, 0x94, 0xdb, 0xcf, 0xc3, 0x03, 0x68, 0xe9, 0x2f, 0xd7, + 0x95, 0x72, 0x74, 0xfc, 0xa6, 0xd1, 0xb0, 0xf1, 0x9b, 0xfa, 0xea, 0x3d, 0xbe, 0x71, 0x10, 0x5a, + 0x35, 0xdd, 0x63, 0xe3, 0x10, 0x9a, 0x22, 0x29, 0xe0, 0xc8, 0x1e, 0x99, 0x6f, 0x84, 0x66, 0x32, + 0xf6, 0xc8, 0xfe, 0x36, 0x28, 0x46, 0xcf, 0x66, 0xd7, 0x84, 0x57, 0xb4, 0x52, 0x89, 0xce, 0xae, + 0x09, 0x02, 0x36, 0xbb, 0x26, 0x7d, 0xa9, 0xe7, 0x60, 0x42, 0x68, 0x11, 0x77, 0xf6, 0x36, 0xad, + 0x35, 0x65, 0x36, 0xf6, 0x3a, 0x34, 0x86, 0x67, 0xb3, 0x53, 0x1c, 0x86, 0xeb, 0x35, 0x87, 0xcd, + 0xb4, 0xcc, 0xce, 0xaa, 0xad, 0x3b, 0x46, 0x9d, 0x5a, 0x86, 0x32, 0x17, 0x5b, 0xaf, 0x53, 0x68, + 0x70, 0xbd, 0x4e, 0x81, 0x63, 0x40, 0xbb, 0x18, 0x5c, 0xa3, 0x4d, 0x6a, 0x3e, 0xa4, 0xca, 0x4d, + 0x64, 0x3b, 0x99, 0xc5, 0x56, 0x90, 0xcd, 0xf7, 0x69, 0x59, 0x1c, 0x98, 0xad, 0xbe, 0xb8, 0x59, + 0x7f, 0x67, 0x21, 0x08, 0x96, 0x50, 0x73, 0x68, 0x47, 0x77, 0xa8, 0x32, 0x1f, 0xb5, 0xd5, 0x53, + 0x89, 0x98, 0xad, 0x9e, 0x8a, 0x48, 0xb2, 0xf5, 0xc7, 0x42, 0xb5, 0x17, 0xdb, 0x70, 0x44, 0xa4, + 0x97, 0x66, 0xb3, 0x53, 0x14, 0xc1, 0x04, 0xb4, 0x60, 0x5b, 0x6b, 0x78, 0x52, 0x71, 0x2b, 0x3a, + 0x3b, 0x65, 0x53, 0xb2, 0xd9, 0x29, 0x1b, 0xcb, 0x54, 0x3d, 0x8a, 0xe5, 0x63, 0xf0, 0x76, 0x54, + 0xd5, 0x53, 0x48, 0x98, 0xaa, 0xa7, 0x80, 0x93, 0x0c, 0x35, 0xea, 0x52, 0x4f, 0x59, 0xe8, 0xc5, + 0x10, 0x49, 0x92, 0x0c, 0x11, 0x9c, 0x64, 0x38, 0x47, 0xbd, 0xe6, 0xba, 0xb2, 0xd8, 0x8b, 0x21, + 0x92, 0x24, 0x19, 0x22, 0x98, 0x6d, 0x36, 0xa3, 0xe0, 0xe9, 0x6e, 0xeb, 0x81, 0xdf, 0x67, 0x4b, + 0xd1, 0xcd, 0x66, 0x26, 0x21, 0xdb, 0x6c, 0x66, 0x22, 0xc9, 0x8f, 0xed, 0xda, 0x6b, 0x5f, 0x59, + 0xc6, 0x0a, 0xa7, 0x42, 0xbb, 0x60, 0x37, 0xa5, 0xe6, 0xfb, 0xb4, 0xdd, 0xbe, 0x0a, 0xf8, 0x64, + 0xe0, 0xe2, 0xaa, 0xd4, 0xb0, 0xaa, 0xf1, 0xe0, 0xac, 0x82, 0x83, 0xe7, 0xfb, 0xb4, 0xc0, 0x09, + 0xf6, 0x55, 0x18, 0xc6, 0x8f, 0xaa, 0x5a, 0xa6, 0x57, 0x99, 0x56, 0xde, 0x89, 0x6e, 0x99, 0x24, + 0x14, 0xdb, 0x32, 0x49, 0x3f, 0xd9, 0x24, 0x8e, 0x3f, 0xf9, 0x14, 0x53, 0x99, 0x56, 0xb4, 0xe8, + 0x24, 0x1e, 0x41, 0xb2, 0x49, 0x3c, 0x02, 0x08, 0xea, 0xad, 0x38, 0x76, 0xa7, 0x32, 0xad, 0xd4, + 0x53, 0xea, 0xe5, 0xa8, 0xa0, 0x5e, 0xfe, 0x33, 0xa8, 0xb7, 0xbe, 0xde, 0xf5, 0x2a, 0xec, 0x1b, + 0x57, 0x52, 0xea, 0xf5, 0x91, 0x41, 0xbd, 0x3e, 0x80, 0x4d, 0x85, 0x08, 0xa8, 0x39, 0x36, 0x9b, + 0xb4, 0x6f, 0x9b, 0xad, 0x96, 0x72, 0x27, 0x3a, 0x15, 0xc6, 0xf1, 0x6c, 0x2a, 0x8c, 0xc3, 0x98, + 0xe9, 0xc9, 0x5b, 0x45, 0x57, 0xbb, 0x6b, 0xca, 0xdd, 0xa8, 0xe9, 0x19, 0x62, 0x98, 0xe9, 0x19, + 0xfe, 0xc2, 0xdd, 0x05, 0xfb, 0xa5, 0xd1, 0xfb, 0x0e, 0x75, 0xd7, 0x95, 0x7b, 0xb1, 0xdd, 0x85, + 0x84, 0xc3, 0xdd, 0x85, 0xf4, 0x9b, 0xac, 0xc1, 0x13, 0x91, 0x85, 0xc6, 0xbf, 0xb4, 0xa9, 0x53, + 0xdd, 0x69, 0xae, 0x2b, 0x9f, 0x43, 0x56, 0xcf, 0xa6, 0x2e, 0x55, 0x51, 0xd2, 0xf9, 0x3e, 0xad, + 0x17, 0x27, 0xdc, 0x96, 0xbf, 0xb3, 0xc0, 0xe3, 0xd6, 0x6a, 0xb5, 0x19, 0x7f, 0x13, 0xfa, 0x6e, + 0x6c, 0x5b, 0x9e, 0x24, 0xc1, 0x6d, 0x79, 0x12, 0x4c, 0x3a, 0xf0, 0x54, 0x6c, 0xab, 0xb6, 0xa8, + 0xb7, 0xd8, 0xbe, 0x84, 0x1a, 0x35, 0xbd, 0xf9, 0x80, 0x7a, 0xca, 0xe7, 0x91, 0xf7, 0xe5, 0x8c, + 0x0d, 0x5f, 0x8c, 0x7a, 0xbe, 0x4f, 0xdb, 0x81, 0x1f, 0x51, 0xa1, 0x58, 0x9f, 0x5b, 0xa9, 0x29, + 0x5f, 0x88, 0x9e, 0x6f, 0x32, 0xd8, 0x7c, 0x9f, 0x86, 0x38, 0x66, 0xa5, 0xdd, 0xe9, 0xac, 0x39, + 0xba, 0x41, 0xb9, 0xa1, 0x85, 0xb6, 0x9b, 0x30, 0x40, 0x7f, 0x20, 0x6a, 0xa5, 0x65, 0xd1, 0x31, + 0x2b, 0x2d, 0x0b, 0xc7, 0x14, 0x35, 0x92, 0xa2, 0x45, 0xf9, 0x62, 0x54, 0x51, 0x23, 0x48, 0xa6, + 0xa8, 0xd1, 0x84, 0x2e, 0x9f, 0x83, 0x73, 0xc1, 0x7e, 0x5e, 0xac, 0xbf, 0xbc, 0xd3, 0x94, 0x2f, + 0x21, 0x9f, 0xa7, 0x12, 0x97, 0x01, 0x11, 0xaa, 0xf9, 0x3e, 0x2d, 0xa3, 0x3c, 0x5b, 0x71, 0x13, + 0x29, 0xcc, 0x84, 0x79, 0xf1, 0x83, 0xd1, 0x15, 0x37, 0x83, 0x8c, 0xad, 0xb8, 0x19, 0xa8, 0x54, + 0xe6, 0x42, 0xa8, 0xfa, 0x0e, 0xcc, 0x03, 0x99, 0x66, 0x71, 0x48, 0x65, 0x2e, 0x2c, 0xb5, 0xd5, + 0x1d, 0x98, 0x07, 0xd6, 0x5a, 0x16, 0x07, 0x72, 0x05, 0x4a, 0xf5, 0xfa, 0xa2, 0xd6, 0xb5, 0x94, + 0x66, 0xcc, 0xb7, 0x17, 0xa1, 0xf3, 0x7d, 0x9a, 0xc0, 0x33, 0x33, 0x68, 0xb6, 0xa5, 0xbb, 0x9e, + 0xd9, 0x74, 0x71, 0xc4, 0xf8, 0x23, 0xc4, 0x88, 0x9a, 0x41, 0x69, 0x34, 0xcc, 0x0c, 0x4a, 0x83, + 0x33, 0x7b, 0x71, 0x46, 0x77, 0x5d, 0xdd, 0x32, 0x1c, 0x7d, 0x1a, 0x97, 0x09, 0x1a, 0x7b, 0x3b, + 0x16, 0xc1, 0x32, 0x7b, 0x31, 0x0a, 0xc1, 0xc3, 0x77, 0x1f, 0xe2, 0x9b, 0x39, 0xf7, 0x63, 0x87, + 0xef, 0x31, 0x3c, 0x1e, 0xbe, 0xc7, 0x60, 0x68, 0x77, 0xfa, 0x30, 0x8d, 0xae, 0x99, 0x4c, 0x44, + 0xca, 0x5a, 0xcc, 0xee, 0x8c, 0x13, 0xa0, 0xdd, 0x19, 0x07, 0x46, 0x9a, 0xe4, 0x2f, 0xb7, 0xeb, + 0x19, 0x4d, 0x0a, 0x57, 0xd9, 0x44, 0x19, 0xb6, 0x7e, 0x87, 0x83, 0xa3, 0xb2, 0x69, 0xe9, 0x6d, + 0xbb, 0x32, 0xed, 0x4b, 0xdd, 0x8c, 0xae, 0xdf, 0x99, 0x84, 0x6c, 0xfd, 0xce, 0x44, 0xb2, 0xd9, + 0xd5, 0xdf, 0x68, 0xad, 0xeb, 0x0e, 0x35, 0x2a, 0xa6, 0x83, 0x27, 0x8b, 0x9b, 0x7c, 0x6b, 0xf8, + 0x5e, 0x74, 0x76, 0xed, 0x41, 0xca, 0x66, 0xd7, 0x1e, 0x68, 0x66, 0xe4, 0xa5, 0xa3, 0x35, 0xaa, + 0x1b, 0xca, 0x83, 0xa8, 0x91, 0x97, 0x4d, 0xc9, 0x8c, 0xbc, 0x6c, 0x6c, 0xf6, 0xe7, 0xdc, 0x73, + 0x4c, 0x8f, 0x2a, 0xad, 0xdd, 0x7c, 0x0e, 0x92, 0x66, 0x7f, 0x0e, 0xa2, 0xd9, 0x86, 0x30, 0xde, + 0x21, 0xed, 0xe8, 0x86, 0x30, 0xd9, 0x0d, 0xf1, 0x12, 0xcc, 0x62, 0x11, 0x4f, 0x08, 0x15, 0x2b, + 0x6a, 0xb1, 0x08, 0x30, 0xb3, 0x58, 0xc2, 0x47, 0x86, 0x91, 0x87, 0x63, 0x8a, 0x1d, 0x5d, 0x43, + 0x65, 0x1c, 0x5b, 0x43, 0x23, 0x8f, 0xcc, 0x5e, 0x8d, 0xbc, 0x8a, 0x50, 0x3a, 0x51, 0xab, 0x43, + 0x42, 0x31, 0xab, 0x43, 0x7e, 0x3f, 0x31, 0x03, 0xe3, 0x78, 0x0b, 0xae, 0x75, 0x83, 0x7b, 0x9c, + 0x2f, 0x47, 0x3f, 0x33, 0x86, 0x66, 0x9f, 0x19, 0x03, 0x45, 0x98, 0x88, 0x69, 0xcb, 0xc9, 0x60, + 0x12, 0x9e, 0x0f, 0xc6, 0x40, 0x64, 0x01, 0x48, 0xbd, 0xbc, 0xb8, 0x50, 0x35, 0x6a, 0xf2, 0x15, + 0x99, 0x1b, 0x3d, 0x81, 0x4d, 0x52, 0xcc, 0xf7, 0x69, 0x29, 0xe5, 0xc8, 0x7b, 0x70, 0x49, 0x40, + 0xc5, 0xfb, 0xf0, 0x9a, 0x63, 0x3f, 0x34, 0x8d, 0x60, 0x41, 0xf0, 0xa2, 0x5e, 0x77, 0xbd, 0x68, + 0xe7, 0xfb, 0xb4, 0x9e, 0xbc, 0xb2, 0xeb, 0x12, 0xeb, 0x43, 0x77, 0x37, 0x75, 0x05, 0x8b, 0x44, + 0x4f, 0x5e, 0xd9, 0x75, 0x09, 0xb9, 0x3f, 0xdc, 0x4d, 0x5d, 0x41, 0x27, 0xf4, 0xe4, 0x45, 0x5c, + 0x98, 0xec, 0x85, 0x2f, 0xb7, 0x5a, 0xca, 0x06, 0x56, 0xf7, 0x89, 0xdd, 0x54, 0x57, 0x46, 0x83, + 0x73, 0x27, 0x8e, 0x6c, 0x96, 0x5e, 0xee, 0x50, 0xab, 0x1e, 0x59, 0x80, 0x1e, 0x45, 0x67, 0xe9, + 0x04, 0x01, 0x9b, 0xa5, 0x13, 0x40, 0x36, 0xa0, 0xe4, 0xc7, 0x35, 0xca, 0x66, 0x74, 0x40, 0xc9, + 0x38, 0x36, 0xa0, 0x22, 0x0f, 0x71, 0x96, 0xe1, 0xf4, 0xf2, 0x03, 0x4f, 0xf7, 0x2d, 0x48, 0x57, + 0x74, 0xe5, 0xfb, 0xb1, 0x4b, 0xa6, 0x24, 0x09, 0x5e, 0x32, 0x25, 0xc1, 0x6c, 0x8c, 0x30, 0x70, + 0x7d, 0xd3, 0x6a, 0xce, 0xe9, 0x66, 0xab, 0xeb, 0x50, 0xe5, 0x5f, 0x8b, 0x8e, 0x91, 0x18, 0x9a, + 0x8d, 0x91, 0x18, 0x88, 0x2d, 0xd0, 0x0c, 0x54, 0x76, 0x5d, 0x73, 0xcd, 0x12, 0xfb, 0xca, 0x6e, + 0xcb, 0x53, 0xfe, 0xf5, 0xe8, 0x02, 0x9d, 0x46, 0xc3, 0x16, 0xe8, 0x34, 0x38, 0x9e, 0x3a, 0xb1, + 0x5e, 0x60, 0x8b, 0x87, 0x7c, 0x57, 0xf9, 0x6f, 0xc4, 0x4e, 0x9d, 0x52, 0x68, 0xf0, 0xd4, 0x29, + 0x05, 0xce, 0xd6, 0x47, 0x6e, 0x93, 0x2d, 0x98, 0xc1, 0x5d, 0xf5, 0xbf, 0x19, 0x5d, 0x1f, 0xe3, + 0x78, 0xb6, 0x3e, 0xc6, 0x61, 0x51, 0x3e, 0xa2, 0x0b, 0xfe, 0xad, 0x2c, 0x3e, 0x81, 0xfc, 0x13, + 0x65, 0xc8, 0x4d, 0x99, 0x8f, 0x18, 0x29, 0x3f, 0x94, 0xcb, 0x62, 0x14, 0x0c, 0x8f, 0x44, 0xa1, + 0x28, 0x23, 0x8d, 0x3e, 0x34, 0xe9, 0x86, 0xf2, 0x95, 0x4c, 0x46, 0x9c, 0x20, 0xca, 0x88, 0xc3, + 0xc8, 0xbb, 0x70, 0x2e, 0x84, 0x2d, 0xd2, 0xf6, 0x6a, 0x30, 0x33, 0xfd, 0x70, 0x2e, 0x6a, 0x06, + 0xa7, 0x93, 0x31, 0x33, 0x38, 0x1d, 0x93, 0xc6, 0x5a, 0x88, 0xee, 0xdf, 0xde, 0x81, 0x75, 0x20, + 0xc1, 0x0c, 0x06, 0x69, 0xac, 0x85, 0x34, 0x7f, 0x64, 0x07, 0xd6, 0x81, 0x4c, 0x33, 0x18, 0x90, + 0x1f, 0xcf, 0xc1, 0xe5, 0x74, 0x54, 0xb9, 0xd5, 0x9a, 0xb3, 0x9d, 0x10, 0xa7, 0xfc, 0xb9, 0x5c, + 0xf4, 0xa0, 0x61, 0x77, 0xc5, 0xe6, 0xfb, 0xb4, 0x5d, 0x56, 0x40, 0x3e, 0x03, 0xa3, 0xe5, 0xae, + 0x61, 0x7a, 0x78, 0xf1, 0xc6, 0x0c, 0xe7, 0x1f, 0xcd, 0xc5, 0xb6, 0x38, 0x32, 0x16, 0xb7, 0x38, + 0x32, 0x80, 0xdc, 0x82, 0x53, 0x75, 0xda, 0xec, 0x3a, 0xa6, 0xb7, 0xa9, 0xd1, 0x8e, 0xed, 0x78, + 0x8c, 0xc7, 0x9f, 0xcf, 0x45, 0x27, 0xb1, 0x04, 0x05, 0x9b, 0xc4, 0x12, 0x40, 0x72, 0x37, 0x71, + 0x2b, 0x2f, 0x3a, 0xf3, 0xc7, 0x72, 0x3d, 0xaf, 0xe5, 0x83, 0xbe, 0x4c, 0x2f, 0x4e, 0x6a, 0xb1, + 0x5b, 0x74, 0xc1, 0xf5, 0xc7, 0x73, 0x3d, 0xae, 0xd1, 0xa5, 0x19, 0x2e, 0x09, 0x66, 0x1c, 0x53, + 0x92, 0xde, 0x2b, 0x7f, 0x21, 0xd7, 0xe3, 0xda, 0x3b, 0xe4, 0x98, 0x96, 0x2f, 0xff, 0x65, 0xee, + 0x29, 0x22, 0x18, 0xfd, 0x44, 0x2e, 0xe9, 0x2a, 0x12, 0x94, 0x97, 0x08, 0x59, 0xb1, 0x3b, 0x6e, + 0xa0, 0xf4, 0x5f, 0xcd, 0x25, 0x7d, 0xf3, 0xc2, 0x62, 0xe1, 0x2f, 0x42, 0xe1, 0xe2, 0xec, 0x23, + 0x8f, 0x3a, 0x96, 0xde, 0xc2, 0xee, 0xac, 0x7b, 0xb6, 0xa3, 0xaf, 0xd1, 0x59, 0x4b, 0x5f, 0x6d, + 0x51, 0xe5, 0x27, 0x73, 0x51, 0x0b, 0x36, 0x9b, 0x94, 0x59, 0xb0, 0xd9, 0x58, 0xb2, 0x0e, 0x4f, + 0xa4, 0x61, 0x2b, 0xa6, 0x8b, 0xf5, 0x7c, 0x2d, 0x17, 0x35, 0x61, 0x7b, 0xd0, 0x32, 0x13, 0xb6, + 0x07, 0x9a, 0x5c, 0x87, 0xa1, 0x69, 0xdb, 0x9f, 0x7e, 0xff, 0x62, 0xcc, 0x19, 0x32, 0xc0, 0xcc, + 0xf7, 0x69, 0x21, 0x99, 0x28, 0x23, 0x06, 0xf5, 0xd7, 0x93, 0x65, 0xc2, 0xcb, 0xa7, 0xe0, 0x87, + 0x28, 0x23, 0xc4, 0xfd, 0xef, 0x24, 0xcb, 0x84, 0x77, 0x5c, 0xc1, 0x0f, 0x36, 0x93, 0xf0, 0x1a, + 0x17, 0xe7, 0xca, 0xcc, 0x6e, 0x9b, 0x59, 0xd7, 0x5b, 0x2d, 0x6a, 0xad, 0x51, 0xe5, 0x1b, 0xb1, + 0x99, 0x24, 0x9d, 0x8c, 0xcd, 0x24, 0xe9, 0x18, 0xf2, 0x03, 0x70, 0xfe, 0xae, 0xde, 0x32, 0x8d, + 0x10, 0xe7, 0xa7, 0x40, 0x57, 0x7e, 0x2a, 0x17, 0xdd, 0x4d, 0x67, 0xd0, 0xb1, 0xdd, 0x74, 0x06, + 0x8a, 0x2c, 0x02, 0xc1, 0x65, 0x34, 0x98, 0x2d, 0xd8, 0xfa, 0xac, 0xfc, 0xbb, 0xb9, 0xa8, 0x9d, + 0x9a, 0x24, 0x61, 0x76, 0x6a, 0x12, 0x4a, 0x1a, 0xd9, 0x89, 0x4c, 0x94, 0x9f, 0xce, 0x45, 0x4f, + 0x6b, 0xb2, 0x08, 0xe7, 0xfb, 0xb4, 0xec, 0x6c, 0x28, 0x37, 0x61, 0xa2, 0x5e, 0xab, 0xce, 0xcd, + 0xcd, 0xd6, 0xef, 0x56, 0x2b, 0xf8, 0x8a, 0xc2, 0x50, 0x7e, 0x26, 0xb6, 0x62, 0xc5, 0x09, 0xd8, + 0x8a, 0x15, 0x87, 0x91, 0x37, 0x60, 0x84, 0xb5, 0x9f, 0x0d, 0x18, 0xfc, 0xe4, 0x9f, 0xcd, 0x45, + 0xcd, 0x29, 0x19, 0xc9, 0xcc, 0x29, 0xf9, 0x37, 0xa9, 0xc3, 0x19, 0x26, 0xc5, 0x9a, 0x43, 0xef, + 0x53, 0x87, 0x5a, 0x4d, 0x7f, 0x4c, 0xff, 0x5c, 0x2e, 0x6a, 0x65, 0xa4, 0x11, 0x31, 0x2b, 0x23, + 0x0d, 0x4e, 0x1e, 0xc0, 0xa5, 0xf8, 0x49, 0x90, 0xfc, 0x48, 0x56, 0xf9, 0x4b, 0xb9, 0x98, 0x31, + 0xdc, 0x83, 0x18, 0x8d, 0xe1, 0x1e, 0x78, 0x62, 0xc1, 0x93, 0xe2, 0x58, 0x45, 0x38, 0x5c, 0xc6, + 0x6b, 0xfb, 0xcb, 0xbc, 0xb6, 0x8f, 0x87, 0x0e, 0x81, 0x3d, 0xa8, 0xe7, 0xfb, 0xb4, 0xde, 0xec, + 0x98, 0x9e, 0x25, 0xd3, 0x75, 0x28, 0x7f, 0x25, 0x97, 0xee, 0x91, 0x12, 0x71, 0x53, 0x4e, 0xcb, + 0xf3, 0xf1, 0x6e, 0x56, 0xb2, 0x09, 0xe5, 0xaf, 0xc6, 0xc6, 0x5b, 0x3a, 0x19, 0x1b, 0x6f, 0x19, + 0xd9, 0x2a, 0x6e, 0xc1, 0x29, 0xae, 0xd4, 0x35, 0x1d, 0x87, 0xa1, 0xb5, 0x46, 0x0d, 0xe5, 0xdf, + 0x8b, 0xad, 0x76, 0x09, 0x0a, 0x74, 0xed, 0x89, 0x03, 0xd9, 0xd4, 0x5d, 0xef, 0xe8, 0x96, 0x85, + 0xc7, 0xac, 0xca, 0xbf, 0x1f, 0x9b, 0xba, 0x43, 0x14, 0x3a, 0xee, 0x06, 0xbf, 0x98, 0x26, 0xf4, + 0x4a, 0xd4, 0xa4, 0xfc, 0xb5, 0x98, 0x26, 0xf4, 0x22, 0x66, 0x9a, 0xd0, 0x33, 0xeb, 0xd3, 0xdd, + 0x8c, 0x07, 0xeb, 0xca, 0x37, 0x63, 0x2b, 0x72, 0x2a, 0x15, 0x5b, 0x91, 0xd3, 0xdf, 0xbb, 0xdf, + 0xcd, 0x78, 0xec, 0xad, 0xfc, 0x7c, 0x6f, 0xbe, 0xe1, 0x4a, 0x9f, 0xfe, 0x56, 0xfc, 0x6e, 0xc6, + 0x43, 0x69, 0xe5, 0xaf, 0xf7, 0xe6, 0x1b, 0x3a, 0xf6, 0xa5, 0xbf, 0xb3, 0x6e, 0x64, 0x3f, 0x32, + 0x56, 0xfe, 0x46, 0x7c, 0xea, 0xca, 0x20, 0xc4, 0xa9, 0x2b, 0xeb, 0xa5, 0xf2, 0x2a, 0x5c, 0xe0, + 0x1a, 0x72, 0xd3, 0xd1, 0x3b, 0xeb, 0x75, 0xea, 0x79, 0xa6, 0xb5, 0xe6, 0xef, 0xc4, 0xfe, 0x66, + 0x2e, 0x76, 0x3c, 0x96, 0x45, 0x89, 0xc7, 0x63, 0x59, 0x48, 0xa6, 0xbc, 0x89, 0xe7, 0xc4, 0xca, + 0xdf, 0x8a, 0x29, 0x6f, 0x82, 0x82, 0x29, 0x6f, 0xf2, 0x15, 0xf2, 0xad, 0x94, 0x57, 0xb3, 0xca, + 0x7f, 0x90, 0xcd, 0x2b, 0x68, 0x5f, 0xca, 0x63, 0xdb, 0x5b, 0x29, 0x8f, 0x43, 0x95, 0xff, 0x30, + 0x9b, 0x57, 0xe8, 0x83, 0x94, 0x7c, 0x53, 0xfa, 0x2e, 0x9c, 0xe3, 0xb3, 0xf9, 0x1c, 0x35, 0x68, + 0xe4, 0x43, 0x7f, 0x21, 0x36, 0xf6, 0xd3, 0xc9, 0xf0, 0xc8, 0x3d, 0x15, 0x93, 0xc6, 0x5a, 0xb4, + 0xf5, 0x6f, 0xef, 0xc0, 0x3a, 0xdc, 0x10, 0xa4, 0x63, 0xd8, 0x7a, 0x23, 0x3f, 0x7e, 0x53, 0x7e, + 0x31, 0xb6, 0xde, 0xc8, 0x48, 0x74, 0xe7, 0x90, 0x5f, 0xca, 0xbd, 0x11, 0x7d, 0xe8, 0xa5, 0xfc, + 0x9d, 0xd4, 0xc2, 0x41, 0x07, 0x44, 0x5f, 0x85, 0xbd, 0x11, 0x7d, 0xd4, 0xa4, 0xfc, 0x52, 0x6a, + 0xe1, 0xe0, 0x03, 0xa2, 0x2f, 0xa0, 0xd8, 0x16, 0xa9, 0xeb, 0xd9, 0x9c, 0x55, 0x64, 0x7a, 0xf8, + 0xbb, 0xf1, 0x2d, 0x52, 0x2a, 0x19, 0x6e, 0x91, 0x52, 0x31, 0x69, 0xac, 0xc5, 0xe7, 0xfd, 0xf2, + 0x0e, 0xac, 0xa5, 0x8d, 0x5d, 0x2a, 0x26, 0x8d, 0xb5, 0xf8, 0xf8, 0x6f, 0xed, 0xc0, 0x5a, 0xda, + 0xd8, 0xa5, 0x62, 0x98, 0x39, 0x16, 0x62, 0xee, 0x52, 0xc7, 0x0d, 0xd5, 0xef, 0x3f, 0x8a, 0x99, + 0x63, 0x19, 0x74, 0xcc, 0x1c, 0xcb, 0x40, 0xa5, 0x72, 0x17, 0x42, 0xf9, 0x95, 0x9d, 0xb8, 0x87, + 0xf7, 0x32, 0x19, 0xa8, 0x54, 0xee, 0x42, 0x2e, 0x7f, 0x6f, 0x27, 0xee, 0xe1, 0xc5, 0x4c, 0x06, + 0x8a, 0x19, 0x45, 0x75, 0x4f, 0xf7, 0xcc, 0xe6, 0xbc, 0xed, 0x7a, 0xd2, 0x22, 0xff, 0x1f, 0xc7, + 0x8c, 0xa2, 0x34, 0x22, 0x66, 0x14, 0xa5, 0xc1, 0x93, 0x4c, 0x85, 0x34, 0x7e, 0xb5, 0x27, 0xd3, + 0xd0, 0xd2, 0x4a, 0x83, 0x27, 0x99, 0x0a, 0x21, 0xfc, 0x27, 0x3d, 0x99, 0x86, 0x9e, 0xf2, 0x69, + 0x70, 0x66, 0x99, 0xce, 0x38, 0xf6, 0x86, 0x75, 0x8b, 0x6e, 0xd0, 0x96, 0xf8, 0xf4, 0x5f, 0x8b, + 0x59, 0xa6, 0x71, 0x02, 0xbc, 0x45, 0x89, 0xc1, 0xa2, 0x8c, 0xc4, 0xe7, 0xfe, 0x7a, 0x26, 0xa3, + 0xf0, 0x98, 0x28, 0x0e, 0x8b, 0x32, 0x12, 0x9f, 0xf8, 0x1b, 0x99, 0x8c, 0xc2, 0x63, 0xa2, 0x38, + 0x8c, 0x94, 0x61, 0x0c, 0xdf, 0x4a, 0xe8, 0xae, 0xef, 0xf9, 0xf9, 0xdb, 0xb9, 0xe8, 0xad, 0x57, + 0x14, 0x3d, 0xdf, 0xa7, 0xc5, 0x0a, 0xc8, 0x2c, 0xc4, 0x27, 0x7d, 0x27, 0x83, 0x45, 0xe8, 0xef, + 0x18, 0x85, 0xc8, 0x2c, 0xc4, 0xc7, 0xfc, 0xa7, 0x19, 0x2c, 0x42, 0x87, 0xc7, 0x28, 0x84, 0x7c, + 0x1a, 0x86, 0xeb, 0x73, 0x2b, 0x35, 0x3f, 0x99, 0xe0, 0xdf, 0xcf, 0xc5, 0x5e, 0x15, 0x85, 0x38, + 0x7c, 0x55, 0x14, 0xfe, 0x24, 0x9f, 0x81, 0xd1, 0x19, 0xdb, 0xf2, 0xf4, 0xa6, 0xbf, 0x01, 0xfd, + 0x9d, 0xd8, 0x19, 0x4a, 0x04, 0x3b, 0xdf, 0xa7, 0x45, 0xc9, 0xa5, 0xf2, 0xa2, 0xed, 0xbf, 0x9b, + 0x5e, 0x3e, 0x68, 0x7a, 0x94, 0x7c, 0x7a, 0x00, 0xfa, 0xf1, 0x28, 0xf7, 0x56, 0x69, 0xf0, 0xdb, + 0xb9, 0x89, 0xdf, 0xcc, 0xdd, 0x2a, 0x0d, 0xfe, 0x66, 0x6e, 0xe2, 0xb7, 0xd8, 0xff, 0xbf, 0x95, + 0x9b, 0xf8, 0xed, 0x9c, 0x76, 0x21, 0x1c, 0x96, 0xe5, 0x35, 0x6a, 0x79, 0xb5, 0x96, 0x2e, 0x26, + 0x95, 0x54, 0x14, 0xff, 0x99, 0x8a, 0x12, 0x89, 0xc3, 0xbe, 0x99, 0x83, 0x91, 0xba, 0xe7, 0x50, + 0xbd, 0x2d, 0xe2, 0xf0, 0x5d, 0x84, 0x41, 0xee, 0x7c, 0xed, 0x3f, 0x43, 0xd7, 0x82, 0xdf, 0xe4, + 0x32, 0x8c, 0x2d, 0xe8, 0xae, 0x87, 0x4d, 0xac, 0x5a, 0x06, 0x7d, 0x84, 0x0f, 0x0f, 0x0b, 0x5a, + 0x0c, 0x4a, 0x16, 0x38, 0x1d, 0x2f, 0x87, 0xa1, 0x57, 0x0b, 0x3b, 0x86, 0x9f, 0x1b, 0xfc, 0xee, + 0xd6, 0x64, 0x1f, 0x46, 0x9b, 0x8b, 0x95, 0x55, 0xff, 0x20, 0x07, 0x09, 0xb7, 0xf0, 0xfd, 0xc7, + 0x9b, 0x58, 0x86, 0xf1, 0x58, 0xb8, 0x5f, 0xf1, 0x7a, 0x72, 0x97, 0xd1, 0x80, 0xe3, 0xa5, 0xc9, + 0x27, 0x82, 0x57, 0x7b, 0x77, 0xb4, 0x05, 0x11, 0x5a, 0x10, 0x93, 0x62, 0x74, 0x9d, 0x96, 0x26, + 0xa1, 0x44, 0xe8, 0xa8, 0xef, 0x4f, 0x84, 0xb1, 0x4c, 0xc9, 0x65, 0x11, 0xfc, 0x22, 0x17, 0x06, + 0x24, 0x8c, 0xa5, 0xe0, 0xe7, 0xc1, 0x2e, 0x3e, 0x03, 0x23, 0xd5, 0x76, 0x87, 0x3a, 0xae, 0x6d, + 0xe9, 0x9e, 0xed, 0x88, 0xa7, 0xfe, 0xf8, 0x28, 0xdf, 0x94, 0xe0, 0xf2, 0xa3, 0x7c, 0x99, 0x9e, + 0x5c, 0xf5, 0xf3, 0xfa, 0x15, 0x30, 0x8a, 0x2c, 0x3e, 0xa9, 0x8d, 0xa7, 0x75, 0xe7, 0x14, 0x8c, + 0xf4, 0x8e, 0xab, 0xe3, 0xfb, 0xce, 0x80, 0xb4, 0xcb, 0x00, 0x32, 0x29, 0x52, 0x90, 0xe7, 0xa1, + 0x84, 0xf7, 0x61, 0x2e, 0xe6, 0xeb, 0x14, 0x61, 0x12, 0x5b, 0x08, 0x91, 0x03, 0x32, 0x70, 0x1a, + 0x72, 0x1b, 0x26, 0xc2, 0xcb, 0xfe, 0x9b, 0x8e, 0xdd, 0xed, 0xf8, 0x19, 0x7a, 0x30, 0x1d, 0xfe, + 0x83, 0x00, 0xd7, 0x58, 0x43, 0xa4, 0xc4, 0x22, 0x51, 0x90, 0xcc, 0xc3, 0x78, 0x08, 0x63, 0x22, + 0xf2, 0x33, 0x83, 0x61, 0x56, 0x56, 0x89, 0x17, 0x13, 0x67, 0x24, 0x2b, 0x6b, 0xac, 0x18, 0xa9, + 0xc2, 0x80, 0x1f, 0x23, 0x71, 0x70, 0x47, 0x25, 0x3d, 0x2d, 0x62, 0x24, 0x0e, 0xc8, 0xd1, 0x11, + 0xfd, 0xf2, 0x64, 0x0e, 0xc6, 0x34, 0xbb, 0xeb, 0xd1, 0x15, 0x5b, 0xec, 0x92, 0x45, 0x2c, 0x4e, + 0x6c, 0x93, 0xc3, 0x30, 0x0d, 0xcf, 0x6e, 0x34, 0x39, 0x4e, 0xce, 0x6a, 0x1f, 0x2d, 0x45, 0x96, + 0xe0, 0x54, 0xc2, 0x2d, 0x42, 0xce, 0xf1, 0x2f, 0x7d, 0x5e, 0x92, 0x59, 0xb2, 0x28, 0xf9, 0xd1, + 0x1c, 0x94, 0x56, 0x1c, 0xdd, 0xf4, 0x5c, 0xf1, 0x34, 0xf4, 0xec, 0xd4, 0x86, 0xa3, 0x77, 0x98, + 0x7e, 0x4c, 0x61, 0x98, 0xe0, 0xbb, 0x7a, 0xab, 0x4b, 0xdd, 0xe9, 0x7b, 0xec, 0xeb, 0xfe, 0xfb, + 0xad, 0xc9, 0x37, 0x78, 0x50, 0x8d, 0xa9, 0xa6, 0xdd, 0xbe, 0xb6, 0xe6, 0xe8, 0x0f, 0x4d, 0x0f, + 0x4d, 0x5c, 0xbd, 0x75, 0xcd, 0xa3, 0x2d, 0x3c, 0xe3, 0xbd, 0xa6, 0x77, 0xcc, 0x6b, 0x18, 0x8e, + 0xfe, 0x5a, 0xc0, 0x89, 0xd7, 0xc0, 0x54, 0xc0, 0xc3, 0xbf, 0x64, 0x15, 0xe0, 0x38, 0xb2, 0x04, + 0x20, 0x3e, 0xb5, 0xdc, 0xe9, 0x88, 0x77, 0xa6, 0xd2, 0xc9, 0xa8, 0x8f, 0xe1, 0x8a, 0x1d, 0x08, + 0x4c, 0xef, 0x48, 0x21, 0x98, 0x35, 0x89, 0x03, 0xd3, 0x82, 0x15, 0xd1, 0x22, 0x5f, 0x4c, 0xa3, + 0xa1, 0xc4, 0xfd, 0xc6, 0xa6, 0x08, 0x29, 0x5e, 0x8c, 0xac, 0xc2, 0xb8, 0xe0, 0x1b, 0x24, 0x6c, + 0x19, 0x8b, 0xce, 0x0a, 0x31, 0x34, 0x57, 0xda, 0xa0, 0x8d, 0x86, 0x00, 0xcb, 0x75, 0xc4, 0x4a, + 0x90, 0xe9, 0x30, 0xc1, 0xf4, 0x92, 0xde, 0xa6, 0xae, 0x32, 0x8e, 0x1a, 0x7b, 0x69, 0x7b, 0x6b, + 0x52, 0xf1, 0xcb, 0x63, 0xb8, 0x50, 0x59, 0x74, 0xd1, 0x22, 0x32, 0x0f, 0xae, 0xf5, 0x13, 0x29, + 0x3c, 0xe2, 0x3a, 0x1f, 0x2d, 0x42, 0x66, 0x60, 0x34, 0x78, 0xe6, 0x72, 0xe7, 0x4e, 0xb5, 0x82, + 0x0f, 0x59, 0x45, 0xc4, 0xd8, 0x58, 0x4a, 0x15, 0x99, 0x49, 0xa4, 0x8c, 0x14, 0x78, 0x84, 0xbf, + 0x6c, 0x8d, 0x05, 0x1e, 0xe9, 0xa4, 0x04, 0x1e, 0xa9, 0x91, 0xb7, 0x60, 0xb8, 0x7c, 0xaf, 0x2e, + 0x02, 0xaa, 0xb8, 0xca, 0xe9, 0x30, 0x3f, 0x97, 0xbe, 0xe1, 0x36, 0xfc, 0xe0, 0x2b, 0x72, 0xd3, + 0x65, 0x7a, 0x32, 0x0b, 0x63, 0x11, 0x4f, 0x39, 0x57, 0x39, 0x83, 0x1c, 0xb0, 0xe5, 0x3a, 0x62, + 0x1a, 0x8e, 0x40, 0xc9, 0xc3, 0x2b, 0x5a, 0x88, 0x69, 0x4d, 0xc5, 0x74, 0x31, 0xd7, 0x91, 0x46, + 0x31, 0x76, 0x0b, 0x3e, 0x8b, 0x1d, 0xe4, 0x5a, 0x63, 0x08, 0x54, 0xc3, 0xe1, 0x38, 0xb9, 0x47, + 0x63, 0xc5, 0xc8, 0x7b, 0x40, 0x30, 0x3b, 0x12, 0x35, 0xfc, 0x8b, 0xd3, 0x6a, 0xc5, 0x55, 0xce, + 0x61, 0xb8, 0x74, 0x12, 0x0f, 0xe7, 0x50, 0xad, 0x4c, 0x5f, 0x16, 0xd3, 0xc7, 0x53, 0x3a, 0x2f, + 0xd5, 0xf0, 0x43, 0x39, 0x34, 0xcc, 0x48, 0xea, 0xe8, 0x14, 0xae, 0x64, 0x03, 0xce, 0xd7, 0x1c, + 0xfa, 0xd0, 0xb4, 0xbb, 0xae, 0xbf, 0x7c, 0xf8, 0xf3, 0xd6, 0xf9, 0x1d, 0xe7, 0xad, 0x67, 0x44, + 0xc5, 0x67, 0x3b, 0x0e, 0x7d, 0xd8, 0xf0, 0x83, 0x64, 0x47, 0x62, 0xbc, 0x66, 0x71, 0xc7, 0x04, + 0xd8, 0xef, 0x77, 0x1d, 0x2a, 0xe0, 0x26, 0x75, 0x15, 0x25, 0x9c, 0x6a, 0x79, 0x5c, 0x1f, 0x33, + 0xc0, 0x45, 0x12, 0x60, 0x47, 0x8b, 0x11, 0x0d, 0xc8, 0xcd, 0x19, 0xff, 0x12, 0xbd, 0xdc, 0xe4, + 0x69, 0x82, 0x95, 0x0b, 0xc8, 0x4c, 0x65, 0x62, 0x59, 0x6b, 0x06, 0x01, 0xf3, 0x1b, 0xba, 0xc0, + 0xcb, 0x62, 0x49, 0x96, 0x26, 0x0b, 0x30, 0x51, 0x73, 0xf0, 0x48, 0xef, 0x36, 0xdd, 0xac, 0xd9, + 0x2d, 0xb3, 0xb9, 0x89, 0xaf, 0x73, 0xc5, 0x54, 0xd9, 0xe1, 0xb8, 0xc6, 0x03, 0xba, 0xd9, 0xe8, + 0x20, 0x56, 0x5e, 0x56, 0xe2, 0x25, 0xe5, 0x00, 0xd6, 0x4f, 0xec, 0x2e, 0x80, 0x35, 0x85, 0x09, + 0x71, 0x05, 0xff, 0xc8, 0xa3, 0x16, 0x5b, 0xea, 0x5d, 0xf1, 0x12, 0x57, 0x89, 0x5d, 0xd9, 0x07, + 0x78, 0x3e, 0x75, 0x88, 0x51, 0x46, 0x03, 0xb0, 0xdc, 0xb0, 0x78, 0x91, 0x64, 0x94, 0xe7, 0x27, + 0xf7, 0x11, 0xe5, 0xf9, 0x7f, 0x2f, 0xc8, 0xf3, 0x2f, 0xb9, 0x04, 0x45, 0x29, 0x09, 0x13, 0x86, + 0xb0, 0xc5, 0x80, 0xf5, 0x45, 0x11, 0x99, 0x7b, 0x48, 0xd8, 0x2e, 0x41, 0x68, 0x21, 0xcc, 0xba, + 0x19, 0x86, 0x35, 0xd5, 0x42, 0x02, 0xcc, 0x78, 0xd8, 0x5d, 0x6d, 0x99, 0x4d, 0x4c, 0x63, 0x50, + 0x90, 0xc2, 0x7d, 0x20, 0x94, 0x67, 0x31, 0x90, 0x48, 0xc8, 0x75, 0x18, 0xf6, 0x8f, 0x92, 0xc3, + 0x10, 0xce, 0x18, 0xdd, 0x5e, 0xcc, 0xd6, 0x22, 0x78, 0xbe, 0x44, 0x44, 0x5e, 0x07, 0x08, 0xa7, + 0x03, 0x61, 0x69, 0xe1, 0x52, 0x21, 0xcf, 0x1e, 0xf2, 0x52, 0x11, 0x52, 0xb3, 0x89, 0x53, 0x56, + 0x47, 0x3f, 0xc7, 0x2b, 0x4e, 0x9c, 0x11, 0x1d, 0x96, 0x15, 0x24, 0x5a, 0x84, 0x2c, 0xc3, 0xa9, + 0x84, 0x06, 0x8a, 0x80, 0xcf, 0x98, 0xe7, 0x3f, 0x45, 0x7d, 0xe5, 0x85, 0x39, 0x51, 0x96, 0x3c, + 0x0b, 0x85, 0x3b, 0x5a, 0x55, 0x04, 0x9d, 0xe5, 0xf1, 0x8a, 0x23, 0x01, 0xa4, 0x18, 0x96, 0xbc, + 0x06, 0xc0, 0x93, 0xba, 0xd4, 0x6c, 0xc7, 0x43, 0x8b, 0x62, 0x74, 0xfa, 0x02, 0x1b, 0xcb, 0x3c, + 0xe9, 0x4b, 0x83, 0x2d, 0x63, 0xf2, 0x47, 0x87, 0xc4, 0xea, 0x0f, 0xe7, 0x13, 0xcb, 0x1a, 0x13, + 0xbc, 0x68, 0x85, 0xd4, 0xf9, 0x28, 0x78, 0xbf, 0xe9, 0x5c, 0xf0, 0x12, 0x11, 0xb9, 0x02, 0x83, + 0x35, 0x36, 0xa9, 0x34, 0xed, 0x96, 0x50, 0x05, 0x8c, 0x3c, 0xd6, 0x11, 0x30, 0x2d, 0xc0, 0x92, + 0xeb, 0x52, 0x56, 0x63, 0x29, 0x04, 0xbc, 0x9f, 0xd5, 0x38, 0x1e, 0x0b, 0x1d, 0xf3, 0x1b, 0x5f, + 0x8f, 0x65, 0x49, 0x13, 0x65, 0x52, 0x96, 0xd4, 0x30, 0x2b, 0x5a, 0x60, 0xd0, 0xf6, 0xef, 0x64, + 0xd0, 0xaa, 0xbf, 0x93, 0x4b, 0x0e, 0x51, 0x72, 0x23, 0x19, 0x8d, 0x19, 0xd7, 0xaf, 0x00, 0x28, + 0xd7, 0x1a, 0xc4, 0x65, 0x8e, 0xc4, 0x55, 0xce, 0xef, 0x3b, 0xae, 0x72, 0x61, 0x8f, 0x71, 0x95, + 0xd5, 0xff, 0xa7, 0xd8, 0xd3, 0xdb, 0xfc, 0x48, 0xe2, 0xef, 0xbd, 0xc6, 0x36, 0x65, 0xac, 0xf6, + 0xb2, 0x9b, 0xd8, 0x5a, 0x70, 0x67, 0xda, 0x86, 0xce, 0x47, 0xa5, 0xab, 0x45, 0x29, 0xc9, 0xdb, + 0x30, 0xe2, 0x7f, 0x00, 0xc6, 0xeb, 0x96, 0xe2, 0x4c, 0x07, 0x0b, 0x62, 0x2c, 0xb2, 0x75, 0xa4, + 0x00, 0x79, 0x19, 0x86, 0xd0, 0x1c, 0xea, 0xe8, 0x4d, 0x3f, 0x98, 0x3b, 0x8f, 0xfe, 0xee, 0x03, + 0xe5, 0x18, 0x73, 0x01, 0x25, 0xf9, 0x22, 0x94, 0x44, 0x46, 0x13, 0x9e, 0xf0, 0xff, 0xda, 0x2e, + 0xdc, 0xf3, 0xa7, 0xe4, 0x6c, 0x26, 0x7c, 0x83, 0x83, 0x80, 0xc8, 0x06, 0x87, 0x27, 0x32, 0x59, + 0x81, 0xd3, 0x35, 0x87, 0x1a, 0xf8, 0x10, 0x64, 0xf6, 0x51, 0xc7, 0x11, 0xb9, 0x66, 0xf8, 0x04, + 0x81, 0xeb, 0x5b, 0xc7, 0x47, 0xb3, 0x95, 0x57, 0xe0, 0xe5, 0x88, 0xd2, 0x29, 0xc5, 0x99, 0xd1, + 0xc3, 0x5b, 0x72, 0x9b, 0x6e, 0x6e, 0xd8, 0x8e, 0xc1, 0xd3, 0xb1, 0x88, 0xa9, 0x5f, 0x08, 0xfa, + 0x81, 0x40, 0xc9, 0x46, 0x4f, 0xb4, 0xd0, 0xc5, 0xd7, 0x60, 0x78, 0xbf, 0x19, 0x41, 0x7e, 0x25, + 0x9f, 0xf1, 0x6e, 0xeb, 0xf1, 0x4d, 0xca, 0x18, 0x64, 0x0a, 0xef, 0xcf, 0xc8, 0x14, 0xfe, 0xa7, + 0xf9, 0x8c, 0x47, 0x69, 0x8f, 0x75, 0x46, 0xdf, 0x40, 0x18, 0xd1, 0x8c, 0xbe, 0x61, 0x32, 0x65, + 0xd3, 0xd0, 0x64, 0xa2, 0x58, 0xee, 0xef, 0xd2, 0x8e, 0xb9, 0xbf, 0x7f, 0xa1, 0xd0, 0xeb, 0xd1, + 0xde, 0x89, 0xec, 0xf7, 0x22, 0xfb, 0xeb, 0x30, 0x1c, 0x48, 0xb6, 0x5a, 0x41, 0x7b, 0x69, 0x34, + 0xc8, 0x3f, 0xc4, 0xc1, 0x58, 0x46, 0x22, 0x22, 0x57, 0x79, 0x5b, 0xeb, 0xe6, 0xfb, 0x3c, 0x13, + 0xc6, 0xa8, 0xc8, 0x71, 0xa0, 0x7b, 0x7a, 0xc3, 0x35, 0xdf, 0xa7, 0x5a, 0x80, 0xc6, 0x20, 0xa7, + 0x69, 0xef, 0x17, 0x4f, 0xfa, 0x68, 0xf7, 0x7d, 0x94, 0x22, 0x44, 0xfe, 0x66, 0xf3, 0x44, 0x88, + 0x7b, 0x10, 0xe2, 0x9f, 0xe4, 0x53, 0x5f, 0xb8, 0x9e, 0x08, 0x71, 0x2f, 0xb3, 0xc5, 0xf3, 0x30, + 0xa4, 0xd9, 0x1b, 0xee, 0x0c, 0xee, 0x89, 0xf8, 0x5c, 0x81, 0x13, 0xb5, 0x63, 0x6f, 0xb8, 0x0d, + 0xdc, 0xed, 0x68, 0x21, 0x81, 0xfa, 0xfd, 0x7c, 0x8f, 0x37, 0xc0, 0x27, 0x82, 0xff, 0x20, 0x97, + 0xc8, 0x5f, 0xcf, 0x47, 0xde, 0x18, 0x3f, 0xbe, 0xc2, 0xbe, 0x06, 0x50, 0x6f, 0xae, 0xd3, 0xb6, + 0x2e, 0x65, 0x13, 0xc3, 0x23, 0x0b, 0x17, 0xa1, 0x22, 0x0b, 0x75, 0x48, 0xa2, 0x7e, 0x3b, 0x1f, + 0x7b, 0x64, 0x7d, 0x22, 0xbb, 0x5d, 0xcb, 0x2e, 0xd0, 0x3a, 0xf1, 0x6e, 0xfc, 0x44, 0x72, 0xbb, + 0x95, 0xdc, 0x8f, 0xe5, 0x63, 0x4f, 0xec, 0x1f, 0x5b, 0xd9, 0xb1, 0x01, 0x98, 0x7c, 0xfa, 0xff, + 0xd8, 0x6a, 0xd2, 0xf3, 0x30, 0x24, 0xe4, 0x10, 0x2c, 0x15, 0x7c, 0xde, 0xe7, 0x40, 0x3c, 0xa0, + 0x0d, 0x08, 0xd4, 0x3f, 0x97, 0x87, 0x68, 0xe8, 0x83, 0xc7, 0x54, 0x87, 0x7e, 0x3d, 0x1f, 0x0d, + 0xfa, 0xf0, 0xf8, 0xea, 0xcf, 0x14, 0x40, 0xbd, 0xbb, 0xda, 0x14, 0x31, 0x83, 0xfb, 0xa5, 0x13, + 0xfe, 0x00, 0xaa, 0x49, 0x14, 0xea, 0xff, 0x9b, 0x4f, 0x8d, 0x44, 0xf1, 0xf8, 0x0a, 0xf0, 0x25, + 0x3c, 0x15, 0x6f, 0x5a, 0xe1, 0x44, 0x8e, 0x87, 0x90, 0x6c, 0xfc, 0x25, 0x52, 0x50, 0xfa, 0x84, + 0xe4, 0xd3, 0x29, 0xe6, 0x1a, 0x26, 0xc8, 0x08, 0xcd, 0x35, 0xf9, 0x30, 0x5f, 0x32, 0xdc, 0x7e, + 0x3f, 0xbf, 0x53, 0xe0, 0x8e, 0xc7, 0x79, 0x55, 0x1d, 0xa8, 0xe9, 0x9b, 0x18, 0x60, 0x92, 0xf5, + 0xc4, 0x08, 0x4f, 0x90, 0xd8, 0xe1, 0x20, 0xf9, 0xda, 0x4e, 0x50, 0xa9, 0xff, 0xbc, 0x3f, 0x3d, + 0x6a, 0xc4, 0xe3, 0x2b, 0xc2, 0x4b, 0x50, 0xac, 0xe9, 0xde, 0xba, 0xd0, 0x64, 0xbc, 0x0d, 0xec, + 0xe8, 0xde, 0xba, 0x86, 0x50, 0x72, 0x15, 0x06, 0x35, 0x7d, 0x83, 0x9f, 0x79, 0x96, 0xc2, 0xe4, + 0x95, 0x8e, 0xbe, 0xd1, 0xe0, 0xe7, 0x9e, 0x01, 0x9a, 0xa8, 0x41, 0xf2, 0x54, 0x7e, 0xf2, 0x8d, + 0x99, 0xfb, 0x78, 0xf2, 0xd4, 0x20, 0x65, 0xea, 0x25, 0x28, 0x4e, 0xdb, 0xc6, 0x26, 0xde, 0x7c, + 0x8d, 0xf0, 0xca, 0x56, 0x6d, 0x63, 0x53, 0x43, 0x28, 0xf9, 0xf1, 0x1c, 0x0c, 0xcc, 0x53, 0xdd, + 0x60, 0x23, 0x64, 0xa8, 0x97, 0xc3, 0xca, 0xe7, 0x0e, 0xc7, 0x61, 0xe5, 0xd4, 0x3a, 0xaf, 0x4c, + 0x56, 0x14, 0x51, 0x3f, 0xb9, 0x09, 0x83, 0x33, 0xba, 0x47, 0xd7, 0x6c, 0x67, 0x13, 0x5d, 0x70, + 0xc6, 0xc2, 0x97, 0x07, 0x11, 0xfd, 0xf1, 0x89, 0xf8, 0xcd, 0x58, 0x53, 0xfc, 0xd2, 0x82, 0xc2, + 0x4c, 0x2c, 0xfc, 0x66, 0x4e, 0x24, 0x0a, 0x47, 0xb1, 0xf0, 0x2b, 0x3c, 0x4d, 0x60, 0xc2, 0x63, + 0xe5, 0x91, 0xf4, 0x63, 0x65, 0xb4, 0x1e, 0xd1, 0x4d, 0x0f, 0x53, 0x96, 0x8e, 0xe2, 0xa2, 0xcf, + 0xad, 0x47, 0x84, 0x62, 0xc6, 0x52, 0x4d, 0x22, 0x51, 0xbf, 0xd7, 0x0f, 0xa9, 0x6f, 0xcc, 0x4f, + 0x94, 0xfc, 0x44, 0xc9, 0x43, 0x25, 0xaf, 0x24, 0x94, 0xfc, 0x62, 0x32, 0x6a, 0xc1, 0x87, 0x54, + 0xc3, 0x7f, 0xb6, 0x98, 0x88, 0x79, 0xf2, 0x78, 0xef, 0x2e, 0x43, 0xe9, 0xf5, 0xef, 0x28, 0xbd, + 0x60, 0x40, 0x94, 0x76, 0x1c, 0x10, 0x03, 0xbb, 0x1d, 0x10, 0x83, 0x99, 0x03, 0x22, 0x54, 0x90, + 0xa1, 0x4c, 0x05, 0xa9, 0x8a, 0x41, 0x03, 0xbd, 0x53, 0xaf, 0x5c, 0xda, 0xde, 0x9a, 0x1c, 0x63, + 0xa3, 0x29, 0x35, 0xe7, 0x0a, 0xb2, 0x50, 0xff, 0xa0, 0xd8, 0x23, 0x50, 0xd1, 0x91, 0xe8, 0xc8, + 0x4b, 0x50, 0x28, 0x77, 0x3a, 0x42, 0x3f, 0x4e, 0x4b, 0x31, 0x92, 0x32, 0x4a, 0x31, 0x6a, 0xf2, + 0x3a, 0x14, 0xca, 0xf7, 0xea, 0xf1, 0x74, 0x2b, 0xe5, 0x7b, 0x75, 0xf1, 0x25, 0x99, 0x65, 0xef, + 0xd5, 0xc9, 0x9b, 0x61, 0xdc, 0xd3, 0xf5, 0xae, 0xf5, 0x40, 0x6c, 0x14, 0x85, 0xa7, 0xae, 0xef, + 0xc9, 0xd3, 0x64, 0x28, 0xb6, 0x5d, 0x8c, 0xd1, 0xc6, 0xb4, 0xa9, 0xb4, 0x7b, 0x6d, 0x1a, 0xd8, + 0x51, 0x9b, 0x06, 0x77, 0xab, 0x4d, 0x43, 0xbb, 0xd0, 0x26, 0xd8, 0x51, 0x9b, 0x86, 0x0f, 0xae, + 0x4d, 0x1d, 0xb8, 0x98, 0x0c, 0x2e, 0x17, 0x68, 0x84, 0x06, 0x24, 0x89, 0x15, 0x8e, 0x25, 0x78, + 0xf5, 0xdf, 0xe5, 0xd8, 0xc6, 0x06, 0xa2, 0x1b, 0x2e, 0xc3, 0xcb, 0xae, 0x6d, 0xc9, 0xd2, 0xea, + 0xaf, 0xe4, 0xb3, 0x63, 0xe2, 0x1d, 0xcf, 0x29, 0xee, 0x07, 0x53, 0xa5, 0x54, 0x8c, 0xc6, 0x28, + 0xc8, 0x96, 0x72, 0x8c, 0x6d, 0x9a, 0xcc, 0xbe, 0x95, 0xcf, 0x0a, 0xd4, 0x77, 0x20, 0x89, 0x7d, + 0x3c, 0xe9, 0x0c, 0x87, 0x2e, 0xfe, 0x6e, 0xd4, 0x0b, 0x6e, 0x0e, 0x46, 0x64, 0x21, 0x0a, 0x29, + 0xed, 0x46, 0xc0, 0x91, 0x72, 0xe4, 0xcd, 0x20, 0x2b, 0x8e, 0xe4, 0x1f, 0x83, 0x9e, 0x6e, 0xfe, + 0x98, 0x8d, 0xb9, 0xc7, 0xc8, 0xe4, 0xe4, 0x79, 0x28, 0xcd, 0x61, 0x98, 0x79, 0x79, 0xb0, 0xf3, + 0xc0, 0xf3, 0xb2, 0xd7, 0x0a, 0xa7, 0x51, 0x7f, 0x27, 0x07, 0xa7, 0x6f, 0x77, 0x57, 0xa9, 0x70, + 0xb4, 0x0b, 0xda, 0xf0, 0x1e, 0x00, 0x03, 0x0b, 0x87, 0x99, 0x1c, 0x3a, 0xcc, 0x7c, 0x52, 0x0e, + 0xe8, 0x17, 0x2b, 0x30, 0x15, 0x52, 0x73, 0x67, 0x99, 0x27, 0x7d, 0x9f, 0xd3, 0x07, 0xdd, 0x55, + 0xda, 0x48, 0x78, 0xcd, 0x48, 0xdc, 0x2f, 0xbe, 0xc5, 0xbd, 0xf9, 0xf7, 0xeb, 0xa0, 0xf2, 0xcb, + 0xf9, 0xcc, 0x18, 0x8a, 0xc7, 0x36, 0x35, 0xe9, 0x17, 0x52, 0x7b, 0x25, 0x9e, 0xa2, 0x34, 0x85, + 0x24, 0xc6, 0x31, 0x8d, 0x4b, 0xba, 0xc0, 0x8e, 0x79, 0xc2, 0xdc, 0x0f, 0x54, 0x60, 0xff, 0x30, + 0x97, 0x19, 0xeb, 0xf2, 0xb8, 0x0a, 0x4c, 0xfd, 0x5f, 0x0a, 0x7e, 0x88, 0xcd, 0x03, 0x7d, 0xc2, + 0xf3, 0x30, 0x24, 0x22, 0x0d, 0x44, 0xfd, 0x84, 0xc5, 0xb1, 0x21, 0x1e, 0x43, 0x07, 0x04, 0xcc, + 0xa4, 0x90, 0x9c, 0x98, 0x25, 0x3f, 0x61, 0xc9, 0x81, 0x59, 0x93, 0x48, 0x98, 0xd1, 0x30, 0xfb, + 0xc8, 0xf4, 0xd0, 0x02, 0x61, 0x7d, 0x59, 0xe0, 0x46, 0x03, 0x7d, 0x64, 0x7a, 0xdc, 0xfe, 0x08, + 0xd0, 0xcc, 0x20, 0xe0, 0xb6, 0x88, 0x98, 0xf7, 0xd0, 0x20, 0xe0, 0xa6, 0x8a, 0x26, 0x30, 0xac, + 0xb5, 0xc2, 0xf9, 0x56, 0xb8, 0xb4, 0x88, 0xd6, 0x0a, 0x77, 0x5d, 0x6c, 0x6d, 0x40, 0xc0, 0x38, + 0x6a, 0x74, 0x2d, 0x74, 0xe2, 0x43, 0x8e, 0x0e, 0x42, 0x34, 0x81, 0x21, 0xd7, 0x61, 0xac, 0xee, + 0xe9, 0x96, 0xa1, 0x3b, 0xc6, 0x72, 0xd7, 0xeb, 0x74, 0x3d, 0xd9, 0x00, 0x76, 0x3d, 0xc3, 0xee, + 0x7a, 0x5a, 0x8c, 0x82, 0x7c, 0x0a, 0x46, 0x7d, 0xc8, 0xac, 0xe3, 0xd8, 0x8e, 0x6c, 0xe5, 0xb8, + 0x9e, 0x41, 0x1d, 0x47, 0x8b, 0x12, 0x90, 0x4f, 0xc3, 0x68, 0xd5, 0x7a, 0x68, 0x37, 0xf9, 0x6b, + 0x7b, 0x6d, 0x41, 0xd8, 0x3c, 0xf8, 0x62, 0xcc, 0x0c, 0x10, 0x8d, 0xae, 0xd3, 0xd2, 0xa2, 0x84, + 0xea, 0x76, 0x3e, 0x19, 0x89, 0xf4, 0xf1, 0xdd, 0x20, 0x5d, 0x8d, 0x3a, 0xee, 0xa1, 0xb7, 0x2a, + 0x1a, 0x9f, 0xb2, 0xdf, 0x30, 0xb7, 0x41, 0xaf, 0xc3, 0xe0, 0x6d, 0xba, 0xc9, 0x7d, 0x4c, 0x4b, + 0xa1, 0x5b, 0xf2, 0x03, 0x01, 0x93, 0x4f, 0x77, 0x7d, 0x3a, 0xf5, 0x3b, 0xf9, 0x64, 0x8c, 0xd5, + 0xc7, 0x57, 0xd8, 0x9f, 0x82, 0x01, 0x14, 0x65, 0xd5, 0xbf, 0x5e, 0x40, 0x01, 0xa2, 0xb8, 0xa3, + 0xde, 0xce, 0x3e, 0x99, 0xfa, 0xf3, 0xa5, 0x78, 0xe0, 0xdd, 0xc7, 0x57, 0x7a, 0x6f, 0xc0, 0xf0, + 0x8c, 0x6d, 0xb9, 0xa6, 0xeb, 0x51, 0xab, 0xe9, 0x2b, 0x2c, 0x3a, 0xfe, 0x37, 0x43, 0xb0, 0x6c, + 0x03, 0x4a, 0xd4, 0xfb, 0x51, 0x5e, 0xf2, 0x0a, 0x0c, 0xa1, 0xc8, 0xd1, 0xe6, 0xe4, 0x13, 0x1e, + 0xde, 0x4c, 0xac, 0x32, 0x60, 0xdc, 0xe2, 0x0c, 0x49, 0xc9, 0x1d, 0x18, 0x9c, 0x59, 0x37, 0x5b, + 0x86, 0x43, 0x2d, 0xf4, 0x4d, 0x96, 0xe2, 0x9b, 0x44, 0xfb, 0x72, 0x0a, 0xff, 0x45, 0x5a, 0xde, + 0x9c, 0xa6, 0x28, 0x16, 0x79, 0x2c, 0x26, 0x60, 0x17, 0x7f, 0x3a, 0x0f, 0x10, 0x16, 0x20, 0x4f, + 0x43, 0x3e, 0x48, 0x8c, 0x8d, 0x2e, 0x31, 0x11, 0x0d, 0xca, 0xe3, 0x52, 0x21, 0xc6, 0x76, 0x7e, + 0xc7, 0xb1, 0x7d, 0x07, 0x4a, 0xfc, 0x74, 0x0d, 0xbd, 0xd6, 0xa5, 0x58, 0xa0, 0x99, 0x0d, 0x9e, + 0x42, 0x7a, 0x6e, 0x4b, 0xa3, 0xe5, 0x19, 0xf1, 0x00, 0xe7, 0xcc, 0x2e, 0x36, 0xa1, 0x1f, 0xff, + 0x22, 0x97, 0xa1, 0xb8, 0xe2, 0xe7, 0xbd, 0x1d, 0xe5, 0xb3, 0x74, 0x4c, 0x7e, 0x88, 0x67, 0xdd, + 0x34, 0x63, 0x5b, 0x1e, 0xab, 0x1a, 0x5b, 0x3d, 0x22, 0xe4, 0x22, 0x60, 0x11, 0xb9, 0x08, 0x98, + 0xfa, 0x5f, 0xe5, 0x53, 0x42, 0x42, 0x3f, 0xbe, 0xc3, 0xe4, 0x35, 0x00, 0x7c, 0x79, 0xce, 0xe4, + 0xe9, 0x3f, 0x07, 0xc1, 0x51, 0x82, 0x8c, 0x50, 0x6d, 0x23, 0xdb, 0x8e, 0x90, 0x58, 0xfd, 0x07, + 0xb9, 0x44, 0x1c, 0xe1, 0x03, 0xc9, 0x51, 0xb6, 0xca, 0xf2, 0xfb, 0x34, 0x63, 0xfd, 0xbe, 0x28, + 0xec, 0xad, 0x2f, 0xa2, 0xdf, 0x72, 0x08, 0x96, 0xe9, 0x51, 0x7e, 0xcb, 0xf7, 0xf2, 0x69, 0x51, + 0x95, 0x8f, 0xa7, 0x8a, 0xdf, 0x08, 0x8c, 0xd2, 0x62, 0x2c, 0x8e, 0x3d, 0x42, 0xe3, 0xb9, 0xb9, + 0x85, 0x99, 0xfa, 0x25, 0x18, 0x8f, 0xc5, 0x1a, 0x16, 0x69, 0x92, 0x2f, 0xf7, 0x0e, 0x5a, 0x9c, + 0x1d, 0xb3, 0x20, 0x42, 0xa6, 0xfe, 0x7f, 0xb9, 0xde, 0x91, 0xa6, 0x8f, 0x5c, 0x75, 0x52, 0x04, + 0x50, 0xf8, 0xb3, 0x11, 0xc0, 0x21, 0x6c, 0x83, 0x8f, 0xb7, 0x00, 0x3e, 0x24, 0x93, 0xc7, 0x07, + 0x2d, 0x80, 0x9f, 0xcf, 0xed, 0x18, 0x28, 0xfc, 0xa8, 0x65, 0xa0, 0xfe, 0x8f, 0xb9, 0xd4, 0x80, + 0xde, 0x07, 0x6a, 0xd7, 0x9b, 0x50, 0xe2, 0x2e, 0x3c, 0xa2, 0x55, 0x52, 0x0a, 0x34, 0x06, 0xcd, + 0x28, 0x2f, 0xca, 0x90, 0x05, 0x18, 0xe0, 0x6d, 0x30, 0x44, 0x6f, 0x7c, 0xac, 0x47, 0x54, 0x71, + 0x23, 0x6b, 0x72, 0x14, 0x68, 0xf5, 0x77, 0x73, 0x89, 0xf8, 0xe2, 0x47, 0xf8, 0x6d, 0xe1, 0x54, + 0x5d, 0xd8, 0xfd, 0x54, 0xad, 0xfe, 0xb3, 0x7c, 0x7a, 0x78, 0xf3, 0x23, 0xfc, 0x90, 0xc3, 0x38, + 0x4e, 0xdb, 0xdf, 0xba, 0xb5, 0x02, 0x63, 0x51, 0x59, 0x88, 0x65, 0xeb, 0xa9, 0xf4, 0x20, 0xef, + 0x19, 0xad, 0x88, 0xf1, 0x50, 0xbf, 0x9b, 0x4b, 0x46, 0x66, 0x3f, 0xf2, 0xf9, 0x69, 0x7f, 0xda, + 0x12, 0xfd, 0x94, 0x0f, 0xc9, 0x5a, 0x73, 0x18, 0x9f, 0xf2, 0x21, 0x59, 0x35, 0xf6, 0xf7, 0x29, + 0xbf, 0x98, 0xcf, 0x0a, 0x6c, 0x7f, 0xe4, 0x1f, 0xf4, 0x79, 0x59, 0xc8, 0xbc, 0x65, 0xe2, 0xd3, + 0x9e, 0xce, 0x8a, 0x24, 0x9f, 0xc1, 0x33, 0xc1, 0x67, 0x7f, 0x63, 0x3c, 0x55, 0x58, 0x1f, 0x12, + 0x45, 0x3e, 0x1e, 0xc2, 0xfa, 0x90, 0x0c, 0x95, 0x0f, 0x9f, 0xb0, 0x7e, 0x33, 0xbf, 0xdb, 0x6c, + 0x0a, 0x27, 0xc2, 0x4b, 0x08, 0xef, 0xeb, 0xf9, 0x64, 0x96, 0x8f, 0x23, 0x17, 0xd3, 0x1c, 0x94, + 0x44, 0xbe, 0x91, 0x4c, 0xe1, 0x70, 0x7c, 0x96, 0x45, 0x23, 0xbe, 0xe3, 0x06, 0x88, 0x8b, 0x9c, + 0xdd, 0x89, 0x84, 0xd3, 0xaa, 0xdf, 0xcf, 0xc5, 0x52, 0x62, 0x1c, 0xc9, 0x11, 0xc2, 0xbe, 0x96, + 0x24, 0xf2, 0x96, 0x7f, 0x98, 0x59, 0x8c, 0x85, 0x24, 0x0f, 0xbe, 0xa7, 0x42, 0x3d, 0xdd, 0x6c, + 0xc5, 0xcb, 0x8b, 0xf8, 0x03, 0xdf, 0xc9, 0xc3, 0xa9, 0x04, 0x29, 0xb9, 0x1c, 0x89, 0xf8, 0x83, + 0xc7, 0x92, 0x31, 0x47, 0x75, 0x1e, 0xfb, 0x67, 0x0f, 0x27, 0xa9, 0x97, 0xa1, 0x58, 0xd1, 0x37, + 0xf9, 0xb7, 0xf5, 0x73, 0x96, 0x86, 0xbe, 0x29, 0x9f, 0xb8, 0x21, 0x9e, 0xac, 0xc2, 0x59, 0x7e, + 0x1f, 0x62, 0xda, 0xd6, 0x8a, 0xd9, 0xa6, 0x55, 0x6b, 0xd1, 0x6c, 0xb5, 0x4c, 0x57, 0x5c, 0xea, + 0x3d, 0xbf, 0xbd, 0x35, 0x79, 0xc5, 0xb3, 0x3d, 0xbd, 0xd5, 0xa0, 0x3e, 0x59, 0xc3, 0x33, 0xdb, + 0xb4, 0x61, 0x5a, 0x8d, 0x36, 0x52, 0x4a, 0x2c, 0xd3, 0x59, 0x91, 0x2a, 0x8f, 0x3e, 0x5f, 0x6f, + 0xea, 0x96, 0x45, 0x8d, 0xaa, 0x35, 0xbd, 0xe9, 0x51, 0x7e, 0x19, 0x58, 0xe0, 0x47, 0x82, 0xfc, + 0x1d, 0x3a, 0x47, 0x33, 0xc6, 0xab, 0x8c, 0x40, 0x4b, 0x29, 0xa4, 0xfe, 0x56, 0x31, 0x25, 0x1b, + 0xca, 0x31, 0x52, 0x1f, 0xbf, 0xa7, 0x8b, 0x3b, 0xf4, 0xf4, 0x35, 0x18, 0x10, 0xe1, 0x7d, 0xc5, + 0x05, 0x03, 0x3a, 0xce, 0x3f, 0xe4, 0x20, 0xf9, 0x86, 0x46, 0x50, 0x91, 0x16, 0x5c, 0x5c, 0x61, + 0xdd, 0x94, 0xde, 0x99, 0xa5, 0x7d, 0x74, 0x66, 0x0f, 0x7e, 0xe4, 0x5d, 0x38, 0x8f, 0xd8, 0x94, + 0x6e, 0x1d, 0xc0, 0xaa, 0x30, 0x94, 0x16, 0xaf, 0x2a, 0xbd, 0x73, 0xb3, 0xca, 0x93, 0xcf, 0xc3, + 0x48, 0x30, 0x40, 0x4c, 0xea, 0x8a, 0x9b, 0x8b, 0x1e, 0xe3, 0x8c, 0xc7, 0xa9, 0x63, 0x60, 0x74, + 0x57, 0x8b, 0xc6, 0x3a, 0x8b, 0xf0, 0x52, 0xff, 0x87, 0x5c, 0xaf, 0xac, 0x2c, 0x47, 0x3e, 0x2b, + 0xbf, 0x05, 0x03, 0x06, 0xff, 0x28, 0xa1, 0x53, 0xbd, 0xf3, 0xb6, 0x70, 0x52, 0xcd, 0x2f, 0xa3, + 0xfe, 0xd3, 0x5c, 0xcf, 0x64, 0x30, 0xc7, 0xfd, 0xf3, 0xbe, 0x5e, 0xc8, 0xf8, 0x3c, 0x31, 0x89, + 0x5e, 0x85, 0x09, 0x33, 0x8c, 0x56, 0xdf, 0x08, 0x43, 0x5d, 0x69, 0xe3, 0x12, 0x1c, 0x47, 0xd7, + 0x0d, 0x08, 0x1c, 0xb6, 0x1c, 0xdf, 0x1b, 0xcd, 0x6d, 0x74, 0x1d, 0x93, 0x8f, 0x4b, 0xed, 0x8c, + 0x1b, 0x73, 0x55, 0x73, 0xef, 0x38, 0x26, 0xab, 0x40, 0xf7, 0xd6, 0xa9, 0xa5, 0x37, 0x36, 0x6c, + 0xe7, 0x01, 0x06, 0x43, 0xe5, 0x83, 0x53, 0x1b, 0xe7, 0xf0, 0x7b, 0x3e, 0x98, 0x3c, 0x0b, 0xa3, + 0x6b, 0xad, 0x2e, 0x0d, 0xc2, 0x4f, 0xf2, 0xbb, 0x3e, 0x6d, 0x84, 0x01, 0x83, 0x1b, 0x92, 0x27, + 0x01, 0x90, 0xc8, 0xc3, 0x54, 0x3d, 0x78, 0xb1, 0xa7, 0x0d, 0x31, 0xc8, 0x8a, 0xe8, 0xae, 0x8b, + 0x5c, 0xab, 0xb9, 0x90, 0x1a, 0x2d, 0xdb, 0x5a, 0x6b, 0x78, 0xd4, 0x69, 0x63, 0x43, 0xd1, 0x99, + 0x41, 0x3b, 0x87, 0x14, 0x78, 0x75, 0xe2, 0x2e, 0xd8, 0xd6, 0xda, 0x0a, 0x75, 0xda, 0xac, 0xa9, + 0xcf, 0x03, 0x11, 0x4d, 0x75, 0xf0, 0xd0, 0x83, 0x7f, 0x1c, 0x7a, 0x33, 0x68, 0xe2, 0x23, 0xf8, + 0x69, 0x08, 0x7e, 0xd8, 0x24, 0x0c, 0xf3, 0x18, 0x7c, 0x5c, 0x68, 0xe8, 0xc2, 0xa0, 0x01, 0x07, + 0xa1, 0xbc, 0xce, 0x81, 0xf0, 0xae, 0xe0, 0x1e, 0xe4, 0x9a, 0xf8, 0xa5, 0x7e, 0xb5, 0x90, 0x96, + 0xbf, 0xe6, 0x40, 0x8a, 0x16, 0x4e, 0xab, 0xf9, 0x3d, 0x4d, 0xab, 0xe3, 0x56, 0xb7, 0xdd, 0xd0, + 0x3b, 0x9d, 0xc6, 0x7d, 0xb3, 0x85, 0x4f, 0xb8, 0x70, 0xe1, 0xd3, 0x46, 0xad, 0x6e, 0xbb, 0xdc, + 0xe9, 0xcc, 0x71, 0x20, 0x79, 0x0e, 0x4e, 0x31, 0x3a, 0xec, 0xa4, 0x80, 0xb2, 0x88, 0x94, 0x8c, + 0x01, 0x06, 0xb1, 0xf5, 0x69, 0x2f, 0xc0, 0xa0, 0xe0, 0xc9, 0xd7, 0xaa, 0x7e, 0x6d, 0x80, 0x33, + 0x73, 0x59, 0xcf, 0x05, 0x6c, 0xf8, 0xe4, 0xda, 0xaf, 0x0d, 0xf9, 0xe5, 0x31, 0x54, 0xb3, 0xd5, + 0x6d, 0xf3, 0xe8, 0x5b, 0x03, 0x88, 0x0c, 0x7e, 0x93, 0xcb, 0x30, 0xc6, 0xb8, 0x04, 0x02, 0xe3, + 0xd1, 0x6d, 0xfb, 0xb5, 0x18, 0x94, 0x5c, 0x87, 0x33, 0x11, 0x08, 0xb7, 0x41, 0xf9, 0x93, 0x84, + 0x7e, 0x2d, 0x15, 0xa7, 0x7e, 0xbb, 0x10, 0xcd, 0xaa, 0x73, 0x04, 0x1d, 0x71, 0x1e, 0x06, 0x6c, + 0x67, 0xad, 0xd1, 0x75, 0x5a, 0x62, 0xec, 0x95, 0x6c, 0x67, 0xed, 0x8e, 0xd3, 0x22, 0x67, 0xa1, + 0xc4, 0x7a, 0xc7, 0x34, 0xc4, 0x10, 0xeb, 0xd7, 0x3b, 0x9d, 0xaa, 0x41, 0xca, 0xbc, 0x43, 0x30, + 0x32, 0x6a, 0xa3, 0x89, 0x5b, 0x7b, 0xee, 0x94, 0xd0, 0xcf, 0x57, 0xbc, 0x04, 0x12, 0xfb, 0x09, + 0xe3, 0xa5, 0xf2, 0x83, 0x80, 0x18, 0x0b, 0x03, 0xb7, 0x25, 0x06, 0xef, 0x93, 0x38, 0x0b, 0x81, + 0x0c, 0x59, 0xf0, 0x4d, 0x8c, 0x41, 0x2a, 0x40, 0x42, 0xaa, 0xb6, 0x6d, 0x98, 0xf7, 0x4d, 0xca, + 0x5f, 0x90, 0xf4, 0xf3, 0x8b, 0xdf, 0x24, 0x56, 0x9b, 0xf0, 0x99, 0x2c, 0x0a, 0x08, 0x79, 0x83, + 0x2b, 0x21, 0xa7, 0xc3, 0xb5, 0x8f, 0xf7, 0x2d, 0xb7, 0xd3, 0x62, 0x28, 0xd4, 0x4c, 0x2c, 0x8f, + 0x0b, 0xa1, 0xfa, 0x37, 0x8b, 0xc9, 0xd4, 0x4a, 0x47, 0x62, 0xd7, 0xcc, 0x03, 0x88, 0xcc, 0x69, + 0xe1, 0xe5, 0xda, 0x45, 0x29, 0x4c, 0xba, 0xc0, 0x64, 0xf0, 0x90, 0xca, 0x92, 0xab, 0x30, 0xc8, + 0xbf, 0xa8, 0x5a, 0x11, 0xf6, 0x0e, 0xba, 0x88, 0xb9, 0x1d, 0xf3, 0xfe, 0x7d, 0xf4, 0x27, 0x0b, + 0xd0, 0xe4, 0x32, 0x0c, 0x54, 0x96, 0xea, 0xf5, 0xf2, 0x92, 0x7f, 0x53, 0x8c, 0x6f, 0x59, 0x0c, + 0xcb, 0x6d, 0xb8, 0xba, 0xe5, 0x6a, 0x3e, 0x92, 0x3c, 0x0b, 0xa5, 0x6a, 0x0d, 0xc9, 0xf8, 0x0b, + 0xcd, 0xe1, 0xed, 0xad, 0xc9, 0x01, 0xb3, 0xc3, 0xa9, 0x04, 0x0a, 0xeb, 0xbd, 0x5b, 0xad, 0x48, + 0xee, 0x12, 0xbc, 0xde, 0x87, 0xa6, 0x81, 0xd7, 0xce, 0x5a, 0x80, 0x26, 0x2f, 0xc3, 0x48, 0x9d, + 0x3a, 0xa6, 0xde, 0x5a, 0xea, 0xe2, 0x56, 0x51, 0x8a, 0xf8, 0xe8, 0x22, 0xbc, 0x61, 0x21, 0x42, + 0x8b, 0x90, 0x91, 0x4b, 0x50, 0x9c, 0x37, 0x2d, 0xff, 0xb9, 0x04, 0xfa, 0xd3, 0xaf, 0x9b, 0x96, + 0xa7, 0x21, 0x94, 0x3c, 0x0b, 0x85, 0x5b, 0x2b, 0x55, 0xe1, 0x09, 0x86, 0xbc, 0xde, 0xf3, 0x22, + 0xd1, 0x23, 0x6f, 0xad, 0x54, 0xc9, 0xcb, 0x30, 0xc4, 0x16, 0x31, 0x6a, 0x35, 0xa9, 0xab, 0x0c, + 0xe3, 0xc7, 0xf0, 0x90, 0x85, 0x3e, 0x50, 0xf6, 0xe9, 0x08, 0x28, 0xd5, 0xff, 0x23, 0x9f, 0x9e, + 0xfb, 0xea, 0x08, 0x86, 0xfa, 0x3e, 0x6f, 0x91, 0x63, 0x0a, 0x56, 0x3c, 0x80, 0x82, 0xdd, 0x87, + 0xf1, 0xb2, 0xd1, 0x36, 0xad, 0x32, 0xfe, 0x74, 0x17, 0xe7, 0xca, 0x38, 0x75, 0x48, 0x4f, 0x01, + 0x63, 0x68, 0xf1, 0x3d, 0x3c, 0x2e, 0x31, 0x43, 0x35, 0x74, 0x8e, 0x6b, 0xb4, 0xef, 0xeb, 0x8d, + 0x26, 0x4f, 0x1b, 0xa5, 0xc5, 0x99, 0xaa, 0x3f, 0x95, 0xdf, 0x21, 0x5d, 0xd7, 0xe3, 0x28, 0x7d, + 0xf5, 0x1b, 0xf9, 0xde, 0x19, 0xd3, 0x1e, 0x4b, 0xa1, 0xfc, 0x49, 0x3e, 0x25, 0x7f, 0xd9, 0x81, + 0x24, 0x71, 0x15, 0x06, 0x39, 0x9b, 0xc0, 0x8d, 0x17, 0x67, 0x33, 0xae, 0xac, 0x38, 0x8b, 0xfa, + 0x68, 0xb2, 0x04, 0x67, 0xca, 0xf7, 0xef, 0xd3, 0xa6, 0x17, 0x46, 0xa8, 0x5e, 0x0a, 0x03, 0xbe, + 0xf2, 0x88, 0xbc, 0x02, 0x1f, 0x46, 0xb8, 0xc6, 0xc0, 0x26, 0xa9, 0xe5, 0xc8, 0x0a, 0x9c, 0x8b, + 0xc3, 0xeb, 0x7c, 0x0b, 0x50, 0x94, 0x82, 0xf4, 0x26, 0x38, 0xf2, 0xff, 0xb4, 0x8c, 0xb2, 0x69, + 0xad, 0xc4, 0xa9, 0xba, 0xbf, 0x57, 0x2b, 0x71, 0xde, 0x4e, 0x2d, 0xa7, 0x7e, 0xa7, 0x20, 0xa7, + 0x79, 0x7b, 0x7c, 0x1d, 0xae, 0x6e, 0x44, 0xdc, 0xac, 0x77, 0x3b, 0x64, 0x5e, 0x16, 0xd1, 0x4a, + 0x8c, 0xae, 0xe3, 0x7b, 0x24, 0x06, 0xd1, 0x12, 0x10, 0x28, 0xaf, 0x43, 0x01, 0x25, 0xa9, 0x42, + 0xb1, 0xec, 0xac, 0x71, 0xf3, 0x76, 0xa7, 0x07, 0x5c, 0xba, 0xb3, 0xe6, 0xa6, 0x3f, 0xe0, 0x62, + 0x2c, 0xd4, 0xbf, 0x98, 0xef, 0x91, 0x99, 0xed, 0xb1, 0x9c, 0x44, 0xfe, 0x72, 0x3e, 0x2b, 0xc7, + 0xda, 0x71, 0x75, 0x1d, 0xfb, 0x80, 0x85, 0x73, 0xbc, 0xfd, 0xea, 0x0e, 0x51, 0x38, 0x7f, 0x94, + 0xcf, 0x4a, 0x18, 0x77, 0x22, 0x9c, 0xfd, 0x4d, 0x90, 0xa9, 0x22, 0x7d, 0x8c, 0x6d, 0x6e, 0x59, + 0x15, 0xfa, 0xf7, 0xe9, 0x3e, 0x95, 0x26, 0xd2, 0x93, 0x21, 0x7c, 0x20, 0x2d, 0xfd, 0x87, 0xf9, + 0xcc, 0xc4, 0x88, 0x27, 0x32, 0x3d, 0x4c, 0x99, 0x9e, 0x0c, 0xfd, 0x03, 0x0d, 0xfd, 0x54, 0x99, + 0x9e, 0x8c, 0xfd, 0x03, 0xe9, 0xe9, 0x1f, 0xe6, 0xd3, 0x53, 0x7f, 0x1e, 0x81, 0x92, 0x1e, 0x86, + 0x87, 0xa3, 0xdf, 0x0d, 0xc5, 0x03, 0x75, 0x43, 0xff, 0x01, 0xac, 0xa8, 0xa4, 0x40, 0x8f, 0x6c, + 0xd4, 0x7f, 0x54, 0x05, 0x7a, 0x08, 0x43, 0xfe, 0x71, 0x16, 0xe8, 0x4f, 0x14, 0x92, 0xe9, 0x6e, + 0x1f, 0xd7, 0x35, 0xc9, 0xd9, 0xe7, 0x9a, 0xe4, 0x97, 0x23, 0x6f, 0xc3, 0x78, 0x28, 0x4b, 0x39, + 0xca, 0x18, 0x5e, 0x1f, 0x35, 0x19, 0xaa, 0xf1, 0x1e, 0xc3, 0x89, 0x70, 0x38, 0x71, 0x6a, 0xf5, + 0xfb, 0x85, 0x64, 0xce, 0xe0, 0x93, 0xde, 0xd8, 0x67, 0x6f, 0xdc, 0x81, 0x73, 0x33, 0x5d, 0xc7, + 0xa1, 0x96, 0x97, 0xde, 0x29, 0x78, 0x78, 0xdf, 0xe4, 0x14, 0x8d, 0x64, 0xe7, 0x64, 0x14, 0x66, + 0x6c, 0xc5, 0xeb, 0x86, 0x38, 0xdb, 0x81, 0x90, 0x6d, 0x97, 0x53, 0xa4, 0xb1, 0x4d, 0x2f, 0xac, + 0xfe, 0x7e, 0x3e, 0x99, 0xe5, 0xf9, 0xa4, 0xeb, 0xf7, 0xd7, 0xf5, 0xea, 0x57, 0x0b, 0xf1, 0x4c, + 0xd7, 0x27, 0x0b, 0xc4, 0xfe, 0xbb, 0xc3, 0x97, 0x24, 0x8e, 0x1b, 0xe9, 0x2b, 0x7c, 0x78, 0xd6, + 0x57, 0xf8, 0x78, 0xf5, 0x97, 0x8b, 0xf1, 0xac, 0xe1, 0x27, 0xdd, 0x71, 0x74, 0xdd, 0x41, 0x96, + 0xe1, 0x8c, 0x98, 0xdb, 0x7c, 0x10, 0xa6, 0x9b, 0x10, 0xf3, 0x17, 0xcf, 0x5a, 0x27, 0xa6, 0xc5, + 0xae, 0x4b, 0x9d, 0x86, 0xa7, 0xbb, 0x0f, 0x1a, 0x98, 0x9f, 0x42, 0x4b, 0x2d, 0xc8, 0x18, 0x8a, + 0x59, 0x2d, 0xca, 0x70, 0x30, 0x64, 0xe8, 0x4f, 0x88, 0x09, 0x86, 0x69, 0x05, 0xd5, 0x5f, 0xcf, + 0xc1, 0x44, 0xfc, 0x73, 0xc8, 0x14, 0x0c, 0xb2, 0xdf, 0xc1, 0xb3, 0x7b, 0x29, 0x9d, 0x36, 0xe7, + 0xc8, 0xaf, 0xe4, 0x7d, 0x1a, 0xf2, 0x0a, 0x0c, 0xa1, 0xf7, 0x03, 0x16, 0xc8, 0x87, 0xd1, 0x0e, + 0xc2, 0x02, 0x98, 0xe3, 0x95, 0x17, 0x0b, 0x49, 0xc9, 0x1b, 0x30, 0x5c, 0x0d, 0xdd, 0xbc, 0xc4, + 0x9d, 0x17, 0x7a, 0x97, 0x4a, 0x25, 0x43, 0x02, 0x4d, 0xa6, 0x56, 0xbf, 0x9b, 0x8f, 0x67, 0xb7, + 0x3f, 0x51, 0xf5, 0x7d, 0x9a, 0xa6, 0xbf, 0x52, 0x88, 0xe5, 0xea, 0x3f, 0xd9, 0xd7, 0xef, 0xf3, + 0x6a, 0x6e, 0x12, 0xfa, 0x67, 0xdb, 0xba, 0xd9, 0x12, 0x86, 0x0f, 0xc6, 0x64, 0xa5, 0x0c, 0xa0, + 0x71, 0x38, 0xb9, 0x89, 0x91, 0x48, 0x98, 0xa4, 0x03, 0x5f, 0x97, 0xb1, 0x30, 0x7c, 0xa5, 0x84, + 0x12, 0x09, 0x5c, 0x39, 0x80, 0x8f, 0x1c, 0xb9, 0xa4, 0xdc, 0x67, 0x27, 0x67, 0x31, 0xc7, 0xa3, + 0xcf, 0x9e, 0x5b, 0xe4, 0x4b, 0xca, 0x6d, 0xd3, 0x32, 0xc8, 0x05, 0x38, 0x7b, 0xa7, 0x3e, 0xab, + 0x35, 0x6e, 0x57, 0x97, 0x2a, 0x8d, 0x3b, 0x4b, 0xf5, 0xda, 0xec, 0x4c, 0x75, 0xae, 0x3a, 0x5b, + 0x99, 0xe8, 0x23, 0xa7, 0x61, 0x3c, 0x44, 0xcd, 0xdf, 0x59, 0x2c, 0x2f, 0x4d, 0xe4, 0xc8, 0x29, + 0x18, 0x0d, 0x81, 0xd3, 0xcb, 0x2b, 0x13, 0xf9, 0xe7, 0x3e, 0x01, 0xc3, 0xe8, 0x46, 0xca, 0xdd, + 0x5e, 0xc8, 0x08, 0x0c, 0x2e, 0x4f, 0xd7, 0x67, 0xb5, 0xbb, 0xc8, 0x04, 0xa0, 0x54, 0x99, 0x5d, + 0x62, 0x0c, 0x73, 0xcf, 0xfd, 0xdf, 0x39, 0x80, 0xfa, 0xdc, 0x4a, 0x4d, 0x10, 0x0e, 0xc3, 0x40, + 0x75, 0xe9, 0x6e, 0x79, 0xa1, 0xca, 0xe8, 0x06, 0xa1, 0xb8, 0x5c, 0x9b, 0x65, 0x35, 0x0c, 0x41, + 0xff, 0xcc, 0xc2, 0x72, 0x7d, 0x76, 0x22, 0xcf, 0x80, 0xda, 0x6c, 0xb9, 0x32, 0x51, 0x60, 0xc0, + 0x7b, 0x5a, 0x75, 0x65, 0x76, 0xa2, 0xc8, 0xfe, 0x5c, 0xa8, 0xaf, 0x94, 0x57, 0x26, 0xfa, 0xd9, + 0x9f, 0x73, 0xf8, 0x67, 0x89, 0x31, 0xab, 0xcf, 0xae, 0xe0, 0x8f, 0x01, 0xd6, 0x84, 0x39, 0xff, + 0xd7, 0x20, 0x43, 0x31, 0xd6, 0x95, 0xaa, 0x36, 0x31, 0xc4, 0x7e, 0x30, 0x96, 0xec, 0x07, 0xb0, + 0xc6, 0x69, 0xb3, 0x8b, 0xcb, 0x77, 0x67, 0x27, 0x86, 0x19, 0xaf, 0xc5, 0xdb, 0x0c, 0x3c, 0xc2, + 0xfe, 0xd4, 0x16, 0xd9, 0x9f, 0xa3, 0x8c, 0x93, 0x36, 0x5b, 0x5e, 0xa8, 0x95, 0x57, 0xe6, 0x27, + 0xc6, 0x58, 0x7b, 0x90, 0xe7, 0x38, 0x2f, 0xb9, 0x54, 0x5e, 0x9c, 0x9d, 0x98, 0x10, 0x34, 0x95, + 0x85, 0xea, 0xd2, 0xed, 0x89, 0x53, 0xd8, 0x90, 0x77, 0x17, 0xf1, 0x07, 0x61, 0x05, 0xf0, 0xaf, + 0xd3, 0xcf, 0xfd, 0x00, 0x94, 0x96, 0xeb, 0xb8, 0xda, 0x9c, 0x87, 0xd3, 0xcb, 0xf5, 0xc6, 0xca, + 0xbb, 0xb5, 0xd9, 0x98, 0xbc, 0x4f, 0xc1, 0xa8, 0x8f, 0x58, 0xa8, 0x2e, 0xdd, 0xf9, 0x1c, 0x97, + 0xb6, 0x0f, 0x5a, 0x2c, 0xcf, 0x2c, 0xd7, 0x27, 0xf2, 0xac, 0x57, 0x7c, 0xd0, 0xbd, 0xea, 0x52, + 0x65, 0xf9, 0x5e, 0x7d, 0xa2, 0xf0, 0xdc, 0x43, 0x18, 0xe1, 0xf9, 0x70, 0x97, 0x1d, 0x73, 0xcd, + 0xb4, 0xc8, 0x93, 0x70, 0xa1, 0x32, 0x7b, 0xb7, 0x3a, 0x33, 0xdb, 0x58, 0xd6, 0xaa, 0x37, 0xab, + 0x4b, 0xb1, 0x9a, 0xce, 0xc2, 0xa9, 0x28, 0xba, 0x5c, 0xab, 0x4e, 0xe4, 0xc8, 0x39, 0x20, 0x51, + 0xf0, 0xad, 0xf2, 0xe2, 0xdc, 0x44, 0x9e, 0x28, 0x70, 0x26, 0x0a, 0xaf, 0x2e, 0xad, 0xdc, 0x59, + 0x9a, 0x9d, 0x28, 0x3c, 0xf7, 0x37, 0x72, 0x70, 0x36, 0x35, 0x66, 0x3a, 0x51, 0xe1, 0xa9, 0xd9, + 0x85, 0x72, 0x7d, 0xa5, 0x3a, 0x53, 0x9f, 0x2d, 0x6b, 0x33, 0xf3, 0x8d, 0x99, 0xf2, 0xca, 0xec, + 0xcd, 0x65, 0xed, 0xdd, 0xc6, 0xcd, 0xd9, 0xa5, 0x59, 0xad, 0xbc, 0x30, 0xd1, 0x47, 0x9e, 0x85, + 0xc9, 0x0c, 0x9a, 0xfa, 0xec, 0xcc, 0x1d, 0xad, 0xba, 0xf2, 0xee, 0x44, 0x8e, 0x3c, 0x03, 0x4f, + 0x66, 0x12, 0xb1, 0xdf, 0x13, 0x79, 0xf2, 0x14, 0x5c, 0xcc, 0x22, 0x79, 0x67, 0x61, 0xa2, 0xf0, + 0xdc, 0xcf, 0xe5, 0x80, 0x24, 0x83, 0x5e, 0x93, 0xa7, 0xe1, 0x12, 0xd3, 0x8b, 0x46, 0x76, 0x03, + 0x9f, 0x81, 0x27, 0x53, 0x29, 0xa4, 0xe6, 0x4d, 0xc2, 0x13, 0x19, 0x24, 0xa2, 0x71, 0x97, 0x40, + 0x49, 0x27, 0xc0, 0xa6, 0xfd, 0x5a, 0x0e, 0xce, 0xa6, 0x7a, 0x9a, 0x91, 0x2b, 0xf0, 0xb1, 0x72, + 0x65, 0x91, 0xf5, 0xcd, 0xcc, 0x4a, 0x75, 0x79, 0xa9, 0xde, 0x58, 0x9c, 0x2b, 0x37, 0x98, 0xf6, + 0xdd, 0xa9, 0xc7, 0x7a, 0xf3, 0x32, 0xa8, 0x3d, 0x28, 0x67, 0xe6, 0xcb, 0x4b, 0x37, 0xd9, 0xf0, + 0x23, 0x1f, 0x83, 0xa7, 0x33, 0xe9, 0x66, 0x97, 0xca, 0xd3, 0x0b, 0xb3, 0x95, 0x89, 0x3c, 0xf9, + 0x38, 0x3c, 0x93, 0x49, 0x55, 0xa9, 0xd6, 0x39, 0x59, 0xe1, 0x39, 0x3d, 0x32, 0x19, 0xb1, 0xaf, + 0x9c, 0x59, 0x5e, 0x5a, 0x29, 0xcf, 0xac, 0xa4, 0x69, 0xf6, 0x05, 0x38, 0x1b, 0xc1, 0x4e, 0xdf, + 0xa9, 0x57, 0x97, 0x66, 0xeb, 0xf5, 0x89, 0x5c, 0x02, 0x15, 0x88, 0x36, 0x3f, 0x5d, 0xf9, 0xee, + 0xff, 0xf4, 0x54, 0xdf, 0x77, 0xff, 0xf8, 0xa9, 0xdc, 0x1f, 0xfd, 0xf1, 0x53, 0xb9, 0x7f, 0xf6, + 0xc7, 0x4f, 0xe5, 0x3e, 0x7f, 0x7d, 0x2f, 0xf1, 0xd2, 0xf9, 0xbc, 0xb8, 0x5a, 0x42, 0xc7, 0x92, + 0x97, 0xfe, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x14, 0xa0, 0x6d, 0x05, 0xa5, 0x86, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -22434,6 +22617,11 @@ func (m *AppMetadata) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.AppTargetPort != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.AppTargetPort)) + i-- + dAtA[i] = 0x28 + } if len(m.AppName) > 0 { i -= len(m.AppName) copy(dAtA[i:], m.AppName) @@ -31258,6 +31446,52 @@ func (m *OneOf_SFTPSummary) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } +func (m *OneOf_ContactCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_ContactCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ContactCreate != nil { + { + size, err := m.ContactCreate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xc + i-- + dAtA[i] = 0x82 + } + return len(dAtA) - i, nil +} +func (m *OneOf_ContactDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_ContactDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.ContactDelete != nil { + { + size, err := m.ContactDelete.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xc + i-- + dAtA[i] = 0x8a + } + return len(dAtA) - i, nil +} func (m *StreamStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -31282,12 +31516,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n656, err656 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err656 != nil { - return 0, err656 + n658, err658 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err658 != nil { + return 0, err658 } - i -= n656 - i = encodeVarintEvents(dAtA, i, uint64(n656)) + i -= n658 + i = encodeVarintEvents(dAtA, i, uint64(n658)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -31446,12 +31680,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n660, err660 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err660 != nil { - return 0, err660 + n662, err662 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err662 != nil { + return 0, err662 } - i -= n660 - i = encodeVarintEvents(dAtA, i, uint64(n660)) + i -= n662 + i = encodeVarintEvents(dAtA, i, uint64(n662)) i-- dAtA[i] = 0x1 i-- @@ -31599,12 +31833,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n664, err664 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err664 != nil { - return 0, err664 + n666, err666 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err666 != nil { + return 0, err666 } - i -= n664 - i = encodeVarintEvents(dAtA, i, uint64(n664)) + i -= n666 + i = encodeVarintEvents(dAtA, i, uint64(n666)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -31693,6 +31927,11 @@ func (m *RouteToApp) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.TargetPort != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.TargetPort)) + i-- + dAtA[i] = 0x48 + } if len(m.URI) > 0 { i -= len(m.URI) copy(dAtA[i:], m.URI) @@ -38227,6 +38466,184 @@ func (m *UserTaskDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ContactCreate) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContactCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContactCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.ContactType != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.ContactType)) + i-- + dAtA[i] = 0x38 + } + if len(m.Email) > 0 { + i -= len(m.Email) + copy(dAtA[i:], m.Email) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Email))) + i-- + dAtA[i] = 0x32 + } + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *ContactDelete) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContactDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContactDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.ContactType != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.ContactType)) + i-- + dAtA[i] = 0x38 + } + if len(m.Email) > 0 { + i -= len(m.Email) + copy(dAtA[i:], m.Email) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Email))) + i-- + dAtA[i] = 0x32 + } + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { offset -= sovEvents(v) base := offset @@ -40554,6 +40971,9 @@ func (m *AppMetadata) Size() (n int) { if l > 0 { n += 1 + l + sovEvents(uint64(l)) } + if m.AppTargetPort != 0 { + n += 1 + sovEvents(uint64(m.AppTargetPort)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -44378,6 +44798,30 @@ func (m *OneOf_SFTPSummary) Size() (n int) { } return n } +func (m *OneOf_ContactCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ContactCreate != nil { + l = m.ContactCreate.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_ContactDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ContactDelete != nil { + l = m.ContactDelete.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *StreamStatus) Size() (n int) { if m == nil { return 0 @@ -44602,6 +45046,9 @@ func (m *RouteToApp) Size() (n int) { if l > 0 { n += 1 + l + sovEvents(uint64(l)) } + if m.TargetPort != 0 { + n += 1 + sovEvents(uint64(m.TargetPort)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -46861,6 +47308,64 @@ func (m *UserTaskDelete) Size() (n int) { return n } +func (m *ContactCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) + l = len(m.Email) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.ContactType != 0 { + n += 1 + sovEvents(uint64(m.ContactType)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ContactDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) + l = len(m.Email) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.ContactType != 0 { + n += 1 + sovEvents(uint64(m.ContactType)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovEvents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -65645,6 +66150,25 @@ func (m *AppMetadata) Unmarshal(dAtA []byte) error { } m.AppName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AppTargetPort", wireType) + } + m.AppTargetPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AppTargetPort |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -85559,62 +86083,11 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { } m.Event = &OneOf_SFTPSummary{v} iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StreamStatus) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: StreamStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StreamStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 192: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UploadID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContactCreate", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85624,46 +86097,30 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.UploadID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastEventIndex", wireType) - } - m.LastEventIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastEventIndex |= int64(b&0x7F) << shift - if b < 0x80 { - break - } + v := &ContactCreate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - case 3: + m.Event = &OneOf_ContactCreate{v} + iNdEx = postIndex + case 193: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastUploadTime", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContactDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -85690,9 +86147,11 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastUploadTime, dAtA[iNdEx:postIndex]); err != nil { + v := &ContactDelete{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Event = &OneOf_ContactDelete{v} iNdEx = postIndex default: iNdEx = preIndex @@ -85716,7 +86175,7 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { } return nil } -func (m *SessionUpload) Unmarshal(dAtA []byte) error { +func (m *StreamStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -85739,17 +86198,17 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SessionUpload: wiretype end group for non-group") + return fmt.Errorf("proto: StreamStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SessionUpload: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StreamStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UploadID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85759,30 +86218,29 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.UploadID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LastEventIndex", wireType) } - var msglen int + m.LastEventIndex = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85792,30 +86250,16 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.LastEventIndex |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionURL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field LastUploadTime", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85825,23 +86269,24 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.SessionURL = string(dAtA[iNdEx:postIndex]) + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastUploadTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -85865,7 +86310,7 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } return nil } -func (m *Identity) Unmarshal(dAtA []byte) error { +func (m *SessionUpload) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -85888,17 +86333,17 @@ func (m *Identity) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Identity: wiretype end group for non-group") + return fmt.Errorf("proto: SessionUpload: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Identity: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SessionUpload: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85908,29 +86353,30 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.User = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Impersonator", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85940,27 +86386,28 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Impersonator = string(dAtA[iNdEx:postIndex]) + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionURL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -85988,11 +86435,62 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + m.SessionURL = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Identity) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Identity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Identity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86020,11 +86518,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Usage = append(m.Usage, string(dAtA[iNdEx:postIndex])) + m.User = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Impersonator", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86052,11 +86550,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) + m.Impersonator = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesGroups", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86084,11 +86582,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesGroups = append(m.KubernetesGroups, string(dAtA[iNdEx:postIndex])) + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 7: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesUsers", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86116,13 +86614,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesUsers = append(m.KubernetesUsers, string(dAtA[iNdEx:postIndex])) + m.Usage = append(m.Usage, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 8: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Expires", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86132,28 +86630,27 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expires, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 9: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesGroups", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86181,11 +86678,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.RouteToCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesGroups = append(m.KubernetesGroups, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 10: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesUsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86213,11 +86710,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesUsers = append(m.KubernetesUsers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 11: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Expires", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -86244,15 +86741,15 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Traits.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expires, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 12: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToApp", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RouteToCluster", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86262,31 +86759,27 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if m.RouteToApp == nil { - m.RouteToApp = &RouteToApp{} - } - if err := m.RouteToApp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.RouteToCluster = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 13: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TeleportCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesCluster", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86314,11 +86807,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.TeleportCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesCluster = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 14: + case 11: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToDatabase", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -86345,18 +86838,15 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.RouteToDatabase == nil { - m.RouteToDatabase = &RouteToDatabase{} - } - if err := m.RouteToDatabase.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Traits.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 15: + case 12: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseNames", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RouteToApp", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86366,27 +86856,31 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.DatabaseNames = append(m.DatabaseNames, string(dAtA[iNdEx:postIndex])) + if m.RouteToApp == nil { + m.RouteToApp = &RouteToApp{} + } + if err := m.RouteToApp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 16: + case 13: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseUsers", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TeleportCluster", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86414,13 +86908,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DatabaseUsers = append(m.DatabaseUsers, string(dAtA[iNdEx:postIndex])) + m.TeleportCluster = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 17: + case 14: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MFADeviceUUID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RouteToDatabase", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86430,27 +86924,31 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.MFADeviceUUID = string(dAtA[iNdEx:postIndex]) + if m.RouteToDatabase == nil { + m.RouteToDatabase = &RouteToDatabase{} + } + if err := m.RouteToDatabase.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 18: + case 15: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientIP", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseNames", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86478,11 +86976,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientIP = string(dAtA[iNdEx:postIndex]) + m.DatabaseNames = append(m.DatabaseNames, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 19: + case 16: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AWSRoleARNs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseUsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86510,11 +87008,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AWSRoleARNs = append(m.AWSRoleARNs, string(dAtA[iNdEx:postIndex])) + m.DatabaseUsers = append(m.DatabaseUsers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 20: + case 17: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessRequests", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MFADeviceUUID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86542,67 +87040,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AccessRequests = append(m.AccessRequests, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 21: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DisallowReissue", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.DisallowReissue = bool(v != 0) - case 22: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowedResourceIDs", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AllowedResourceIDs = append(m.AllowedResourceIDs, ResourceID{}) - if err := m.AllowedResourceIDs[len(m.AllowedResourceIDs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.MFADeviceUUID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 23: + case 18: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PreviousIdentityExpires", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClientIP", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86612,28 +87056,27 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.PreviousIdentityExpires, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClientIP = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 24: + case 19: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AzureIdentities", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AWSRoleARNs", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86661,11 +87104,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AzureIdentities = append(m.AzureIdentities, string(dAtA[iNdEx:postIndex])) + m.AWSRoleARNs = append(m.AWSRoleARNs, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 25: + case 20: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GCPServiceAccounts", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AccessRequests", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86693,13 +87136,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.GCPServiceAccounts = append(m.GCPServiceAccounts, string(dAtA[iNdEx:postIndex])) + m.AccessRequests = append(m.AccessRequests, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 26: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PrivateKeyPolicy", wireType) + case 21: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DisallowReissue", wireType) } - var stringLen uint64 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86709,29 +87152,17 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PrivateKeyPolicy = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 27: + m.DisallowReissue = bool(v != 0) + case 22: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BotName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AllowedResourceIDs", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86741,27 +87172,29 @@ func (m *Identity) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.BotName = string(dAtA[iNdEx:postIndex]) + m.AllowedResourceIDs = append(m.AllowedResourceIDs, ResourceID{}) + if err := m.AllowedResourceIDs[len(m.AllowedResourceIDs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 28: + case 23: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeviceExtensions", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PreviousIdentityExpires", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -86788,16 +87221,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.DeviceExtensions == nil { - m.DeviceExtensions = &DeviceExtensions{} - } - if err := m.DeviceExtensions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.PreviousIdentityExpires, dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 29: + case 24: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BotInstanceID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AzureIdentities", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86825,62 +87255,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.BotInstanceID = string(dAtA[iNdEx:postIndex]) + m.AzureIdentities = append(m.AzureIdentities, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RouteToApp) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RouteToApp: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RouteToApp: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 25: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GCPServiceAccounts", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86908,11 +87287,11 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.GCPServiceAccounts = append(m.GCPServiceAccounts, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 2: + case 26: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PrivateKeyPolicy", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86940,11 +87319,11 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SessionID = string(dAtA[iNdEx:postIndex]) + m.PrivateKeyPolicy = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 27: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PublicAddr", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BotName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -86972,13 +87351,13 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.PublicAddr = string(dAtA[iNdEx:postIndex]) + m.BotName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 28: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClusterName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DeviceExtensions", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -86988,27 +87367,31 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClusterName = string(dAtA[iNdEx:postIndex]) + if m.DeviceExtensions == nil { + m.DeviceExtensions = &DeviceExtensions{} + } + if err := m.DeviceExtensions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 5: + case 29: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AWSRoleARN", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BotInstanceID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -87036,11 +87419,62 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AWSRoleARN = string(dAtA[iNdEx:postIndex]) + m.BotInstanceID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RouteToApp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RouteToApp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RouteToApp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AzureIdentity", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -87068,11 +87502,11 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AzureIdentity = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GCPServiceAccount", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -87100,11 +87534,11 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.GCPServiceAccount = string(dAtA[iNdEx:postIndex]) + m.SessionID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 8: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field URI", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PublicAddr", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -87132,62 +87566,11 @@ func (m *RouteToApp) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.URI = string(dAtA[iNdEx:postIndex]) + m.PublicAddr = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RouteToDatabase) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: RouteToDatabase: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RouteToDatabase: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ServiceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClusterName", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -87215,11 +87598,11 @@ func (m *RouteToDatabase) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ServiceName = string(dAtA[iNdEx:postIndex]) + m.ClusterName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AWSRoleARN", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -87247,11 +87630,11 @@ func (m *RouteToDatabase) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Protocol = string(dAtA[iNdEx:postIndex]) + m.AWSRoleARN = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AzureIdentity", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -87279,11 +87662,11 @@ func (m *RouteToDatabase) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Username = string(dAtA[iNdEx:postIndex]) + m.AzureIdentity = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Database", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GCPServiceAccount", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -87311,11 +87694,241 @@ func (m *RouteToDatabase) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Database = string(dAtA[iNdEx:postIndex]) + m.GCPServiceAccount = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field URI", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.URI = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TargetPort", wireType) + } + m.TargetPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TargetPort |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *RouteToDatabase) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RouteToDatabase: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RouteToDatabase: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServiceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServiceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Protocol", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Protocol = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Username = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Database", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Database = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -101524,7 +102137,503 @@ func (m *SessionRecordingConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { +func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: AccessPathChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessPathChanged: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ChangeID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ChangeID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AffectedResourceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceSource", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AffectedResourceSource = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceType", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AffectedResourceType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SpannerRPC) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SpannerRPC: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SpannerRPC: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DatabaseMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Procedure", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Procedure = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Args == nil { + m.Args = &Struct{} + } + if err := m.Args.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101547,10 +102656,10 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessPathChanged: wiretype end group for non-group") + return fmt.Errorf("proto: AccessGraphSettingsUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessPathChanged: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AccessGraphSettingsUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101588,9 +102697,9 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChangeID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101600,29 +102709,30 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.ChangeID = string(dAtA[iNdEx:postIndex]) + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101632,29 +102742,30 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.AffectedResourceName = string(dAtA[iNdEx:postIndex]) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceSource", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101664,55 +102775,24 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.AffectedResourceSource = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.AffectedResourceType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -101736,7 +102816,7 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } return nil } -func (m *SpannerRPC) Unmarshal(dAtA []byte) error { +func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101759,10 +102839,10 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SpannerRPC: wiretype end group for non-group") + return fmt.Errorf("proto: SPIFFEFederationCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SpannerRPC: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SPIFFEFederationCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101800,7 +102880,7 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101827,13 +102907,13 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101860,13 +102940,13 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101893,13 +102973,64 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.DatabaseMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SPIFFEFederationDelete: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SPIFFEFederationDelete: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101926,15 +103057,15 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Procedure", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101944,27 +103075,28 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Procedure = string(dAtA[iNdEx:postIndex]) + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 7: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101991,10 +103123,40 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Args == nil { - m.Args = &Struct{} + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if err := m.Args.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -102020,7 +103182,7 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102043,10 +103205,10 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessGraphSettingsUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessGraphSettingsUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102084,7 +103246,7 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102111,7 +103273,7 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -102181,6 +103343,39 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -102203,7 +103398,7 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102226,10 +103421,10 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SPIFFEFederationCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SPIFFEFederationCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102267,7 +103462,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102294,7 +103489,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -102364,91 +103559,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SPIFFEFederationDelete: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SPIFFEFederationDelete: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } @@ -102481,72 +103592,6 @@ func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -102569,7 +103614,7 @@ func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102592,10 +103637,10 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102785,7 +103830,7 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102808,10 +103853,10 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102849,7 +103894,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102876,7 +103921,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -102948,7 +103993,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102975,7 +104020,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103001,7 +104046,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103024,10 +104069,10 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigDelete: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103065,7 +104110,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103092,7 +104137,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103164,7 +104209,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103191,7 +104236,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103217,7 +104262,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103240,10 +104285,10 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103433,7 +104478,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103456,10 +104501,10 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103530,7 +104575,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103557,13 +104602,13 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103590,13 +104635,13 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103623,7 +104668,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103649,7 +104694,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103672,10 +104717,10 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionDelete: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103712,6 +104757,39 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } @@ -103744,7 +104822,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } @@ -103777,7 +104855,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } @@ -103810,39 +104888,6 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -103865,7 +104910,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103888,10 +104933,10 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserCreate: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104081,7 +105126,7 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { +func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104104,10 +105149,10 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104178,7 +105223,7 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104205,13 +105250,13 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104238,13 +105283,13 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104271,10 +105316,42 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -104297,7 +105374,7 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { +func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104320,10 +105397,10 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserDelete: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104394,7 +105471,7 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104421,13 +105498,13 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104454,13 +105531,13 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104487,10 +105564,74 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentCrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdatedCrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UpdatedCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -104513,7 +105654,7 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { +func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104536,10 +105677,10 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelCreate: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104707,38 +105848,6 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelQuery", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CrownJewelQuery = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -104761,7 +105870,7 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { +func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104784,10 +105893,10 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTaskCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104858,7 +105967,7 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104885,46 +105994,13 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104951,15 +106027,15 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentCrownJewelQuery", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -104969,29 +106045,30 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.CurrentCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 7: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedCrownJewelQuery", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105001,23 +106078,24 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.UpdatedCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -105041,7 +106119,7 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { +func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105064,10 +106142,10 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelDelete: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTaskUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105138,7 +106216,7 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105165,13 +106243,13 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105198,13 +106276,13 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105231,64 +106309,13 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: UserTaskCreate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskCreate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105315,15 +106342,15 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CurrentUserTaskState", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105333,30 +106360,29 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.CurrentUserTaskState = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UpdatedUserTaskState", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105366,30 +106392,80 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.UpdatedUserTaskState = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { return err } - iNdEx = postIndex - case 4: + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: UserTaskMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UserTaskMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TaskType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105399,30 +106475,29 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.TaskType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IssueType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105432,30 +106507,29 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.IssueType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Integration", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105465,24 +106539,23 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Integration = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -105506,7 +106579,7 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { +func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105529,10 +106602,10 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTaskUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: UserTaskDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105630,13 +106703,46 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105663,13 +106769,64 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ContactCreate) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ContactCreate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ContactCreate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105696,13 +106853,13 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105729,15 +106886,15 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 7: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentUserTaskState", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105747,29 +106904,30 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.CurrentUserTaskState = string(dAtA[iNdEx:postIndex]) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 8: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedUserTaskState", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105779,80 +106937,30 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.UpdatedUserTaskState = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: UserTaskMetadata: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskMetadata: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105862,27 +106970,28 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.TaskType = string(dAtA[iNdEx:postIndex]) + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 2: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IssueType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -105910,13 +107019,13 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.IssueType = string(dAtA[iNdEx:postIndex]) + m.Email = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Integration", wireType) + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContactType", wireType) } - var stringLen uint64 + m.ContactType = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105926,24 +107035,11 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.ContactType |= ContactType(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Integration = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -105966,7 +107062,7 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { +func (m *ContactDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105989,10 +107085,10 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTaskDelete: wiretype end group for non-group") + return fmt.Errorf("proto: ContactDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContactDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -106030,7 +107126,7 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106057,13 +107153,13 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106090,13 +107186,13 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106123,13 +107219,13 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -106156,10 +107252,61 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Email", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Email = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ContactType", wireType) + } + m.ContactType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ContactType |= ContactType(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index 6e856b3c5f2b2..f111605ce20be 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -790,6 +790,14 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_AutoUpdateVersionDelete{ AutoUpdateVersionDelete: e, } + case *ContactCreate: + out.Event = &OneOf_ContactCreate{ + ContactCreate: e, + } + case *ContactDelete: + out.Event = &OneOf_ContactDelete{ + ContactDelete: e, + } default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", in.GetType()) unknown := &Unknown{} diff --git a/api/types/kubernetes_test.go b/api/types/kubernetes_test.go index 5d3a81210bef7..1763da9e114f5 100644 --- a/api/types/kubernetes_test.go +++ b/api/types/kubernetes_test.go @@ -30,7 +30,7 @@ func TestKubeClustersSorter(t *testing.T) { servers := make([]KubeCluster, len(testVals)) for i := 0; i < len(testVals); i++ { var err error - servers[i], err = NewKubernetesClusterV3FromLegacyCluster("_", &KubernetesCluster{ + servers[i], err = NewKubernetesClusterV3FromLegacyCluster("", &KubernetesCluster{ Name: testVals[i], }) require.NoError(t, err) diff --git a/api/types/namespace.go b/api/types/namespace.go index 41e4b3e4fe7c0..a6fbd02de22b3 100644 --- a/api/types/namespace.go +++ b/api/types/namespace.go @@ -143,3 +143,17 @@ func IsValidNamespace(s string) bool { } var validNamespace = regexp.MustCompile(`^[A-Za-z0-9]+$`) + +// ValidateNamespaceDefault ensures that the namespace is the "default" +// namespace. +// This is a precursor to a hard-removal of namespaces. +func ValidateNamespaceDefault(ns string) error { + if ns == defaults.Namespace { + return nil + } + + const message = "" + + "namespace %q invalid, custom namespaces are deprecated; " + + "the namespace field should be omitted or set to %q" + return trace.BadParameter(message, ns, defaults.Namespace) +} diff --git a/api/types/presence.go b/api/types/presence.go index 764f467199894..b27b3b232cce2 100644 --- a/api/types/presence.go +++ b/api/types/presence.go @@ -67,9 +67,13 @@ func (s *KeepAlive) CheckAndSetDefaults() error { if s.IsEmpty() { return trace.BadParameter("missing resource name") } + if s.Namespace == "" { s.Namespace = defaults.Namespace } + if err := ValidateNamespaceDefault(s.Namespace); err != nil { + return trace.Wrap(err) + } return nil } diff --git a/api/types/resource.go b/api/types/resource.go index ec87a72c97a8c..ad5beaceb786b 100644 --- a/api/types/resource.go +++ b/api/types/resource.go @@ -139,6 +139,20 @@ type EnrichedResource struct { RequiresRequest bool } +// EnrichedResources is a wrapper of []*EnrichedResource. +// A EnrichedResource is a [ResourceWithLabels] wrapped with additional +// user-specific information. +type EnrichedResources []*EnrichedResource + +// ToResourcesWithLabels converts to ResourcesWithLabels. +func (r EnrichedResources) ToResourcesWithLabels() ResourcesWithLabels { + ret := make(ResourcesWithLabels, 0, len(r)) + for _, resource := range r { + ret = append(ret, resource.ResourceWithLabels) + } + return ret +} + // ResourcesWithLabels is a list of labeled resources. type ResourcesWithLabels []ResourceWithLabels @@ -464,9 +478,13 @@ func (m *Metadata) CheckAndSetDefaults() error { if m.Name == "" { return trace.BadParameter("missing parameter Name") } + if m.Namespace == "" { m.Namespace = defaults.Namespace } + if err := ValidateNamespaceDefault(m.Namespace); err != nil { + return trace.Wrap(err) + } // adjust expires time to UTC if it's set if m.Expires != nil { @@ -509,7 +527,7 @@ func MatchKinds(resource ResourceWithLabels, kinds []string) bool { } resourceKind := resource.GetKind() switch resourceKind { - case KindApp, KindSAMLIdPServiceProvider: + case KindApp, KindSAMLIdPServiceProvider, KindIdentityCenterAccount: return slices.Contains(kinds, KindApp) default: return slices.Contains(kinds, resourceKind) @@ -686,8 +704,11 @@ func FriendlyName(resource ResourceWithLabels) string { return resource.GetMetadata().Description } - if hn, ok := resource.(interface{ GetHostname() string }); ok { - return hn.GetHostname() + switch rr := resource.(type) { + case interface{ GetHostname() string }: + return rr.GetHostname() + case interface{ GetDisplayName() string }: + return rr.GetDisplayName() } return "" diff --git a/api/types/resource_153.go b/api/types/resource_153.go index 969509d7e910e..e2862a086ac05 100644 --- a/api/types/resource_153.go +++ b/api/types/resource_153.go @@ -21,6 +21,7 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + "github.com/gravitational/teleport/api/utils" ) // ResourceMetadata is the smallest interface that defines a Teleport resource. @@ -116,7 +117,8 @@ func (r *legacyToResource153Adapter) GetVersion() string { } // Resource153ToLegacy transforms an RFD 153 style resource into a legacy -// [Resource] type. +// [Resource] type. Implements [ResourceWithLabels] and CloneResource (where the) +// wrapped resource supports cloning). // // Note that CheckAndSetDefaults is a noop for the returned resource and // SetSubKind is not implemented and panics on use. @@ -130,6 +132,8 @@ type Resource153Unwrapper interface { Unwrap() Resource153 } +// resource153ToLegacyAdapter wraps a new-style resource in a type implementing +// the legacy resource interfaces type resource153ToLegacyAdapter struct { inner Resource153 } @@ -212,3 +216,111 @@ func (r *resource153ToLegacyAdapter) SetRevision(rev string) { func (r *resource153ToLegacyAdapter) SetSubKind(subKind string) { panic("interface Resource153 does not implement SetSubKind") } + +// ClonableResource153 adds a restriction on [Resource153] such that implementors +// must have a CloneResource() method. +type ClonableResource153 interface { + Resource153 + CloneResource() ClonableResource153 +} + +// UnifiedResource represents the combined set of interfaces that a resource +// must implement to be used with the Teleport Unified Resource Cache +type UnifiedResource interface { + ResourceWithLabels + CloneResource() ResourceWithLabels +} + +// Resource153ToUnifiedResource wraps an RFD153-style resource in a type that +// implements the legacy [ResourceWithLabels] interface and is suitable for use +// with the Teleport Unified Resources Cache. +// +// The same caveats that apply to [Resource153ToLegacy] apply. +func Resource153ToUnifiedResource(r ClonableResource153) UnifiedResource { + return &resource153ToUnifiedResourceAdapter{ + resource153ToLegacyAdapter: resource153ToLegacyAdapter{ + inner: r, + }, + } +} + +// resource153ToUnifiedResourceAdapter wraps a [resource153ToLegacyAdapter] to +// provide an implementation of [UnifiedResource] +type resource153ToUnifiedResourceAdapter struct { + resource153ToLegacyAdapter +} + +// Origin implements ResourceWithLabels for the adapter. +func (r *resource153ToUnifiedResourceAdapter) Origin() string { + m := r.inner.GetMetadata() + if m == nil { + return "" + } + return m.Labels[OriginLabel] +} + +// SetOrigin implements ResourceWithLabels for the adapter. +func (r *resource153ToUnifiedResourceAdapter) SetOrigin(origin string) { + m := r.inner.GetMetadata() + if m == nil { + return + } + m.Labels[OriginLabel] = origin +} + +// GetLabel implements ResourceWithLabels for the adapter. +func (r *resource153ToUnifiedResourceAdapter) GetLabel(key string) (value string, ok bool) { + m := r.inner.GetMetadata() + if m == nil { + return "", false + } + value, ok = m.Labels[key] + return +} + +// GetAllLabels implements ResourceWithLabels for the adapter. +func (r *resource153ToUnifiedResourceAdapter) GetAllLabels() map[string]string { + m := r.inner.GetMetadata() + if m == nil { + return nil + } + return m.Labels +} + +// GetStaticLabels implements ResourceWithLabels for the adapter. +func (r *resource153ToUnifiedResourceAdapter) GetStaticLabels() map[string]string { + return r.GetAllLabels() +} + +// SetStaticLabels implements ResourceWithLabels for the adapter. +func (r *resource153ToUnifiedResourceAdapter) SetStaticLabels(labels map[string]string) { + m := r.inner.GetMetadata() + if m == nil { + return + } + m.Labels = labels +} + +// MatchSearch implements ResourceWithLabels for the adapter. If the underlying +// type exposes a MatchSearch method, this method will defer to that, otherwise +// it will match against the resource label values and name. +func (r *resource153ToUnifiedResourceAdapter) MatchSearch(searchValues []string) bool { + if matcher, ok := r.inner.(interface{ MatchSearch([]string) bool }); ok { + return matcher.MatchSearch(searchValues) + } + fieldVals := append(utils.MapToStrings(r.GetAllLabels()), r.GetName()) + return MatchSearch(fieldVals, searchValues, nil) +} + +// CloneResource clones the underlying resource and wraps it in +func (r *resource153ToUnifiedResourceAdapter) CloneResource() ResourceWithLabels { + // We assume that this type assertion will work because we force `inner` + // to implement ClonableResource153 in [Resource153ToUnifiedResource], which + // is the only externally-visible constructor function + clone := r.inner.(ClonableResource153).CloneResource() + return &resource153ToUnifiedResourceAdapter{ + resource153ToLegacyAdapter: resource153ToLegacyAdapter{ + inner: clone, + }, + } +} diff --git a/api/types/resource_153_test.go b/api/types/resource_153_test.go index 301ab9fa81c10..f6cbb14c9a64b 100644 --- a/api/types/resource_153_test.go +++ b/api/types/resource_153_test.go @@ -80,10 +80,10 @@ func TestResource153ToLegacy(t *testing.T) { } legacyResource := types.Resource153ToLegacy(bot) - // Unwrap gives the underlying resource back. t.Run("unwrap", func(t *testing.T) { - unwrapped := legacyResource.(interface{ Unwrap() types.Resource153 }).Unwrap() + unwrapper := legacyResource.(types.Resource153Unwrapper) + unwrapped := unwrapper.Unwrap() if diff := cmp.Diff(bot, unwrapped, protocmp.Transform()); diff != "" { t.Errorf("Unwrap mismatch (-want +got)\n%s", diff) } diff --git a/api/types/resource_test.go b/api/types/resource_test.go index 896ee3b78ecff..53b38ef33e145 100644 --- a/api/types/resource_test.go +++ b/api/types/resource_test.go @@ -266,7 +266,7 @@ func TestMatchSearch_ResourceSpecific(t *testing.T) { name: "kube cluster", matchingSearchVals: []string{"foo", "prod", "env"}, newResource: func(t *testing.T) ResourceWithLabels { - kc, err := NewKubernetesClusterV3FromLegacyCluster("_", &KubernetesCluster{ + kc, err := NewKubernetesClusterV3FromLegacyCluster("", &KubernetesCluster{ Name: "foo", StaticLabels: labels, }) diff --git a/api/types/role.go b/api/types/role.go index 6983047e51d47..6551921bc9aeb 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -284,6 +284,10 @@ type Role interface { GetGitHubPermissions(RoleConditionType) []GitHubPermission // SetGitHubPermissions sets the allow or deny GitHub-related permissions. SetGitHubPermissions(RoleConditionType, []GitHubPermission) + + // GetIdentityCenterAccountAssignments fetches the allow or deny Account + // Assignments for the role + GetIdentityCenterAccountAssignments(RoleConditionType) []IdentityCenterAccountAssignment } // NewRole constructs new standard V7 role. @@ -1067,8 +1071,9 @@ func (r *RoleV6) CheckAndSetDefaults() error { if len(r.Spec.Options.BPF) == 0 { r.Spec.Options.BPF = defaults.EnhancedEvents() } - if r.Spec.Allow.Namespaces == nil { - r.Spec.Allow.Namespaces = []string{defaults.Namespace} + if err := checkAndSetRoleConditionNamespaces(&r.Spec.Allow.Namespaces); err != nil { + // Using trace.BadParameter instead of trace.Wrap for a better error message. + return trace.BadParameter("allow: %s", err) } if r.Spec.Options.RecordSession == nil { r.Spec.Options.RecordSession = &RecordSession{ @@ -1171,8 +1176,9 @@ func (r *RoleV6) CheckAndSetDefaults() error { return trace.BadParameter("unrecognized role version: %v", r.Version) } - if r.Spec.Deny.Namespaces == nil { - r.Spec.Deny.Namespaces = []string{defaults.Namespace} + if err := checkAndSetRoleConditionNamespaces(&r.Spec.Deny.Namespaces); err != nil { + // Using trace.BadParameter instead of trace.Wrap for a better error message. + return trace.BadParameter("deny: %s", err) } // Validate request.kubernetes_resources fields are all valid. @@ -1318,6 +1324,27 @@ func (r *RoleV6) CheckAndSetDefaults() error { return nil } +func checkAndSetRoleConditionNamespaces(namespaces *[]string) error { + // If nil use the default. + // This distinguishes between nil and empty (in accordance to legacy code). + if *namespaces == nil { + *namespaces = []string{defaults.Namespace} + return nil + } + + for i, ns := range *namespaces { + if ns == Wildcard { + continue // OK, wildcard is accepted. + } + if err := ValidateNamespaceDefault(ns); err != nil { + // Using trace.BadParameter instead of trace.Wrap for a better error message. + return trace.BadParameter("namespaces[%d]: %s", i, err) + } + } + + return nil +} + // String returns the human readable representation of a role. func (r *RoleV6) String() string { options, _ := json.Marshal(r.Spec.Options) @@ -2061,6 +2088,15 @@ func (r *RoleV6) makeGitServerLabelMatchers(cond *RoleConditions) LabelMatchers } } +// GetIdentityCenterAccountAssignments fetches the allow or deny Identity Center +// Account Assignments for the role +func (r *RoleV6) GetIdentityCenterAccountAssignments(rct RoleConditionType) []IdentityCenterAccountAssignment { + if rct == Allow { + return r.Spec.Allow.AccountAssignments + } + return r.Spec.Deny.AccountAssignments +} + // LabelMatcherKinds is the complete list of resource kinds that support label // matchers. var LabelMatcherKinds = []string{ @@ -2286,3 +2322,8 @@ func (h *CreateDatabaseUserMode) UnmarshalJSON(data []byte) error { func (m CreateDatabaseUserMode) IsEnabled() bool { return m != CreateDatabaseUserMode_DB_USER_MODE_UNSPECIFIED && m != CreateDatabaseUserMode_DB_USER_MODE_OFF } + +// GetAccount fetches the Account ID from a Role Condition Account Assignment +func (a IdentityCenterAccountAssignment) GetAccount() string { + return a.Account +} diff --git a/api/types/server.go b/api/types/server.go index 6adc0516ad4f4..98b61911c8415 100644 --- a/api/types/server.go +++ b/api/types/server.go @@ -855,3 +855,12 @@ func GetGitHubOrgFromNodeAddr(addr string) (string, bool) { } return "", false } + +// GetOrganizationURL returns the URL to the GitHub organization. +func (m *GitHubServerMetadata) GetOrganizationURL() string { + if m == nil { + return "" + } + // Public github.com for now. + return fmt.Sprintf("%s/%s", GithubURL, m.Organization) +} diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 9f00767d33445..6a74944d3b486 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1054,7 +1054,7 @@ func (x CertAuthoritySpecV2_SigningAlgType) String() string { } func (CertAuthoritySpecV2_SigningAlgType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{57, 0} + return fileDescriptor_9198ee693835762e, []int{58, 0} } // FIPSEndpointState represents an AWS FIPS endpoint state. @@ -1087,7 +1087,7 @@ func (x ClusterAuditConfigSpecV2_FIPSEndpointState) String() string { } func (ClusterAuditConfigSpecV2_FIPSEndpointState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{80, 0} + return fileDescriptor_9198ee693835762e, []int{81, 0} } // TraceType is an identification of the checkpoint. @@ -1157,7 +1157,7 @@ func (x ConnectionDiagnosticTrace_TraceType) String() string { } func (ConnectionDiagnosticTrace_TraceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{262, 0} + return fileDescriptor_9198ee693835762e, []int{263, 0} } // StatusType describes whether this was a success or a failure. @@ -1186,7 +1186,7 @@ func (x ConnectionDiagnosticTrace_StatusType) String() string { } func (ConnectionDiagnosticTrace_StatusType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{262, 1} + return fileDescriptor_9198ee693835762e, []int{263, 1} } // OktaAssignmentStatus represents the status of an Okta assignment. @@ -1226,7 +1226,7 @@ func (x OktaAssignmentSpecV1_OktaAssignmentStatus) String() string { } func (OktaAssignmentSpecV1_OktaAssignmentStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{344, 0} + return fileDescriptor_9198ee693835762e, []int{345, 0} } // OktaAssignmentTargetType is the type of Okta object that an assignment is targeting. @@ -1258,7 +1258,7 @@ func (x OktaAssignmentTargetV1_OktaAssignmentTargetType) String() string { } func (OktaAssignmentTargetV1_OktaAssignmentTargetType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{345, 0} + return fileDescriptor_9198ee693835762e, []int{346, 0} } type KeepAlive struct { @@ -3531,7 +3531,10 @@ type IdentityCenterPermissionSet struct { // ARN is the fully-formed ARN of the Permission Set. ARN string `protobuf:"bytes,1,opt,name=ARN,proto3" json:"arn,omitempty"` // Name is the human-readable name of the Permission Set. - Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"name,omitempty"` + // AssignmentID is the ID of the Teelport Account Assignment resource that + // represents this permission being assigned on the enclosing Account. + AssignmentID string `protobuf:"bytes,3,opt,name=AssignmentID,proto3" json:"assignment_name,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -3644,10 +3647,15 @@ type AppSpecV3 struct { CORS *CORSPolicy `protobuf:"bytes,11,opt,name=CORS,proto3" json:"cors,omitempty"` // IdentityCenter encasulates AWS identity-center specific information. Only // valid for Identity Center account apps. - IdentityCenter *AppIdentityCenter `protobuf:"bytes,12,opt,name=IdentityCenter,proto3" json:"identity_center,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + IdentityCenter *AppIdentityCenter `protobuf:"bytes,12,opt,name=IdentityCenter,proto3" json:"identity_center,omitempty"` + // TCPPorts is a list of ports and port ranges that an app agent can forward connections to. + // Only applicable to TCP App Access. + // If this field is not empty, URI is expected to contain no port number and start with the tcp + // protocol. + TCPPorts []*PortRange `protobuf:"bytes,13,rep,name=TCPPorts,proto3" json:"tcp_ports,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *AppSpecV3) Reset() { *m = AppSpecV3{} } @@ -3874,6 +3882,54 @@ func (m *Header) XXX_DiscardUnknown() { var xxx_messageInfo_Header proto.InternalMessageInfo +// PortRange describes a port range for TCP apps. The range starts with Port and ends with EndPort. +// PortRange can be used to describe a single port in which case the Port field is the port and the +// EndPort field is 0. +type PortRange struct { + // Port describes the start of the range. It must be between 1 and 65535. + Port uint32 `protobuf:"varint,1,opt,name=Port,proto3" json:"port"` + // EndPort describes the end of the range, inclusive. If set, it must be between 2 and 65535 and + // be greater than Port when describing a port range. When omitted or set to zero, it signifies + // that the port range defines a single port. + EndPort uint32 `protobuf:"varint,2,opt,name=EndPort,proto3" json:"end_port,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PortRange) Reset() { *m = PortRange{} } +func (m *PortRange) String() string { return proto.CompactTextString(m) } +func (*PortRange) ProtoMessage() {} +func (*PortRange) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{51} +} +func (m *PortRange) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PortRange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PortRange.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PortRange) XXX_Merge(src proto.Message) { + xxx_messageInfo_PortRange.Merge(m, src) +} +func (m *PortRange) XXX_Size() int { + return m.Size() +} +func (m *PortRange) XXX_DiscardUnknown() { + xxx_messageInfo_PortRange.DiscardUnknown(m) +} + +var xxx_messageInfo_PortRange proto.InternalMessageInfo + // CommandLabelV2 is a label that has a value as a result of the // output generated by running command, e.g. hostname type CommandLabelV2 struct { @@ -3892,7 +3948,7 @@ func (m *CommandLabelV2) Reset() { *m = CommandLabelV2{} } func (m *CommandLabelV2) String() string { return proto.CompactTextString(m) } func (*CommandLabelV2) ProtoMessage() {} func (*CommandLabelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{51} + return fileDescriptor_9198ee693835762e, []int{52} } func (m *CommandLabelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3934,7 +3990,7 @@ func (m *AppAWS) Reset() { *m = AppAWS{} } func (m *AppAWS) String() string { return proto.CompactTextString(m) } func (*AppAWS) ProtoMessage() {} func (*AppAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{52} + return fileDescriptor_9198ee693835762e, []int{53} } func (m *AppAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3980,7 +4036,7 @@ func (m *SSHKeyPair) Reset() { *m = SSHKeyPair{} } func (m *SSHKeyPair) String() string { return proto.CompactTextString(m) } func (*SSHKeyPair) ProtoMessage() {} func (*SSHKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{53} + return fileDescriptor_9198ee693835762e, []int{54} } func (m *SSHKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4026,7 +4082,7 @@ func (m *TLSKeyPair) Reset() { *m = TLSKeyPair{} } func (m *TLSKeyPair) String() string { return proto.CompactTextString(m) } func (*TLSKeyPair) ProtoMessage() {} func (*TLSKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{54} + return fileDescriptor_9198ee693835762e, []int{55} } func (m *TLSKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4072,7 +4128,7 @@ func (m *JWTKeyPair) Reset() { *m = JWTKeyPair{} } func (m *JWTKeyPair) String() string { return proto.CompactTextString(m) } func (*JWTKeyPair) ProtoMessage() {} func (*JWTKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{55} + return fileDescriptor_9198ee693835762e, []int{56} } func (m *JWTKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4121,7 +4177,7 @@ type CertAuthorityV2 struct { func (m *CertAuthorityV2) Reset() { *m = CertAuthorityV2{} } func (*CertAuthorityV2) ProtoMessage() {} func (*CertAuthorityV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{56} + return fileDescriptor_9198ee693835762e, []int{57} } func (m *CertAuthorityV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4182,7 +4238,7 @@ func (m *CertAuthoritySpecV2) Reset() { *m = CertAuthoritySpecV2{} } func (m *CertAuthoritySpecV2) String() string { return proto.CompactTextString(m) } func (*CertAuthoritySpecV2) ProtoMessage() {} func (*CertAuthoritySpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{57} + return fileDescriptor_9198ee693835762e, []int{58} } func (m *CertAuthoritySpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4228,7 +4284,7 @@ func (m *CAKeySet) Reset() { *m = CAKeySet{} } func (m *CAKeySet) String() string { return proto.CompactTextString(m) } func (*CAKeySet) ProtoMessage() {} func (*CAKeySet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{58} + return fileDescriptor_9198ee693835762e, []int{59} } func (m *CAKeySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4273,7 +4329,7 @@ func (m *RoleMapping) Reset() { *m = RoleMapping{} } func (m *RoleMapping) String() string { return proto.CompactTextString(m) } func (*RoleMapping) ProtoMessage() {} func (*RoleMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{59} + return fileDescriptor_9198ee693835762e, []int{60} } func (m *RoleMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4321,7 +4377,7 @@ type ProvisionTokenV1 struct { func (m *ProvisionTokenV1) Reset() { *m = ProvisionTokenV1{} } func (*ProvisionTokenV1) ProtoMessage() {} func (*ProvisionTokenV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{60} + return fileDescriptor_9198ee693835762e, []int{61} } func (m *ProvisionTokenV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4371,7 +4427,7 @@ type ProvisionTokenV2 struct { func (m *ProvisionTokenV2) Reset() { *m = ProvisionTokenV2{} } func (*ProvisionTokenV2) ProtoMessage() {} func (*ProvisionTokenV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{61} + return fileDescriptor_9198ee693835762e, []int{62} } func (m *ProvisionTokenV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4413,7 +4469,7 @@ func (m *ProvisionTokenV2List) Reset() { *m = ProvisionTokenV2List{} } func (m *ProvisionTokenV2List) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenV2List) ProtoMessage() {} func (*ProvisionTokenV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{62} + return fileDescriptor_9198ee693835762e, []int{63} } func (m *ProvisionTokenV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4465,7 +4521,7 @@ func (m *TokenRule) Reset() { *m = TokenRule{} } func (m *TokenRule) String() string { return proto.CompactTextString(m) } func (*TokenRule) ProtoMessage() {} func (*TokenRule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{63} + return fileDescriptor_9198ee693835762e, []int{64} } func (m *TokenRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4549,7 +4605,7 @@ func (m *ProvisionTokenSpecV2) Reset() { *m = ProvisionTokenSpecV2{} } func (m *ProvisionTokenSpecV2) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2) ProtoMessage() {} func (*ProvisionTokenSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{64} + return fileDescriptor_9198ee693835762e, []int{65} } func (m *ProvisionTokenSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4601,7 +4657,7 @@ func (m *ProvisionTokenSpecV2TPM) Reset() { *m = ProvisionTokenSpecV2TPM func (m *ProvisionTokenSpecV2TPM) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TPM) ProtoMessage() {} func (*ProvisionTokenSpecV2TPM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{65} + return fileDescriptor_9198ee693835762e, []int{66} } func (m *ProvisionTokenSpecV2TPM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4657,7 +4713,7 @@ func (m *ProvisionTokenSpecV2TPM_Rule) Reset() { *m = ProvisionTokenSpec func (m *ProvisionTokenSpecV2TPM_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TPM_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2TPM_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{65, 0} + return fileDescriptor_9198ee693835762e, []int{66, 0} } func (m *ProvisionTokenSpecV2TPM_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4726,7 +4782,7 @@ func (m *ProvisionTokenSpecV2GitHub) Reset() { *m = ProvisionTokenSpecV2 func (m *ProvisionTokenSpecV2GitHub) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitHub) ProtoMessage() {} func (*ProvisionTokenSpecV2GitHub) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{66} + return fileDescriptor_9198ee693835762e, []int{67} } func (m *ProvisionTokenSpecV2GitHub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4788,7 +4844,7 @@ func (m *ProvisionTokenSpecV2GitHub_Rule) Reset() { *m = ProvisionTokenS func (m *ProvisionTokenSpecV2GitHub_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitHub_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2GitHub_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{66, 0} + return fileDescriptor_9198ee693835762e, []int{67, 0} } func (m *ProvisionTokenSpecV2GitHub_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4836,7 +4892,7 @@ func (m *ProvisionTokenSpecV2GitLab) Reset() { *m = ProvisionTokenSpecV2 func (m *ProvisionTokenSpecV2GitLab) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitLab) ProtoMessage() {} func (*ProvisionTokenSpecV2GitLab) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{67} + return fileDescriptor_9198ee693835762e, []int{68} } func (m *ProvisionTokenSpecV2GitLab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4938,7 +4994,7 @@ func (m *ProvisionTokenSpecV2GitLab_Rule) Reset() { *m = ProvisionTokenS func (m *ProvisionTokenSpecV2GitLab_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitLab_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2GitLab_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{67, 0} + return fileDescriptor_9198ee693835762e, []int{68, 0} } func (m *ProvisionTokenSpecV2GitLab_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4983,7 +5039,7 @@ func (m *ProvisionTokenSpecV2CircleCI) Reset() { *m = ProvisionTokenSpec func (m *ProvisionTokenSpecV2CircleCI) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2CircleCI) ProtoMessage() {} func (*ProvisionTokenSpecV2CircleCI) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{68} + return fileDescriptor_9198ee693835762e, []int{69} } func (m *ProvisionTokenSpecV2CircleCI) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5024,7 +5080,7 @@ func (m *ProvisionTokenSpecV2CircleCI_Rule) Reset() { *m = ProvisionToke func (m *ProvisionTokenSpecV2CircleCI_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2CircleCI_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2CircleCI_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{68, 0} + return fileDescriptor_9198ee693835762e, []int{69, 0} } func (m *ProvisionTokenSpecV2CircleCI_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5071,7 +5127,7 @@ func (m *ProvisionTokenSpecV2Spacelift) Reset() { *m = ProvisionTokenSpe func (m *ProvisionTokenSpecV2Spacelift) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Spacelift) ProtoMessage() {} func (*ProvisionTokenSpecV2Spacelift) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{69} + return fileDescriptor_9198ee693835762e, []int{70} } func (m *ProvisionTokenSpecV2Spacelift) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5122,7 +5178,7 @@ func (m *ProvisionTokenSpecV2Spacelift_Rule) Reset() { *m = ProvisionTok func (m *ProvisionTokenSpecV2Spacelift_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Spacelift_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Spacelift_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{69, 0} + return fileDescriptor_9198ee693835762e, []int{70, 0} } func (m *ProvisionTokenSpecV2Spacelift_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5174,7 +5230,7 @@ func (m *ProvisionTokenSpecV2Kubernetes) Reset() { *m = ProvisionTokenSp func (m *ProvisionTokenSpecV2Kubernetes) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Kubernetes) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{70} + return fileDescriptor_9198ee693835762e, []int{71} } func (m *ProvisionTokenSpecV2Kubernetes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5221,7 +5277,7 @@ func (m *ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) String() string { } func (*ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{70, 0} + return fileDescriptor_9198ee693835762e, []int{71, 0} } func (m *ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5265,7 +5321,7 @@ func (m *ProvisionTokenSpecV2Kubernetes_Rule) Reset() { *m = ProvisionTo func (m *ProvisionTokenSpecV2Kubernetes_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Kubernetes_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{70, 1} + return fileDescriptor_9198ee693835762e, []int{71, 1} } func (m *ProvisionTokenSpecV2Kubernetes_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5309,7 +5365,7 @@ func (m *ProvisionTokenSpecV2Azure) Reset() { *m = ProvisionTokenSpecV2A func (m *ProvisionTokenSpecV2Azure) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Azure) ProtoMessage() {} func (*ProvisionTokenSpecV2Azure) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{71} + return fileDescriptor_9198ee693835762e, []int{72} } func (m *ProvisionTokenSpecV2Azure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5355,7 +5411,7 @@ func (m *ProvisionTokenSpecV2Azure_Rule) Reset() { *m = ProvisionTokenSp func (m *ProvisionTokenSpecV2Azure_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Azure_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Azure_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{71, 0} + return fileDescriptor_9198ee693835762e, []int{72, 0} } func (m *ProvisionTokenSpecV2Azure_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5399,7 +5455,7 @@ func (m *ProvisionTokenSpecV2GCP) Reset() { *m = ProvisionTokenSpecV2GCP func (m *ProvisionTokenSpecV2GCP) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GCP) ProtoMessage() {} func (*ProvisionTokenSpecV2GCP) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{72} + return fileDescriptor_9198ee693835762e, []int{73} } func (m *ProvisionTokenSpecV2GCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5448,7 +5504,7 @@ func (m *ProvisionTokenSpecV2GCP_Rule) Reset() { *m = ProvisionTokenSpec func (m *ProvisionTokenSpecV2GCP_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GCP_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2GCP_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{72, 0} + return fileDescriptor_9198ee693835762e, []int{73, 0} } func (m *ProvisionTokenSpecV2GCP_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5505,7 +5561,7 @@ func (m *ProvisionTokenSpecV2TerraformCloud) Reset() { *m = ProvisionTok func (m *ProvisionTokenSpecV2TerraformCloud) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TerraformCloud) ProtoMessage() {} func (*ProvisionTokenSpecV2TerraformCloud) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{73} + return fileDescriptor_9198ee693835762e, []int{74} } func (m *ProvisionTokenSpecV2TerraformCloud) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5570,7 +5626,7 @@ func (m *ProvisionTokenSpecV2TerraformCloud_Rule) Reset() { func (m *ProvisionTokenSpecV2TerraformCloud_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TerraformCloud_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2TerraformCloud_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{73, 0} + return fileDescriptor_9198ee693835762e, []int{74, 0} } func (m *ProvisionTokenSpecV2TerraformCloud_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5622,7 +5678,7 @@ func (m *ProvisionTokenSpecV2Bitbucket) Reset() { *m = ProvisionTokenSpe func (m *ProvisionTokenSpecV2Bitbucket) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Bitbucket) ProtoMessage() {} func (*ProvisionTokenSpecV2Bitbucket) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{74} + return fileDescriptor_9198ee693835762e, []int{75} } func (m *ProvisionTokenSpecV2Bitbucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5680,7 +5736,7 @@ func (m *ProvisionTokenSpecV2Bitbucket_Rule) Reset() { *m = ProvisionTok func (m *ProvisionTokenSpecV2Bitbucket_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Bitbucket_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Bitbucket_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{74, 0} + return fileDescriptor_9198ee693835762e, []int{75, 0} } func (m *ProvisionTokenSpecV2Bitbucket_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5729,7 +5785,7 @@ type StaticTokensV2 struct { func (m *StaticTokensV2) Reset() { *m = StaticTokensV2{} } func (*StaticTokensV2) ProtoMessage() {} func (*StaticTokensV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{75} + return fileDescriptor_9198ee693835762e, []int{76} } func (m *StaticTokensV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5772,7 +5828,7 @@ func (m *StaticTokensSpecV2) Reset() { *m = StaticTokensSpecV2{} } func (m *StaticTokensSpecV2) String() string { return proto.CompactTextString(m) } func (*StaticTokensSpecV2) ProtoMessage() {} func (*StaticTokensSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{76} + return fileDescriptor_9198ee693835762e, []int{77} } func (m *StaticTokensSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5821,7 +5877,7 @@ type ClusterNameV2 struct { func (m *ClusterNameV2) Reset() { *m = ClusterNameV2{} } func (*ClusterNameV2) ProtoMessage() {} func (*ClusterNameV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{77} + return fileDescriptor_9198ee693835762e, []int{78} } func (m *ClusterNameV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5867,7 +5923,7 @@ func (m *ClusterNameSpecV2) Reset() { *m = ClusterNameSpecV2{} } func (m *ClusterNameSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNameSpecV2) ProtoMessage() {} func (*ClusterNameSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{78} + return fileDescriptor_9198ee693835762e, []int{79} } func (m *ClusterNameSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5917,7 +5973,7 @@ func (m *ClusterAuditConfigV2) Reset() { *m = ClusterAuditConfigV2{} } func (m *ClusterAuditConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigV2) ProtoMessage() {} func (*ClusterAuditConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{79} + return fileDescriptor_9198ee693835762e, []int{80} } func (m *ClusterAuditConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5987,7 +6043,7 @@ func (m *ClusterAuditConfigSpecV2) Reset() { *m = ClusterAuditConfigSpec func (m *ClusterAuditConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigSpecV2) ProtoMessage() {} func (*ClusterAuditConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{80} + return fileDescriptor_9198ee693835762e, []int{81} } func (m *ClusterAuditConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6038,7 +6094,7 @@ func (m *ClusterNetworkingConfigV2) Reset() { *m = ClusterNetworkingConf func (m *ClusterNetworkingConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigV2) ProtoMessage() {} func (*ClusterNetworkingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{81} + return fileDescriptor_9198ee693835762e, []int{82} } func (m *ClusterNetworkingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6117,7 +6173,7 @@ func (m *ClusterNetworkingConfigSpecV2) Reset() { *m = ClusterNetworking func (m *ClusterNetworkingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigSpecV2) ProtoMessage() {} func (*ClusterNetworkingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{82} + return fileDescriptor_9198ee693835762e, []int{83} } func (m *ClusterNetworkingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6162,7 +6218,7 @@ func (m *TunnelStrategyV1) Reset() { *m = TunnelStrategyV1{} } func (m *TunnelStrategyV1) String() string { return proto.CompactTextString(m) } func (*TunnelStrategyV1) ProtoMessage() {} func (*TunnelStrategyV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{83} + return fileDescriptor_9198ee693835762e, []int{84} } func (m *TunnelStrategyV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6247,7 +6303,7 @@ func (m *AgentMeshTunnelStrategy) Reset() { *m = AgentMeshTunnelStrategy func (m *AgentMeshTunnelStrategy) String() string { return proto.CompactTextString(m) } func (*AgentMeshTunnelStrategy) ProtoMessage() {} func (*AgentMeshTunnelStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{84} + return fileDescriptor_9198ee693835762e, []int{85} } func (m *AgentMeshTunnelStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6288,7 +6344,7 @@ func (m *ProxyPeeringTunnelStrategy) Reset() { *m = ProxyPeeringTunnelSt func (m *ProxyPeeringTunnelStrategy) String() string { return proto.CompactTextString(m) } func (*ProxyPeeringTunnelStrategy) ProtoMessage() {} func (*ProxyPeeringTunnelStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{85} + return fileDescriptor_9198ee693835762e, []int{86} } func (m *ProxyPeeringTunnelStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6339,7 +6395,7 @@ func (m *SessionRecordingConfigV2) Reset() { *m = SessionRecordingConfig func (m *SessionRecordingConfigV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigV2) ProtoMessage() {} func (*SessionRecordingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{86} + return fileDescriptor_9198ee693835762e, []int{87} } func (m *SessionRecordingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6385,7 +6441,7 @@ func (m *SessionRecordingConfigSpecV2) Reset() { *m = SessionRecordingCo func (m *SessionRecordingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigSpecV2) ProtoMessage() {} func (*SessionRecordingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{87} + return fileDescriptor_9198ee693835762e, []int{88} } func (m *SessionRecordingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6435,7 +6491,7 @@ type AuthPreferenceV2 struct { func (m *AuthPreferenceV2) Reset() { *m = AuthPreferenceV2{} } func (*AuthPreferenceV2) ProtoMessage() {} func (*AuthPreferenceV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{88} + return fileDescriptor_9198ee693835762e, []int{89} } func (m *AuthPreferenceV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6528,7 +6584,7 @@ func (m *AuthPreferenceSpecV2) Reset() { *m = AuthPreferenceSpecV2{} } func (m *AuthPreferenceSpecV2) String() string { return proto.CompactTextString(m) } func (*AuthPreferenceSpecV2) ProtoMessage() {} func (*AuthPreferenceSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{89} + return fileDescriptor_9198ee693835762e, []int{90} } func (m *AuthPreferenceSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6579,7 +6635,7 @@ func (m *U2F) Reset() { *m = U2F{} } func (m *U2F) String() string { return proto.CompactTextString(m) } func (*U2F) ProtoMessage() {} func (*U2F) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{90} + return fileDescriptor_9198ee693835762e, []int{91} } func (m *U2F) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6647,7 +6703,7 @@ func (m *Webauthn) Reset() { *m = Webauthn{} } func (m *Webauthn) String() string { return proto.CompactTextString(m) } func (*Webauthn) ProtoMessage() {} func (*Webauthn) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{91} + return fileDescriptor_9198ee693835762e, []int{92} } func (m *Webauthn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6718,7 +6774,7 @@ func (m *DeviceTrust) Reset() { *m = DeviceTrust{} } func (m *DeviceTrust) String() string { return proto.CompactTextString(m) } func (*DeviceTrust) ProtoMessage() {} func (*DeviceTrust) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{92} + return fileDescriptor_9198ee693835762e, []int{93} } func (m *DeviceTrust) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6765,7 +6821,7 @@ func (m *HardwareKey) Reset() { *m = HardwareKey{} } func (m *HardwareKey) String() string { return proto.CompactTextString(m) } func (*HardwareKey) ProtoMessage() {} func (*HardwareKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{93} + return fileDescriptor_9198ee693835762e, []int{94} } func (m *HardwareKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6812,7 +6868,7 @@ func (m *HardwareKeySerialNumberValidation) Reset() { *m = HardwareKeySe func (m *HardwareKeySerialNumberValidation) String() string { return proto.CompactTextString(m) } func (*HardwareKeySerialNumberValidation) ProtoMessage() {} func (*HardwareKeySerialNumberValidation) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{94} + return fileDescriptor_9198ee693835762e, []int{95} } func (m *HardwareKeySerialNumberValidation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6862,7 +6918,7 @@ func (m *Namespace) Reset() { *m = Namespace{} } func (m *Namespace) String() string { return proto.CompactTextString(m) } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{95} + return fileDescriptor_9198ee693835762e, []int{96} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6902,7 +6958,7 @@ func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (m *NamespaceSpec) String() string { return proto.CompactTextString(m) } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{96} + return fileDescriptor_9198ee693835762e, []int{97} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6950,7 +7006,7 @@ type UserTokenV3 struct { func (m *UserTokenV3) Reset() { *m = UserTokenV3{} } func (*UserTokenV3) ProtoMessage() {} func (*UserTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{97} + return fileDescriptor_9198ee693835762e, []int{98} } func (m *UserTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6997,7 +7053,7 @@ func (m *UserTokenSpecV3) Reset() { *m = UserTokenSpecV3{} } func (m *UserTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSpecV3) ProtoMessage() {} func (*UserTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{98} + return fileDescriptor_9198ee693835762e, []int{99} } func (m *UserTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7045,7 +7101,7 @@ type UserTokenSecretsV3 struct { func (m *UserTokenSecretsV3) Reset() { *m = UserTokenSecretsV3{} } func (*UserTokenSecretsV3) ProtoMessage() {} func (*UserTokenSecretsV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{99} + return fileDescriptor_9198ee693835762e, []int{100} } func (m *UserTokenSecretsV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7090,7 +7146,7 @@ func (m *UserTokenSecretsSpecV3) Reset() { *m = UserTokenSecretsSpecV3{} func (m *UserTokenSecretsSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSecretsSpecV3) ProtoMessage() {} func (*UserTokenSecretsSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{100} + return fileDescriptor_9198ee693835762e, []int{101} } func (m *UserTokenSecretsSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7139,7 +7195,7 @@ type AccessRequestV3 struct { func (m *AccessRequestV3) Reset() { *m = AccessRequestV3{} } func (*AccessRequestV3) ProtoMessage() {} func (*AccessRequestV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{101} + return fileDescriptor_9198ee693835762e, []int{102} } func (m *AccessRequestV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7191,7 +7247,7 @@ func (m *AccessReviewThreshold) Reset() { *m = AccessReviewThreshold{} } func (m *AccessReviewThreshold) String() string { return proto.CompactTextString(m) } func (*AccessReviewThreshold) ProtoMessage() {} func (*AccessReviewThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{102} + return fileDescriptor_9198ee693835762e, []int{103} } func (m *AccessReviewThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7236,7 +7292,7 @@ func (m *PromotedAccessList) Reset() { *m = PromotedAccessList{} } func (m *PromotedAccessList) String() string { return proto.CompactTextString(m) } func (*PromotedAccessList) ProtoMessage() {} func (*PromotedAccessList) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{103} + return fileDescriptor_9198ee693835762e, []int{104} } func (m *PromotedAccessList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7297,7 +7353,7 @@ func (m *AccessReview) Reset() { *m = AccessReview{} } func (m *AccessReview) String() string { return proto.CompactTextString(m) } func (*AccessReview) ProtoMessage() {} func (*AccessReview) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{104} + return fileDescriptor_9198ee693835762e, []int{105} } func (m *AccessReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7342,7 +7398,7 @@ func (m *AccessReviewSubmission) Reset() { *m = AccessReviewSubmission{} func (m *AccessReviewSubmission) String() string { return proto.CompactTextString(m) } func (*AccessReviewSubmission) ProtoMessage() {} func (*AccessReviewSubmission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{105} + return fileDescriptor_9198ee693835762e, []int{106} } func (m *AccessReviewSubmission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7385,7 +7441,7 @@ func (m *ThresholdIndexSet) Reset() { *m = ThresholdIndexSet{} } func (m *ThresholdIndexSet) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSet) ProtoMessage() {} func (*ThresholdIndexSet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{106} + return fileDescriptor_9198ee693835762e, []int{107} } func (m *ThresholdIndexSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7428,7 +7484,7 @@ func (m *ThresholdIndexSets) Reset() { *m = ThresholdIndexSets{} } func (m *ThresholdIndexSets) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSets) ProtoMessage() {} func (*ThresholdIndexSets) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{107} + return fileDescriptor_9198ee693835762e, []int{108} } func (m *ThresholdIndexSets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7531,7 +7587,7 @@ func (m *AccessRequestSpecV3) Reset() { *m = AccessRequestSpecV3{} } func (m *AccessRequestSpecV3) String() string { return proto.CompactTextString(m) } func (*AccessRequestSpecV3) ProtoMessage() {} func (*AccessRequestSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{108} + return fileDescriptor_9198ee693835762e, []int{109} } func (m *AccessRequestSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7588,7 +7644,7 @@ func (m *AccessRequestFilter) Reset() { *m = AccessRequestFilter{} } func (m *AccessRequestFilter) String() string { return proto.CompactTextString(m) } func (*AccessRequestFilter) ProtoMessage() {} func (*AccessRequestFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{109} + return fileDescriptor_9198ee693835762e, []int{110} } func (m *AccessRequestFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7644,7 +7700,7 @@ func (m *AccessCapabilities) Reset() { *m = AccessCapabilities{} } func (m *AccessCapabilities) String() string { return proto.CompactTextString(m) } func (*AccessCapabilities) ProtoMessage() {} func (*AccessCapabilities) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{110} + return fileDescriptor_9198ee693835762e, []int{111} } func (m *AccessCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7702,7 +7758,7 @@ func (m *AccessCapabilitiesRequest) Reset() { *m = AccessCapabilitiesReq func (m *AccessCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*AccessCapabilitiesRequest) ProtoMessage() {} func (*AccessCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{111} + return fileDescriptor_9198ee693835762e, []int{112} } func (m *AccessCapabilitiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7746,7 +7802,7 @@ func (m *RequestKubernetesResource) Reset() { *m = RequestKubernetesReso func (m *RequestKubernetesResource) String() string { return proto.CompactTextString(m) } func (*RequestKubernetesResource) ProtoMessage() {} func (*RequestKubernetesResource) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{112} + return fileDescriptor_9198ee693835762e, []int{113} } func (m *RequestKubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7798,7 +7854,7 @@ func (m *ResourceID) Reset() { *m = ResourceID{} } func (m *ResourceID) String() string { return proto.CompactTextString(m) } func (*ResourceID) ProtoMessage() {} func (*ResourceID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{113} + return fileDescriptor_9198ee693835762e, []int{114} } func (m *ResourceID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7847,7 +7903,7 @@ type PluginDataV3 struct { func (m *PluginDataV3) Reset() { *m = PluginDataV3{} } func (*PluginDataV3) ProtoMessage() {} func (*PluginDataV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{114} + return fileDescriptor_9198ee693835762e, []int{115} } func (m *PluginDataV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7890,7 +7946,7 @@ func (m *PluginDataEntry) Reset() { *m = PluginDataEntry{} } func (m *PluginDataEntry) String() string { return proto.CompactTextString(m) } func (*PluginDataEntry) ProtoMessage() {} func (*PluginDataEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{115} + return fileDescriptor_9198ee693835762e, []int{116} } func (m *PluginDataEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7932,7 +7988,7 @@ func (m *PluginDataSpecV3) Reset() { *m = PluginDataSpecV3{} } func (m *PluginDataSpecV3) String() string { return proto.CompactTextString(m) } func (*PluginDataSpecV3) ProtoMessage() {} func (*PluginDataSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{116} + return fileDescriptor_9198ee693835762e, []int{117} } func (m *PluginDataSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7979,7 +8035,7 @@ func (m *PluginDataFilter) Reset() { *m = PluginDataFilter{} } func (m *PluginDataFilter) String() string { return proto.CompactTextString(m) } func (*PluginDataFilter) ProtoMessage() {} func (*PluginDataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{117} + return fileDescriptor_9198ee693835762e, []int{118} } func (m *PluginDataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8030,7 +8086,7 @@ func (m *PluginDataUpdateParams) Reset() { *m = PluginDataUpdateParams{} func (m *PluginDataUpdateParams) String() string { return proto.CompactTextString(m) } func (*PluginDataUpdateParams) ProtoMessage() {} func (*PluginDataUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{118} + return fileDescriptor_9198ee693835762e, []int{119} } func (m *PluginDataUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8074,7 +8130,7 @@ func (m *RoleFilter) Reset() { *m = RoleFilter{} } func (m *RoleFilter) String() string { return proto.CompactTextString(m) } func (*RoleFilter) ProtoMessage() {} func (*RoleFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{119} + return fileDescriptor_9198ee693835762e, []int{120} } func (m *RoleFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8124,7 +8180,7 @@ type RoleV6 struct { func (m *RoleV6) Reset() { *m = RoleV6{} } func (*RoleV6) ProtoMessage() {} func (*RoleV6) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{120} + return fileDescriptor_9198ee693835762e, []int{121} } func (m *RoleV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8171,7 +8227,7 @@ func (m *RoleSpecV6) Reset() { *m = RoleSpecV6{} } func (m *RoleSpecV6) String() string { return proto.CompactTextString(m) } func (*RoleSpecV6) ProtoMessage() {} func (*RoleSpecV6) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{121} + return fileDescriptor_9198ee693835762e, []int{122} } func (m *RoleSpecV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8212,7 +8268,7 @@ func (m *SSHLocalPortForwarding) Reset() { *m = SSHLocalPortForwarding{} func (m *SSHLocalPortForwarding) String() string { return proto.CompactTextString(m) } func (*SSHLocalPortForwarding) ProtoMessage() {} func (*SSHLocalPortForwarding) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{122} + return fileDescriptor_9198ee693835762e, []int{123} } func (m *SSHLocalPortForwarding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8253,7 +8309,7 @@ func (m *SSHRemotePortForwarding) Reset() { *m = SSHRemotePortForwarding func (m *SSHRemotePortForwarding) String() string { return proto.CompactTextString(m) } func (*SSHRemotePortForwarding) ProtoMessage() {} func (*SSHRemotePortForwarding) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{123} + return fileDescriptor_9198ee693835762e, []int{124} } func (m *SSHRemotePortForwarding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8297,7 +8353,7 @@ func (m *SSHPortForwarding) Reset() { *m = SSHPortForwarding{} } func (m *SSHPortForwarding) String() string { return proto.CompactTextString(m) } func (*SSHPortForwarding) ProtoMessage() {} func (*SSHPortForwarding) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{124} + return fileDescriptor_9198ee693835762e, []int{125} } func (m *SSHPortForwarding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8429,7 +8485,7 @@ func (m *RoleOptions) Reset() { *m = RoleOptions{} } func (m *RoleOptions) String() string { return proto.CompactTextString(m) } func (*RoleOptions) ProtoMessage() {} func (*RoleOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{125} + return fileDescriptor_9198ee693835762e, []int{126} } func (m *RoleOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8475,7 +8531,7 @@ func (m *RecordSession) Reset() { *m = RecordSession{} } func (m *RecordSession) String() string { return proto.CompactTextString(m) } func (*RecordSession) ProtoMessage() {} func (*RecordSession) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{126} + return fileDescriptor_9198ee693835762e, []int{127} } func (m *RecordSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8527,7 +8583,7 @@ func (m *CertExtension) Reset() { *m = CertExtension{} } func (m *CertExtension) String() string { return proto.CompactTextString(m) } func (*CertExtension) ProtoMessage() {} func (*CertExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{127} + return fileDescriptor_9198ee693835762e, []int{128} } func (m *CertExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8665,7 +8721,7 @@ func (m *RoleConditions) Reset() { *m = RoleConditions{} } func (m *RoleConditions) String() string { return proto.CompactTextString(m) } func (*RoleConditions) ProtoMessage() {} func (*RoleConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{128} + return fileDescriptor_9198ee693835762e, []int{129} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8708,7 +8764,7 @@ func (m *IdentityCenterAccountAssignment) Reset() { *m = IdentityCenterA func (m *IdentityCenterAccountAssignment) String() string { return proto.CompactTextString(m) } func (*IdentityCenterAccountAssignment) ProtoMessage() {} func (*IdentityCenterAccountAssignment) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{129} + return fileDescriptor_9198ee693835762e, []int{130} } func (m *IdentityCenterAccountAssignment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8749,7 +8805,7 @@ func (m *GitHubPermission) Reset() { *m = GitHubPermission{} } func (m *GitHubPermission) String() string { return proto.CompactTextString(m) } func (*GitHubPermission) ProtoMessage() {} func (*GitHubPermission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{130} + return fileDescriptor_9198ee693835762e, []int{131} } func (m *GitHubPermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8825,7 +8881,7 @@ func (m *SPIFFERoleCondition) Reset() { *m = SPIFFERoleCondition{} } func (m *SPIFFERoleCondition) String() string { return proto.CompactTextString(m) } func (*SPIFFERoleCondition) ProtoMessage() {} func (*SPIFFERoleCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{131} + return fileDescriptor_9198ee693835762e, []int{132} } func (m *SPIFFERoleCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8869,7 +8925,7 @@ func (m *DatabasePermission) Reset() { *m = DatabasePermission{} } func (m *DatabasePermission) String() string { return proto.CompactTextString(m) } func (*DatabasePermission) ProtoMessage() {} func (*DatabasePermission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{132} + return fileDescriptor_9198ee693835762e, []int{133} } func (m *DatabasePermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8919,7 +8975,7 @@ func (m *KubernetesResource) Reset() { *m = KubernetesResource{} } func (m *KubernetesResource) String() string { return proto.CompactTextString(m) } func (*KubernetesResource) ProtoMessage() {} func (*KubernetesResource) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{133} + return fileDescriptor_9198ee693835762e, []int{134} } func (m *KubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8972,7 +9028,7 @@ func (m *SessionRequirePolicy) Reset() { *m = SessionRequirePolicy{} } func (m *SessionRequirePolicy) String() string { return proto.CompactTextString(m) } func (*SessionRequirePolicy) ProtoMessage() {} func (*SessionRequirePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{134} + return fileDescriptor_9198ee693835762e, []int{135} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9020,7 +9076,7 @@ func (m *SessionJoinPolicy) Reset() { *m = SessionJoinPolicy{} } func (m *SessionJoinPolicy) String() string { return proto.CompactTextString(m) } func (*SessionJoinPolicy) ProtoMessage() {} func (*SessionJoinPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{135} + return fileDescriptor_9198ee693835762e, []int{136} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9096,7 +9152,7 @@ func (m *AccessRequestConditions) Reset() { *m = AccessRequestConditions func (m *AccessRequestConditions) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditions) ProtoMessage() {} func (*AccessRequestConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{136} + return fileDescriptor_9198ee693835762e, []int{137} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9142,7 +9198,7 @@ func (m *AccessRequestConditionsReason) Reset() { *m = AccessRequestCond func (m *AccessRequestConditionsReason) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditionsReason) ProtoMessage() {} func (*AccessRequestConditionsReason) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{137} + return fileDescriptor_9198ee693835762e, []int{138} } func (m *AccessRequestConditionsReason) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9195,7 +9251,7 @@ func (m *AccessReviewConditions) Reset() { *m = AccessReviewConditions{} func (m *AccessReviewConditions) String() string { return proto.CompactTextString(m) } func (*AccessReviewConditions) ProtoMessage() {} func (*AccessReviewConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{138} + return fileDescriptor_9198ee693835762e, []int{139} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9237,7 +9293,7 @@ func (m *AccessRequestAllowedPromotion) Reset() { *m = AccessRequestAllo func (m *AccessRequestAllowedPromotion) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotion) ProtoMessage() {} func (*AccessRequestAllowedPromotion) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{139} + return fileDescriptor_9198ee693835762e, []int{140} } func (m *AccessRequestAllowedPromotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9280,7 +9336,7 @@ func (m *AccessRequestAllowedPromotions) Reset() { *m = AccessRequestAll func (m *AccessRequestAllowedPromotions) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotions) ProtoMessage() {} func (*AccessRequestAllowedPromotions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{140} + return fileDescriptor_9198ee693835762e, []int{141} } func (m *AccessRequestAllowedPromotions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9326,7 +9382,7 @@ func (m *ClaimMapping) Reset() { *m = ClaimMapping{} } func (m *ClaimMapping) String() string { return proto.CompactTextString(m) } func (*ClaimMapping) ProtoMessage() {} func (*ClaimMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{141} + return fileDescriptor_9198ee693835762e, []int{142} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9372,7 +9428,7 @@ func (m *TraitMapping) Reset() { *m = TraitMapping{} } func (m *TraitMapping) String() string { return proto.CompactTextString(m) } func (*TraitMapping) ProtoMessage() {} func (*TraitMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{142} + return fileDescriptor_9198ee693835762e, []int{143} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9421,7 +9477,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{143} + return fileDescriptor_9198ee693835762e, []int{144} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9469,7 +9525,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{144} + return fileDescriptor_9198ee693835762e, []int{145} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9511,7 +9567,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{145} + return fileDescriptor_9198ee693835762e, []int{146} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9553,7 +9609,7 @@ func (m *UserFilter) Reset() { *m = UserFilter{} } func (m *UserFilter) String() string { return proto.CompactTextString(m) } func (*UserFilter) ProtoMessage() {} func (*UserFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{146} + return fileDescriptor_9198ee693835762e, []int{147} } func (m *UserFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9604,7 +9660,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{147} + return fileDescriptor_9198ee693835762e, []int{148} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9653,7 +9709,7 @@ func (m *UserStatusV2) Reset() { *m = UserStatusV2{} } func (m *UserStatusV2) String() string { return proto.CompactTextString(m) } func (*UserStatusV2) ProtoMessage() {} func (*UserStatusV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{148} + return fileDescriptor_9198ee693835762e, []int{149} } func (m *UserStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9727,7 +9783,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{149} + return fileDescriptor_9198ee693835762e, []int{150} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9774,7 +9830,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{150} + return fileDescriptor_9198ee693835762e, []int{151} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9822,7 +9878,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{151} + return fileDescriptor_9198ee693835762e, []int{152} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9867,7 +9923,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{152} + return fileDescriptor_9198ee693835762e, []int{153} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9916,7 +9972,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{153} + return fileDescriptor_9198ee693835762e, []int{154} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9973,7 +10029,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{154} + return fileDescriptor_9198ee693835762e, []int{155} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10083,7 +10139,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{155} + return fileDescriptor_9198ee693835762e, []int{156} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10129,7 +10185,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{156} + return fileDescriptor_9198ee693835762e, []int{157} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10211,7 +10267,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{157} + return fileDescriptor_9198ee693835762e, []int{158} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10257,7 +10313,7 @@ func (m *SSOMFADevice) Reset() { *m = SSOMFADevice{} } func (m *SSOMFADevice) String() string { return proto.CompactTextString(m) } func (*SSOMFADevice) ProtoMessage() {} func (*SSOMFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{158} + return fileDescriptor_9198ee693835762e, []int{159} } func (m *SSOMFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10300,7 +10356,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{159} + return fileDescriptor_9198ee693835762e, []int{160} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10346,7 +10402,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{160} + return fileDescriptor_9198ee693835762e, []int{161} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10388,7 +10444,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{161} + return fileDescriptor_9198ee693835762e, []int{162} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10438,7 +10494,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{162} + return fileDescriptor_9198ee693835762e, []int{163} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10485,7 +10541,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{163} + return fileDescriptor_9198ee693835762e, []int{164} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10534,7 +10590,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{164} + return fileDescriptor_9198ee693835762e, []int{165} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10582,7 +10638,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{165} + return fileDescriptor_9198ee693835762e, []int{166} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10630,7 +10686,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{166} + return fileDescriptor_9198ee693835762e, []int{167} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10681,7 +10737,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{167} + return fileDescriptor_9198ee693835762e, []int{168} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10729,7 +10785,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{168} + return fileDescriptor_9198ee693835762e, []int{169} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10775,7 +10831,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{169} + return fileDescriptor_9198ee693835762e, []int{170} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10824,7 +10880,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{170} + return fileDescriptor_9198ee693835762e, []int{171} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10866,7 +10922,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{171} + return fileDescriptor_9198ee693835762e, []int{172} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10915,7 +10971,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{172} + return fileDescriptor_9198ee693835762e, []int{173} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11000,7 +11056,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{173} + return fileDescriptor_9198ee693835762e, []int{174} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11045,7 +11101,7 @@ func (m *DeviceWebToken) Reset() { *m = DeviceWebToken{} } func (m *DeviceWebToken) String() string { return proto.CompactTextString(m) } func (*DeviceWebToken) ProtoMessage() {} func (*DeviceWebToken) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{174} + return fileDescriptor_9198ee693835762e, []int{175} } func (m *DeviceWebToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11087,7 +11143,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{175} + return fileDescriptor_9198ee693835762e, []int{176} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11158,7 +11214,7 @@ func (m *SAMLSessionData) Reset() { *m = SAMLSessionData{} } func (m *SAMLSessionData) String() string { return proto.CompactTextString(m) } func (*SAMLSessionData) ProtoMessage() {} func (*SAMLSessionData) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{176} + return fileDescriptor_9198ee693835762e, []int{177} } func (m *SAMLSessionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11207,7 +11263,7 @@ func (m *SAMLAttribute) Reset() { *m = SAMLAttribute{} } func (m *SAMLAttribute) String() string { return proto.CompactTextString(m) } func (*SAMLAttribute) ProtoMessage() {} func (*SAMLAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{177} + return fileDescriptor_9198ee693835762e, []int{178} } func (m *SAMLAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11254,7 +11310,7 @@ func (m *SAMLAttributeValue) Reset() { *m = SAMLAttributeValue{} } func (m *SAMLAttributeValue) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeValue) ProtoMessage() {} func (*SAMLAttributeValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{178} + return fileDescriptor_9198ee693835762e, []int{179} } func (m *SAMLAttributeValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11305,7 +11361,7 @@ func (m *SAMLNameID) Reset() { *m = SAMLNameID{} } func (m *SAMLNameID) String() string { return proto.CompactTextString(m) } func (*SAMLNameID) ProtoMessage() {} func (*SAMLNameID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{179} + return fileDescriptor_9198ee693835762e, []int{180} } func (m *SAMLNameID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11354,7 +11410,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{180} + return fileDescriptor_9198ee693835762e, []int{181} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11398,7 +11454,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{181} + return fileDescriptor_9198ee693835762e, []int{182} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11448,7 +11504,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{182} + return fileDescriptor_9198ee693835762e, []int{183} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11497,7 +11553,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{183} + return fileDescriptor_9198ee693835762e, []int{184} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11548,7 +11604,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{184} + return fileDescriptor_9198ee693835762e, []int{185} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11596,7 +11652,7 @@ func (m *KubeAzure) Reset() { *m = KubeAzure{} } func (m *KubeAzure) String() string { return proto.CompactTextString(m) } func (*KubeAzure) ProtoMessage() {} func (*KubeAzure) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{185} + return fileDescriptor_9198ee693835762e, []int{186} } func (m *KubeAzure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11642,7 +11698,7 @@ func (m *KubeAWS) Reset() { *m = KubeAWS{} } func (m *KubeAWS) String() string { return proto.CompactTextString(m) } func (*KubeAWS) ProtoMessage() {} func (*KubeAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{186} + return fileDescriptor_9198ee693835762e, []int{187} } func (m *KubeAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11688,7 +11744,7 @@ func (m *KubeGCP) Reset() { *m = KubeGCP{} } func (m *KubeGCP) String() string { return proto.CompactTextString(m) } func (*KubeGCP) ProtoMessage() {} func (*KubeGCP) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{187} + return fileDescriptor_9198ee693835762e, []int{188} } func (m *KubeGCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11730,7 +11786,7 @@ func (m *KubernetesClusterV3List) Reset() { *m = KubernetesClusterV3List func (m *KubernetesClusterV3List) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterV3List) ProtoMessage() {} func (*KubernetesClusterV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{188} + return fileDescriptor_9198ee693835762e, []int{189} } func (m *KubernetesClusterV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11779,7 +11835,7 @@ type KubernetesServerV3 struct { func (m *KubernetesServerV3) Reset() { *m = KubernetesServerV3{} } func (*KubernetesServerV3) ProtoMessage() {} func (*KubernetesServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{189} + return fileDescriptor_9198ee693835762e, []int{190} } func (m *KubernetesServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11831,7 +11887,7 @@ func (m *KubernetesServerSpecV3) Reset() { *m = KubernetesServerSpecV3{} func (m *KubernetesServerSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesServerSpecV3) ProtoMessage() {} func (*KubernetesServerSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{190} + return fileDescriptor_9198ee693835762e, []int{191} } func (m *KubernetesServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11883,7 +11939,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{191} + return fileDescriptor_9198ee693835762e, []int{192} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11927,7 +11983,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{192} + return fileDescriptor_9198ee693835762e, []int{193} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11971,7 +12027,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{193} + return fileDescriptor_9198ee693835762e, []int{194} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12015,7 +12071,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{194} + return fileDescriptor_9198ee693835762e, []int{195} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12059,7 +12115,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{195} + return fileDescriptor_9198ee693835762e, []int{196} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12103,7 +12159,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{196} + return fileDescriptor_9198ee693835762e, []int{197} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12145,7 +12201,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{197} + return fileDescriptor_9198ee693835762e, []int{198} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12189,7 +12245,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{198} + return fileDescriptor_9198ee693835762e, []int{199} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12231,7 +12287,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{199} + return fileDescriptor_9198ee693835762e, []int{200} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12275,7 +12331,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{200} + return fileDescriptor_9198ee693835762e, []int{201} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12317,7 +12373,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{201} + return fileDescriptor_9198ee693835762e, []int{202} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12368,7 +12424,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{202} + return fileDescriptor_9198ee693835762e, []int{203} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12410,7 +12466,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{203} + return fileDescriptor_9198ee693835762e, []int{204} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12498,7 +12554,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{204} + return fileDescriptor_9198ee693835762e, []int{205} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12540,7 +12596,7 @@ func (m *MaxAge) Reset() { *m = MaxAge{} } func (m *MaxAge) String() string { return proto.CompactTextString(m) } func (*MaxAge) ProtoMessage() {} func (*MaxAge) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{205} + return fileDescriptor_9198ee693835762e, []int{206} } func (m *MaxAge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12585,7 +12641,7 @@ func (m *SSOClientRedirectSettings) Reset() { *m = SSOClientRedirectSett func (m *SSOClientRedirectSettings) String() string { return proto.CompactTextString(m) } func (*SSOClientRedirectSettings) ProtoMessage() {} func (*SSOClientRedirectSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{206} + return fileDescriptor_9198ee693835762e, []int{207} } func (m *SSOClientRedirectSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12642,7 +12698,7 @@ func (m *OIDCConnectorMFASettings) Reset() { *m = OIDCConnectorMFASettin func (m *OIDCConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorMFASettings) ProtoMessage() {} func (*OIDCConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{207} + return fileDescriptor_9198ee693835762e, []int{208} } func (m *OIDCConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12744,7 +12800,7 @@ func (m *OIDCAuthRequest) Reset() { *m = OIDCAuthRequest{} } func (m *OIDCAuthRequest) String() string { return proto.CompactTextString(m) } func (*OIDCAuthRequest) ProtoMessage() {} func (*OIDCAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{208} + return fileDescriptor_9198ee693835762e, []int{209} } func (m *OIDCAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12795,7 +12851,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{209} + return fileDescriptor_9198ee693835762e, []int{210} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12837,7 +12893,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{210} + return fileDescriptor_9198ee693835762e, []int{211} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12919,7 +12975,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{211} + return fileDescriptor_9198ee693835762e, []int{212} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12978,7 +13034,7 @@ func (m *SAMLConnectorMFASettings) Reset() { *m = SAMLConnectorMFASettin func (m *SAMLConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorMFASettings) ProtoMessage() {} func (*SAMLConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{212} + return fileDescriptor_9198ee693835762e, []int{213} } func (m *SAMLConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13074,7 +13130,7 @@ func (m *SAMLAuthRequest) Reset() { *m = SAMLAuthRequest{} } func (m *SAMLAuthRequest) String() string { return proto.CompactTextString(m) } func (*SAMLAuthRequest) ProtoMessage() {} func (*SAMLAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{213} + return fileDescriptor_9198ee693835762e, []int{214} } func (m *SAMLAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13120,7 +13176,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{214} + return fileDescriptor_9198ee693835762e, []int{215} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13165,7 +13221,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{215} + return fileDescriptor_9198ee693835762e, []int{216} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13216,7 +13272,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{216} + return fileDescriptor_9198ee693835762e, []int{217} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13258,7 +13314,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{217} + return fileDescriptor_9198ee693835762e, []int{218} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13321,7 +13377,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{218} + return fileDescriptor_9198ee693835762e, []int{219} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13414,7 +13470,7 @@ func (m *GithubAuthRequest) Reset() { *m = GithubAuthRequest{} } func (m *GithubAuthRequest) String() string { return proto.CompactTextString(m) } func (*GithubAuthRequest) ProtoMessage() {} func (*GithubAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{219} + return fileDescriptor_9198ee693835762e, []int{220} } func (m *GithubAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13458,7 +13514,7 @@ func (m *SSOWarnings) Reset() { *m = SSOWarnings{} } func (m *SSOWarnings) String() string { return proto.CompactTextString(m) } func (*SSOWarnings) ProtoMessage() {} func (*SSOWarnings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{220} + return fileDescriptor_9198ee693835762e, []int{221} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13514,7 +13570,7 @@ func (m *CreateUserParams) Reset() { *m = CreateUserParams{} } func (m *CreateUserParams) String() string { return proto.CompactTextString(m) } func (*CreateUserParams) ProtoMessage() {} func (*CreateUserParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{221} + return fileDescriptor_9198ee693835762e, []int{222} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13599,7 +13655,7 @@ func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } func (*SSODiagnosticInfo) ProtoMessage() {} func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{222} + return fileDescriptor_9198ee693835762e, []int{223} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13643,7 +13699,7 @@ func (m *GithubTokenInfo) Reset() { *m = GithubTokenInfo{} } func (m *GithubTokenInfo) String() string { return proto.CompactTextString(m) } func (*GithubTokenInfo) ProtoMessage() {} func (*GithubTokenInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{223} + return fileDescriptor_9198ee693835762e, []int{224} } func (m *GithubTokenInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13689,7 +13745,7 @@ func (m *GithubClaims) Reset() { *m = GithubClaims{} } func (m *GithubClaims) String() string { return proto.CompactTextString(m) } func (*GithubClaims) ProtoMessage() {} func (*GithubClaims) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{224} + return fileDescriptor_9198ee693835762e, []int{225} } func (m *GithubClaims) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13741,7 +13797,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{225} + return fileDescriptor_9198ee693835762e, []int{226} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13787,7 +13843,7 @@ func (m *TeamRolesMapping) Reset() { *m = TeamRolesMapping{} } func (m *TeamRolesMapping) String() string { return proto.CompactTextString(m) } func (*TeamRolesMapping) ProtoMessage() {} func (*TeamRolesMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{226} + return fileDescriptor_9198ee693835762e, []int{227} } func (m *TeamRolesMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13837,7 +13893,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{227} + return fileDescriptor_9198ee693835762e, []int{228} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13879,7 +13935,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{228} + return fileDescriptor_9198ee693835762e, []int{229} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13935,7 +13991,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{229} + return fileDescriptor_9198ee693835762e, []int{230} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13989,7 +14045,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{230} + return fileDescriptor_9198ee693835762e, []int{231} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14039,7 +14095,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{231} + return fileDescriptor_9198ee693835762e, []int{232} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14100,7 +14156,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{232} + return fileDescriptor_9198ee693835762e, []int{233} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14144,7 +14200,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{233} + return fileDescriptor_9198ee693835762e, []int{234} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14187,7 +14243,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{234} + return fileDescriptor_9198ee693835762e, []int{235} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14240,7 +14296,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{235} + return fileDescriptor_9198ee693835762e, []int{236} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14284,7 +14340,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{236} + return fileDescriptor_9198ee693835762e, []int{237} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14332,7 +14388,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{237} + return fileDescriptor_9198ee693835762e, []int{238} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14376,7 +14432,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{238} + return fileDescriptor_9198ee693835762e, []int{239} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14420,7 +14476,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{239} + return fileDescriptor_9198ee693835762e, []int{240} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14473,7 +14529,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{240} + return fileDescriptor_9198ee693835762e, []int{241} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14517,7 +14573,7 @@ func (m *DynamicWindowsDesktopV1) Reset() { *m = DynamicWindowsDesktopV1 func (m *DynamicWindowsDesktopV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopV1) ProtoMessage() {} func (*DynamicWindowsDesktopV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{241} + return fileDescriptor_9198ee693835762e, []int{242} } func (m *DynamicWindowsDesktopV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14568,7 +14624,7 @@ func (m *DynamicWindowsDesktopSpecV1) Reset() { *m = DynamicWindowsDeskt func (m *DynamicWindowsDesktopSpecV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopSpecV1) ProtoMessage() {} func (*DynamicWindowsDesktopSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{242} + return fileDescriptor_9198ee693835762e, []int{243} } func (m *DynamicWindowsDesktopSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14609,7 +14665,7 @@ func (m *Resolution) Reset() { *m = Resolution{} } func (m *Resolution) String() string { return proto.CompactTextString(m) } func (*Resolution) ProtoMessage() {} func (*Resolution) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{243} + return fileDescriptor_9198ee693835762e, []int{244} } func (m *Resolution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14692,7 +14748,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{244} + return fileDescriptor_9198ee693835762e, []int{245} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14746,7 +14802,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{245} + return fileDescriptor_9198ee693835762e, []int{246} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14791,7 +14847,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{246} + return fileDescriptor_9198ee693835762e, []int{247} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14835,7 +14891,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{247} + return fileDescriptor_9198ee693835762e, []int{248} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14875,7 +14931,7 @@ func (m *NullableSessionState) Reset() { *m = NullableSessionState{} } func (m *NullableSessionState) String() string { return proto.CompactTextString(m) } func (*NullableSessionState) ProtoMessage() {} func (*NullableSessionState) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{248} + return fileDescriptor_9198ee693835762e, []int{249} } func (m *NullableSessionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14921,7 +14977,7 @@ func (m *SessionTrackerFilter) Reset() { *m = SessionTrackerFilter{} } func (m *SessionTrackerFilter) String() string { return proto.CompactTextString(m) } func (*SessionTrackerFilter) ProtoMessage() {} func (*SessionTrackerFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{249} + return fileDescriptor_9198ee693835762e, []int{250} } func (m *SessionTrackerFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14965,7 +15021,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{250} + return fileDescriptor_9198ee693835762e, []int{251} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15063,7 +15119,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{251} + return fileDescriptor_9198ee693835762e, []int{252} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15110,7 +15166,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{252} + return fileDescriptor_9198ee693835762e, []int{253} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15158,7 +15214,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{253} + return fileDescriptor_9198ee693835762e, []int{254} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15202,7 +15258,7 @@ func (m *UIConfigV1) Reset() { *m = UIConfigV1{} } func (m *UIConfigV1) String() string { return proto.CompactTextString(m) } func (*UIConfigV1) ProtoMessage() {} func (*UIConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{254} + return fileDescriptor_9198ee693835762e, []int{255} } func (m *UIConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15248,7 +15304,7 @@ func (m *UIConfigSpecV1) Reset() { *m = UIConfigSpecV1{} } func (m *UIConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*UIConfigSpecV1) ProtoMessage() {} func (*UIConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{255} + return fileDescriptor_9198ee693835762e, []int{256} } func (m *UIConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15299,7 +15355,7 @@ func (m *InstallerV1) Reset() { *m = InstallerV1{} } func (m *InstallerV1) String() string { return proto.CompactTextString(m) } func (*InstallerV1) ProtoMessage() {} func (*InstallerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{256} + return fileDescriptor_9198ee693835762e, []int{257} } func (m *InstallerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15341,7 +15397,7 @@ func (m *InstallerSpecV1) Reset() { *m = InstallerSpecV1{} } func (m *InstallerSpecV1) String() string { return proto.CompactTextString(m) } func (*InstallerSpecV1) ProtoMessage() {} func (*InstallerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{257} + return fileDescriptor_9198ee693835762e, []int{258} } func (m *InstallerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15383,7 +15439,7 @@ func (m *InstallerV1List) Reset() { *m = InstallerV1List{} } func (m *InstallerV1List) String() string { return proto.CompactTextString(m) } func (*InstallerV1List) ProtoMessage() {} func (*InstallerV1List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{258} + return fileDescriptor_9198ee693835762e, []int{259} } func (m *InstallerV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15427,7 +15483,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{259} + return fileDescriptor_9198ee693835762e, []int{260} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15473,7 +15529,7 @@ func (m *ConnectionDiagnosticV1) Reset() { *m = ConnectionDiagnosticV1{} func (m *ConnectionDiagnosticV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticV1) ProtoMessage() {} func (*ConnectionDiagnosticV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{260} + return fileDescriptor_9198ee693835762e, []int{261} } func (m *ConnectionDiagnosticV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15523,7 +15579,7 @@ func (m *ConnectionDiagnosticSpecV1) Reset() { *m = ConnectionDiagnostic func (m *ConnectionDiagnosticSpecV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticSpecV1) ProtoMessage() {} func (*ConnectionDiagnosticSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{261} + return fileDescriptor_9198ee693835762e, []int{262} } func (m *ConnectionDiagnosticSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15569,7 +15625,7 @@ func (m *ConnectionDiagnosticTrace) Reset() { *m = ConnectionDiagnosticT func (m *ConnectionDiagnosticTrace) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticTrace) ProtoMessage() {} func (*ConnectionDiagnosticTrace) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{262} + return fileDescriptor_9198ee693835762e, []int{263} } func (m *ConnectionDiagnosticTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15612,7 +15668,7 @@ func (m *DatabaseServiceV1) Reset() { *m = DatabaseServiceV1{} } func (m *DatabaseServiceV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceV1) ProtoMessage() {} func (*DatabaseServiceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{263} + return fileDescriptor_9198ee693835762e, []int{264} } func (m *DatabaseServiceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15656,7 +15712,7 @@ func (m *DatabaseServiceSpecV1) Reset() { *m = DatabaseServiceSpecV1{} } func (m *DatabaseServiceSpecV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceSpecV1) ProtoMessage() {} func (*DatabaseServiceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{264} + return fileDescriptor_9198ee693835762e, []int{265} } func (m *DatabaseServiceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15698,7 +15754,7 @@ func (m *DatabaseResourceMatcher) Reset() { *m = DatabaseResourceMatcher func (m *DatabaseResourceMatcher) String() string { return proto.CompactTextString(m) } func (*DatabaseResourceMatcher) ProtoMessage() {} func (*DatabaseResourceMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{265} + return fileDescriptor_9198ee693835762e, []int{266} } func (m *DatabaseResourceMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15742,7 +15798,7 @@ func (m *ResourceMatcherAWS) Reset() { *m = ResourceMatcherAWS{} } func (m *ResourceMatcherAWS) String() string { return proto.CompactTextString(m) } func (*ResourceMatcherAWS) ProtoMessage() {} func (*ResourceMatcherAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{266} + return fileDescriptor_9198ee693835762e, []int{267} } func (m *ResourceMatcherAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15784,7 +15840,7 @@ func (m *ClusterAlert) Reset() { *m = ClusterAlert{} } func (m *ClusterAlert) String() string { return proto.CompactTextString(m) } func (*ClusterAlert) ProtoMessage() {} func (*ClusterAlert) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{267} + return fileDescriptor_9198ee693835762e, []int{268} } func (m *ClusterAlert) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15830,7 +15886,7 @@ func (m *ClusterAlertSpec) Reset() { *m = ClusterAlertSpec{} } func (m *ClusterAlertSpec) String() string { return proto.CompactTextString(m) } func (*ClusterAlertSpec) ProtoMessage() {} func (*ClusterAlertSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{268} + return fileDescriptor_9198ee693835762e, []int{269} } func (m *ClusterAlertSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15883,7 +15939,7 @@ func (m *GetClusterAlertsRequest) Reset() { *m = GetClusterAlertsRequest func (m *GetClusterAlertsRequest) String() string { return proto.CompactTextString(m) } func (*GetClusterAlertsRequest) ProtoMessage() {} func (*GetClusterAlertsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{269} + return fileDescriptor_9198ee693835762e, []int{270} } func (m *GetClusterAlertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15933,7 +15989,7 @@ func (m *AlertAcknowledgement) Reset() { *m = AlertAcknowledgement{} } func (m *AlertAcknowledgement) String() string { return proto.CompactTextString(m) } func (*AlertAcknowledgement) ProtoMessage() {} func (*AlertAcknowledgement) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{270} + return fileDescriptor_9198ee693835762e, []int{271} } func (m *AlertAcknowledgement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15985,7 +16041,7 @@ func (m *Release) Reset() { *m = Release{} } func (m *Release) String() string { return proto.CompactTextString(m) } func (*Release) ProtoMessage() {} func (*Release) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{271} + return fileDescriptor_9198ee693835762e, []int{272} } func (m *Release) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16043,7 +16099,7 @@ func (m *Asset) Reset() { *m = Asset{} } func (m *Asset) String() string { return proto.CompactTextString(m) } func (*Asset) ProtoMessage() {} func (*Asset) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{272} + return fileDescriptor_9198ee693835762e, []int{273} } func (m *Asset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16096,7 +16152,7 @@ func (m *PluginV1) Reset() { *m = PluginV1{} } func (m *PluginV1) String() string { return proto.CompactTextString(m) } func (*PluginV1) ProtoMessage() {} func (*PluginV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{273} + return fileDescriptor_9198ee693835762e, []int{274} } func (m *PluginV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16163,7 +16219,7 @@ func (m *PluginSpecV1) Reset() { *m = PluginSpecV1{} } func (m *PluginSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginSpecV1) ProtoMessage() {} func (*PluginSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{274} + return fileDescriptor_9198ee693835762e, []int{275} } func (m *PluginSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16429,7 +16485,7 @@ func (m *PluginSlackAccessSettings) Reset() { *m = PluginSlackAccessSett func (m *PluginSlackAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginSlackAccessSettings) ProtoMessage() {} func (*PluginSlackAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{275} + return fileDescriptor_9198ee693835762e, []int{276} } func (m *PluginSlackAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16470,7 +16526,7 @@ func (m *PluginGitlabSettings) Reset() { *m = PluginGitlabSettings{} } func (m *PluginGitlabSettings) String() string { return proto.CompactTextString(m) } func (*PluginGitlabSettings) ProtoMessage() {} func (*PluginGitlabSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{276} + return fileDescriptor_9198ee693835762e, []int{277} } func (m *PluginGitlabSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16517,7 +16573,7 @@ func (m *PluginOpsgenieAccessSettings) Reset() { *m = PluginOpsgenieAcce func (m *PluginOpsgenieAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginOpsgenieAccessSettings) ProtoMessage() {} func (*PluginOpsgenieAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{277} + return fileDescriptor_9198ee693835762e, []int{278} } func (m *PluginOpsgenieAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16565,7 +16621,7 @@ func (m *PluginServiceNowSettings) Reset() { *m = PluginServiceNowSettin func (m *PluginServiceNowSettings) String() string { return proto.CompactTextString(m) } func (*PluginServiceNowSettings) ProtoMessage() {} func (*PluginServiceNowSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{278} + return fileDescriptor_9198ee693835762e, []int{279} } func (m *PluginServiceNowSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16611,7 +16667,7 @@ func (m *PluginPagerDutySettings) Reset() { *m = PluginPagerDutySettings func (m *PluginPagerDutySettings) String() string { return proto.CompactTextString(m) } func (*PluginPagerDutySettings) ProtoMessage() {} func (*PluginPagerDutySettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{279} + return fileDescriptor_9198ee693835762e, []int{280} } func (m *PluginPagerDutySettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16657,7 +16713,7 @@ func (m *PluginJiraSettings) Reset() { *m = PluginJiraSettings{} } func (m *PluginJiraSettings) String() string { return proto.CompactTextString(m) } func (*PluginJiraSettings) ProtoMessage() {} func (*PluginJiraSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{280} + return fileDescriptor_9198ee693835762e, []int{281} } func (m *PluginJiraSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16697,7 +16753,7 @@ func (m *PluginOpenAISettings) Reset() { *m = PluginOpenAISettings{} } func (m *PluginOpenAISettings) String() string { return proto.CompactTextString(m) } func (*PluginOpenAISettings) ProtoMessage() {} func (*PluginOpenAISettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{281} + return fileDescriptor_9198ee693835762e, []int{282} } func (m *PluginOpenAISettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16748,7 +16804,7 @@ func (m *PluginMattermostSettings) Reset() { *m = PluginMattermostSettin func (m *PluginMattermostSettings) String() string { return proto.CompactTextString(m) } func (*PluginMattermostSettings) ProtoMessage() {} func (*PluginMattermostSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{282} + return fileDescriptor_9198ee693835762e, []int{283} } func (m *PluginMattermostSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16790,7 +16846,7 @@ func (m *PluginJamfSettings) Reset() { *m = PluginJamfSettings{} } func (m *PluginJamfSettings) String() string { return proto.CompactTextString(m) } func (*PluginJamfSettings) ProtoMessage() {} func (*PluginJamfSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{283} + return fileDescriptor_9198ee693835762e, []int{284} } func (m *PluginJamfSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16842,7 +16898,7 @@ func (m *PluginOktaSettings) Reset() { *m = PluginOktaSettings{} } func (m *PluginOktaSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSettings) ProtoMessage() {} func (*PluginOktaSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{284} + return fileDescriptor_9198ee693835762e, []int{285} } func (m *PluginOktaSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16889,7 +16945,7 @@ func (m *PluginOktaCredentialsInfo) Reset() { *m = PluginOktaCredentials func (m *PluginOktaCredentialsInfo) String() string { return proto.CompactTextString(m) } func (*PluginOktaCredentialsInfo) ProtoMessage() {} func (*PluginOktaCredentialsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{285} + return fileDescriptor_9198ee693835762e, []int{286} } func (m *PluginOktaCredentialsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16973,7 +17029,7 @@ func (m *PluginOktaSyncSettings) Reset() { *m = PluginOktaSyncSettings{} func (m *PluginOktaSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSyncSettings) ProtoMessage() {} func (*PluginOktaSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{286} + return fileDescriptor_9198ee693835762e, []int{287} } func (m *PluginOktaSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17014,7 +17070,7 @@ func (m *DiscordChannels) Reset() { *m = DiscordChannels{} } func (m *DiscordChannels) String() string { return proto.CompactTextString(m) } func (*DiscordChannels) ProtoMessage() {} func (*DiscordChannels) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{287} + return fileDescriptor_9198ee693835762e, []int{288} } func (m *DiscordChannels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17058,7 +17114,7 @@ func (m *PluginDiscordSettings) Reset() { *m = PluginDiscordSettings{} } func (m *PluginDiscordSettings) String() string { return proto.CompactTextString(m) } func (*PluginDiscordSettings) ProtoMessage() {} func (*PluginDiscordSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{288} + return fileDescriptor_9198ee693835762e, []int{289} } func (m *PluginDiscordSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17103,7 +17159,7 @@ func (m *PluginEntraIDSettings) Reset() { *m = PluginEntraIDSettings{} } func (m *PluginEntraIDSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSettings) ProtoMessage() {} func (*PluginEntraIDSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{289} + return fileDescriptor_9198ee693835762e, []int{290} } func (m *PluginEntraIDSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17157,7 +17213,7 @@ func (m *PluginEntraIDSyncSettings) Reset() { *m = PluginEntraIDSyncSett func (m *PluginEntraIDSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSyncSettings) ProtoMessage() {} func (*PluginEntraIDSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{290} + return fileDescriptor_9198ee693835762e, []int{291} } func (m *PluginEntraIDSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17202,7 +17258,7 @@ func (m *PluginEntraIDAccessGraphSettings) Reset() { *m = PluginEntraIDA func (m *PluginEntraIDAccessGraphSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAccessGraphSettings) ProtoMessage() {} func (*PluginEntraIDAccessGraphSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{291} + return fileDescriptor_9198ee693835762e, []int{292} } func (m *PluginEntraIDAccessGraphSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17248,7 +17304,7 @@ func (m *PluginEntraIDAppSSOSettings) Reset() { *m = PluginEntraIDAppSSO func (m *PluginEntraIDAppSSOSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAppSSOSettings) ProtoMessage() {} func (*PluginEntraIDAppSSOSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{292} + return fileDescriptor_9198ee693835762e, []int{293} } func (m *PluginEntraIDAppSSOSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17294,7 +17350,7 @@ func (m *PluginSCIMSettings) Reset() { *m = PluginSCIMSettings{} } func (m *PluginSCIMSettings) String() string { return proto.CompactTextString(m) } func (*PluginSCIMSettings) ProtoMessage() {} func (*PluginSCIMSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{293} + return fileDescriptor_9198ee693835762e, []int{294} } func (m *PluginSCIMSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17338,7 +17394,7 @@ func (m *PluginDatadogAccessSettings) Reset() { *m = PluginDatadogAccess func (m *PluginDatadogAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginDatadogAccessSettings) ProtoMessage() {} func (*PluginDatadogAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{294} + return fileDescriptor_9198ee693835762e, []int{295} } func (m *PluginDatadogAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17393,7 +17449,7 @@ func (m *PluginAWSICSettings) Reset() { *m = PluginAWSICSettings{} } func (m *PluginAWSICSettings) String() string { return proto.CompactTextString(m) } func (*PluginAWSICSettings) ProtoMessage() {} func (*PluginAWSICSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{295} + return fileDescriptor_9198ee693835762e, []int{296} } func (m *PluginAWSICSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17440,7 +17496,7 @@ func (m *AWSICProvisioningSpec) Reset() { *m = AWSICProvisioningSpec{} } func (m *AWSICProvisioningSpec) String() string { return proto.CompactTextString(m) } func (*AWSICProvisioningSpec) ProtoMessage() {} func (*AWSICProvisioningSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{296} + return fileDescriptor_9198ee693835762e, []int{297} } func (m *AWSICProvisioningSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17482,7 +17538,7 @@ func (m *PluginAWSICStatusV1) Reset() { *m = PluginAWSICStatusV1{} } func (m *PluginAWSICStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginAWSICStatusV1) ProtoMessage() {} func (*PluginAWSICStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{297} + return fileDescriptor_9198ee693835762e, []int{298} } func (m *PluginAWSICStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17527,7 +17583,7 @@ func (m *AWSICGroupImportStatus) Reset() { *m = AWSICGroupImportStatus{} func (m *AWSICGroupImportStatus) String() string { return proto.CompactTextString(m) } func (*AWSICGroupImportStatus) ProtoMessage() {} func (*AWSICGroupImportStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{298} + return fileDescriptor_9198ee693835762e, []int{299} } func (m *AWSICGroupImportStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17578,7 +17634,7 @@ func (m *PluginEmailSettings) Reset() { *m = PluginEmailSettings{} } func (m *PluginEmailSettings) String() string { return proto.CompactTextString(m) } func (*PluginEmailSettings) ProtoMessage() {} func (*PluginEmailSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{299} + return fileDescriptor_9198ee693835762e, []int{300} } func (m *PluginEmailSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17666,7 +17722,7 @@ func (m *MailgunSpec) Reset() { *m = MailgunSpec{} } func (m *MailgunSpec) String() string { return proto.CompactTextString(m) } func (*MailgunSpec) ProtoMessage() {} func (*MailgunSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{300} + return fileDescriptor_9198ee693835762e, []int{301} } func (m *MailgunSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17713,7 +17769,7 @@ func (m *SMTPSpec) Reset() { *m = SMTPSpec{} } func (m *SMTPSpec) String() string { return proto.CompactTextString(m) } func (*SMTPSpec) ProtoMessage() {} func (*SMTPSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{301} + return fileDescriptor_9198ee693835762e, []int{302} } func (m *SMTPSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17763,7 +17819,7 @@ func (m *PluginMSTeamsSettings) Reset() { *m = PluginMSTeamsSettings{} } func (m *PluginMSTeamsSettings) String() string { return proto.CompactTextString(m) } func (*PluginMSTeamsSettings) ProtoMessage() {} func (*PluginMSTeamsSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{302} + return fileDescriptor_9198ee693835762e, []int{303} } func (m *PluginMSTeamsSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17808,7 +17864,7 @@ func (m *PluginBootstrapCredentialsV1) Reset() { *m = PluginBootstrapCre func (m *PluginBootstrapCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginBootstrapCredentialsV1) ProtoMessage() {} func (*PluginBootstrapCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{303} + return fileDescriptor_9198ee693835762e, []int{304} } func (m *PluginBootstrapCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17908,7 +17964,7 @@ func (m *PluginIdSecretCredential) Reset() { *m = PluginIdSecretCredenti func (m *PluginIdSecretCredential) String() string { return proto.CompactTextString(m) } func (*PluginIdSecretCredential) ProtoMessage() {} func (*PluginIdSecretCredential) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{304} + return fileDescriptor_9198ee693835762e, []int{305} } func (m *PluginIdSecretCredential) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17951,7 +18007,7 @@ func (m *PluginOAuth2AuthorizationCodeCredentials) Reset() { func (m *PluginOAuth2AuthorizationCodeCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AuthorizationCodeCredentials) ProtoMessage() {} func (*PluginOAuth2AuthorizationCodeCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{305} + return fileDescriptor_9198ee693835762e, []int{306} } func (m *PluginOAuth2AuthorizationCodeCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18010,7 +18066,7 @@ func (m *PluginStatusV1) Reset() { *m = PluginStatusV1{} } func (m *PluginStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginStatusV1) ProtoMessage() {} func (*PluginStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{306} + return fileDescriptor_9198ee693835762e, []int{307} } func (m *PluginStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18125,7 +18181,7 @@ func (m *PluginGitlabStatusV1) Reset() { *m = PluginGitlabStatusV1{} } func (m *PluginGitlabStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginGitlabStatusV1) ProtoMessage() {} func (*PluginGitlabStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{307} + return fileDescriptor_9198ee693835762e, []int{308} } func (m *PluginGitlabStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18169,7 +18225,7 @@ func (m *PluginEntraIDStatusV1) Reset() { *m = PluginEntraIDStatusV1{} } func (m *PluginEntraIDStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDStatusV1) ProtoMessage() {} func (*PluginEntraIDStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{308} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *PluginEntraIDStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18223,7 +18279,7 @@ func (m *PluginOktaStatusV1) Reset() { *m = PluginOktaStatusV1{} } func (m *PluginOktaStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusV1) ProtoMessage() {} func (*PluginOktaStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{309} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *PluginOktaStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18271,7 +18327,7 @@ func (m *PluginOktaStatusDetailsSSO) Reset() { *m = PluginOktaStatusDeta func (m *PluginOktaStatusDetailsSSO) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSSO) ProtoMessage() {} func (*PluginOktaStatusDetailsSSO) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{310} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *PluginOktaStatusDetailsSSO) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18328,7 +18384,7 @@ func (m *PluginOktaStatusDetailsAppGroupSync) Reset() { *m = PluginOktaS func (m *PluginOktaStatusDetailsAppGroupSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAppGroupSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAppGroupSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{311} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *PluginOktaStatusDetailsAppGroupSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18382,7 +18438,7 @@ func (m *PluginOktaStatusDetailsUsersSync) Reset() { *m = PluginOktaStat func (m *PluginOktaStatusDetailsUsersSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsUsersSync) ProtoMessage() {} func (*PluginOktaStatusDetailsUsersSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{312} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *PluginOktaStatusDetailsUsersSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18425,7 +18481,7 @@ func (m *PluginOktaStatusDetailsSCIM) Reset() { *m = PluginOktaStatusDet func (m *PluginOktaStatusDetailsSCIM) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSCIM) ProtoMessage() {} func (*PluginOktaStatusDetailsSCIM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{313} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *PluginOktaStatusDetailsSCIM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18487,7 +18543,7 @@ func (m *PluginOktaStatusDetailsAccessListsSync) Reset() { func (m *PluginOktaStatusDetailsAccessListsSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAccessListsSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAccessListsSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{314} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *PluginOktaStatusDetailsAccessListsSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18535,7 +18591,7 @@ func (m *PluginCredentialsV1) Reset() { *m = PluginCredentialsV1{} } func (m *PluginCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginCredentialsV1) ProtoMessage() {} func (*PluginCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{315} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *PluginCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18646,7 +18702,7 @@ func (m *PluginOAuth2AccessTokenCredentials) Reset() { *m = PluginOAuth2 func (m *PluginOAuth2AccessTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AccessTokenCredentials) ProtoMessage() {} func (*PluginOAuth2AccessTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{316} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *PluginOAuth2AccessTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18687,7 +18743,7 @@ func (m *PluginBearerTokenCredentials) Reset() { *m = PluginBearerTokenC func (m *PluginBearerTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginBearerTokenCredentials) ProtoMessage() {} func (*PluginBearerTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{317} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *PluginBearerTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18729,7 +18785,7 @@ func (m *PluginStaticCredentialsRef) Reset() { *m = PluginStaticCredenti func (m *PluginStaticCredentialsRef) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsRef) ProtoMessage() {} func (*PluginStaticCredentialsRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{318} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *PluginStaticCredentialsRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18771,7 +18827,7 @@ func (m *PluginListV1) Reset() { *m = PluginListV1{} } func (m *PluginListV1) String() string { return proto.CompactTextString(m) } func (*PluginListV1) ProtoMessage() {} func (*PluginListV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{319} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *PluginListV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18814,7 +18870,7 @@ type PluginStaticCredentialsV1 struct { func (m *PluginStaticCredentialsV1) Reset() { *m = PluginStaticCredentialsV1{} } func (*PluginStaticCredentialsV1) ProtoMessage() {} func (*PluginStaticCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{320} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *PluginStaticCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18861,7 +18917,7 @@ func (m *PluginStaticCredentialsSpecV1) Reset() { *m = PluginStaticCrede func (m *PluginStaticCredentialsSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsSpecV1) ProtoMessage() {} func (*PluginStaticCredentialsSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{321} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *PluginStaticCredentialsSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18976,7 +19032,7 @@ func (m *PluginStaticCredentialsBasicAuth) Reset() { *m = PluginStaticCr func (m *PluginStaticCredentialsBasicAuth) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsBasicAuth) ProtoMessage() {} func (*PluginStaticCredentialsBasicAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{322} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *PluginStaticCredentialsBasicAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19022,7 +19078,7 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Reset() { func (m *PluginStaticCredentialsOAuthClientSecret) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsOAuthClientSecret) ProtoMessage() {} func (*PluginStaticCredentialsOAuthClientSecret) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{323} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *PluginStaticCredentialsOAuthClientSecret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19070,7 +19126,7 @@ func (m *PluginStaticCredentialsSSHCertAuthorities) String() string { } func (*PluginStaticCredentialsSSHCertAuthorities) ProtoMessage() {} func (*PluginStaticCredentialsSSHCertAuthorities) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{324} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19113,7 +19169,7 @@ type SAMLIdPServiceProviderV1 struct { func (m *SAMLIdPServiceProviderV1) Reset() { *m = SAMLIdPServiceProviderV1{} } func (*SAMLIdPServiceProviderV1) ProtoMessage() {} func (*SAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{325} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19184,7 +19240,7 @@ func (m *SAMLIdPServiceProviderSpecV1) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderSpecV1) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderSpecV1) ProtoMessage() {} func (*SAMLIdPServiceProviderSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{326} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19231,7 +19287,7 @@ func (m *SAMLAttributeMapping) Reset() { *m = SAMLAttributeMapping{} } func (m *SAMLAttributeMapping) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeMapping) ProtoMessage() {} func (*SAMLAttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{327} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19273,7 +19329,7 @@ func (m *IdPOptions) Reset() { *m = IdPOptions{} } func (m *IdPOptions) String() string { return proto.CompactTextString(m) } func (*IdPOptions) ProtoMessage() {} func (*IdPOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{328} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19315,7 +19371,7 @@ func (m *IdPSAMLOptions) Reset() { *m = IdPSAMLOptions{} } func (m *IdPSAMLOptions) String() string { return proto.CompactTextString(m) } func (*IdPSAMLOptions) ProtoMessage() {} func (*IdPSAMLOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{329} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19365,7 +19421,7 @@ func (m *KubernetesResourceV1) Reset() { *m = KubernetesResourceV1{} } func (m *KubernetesResourceV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceV1) ProtoMessage() {} func (*KubernetesResourceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{330} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19407,7 +19463,7 @@ func (m *KubernetesResourceSpecV1) Reset() { *m = KubernetesResourceSpec func (m *KubernetesResourceSpecV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceSpecV1) ProtoMessage() {} func (*KubernetesResourceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{331} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19453,7 +19509,7 @@ func (m *ClusterMaintenanceConfigV1) Reset() { *m = ClusterMaintenanceCo func (m *ClusterMaintenanceConfigV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigV1) ProtoMessage() {} func (*ClusterMaintenanceConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{332} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19495,7 +19551,7 @@ func (m *ClusterMaintenanceConfigSpecV1) Reset() { *m = ClusterMaintenan func (m *ClusterMaintenanceConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigSpecV1) ProtoMessage() {} func (*ClusterMaintenanceConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{333} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19541,7 +19597,7 @@ func (m *AgentUpgradeWindow) Reset() { *m = AgentUpgradeWindow{} } func (m *AgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeWindow) ProtoMessage() {} func (*AgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{334} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19588,7 +19644,7 @@ func (m *ScheduledAgentUpgradeWindow) Reset() { *m = ScheduledAgentUpgra func (m *ScheduledAgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*ScheduledAgentUpgradeWindow) ProtoMessage() {} func (*ScheduledAgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{335} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19631,7 +19687,7 @@ func (m *AgentUpgradeSchedule) Reset() { *m = AgentUpgradeSchedule{} } func (m *AgentUpgradeSchedule) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeSchedule) ProtoMessage() {} func (*AgentUpgradeSchedule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{336} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19674,7 +19730,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{337} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19716,7 +19772,7 @@ func (m *UserGroupSpecV1) Reset() { *m = UserGroupSpecV1{} } func (m *UserGroupSpecV1) String() string { return proto.CompactTextString(m) } func (*UserGroupSpecV1) ProtoMessage() {} func (*UserGroupSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{338} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19760,7 +19816,7 @@ func (m *OktaImportRuleSpecV1) Reset() { *m = OktaImportRuleSpecV1{} } func (m *OktaImportRuleSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleSpecV1) ProtoMessage() {} func (*OktaImportRuleSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{339} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19804,7 +19860,7 @@ func (m *OktaImportRuleMappingV1) Reset() { *m = OktaImportRuleMappingV1 func (m *OktaImportRuleMappingV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMappingV1) ProtoMessage() {} func (*OktaImportRuleMappingV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{340} + return fileDescriptor_9198ee693835762e, []int{341} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19847,7 +19903,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{341} + return fileDescriptor_9198ee693835762e, []int{342} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19895,7 +19951,7 @@ func (m *OktaImportRuleMatchV1) Reset() { *m = OktaImportRuleMatchV1{} } func (m *OktaImportRuleMatchV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMatchV1) ProtoMessage() {} func (*OktaImportRuleMatchV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{342} + return fileDescriptor_9198ee693835762e, []int{343} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19938,7 +19994,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{343} + return fileDescriptor_9198ee693835762e, []int{344} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19992,7 +20048,7 @@ func (m *OktaAssignmentSpecV1) Reset() { *m = OktaAssignmentSpecV1{} } func (m *OktaAssignmentSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentSpecV1) ProtoMessage() {} func (*OktaAssignmentSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{344} + return fileDescriptor_9198ee693835762e, []int{345} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20036,7 +20092,7 @@ func (m *OktaAssignmentTargetV1) Reset() { *m = OktaAssignmentTargetV1{} func (m *OktaAssignmentTargetV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentTargetV1) ProtoMessage() {} func (*OktaAssignmentTargetV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{345} + return fileDescriptor_9198ee693835762e, []int{346} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20081,7 +20137,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{346} + return fileDescriptor_9198ee693835762e, []int{347} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20129,7 +20185,7 @@ func (m *IntegrationSpecV1) Reset() { *m = IntegrationSpecV1{} } func (m *IntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*IntegrationSpecV1) ProtoMessage() {} func (*IntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{347} + return fileDescriptor_9198ee693835762e, []int{348} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20248,7 +20304,7 @@ func (m *AWSOIDCIntegrationSpecV1) Reset() { *m = AWSOIDCIntegrationSpec func (m *AWSOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AWSOIDCIntegrationSpecV1) ProtoMessage() {} func (*AWSOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{348} + return fileDescriptor_9198ee693835762e, []int{349} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20294,7 +20350,7 @@ func (m *AzureOIDCIntegrationSpecV1) Reset() { *m = AzureOIDCIntegration func (m *AzureOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AzureOIDCIntegrationSpecV1) ProtoMessage() {} func (*AzureOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{349} + return fileDescriptor_9198ee693835762e, []int{350} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20336,7 +20392,7 @@ func (m *GitHubIntegrationSpecV1) Reset() { *m = GitHubIntegrationSpecV1 func (m *GitHubIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*GitHubIntegrationSpecV1) ProtoMessage() {} func (*GitHubIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{350} + return fileDescriptor_9198ee693835762e, []int{351} } func (m *GitHubIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20397,7 +20453,7 @@ func (m *HeadlessAuthentication) Reset() { *m = HeadlessAuthentication{} func (m *HeadlessAuthentication) String() string { return proto.CompactTextString(m) } func (*HeadlessAuthentication) ProtoMessage() {} func (*HeadlessAuthentication) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{351} + return fileDescriptor_9198ee693835762e, []int{352} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20454,7 +20510,7 @@ func (m *WatchKind) Reset() { *m = WatchKind{} } func (m *WatchKind) String() string { return proto.CompactTextString(m) } func (*WatchKind) ProtoMessage() {} func (*WatchKind) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{352} + return fileDescriptor_9198ee693835762e, []int{353} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20504,7 +20560,7 @@ func (m *WatchStatusV1) Reset() { *m = WatchStatusV1{} } func (m *WatchStatusV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusV1) ProtoMessage() {} func (*WatchStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{353} + return fileDescriptor_9198ee693835762e, []int{354} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20545,7 +20601,7 @@ func (m *WatchStatusSpecV1) Reset() { *m = WatchStatusSpecV1{} } func (m *WatchStatusSpecV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusSpecV1) ProtoMessage() {} func (*WatchStatusSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{354} + return fileDescriptor_9198ee693835762e, []int{355} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20595,7 +20651,7 @@ func (m *ServerInfoV1) Reset() { *m = ServerInfoV1{} } func (m *ServerInfoV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoV1) ProtoMessage() {} func (*ServerInfoV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{355} + return fileDescriptor_9198ee693835762e, []int{356} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20637,7 +20693,7 @@ func (m *ServerInfoSpecV1) Reset() { *m = ServerInfoSpecV1{} } func (m *ServerInfoSpecV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoSpecV1) ProtoMessage() {} func (*ServerInfoSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{356} + return fileDescriptor_9198ee693835762e, []int{357} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20694,7 +20750,7 @@ func (m *JamfSpecV1) Reset() { *m = JamfSpecV1{} } func (m *JamfSpecV1) String() string { return proto.CompactTextString(m) } func (*JamfSpecV1) ProtoMessage() {} func (*JamfSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{357} + return fileDescriptor_9198ee693835762e, []int{358} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20759,7 +20815,7 @@ func (m *JamfInventoryEntry) Reset() { *m = JamfInventoryEntry{} } func (m *JamfInventoryEntry) String() string { return proto.CompactTextString(m) } func (*JamfInventoryEntry) ProtoMessage() {} func (*JamfInventoryEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{358} + return fileDescriptor_9198ee693835762e, []int{359} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20816,7 +20872,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{359} + return fileDescriptor_9198ee693835762e, []int{360} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20880,7 +20936,7 @@ func (m *AWSMatcher) Reset() { *m = AWSMatcher{} } func (m *AWSMatcher) String() string { return proto.CompactTextString(m) } func (*AWSMatcher) ProtoMessage() {} func (*AWSMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{360} + return fileDescriptor_9198ee693835762e, []int{361} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20925,7 +20981,7 @@ func (m *AssumeRole) Reset() { *m = AssumeRole{} } func (m *AssumeRole) String() string { return proto.CompactTextString(m) } func (*AssumeRole) ProtoMessage() {} func (*AssumeRole) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{361} + return fileDescriptor_9198ee693835762e, []int{362} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20987,7 +21043,7 @@ func (m *InstallerParams) Reset() { *m = InstallerParams{} } func (m *InstallerParams) String() string { return proto.CompactTextString(m) } func (*InstallerParams) ProtoMessage() {} func (*InstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{362} + return fileDescriptor_9198ee693835762e, []int{363} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21030,7 +21086,7 @@ func (m *AWSSSM) Reset() { *m = AWSSSM{} } func (m *AWSSSM) String() string { return proto.CompactTextString(m) } func (*AWSSSM) ProtoMessage() {} func (*AWSSSM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{363} + return fileDescriptor_9198ee693835762e, []int{364} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21073,7 +21129,7 @@ func (m *AzureInstallerParams) Reset() { *m = AzureInstallerParams{} } func (m *AzureInstallerParams) String() string { return proto.CompactTextString(m) } func (*AzureInstallerParams) ProtoMessage() {} func (*AzureInstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{364} + return fileDescriptor_9198ee693835762e, []int{365} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21127,7 +21183,7 @@ func (m *AzureMatcher) Reset() { *m = AzureMatcher{} } func (m *AzureMatcher) String() string { return proto.CompactTextString(m) } func (*AzureMatcher) ProtoMessage() {} func (*AzureMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{365} + return fileDescriptor_9198ee693835762e, []int{366} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21182,7 +21238,7 @@ func (m *GCPMatcher) Reset() { *m = GCPMatcher{} } func (m *GCPMatcher) String() string { return proto.CompactTextString(m) } func (*GCPMatcher) ProtoMessage() {} func (*GCPMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{366} + return fileDescriptor_9198ee693835762e, []int{367} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21228,7 +21284,7 @@ func (m *KubernetesMatcher) Reset() { *m = KubernetesMatcher{} } func (m *KubernetesMatcher) String() string { return proto.CompactTextString(m) } func (*KubernetesMatcher) ProtoMessage() {} func (*KubernetesMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{367} + return fileDescriptor_9198ee693835762e, []int{368} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21270,7 +21326,7 @@ func (m *OktaOptions) Reset() { *m = OktaOptions{} } func (m *OktaOptions) String() string { return proto.CompactTextString(m) } func (*OktaOptions) ProtoMessage() {} func (*OktaOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{368} + return fileDescriptor_9198ee693835762e, []int{369} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21314,7 +21370,7 @@ func (m *AccessGraphSync) Reset() { *m = AccessGraphSync{} } func (m *AccessGraphSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphSync) ProtoMessage() {} func (*AccessGraphSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{369} + return fileDescriptor_9198ee693835762e, []int{370} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21360,7 +21416,7 @@ func (m *AccessGraphAWSSync) Reset() { *m = AccessGraphAWSSync{} } func (m *AccessGraphAWSSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAWSSync) ProtoMessage() {} func (*AccessGraphAWSSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{370} + return fileDescriptor_9198ee693835762e, []int{371} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21480,6 +21536,7 @@ func init() { proto.RegisterType((*AppServerOrSAMLIdPServiceProviderV1)(nil), "types.AppServerOrSAMLIdPServiceProviderV1") proto.RegisterType((*Rewrite)(nil), "types.Rewrite") proto.RegisterType((*Header)(nil), "types.Header") + proto.RegisterType((*PortRange)(nil), "types.PortRange") proto.RegisterType((*CommandLabelV2)(nil), "types.CommandLabelV2") proto.RegisterType((*AppAWS)(nil), "types.AppAWS") proto.RegisterType((*SSHKeyPair)(nil), "types.SSHKeyPair") @@ -21830,1894 +21887,1899 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 30179 bytes of a gzipped FileDescriptorProto + // 30270 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x1c, 0x49, 0x7a, 0x20, 0x36, 0xdd, 0x8d, 0x47, 0xe3, 0xc3, 0xab, 0x91, 0x00, 0x49, 0x10, 0x33, 0x64, 0x73, 0x6a, 0x66, 0x38, 0xe4, 0x3c, 0xc8, 0x25, 0xb8, 0xc3, 0xdd, 0xd9, 0x79, 0x6d, 0xa3, 0x1b, 0x24, - 0x9a, 0x04, 0x40, 0x6c, 0x35, 0x40, 0xee, 0x68, 0x1f, 0xb5, 0x85, 0xee, 0x04, 0x50, 0x83, 0xee, - 0xae, 0xde, 0xaa, 0x6a, 0x82, 0xd0, 0xde, 0x59, 0xef, 0x93, 0x15, 0xb2, 0x5e, 0x77, 0xd2, 0x69, - 0xcf, 0xa1, 0x53, 0x28, 0xe4, 0x3b, 0x5b, 0x71, 0x8e, 0x53, 0xd8, 0x92, 0x65, 0x9f, 0xad, 0xb0, - 0x2c, 0x5d, 0x9c, 0x65, 0x59, 0xe1, 0x38, 0x29, 0xec, 0xf3, 0x6b, 0x7d, 0x01, 0x59, 0x96, 0x7f, - 0x38, 0x10, 0xe1, 0x08, 0xc9, 0x17, 0xe1, 0x08, 0xef, 0x85, 0xee, 0x1c, 0xf9, 0x65, 0x66, 0x55, - 0x66, 0x55, 0x75, 0xa3, 0x31, 0xe4, 0xe8, 0xc4, 0x09, 0xfd, 0x21, 0xd1, 0x5f, 0x7e, 0xdf, 0x97, - 0x95, 0xef, 0x2f, 0xbf, 0xfc, 0x1e, 0xf0, 0x62, 0x40, 0x9b, 0xb4, 0xe3, 0x7a, 0xc1, 0xf5, 0x26, - 0xdd, 0xb5, 0xeb, 0x87, 0xd7, 0x83, 0xc3, 0x0e, 0xf5, 0xf9, 0xbf, 0xd7, 0x3a, 0x9e, 0x1b, 0xb8, - 0x64, 0x18, 0x7f, 0x2c, 0xcc, 0xed, 0xba, 0xbb, 0x2e, 0x42, 0xae, 0xb3, 0xbf, 0x78, 0xe1, 0xc2, - 0xc5, 0x5d, 0xd7, 0xdd, 0x6d, 0xd2, 0xeb, 0xf8, 0x6b, 0xbb, 0xbb, 0x73, 0xbd, 0xd1, 0xf5, 0xec, - 0xc0, 0x71, 0xdb, 0xa2, 0xbc, 0x18, 0x2f, 0x0f, 0x9c, 0x16, 0xf5, 0x03, 0xbb, 0xd5, 0xe9, 0xc5, - 0xe0, 0xc0, 0xb3, 0x3b, 0x1d, 0xea, 0x89, 0xda, 0x17, 0xae, 0x86, 0x1f, 0x68, 0x07, 0x01, 0xa3, - 0x64, 0xcc, 0xaf, 0x3f, 0xba, 0xa1, 0xfe, 0x14, 0xa8, 0xb7, 0x7a, 0xb4, 0xc5, 0xeb, 0xfa, 0x01, - 0x6d, 0x58, 0x0d, 0xfa, 0xc8, 0xa9, 0x53, 0xcb, 0xa3, 0xdf, 0xec, 0x3a, 0x1e, 0x6d, 0xd1, 0x76, - 0x20, 0xe8, 0xde, 0x4c, 0xa7, 0x93, 0x1f, 0x12, 0xfb, 0x22, 0xe3, 0x17, 0x73, 0x30, 0x76, 0x8f, - 0xd2, 0x4e, 0xa9, 0xe9, 0x3c, 0xa2, 0xe4, 0x25, 0x18, 0x5a, 0xb7, 0x5b, 0x74, 0x3e, 0x73, 0x29, - 0x73, 0x65, 0x6c, 0x69, 0xfa, 0xf8, 0xa8, 0x38, 0xee, 0x53, 0xef, 0x11, 0xf5, 0xac, 0xb6, 0xdd, - 0xa2, 0x26, 0x16, 0x92, 0xd7, 0x61, 0x8c, 0xfd, 0xef, 0x77, 0xec, 0x3a, 0x9d, 0xcf, 0x22, 0xe6, - 0xe4, 0xf1, 0x51, 0x71, 0xac, 0x2d, 0x81, 0x66, 0x54, 0x4e, 0xaa, 0x30, 0xba, 0xfc, 0xb8, 0xe3, - 0x78, 0xd4, 0x9f, 0x1f, 0xba, 0x94, 0xb9, 0x32, 0xbe, 0xb8, 0x70, 0x8d, 0xf7, 0xd1, 0x35, 0xd9, - 0x47, 0xd7, 0x36, 0x65, 0x27, 0x2e, 0xcd, 0xfe, 0xde, 0x51, 0xf1, 0xb9, 0xe3, 0xa3, 0xe2, 0x28, - 0xe5, 0x24, 0x3f, 0xfd, 0x47, 0xc5, 0x8c, 0x29, 0xe9, 0xc9, 0xbb, 0x30, 0xb4, 0x79, 0xd8, 0xa1, - 0xf3, 0x63, 0x97, 0x32, 0x57, 0xa6, 0x16, 0x2f, 0x5e, 0xe3, 0xc3, 0x1a, 0x7e, 0x7c, 0xf4, 0x17, - 0xc3, 0x5a, 0xca, 0x1f, 0x1f, 0x15, 0x87, 0x18, 0x8a, 0x89, 0x54, 0xe4, 0x4d, 0x18, 0x59, 0x71, - 0xfd, 0xa0, 0x5a, 0x99, 0x07, 0xfc, 0xe4, 0x33, 0xc7, 0x47, 0xc5, 0x99, 0x3d, 0xd7, 0x0f, 0x2c, - 0xa7, 0xf1, 0x86, 0xdb, 0x72, 0x02, 0xda, 0xea, 0x04, 0x87, 0xa6, 0x40, 0x32, 0x1e, 0xc3, 0xa4, - 0xc6, 0x8f, 0x8c, 0xc3, 0xe8, 0xd6, 0xfa, 0xbd, 0xf5, 0xfb, 0x0f, 0xd7, 0x0b, 0xcf, 0x91, 0x3c, - 0x0c, 0xad, 0xdf, 0xaf, 0x2c, 0x17, 0x32, 0x64, 0x14, 0x72, 0xa5, 0x8d, 0x8d, 0x42, 0x96, 0x4c, - 0x40, 0xbe, 0x52, 0xda, 0x2c, 0x2d, 0x95, 0x6a, 0xcb, 0x85, 0x1c, 0x99, 0x85, 0xe9, 0x87, 0xd5, - 0xf5, 0xca, 0xfd, 0x87, 0x35, 0xab, 0xb2, 0x5c, 0xbb, 0xb7, 0x79, 0x7f, 0xa3, 0x30, 0x44, 0xa6, - 0x00, 0xee, 0x6d, 0x2d, 0x2d, 0x9b, 0xeb, 0xcb, 0x9b, 0xcb, 0xb5, 0xc2, 0x30, 0x99, 0x83, 0x82, - 0x24, 0xb1, 0x6a, 0xcb, 0xe6, 0x83, 0x6a, 0x79, 0xb9, 0x30, 0x72, 0x77, 0x28, 0x9f, 0x2b, 0x0c, - 0x99, 0xa3, 0xab, 0xd4, 0xf6, 0x69, 0xb5, 0x62, 0xfc, 0x7b, 0x39, 0xc8, 0xaf, 0xd1, 0xc0, 0x6e, - 0xd8, 0x81, 0x4d, 0x5e, 0xd0, 0xc6, 0x07, 0x9b, 0xa8, 0x0c, 0xcc, 0x4b, 0xc9, 0x81, 0x19, 0x3e, - 0x3e, 0x2a, 0x66, 0xde, 0x54, 0x07, 0xe4, 0x1d, 0x18, 0xaf, 0x50, 0xbf, 0xee, 0x39, 0x1d, 0x36, - 0xd9, 0xe6, 0x73, 0x88, 0x76, 0xfe, 0xf8, 0xa8, 0x78, 0xa6, 0x11, 0x81, 0x95, 0x0e, 0x51, 0xb1, - 0x49, 0x15, 0x46, 0x56, 0xed, 0x6d, 0xda, 0xf4, 0xe7, 0x87, 0x2f, 0xe5, 0xae, 0x8c, 0x2f, 0x3e, - 0x2f, 0x06, 0x41, 0x7e, 0xe0, 0x35, 0x5e, 0xba, 0xdc, 0x0e, 0xbc, 0xc3, 0xa5, 0xb9, 0xe3, 0xa3, - 0x62, 0xa1, 0x89, 0x00, 0xb5, 0x83, 0x39, 0x0a, 0xa9, 0x45, 0x13, 0x63, 0xe4, 0xc4, 0x89, 0x71, - 0xe1, 0xf7, 0x8e, 0x8a, 0x19, 0x36, 0x60, 0x62, 0x62, 0x44, 0xfc, 0xf4, 0x29, 0xb2, 0x08, 0x79, - 0x93, 0x3e, 0x72, 0x7c, 0xd6, 0xb2, 0x3c, 0xb6, 0xec, 0xec, 0xf1, 0x51, 0x91, 0x78, 0x02, 0xa6, - 0x7c, 0x46, 0x88, 0xb7, 0xf0, 0x36, 0x8c, 0x2b, 0x5f, 0x4d, 0x0a, 0x90, 0xdb, 0xa7, 0x87, 0xbc, - 0x87, 0x4d, 0xf6, 0x27, 0x99, 0x83, 0xe1, 0x47, 0x76, 0xb3, 0x2b, 0xba, 0xd4, 0xe4, 0x3f, 0xbe, - 0x90, 0xfd, 0x7c, 0xe6, 0xee, 0x50, 0x7e, 0xb4, 0x90, 0x37, 0xb3, 0xd5, 0x8a, 0xf1, 0x37, 0x87, - 0x20, 0x6f, 0xba, 0x7c, 0x01, 0x93, 0xab, 0x30, 0x5c, 0x0b, 0xec, 0x40, 0x0e, 0xd3, 0xec, 0xf1, - 0x51, 0x71, 0x9a, 0x2d, 0x6e, 0xaa, 0xd4, 0xcf, 0x31, 0x18, 0xea, 0xc6, 0x9e, 0xed, 0xcb, 0xe1, - 0x42, 0xd4, 0x0e, 0x03, 0xa8, 0xa8, 0x88, 0x41, 0x2e, 0xc3, 0xd0, 0x9a, 0xdb, 0xa0, 0x62, 0xc4, - 0xc8, 0xf1, 0x51, 0x71, 0xaa, 0xe5, 0x36, 0x54, 0x44, 0x2c, 0x27, 0x6f, 0xc0, 0x58, 0xb9, 0xeb, - 0x79, 0xb4, 0xcd, 0xe6, 0xfa, 0x10, 0x22, 0x4f, 0x1d, 0x1f, 0x15, 0xa1, 0xce, 0x81, 0x96, 0xd3, - 0x30, 0x23, 0x04, 0x36, 0x0c, 0xb5, 0xc0, 0xf6, 0x02, 0xda, 0x98, 0x1f, 0x1e, 0x68, 0x18, 0xd8, - 0xfa, 0x9c, 0xf1, 0x39, 0x49, 0x7c, 0x18, 0x04, 0x27, 0xb2, 0x02, 0xe3, 0x77, 0x3c, 0xbb, 0x4e, - 0x37, 0xa8, 0xe7, 0xb8, 0x0d, 0x1c, 0xdf, 0xdc, 0xd2, 0xe5, 0xe3, 0xa3, 0xe2, 0xd9, 0x5d, 0x06, - 0xb6, 0x3a, 0x08, 0x8f, 0xa8, 0xbf, 0x7b, 0x54, 0xcc, 0x57, 0xc4, 0x56, 0x6b, 0xaa, 0xa4, 0xe4, - 0x1b, 0x6c, 0x70, 0xfc, 0x00, 0xbb, 0x96, 0x36, 0xe6, 0x47, 0x4f, 0xfc, 0x44, 0x43, 0x7c, 0xe2, - 0xd9, 0xa6, 0xed, 0x07, 0x96, 0xc7, 0xe9, 0x62, 0xdf, 0xa9, 0xb2, 0x24, 0xf7, 0x21, 0x5f, 0xab, - 0xef, 0xd1, 0x46, 0xb7, 0x49, 0x71, 0xca, 0x8c, 0x2f, 0x9e, 0x13, 0x93, 0x5a, 0x8e, 0xa7, 0x2c, - 0x5e, 0x5a, 0x10, 0xbc, 0x89, 0x2f, 0x20, 0xea, 0x7c, 0x92, 0x58, 0x5f, 0xc8, 0x7f, 0xfb, 0x97, - 0x8a, 0xcf, 0x7d, 0xff, 0x3f, 0xbf, 0xf4, 0x9c, 0xf1, 0x9f, 0x65, 0xa1, 0x10, 0x67, 0x42, 0x76, - 0x60, 0x72, 0xab, 0xd3, 0xb0, 0x03, 0x5a, 0x6e, 0x3a, 0xb4, 0x1d, 0xf8, 0x38, 0x49, 0xfa, 0xb7, - 0xe9, 0x65, 0x51, 0xef, 0x7c, 0x17, 0x09, 0xad, 0x3a, 0xa7, 0x8c, 0xb5, 0x4a, 0x67, 0x1b, 0xd5, - 0x53, 0xc3, 0x0d, 0xdc, 0xc7, 0x19, 0x76, 0xba, 0x7a, 0xf8, 0xd6, 0xdf, 0xa3, 0x1e, 0xc1, 0x56, - 0x4c, 0xa0, 0x76, 0x63, 0xfb, 0x10, 0x67, 0xe6, 0xe0, 0x13, 0x88, 0x91, 0xa4, 0x4c, 0x20, 0x06, - 0x36, 0xfe, 0xcf, 0x0c, 0x4c, 0x99, 0xd4, 0x77, 0xbb, 0x5e, 0x9d, 0xae, 0x50, 0xbb, 0x41, 0x3d, - 0x36, 0xfd, 0xef, 0x39, 0xed, 0x86, 0x58, 0x53, 0x38, 0xfd, 0xf7, 0x9d, 0xb6, 0xba, 0x75, 0x63, - 0x39, 0xf9, 0x0c, 0x8c, 0xd6, 0xba, 0xdb, 0x88, 0x9a, 0x8d, 0x76, 0x00, 0xbf, 0xbb, 0x6d, 0xc5, - 0xd0, 0x25, 0x1a, 0xb9, 0x0e, 0xa3, 0x0f, 0xa8, 0xe7, 0x47, 0xbb, 0x21, 0x1e, 0x0d, 0x8f, 0x38, - 0x48, 0x25, 0x10, 0x58, 0xe4, 0x4e, 0xb4, 0x23, 0x8b, 0x43, 0x6d, 0x3a, 0xb6, 0x0f, 0x46, 0x53, - 0xa5, 0x25, 0x20, 0xea, 0x54, 0x91, 0x58, 0xc6, 0xcf, 0x64, 0xa1, 0x50, 0xb1, 0x03, 0x7b, 0xdb, - 0xf6, 0x45, 0x7f, 0x3e, 0xb8, 0xc9, 0xf6, 0x78, 0xa5, 0xa1, 0xb8, 0xc7, 0xb3, 0x2f, 0xff, 0xd8, - 0xcd, 0x7b, 0x25, 0xde, 0xbc, 0x71, 0x76, 0xc2, 0x8a, 0xe6, 0x45, 0x8d, 0x7a, 0xef, 0xe4, 0x46, - 0x15, 0x44, 0xa3, 0xf2, 0xb2, 0x51, 0x51, 0x53, 0xc8, 0x7b, 0x30, 0x54, 0xeb, 0xd0, 0xba, 0xd8, - 0x44, 0xe4, 0xb9, 0xa0, 0x37, 0x8e, 0x21, 0x3c, 0xb8, 0xb9, 0x34, 0x21, 0xd8, 0x0c, 0xf9, 0x1d, - 0x5a, 0x37, 0x91, 0x4c, 0x59, 0x34, 0xff, 0x28, 0x07, 0x73, 0x69, 0x64, 0x6a, 0x3b, 0x46, 0xfa, - 0xb4, 0xe3, 0x0a, 0xe4, 0xd9, 0x11, 0xce, 0x8e, 0x45, 0xdc, 0x2e, 0xc6, 0x96, 0x26, 0xd8, 0x27, - 0xef, 0x09, 0x98, 0x19, 0x96, 0x92, 0x97, 0x42, 0x89, 0x20, 0x1f, 0xf1, 0x13, 0x12, 0x81, 0x94, - 0x03, 0xd8, 0x58, 0xcb, 0x25, 0x8c, 0x82, 0x43, 0xd4, 0x2d, 0x12, 0x1c, 0x8d, 0xb5, 0x27, 0x20, - 0xda, 0x31, 0x23, 0x0f, 0x85, 0x65, 0xc8, 0xcb, 0x66, 0xcd, 0x4f, 0x20, 0xa3, 0x99, 0x58, 0x27, - 0x3d, 0xb8, 0xc9, 0x07, 0xb3, 0x21, 0x7e, 0xab, 0x6c, 0x24, 0x0e, 0xb9, 0x09, 0xf9, 0x0d, 0xcf, - 0x7d, 0x7c, 0x58, 0xad, 0xf8, 0xf3, 0x93, 0x97, 0x72, 0x57, 0xc6, 0x96, 0xce, 0x1d, 0x1f, 0x15, - 0x67, 0x3b, 0x0c, 0x66, 0x39, 0x0d, 0xf5, 0xa4, 0x0d, 0x11, 0xef, 0x0e, 0xe5, 0x33, 0x85, 0xec, - 0xdd, 0xa1, 0x7c, 0xb6, 0x90, 0xe3, 0xe2, 0xc5, 0xdd, 0xa1, 0xfc, 0x50, 0x61, 0xf8, 0xee, 0x50, - 0x7e, 0x18, 0x05, 0x8e, 0xb1, 0x02, 0xdc, 0x1d, 0xca, 0x8f, 0x17, 0x26, 0xb4, 0xd3, 0x1e, 0x19, - 0x04, 0x6e, 0xdd, 0x6d, 0x9a, 0xb9, 0x2d, 0xb3, 0x6a, 0x8e, 0x94, 0x4b, 0x65, 0xea, 0x05, 0x66, - 0xae, 0xf4, 0xb0, 0x66, 0x4e, 0x56, 0x0e, 0xdb, 0x76, 0xcb, 0xa9, 0xf3, 0xa3, 0xd3, 0xcc, 0xdd, - 0x29, 0x6f, 0x18, 0x25, 0x98, 0x8a, 0xda, 0xb2, 0xea, 0xf8, 0x01, 0xb9, 0x0e, 0x63, 0x12, 0xc2, - 0x36, 0xba, 0x5c, 0x6a, 0xab, 0xcd, 0x08, 0xc7, 0xf8, 0xdd, 0x2c, 0x40, 0x54, 0xf2, 0x8c, 0xae, - 0x85, 0xcf, 0x69, 0x6b, 0xe1, 0x4c, 0x7c, 0x2d, 0xf4, 0x5c, 0x05, 0xe4, 0x03, 0x18, 0x61, 0x62, - 0x41, 0x57, 0x8a, 0x44, 0xe7, 0xe2, 0xa4, 0x58, 0xf8, 0xe0, 0xe6, 0xd2, 0x94, 0x20, 0x1e, 0xf1, - 0x11, 0x62, 0x0a, 0x32, 0x65, 0x19, 0xfd, 0xe2, 0x68, 0x34, 0x18, 0x62, 0x01, 0x5d, 0x81, 0x70, - 0x40, 0x45, 0x87, 0xe2, 0xca, 0xe8, 0xc8, 0x41, 0x0e, 0x4b, 0xc9, 0x79, 0x60, 0x03, 0x2e, 0x3a, - 0x75, 0xf4, 0xf8, 0xa8, 0x98, 0xeb, 0x7a, 0x0e, 0x4e, 0x02, 0x72, 0x1d, 0xc4, 0x34, 0x10, 0x1d, - 0xc8, 0x66, 0xdf, 0x4c, 0xdd, 0xb6, 0xea, 0xd4, 0x0b, 0xa2, 0x1e, 0x9f, 0xcf, 0xc8, 0xd9, 0x42, - 0x3a, 0xa0, 0x4f, 0x95, 0xf9, 0x21, 0x9c, 0x06, 0x57, 0x52, 0x7b, 0xe5, 0x9a, 0x86, 0xca, 0xc5, - 0xc8, 0x4b, 0xf2, 0x54, 0x6a, 0xf0, 0x32, 0x2b, 0x21, 0x52, 0xea, 0x15, 0x90, 0x9b, 0xc0, 0x66, - 0xa8, 0xe8, 0x7d, 0x10, 0xf5, 0x94, 0x1e, 0xd6, 0x96, 0xce, 0x08, 0x4e, 0x93, 0xf6, 0x81, 0x4a, - 0xce, 0xb0, 0xc9, 0x3b, 0xc0, 0xa6, 0xb0, 0xe8, 0x77, 0x22, 0x88, 0xee, 0x94, 0x37, 0xca, 0x4d, - 0xb7, 0xdb, 0xa8, 0x7d, 0x69, 0x35, 0x22, 0xde, 0xad, 0x77, 0x54, 0xe2, 0x3b, 0xe5, 0x0d, 0xf2, - 0x0e, 0x0c, 0x97, 0xbe, 0xb7, 0xeb, 0x51, 0x21, 0x9f, 0x4c, 0xc8, 0x3a, 0x19, 0x6c, 0xe9, 0x9c, - 0x20, 0x9c, 0xb6, 0xd9, 0x4f, 0x55, 0xae, 0xc3, 0x72, 0x56, 0xf3, 0xe6, 0x6a, 0x4d, 0xc8, 0x1e, - 0x24, 0xd6, 0x2d, 0x9b, 0xab, 0xca, 0x67, 0x07, 0x5a, 0xab, 0x19, 0x15, 0xb9, 0x0e, 0xd9, 0x52, - 0x05, 0x6f, 0x44, 0xe3, 0x8b, 0x63, 0xb2, 0xda, 0xca, 0xd2, 0x9c, 0x20, 0x99, 0xb0, 0xd5, 0x65, - 0x90, 0x2d, 0x55, 0xc8, 0x12, 0x0c, 0xaf, 0x1d, 0xd6, 0xbe, 0xb4, 0x2a, 0x36, 0xb3, 0x59, 0x39, - 0xaf, 0x19, 0xec, 0x3e, 0x2e, 0x7b, 0x3f, 0xfa, 0xe2, 0xd6, 0xa1, 0xff, 0xcd, 0xa6, 0xfa, 0xc5, - 0x88, 0x46, 0x36, 0x60, 0xac, 0xd4, 0x68, 0x39, 0xed, 0x2d, 0x9f, 0x7a, 0xf3, 0xe3, 0xc8, 0x67, - 0x3e, 0xf6, 0xdd, 0x61, 0xf9, 0xd2, 0xfc, 0xf1, 0x51, 0x71, 0xce, 0x66, 0x3f, 0xad, 0xae, 0x4f, - 0x3d, 0x85, 0x5b, 0xc4, 0x84, 0x6c, 0x00, 0xac, 0xb9, 0xed, 0x5d, 0xb7, 0x14, 0x34, 0x6d, 0x3f, - 0xb6, 0x3d, 0x46, 0x05, 0xa1, 0xf8, 0x70, 0xa6, 0xc5, 0x60, 0x96, 0xcd, 0x80, 0x0a, 0x43, 0x85, - 0x07, 0xb9, 0x0d, 0x23, 0xf7, 0x3d, 0xbb, 0xde, 0xa4, 0xf3, 0x93, 0xc8, 0x6d, 0x4e, 0x70, 0xe3, - 0x40, 0xd9, 0xd2, 0x79, 0xc1, 0xb0, 0xe0, 0x22, 0x58, 0xbd, 0xa6, 0x70, 0xc4, 0x85, 0x87, 0x40, - 0x92, 0x73, 0x32, 0xe5, 0x92, 0xf0, 0xba, 0x7a, 0x49, 0x88, 0x16, 0x7d, 0xd9, 0x6d, 0xb5, 0xec, - 0x76, 0x03, 0x69, 0x1f, 0x2c, 0x2a, 0x77, 0x07, 0xe3, 0x9b, 0x30, 0x93, 0xe8, 0xac, 0x13, 0xee, - 0x77, 0xef, 0xc3, 0x74, 0x85, 0xee, 0xd8, 0xdd, 0x66, 0x10, 0x9e, 0x24, 0x7c, 0x89, 0xe2, 0x4d, - 0xab, 0xc1, 0x8b, 0x2c, 0x79, 0x7c, 0x98, 0x71, 0x64, 0xe3, 0x3d, 0x98, 0xd4, 0x9a, 0xcf, 0xae, - 0x0a, 0xa5, 0x6e, 0xc3, 0x09, 0x70, 0x20, 0x33, 0xd1, 0x55, 0xc1, 0x66, 0x40, 0x1c, 0x2e, 0x33, - 0x42, 0x30, 0xfe, 0x9e, 0x2a, 0xad, 0x88, 0x9d, 0x88, 0x5d, 0xab, 0xc5, 0x7e, 0x90, 0x89, 0x64, - 0xa7, 0xc4, 0x7e, 0x10, 0xee, 0x06, 0x57, 0xf9, 0xda, 0xcc, 0x26, 0xd6, 0xe6, 0xb8, 0x18, 0x89, - 0x9c, 0x7d, 0xe0, 0xf3, 0x15, 0x19, 0xce, 0xd4, 0xdc, 0xc7, 0x9f, 0xa9, 0x1f, 0xc0, 0xc4, 0x9a, - 0xdd, 0xb6, 0x77, 0x69, 0x83, 0xb5, 0x80, 0xef, 0x3d, 0x63, 0x4b, 0xcf, 0x1f, 0x1f, 0x15, 0xcf, - 0xb5, 0x38, 0x1c, 0x5b, 0xa9, 0x4e, 0x22, 0x8d, 0x80, 0xdc, 0x90, 0x2b, 0x7b, 0x38, 0x65, 0x65, - 0x4f, 0x8a, 0xda, 0x87, 0x71, 0x65, 0x8b, 0xf5, 0x6c, 0xfc, 0xf6, 0x18, 0xb6, 0x91, 0xbc, 0x01, - 0x23, 0x26, 0xdd, 0x65, 0x47, 0x4d, 0x26, 0x1a, 0x24, 0x0f, 0x21, 0x6a, 0xc7, 0x70, 0x1c, 0x94, - 0x33, 0x68, 0xc3, 0xdf, 0x73, 0x76, 0x02, 0xd1, 0x3b, 0xa1, 0x9c, 0x21, 0xc0, 0x8a, 0x9c, 0x21, - 0x20, 0xfa, 0x75, 0x96, 0xc3, 0xd8, 0xee, 0x67, 0x56, 0x6a, 0xa2, 0xd3, 0x64, 0x0f, 0x9b, 0x15, - 0x65, 0x1b, 0xf1, 0x34, 0x29, 0x81, 0x61, 0x93, 0x5b, 0x30, 0x56, 0xaa, 0xd7, 0xdd, 0xae, 0x72, - 0x67, 0xe4, 0xeb, 0x96, 0x03, 0x75, 0x15, 0x49, 0x84, 0x4a, 0x6a, 0x30, 0xbe, 0xcc, 0x2e, 0x5a, - 0x4e, 0xd9, 0xae, 0xef, 0xc9, 0x4e, 0x92, 0x7b, 0x98, 0x52, 0x12, 0xad, 0x5c, 0x8a, 0xc0, 0x3a, - 0x03, 0xaa, 0x4a, 0x06, 0x05, 0x97, 0x6c, 0xc2, 0x78, 0x8d, 0xd6, 0x3d, 0x1a, 0xd4, 0x02, 0xd7, - 0xa3, 0xb1, 0x2d, 0x59, 0x29, 0x59, 0xba, 0x28, 0xef, 0x7a, 0x3e, 0x02, 0x2d, 0x9f, 0x41, 0x55, - 0xae, 0x0a, 0x32, 0x17, 0xda, 0x5b, 0xae, 0x77, 0x58, 0x59, 0x12, 0xdb, 0x74, 0x74, 0xa6, 0x73, - 0xb0, 0x2a, 0xb4, 0x33, 0x48, 0x63, 0x5b, 0x17, 0xda, 0x39, 0x16, 0x8e, 0x54, 0xa5, 0x86, 0xb2, - 0x95, 0xd8, 0xb4, 0xa7, 0xa3, 0x5e, 0x46, 0xb0, 0x32, 0x52, 0x0d, 0x1f, 0x25, 0x33, 0x6d, 0xa4, - 0x04, 0x16, 0xe9, 0x00, 0x91, 0xa3, 0xc6, 0x05, 0xdd, 0x26, 0xf5, 0x7d, 0xb1, 0x97, 0x9f, 0x8f, - 0x0d, 0x7e, 0x84, 0xb0, 0xf4, 0x8a, 0x60, 0x7e, 0x41, 0x4e, 0x03, 0x71, 0x4f, 0x63, 0x85, 0x4a, - 0x3d, 0x29, 0xbc, 0xc9, 0xdb, 0x00, 0xcb, 0x8f, 0x03, 0xea, 0xb5, 0xed, 0x66, 0xa8, 0x07, 0x43, - 0xd5, 0x0f, 0x15, 0x50, 0x7d, 0xa0, 0x15, 0x64, 0x52, 0x86, 0xc9, 0x92, 0xef, 0x77, 0x5b, 0xd4, - 0x74, 0x9b, 0xb4, 0x64, 0xae, 0xe3, 0xbe, 0x3f, 0xb6, 0x74, 0xe1, 0xf8, 0xa8, 0x78, 0xde, 0xc6, - 0x02, 0xcb, 0x73, 0x9b, 0xd4, 0xb2, 0x3d, 0x75, 0x76, 0xeb, 0x34, 0xe4, 0x3e, 0xc0, 0xfd, 0x0e, - 0x6d, 0xd7, 0xa8, 0xed, 0xd5, 0xf7, 0x62, 0xdb, 0x7c, 0x54, 0xb0, 0xf4, 0x82, 0x68, 0xe1, 0x9c, - 0xdb, 0xa1, 0x6d, 0x1f, 0x61, 0xea, 0x57, 0x45, 0x98, 0xe4, 0x21, 0x4c, 0x57, 0x4b, 0x6b, 0x1b, - 0x6e, 0xd3, 0xa9, 0x1f, 0x0a, 0xc9, 0x69, 0x0a, 0xb5, 0x83, 0x67, 0x05, 0xd7, 0x58, 0x29, 0xdf, - 0x9e, 0x1c, 0xbb, 0x65, 0x75, 0x10, 0x6a, 0x09, 0xf9, 0x29, 0xce, 0x85, 0x7c, 0xc8, 0xe6, 0xa0, - 0xcf, 0x84, 0xc1, 0x4d, 0x7b, 0xd7, 0x9f, 0x9f, 0xd6, 0xb4, 0x5d, 0xa5, 0x87, 0xb5, 0x6b, 0x4a, - 0x29, 0x17, 0x53, 0x16, 0xf8, 0x44, 0x44, 0xa8, 0x15, 0xd8, 0xbb, 0xbe, 0x3e, 0x11, 0x43, 0x6c, - 0x72, 0x17, 0xa0, 0xe2, 0xd6, 0xbb, 0x2d, 0xda, 0x0e, 0x2a, 0x4b, 0xf3, 0x05, 0xfd, 0x2a, 0x10, - 0x16, 0x44, 0x5b, 0x5b, 0xc3, 0xad, 0x6b, 0x33, 0x51, 0xa1, 0x5e, 0x78, 0x1f, 0x0a, 0xf1, 0x0f, - 0x39, 0xa5, 0x02, 0x6b, 0xb2, 0x30, 0xa5, 0xb4, 0x7e, 0xf9, 0xb1, 0xe3, 0x07, 0xbe, 0xf1, 0x2d, - 0x6d, 0x05, 0xb2, 0xdd, 0xe1, 0x1e, 0x3d, 0xdc, 0xf0, 0xe8, 0x8e, 0xf3, 0x58, 0x6c, 0x66, 0xb8, - 0x3b, 0xec, 0xd3, 0x43, 0xab, 0x83, 0x50, 0x75, 0x77, 0x08, 0x51, 0xc9, 0x67, 0x21, 0x7f, 0x6f, - 0xad, 0x76, 0x8f, 0x1e, 0x56, 0x2b, 0xe2, 0xa0, 0xe2, 0x64, 0x2d, 0xdf, 0x62, 0xa4, 0xda, 0x5c, - 0x0b, 0x31, 0x8d, 0xa5, 0x68, 0x27, 0x64, 0x35, 0x97, 0x9b, 0x5d, 0x3f, 0xa0, 0x5e, 0xb5, 0xa2, - 0xd6, 0x5c, 0xe7, 0xc0, 0xd8, 0xbe, 0x14, 0xa2, 0x1a, 0xff, 0x3a, 0x8b, 0xbb, 0x20, 0x9b, 0xf0, - 0xd5, 0xb6, 0x1f, 0xd8, 0xed, 0x3a, 0x0d, 0x19, 0xe0, 0x84, 0x77, 0x04, 0x34, 0x36, 0xe1, 0x23, - 0x64, 0xbd, 0xea, 0xec, 0xc0, 0x55, 0xb3, 0x2a, 0xa5, 0xe6, 0xa2, 0x5a, 0x51, 0xd5, 0xab, 0x9e, - 0x80, 0xc6, 0xaa, 0x8c, 0x90, 0xc9, 0x65, 0x18, 0xad, 0x96, 0xd6, 0x4a, 0xdd, 0x60, 0x0f, 0xf7, - 0xe0, 0x3c, 0x97, 0xcf, 0xd9, 0x6c, 0xb5, 0xbb, 0xc1, 0x9e, 0x29, 0x0b, 0xc9, 0x75, 0xbc, 0xf7, - 0xb4, 0x69, 0xc0, 0xd5, 0xb0, 0xe2, 0xd0, 0xf5, 0x39, 0x28, 0x76, 0xed, 0x61, 0x20, 0xf2, 0x1a, - 0x0c, 0x3f, 0xd8, 0x28, 0x57, 0x2b, 0xe2, 0xe2, 0x8c, 0x27, 0xd1, 0xa3, 0x4e, 0x5d, 0xff, 0x12, - 0x8e, 0x42, 0x96, 0x61, 0xaa, 0x46, 0xeb, 0x5d, 0xcf, 0x09, 0x0e, 0xef, 0x78, 0x6e, 0xb7, 0xe3, - 0xcf, 0x8f, 0x62, 0x1d, 0xb8, 0xd2, 0x7d, 0x51, 0x62, 0xed, 0x62, 0x91, 0x42, 0x1d, 0x23, 0x32, - 0x7e, 0x27, 0x13, 0x6d, 0x93, 0xe4, 0xb2, 0x26, 0xd6, 0xa0, 0xee, 0x86, 0x89, 0x35, 0xaa, 0xee, - 0x06, 0x05, 0x1c, 0x13, 0x48, 0xb9, 0xeb, 0x07, 0x6e, 0x6b, 0xb9, 0xdd, 0xe8, 0xb8, 0x4e, 0x3b, - 0x40, 0x2a, 0xde, 0xf9, 0xc6, 0xf1, 0x51, 0xf1, 0x62, 0x1d, 0x4b, 0x2d, 0x2a, 0x8a, 0xad, 0x18, - 0x97, 0x14, 0xea, 0x27, 0x18, 0x0f, 0xe3, 0xf7, 0xb3, 0xda, 0xf1, 0xc6, 0x3e, 0xcf, 0xa4, 0x9d, - 0xa6, 0x53, 0xc7, 0x1b, 0x3d, 0x36, 0x34, 0x9c, 0x55, 0xf8, 0x79, 0x5e, 0x54, 0xca, 0x7b, 0x48, - 0xe7, 0x9d, 0x42, 0x4d, 0xbe, 0x08, 0x13, 0x4c, 0xd2, 0x10, 0x3f, 0xfd, 0xf9, 0x2c, 0x76, 0xf6, - 0x0b, 0xa8, 0x85, 0xf3, 0xa9, 0x17, 0xb2, 0xd1, 0x44, 0x14, 0x95, 0x82, 0x34, 0x60, 0x7e, 0xd3, - 0xb3, 0xdb, 0xbe, 0x13, 0x2c, 0xb7, 0xeb, 0xde, 0x21, 0x4a, 0x46, 0xcb, 0x6d, 0x7b, 0xbb, 0x49, - 0x1b, 0xd8, 0xdc, 0xfc, 0xd2, 0x95, 0xe3, 0xa3, 0xe2, 0xcb, 0x01, 0xc7, 0xb1, 0x68, 0x88, 0x64, - 0x51, 0x8e, 0xa5, 0x70, 0xee, 0xc9, 0x89, 0x49, 0x52, 0xb2, 0x5b, 0xf1, 0x11, 0x86, 0x0b, 0x09, - 0x28, 0x49, 0x85, 0xa3, 0xc1, 0xf6, 0x30, 0xf5, 0x33, 0x55, 0x02, 0xe3, 0xff, 0xcd, 0x44, 0x07, - 0x30, 0x79, 0x17, 0xc6, 0xc5, 0x8a, 0x51, 0xe6, 0x05, 0xee, 0xa0, 0x72, 0x79, 0xc5, 0x46, 0x56, - 0x45, 0x67, 0xf7, 0xfe, 0x52, 0x79, 0x55, 0x99, 0x1b, 0x78, 0xef, 0xb7, 0xeb, 0xcd, 0x38, 0x95, - 0x44, 0x63, 0x93, 0x60, 0x73, 0xb5, 0xa6, 0xf7, 0x0a, 0x4e, 0x82, 0xa0, 0xe9, 0xa7, 0x74, 0x83, - 0x82, 0xfc, 0xe4, 0x0d, 0xff, 0x9f, 0x33, 0x69, 0xe7, 0x3c, 0x59, 0x82, 0xc9, 0x87, 0xae, 0xb7, - 0x8f, 0xe3, 0xab, 0x74, 0x02, 0x8e, 0xfc, 0x81, 0x2c, 0x88, 0x37, 0x48, 0x27, 0x51, 0xbf, 0x4d, - 0xe9, 0x0d, 0xfd, 0xdb, 0x62, 0x1c, 0x34, 0x02, 0x36, 0x0e, 0x21, 0xc7, 0x70, 0x75, 0xe0, 0x38, - 0x44, 0x9f, 0xa0, 0x4d, 0x61, 0x15, 0xdd, 0xf8, 0x2f, 0x33, 0xea, 0x79, 0xce, 0x3a, 0xb9, 0xe2, - 0xb6, 0x6c, 0xa7, 0xad, 0x34, 0x87, 0x3f, 0x2c, 0x21, 0x34, 0xfe, 0x25, 0x0a, 0x32, 0xb9, 0x09, - 0x79, 0xfe, 0x2b, 0xdc, 0x6b, 0x51, 0xab, 0x25, 0x08, 0xf5, 0x83, 0x42, 0x22, 0x26, 0x46, 0x26, - 0x77, 0xda, 0x91, 0xf9, 0xed, 0x8c, 0x7a, 0x14, 0x7f, 0xdc, 0xc3, 0x26, 0x76, 0xc8, 0x64, 0x4f, - 0x73, 0xc8, 0x3c, 0x71, 0x13, 0xbe, 0x3f, 0x03, 0xe3, 0x8a, 0x96, 0x82, 0xb5, 0x61, 0xc3, 0x73, - 0x3f, 0xa2, 0xf5, 0x40, 0x6f, 0x43, 0x87, 0x03, 0x63, 0x6d, 0x08, 0x51, 0x9f, 0xa0, 0x0d, 0xc6, - 0x9f, 0x65, 0xc4, 0x1d, 0x69, 0xe0, 0x6d, 0x5e, 0xdf, 0x92, 0xb3, 0xa7, 0x39, 0x22, 0xbf, 0x08, - 0xc3, 0x26, 0x6d, 0x38, 0xbe, 0xb8, 0xdf, 0xcc, 0xa8, 0xf7, 0x31, 0x2c, 0x88, 0xe4, 0x26, 0x8f, - 0xfd, 0x54, 0xcf, 0x37, 0x2c, 0x67, 0x82, 0x6c, 0xd5, 0xbf, 0xdd, 0xa4, 0x8f, 0x1d, 0xbe, 0x18, - 0xc5, 0x51, 0x8b, 0xc7, 0x9b, 0xe3, 0x5b, 0x3b, 0xac, 0x44, 0x48, 0xd4, 0xea, 0xc2, 0xd3, 0x68, - 0x8c, 0x0f, 0x01, 0xa2, 0x2a, 0xc9, 0x3d, 0x28, 0x88, 0xd9, 0xe0, 0xb4, 0x77, 0xb9, 0x20, 0x25, - 0xfa, 0xa0, 0x78, 0x7c, 0x54, 0x7c, 0xbe, 0x1e, 0x96, 0x09, 0xa9, 0x53, 0xe1, 0x9b, 0x20, 0x34, - 0xfe, 0x83, 0x2c, 0x64, 0x4b, 0x38, 0x20, 0xf7, 0xe8, 0x61, 0x60, 0x6f, 0xdf, 0x76, 0x9a, 0xda, - 0x62, 0xda, 0x47, 0xa8, 0xb5, 0xe3, 0x68, 0xea, 0x0a, 0x05, 0x99, 0x2d, 0xa6, 0x7b, 0xde, 0xf6, - 0x5b, 0x48, 0xa8, 0x2c, 0xa6, 0x7d, 0x6f, 0xfb, 0xad, 0x38, 0x59, 0x88, 0x48, 0x0c, 0x18, 0xe1, - 0x0b, 0x4b, 0xcc, 0x41, 0x38, 0x3e, 0x2a, 0x8e, 0xf0, 0xf5, 0x67, 0x8a, 0x12, 0x72, 0x1e, 0x72, - 0xb5, 0x8d, 0x75, 0xb1, 0x03, 0xa2, 0x5a, 0xd0, 0xef, 0xb4, 0x4d, 0x06, 0x63, 0x75, 0xae, 0x56, - 0x4a, 0x1b, 0xa8, 0x08, 0x18, 0x8e, 0xea, 0x6c, 0x36, 0xec, 0x4e, 0x5c, 0x15, 0x10, 0x22, 0x92, - 0xf7, 0x60, 0xfc, 0x5e, 0xa5, 0xbc, 0xe2, 0xfa, 0x7c, 0xf7, 0x1a, 0x89, 0x26, 0xff, 0x7e, 0xa3, - 0x6e, 0xa1, 0x26, 0x3e, 0x7e, 0x0c, 0x28, 0xf8, 0xc6, 0x8f, 0x64, 0x61, 0x5c, 0xd1, 0x93, 0x91, - 0xcf, 0x8a, 0x07, 0xd2, 0x8c, 0x76, 0x03, 0x50, 0x30, 0x58, 0x29, 0x57, 0xaa, 0xb4, 0xdc, 0x06, - 0x15, 0xcf, 0xa5, 0x91, 0x02, 0x23, 0x3b, 0x88, 0x02, 0xe3, 0x6d, 0x00, 0x3e, 0x07, 0xf0, 0x93, - 0x15, 0x71, 0x42, 0xb1, 0x93, 0x50, 0xc7, 0x25, 0x42, 0x26, 0x0f, 0x60, 0x76, 0xd3, 0xeb, 0xfa, - 0x41, 0xed, 0xd0, 0x0f, 0x68, 0x8b, 0x71, 0xdb, 0x70, 0xdd, 0xa6, 0x98, 0x7f, 0x2f, 0x1f, 0x1f, - 0x15, 0x2f, 0xa1, 0x71, 0x87, 0xe5, 0x63, 0x39, 0x7e, 0x80, 0xd5, 0x71, 0x5d, 0x55, 0xad, 0x91, - 0xc6, 0xc0, 0x30, 0x61, 0x42, 0x55, 0x8a, 0xb0, 0x93, 0x45, 0x3c, 0x26, 0x09, 0x55, 0xb7, 0x72, - 0xb2, 0x88, 0xaf, 0x4c, 0x3e, 0x6e, 0xe9, 0x24, 0xc6, 0x67, 0x55, 0x85, 0xdc, 0xa0, 0x0b, 0xdb, - 0xf8, 0xc1, 0x4c, 0xb4, 0x8d, 0x3c, 0xb8, 0x41, 0xde, 0x81, 0x11, 0xfe, 0x78, 0x27, 0xde, 0x38, - 0xcf, 0x84, 0x97, 0x5a, 0xf5, 0x65, 0x8f, 0x6b, 0xc2, 0xff, 0x90, 0x3f, 0xf0, 0x3f, 0x67, 0x0a, - 0x92, 0x50, 0x89, 0xae, 0xeb, 0xd3, 0x24, 0x77, 0x54, 0x17, 0xdf, 0x48, 0x53, 0xa2, 0x1b, 0x3f, - 0x31, 0x0c, 0x53, 0x3a, 0x9a, 0xfa, 0xc2, 0x97, 0x19, 0xe8, 0x85, 0xef, 0x8b, 0x90, 0x67, 0xfd, - 0xe1, 0xd4, 0xa9, 0x94, 0xc8, 0x5e, 0xc6, 0xa7, 0x05, 0x01, 0xd3, 0x5e, 0xae, 0x81, 0x0f, 0x07, - 0xbb, 0xe3, 0x9a, 0x21, 0x15, 0x59, 0x54, 0x9e, 0xa1, 0x72, 0x91, 0x90, 0x22, 0x9f, 0xa1, 0xd4, - 0xf5, 0x10, 0x3e, 0x48, 0xbd, 0x09, 0x23, 0x4c, 0xbe, 0x0f, 0x55, 0x30, 0xf8, 0x95, 0x4c, 0xf4, - 0x8f, 0x99, 0xa8, 0x70, 0x24, 0xf2, 0x10, 0xf2, 0xab, 0xb6, 0x1f, 0xd4, 0x28, 0x6d, 0x0f, 0xf0, - 0x76, 0x5f, 0x14, 0x5d, 0x35, 0x8b, 0x0f, 0xe3, 0x3e, 0xa5, 0xed, 0xd8, 0xe3, 0x6b, 0xc8, 0x8c, - 0x7c, 0x0d, 0xa0, 0xec, 0xb6, 0x03, 0xcf, 0x6d, 0xae, 0xba, 0xbb, 0xf3, 0x23, 0x78, 0xf7, 0xbd, - 0x18, 0x1b, 0x80, 0x08, 0x81, 0x5f, 0x7f, 0x43, 0x05, 0x4f, 0x9d, 0x17, 0x58, 0x4d, 0x77, 0x57, - 0x5d, 0x07, 0x11, 0x3e, 0xb9, 0x0d, 0x05, 0xa9, 0x58, 0xd8, 0xea, 0xec, 0x7a, 0x38, 0x41, 0x46, - 0x23, 0xc9, 0x83, 0x3e, 0x0e, 0xac, 0xae, 0x80, 0xab, 0x3b, 0x65, 0x9c, 0x86, 0x7c, 0x15, 0xce, - 0xc5, 0x61, 0x72, 0x94, 0xf3, 0x91, 0x4c, 0xae, 0xb2, 0x4b, 0x99, 0xf7, 0xbd, 0x58, 0x90, 0x3b, - 0x30, 0xcd, 0x3a, 0x64, 0x8d, 0xda, 0x7e, 0x97, 0x1b, 0x58, 0x09, 0xd5, 0xcc, 0x05, 0xa9, 0x89, - 0xe2, 0xab, 0xb0, 0xe9, 0xd6, 0xf7, 0x15, 0x24, 0x33, 0x4e, 0x65, 0x1c, 0x65, 0xe1, 0x6c, 0x3a, - 0x2e, 0xf9, 0x3e, 0x38, 0x23, 0xfa, 0xa5, 0x49, 0x3d, 0x05, 0x67, 0x00, 0x9b, 0x80, 0x37, 0x45, - 0x7f, 0xbf, 0x58, 0x0f, 0x19, 0x84, 0x1b, 0x07, 0x63, 0x11, 0x1b, 0xdc, 0xf4, 0x7a, 0xc8, 0x37, - 0x60, 0x5c, 0xad, 0x36, 0x3b, 0xb8, 0x79, 0x45, 0x9f, 0xba, 0x54, 0x96, 0xc4, 0x86, 0x69, 0x93, - 0x7e, 0xb3, 0x4b, 0xfd, 0x40, 0x1a, 0x78, 0x88, 0xa3, 0xfb, 0x7c, 0xa2, 0x16, 0x89, 0x10, 0xea, - 0x7f, 0x0a, 0x1e, 0xa7, 0xb4, 0xa4, 0x19, 0xde, 0xb7, 0x19, 0xfb, 0x38, 0x3f, 0xe3, 0xbb, 0x59, - 0x38, 0xd7, 0x63, 0x5a, 0xb2, 0x9d, 0x0b, 0x05, 0x2b, 0x65, 0xe7, 0x8a, 0xc9, 0x53, 0xdc, 0x3a, - 0xec, 0x12, 0x64, 0x85, 0x28, 0x32, 0xb4, 0x54, 0x38, 0x3e, 0x2a, 0x4e, 0x68, 0x2b, 0x2e, 0x5b, - 0xad, 0x90, 0xbb, 0x30, 0xc4, 0xba, 0x61, 0x00, 0x23, 0x07, 0xa9, 0xfd, 0x9b, 0x0a, 0x1c, 0x75, - 0xa1, 0x63, 0xdf, 0x20, 0x0f, 0xf2, 0x59, 0xc8, 0x6d, 0x6e, 0xae, 0xe2, 0x2a, 0xcf, 0xe1, 0x2c, - 0x9d, 0x0c, 0x82, 0xa6, 0xb6, 0xa9, 0x4c, 0x32, 0xda, 0xb0, 0x47, 0x4c, 0x86, 0x4e, 0xbe, 0x1c, - 0x33, 0xbe, 0x7a, 0xad, 0xff, 0x92, 0x1c, 0xdc, 0x16, 0xeb, 0x09, 0x4c, 0xa0, 0x8c, 0x5f, 0xc8, - 0x46, 0xbb, 0xed, 0x6d, 0xa7, 0x19, 0x50, 0x8f, 0x2c, 0xf0, 0xcd, 0x33, 0x12, 0xa3, 0xcd, 0xf0, - 0x37, 0x99, 0x8f, 0x76, 0x62, 0xce, 0x2a, 0xdc, 0x72, 0x5f, 0x53, 0xb6, 0xdc, 0x1c, 0x6e, 0xb9, - 0x53, 0x3d, 0x37, 0xd7, 0xd7, 0x52, 0x76, 0x10, 0xdc, 0x32, 0x53, 0x76, 0x89, 0x97, 0x61, 0x72, - 0xdd, 0x5d, 0x7e, 0x1c, 0x84, 0x88, 0x6c, 0xab, 0xcc, 0x9b, 0x3a, 0x90, 0x71, 0xbc, 0xdf, 0x6c, - 0x50, 0x6f, 0x73, 0xcf, 0x6e, 0x6b, 0x56, 0x06, 0x66, 0x02, 0xce, 0x70, 0xd7, 0xe9, 0x81, 0x8e, - 0x3b, 0xca, 0x71, 0xe3, 0x70, 0xe3, 0x07, 0xb2, 0xb2, 0x33, 0x1e, 0x2c, 0x3e, 0xa3, 0xaf, 0xd9, - 0x6f, 0x69, 0xaf, 0xd9, 0xb3, 0xa1, 0x1e, 0x3e, 0x34, 0xcd, 0x58, 0x3c, 0xc1, 0xa2, 0xe3, 0xef, - 0x8d, 0xc0, 0x84, 0x8a, 0xce, 0xfa, 0xa1, 0xd4, 0x68, 0x78, 0x6a, 0x3f, 0xd8, 0x8d, 0x86, 0x67, - 0x22, 0x54, 0x33, 0xe0, 0xc8, 0xf5, 0x35, 0xe0, 0xf8, 0x3a, 0x8c, 0x95, 0x5b, 0x0d, 0xed, 0x59, - 0xd9, 0x48, 0xf9, 0xbc, 0x6b, 0x21, 0x12, 0x5f, 0x0b, 0xa1, 0x7a, 0xb9, 0xde, 0x6a, 0x24, 0x1f, - 0x93, 0x23, 0x96, 0x9a, 0xed, 0xc7, 0xf0, 0x93, 0xd8, 0x7e, 0xdc, 0x82, 0xb1, 0x2d, 0x9f, 0x6e, - 0x76, 0xdb, 0x6d, 0xda, 0xc4, 0x69, 0x95, 0xe7, 0xb7, 0xb2, 0xae, 0x4f, 0xad, 0x00, 0xa1, 0xea, - 0x07, 0x84, 0xa8, 0xea, 0x00, 0x8f, 0xf6, 0x19, 0xe0, 0x9b, 0x90, 0xdf, 0xa0, 0xd4, 0xc3, 0x3e, - 0x1d, 0x8f, 0x84, 0xef, 0x0e, 0xa5, 0x9e, 0xc5, 0x3a, 0x56, 0xb3, 0x09, 0x11, 0x88, 0x9a, 0x21, - 0xc9, 0xc4, 0x80, 0x86, 0x24, 0xe4, 0x45, 0x98, 0xe8, 0x74, 0xb7, 0x9b, 0x4e, 0x1d, 0xf9, 0x0a, - 0x0b, 0x14, 0x73, 0x9c, 0xc3, 0x18, 0x5b, 0x9f, 0x7c, 0x19, 0x26, 0xf1, 0x36, 0x1a, 0x4e, 0xb9, - 0x29, 0xed, 0xfd, 0x55, 0x2b, 0xe3, 0x32, 0x69, 0x9d, 0x81, 0xac, 0x14, 0x43, 0x29, 0x9d, 0x11, - 0xb9, 0x0b, 0xa3, 0xbb, 0x4e, 0x60, 0xed, 0x75, 0xb7, 0xe7, 0xa7, 0x35, 0x2b, 0xa3, 0x3b, 0x4e, - 0xb0, 0xd2, 0xdd, 0xe6, 0x43, 0x1e, 0xb2, 0xc6, 0x1d, 0x6f, 0xd7, 0x09, 0xf6, 0xba, 0xaa, 0xf2, - 0x7c, 0x64, 0x17, 0x71, 0x17, 0x6a, 0x30, 0xa5, 0xcf, 0x8a, 0xa7, 0xf0, 0xa4, 0x1b, 0x1a, 0xd8, - 0xe4, 0x0b, 0x63, 0x77, 0x87, 0xf2, 0x50, 0x18, 0xe7, 0xa6, 0x35, 0x26, 0x6c, 0x84, 0xfd, 0x63, - 0x92, 0x7b, 0xdd, 0x6d, 0xea, 0xb5, 0x69, 0x40, 0x7d, 0x71, 0xf5, 0xf3, 0xcd, 0xa1, 0x52, 0xa7, - 0xe3, 0x1b, 0xff, 0x49, 0x16, 0x46, 0x4b, 0x0f, 0x6b, 0xd5, 0xf6, 0x8e, 0x8b, 0x0f, 0xb3, 0xe1, - 0x7b, 0x9c, 0xfa, 0x30, 0x1b, 0xbe, 0xc7, 0xa9, 0xaf, 0x70, 0xd7, 0x53, 0x2e, 0xef, 0x68, 0xbb, - 0xad, 0x5c, 0xde, 0x35, 0xb5, 0x43, 0xf4, 0x34, 0x99, 0x1b, 0xe0, 0x69, 0x32, 0xd4, 0x1e, 0x0f, - 0x9d, 0xac, 0x3d, 0x7e, 0x07, 0xc6, 0xab, 0xed, 0x80, 0xee, 0x7a, 0xd1, 0xaa, 0x09, 0x15, 0x09, - 0x21, 0x58, 0xbd, 0xd0, 0x29, 0xd8, 0x6c, 0x4a, 0x72, 0x8d, 0x75, 0xa8, 0xa9, 0xc6, 0x29, 0xc9, - 0x15, 0xdb, 0x31, 0x2d, 0x90, 0x44, 0x34, 0x2a, 0xb1, 0xf9, 0x26, 0xcd, 0x3f, 0xb8, 0x08, 0x35, - 0x15, 0x3d, 0xd9, 0xb0, 0x8e, 0x5d, 0x9a, 0x49, 0x37, 0xff, 0x30, 0xfe, 0x56, 0x06, 0xe6, 0xd2, - 0xa6, 0x11, 0x79, 0x1f, 0x26, 0x5c, 0x6f, 0xd7, 0x6e, 0x3b, 0xdf, 0xcb, 0x5b, 0xa4, 0xa8, 0x2a, - 0x55, 0xb8, 0xaa, 0xa0, 0x51, 0xe1, 0xac, 0x43, 0x94, 0x96, 0xeb, 0x9a, 0x95, 0xd4, 0x0e, 0x51, - 0xc0, 0xc6, 0x8f, 0x66, 0x61, 0xbc, 0xd4, 0xe9, 0x3c, 0xe3, 0xa6, 0x81, 0x9f, 0xd7, 0x0e, 0x10, - 0x79, 0x2f, 0x0f, 0xdb, 0x35, 0x90, 0x55, 0xe0, 0xaf, 0x66, 0x61, 0x3a, 0x46, 0xa1, 0x7e, 0x7d, - 0x66, 0x40, 0x83, 0xc0, 0xec, 0x80, 0x06, 0x81, 0xb9, 0xc1, 0x0c, 0x02, 0x87, 0x9e, 0xe4, 0x50, - 0x78, 0x15, 0x72, 0xa5, 0x4e, 0x27, 0x6e, 0x58, 0xd0, 0xe9, 0x3c, 0xb8, 0xc9, 0x75, 0x2b, 0x76, - 0xa7, 0x63, 0x32, 0x0c, 0x6d, 0xa7, 0x1e, 0x19, 0x70, 0xa7, 0x36, 0xde, 0x84, 0x31, 0xe4, 0x85, - 0x66, 0x78, 0x97, 0x00, 0xb7, 0x18, 0x61, 0x81, 0xa7, 0xd5, 0x25, 0x36, 0x9f, 0x7f, 0x99, 0x81, - 0x61, 0xfc, 0xfd, 0x8c, 0xce, 0xb1, 0x45, 0x6d, 0x8e, 0x15, 0x94, 0x39, 0x36, 0xc8, 0xec, 0xfa, - 0x07, 0x39, 0x80, 0xf2, 0x7d, 0xb3, 0xc6, 0x55, 0x70, 0xe4, 0x36, 0x4c, 0xdb, 0xcd, 0xa6, 0x7b, - 0x40, 0x1b, 0x96, 0xeb, 0x39, 0xbb, 0x4e, 0x9b, 0xf7, 0x9c, 0x7c, 0xed, 0xd6, 0x8b, 0xd4, 0x37, - 0x30, 0x51, 0x74, 0x9f, 0x97, 0xa8, 0x7c, 0x5a, 0x34, 0xd8, 0x73, 0x1b, 0x52, 0x99, 0xa0, 0xf1, - 0x11, 0x45, 0x29, 0x7c, 0xd6, 0x78, 0x89, 0xca, 0x67, 0x0f, 0x95, 0x23, 0x52, 0x42, 0xd6, 0xf8, - 0x88, 0xa2, 0x14, 0x3e, 0x5c, 0xa3, 0xe2, 0x93, 0x55, 0x98, 0x41, 0x88, 0x55, 0xf7, 0x68, 0x83, - 0xb6, 0x03, 0xc7, 0x6e, 0xfa, 0x42, 0xfd, 0x84, 0x8a, 0xca, 0x44, 0xa1, 0x7a, 0xfd, 0xc6, 0xc2, - 0x72, 0x54, 0x46, 0xae, 0xc1, 0x68, 0xcb, 0x7e, 0x6c, 0xd9, 0xbb, 0xdc, 0xee, 0x63, 0x92, 0xab, - 0x2b, 0x04, 0x48, 0x3d, 0x46, 0x5a, 0xf6, 0xe3, 0xd2, 0x2e, 0x65, 0xad, 0xa0, 0x8f, 0x3b, 0xae, - 0xaf, 0xb4, 0x62, 0x24, 0x6a, 0x45, 0xac, 0x48, 0x6d, 0x85, 0x28, 0x12, 0xad, 0x30, 0x3e, 0x82, - 0xe7, 0xab, 0xf8, 0x11, 0xc1, 0x61, 0x99, 0xb6, 0x03, 0xea, 0x6d, 0x50, 0xaf, 0xe5, 0xe0, 0x23, - 0x78, 0x8d, 0x06, 0xe4, 0x25, 0xc8, 0x95, 0xcc, 0x75, 0x31, 0x7d, 0xf9, 0x76, 0xaf, 0x99, 0x24, - 0xb0, 0xd2, 0x50, 0xa1, 0x95, 0x3d, 0x41, 0xa1, 0xf5, 0x9f, 0x66, 0x60, 0xa6, 0xd4, 0xe9, 0xe8, - 0xf5, 0xe9, 0xd6, 0x32, 0x99, 0xc1, 0xad, 0x65, 0x1c, 0x98, 0xd2, 0xbe, 0x95, 0x4f, 0x87, 0x48, - 0x68, 0xed, 0xd3, 0x2c, 0xde, 0x49, 0x9d, 0x10, 0x64, 0xf9, 0xfa, 0x53, 0x6f, 0x8c, 0xb1, 0xf1, - 0xbf, 0x8c, 0xe0, 0xfa, 0x17, 0x3b, 0xa5, 0xb0, 0xe7, 0xcc, 0xa4, 0xd8, 0x73, 0xbe, 0x0d, 0x8a, - 0x74, 0xa2, 0x1e, 0x4f, 0x8a, 0x9c, 0xa7, 0xea, 0x71, 0x22, 0x64, 0xb2, 0x1f, 0xb7, 0xec, 0xcc, - 0x61, 0x6b, 0x5e, 0x8a, 0x2f, 0xbe, 0xa7, 0x62, 0xd4, 0xb9, 0x02, 0xa4, 0xda, 0xc6, 0xe7, 0x67, - 0x5a, 0xdb, 0x77, 0x3a, 0x0f, 0xa8, 0xe7, 0xec, 0x1c, 0x8a, 0xc9, 0x8b, 0x9d, 0xef, 0x88, 0x52, - 0xcb, 0xdf, 0x77, 0x3a, 0xd6, 0x23, 0x2c, 0x37, 0x53, 0x68, 0xc8, 0x07, 0x30, 0x6a, 0xd2, 0x03, - 0xcf, 0x09, 0xa4, 0xbd, 0xd2, 0x54, 0xa8, 0x96, 0x44, 0x28, 0x9f, 0xc7, 0x1e, 0xff, 0xa1, 0xee, - 0x68, 0xa2, 0x9c, 0x2c, 0x72, 0x01, 0x83, 0xdb, 0x25, 0x4d, 0x46, 0xad, 0x2d, 0x3d, 0xac, 0xf5, - 0x92, 0x2f, 0xc8, 0x55, 0x18, 0x46, 0x29, 0x45, 0xc8, 0xf1, 0xe8, 0xe7, 0x83, 0x72, 0xaf, 0x2a, - 0x42, 0x21, 0x06, 0xb9, 0x08, 0x10, 0xbe, 0xef, 0xfa, 0xf3, 0x79, 0x94, 0xb0, 0x15, 0x48, 0x5c, - 0xc4, 0x1a, 0x3b, 0x95, 0x88, 0xb5, 0x0a, 0x05, 0x93, 0xbb, 0x0c, 0x36, 0x4a, 0x1d, 0x7c, 0x44, - 0xf4, 0xe7, 0x01, 0x57, 0xe1, 0xa5, 0xe3, 0xa3, 0xe2, 0x0b, 0xc2, 0x9d, 0xb0, 0x61, 0xd9, 0x1d, - 0xfe, 0xf6, 0xa8, 0x6d, 0x01, 0x71, 0x4a, 0xf2, 0x36, 0x0c, 0xb1, 0x6d, 0x53, 0xd8, 0x80, 0xca, - 0xc7, 0x98, 0x68, 0x27, 0xe5, 0x2b, 0xab, 0xee, 0x6a, 0xeb, 0x19, 0x49, 0x88, 0x05, 0x53, 0xfa, - 0x74, 0x17, 0xe6, 0x40, 0xf3, 0x51, 0x7f, 0xea, 0xe5, 0xe2, 0x85, 0x46, 0xc0, 0xac, 0x3a, 0x02, - 0xd5, 0x15, 0xa0, 0xa3, 0x7f, 0x72, 0x86, 0x9b, 0xbf, 0x9a, 0x85, 0x97, 0x42, 0x51, 0xe4, 0xbe, - 0x57, 0x2b, 0xad, 0xad, 0x56, 0x1b, 0x1b, 0x42, 0x37, 0xb1, 0xe1, 0xb9, 0x8f, 0x9c, 0x06, 0xf5, - 0x1e, 0xdc, 0x38, 0xe1, 0x20, 0x5d, 0xe5, 0xeb, 0x93, 0x3f, 0x41, 0x65, 0x35, 0x13, 0x37, 0x45, - 0xe2, 0x13, 0xfb, 0x4a, 0xa7, 0x93, 0x78, 0x91, 0x5a, 0x79, 0xce, 0x8c, 0x18, 0x90, 0x1f, 0xcc, - 0xc0, 0xd9, 0xf4, 0x0f, 0x11, 0xfa, 0xaa, 0xa2, 0xbc, 0x17, 0xf7, 0xf8, 0xda, 0xa5, 0x57, 0x8f, - 0x8f, 0x8a, 0x2f, 0xf9, 0x76, 0xab, 0x69, 0x39, 0x0d, 0x5e, 0x9b, 0x53, 0xa7, 0x56, 0x47, 0x20, - 0x68, 0xf5, 0xf6, 0xa8, 0xe9, 0x0b, 0x20, 0xcf, 0xd3, 0xf9, 0xcc, 0x12, 0x40, 0x5e, 0x6a, 0xf9, - 0x8d, 0xdf, 0xc8, 0x80, 0xb2, 0x76, 0xf2, 0x26, 0x6d, 0x38, 0x1e, 0xad, 0x07, 0xe2, 0x4c, 0x15, - 0x0e, 0x7a, 0x1c, 0x16, 0xb3, 0x68, 0x44, 0x18, 0x79, 0x1f, 0x46, 0xc5, 0xde, 0x2f, 0xf6, 0x4b, - 0xb9, 0xe6, 0xc4, 0xfb, 0x01, 0xf7, 0xe4, 0x4c, 0x9c, 0x1b, 0x92, 0x88, 0x6d, 0xd7, 0x77, 0x1f, - 0x6e, 0x96, 0x9b, 0xb6, 0xd3, 0xf2, 0x85, 0x0c, 0x82, 0xdd, 0xfa, 0xd1, 0x41, 0x60, 0xd5, 0x11, - 0xaa, 0x6e, 0xd7, 0x21, 0xaa, 0x71, 0x47, 0x3e, 0x5f, 0x9c, 0x60, 0x96, 0x5b, 0x84, 0xe1, 0x07, - 0x91, 0x72, 0x6c, 0x69, 0xec, 0xf8, 0xa8, 0xc8, 0xa7, 0x8b, 0xc9, 0xe1, 0xc6, 0x8f, 0x67, 0x60, - 0x4a, 0x9f, 0x4f, 0xe4, 0x1a, 0x8c, 0x08, 0xe7, 0xb8, 0x0c, 0x2a, 0x01, 0x59, 0x2f, 0x8c, 0x70, - 0xb7, 0x38, 0xcd, 0x19, 0x4e, 0x60, 0x31, 0x29, 0x4a, 0x70, 0x10, 0x22, 0x04, 0x4a, 0x51, 0x75, - 0x0e, 0x32, 0x65, 0x19, 0x31, 0xd8, 0xc5, 0xce, 0xef, 0x36, 0x03, 0xf5, 0x15, 0xcf, 0x43, 0x88, - 0x29, 0x4a, 0x8c, 0x32, 0x8c, 0xf0, 0xcd, 0x2a, 0x66, 0x0e, 0x98, 0x39, 0x85, 0x39, 0xa0, 0x71, - 0x94, 0x01, 0xa8, 0xd5, 0x56, 0xee, 0xd1, 0xc3, 0x0d, 0xdb, 0xc1, 0x13, 0x91, 0x1f, 0x0c, 0xf7, - 0xc4, 0xe2, 0x9a, 0x10, 0xcf, 0xce, 0xfc, 0x10, 0xd9, 0xa7, 0x87, 0xda, 0xb3, 0xb3, 0x44, 0xc5, - 0xd3, 0xc7, 0x73, 0x1e, 0xd9, 0x01, 0x65, 0x84, 0x59, 0x24, 0xe4, 0xa7, 0x0f, 0x87, 0xc6, 0x28, - 0x15, 0x64, 0xf2, 0x35, 0x98, 0x8a, 0x7e, 0x85, 0x8f, 0xe7, 0x53, 0xe1, 0x02, 0xd6, 0x0b, 0x97, - 0x2e, 0x1e, 0x1f, 0x15, 0x17, 0x14, 0xae, 0xf1, 0x67, 0xf5, 0x18, 0x33, 0xe3, 0x97, 0x33, 0x68, - 0x32, 0x22, 0x1b, 0x78, 0x19, 0x86, 0x42, 0x23, 0xe7, 0x09, 0xb1, 0xad, 0xe9, 0x0f, 0x84, 0x58, - 0xce, 0xa4, 0x8f, 0xa8, 0x25, 0x78, 0x18, 0xe8, 0x2d, 0x60, 0xa5, 0xe4, 0x0e, 0x8c, 0x0e, 0xf4, - 0xcd, 0xb8, 0x34, 0x52, 0xbe, 0x55, 0x52, 0xe3, 0x28, 0xdc, 0x7d, 0xb8, 0xf9, 0xe9, 0x1d, 0x85, - 0x9f, 0xca, 0xc2, 0x34, 0xeb, 0xd7, 0x52, 0x37, 0xd8, 0x73, 0x3d, 0x27, 0x38, 0x7c, 0x66, 0xb5, - 0xa8, 0xef, 0x6a, 0x17, 0x94, 0x05, 0x79, 0xca, 0xa8, 0x6d, 0x1b, 0x48, 0x99, 0xfa, 0xdf, 0x0d, - 0xc3, 0x6c, 0x0a, 0x15, 0x79, 0x43, 0x7b, 0xe8, 0x98, 0x97, 0xce, 0xef, 0xdf, 0x3d, 0x2a, 0x4e, - 0x48, 0xf4, 0xcd, 0xc8, 0x19, 0x7e, 0x51, 0xb7, 0xbf, 0xe2, 0x3d, 0x85, 0xef, 0x1e, 0xaa, 0xfd, - 0x95, 0x6e, 0x75, 0x75, 0x15, 0x86, 0x4d, 0xb7, 0x49, 0xa5, 0xcd, 0x21, 0x8a, 0x30, 0x1e, 0x03, - 0x68, 0x36, 0x16, 0x0c, 0x40, 0x56, 0x60, 0x94, 0xfd, 0xb1, 0x66, 0x77, 0xc4, 0xeb, 0x21, 0x09, - 0xaf, 0xc8, 0x08, 0xed, 0x38, 0xed, 0x5d, 0xf5, 0x96, 0xdc, 0xa4, 0x56, 0xcb, 0xee, 0x68, 0xb2, - 0x16, 0x47, 0xd4, 0x6e, 0xdb, 0xf9, 0xde, 0xb7, 0xed, 0xcc, 0x89, 0xb7, 0xed, 0x1d, 0x80, 0x9a, - 0xb3, 0xdb, 0x76, 0xda, 0xbb, 0xa5, 0xe6, 0xae, 0x08, 0x21, 0x70, 0xb5, 0xf7, 0x28, 0x5c, 0x8b, - 0x90, 0x71, 0xe2, 0x3e, 0x8f, 0x4f, 0xfc, 0x1c, 0x66, 0xd9, 0xcd, 0x5d, 0xcd, 0xd5, 0x49, 0xe1, - 0x4c, 0xd6, 0x01, 0x4a, 0xf5, 0xc0, 0x79, 0xc4, 0xa6, 0xb0, 0x2f, 0x04, 0x23, 0xf9, 0xc9, 0xe5, - 0xd2, 0x3d, 0x7a, 0x88, 0xc2, 0xbc, 0x7c, 0x2c, 0xb5, 0x11, 0x95, 0xad, 0x04, 0xcd, 0x8f, 0x25, - 0xe2, 0x40, 0x3a, 0x70, 0xa6, 0xd4, 0x68, 0x38, 0xac, 0x0d, 0x76, 0x73, 0x93, 0x07, 0x7f, 0x40, - 0xd6, 0x13, 0xe9, 0xac, 0xaf, 0xca, 0x77, 0x41, 0x3b, 0xa4, 0xb2, 0x64, 0xcc, 0x88, 0x58, 0x35, - 0xe9, 0x8c, 0x8d, 0x1a, 0x4c, 0xe9, 0x8d, 0xd7, 0x43, 0x1f, 0x4c, 0x40, 0xde, 0xac, 0x95, 0xac, - 0xda, 0x4a, 0xe9, 0x46, 0x21, 0x43, 0x0a, 0x30, 0x21, 0x7e, 0x2d, 0x5a, 0x8b, 0x6f, 0xdd, 0x2a, - 0x64, 0x35, 0xc8, 0x5b, 0x37, 0x16, 0x0b, 0xb9, 0x85, 0xec, 0x7c, 0x26, 0xe6, 0x75, 0x38, 0x5a, - 0xc8, 0x73, 0x05, 0xa9, 0xf1, 0x6b, 0x19, 0xc8, 0xcb, 0x6f, 0x27, 0xb7, 0x20, 0x57, 0xab, 0xad, - 0xc4, 0xfc, 0x04, 0xa3, 0x53, 0x86, 0xef, 0xa7, 0xbe, 0xaf, 0x1a, 0x83, 0x33, 0x02, 0x46, 0xb7, - 0xb9, 0x5a, 0x13, 0xc2, 0x81, 0xa4, 0x8b, 0x36, 0x6f, 0x4e, 0x97, 0xe2, 0x3c, 0x75, 0x0b, 0x72, - 0x77, 0x1f, 0x6e, 0x8a, 0x6b, 0x8b, 0xa4, 0x8b, 0xf6, 0x53, 0x4e, 0xf7, 0xd1, 0x81, 0xba, 0xcb, - 0x33, 0x02, 0xc3, 0x84, 0x71, 0x65, 0x22, 0xf3, 0x43, 0xb7, 0xe5, 0x86, 0xfe, 0xfe, 0xe2, 0xd0, - 0x65, 0x10, 0x53, 0x94, 0x30, 0x19, 0x61, 0xd5, 0xad, 0xdb, 0x4d, 0x71, 0x7a, 0xa3, 0x8c, 0xd0, - 0x64, 0x00, 0x93, 0xc3, 0x8d, 0xdf, 0xc9, 0x40, 0x01, 0x25, 0x29, 0x34, 0xe6, 0x76, 0xf7, 0x69, - 0xfb, 0xc1, 0x0d, 0xf2, 0xa6, 0x5c, 0x72, 0x99, 0x50, 0xed, 0x33, 0x8c, 0x4b, 0x2e, 0xf6, 0x32, - 0x26, 0x96, 0x9d, 0x12, 0x52, 0x21, 0x3b, 0xb8, 0x2b, 0xf6, 0x09, 0x21, 0x15, 0x8a, 0x30, 0x8c, - 0x9f, 0x23, 0x36, 0x47, 0xfc, 0xf2, 0x80, 0x01, 0x4c, 0x0e, 0x57, 0xf6, 0xa6, 0x9f, 0xc9, 0x26, - 0xda, 0xb0, 0xf8, 0xa9, 0x72, 0x67, 0xd6, 0x1b, 0x37, 0xd0, 0x7e, 0xfd, 0x21, 0xcc, 0xc5, 0xbb, - 0x04, 0x55, 0x72, 0x25, 0x98, 0xd6, 0xe1, 0x52, 0x3b, 0x77, 0x2e, 0xb5, 0xae, 0x07, 0x8b, 0x66, - 0x1c, 0xdf, 0xf8, 0x3f, 0x32, 0x30, 0x86, 0x7f, 0x9a, 0xdd, 0x26, 0x1a, 0xd5, 0x95, 0x1e, 0xd6, - 0x84, 0xb2, 0x41, 0x15, 0xe6, 0xec, 0x03, 0xdf, 0x12, 0x9a, 0x09, 0x6d, 0x8f, 0x09, 0x91, 0x05, - 0x29, 0xd7, 0xf6, 0x4b, 0x15, 0x55, 0x48, 0xca, 0x9f, 0x05, 0xfc, 0x18, 0xa9, 0x40, 0x46, 0x53, - 0xdc, 0x87, 0x35, 0x36, 0xfd, 0x54, 0x2b, 0x17, 0xa4, 0x73, 0x9b, 0xba, 0x29, 0x2e, 0x47, 0x43, - 0x23, 0x97, 0x87, 0xb5, 0x92, 0xb9, 0xae, 0x19, 0xb9, 0xb0, 0x6f, 0xd4, 0xd4, 0x34, 0x02, 0xc9, - 0xf8, 0x85, 0xf1, 0x78, 0x07, 0x8a, 0x03, 0xef, 0x94, 0x6b, 0xe3, 0x1d, 0x18, 0x2e, 0x35, 0x9b, - 0xee, 0x81, 0xd8, 0x25, 0xa4, 0x86, 0x30, 0xec, 0x3f, 0x7e, 0x9e, 0xa1, 0x92, 0x4b, 0x73, 0xd1, - 0x64, 0x00, 0x52, 0x86, 0xb1, 0xd2, 0xc3, 0x5a, 0xb5, 0x5a, 0xd9, 0xdc, 0xe4, 0xee, 0x68, 0xb9, - 0xa5, 0x57, 0x64, 0xff, 0x38, 0x4e, 0xc3, 0x8a, 0xbf, 0xde, 0x47, 0xf2, 0x7b, 0x44, 0x47, 0xde, - 0x03, 0xb8, 0xeb, 0x3a, 0x6d, 0xae, 0xd4, 0x13, 0x8d, 0x67, 0x77, 0xda, 0xf1, 0x8f, 0x5c, 0xa7, - 0x2d, 0xb4, 0x80, 0xec, 0xdb, 0x23, 0x24, 0x53, 0xf9, 0x9b, 0xf5, 0xf4, 0x92, 0xcb, 0x0d, 0xe5, - 0x86, 0xa3, 0x9e, 0xde, 0x76, 0x13, 0x36, 0x72, 0x12, 0x8d, 0xb4, 0x60, 0xba, 0xd6, 0xdd, 0xdd, - 0xa5, 0x6c, 0x67, 0x17, 0x1a, 0x9a, 0x11, 0x71, 0xc7, 0x0d, 0x83, 0x00, 0xf1, 0xfb, 0x08, 0xbb, - 0xa5, 0xf8, 0x4b, 0x6f, 0xb0, 0x89, 0xfc, 0x9d, 0xa3, 0xa2, 0xb0, 0x0a, 0x60, 0xa2, 0x9a, 0x2f, - 0xe9, 0x93, 0xfa, 0x99, 0x38, 0x6f, 0x72, 0x1f, 0x46, 0xf8, 0x0b, 0x8a, 0x70, 0xaf, 0x7a, 0xb1, - 0xcf, 0xa2, 0xe1, 0x88, 0xbd, 0xde, 0xe8, 0x78, 0x29, 0x79, 0x08, 0xf9, 0xb2, 0xe3, 0xd5, 0x9b, - 0xb4, 0x5c, 0x15, 0x67, 0xff, 0x4b, 0x7d, 0x58, 0x4a, 0x54, 0xde, 0x2f, 0x75, 0xfc, 0x55, 0x77, - 0x54, 0x59, 0x40, 0x62, 0x90, 0xbf, 0x95, 0x81, 0xe7, 0xc3, 0xaf, 0x2f, 0xed, 0xd2, 0x76, 0xb0, - 0x66, 0x07, 0xf5, 0x3d, 0xea, 0x89, 0x5e, 0x1a, 0xeb, 0xd7, 0x4b, 0x5f, 0x48, 0xf4, 0xd2, 0x95, - 0xa8, 0x97, 0x6c, 0xc6, 0xcc, 0x6a, 0x71, 0x6e, 0xc9, 0x3e, 0xeb, 0x57, 0x2b, 0xb1, 0x00, 0xa2, - 0xb7, 0x41, 0xe1, 0x9e, 0xfb, 0x4a, 0x9f, 0x06, 0x47, 0xc8, 0xc2, 0xad, 0x26, 0xfc, 0xad, 0xd9, - 0x85, 0x86, 0x50, 0x72, 0x4f, 0xfa, 0x32, 0x72, 0xa9, 0xe4, 0x52, 0x1f, 0xde, 0xdc, 0xbf, 0x71, - 0xb6, 0x8f, 0xd7, 0x32, 0x1f, 0xed, 0x55, 0x7b, 0x5b, 0x08, 0x22, 0x27, 0x8c, 0xf6, 0xaa, 0x1d, - 0x8d, 0x76, 0xd3, 0x8e, 0x8f, 0xf6, 0xaa, 0xbd, 0x4d, 0xca, 0xdc, 0x01, 0x9b, 0x7b, 0xeb, 0x5e, - 0xec, 0xc7, 0xad, 0xbc, 0xc1, 0x4f, 0xe6, 0x14, 0x47, 0xec, 0xaf, 0xc0, 0x58, 0xad, 0x63, 0xd7, - 0x69, 0xd3, 0xd9, 0x09, 0xc4, 0xc3, 0xf3, 0xcb, 0x7d, 0x58, 0x85, 0xb8, 0xe2, 0xa1, 0x51, 0xfe, - 0x54, 0xaf, 0x49, 0x21, 0x0e, 0xfb, 0xc2, 0xcd, 0x8d, 0x35, 0xf1, 0xf6, 0xdc, 0xef, 0x0b, 0x37, - 0x37, 0xd6, 0x84, 0xcc, 0xd1, 0x69, 0x69, 0x32, 0xc7, 0xc6, 0x1a, 0xe9, 0xc0, 0xd4, 0x26, 0xf5, - 0x3c, 0x7b, 0xc7, 0xf5, 0x5a, 0x5c, 0x23, 0xc8, 0x3d, 0xc0, 0xae, 0xf6, 0xe3, 0xa7, 0x11, 0x70, - 0x45, 0x58, 0x20, 0x61, 0x56, 0x5c, 0x8d, 0x18, 0xe3, 0xcf, 0xfa, 0x64, 0xc9, 0x09, 0xb6, 0xbb, - 0xf5, 0x7d, 0x1a, 0xcc, 0xcf, 0x9c, 0xd8, 0x27, 0x21, 0x2e, 0xef, 0x93, 0x6d, 0xf9, 0x53, 0xed, - 0x93, 0x10, 0xc7, 0xf8, 0xcd, 0x1c, 0x9c, 0xeb, 0xd1, 0x05, 0x64, 0x5d, 0x6e, 0xb9, 0x19, 0x4d, - 0x2f, 0xdc, 0x03, 0xfd, 0xda, 0x89, 0xbb, 0xf0, 0x2a, 0x14, 0x96, 0xef, 0xa1, 0xac, 0xce, 0x9f, - 0x35, 0xca, 0x25, 0x79, 0x58, 0xa1, 0xee, 0x92, 0xee, 0xa3, 0xc5, 0xac, 0x7c, 0x0e, 0xa9, 0x6b, - 0xae, 0xe1, 0x09, 0xca, 0x85, 0x1f, 0xc8, 0xc2, 0x10, 0x1e, 0x9c, 0xb1, 0x80, 0x58, 0x99, 0x53, - 0x05, 0xc4, 0xfa, 0x22, 0x4c, 0x2c, 0xdf, 0xe3, 0x37, 0xe9, 0x15, 0xdb, 0xdf, 0x13, 0xdb, 0x3a, - 0x9a, 0x35, 0xd0, 0x7d, 0x4b, 0x5c, 0xbc, 0xf7, 0x6c, 0x4d, 0x66, 0xd5, 0x28, 0xc8, 0x16, 0xcc, - 0xf2, 0x6f, 0x73, 0x76, 0x9c, 0x3a, 0x8f, 0xab, 0xe3, 0xd8, 0x4d, 0xb1, 0xc7, 0xbf, 0x74, 0x7c, - 0x54, 0x2c, 0xd2, 0x7d, 0xb4, 0x05, 0x16, 0xe5, 0x96, 0x8f, 0x08, 0xaa, 0x51, 0x70, 0x0a, 0xbd, - 0x1a, 0xec, 0xc3, 0x1c, 0xc3, 0x0a, 0x59, 0x6d, 0xac, 0x6e, 0x86, 0xcb, 0x91, 0x8c, 0x3f, 0x1d, - 0x86, 0x85, 0xde, 0xdb, 0x33, 0xf9, 0x92, 0x3e, 0x80, 0x97, 0x4f, 0xdc, 0xd0, 0x4f, 0x1e, 0xc3, - 0x2f, 0xc3, 0xdc, 0x72, 0x3b, 0xa0, 0x5e, 0xc7, 0x73, 0x64, 0x78, 0x97, 0x15, 0xd7, 0x97, 0xb6, - 0xd7, 0x68, 0x04, 0x4d, 0xc3, 0x72, 0xa1, 0xf4, 0x44, 0x4b, 0x70, 0x85, 0x55, 0x2a, 0x07, 0xb2, - 0x0c, 0x53, 0x0a, 0xbc, 0xd9, 0xdd, 0x15, 0x02, 0x09, 0x7f, 0x5d, 0x52, 0x78, 0x36, 0xbb, 0xaa, - 0x61, 0x6a, 0x8c, 0x08, 0xed, 0xbb, 0xd9, 0x95, 0xb1, 0x7e, 0xf7, 0xe1, 0xbd, 0x9a, 0x18, 0x4e, - 0x6e, 0xdf, 0x8d, 0x50, 0xeb, 0xa3, 0x83, 0x7d, 0x6d, 0x7f, 0x8d, 0x90, 0x17, 0x7e, 0x39, 0x27, - 0x66, 0xd4, 0x4b, 0x90, 0xab, 0x75, 0xb7, 0xd5, 0x27, 0x28, 0x5f, 0x3b, 0xe0, 0x58, 0x29, 0xf9, - 0x3c, 0x80, 0x49, 0x3b, 0xae, 0xef, 0x04, 0xae, 0x77, 0xa8, 0x3a, 0x18, 0x7a, 0x21, 0x54, 0xf7, - 0x81, 0x90, 0x50, 0xb2, 0x02, 0xd3, 0xd1, 0xaf, 0xfb, 0x07, 0x6d, 0xa1, 0xe4, 0x1d, 0xe3, 0xda, - 0x95, 0x88, 0xdc, 0x72, 0x59, 0x99, 0x7a, 0x64, 0xc7, 0xc8, 0xc8, 0x22, 0xe4, 0x1f, 0xba, 0xde, - 0xfe, 0x0e, 0x1b, 0xe3, 0xa1, 0x48, 0xa8, 0x38, 0x10, 0x30, 0xf5, 0xf0, 0x94, 0x78, 0x6c, 0xb9, - 0x2c, 0xb7, 0x1f, 0x39, 0x9e, 0xdb, 0x46, 0x9b, 0x58, 0xc5, 0xc2, 0x83, 0x46, 0x60, 0xcd, 0xb5, - 0x3b, 0x02, 0x93, 0xab, 0x30, 0x5c, 0xaa, 0x07, 0xae, 0x27, 0xcc, 0x3b, 0xf8, 0x4c, 0x61, 0x00, - 0x6d, 0xa6, 0x30, 0x00, 0xeb, 0x44, 0x93, 0xee, 0x88, 0xf7, 0x12, 0xec, 0x44, 0x8f, 0xee, 0x68, - 0x7e, 0xeb, 0x74, 0x87, 0x09, 0x45, 0x26, 0xdd, 0x41, 0xc5, 0x87, 0x16, 0xee, 0x6d, 0x27, 0xa1, - 0x32, 0x13, 0x68, 0xc6, 0xef, 0x8d, 0xf5, 0x9c, 0xf2, 0xec, 0x14, 0x3a, 0xdd, 0x94, 0x5f, 0xb5, - 0x07, 0x98, 0xf2, 0x6f, 0x84, 0x9e, 0x15, 0x6a, 0xb0, 0x06, 0x84, 0xa8, 0xc7, 0x20, 0xc7, 0x59, - 0xf8, 0x95, 0xfc, 0x69, 0x26, 0x91, 0xe8, 0xa4, 0xec, 0xa0, 0x9d, 0x94, 0x1b, 0xa8, 0x93, 0xc8, - 0x12, 0x4c, 0x86, 0x01, 0x03, 0x37, 0xec, 0x40, 0xdb, 0xd6, 0xc2, 0x28, 0x8f, 0x56, 0xc7, 0x0e, - 0xd4, 0x6d, 0x4d, 0x27, 0x21, 0xef, 0xc2, 0xb8, 0x70, 0x2f, 0x42, 0x0e, 0xc3, 0x91, 0xdd, 0x8c, - 0xf4, 0x45, 0x8a, 0xd1, 0xab, 0xe8, 0x6c, 0x35, 0x6f, 0x38, 0x1d, 0xda, 0x74, 0xda, 0xb4, 0x86, - 0xaf, 0x08, 0x62, 0xc6, 0xf0, 0x67, 0x50, 0x51, 0x62, 0xf1, 0x07, 0x06, 0x4d, 0x7f, 0xa8, 0x11, - 0xc5, 0x27, 0xeb, 0xe8, 0xa9, 0x26, 0x2b, 0xb7, 0xda, 0xf3, 0x56, 0xdd, 0x5d, 0x47, 0x5a, 0x94, - 0x4b, 0xab, 0x3d, 0xcf, 0x6a, 0x32, 0x68, 0xcc, 0x6a, 0x8f, 0xa3, 0xb2, 0x1b, 0x0e, 0xfb, 0x51, - 0xad, 0x88, 0xb7, 0x39, 0xbc, 0xe1, 0x20, 0x91, 0x6e, 0xc6, 0xcf, 0x91, 0x64, 0x35, 0xcb, 0x2d, - 0xdb, 0x69, 0x0a, 0x9f, 0xfc, 0xa8, 0x1a, 0xca, 0xa0, 0xf1, 0x6a, 0x10, 0x95, 0xd4, 0x61, 0xc2, - 0xa4, 0x3b, 0x1b, 0x9e, 0x1b, 0xd0, 0x7a, 0x40, 0x1b, 0x42, 0xaa, 0x93, 0x17, 0x9b, 0x25, 0xd7, - 0xe5, 0x12, 0x2b, 0x5a, 0x8a, 0x67, 0xbe, 0x73, 0x54, 0x04, 0x06, 0xe2, 0x3e, 0x22, 0xc7, 0x47, - 0xc5, 0x73, 0x6c, 0xfc, 0x3b, 0x92, 0x58, 0x3d, 0x9d, 0x54, 0xa6, 0xe4, 0x5b, 0x6c, 0xbf, 0x0e, - 0xbb, 0x24, 0xaa, 0x6c, 0xa2, 0x47, 0x65, 0x6f, 0xa5, 0x56, 0x56, 0x54, 0x7a, 0x3b, 0xb5, 0xd2, - 0xd4, 0x4a, 0xc8, 0x7b, 0x30, 0x5e, 0xae, 0x96, 0xdd, 0xf6, 0x8e, 0xb3, 0x5b, 0x5b, 0x29, 0xa1, - 0x68, 0x28, 0xfc, 0x83, 0xea, 0x8e, 0x55, 0x47, 0xb8, 0xe5, 0xef, 0xd9, 0x9a, 0x9b, 0x68, 0x84, - 0x4f, 0xee, 0xc0, 0x94, 0xfc, 0x69, 0xd2, 0x9d, 0x2d, 0xb3, 0x8a, 0x12, 0xa1, 0x74, 0xca, 0x0a, - 0x39, 0xb0, 0x8e, 0xe8, 0x7a, 0xea, 0x4d, 0x21, 0x46, 0xc6, 0x26, 0x63, 0x85, 0x76, 0x9a, 0xee, - 0x21, 0xfb, 0xbc, 0x4d, 0x87, 0x7a, 0x28, 0x03, 0x8a, 0xc9, 0xd8, 0x08, 0x4b, 0xac, 0xc0, 0xd1, - 0x5f, 0x24, 0x75, 0x22, 0xb2, 0x0e, 0x33, 0x62, 0x8a, 0x3f, 0x70, 0x7c, 0x67, 0xdb, 0x69, 0x3a, - 0xc1, 0x21, 0x4a, 0x7f, 0x42, 0x80, 0x91, 0xeb, 0xe2, 0x51, 0x58, 0xaa, 0x30, 0x4b, 0x92, 0x1a, - 0xbf, 0x96, 0x85, 0x17, 0xfa, 0xdd, 0x84, 0x48, 0x4d, 0xdf, 0xcc, 0xae, 0x0c, 0x70, 0x7b, 0x3a, - 0x79, 0x3b, 0x5b, 0x86, 0xa9, 0xfb, 0x8a, 0x81, 0x5b, 0x68, 0x70, 0x88, 0x9d, 0xa1, 0x9a, 0xbe, - 0xe9, 0xb3, 0x3d, 0x46, 0xb4, 0xf0, 0x48, 0x6c, 0x73, 0x1f, 0xd7, 0x61, 0xf1, 0x16, 0x8c, 0x95, - 0xdd, 0x76, 0x40, 0x1f, 0x07, 0x31, 0xf7, 0x7c, 0x0e, 0x8c, 0x3b, 0x6b, 0x4a, 0x54, 0xe3, 0x5f, - 0x67, 0xe1, 0x42, 0xdf, 0xab, 0x00, 0xd9, 0xd4, 0x7b, 0xed, 0xea, 0x20, 0xf7, 0x87, 0x93, 0xbb, - 0x6d, 0x31, 0x61, 0x85, 0x76, 0xa2, 0x3f, 0xd0, 0xc2, 0xff, 0x90, 0x11, 0x9d, 0xf4, 0x19, 0x18, - 0xc5, 0xaa, 0xc2, 0x2e, 0xe2, 0x5a, 0x32, 0xdc, 0x85, 0x1d, 0x5d, 0x4b, 0xc6, 0xd1, 0xc8, 0x4d, - 0xc8, 0x97, 0xed, 0x66, 0x53, 0x09, 0x5e, 0x80, 0xd2, 0x7c, 0x1d, 0x61, 0x31, 0x53, 0x4a, 0x89, - 0xc8, 0x64, 0x1f, 0xfe, 0xb7, 0x72, 0x56, 0xe0, 0x66, 0x29, 0xc8, 0x62, 0xc7, 0x85, 0x82, 0x8c, - 0x21, 0x4f, 0xeb, 0x6e, 0xe8, 0x1e, 0xcd, 0x43, 0x9e, 0x32, 0x80, 0x16, 0xf2, 0x94, 0x01, 0x8c, - 0x5f, 0xcf, 0xc1, 0xc5, 0xfe, 0xf7, 0x59, 0xb2, 0xa5, 0x0f, 0xc1, 0x6b, 0x03, 0xdd, 0x82, 0x4f, - 0x1e, 0x03, 0x19, 0x40, 0x98, 0x77, 0xc8, 0x95, 0xa4, 0x33, 0xc8, 0x77, 0x8f, 0x8a, 0x8a, 0x7d, - 0xee, 0x5d, 0xd7, 0x69, 0x2b, 0x6f, 0x26, 0xdf, 0xd4, 0x24, 0x43, 0xfe, 0xac, 0x7e, 0x6b, 0xb0, - 0x2f, 0x8b, 0xe8, 0xf8, 0xbe, 0x32, 0xa8, 0x44, 0xf9, 0x05, 0x28, 0xc4, 0x49, 0xc9, 0x65, 0x18, - 0xc2, 0x0f, 0x50, 0x3c, 0x5a, 0x62, 0x1c, 0xb0, 0x7c, 0x61, 0x4d, 0xcc, 0x1d, 0x8c, 0xe7, 0x80, - 0x0f, 0xf5, 0xba, 0x6e, 0x50, 0xc4, 0x73, 0xe0, 0xef, 0xfc, 0x49, 0xfd, 0x60, 0x8c, 0xc8, 0xf8, - 0xf3, 0x0c, 0x9c, 0xef, 0xa9, 0x29, 0x20, 0x1b, 0xfa, 0x80, 0xbd, 0x72, 0x92, 0x6a, 0xe1, 0xc4, - 0xb1, 0x5a, 0xf8, 0x09, 0x39, 0xf7, 0xdf, 0x87, 0x89, 0x5a, 0x77, 0x3b, 0x7e, 0x3f, 0xe3, 0xd1, - 0x56, 0x14, 0xb8, 0x7a, 0x82, 0xa9, 0xf8, 0xac, 0xfd, 0xd2, 0x12, 0x41, 0x98, 0xd4, 0x28, 0x36, - 0x78, 0xa1, 0xc3, 0x71, 0x32, 0x9e, 0x85, 0x4e, 0x64, 0xfc, 0x6a, 0x36, 0xfd, 0xa2, 0x7b, 0xa7, - 0xbc, 0x71, 0x9a, 0x8b, 0xee, 0x9d, 0xf2, 0xc6, 0xc9, 0x6d, 0xff, 0xc7, 0xb2, 0xed, 0xf8, 0x30, - 0x2b, 0x76, 0x3c, 0xa9, 0xe8, 0x14, 0x0f, 0xb3, 0x72, 0x77, 0xf4, 0xf5, 0x87, 0x59, 0x89, 0x4c, - 0xde, 0x82, 0xb1, 0x55, 0x97, 0x87, 0x9a, 0x90, 0x2d, 0xe6, 0x1e, 0xb9, 0x12, 0xa8, 0x6e, 0x8f, - 0x21, 0x26, 0xbb, 0x5b, 0xe8, 0x03, 0x2f, 0x4d, 0x0d, 0xf1, 0x6e, 0x11, 0x9b, 0x2e, 0xba, 0x3a, - 0x50, 0x27, 0x33, 0xfe, 0xe3, 0x61, 0x30, 0x4e, 0x56, 0x66, 0x90, 0x0f, 0xf5, 0xbe, 0xbb, 0x36, - 0xb0, 0x1a, 0x64, 0xa0, 0x2d, 0xb7, 0xd4, 0x6d, 0x38, 0xb4, 0x5d, 0xd7, 0xe3, 0x44, 0x08, 0x98, - 0xba, 0x05, 0x4a, 0xbc, 0x8f, 0xe3, 0xb6, 0xb9, 0xf0, 0xdf, 0xe4, 0xa2, 0xa5, 0x16, 0x3b, 0x1a, - 0x33, 0x1f, 0xe3, 0x68, 0x24, 0xf7, 0xa0, 0xa0, 0x42, 0x94, 0x17, 0x5a, 0x94, 0x5c, 0x34, 0x46, - 0xb1, 0x8f, 0x4a, 0x10, 0xea, 0xe7, 0x6b, 0x6e, 0xf0, 0xf3, 0x35, 0x12, 0xdf, 0xb1, 0xfe, 0xa1, - 0xa4, 0xf8, 0x1e, 0x77, 0xcd, 0x56, 0xd0, 0x65, 0x5c, 0x09, 0x5f, 0x1c, 0x5a, 0xc3, 0x7a, 0x5c, - 0x89, 0x94, 0x83, 0x4b, 0x45, 0x97, 0xa1, 0x31, 0xf0, 0xa7, 0xe2, 0x19, 0x1e, 0x86, 0xc6, 0xe0, - 0xf4, 0x69, 0xa1, 0x31, 0x42, 0x12, 0x76, 0x00, 0x9a, 0xdd, 0x36, 0x8f, 0xad, 0x3d, 0x1a, 0x1d, - 0x80, 0x5e, 0xb7, 0x6d, 0xc5, 0xe3, 0x6b, 0x87, 0x88, 0xc6, 0x3f, 0x1a, 0x4a, 0x17, 0x0e, 0x42, - 0x7d, 0xd7, 0x69, 0x84, 0x83, 0x90, 0xe8, 0x93, 0x99, 0xa9, 0x5b, 0x30, 0x2b, 0x2d, 0xde, 0xa4, - 0x05, 0xd6, 0x96, 0xb9, 0x2a, 0x86, 0x18, 0xf5, 0x46, 0xa1, 0xad, 0x9c, 0xb4, 0xe2, 0xb2, 0xba, - 0x9e, 0xa6, 0x37, 0x4a, 0xa1, 0x5f, 0xf8, 0x0d, 0xa9, 0x16, 0x53, 0x07, 0x61, 0x6b, 0x2b, 0x9c, - 0xcb, 0xb1, 0x41, 0xe8, 0x76, 0xb5, 0x61, 0xd4, 0x49, 0xf8, 0xde, 0x2b, 0x55, 0x0e, 0xc8, 0x44, - 0x91, 0x15, 0x15, 0x45, 0x45, 0x8c, 0x4b, 0x8c, 0x88, 0xec, 0xc2, 0xf9, 0x48, 0x94, 0x56, 0x6e, - 0x0a, 0xc8, 0x91, 0x37, 0xf8, 0xea, 0xf1, 0x51, 0xf1, 0x15, 0x45, 0x14, 0x57, 0x2f, 0x1c, 0x31, - 0xee, 0xbd, 0x79, 0xb1, 0xfd, 0x76, 0xc9, 0xb3, 0xdb, 0xf5, 0x3d, 0x65, 0xce, 0xe3, 0x7e, 0xbb, - 0x8d, 0xd0, 0x84, 0x73, 0x7f, 0x84, 0x6c, 0xfc, 0x44, 0x16, 0xa6, 0xf8, 0x59, 0xcd, 0x5f, 0xe7, - 0x9e, 0xd9, 0x97, 0xcf, 0x77, 0xb4, 0x97, 0x4f, 0x19, 0x87, 0x4e, 0x6d, 0xda, 0x40, 0xef, 0x9e, - 0x7b, 0x40, 0x92, 0x34, 0xc4, 0x84, 0x09, 0x15, 0xda, 0xff, 0xc9, 0xf3, 0x46, 0x14, 0xb2, 0x50, - 0x88, 0x4a, 0xf8, 0xee, 0xec, 0x9b, 0x1a, 0x0f, 0xe3, 0xc7, 0xb3, 0x30, 0xa9, 0xd8, 0xa9, 0x3c, - 0xb3, 0x1d, 0xff, 0x05, 0xad, 0xe3, 0xe7, 0x43, 0x7f, 0xb9, 0xb0, 0x65, 0x03, 0xf5, 0x7b, 0x17, - 0x66, 0x12, 0x24, 0x71, 0x73, 0x9f, 0xcc, 0x20, 0xe6, 0x3e, 0x6f, 0x24, 0xe3, 0x9f, 0xf1, 0x34, - 0x02, 0x61, 0x34, 0x1c, 0x35, 0xe0, 0xda, 0x4f, 0x65, 0x61, 0x4e, 0xfc, 0xc2, 0x80, 0xa1, 0x5c, - 0x58, 0x7d, 0x66, 0xc7, 0xa2, 0xa4, 0x8d, 0x45, 0x51, 0x1f, 0x0b, 0xa5, 0x81, 0xbd, 0x87, 0xc4, - 0xf8, 0x61, 0x80, 0xf9, 0x5e, 0x04, 0x03, 0xbb, 0xa5, 0x47, 0x8e, 0x7a, 0xd9, 0x01, 0x1c, 0xf5, - 0x56, 0xa1, 0x80, 0x55, 0x89, 0x90, 0x80, 0xfe, 0x96, 0x59, 0x15, 0x9d, 0x84, 0xfa, 0x05, 0x1e, - 0xd5, 0x55, 0x84, 0x28, 0xf4, 0x63, 0x3a, 0x8f, 0x04, 0x25, 0xf9, 0xe5, 0x0c, 0x4c, 0x21, 0x70, - 0xf9, 0x11, 0x6d, 0x07, 0xc8, 0x6c, 0x48, 0x78, 0x70, 0x85, 0x0f, 0xa3, 0xb5, 0xc0, 0x73, 0xda, - 0xbb, 0xe2, 0x65, 0x74, 0x5b, 0xbc, 0x8c, 0xbe, 0xcb, 0x5f, 0x74, 0xaf, 0xd5, 0xdd, 0xd6, 0xf5, - 0x5d, 0xcf, 0x7e, 0xe4, 0x70, 0x13, 0x2c, 0xbb, 0x79, 0x3d, 0xca, 0x7e, 0xd3, 0x71, 0x62, 0x79, - 0x69, 0x04, 0x2b, 0x7c, 0x75, 0xe6, 0x1f, 0x4a, 0xb1, 0xda, 0xb8, 0x6a, 0x46, 0xff, 0x22, 0xf2, - 0x3d, 0x70, 0x8e, 0x07, 0xea, 0x62, 0x37, 0x7c, 0xa7, 0xdd, 0x75, 0xbb, 0xfe, 0x92, 0x5d, 0xdf, - 0x67, 0x62, 0x3e, 0xf7, 0xb3, 0xc5, 0x96, 0xd7, 0xc3, 0x42, 0x6b, 0x9b, 0x97, 0x6a, 0x11, 0x20, - 0xd2, 0x19, 0x90, 0x15, 0x98, 0xe1, 0x45, 0xa5, 0x6e, 0xe0, 0xd6, 0xea, 0x76, 0xd3, 0x69, 0xef, - 0xa2, 0x2c, 0x91, 0xe7, 0xa2, 0x8c, 0xdd, 0x0d, 0x5c, 0xcb, 0xe7, 0x70, 0x55, 0x53, 0x93, 0x20, - 0x22, 0x55, 0x98, 0x36, 0xa9, 0xdd, 0x58, 0xb3, 0x1f, 0x97, 0xed, 0x8e, 0x5d, 0x77, 0x02, 0x1e, - 0x39, 0x34, 0xc7, 0x05, 0x3a, 0x8f, 0xda, 0x0d, 0xab, 0x65, 0x3f, 0xb6, 0xea, 0xa2, 0x50, 0x57, - 0xd9, 0x6b, 0x74, 0x21, 0x2b, 0xa7, 0x1d, 0xb2, 0x1a, 0x8b, 0xb3, 0x72, 0xda, 0xbd, 0x59, 0x45, - 0x74, 0x92, 0xd5, 0xa6, 0xed, 0xed, 0xd2, 0x80, 0x5b, 0x30, 0xc3, 0xa5, 0xcc, 0x95, 0x8c, 0xc2, - 0x2a, 0xc0, 0x32, 0x0b, 0xad, 0x99, 0xe3, 0xac, 0x14, 0x3a, 0x36, 0xf3, 0x1e, 0x7a, 0x4e, 0x40, - 0xd5, 0x16, 0x8e, 0xe3, 0x67, 0x61, 0xff, 0xa3, 0xed, 0x77, 0xaf, 0x26, 0x26, 0x28, 0x23, 0x6e, - 0x4a, 0x23, 0x27, 0x12, 0xdc, 0xd2, 0x5b, 0x99, 0xa0, 0x0c, 0xb9, 0xa9, 0xed, 0x9c, 0xc4, 0x76, - 0x2a, 0xdc, 0x7a, 0x34, 0x34, 0x41, 0x49, 0xd6, 0x59, 0xa7, 0x05, 0x4c, 0x6e, 0x72, 0xdb, 0xc2, - 0x82, 0x7b, 0x0a, 0x3f, 0xed, 0x65, 0x61, 0x86, 0x58, 0xf0, 0x64, 0xb1, 0x95, 0x62, 0xcf, 0x1d, - 0x27, 0x26, 0x7f, 0x0d, 0xa6, 0xb7, 0x7c, 0x7a, 0xbb, 0xba, 0x51, 0x93, 0x71, 0xbd, 0x50, 0xb9, - 0x38, 0xb5, 0x78, 0xe3, 0x84, 0x4d, 0xe7, 0x9a, 0x4a, 0x83, 0xc9, 0x64, 0xf8, 0xb8, 0x75, 0x7d, - 0x6a, 0xed, 0x38, 0x1d, 0x3f, 0x0c, 0x92, 0xa8, 0x8e, 0x5b, 0xac, 0x2a, 0x63, 0x05, 0x66, 0x12, - 0x6c, 0xc8, 0x14, 0x00, 0x03, 0x5a, 0x5b, 0xeb, 0xb5, 0xe5, 0xcd, 0xc2, 0x73, 0xa4, 0x00, 0x13, - 0xf8, 0x7b, 0x79, 0xbd, 0xb4, 0xb4, 0xba, 0x5c, 0x29, 0x64, 0xc8, 0x0c, 0x4c, 0x22, 0xa4, 0x52, - 0xad, 0x71, 0x50, 0x96, 0xa7, 0x12, 0x30, 0x0b, 0x7c, 0xe9, 0x06, 0x6c, 0x01, 0xe0, 0x99, 0x62, - 0xfc, 0x9d, 0x2c, 0x9c, 0x97, 0xc7, 0x0a, 0x0d, 0x98, 0xe0, 0xe8, 0xb4, 0x77, 0x9f, 0xf1, 0xd3, - 0xe1, 0xb6, 0x76, 0x3a, 0xbc, 0x1c, 0x3b, 0xa9, 0x63, 0xad, 0xec, 0x73, 0x44, 0xfc, 0xf6, 0x18, - 0x5c, 0xe8, 0x4b, 0x45, 0xbe, 0xc4, 0x4e, 0x73, 0x87, 0xb6, 0x83, 0x6a, 0xa3, 0x49, 0x37, 0x9d, - 0x16, 0x75, 0xbb, 0x81, 0xf0, 0x18, 0x78, 0x09, 0xf5, 0x79, 0x58, 0x68, 0x39, 0x8d, 0x26, 0xb5, - 0x02, 0x5e, 0xac, 0x4d, 0xb7, 0x24, 0x35, 0x63, 0x19, 0x26, 0xb6, 0xaa, 0xb6, 0x03, 0xea, 0x3d, - 0x42, 0xab, 0xc4, 0x90, 0xe5, 0x3e, 0xa5, 0x1d, 0xcb, 0x66, 0xa5, 0x96, 0x23, 0x8a, 0x75, 0x96, - 0x09, 0x6a, 0x72, 0x5b, 0x61, 0x59, 0x66, 0xb7, 0xff, 0x35, 0xfb, 0xb1, 0x30, 0x93, 0x12, 0x71, - 0x62, 0x43, 0x96, 0xdc, 0x41, 0xae, 0x65, 0x3f, 0x36, 0x93, 0x24, 0xe4, 0x6b, 0x70, 0x46, 0x1c, - 0x40, 0x22, 0x94, 0x89, 0x6c, 0x31, 0x0f, 0x94, 0xf2, 0xea, 0xf1, 0x51, 0xf1, 0x9c, 0x8c, 0xb0, - 0x2b, 0xc3, 0x0c, 0xa5, 0xb5, 0x3a, 0x9d, 0x0b, 0xd9, 0x64, 0x07, 0x72, 0xac, 0x3b, 0xd6, 0xa8, - 0xef, 0x4b, 0x0f, 0x46, 0x71, 0x33, 0x56, 0x3b, 0xd3, 0x6a, 0xf1, 0x72, 0xb3, 0x27, 0x25, 0x59, - 0x81, 0xa9, 0x87, 0x74, 0x5b, 0x1d, 0x9f, 0x91, 0x70, 0xab, 0x2a, 0x1c, 0xd0, 0xed, 0xde, 0x83, - 0x13, 0xa3, 0x23, 0x0e, 0xbe, 0x0f, 0x3c, 0x3e, 0x5c, 0x75, 0xfc, 0x80, 0xb6, 0xa9, 0x87, 0xc1, - 0xcc, 0x46, 0x71, 0x33, 0x98, 0x8f, 0x24, 0x64, 0xbd, 0x7c, 0xe9, 0xc5, 0xe3, 0xa3, 0xe2, 0x05, - 0xee, 0x0a, 0xdc, 0x14, 0x70, 0x2b, 0x96, 0x16, 0x2a, 0xc9, 0x95, 0x7c, 0x03, 0xa6, 0x4d, 0xb7, - 0x1b, 0x38, 0xed, 0xdd, 0x5a, 0xe0, 0xd9, 0x01, 0xdd, 0xe5, 0x07, 0x52, 0x14, 0x35, 0x2d, 0x56, - 0x2a, 0x9e, 0x96, 0x39, 0xd0, 0xf2, 0x05, 0x54, 0x3b, 0x11, 0x74, 0x02, 0xf2, 0x75, 0x98, 0xe2, - 0x41, 0x2c, 0xc2, 0x0a, 0xc6, 0xb4, 0x94, 0x16, 0x7a, 0xe1, 0x83, 0x1b, 0xc2, 0xaa, 0x05, 0xa1, - 0x69, 0x15, 0xc4, 0xb8, 0x91, 0xaf, 0x88, 0xce, 0xda, 0x70, 0xda, 0xbb, 0xe1, 0x34, 0x06, 0xec, - 0xf9, 0x37, 0xa3, 0x2e, 0xe9, 0xb0, 0xcf, 0x95, 0xd3, 0xb8, 0x87, 0x89, 0x5e, 0x92, 0x0f, 0x09, - 0xe0, 0x42, 0xc9, 0xf7, 0x1d, 0x3f, 0x10, 0x7e, 0x35, 0xcb, 0x8f, 0x69, 0xbd, 0xcb, 0x90, 0xd9, - 0xf5, 0x96, 0x7a, 0xdc, 0xae, 0x7b, 0x78, 0xe9, 0xda, 0xf1, 0x51, 0xf1, 0x35, 0x1b, 0x11, 0x2d, - 0xe1, 0x8a, 0x63, 0x51, 0x89, 0x6a, 0x1d, 0x70, 0x5c, 0xa5, 0x0d, 0xfd, 0x99, 0x92, 0xaf, 0xc3, - 0xd9, 0xb2, 0xed, 0xd3, 0x6a, 0xdb, 0xa7, 0x6d, 0xdf, 0x09, 0x9c, 0x47, 0x54, 0x74, 0x2a, 0x1e, - 0x7e, 0x79, 0x4c, 0xa0, 0x65, 0xd4, 0x6d, 0x9f, 0x2d, 0xcc, 0x10, 0xc5, 0x12, 0x83, 0xa2, 0x54, - 0xd3, 0x83, 0x0b, 0x31, 0x61, 0xaa, 0x56, 0x5b, 0xa9, 0x38, 0x76, 0xb8, 0xae, 0x26, 0xb1, 0xbf, - 0x5e, 0x43, 0xd5, 0x9e, 0xbf, 0x67, 0x35, 0x1c, 0x3b, 0x5c, 0x50, 0x3d, 0x3a, 0x2b, 0xc6, 0xc1, - 0x38, 0xca, 0x40, 0x21, 0x3e, 0x94, 0xe4, 0xcb, 0x30, 0xc6, 0xed, 0xdb, 0xa8, 0xbf, 0x27, 0xe2, - 0x30, 0x48, 0x73, 0xa9, 0x10, 0xae, 0x13, 0x09, 0x3f, 0x37, 0x6e, 0x3d, 0x47, 0x55, 0x6b, 0x19, - 0xf4, 0x73, 0x93, 0x44, 0xa4, 0x01, 0x13, 0x7c, 0xb4, 0x28, 0x86, 0x4c, 0x14, 0x66, 0xce, 0x2f, - 0xaa, 0xab, 0x43, 0x14, 0xc5, 0xf8, 0xe3, 0xab, 0xa1, 0x98, 0x13, 0x1c, 0x41, 0xab, 0x42, 0xe3, - 0xba, 0x04, 0x90, 0x97, 0x84, 0xc6, 0x79, 0x38, 0xd7, 0xe3, 0x9b, 0x8d, 0x47, 0x68, 0x49, 0xd0, - 0xa3, 0x46, 0xf2, 0x65, 0x98, 0x43, 0xc2, 0xb2, 0xdb, 0x6e, 0xd3, 0x7a, 0x80, 0xdb, 0x91, 0xd4, - 0xbe, 0xe7, 0xb8, 0xa5, 0x0b, 0x6f, 0x6f, 0x3d, 0x44, 0xb0, 0xe2, 0x4a, 0xf8, 0x54, 0x0e, 0xc6, - 0xcf, 0x67, 0x61, 0x5e, 0xec, 0x70, 0x26, 0xad, 0xbb, 0x5e, 0xe3, 0xd9, 0x3f, 0x51, 0x97, 0xb5, - 0x13, 0xf5, 0xa5, 0x30, 0x88, 0x4f, 0x5a, 0x23, 0xfb, 0x1c, 0xa8, 0xbf, 0x9a, 0x81, 0x17, 0xfa, - 0x11, 0xb1, 0xde, 0x09, 0x43, 0x44, 0x8e, 0x25, 0x42, 0x41, 0x76, 0x60, 0x16, 0x07, 0xb4, 0xbc, - 0x47, 0xeb, 0xfb, 0xfe, 0x8a, 0xeb, 0x07, 0xe8, 0x69, 0x91, 0xed, 0xf1, 0xd6, 0xfd, 0x46, 0xea, - 0x5b, 0xf7, 0x59, 0x3e, 0xcb, 0xea, 0xc8, 0x83, 0x07, 0xb1, 0xdc, 0xa7, 0x87, 0xbe, 0x99, 0xc6, - 0x1a, 0x2d, 0xe6, 0x4b, 0xdd, 0x60, 0x6f, 0xc3, 0xa3, 0x3b, 0xd4, 0xa3, 0xed, 0x3a, 0xfd, 0x94, - 0x59, 0xcc, 0xeb, 0x8d, 0x1b, 0x48, 0x83, 0xf1, 0x8f, 0x27, 0x61, 0x2e, 0x8d, 0x8c, 0xf5, 0x8b, - 0x72, 0x69, 0x8e, 0xe7, 0xf7, 0xfc, 0xa1, 0x0c, 0x4c, 0xd4, 0x68, 0xdd, 0x6d, 0x37, 0x6e, 0xa3, - 0x45, 0x91, 0xe8, 0x1d, 0x8b, 0x0b, 0x0d, 0x0c, 0x6e, 0xed, 0xc4, 0x4c, 0x8d, 0xbe, 0x7b, 0x54, - 0xfc, 0xe2, 0x60, 0x77, 0xd5, 0xba, 0x8b, 0xc1, 0x73, 0x02, 0xcc, 0x3f, 0x11, 0x56, 0x81, 0x8f, - 0x83, 0x5a, 0xa5, 0x64, 0x09, 0x26, 0xc5, 0x72, 0x75, 0xd5, 0x08, 0xa1, 0x3c, 0xce, 0x91, 0x2c, - 0x48, 0xa8, 0xae, 0x35, 0x12, 0x72, 0x13, 0x72, 0x5b, 0x8b, 0xb7, 0xc5, 0x18, 0xc8, 0x0c, 0x1e, - 0x5b, 0x8b, 0xb7, 0x51, 0x1d, 0xc6, 0xae, 0x18, 0x93, 0xdd, 0x45, 0xcd, 0xc8, 0x67, 0x6b, 0xf1, - 0x36, 0xf9, 0x3e, 0x38, 0x53, 0x71, 0x7c, 0x51, 0x05, 0xf7, 0xdd, 0x68, 0xa0, 0xc7, 0xe2, 0x48, - 0x8f, 0xd9, 0xfb, 0xb9, 0xd4, 0xd9, 0xfb, 0x62, 0x23, 0x64, 0x62, 0x71, 0xc7, 0x90, 0x46, 0x3c, - 0x12, 0x6a, 0x7a, 0x3d, 0xe4, 0x23, 0x98, 0x42, 0x65, 0x36, 0xba, 0xb3, 0x60, 0x0c, 0xfb, 0xd1, - 0x1e, 0x35, 0x7f, 0x26, 0xb5, 0xe6, 0x05, 0x1e, 0x7d, 0x02, 0x9d, 0x62, 0x30, 0xde, 0xbd, 0x76, - 0xeb, 0xd7, 0x38, 0x93, 0xbb, 0x30, 0x2d, 0xc4, 0xaf, 0xfb, 0x3b, 0x9b, 0x7b, 0xb4, 0x62, 0x1f, - 0x0a, 0xfb, 0x1c, 0xbc, 0xd1, 0x09, 0x99, 0xcd, 0x72, 0x77, 0xac, 0x60, 0x8f, 0x5a, 0x0d, 0x5b, - 0x13, 0x54, 0x62, 0x84, 0xe4, 0x5b, 0x30, 0xbe, 0xea, 0xd6, 0x99, 0xe4, 0x8d, 0x3b, 0x03, 0x37, - 0xd9, 0xf9, 0x10, 0x33, 0x48, 0x72, 0x70, 0x4c, 0x9c, 0xfa, 0xee, 0x51, 0xf1, 0x9d, 0xd3, 0x4e, - 0x1a, 0xa5, 0x02, 0x53, 0xad, 0x8d, 0x94, 0x21, 0xff, 0x90, 0x6e, 0xb3, 0xd6, 0xc6, 0xb3, 0xcb, - 0x49, 0xb0, 0xb0, 0xc8, 0x13, 0xbf, 0x34, 0x8b, 0x3c, 0x01, 0x23, 0x1e, 0xcc, 0x60, 0xff, 0x6c, - 0xd8, 0xbe, 0x7f, 0xe0, 0x7a, 0x0d, 0x4c, 0x23, 0xd2, 0xcb, 0x1a, 0x68, 0x31, 0xb5, 0xf3, 0x5f, - 0xe0, 0x9d, 0xdf, 0x51, 0x38, 0xa8, 0x02, 0x64, 0x82, 0x3d, 0xf9, 0x06, 0x4c, 0x89, 0x68, 0x00, - 0x6b, 0xb7, 0x4b, 0xb8, 0x2a, 0x27, 0x34, 0xbf, 0x4f, 0xbd, 0x90, 0x4b, 0xa9, 0x22, 0xb8, 0x80, - 0xd4, 0x40, 0x59, 0xad, 0x1d, 0x5b, 0x57, 0xfa, 0xab, 0x24, 0x64, 0x03, 0xc6, 0x2b, 0x98, 0xe3, - 0x18, 0x7d, 0xd3, 0x84, 0x5d, 0x78, 0x98, 0x1e, 0x2b, 0x2a, 0xe1, 0xba, 0x18, 0x91, 0x0e, 0x19, - 0x3d, 0xdd, 0x74, 0x5b, 0xdd, 0x10, 0x91, 0xdc, 0x82, 0x5c, 0xb5, 0xb2, 0x21, 0xcc, 0xc2, 0x67, - 0xc2, 0x98, 0x1b, 0x1b, 0x32, 0x99, 0x10, 0xda, 0xcf, 0x39, 0x0d, 0xcd, 0xa8, 0xbc, 0x5a, 0xd9, - 0x20, 0x3b, 0x30, 0x89, 0x1d, 0xb0, 0x42, 0x6d, 0xde, 0xb7, 0xd3, 0x3d, 0xfa, 0xf6, 0x5a, 0x6a, - 0xdf, 0xce, 0xf3, 0xbe, 0xdd, 0x13, 0xd4, 0x5a, 0x76, 0x14, 0x95, 0x2d, 0x13, 0x69, 0x45, 0xc6, - 0x26, 0x99, 0xd3, 0x63, 0x73, 0x15, 0xed, 0x83, 0x84, 0x48, 0x2b, 0x13, 0x3c, 0x85, 0x49, 0x46, - 0x7a, 0x7a, 0x9d, 0x24, 0xf9, 0x90, 0x2f, 0xc0, 0xd0, 0xfd, 0xfd, 0xc0, 0x16, 0x06, 0xe0, 0xb2, - 0x1f, 0x19, 0x48, 0x36, 0x1f, 0xb5, 0x90, 0xee, 0xbe, 0x16, 0x81, 0x0d, 0x69, 0xd8, 0x50, 0xac, - 0xd8, 0x5e, 0xe3, 0xc0, 0xf6, 0xd0, 0x41, 0x78, 0x56, 0x63, 0xa1, 0x94, 0xf0, 0xa1, 0xd8, 0x13, - 0x80, 0x98, 0xd7, 0xb0, 0xca, 0x82, 0x7c, 0x0f, 0x9c, 0xf7, 0x9d, 0xdd, 0xb6, 0x1d, 0x74, 0x3d, - 0x6a, 0xd9, 0xcd, 0x5d, 0xd7, 0x73, 0x82, 0xbd, 0x96, 0xe5, 0x77, 0x9d, 0x80, 0xce, 0xcf, 0x69, - 0xf9, 0x9d, 0x6b, 0x12, 0xaf, 0x24, 0xd1, 0x6a, 0x0c, 0xcb, 0x3c, 0xe7, 0xa7, 0x17, 0x90, 0xaf, - 0xc0, 0xa4, 0xba, 0x25, 0xfb, 0xf3, 0x67, 0x2e, 0xe5, 0xae, 0x4c, 0x85, 0x17, 0x8f, 0xf8, 0x06, - 0x2e, 0xe3, 0x22, 0x2b, 0x27, 0x84, 0xaf, 0xc7, 0x45, 0x56, 0x78, 0x85, 0x19, 0x13, 0x49, 0x61, - 0xd6, 0x9c, 0x11, 0x33, 0x56, 0xf4, 0xf2, 0xda, 0xed, 0x92, 0x39, 0xba, 0x51, 0x7d, 0x50, 0x6b, - 0xba, 0x81, 0xf1, 0x9f, 0x67, 0x70, 0x13, 0x27, 0xaf, 0x61, 0x58, 0xa5, 0xf0, 0xf5, 0x0c, 0xf5, - 0xb7, 0x76, 0x27, 0x16, 0x54, 0x9f, 0xa3, 0x90, 0x37, 0x60, 0xe4, 0xb6, 0x5d, 0x97, 0x61, 0x61, - 0x04, 0xf2, 0x0e, 0x42, 0x54, 0x65, 0x2f, 0xc7, 0x61, 0xf2, 0x25, 0x9f, 0xdc, 0xa5, 0x28, 0x75, - 0x78, 0xb9, 0x24, 0x9f, 0xeb, 0x51, 0xbe, 0x14, 0x8b, 0x42, 0xc9, 0x2d, 0x1e, 0xb3, 0x8a, 0x4f, - 0xe5, 0x60, 0xfc, 0x69, 0x26, 0xda, 0x95, 0xc8, 0xab, 0x30, 0x64, 0x6e, 0x84, 0xdf, 0xcf, 0x9d, - 0x7e, 0x63, 0x9f, 0x8f, 0x08, 0xe4, 0x2b, 0x70, 0x46, 0xe1, 0x93, 0x30, 0xd1, 0x7f, 0x05, 0x7d, - 0x52, 0x95, 0x2f, 0x49, 0xb7, 0xd3, 0x4f, 0xe7, 0x81, 0xc2, 0x74, 0x54, 0x50, 0xa1, 0x6d, 0x87, - 0xf3, 0x56, 0x1a, 0xab, 0xf2, 0x6e, 0x20, 0x42, 0xbc, 0xb1, 0x69, 0x1c, 0xb8, 0x4b, 0xaa, 0xf1, - 0x5b, 0x19, 0x6d, 0xb7, 0x09, 0x73, 0x2d, 0x67, 0x4e, 0xc8, 0xb5, 0xfc, 0x36, 0x40, 0xa9, 0x1b, - 0xb8, 0xcb, 0x6d, 0xcf, 0x6d, 0x72, 0x2d, 0x8a, 0xc8, 0x2b, 0x81, 0xba, 0x61, 0x8a, 0x60, 0xcd, - 0x73, 0x2e, 0x44, 0x4e, 0xf5, 0x66, 0xc8, 0x7d, 0x5c, 0x6f, 0x06, 0xe3, 0xf7, 0x33, 0xda, 0x1a, - 0x65, 0x52, 0xa2, 0x98, 0x8a, 0xaa, 0xc5, 0x58, 0xc7, 0x79, 0x64, 0xf9, 0x4d, 0x57, 0xdd, 0x21, - 0x25, 0x1a, 0xf9, 0xb7, 0x33, 0x70, 0x96, 0xbb, 0x05, 0xac, 0x77, 0x5b, 0xdb, 0xd4, 0x7b, 0x60, - 0x37, 0x9d, 0x46, 0x14, 0xb4, 0x2e, 0x32, 0x1f, 0x54, 0xaa, 0x49, 0xc7, 0xe7, 0x17, 0x55, 0xee, - 0xa6, 0x60, 0xb5, 0xb1, 0xd0, 0x7a, 0x14, 0x96, 0xaa, 0x17, 0xd5, 0x74, 0x7a, 0xe3, 0xd7, 0x32, - 0xf0, 0xe2, 0x89, 0xb5, 0x90, 0xeb, 0x30, 0x2a, 0x13, 0x7a, 0x64, 0xb0, 0xe3, 0xd1, 0xce, 0x36, - 0x99, 0xcc, 0x43, 0x62, 0x91, 0xaf, 0xc2, 0x19, 0x95, 0xd5, 0xa6, 0x67, 0x3b, 0x6a, 0xda, 0x8c, - 0x94, 0xaf, 0x0e, 0x18, 0x4a, 0x5c, 0x5a, 0x4b, 0x67, 0x62, 0xfc, 0x7f, 0x19, 0x25, 0xfb, 0xfa, - 0x33, 0x2a, 0xc3, 0xdf, 0xd2, 0x64, 0x78, 0x19, 0xb2, 0x33, 0x6c, 0x15, 0x2b, 0x4b, 0xbd, 0x77, - 0x4d, 0x2b, 0xf6, 0xe2, 0x08, 0xf8, 0xd1, 0x2c, 0x8c, 0x6f, 0xf9, 0xd4, 0xe3, 0x0f, 0xb9, 0x9f, - 0xae, 0xc0, 0x85, 0x61, 0xbb, 0x06, 0x0a, 0x2d, 0xf7, 0xc7, 0x19, 0x54, 0xf0, 0xab, 0x14, 0xac, - 0x37, 0x94, 0x8c, 0x8b, 0xd8, 0x1b, 0x98, 0x6b, 0x11, 0xa1, 0x3c, 0x58, 0xd7, 0xaa, 0x9e, 0x7c, - 0x15, 0x33, 0xf0, 0xae, 0x92, 0x2f, 0xc2, 0xf0, 0x16, 0xaa, 0x2b, 0xf5, 0x20, 0x1b, 0x21, 0x7f, - 0x2c, 0xe4, 0x9b, 0x74, 0xd7, 0xd7, 0xa3, 0xb0, 0x71, 0x42, 0x52, 0x83, 0xd1, 0xb2, 0x47, 0x31, - 0x97, 0xfa, 0xd0, 0xe0, 0x2e, 0xe2, 0x75, 0x4e, 0x12, 0x77, 0x11, 0x17, 0x9c, 0x8c, 0x9f, 0xcb, - 0x02, 0x89, 0xda, 0x88, 0x89, 0xc3, 0xfc, 0x67, 0x76, 0xd0, 0x3f, 0xd0, 0x06, 0xfd, 0x42, 0x62, - 0xd0, 0x79, 0xf3, 0x06, 0x1a, 0xfb, 0xdf, 0xc9, 0xc0, 0xd9, 0x74, 0x42, 0xf2, 0x12, 0x8c, 0xdc, - 0xdf, 0xdc, 0x90, 0x71, 0x5a, 0x44, 0x53, 0xdc, 0x0e, 0xea, 0x0a, 0x4c, 0x51, 0x44, 0xde, 0x84, - 0x91, 0x2f, 0x99, 0x65, 0x76, 0x0e, 0x29, 0xa9, 0x29, 0xbe, 0xe9, 0x59, 0x75, 0xfd, 0x28, 0x12, - 0x48, 0xea, 0xd8, 0xe6, 0x9e, 0xda, 0xd8, 0xfe, 0x54, 0x16, 0xa6, 0x4b, 0xf5, 0x3a, 0xf5, 0x7d, - 0x11, 0x76, 0xfd, 0x99, 0x1d, 0xd8, 0xf4, 0x08, 0x2c, 0x5a, 0xdb, 0x06, 0x1a, 0xd5, 0xdf, 0xcd, - 0xc0, 0x19, 0x49, 0xf5, 0xc8, 0xa1, 0x07, 0x9b, 0x7b, 0x1e, 0xf5, 0xf7, 0xdc, 0x66, 0x63, 0xe0, - 0xfc, 0x37, 0x4c, 0xd0, 0xc3, 0x50, 0xe9, 0xea, 0xab, 0xfe, 0x0e, 0x42, 0x34, 0x41, 0x8f, 0x87, - 0x53, 0xbf, 0x0e, 0xa3, 0xa5, 0x4e, 0xc7, 0x73, 0x1f, 0xf1, 0x65, 0x2f, 0xe2, 0x2c, 0xda, 0x1c, - 0xa4, 0x79, 0xd8, 0x73, 0x10, 0xfb, 0x8c, 0x0a, 0x6d, 0xf3, 0xe0, 0x78, 0x93, 0xfc, 0x33, 0x1a, - 0xb4, 0xad, 0xca, 0xe2, 0x58, 0x6e, 0xd4, 0x80, 0x6c, 0x78, 0x6e, 0xcb, 0x0d, 0x68, 0x83, 0xb7, - 0x07, 0x03, 0x13, 0x9c, 0x18, 0xeb, 0x6a, 0xd3, 0x09, 0x9a, 0x5a, 0xac, 0xab, 0x80, 0x01, 0x4c, - 0x0e, 0x37, 0xfe, 0x9f, 0x61, 0x98, 0x50, 0x7b, 0x87, 0x18, 0x3c, 0xa9, 0x85, 0xeb, 0xa9, 0xd1, - 0x31, 0x6c, 0x84, 0x98, 0xa2, 0x24, 0x0a, 0x2d, 0x93, 0x3d, 0x31, 0xb4, 0xcc, 0x43, 0x98, 0xdc, - 0xf0, 0x5c, 0x0c, 0x08, 0x89, 0xaf, 0x95, 0x62, 0x2b, 0x9c, 0x55, 0xee, 0x9d, 0x6c, 0x20, 0xf1, - 0x3d, 0x14, 0x25, 0xfb, 0x8e, 0xc0, 0xc6, 0x54, 0x8f, 0x9a, 0xd6, 0x45, 0xe3, 0xc3, 0x4d, 0x2d, - 0x6c, 0x5f, 0x44, 0x75, 0x0d, 0x4d, 0x2d, 0x18, 0x44, 0x37, 0xb5, 0x60, 0x10, 0x75, 0xad, 0x0d, - 0x3f, 0xad, 0xb5, 0x46, 0x7e, 0x2e, 0x03, 0xe3, 0xa5, 0x76, 0x5b, 0x84, 0xac, 0x39, 0xc1, 0x5b, - 0xff, 0xab, 0xc2, 0xda, 0xe2, 0x9d, 0x8f, 0x65, 0x6d, 0x81, 0x72, 0x8b, 0x8f, 0x92, 0x6a, 0x54, - 0xa1, 0x7a, 0x5b, 0x53, 0xbe, 0x83, 0xbc, 0x03, 0x85, 0x70, 0x92, 0x57, 0xdb, 0x0d, 0xfa, 0x98, - 0xf2, 0xa4, 0x80, 0x93, 0x22, 0xca, 0xb4, 0x2a, 0x99, 0xc6, 0x11, 0xc9, 0x26, 0x80, 0x1d, 0xce, - 0xae, 0x58, 0x76, 0xd3, 0xe4, 0xf4, 0x13, 0xd2, 0x33, 0xfe, 0xc6, 0x07, 0x2d, 0x55, 0x7a, 0x8e, - 0xf8, 0x90, 0x16, 0x4c, 0xf3, 0xd4, 0xa2, 0xb5, 0xc0, 0xf6, 0x02, 0x4c, 0xcc, 0x00, 0x27, 0x8e, - 0xc3, 0xab, 0x42, 0x7f, 0xf6, 0xbc, 0x48, 0x58, 0xea, 0x33, 0x5a, 0x2b, 0x25, 0x4b, 0x43, 0x9c, - 0x37, 0x8f, 0xe9, 0x6d, 0x9e, 0x4b, 0x7e, 0x2f, 0x9f, 0xf4, 0x3f, 0x95, 0x81, 0xb3, 0xea, 0xa4, - 0xaf, 0x75, 0xb7, 0x45, 0x30, 0x4e, 0x72, 0x0d, 0xc6, 0xc4, 0x9c, 0x0c, 0x2f, 0x51, 0xc9, 0xfc, - 0x12, 0x11, 0x0a, 0x59, 0x66, 0xd3, 0x90, 0xf1, 0x10, 0x52, 0xf7, 0x6c, 0x6c, 0x9f, 0x62, 0x45, - 0x51, 0xda, 0x6a, 0x0f, 0x7f, 0xeb, 0xf3, 0x93, 0x41, 0x8c, 0xf7, 0x61, 0x46, 0x1f, 0x89, 0x1a, - 0x0d, 0xc8, 0x55, 0x18, 0x95, 0xc3, 0x97, 0x49, 0x1f, 0x3e, 0x59, 0x6e, 0x3c, 0x04, 0x92, 0xa0, - 0xf7, 0xd1, 0x2c, 0x8a, 0xdd, 0x4f, 0xb9, 0xd9, 0x9e, 0x7c, 0x94, 0x4c, 0x20, 0x2e, 0xcd, 0x8a, - 0xef, 0x1b, 0xd7, 0xdc, 0x12, 0x30, 0x30, 0xe9, 0x9f, 0x4e, 0xc1, 0x6c, 0xca, 0x9e, 0x7b, 0x82, - 0x4c, 0x54, 0xd4, 0x37, 0x88, 0xb1, 0x30, 0xd8, 0x87, 0xdc, 0x16, 0xde, 0x87, 0xe1, 0x13, 0xb7, - 0x03, 0xee, 0x94, 0x12, 0xdb, 0x05, 0x38, 0xd9, 0x27, 0x22, 0x17, 0xa9, 0xf1, 0x78, 0x86, 0x9f, - 0x5a, 0x3c, 0x9e, 0x25, 0x98, 0x14, 0xad, 0x12, 0xdb, 0x95, 0x62, 0x1c, 0x2d, 0xf3, 0xa5, 0x24, - 0xb6, 0x2d, 0x9d, 0x84, 0xf3, 0xf0, 0xdd, 0xe6, 0x23, 0x2a, 0x78, 0x8c, 0xaa, 0x3c, 0xb0, 0x20, - 0x95, 0x87, 0x42, 0x42, 0xfe, 0x43, 0x4c, 0x6b, 0x88, 0x10, 0x75, 0xcf, 0xca, 0xf7, 0xdb, 0xb3, - 0x1a, 0x4f, 0x67, 0xcf, 0xba, 0x20, 0xbf, 0x31, 0x7d, 0xef, 0x4a, 0xf9, 0x2c, 0xf2, 0x2b, 0x19, - 0x98, 0xe1, 0x41, 0x61, 0xd4, 0x8f, 0xed, 0x1b, 0xe8, 0xa3, 0xfe, 0x74, 0x3e, 0xf6, 0x05, 0x91, - 0x29, 0x27, 0xfd, 0x5b, 0x93, 0x1f, 0x45, 0xbe, 0x07, 0x20, 0x5c, 0x51, 0x3c, 0x38, 0xeb, 0xf8, - 0xe2, 0x0b, 0x29, 0xbb, 0x40, 0x88, 0x14, 0x25, 0xb4, 0x08, 0x42, 0x3a, 0x2d, 0x99, 0x65, 0x08, - 0x25, 0xdf, 0x07, 0x73, 0x6c, 0xbd, 0x84, 0x10, 0x11, 0xc2, 0x6a, 0x7e, 0x1c, 0x6b, 0xf9, 0x6c, - 0x6f, 0x99, 0xe8, 0x5a, 0x1a, 0x19, 0x0f, 0xe5, 0x1b, 0xe5, 0x15, 0x0f, 0xd4, 0x68, 0x17, 0xa9, - 0x15, 0x61, 0x64, 0x38, 0xfc, 0x7a, 0x9e, 0x74, 0xa2, 0xc7, 0xfe, 0x76, 0x5e, 0xae, 0x05, 0xbe, - 0xbf, 0xf9, 0xba, 0x8f, 0x32, 0x82, 0xc8, 0x97, 0x80, 0x84, 0xd1, 0x54, 0x38, 0x8c, 0xca, 0x84, - 0x14, 0x5c, 0xdd, 0x1c, 0x45, 0x65, 0xf1, 0x64, 0xb1, 0x3a, 0x49, 0x92, 0xc4, 0x84, 0xc2, 0x9c, - 0x68, 0x34, 0x83, 0xca, 0x9c, 0x83, 0xfe, 0xfc, 0x94, 0x16, 0x20, 0x2c, 0x2a, 0x89, 0x12, 0x90, - 0x2b, 0x89, 0x0b, 0x35, 0x95, 0x53, 0x1a, 0x3b, 0x72, 0x0b, 0xc6, 0xd0, 0x51, 0x78, 0x45, 0x1a, - 0x7b, 0x09, 0xc3, 0x13, 0x74, 0x29, 0xb6, 0xf6, 0x74, 0x93, 0xad, 0x08, 0x95, 0x5d, 0x07, 0x2a, - 0xde, 0xa1, 0xd9, 0x6d, 0xa3, 0x52, 0x58, 0xe8, 0x3b, 0x1a, 0xde, 0xa1, 0xe5, 0x75, 0x75, 0x4f, - 0x72, 0x44, 0x22, 0xdf, 0x80, 0xf1, 0x35, 0xfb, 0x71, 0x98, 0x75, 0x69, 0x66, 0xf0, 0xdc, 0x4e, - 0x2d, 0xfb, 0x71, 0x98, 0x72, 0x29, 0x9e, 0xdb, 0x49, 0x61, 0x49, 0xbe, 0x06, 0xa0, 0x68, 0xaa, - 0xc9, 0x89, 0x15, 0xbc, 0x28, 0xc3, 0xde, 0xa5, 0x6a, 0xb0, 0x91, 0xbf, 0xc2, 0x30, 0x26, 0x39, - 0xcc, 0x7d, 0x72, 0x92, 0xc3, 0x99, 0x4f, 0x4e, 0x72, 0x58, 0xd8, 0x86, 0xf3, 0x3d, 0x97, 0x4e, - 0x4a, 0x34, 0xe2, 0xeb, 0x7a, 0x34, 0xe2, 0xf3, 0xbd, 0x8e, 0x58, 0x5f, 0xcf, 0x3b, 0x32, 0x5b, - 0x98, 0xeb, 0x2d, 0x9d, 0x7c, 0x27, 0x1b, 0x3b, 0x72, 0xc5, 0xc5, 0x82, 0xe7, 0xbc, 0xea, 0x25, - 0x93, 0x64, 0x31, 0x21, 0x35, 0x3f, 0x94, 0x95, 0x30, 0xe9, 0xec, 0x50, 0x56, 0x0f, 0x75, 0x3c, - 0x9e, 0x9f, 0xf4, 0xf4, 0x7d, 0x17, 0xa6, 0x78, 0x0e, 0xd9, 0x7b, 0xf4, 0xf0, 0xc0, 0xf5, 0x1a, - 0x3c, 0x9b, 0x8f, 0x90, 0xc1, 0x13, 0x09, 0xe0, 0x63, 0xb8, 0xa4, 0x22, 0x7d, 0x4f, 0x87, 0xb1, - 0xf6, 0xf3, 0xa9, 0xbb, 0x18, 0x43, 0xe8, 0xe7, 0x96, 0x4a, 0xde, 0x0a, 0x05, 0x35, 0xea, 0xa9, - 0xd9, 0x47, 0x3c, 0x09, 0x4c, 0x91, 0xd7, 0xa8, 0x67, 0xfc, 0xf3, 0x1c, 0x10, 0x5e, 0x53, 0xd9, - 0xee, 0xd8, 0xe8, 0x99, 0xed, 0x60, 0xac, 0xa5, 0x82, 0xc0, 0xb1, 0xb7, 0x9b, 0x54, 0x0d, 0x54, - 0x26, 0x8c, 0x6b, 0xc3, 0x32, 0x2b, 0x7e, 0xd1, 0x49, 0x10, 0xf6, 0xd8, 0xea, 0xb2, 0x4f, 0xb2, - 0xd5, 0x7d, 0x03, 0x9e, 0x2f, 0x75, 0x30, 0x19, 0xb5, 0xac, 0xe5, 0xb6, 0xeb, 0xc9, 0x4d, 0x4a, - 0xf3, 0xf9, 0xb3, 0x43, 0xb4, 0xc4, 0x97, 0xf6, 0x63, 0xa1, 0xc8, 0x29, 0x6c, 0x5e, 0x76, 0x02, - 0x35, 0x86, 0x84, 0x94, 0x53, 0x3a, 0x58, 0x92, 0x22, 0xa7, 0x70, 0x12, 0xc9, 0xc3, 0xf1, 0xa4, - 0x9c, 0x82, 0xb9, 0xbb, 0x22, 0x1e, 0x8e, 0x47, 0x7b, 0xc8, 0x3a, 0x21, 0x09, 0x79, 0x17, 0xc6, - 0x4b, 0xdd, 0xc0, 0x15, 0x8c, 0x85, 0x55, 0x78, 0x64, 0xbf, 0x2d, 0x3e, 0x45, 0xbb, 0xfa, 0x44, - 0xe8, 0xc6, 0x9f, 0xe4, 0xe0, 0x7c, 0x72, 0x78, 0x45, 0x69, 0xb8, 0x3e, 0x32, 0x27, 0xac, 0x8f, - 0xb4, 0xd9, 0x90, 0x8d, 0xf2, 0x2e, 0x3c, 0x8d, 0xd9, 0xc0, 0x73, 0x5a, 0x7f, 0xcc, 0xd9, 0x50, - 0x83, 0x71, 0xf5, 0xbc, 0x1b, 0xfa, 0xb8, 0xe7, 0x9d, 0xca, 0x85, 0x5d, 0xea, 0x79, 0xe8, 0x8c, - 0xe1, 0xe8, 0xe9, 0x28, 0x1e, 0x35, 0x83, 0x63, 0x90, 0x7f, 0x0b, 0x2e, 0xf1, 0x3d, 0x29, 0xde, - 0xd8, 0xa5, 0x43, 0xc9, 0x51, 0x0c, 0xdc, 0xe2, 0xf1, 0x51, 0xf1, 0x1a, 0x57, 0x95, 0x58, 0x89, - 0x6e, 0xb3, 0xb6, 0x0f, 0x2d, 0xf9, 0x65, 0x4a, 0x25, 0x27, 0xf2, 0x36, 0xca, 0x70, 0x5e, 0x94, - 0x46, 0x4e, 0xdb, 0xb2, 0x90, 0x0d, 0xf2, 0x7e, 0xa4, 0xed, 0xc2, 0x41, 0x8e, 0x29, 0xb2, 0xb0, - 0x1c, 0xb3, 0x61, 0x2b, 0x99, 0x8a, 0xdf, 0x4c, 0xf3, 0xb9, 0xe1, 0x51, 0xbb, 0x39, 0x58, 0x77, - 0xb7, 0x91, 0x3a, 0xb5, 0x6c, 0xaa, 0x4e, 0x4d, 0x2a, 0x65, 0x72, 0xa9, 0x4a, 0x99, 0x0a, 0x4c, - 0xd7, 0xba, 0xdb, 0xb2, 0xee, 0xb8, 0xbf, 0xa6, 0xdf, 0xdd, 0x4e, 0xeb, 0x95, 0x38, 0x89, 0xf1, - 0x63, 0x59, 0x98, 0xd8, 0x68, 0x76, 0x77, 0x9d, 0x76, 0xc5, 0x0e, 0xec, 0x67, 0x56, 0xcd, 0xf7, - 0xb6, 0xa6, 0xe6, 0x0b, 0x5d, 0xcb, 0xc2, 0x86, 0x0d, 0xa4, 0xe3, 0xfb, 0xd9, 0x0c, 0x4c, 0x47, - 0x24, 0xfc, 0xb0, 0x5e, 0x81, 0x21, 0xf6, 0x43, 0x5c, 0x7e, 0x2f, 0x25, 0x18, 0xf3, 0xa4, 0x8b, - 0xe1, 0x5f, 0x42, 0xf1, 0xa6, 0x67, 0x34, 0x43, 0x0e, 0x0b, 0x9f, 0x83, 0xb1, 0x88, 0xed, 0x69, - 0x92, 0x2d, 0xfe, 0x7a, 0x06, 0x0a, 0xf1, 0x96, 0x90, 0x7b, 0x30, 0xca, 0x38, 0x39, 0x54, 0xde, - 0xcb, 0x5f, 0xee, 0xd1, 0xe6, 0x6b, 0x02, 0x8d, 0x7f, 0x1e, 0x76, 0x3e, 0xe5, 0x10, 0x53, 0x72, - 0x58, 0x30, 0x61, 0x42, 0xc5, 0x4a, 0xf9, 0xba, 0x37, 0x74, 0x09, 0xe5, 0x6c, 0x7a, 0x3f, 0x68, - 0x29, 0x22, 0xb5, 0xaf, 0x16, 0xc2, 0xc7, 0x65, 0x6d, 0x72, 0xa5, 0xae, 0x2a, 0x9c, 0x34, 0x8b, - 0x51, 0x22, 0x01, 0x75, 0x9e, 0xa5, 0x4c, 0xe8, 0x10, 0x8f, 0xbc, 0x01, 0x23, 0xbc, 0x3e, 0x35, - 0xbd, 0x59, 0x07, 0x21, 0xaa, 0x9c, 0xcc, 0x71, 0x8c, 0xbf, 0x9b, 0x83, 0xb3, 0xd1, 0xe7, 0x6d, - 0x75, 0x1a, 0x76, 0x40, 0x37, 0x6c, 0xcf, 0x6e, 0xf9, 0x27, 0xac, 0x80, 0x2b, 0x89, 0x4f, 0xc3, - 0xc4, 0x52, 0xf2, 0xd3, 0x94, 0x0f, 0x32, 0x62, 0x1f, 0x84, 0x3a, 0x50, 0xfe, 0x41, 0xf2, 0x33, - 0xc8, 0x3d, 0xc8, 0xd5, 0x68, 0x20, 0xf6, 0xde, 0xcb, 0x89, 0x5e, 0x55, 0xbf, 0xeb, 0x5a, 0x8d, - 0x06, 0x7c, 0x10, 0x79, 0x5c, 0x28, 0x2d, 0x38, 0x1f, 0xe3, 0x42, 0x1e, 0xc2, 0xc8, 0xf2, 0xe3, - 0x0e, 0xad, 0x07, 0x22, 0x55, 0xe8, 0xd5, 0xfe, 0xfc, 0x38, 0xae, 0x92, 0x29, 0x94, 0x22, 0x40, - 0xed, 0x2c, 0x8e, 0xb2, 0x70, 0x0b, 0xf2, 0xb2, 0xf2, 0xd3, 0xcc, 0xdc, 0x85, 0xb7, 0x61, 0x5c, - 0xa9, 0xe4, 0x54, 0x93, 0xfe, 0x17, 0xd9, 0xbe, 0xea, 0x36, 0x65, 0x76, 0xd1, 0xe5, 0x84, 0xac, - 0xa8, 0xe4, 0x66, 0xe2, 0xb2, 0xa2, 0xb5, 0x2f, 0x8a, 0xfa, 0x08, 0x8d, 0x55, 0x98, 0xae, 0xed, - 0x3b, 0x9d, 0x28, 0x50, 0xac, 0x76, 0x22, 0x63, 0x0e, 0x19, 0x71, 0x71, 0x8f, 0x9f, 0xc8, 0x71, - 0x3a, 0xe3, 0xcf, 0x33, 0x30, 0xc2, 0xfe, 0x7a, 0x70, 0xeb, 0x19, 0xdd, 0x32, 0x6f, 0x6a, 0x5b, - 0xe6, 0x8c, 0x12, 0xab, 0x1d, 0x37, 0x8e, 0x5b, 0x27, 0x6c, 0x96, 0x47, 0x62, 0x80, 0x38, 0x32, - 0xb9, 0x03, 0xa3, 0xc2, 0xa4, 0x48, 0xd8, 0x7e, 0xab, 0xc1, 0xdf, 0xa5, 0xb1, 0x51, 0x78, 0xc3, - 0x77, 0x3b, 0x71, 0x95, 0x88, 0xa4, 0x66, 0x72, 0xbd, 0x0c, 0xd9, 0xab, 0x65, 0x0f, 0x77, 0xd1, - 0x59, 0x8f, 0x87, 0x2e, 0x57, 0xf2, 0xfd, 0xf7, 0xf0, 0xad, 0x2f, 0x89, 0xd7, 0x90, 0x5c, 0x3f, - 0x26, 0x67, 0x65, 0xca, 0xde, 0xd4, 0x87, 0x92, 0x16, 0x9c, 0xad, 0xd5, 0x56, 0xd0, 0xfc, 0x70, - 0xc3, 0xf5, 0x82, 0xdb, 0xae, 0x77, 0x60, 0xa3, 0x6d, 0x31, 0x6a, 0xf8, 0x14, 0x1b, 0x84, 0x34, - 0xa3, 0xb0, 0x57, 0x53, 0x8d, 0xc2, 0xfa, 0xd8, 0x29, 0x18, 0x6d, 0x38, 0x57, 0xab, 0xad, 0xf0, - 0xc0, 0xe1, 0x7f, 0x11, 0xf5, 0xfd, 0x7a, 0x06, 0x66, 0x6a, 0xb5, 0x95, 0x58, 0x55, 0xab, 0x32, - 0x62, 0x79, 0x46, 0xcf, 0x7a, 0x9d, 0xda, 0x11, 0x38, 0x0a, 0x19, 0x2e, 0xe1, 0xd5, 0xb5, 0xe0, - 0x94, 0x9c, 0x09, 0xd9, 0x08, 0x63, 0xa4, 0x67, 0x35, 0x7f, 0x80, 0x1e, 0x0d, 0x45, 0x0d, 0xb7, - 0xf0, 0xa6, 0x63, 0xa5, 0xba, 0x86, 0x9b, 0x41, 0x8c, 0xff, 0xfa, 0x2c, 0x8f, 0xc2, 0x2e, 0x67, - 0xcb, 0x7b, 0x30, 0x21, 0xe8, 0xd1, 0x68, 0x5e, 0xd8, 0x84, 0x9c, 0x67, 0x1b, 0xe4, 0x0e, 0x87, - 0xf3, 0xe8, 0xbc, 0xdf, 0x3d, 0x2a, 0x0e, 0xb1, 0xae, 0x31, 0x35, 0x74, 0x72, 0x1f, 0x26, 0xd7, - 0xec, 0xc7, 0x8a, 0x3a, 0x83, 0xbb, 0x44, 0x5d, 0x65, 0xbb, 0x4a, 0xcb, 0x7e, 0x3c, 0x80, 0xd1, - 0x9d, 0x4e, 0x4f, 0xf6, 0x61, 0x4a, 0x6f, 0x93, 0x98, 0x81, 0xc9, 0x11, 0xbb, 0x91, 0x3a, 0x62, - 0xe7, 0x3b, 0xae, 0x17, 0x58, 0x3b, 0x21, 0xb9, 0x96, 0x71, 0x20, 0xc6, 0x9a, 0xbc, 0x07, 0x33, - 0x4a, 0x08, 0xd0, 0xdb, 0xae, 0xd7, 0xb2, 0xe5, 0x85, 0x0b, 0x75, 0xfc, 0x68, 0x4b, 0xb4, 0x83, - 0x60, 0x33, 0x89, 0x49, 0xbe, 0x92, 0xe6, 0x66, 0x36, 0x1c, 0x59, 0x1e, 0xa6, 0xb8, 0x99, 0xf5, - 0xb2, 0x3c, 0x4c, 0x3a, 0x9c, 0xed, 0xf6, 0xb3, 0x4c, 0xce, 0xf3, 0xd6, 0x0f, 0x64, 0x79, 0x1c, - 0x8e, 0x5c, 0x0f, 0x0b, 0xe4, 0x45, 0xc8, 0x2d, 0x6d, 0xdc, 0xc6, 0x97, 0x29, 0x69, 0x44, 0xd5, - 0xde, 0xb3, 0xdb, 0x75, 0xbc, 0x08, 0x09, 0x6f, 0x00, 0xf5, 0xa0, 0x5c, 0xda, 0xb8, 0x4d, 0x6c, - 0x98, 0xc5, 0xcc, 0x69, 0xc1, 0x97, 0x6f, 0xdc, 0x50, 0x86, 0x2a, 0x8f, 0x9f, 0x76, 0x5d, 0x7c, - 0x5a, 0x11, 0xf3, 0xae, 0x05, 0xd6, 0xe3, 0x1b, 0x37, 0x52, 0x07, 0x24, 0xfc, 0xb0, 0x34, 0x5e, - 0xec, 0xc0, 0x5a, 0xb3, 0x1f, 0x47, 0x4e, 0x1c, 0xbe, 0x70, 0xd8, 0xbd, 0x20, 0xa7, 0x56, 0xe4, - 0x00, 0xa2, 0x1d, 0x58, 0x3a, 0x11, 0xbb, 0xc7, 0x46, 0x13, 0xcc, 0x17, 0xae, 0x4e, 0x0b, 0x52, - 0x5d, 0x27, 0xbd, 0xba, 0xd5, 0xcb, 0x98, 0x82, 0x4e, 0xb6, 0xc2, 0xdb, 0x38, 0xbf, 0xcd, 0x8a, - 0x3c, 0xc1, 0xd7, 0xd5, 0xdb, 0x38, 0x57, 0x92, 0x69, 0xcd, 0x9a, 0x0e, 0x55, 0x38, 0xdc, 0xab, - 0xc5, 0xd4, 0xb9, 0x24, 0x2f, 0xf9, 0x13, 0xa7, 0xbf, 0xe4, 0x53, 0x18, 0x5a, 0x75, 0xeb, 0xfb, - 0x22, 0x38, 0xdf, 0x97, 0xd8, 0x2e, 0xac, 0x27, 0x95, 0x7f, 0x52, 0x8b, 0x6b, 0x64, 0x4f, 0xd6, - 0xd9, 0xa7, 0xb2, 0x59, 0x20, 0xfa, 0x44, 0x58, 0xf1, 0xce, 0x85, 0xb7, 0x5c, 0xa5, 0x8c, 0xcb, - 0xa3, 0x7c, 0xd2, 0xc8, 0xae, 0x35, 0x75, 0x72, 0x42, 0xa1, 0x50, 0xa1, 0xfe, 0x7e, 0xe0, 0x76, - 0xca, 0x4d, 0xa7, 0xb3, 0xed, 0xda, 0x9e, 0x0c, 0xe5, 0x3c, 0xf0, 0x9e, 0xdc, 0xe0, 0xf4, 0x56, - 0x5d, 0x32, 0x30, 0x13, 0x2c, 0xc9, 0x57, 0x60, 0x8a, 0x4d, 0xee, 0xe5, 0xc7, 0x01, 0x6d, 0xf3, - 0x91, 0x9f, 0x41, 0x89, 0x6e, 0x4e, 0xc9, 0x5d, 0x12, 0x16, 0xf2, 0x39, 0x85, 0x8b, 0x9d, 0x86, - 0x04, 0x5a, 0x60, 0x43, 0x8d, 0x15, 0x69, 0xc0, 0xfc, 0x9a, 0xfd, 0x58, 0xc9, 0x48, 0xac, 0x4c, - 0x52, 0x82, 0x13, 0xec, 0xca, 0xf1, 0x51, 0xf1, 0x65, 0x36, 0xc1, 0xa2, 0xe8, 0xe2, 0x3d, 0xe6, - 0x6b, 0x4f, 0x4e, 0xe4, 0x5b, 0x70, 0x4e, 0x34, 0xab, 0x82, 0x09, 0xbd, 0x5c, 0xef, 0xb0, 0xb6, - 0x67, 0xa3, 0xff, 0xd6, 0x6c, 0x8f, 0x0e, 0xbb, 0x9e, 0xbe, 0x25, 0xca, 0x0e, 0x6b, 0x48, 0x3e, - 0x96, 0xcf, 0x19, 0x99, 0xbd, 0x6a, 0x20, 0x1f, 0xc1, 0x14, 0x7f, 0x8e, 0x5b, 0x71, 0xfd, 0x00, - 0x95, 0x35, 0x73, 0xa7, 0x73, 0x4b, 0xe0, 0x6f, 0x7c, 0xdc, 0x91, 0x27, 0xa6, 0xdc, 0x89, 0x71, - 0x26, 0xef, 0xc0, 0xf8, 0x86, 0xd3, 0xe6, 0xa1, 0x47, 0xab, 0x1b, 0xa8, 0x56, 0x16, 0x27, 0x50, - 0xc7, 0x69, 0x5b, 0x52, 0x63, 0xd2, 0x09, 0xb7, 0x0b, 0x15, 0x9b, 0x3c, 0x84, 0xf1, 0x5a, 0x6d, - 0xe5, 0xb6, 0xc3, 0xe4, 0x92, 0xce, 0xe1, 0xfc, 0xd9, 0x1e, 0x5f, 0xf9, 0x52, 0xea, 0x57, 0x4e, - 0xfa, 0xfe, 0x9e, 0xb5, 0xe3, 0x34, 0xa9, 0x55, 0x77, 0x3b, 0x87, 0xa6, 0xca, 0x29, 0xc5, 0x54, - 0xff, 0xdc, 0x53, 0x36, 0xd5, 0xaf, 0xc2, 0xb4, 0x62, 0x3c, 0x8b, 0x86, 0xb3, 0xf3, 0x51, 0xbc, - 0x2a, 0xd5, 0x34, 0x3f, 0xee, 0x9a, 0x1a, 0xa7, 0x93, 0x36, 0xfa, 0xe7, 0x4f, 0x6b, 0xa3, 0xef, - 0xc0, 0x0c, 0x1f, 0x0c, 0x31, 0x0f, 0x70, 0xa4, 0x17, 0x7a, 0xf4, 0xe1, 0xd5, 0xd4, 0x3e, 0x9c, - 0x15, 0x23, 0x2d, 0x27, 0x19, 0x3e, 0x3f, 0x27, 0xb9, 0x92, 0x1d, 0x20, 0x02, 0x68, 0x07, 0xf6, - 0xb6, 0xed, 0x53, 0xac, 0xeb, 0xf9, 0x1e, 0x75, 0xbd, 0x9c, 0x5a, 0xd7, 0x94, 0xac, 0x6b, 0x9b, - 0x57, 0x93, 0xc2, 0x91, 0xb4, 0x65, 0x3d, 0x72, 0x7e, 0x61, 0xc7, 0xbe, 0xa0, 0xe9, 0xb8, 0x93, - 0x08, 0x3c, 0xf4, 0x53, 0x7c, 0xd2, 0xc6, 0xfb, 0x3d, 0x85, 0x33, 0x79, 0x0c, 0x67, 0x93, 0x5f, - 0x81, 0x75, 0x5e, 0xc0, 0x3a, 0x2f, 0x68, 0x75, 0xc6, 0x91, 0xf8, 0xbc, 0xd1, 0x9b, 0x15, 0xaf, - 0xb5, 0x07, 0x7f, 0xf2, 0xc3, 0x19, 0x38, 0xb7, 0x76, 0xbb, 0x84, 0xf9, 0x39, 0x1d, 0x1e, 0x89, - 0x2e, 0x74, 0xe9, 0xbd, 0x28, 0xde, 0x41, 0xe2, 0x6f, 0x33, 0x52, 0xe2, 0xc0, 0xad, 0x82, 0x89, - 0xee, 0x2f, 0xb5, 0x76, 0x6c, 0x9e, 0xf6, 0x53, 0xb0, 0x48, 0xf1, 0xfb, 0xfd, 0xf6, 0x1f, 0x15, - 0x33, 0x66, 0xaf, 0xaa, 0x48, 0x13, 0x16, 0xf4, 0x6e, 0x91, 0x5e, 0x14, 0x7b, 0xb4, 0xd9, 0x9c, - 0x2f, 0xe2, 0x8c, 0x7e, 0xe3, 0xf8, 0xa8, 0x78, 0x25, 0xd1, 0xbb, 0xa1, 0x67, 0x06, 0xc3, 0x54, - 0x1a, 0xdc, 0x87, 0x1f, 0x69, 0xa5, 0x08, 0xdd, 0xf3, 0x97, 0xb4, 0xd8, 0x3f, 0x89, 0xf2, 0xa5, - 0x57, 0x84, 0x44, 0x72, 0x81, 0xad, 0xf7, 0x9e, 0x02, 0xa2, 0x99, 0xe4, 0x7c, 0x77, 0x28, 0x3f, - 0x59, 0x98, 0x4a, 0x71, 0x59, 0x30, 0x7e, 0x3b, 0x1b, 0x3b, 0x18, 0x49, 0x15, 0x46, 0xc5, 0x7c, - 0xef, 0x79, 0xc9, 0xb8, 0x90, 0x3a, 0xab, 0x47, 0xc5, 0xd2, 0x31, 0x25, 0x3d, 0x39, 0x60, 0xac, - 0xb0, 0xd1, 0xe2, 0xc6, 0xfb, 0x35, 0x7e, 0xee, 0x21, 0x48, 0x3b, 0xe1, 0x2b, 0xa7, 0x77, 0xc4, - 0xd3, 0xfd, 0x3c, 0xf1, 0xa8, 0x97, 0xb5, 0x91, 0x7d, 0x9e, 0x4a, 0x2a, 0x17, 0x7a, 0x73, 0xe9, - 0x79, 0xa3, 0x9e, 0x5a, 0x85, 0xac, 0x16, 0xe3, 0xb7, 0x32, 0x30, 0xa9, 0x9d, 0xac, 0xe4, 0x96, - 0xe2, 0xaa, 0x18, 0x79, 0xef, 0x6b, 0x38, 0xb8, 0xd9, 0xc6, 0x9d, 0x18, 0x6f, 0x09, 0xbf, 0x83, - 0x6c, 0x6f, 0x3a, 0x5c, 0x6c, 0x71, 0xcf, 0xd5, 0xfe, 0xfa, 0xe1, 0x30, 0x41, 0xe5, 0x50, 0x8f, - 0x04, 0x95, 0xbf, 0x7c, 0x01, 0xa6, 0xf4, 0x1b, 0x31, 0x79, 0x03, 0x46, 0x50, 0x37, 0x2f, 0xd5, - 0x2b, 0xa8, 0x16, 0x42, 0xf5, 0xbd, 0xe6, 0x8c, 0xc2, 0x71, 0xc8, 0x2b, 0x00, 0xa1, 0x01, 0xb8, - 0x7c, 0x99, 0x1a, 0x3e, 0x3e, 0x2a, 0x66, 0xde, 0x34, 0x95, 0x02, 0xf2, 0x75, 0x80, 0x75, 0xb7, - 0x41, 0xc3, 0x74, 0xc1, 0x7d, 0xac, 0x2f, 0x5e, 0x4d, 0xa4, 0x59, 0x39, 0xd3, 0x76, 0x1b, 0x34, - 0x99, 0x53, 0x45, 0xe1, 0x48, 0xbe, 0x00, 0xc3, 0x66, 0xb7, 0x49, 0xe5, 0x0b, 0xc6, 0xb8, 0x3c, - 0xe1, 0xba, 0x4d, 0x1a, 0xe9, 0x09, 0xbc, 0x6e, 0xdc, 0xb0, 0x90, 0x01, 0xc8, 0x07, 0x3c, 0xfd, - 0x8a, 0x88, 0x11, 0x3a, 0x1c, 0xbd, 0xd5, 0x29, 0x92, 0x4f, 0x22, 0x4a, 0xa8, 0x42, 0x42, 0xee, - 0xc3, 0xa8, 0xfa, 0xc8, 0xa4, 0xf8, 0xbc, 0xab, 0x0f, 0x91, 0x8a, 0xd2, 0x41, 0xe4, 0x19, 0x8e, - 0xbf, 0x3f, 0x49, 0x2e, 0xe4, 0x5d, 0x18, 0x63, 0xec, 0xd9, 0xce, 0xe1, 0x8b, 0x5b, 0x0d, 0xbe, - 0xc8, 0x29, 0x1f, 0xc4, 0x76, 0x1f, 0x2d, 0x92, 0x67, 0x48, 0x40, 0xbe, 0x82, 0x09, 0x66, 0x45, - 0x57, 0xf7, 0xb5, 0xca, 0xb9, 0x9c, 0xe8, 0x6a, 0xcc, 0x38, 0x9b, 0xe8, 0xe9, 0x88, 0x1f, 0xd9, - 0x0d, 0x43, 0xae, 0x0d, 0x92, 0x32, 0xe7, 0xb5, 0x44, 0x05, 0xf3, 0x32, 0x8a, 0x58, 0x32, 0xed, - 0xb3, 0xc6, 0x97, 0x74, 0xa0, 0x10, 0x09, 0x95, 0xa2, 0x2e, 0xe8, 0x57, 0xd7, 0x9b, 0x89, 0xba, - 0xd4, 0x01, 0x4c, 0x54, 0x97, 0xe0, 0x4e, 0x1a, 0x30, 0x25, 0x0f, 0x28, 0x51, 0xdf, 0x78, 0xbf, - 0xfa, 0x5e, 0x49, 0xd4, 0x37, 0xdb, 0xd8, 0x4e, 0xd6, 0x13, 0xe3, 0x49, 0xde, 0x85, 0x49, 0x09, - 0xe1, 0x49, 0x98, 0x27, 0xa2, 0x64, 0xb8, 0x8d, 0xed, 0x44, 0xea, 0x65, 0x1d, 0x59, 0xa5, 0xe6, - 0xb3, 0x63, 0x52, 0xa3, 0x8e, 0xcf, 0x0a, 0x1d, 0x99, 0x7c, 0x08, 0xe3, 0xd5, 0x16, 0x6b, 0x88, - 0xdb, 0xb6, 0x03, 0x2a, 0xfc, 0x21, 0xa5, 0x85, 0x91, 0x52, 0xa2, 0x4c, 0x55, 0x9e, 0x5e, 0x3a, - 0x2a, 0xd2, 0xd2, 0x4b, 0x47, 0x60, 0xd6, 0x79, 0xfc, 0x55, 0x51, 0xcc, 0x61, 0xe9, 0x2b, 0x79, - 0x21, 0xc5, 0xca, 0x47, 0x61, 0x2f, 0xe2, 0x41, 0x32, 0xa8, 0x7c, 0xd5, 0x8b, 0xc5, 0xe2, 0x55, - 0x79, 0x92, 0xf7, 0x60, 0x5c, 0x64, 0x13, 0x2b, 0x99, 0xeb, 0xfe, 0x7c, 0x01, 0x1b, 0x8f, 0x11, - 0x1e, 0x64, 0xe2, 0x31, 0xcb, 0xf6, 0x62, 0xe6, 0xac, 0x11, 0x3e, 0xf9, 0x32, 0xcc, 0x3d, 0x74, - 0xda, 0x0d, 0xf7, 0xc0, 0x17, 0xc7, 0x94, 0xd8, 0xe8, 0x66, 0x22, 0x67, 0xb2, 0x03, 0x5e, 0x1e, - 0xca, 0x82, 0x89, 0x8d, 0x2f, 0x95, 0x03, 0xf9, 0xeb, 0x09, 0xce, 0x7c, 0x06, 0x91, 0x7e, 0x33, - 0x68, 0x31, 0x31, 0x83, 0x92, 0xd5, 0xc7, 0xa7, 0x53, 0x6a, 0x35, 0xc4, 0x05, 0xa2, 0x9f, 0xef, - 0x77, 0x5d, 0xa7, 0x3d, 0x3f, 0x8b, 0x7b, 0xe1, 0xf3, 0xf1, 0x98, 0x0a, 0x88, 0x27, 0xd2, 0x74, - 0x1b, 0xc7, 0x47, 0xc5, 0x8b, 0x71, 0x99, 0xff, 0x23, 0x57, 0x7b, 0x2e, 0x49, 0x61, 0x4d, 0x3e, - 0x84, 0x09, 0xf6, 0x7f, 0xa8, 0x94, 0x98, 0xd3, 0xec, 0x42, 0x15, 0x4c, 0x51, 0x0f, 0x8e, 0x11, - 0xa6, 0x3b, 0x4b, 0xd1, 0x57, 0x68, 0xac, 0xc8, 0xdb, 0x00, 0x4c, 0x6c, 0x12, 0xdb, 0xf1, 0x99, - 0x28, 0xf4, 0x31, 0x4a, 0x5d, 0xc9, 0x8d, 0x38, 0x42, 0x26, 0xef, 0xc2, 0x38, 0xfb, 0x55, 0xeb, - 0x36, 0x5c, 0xb6, 0x36, 0xce, 0x22, 0x2d, 0x77, 0x4d, 0x65, 0xb4, 0x3e, 0x87, 0x6b, 0xae, 0xa9, - 0x11, 0x3a, 0x59, 0x81, 0x69, 0x0c, 0x51, 0x2d, 0x82, 0xa3, 0x3a, 0xd4, 0x9f, 0x3f, 0xa7, 0x58, - 0x43, 0xb0, 0x22, 0xcb, 0x09, 0xcb, 0xd4, 0xbb, 0x4c, 0x8c, 0x8c, 0xf8, 0x30, 0x9b, 0x7c, 0x4e, - 0xf6, 0xe7, 0xe7, 0xb1, 0x93, 0xa4, 0x04, 0x9f, 0xc4, 0xe0, 0xfb, 0x31, 0x1b, 0x11, 0x65, 0xe3, - 0x92, 0x8f, 0x4a, 0x6a, 0x85, 0x69, 0xdc, 0x89, 0x09, 0xe4, 0x4e, 0x79, 0x23, 0x1e, 0xc3, 0xf9, - 0x3c, 0xb6, 0x00, 0x87, 0x79, 0xb7, 0x1e, 0xa5, 0xf7, 0x4e, 0x89, 0xe3, 0x9c, 0x42, 0x4d, 0xbe, - 0x17, 0xce, 0xc8, 0x1d, 0x44, 0x14, 0x89, 0x79, 0xbd, 0x70, 0xca, 0x9d, 0xb8, 0xb1, 0x1d, 0x56, - 0x9d, 0x98, 0xd2, 0xe9, 0x55, 0x10, 0x1b, 0xc6, 0x71, 0x58, 0x45, 0x8d, 0xcf, 0xf7, 0xab, 0xf1, - 0x4a, 0xa2, 0xc6, 0xb3, 0x38, 0x51, 0x92, 0x95, 0xa9, 0x3c, 0xc9, 0x12, 0x4c, 0x8a, 0x75, 0x24, - 0x66, 0xdb, 0x0b, 0xd8, 0x5b, 0xa8, 0xc4, 0x92, 0x2b, 0x30, 0x31, 0xe1, 0x74, 0x12, 0x75, 0x47, - 0xe6, 0x8f, 0x49, 0x17, 0xb4, 0x1d, 0x39, 0xfe, 0x86, 0xa4, 0x23, 0xb3, 0x1d, 0x29, 0x92, 0x62, - 0x96, 0x1f, 0x77, 0x3c, 0xa1, 0xa2, 0xba, 0x18, 0x65, 0x45, 0x52, 0x84, 0x1f, 0x8b, 0x86, 0x18, - 0xea, 0x96, 0x90, 0xc6, 0x81, 0x6c, 0xc1, 0x6c, 0x78, 0x6a, 0x2b, 0x8c, 0x8b, 0x51, 0x94, 0xe0, - 0xe8, 0xa8, 0x4f, 0xe7, 0x9b, 0x46, 0x4f, 0x6c, 0x38, 0xa7, 0x9d, 0xd3, 0x0a, 0xeb, 0x4b, 0xc8, - 0x1a, 0xd3, 0xc9, 0xeb, 0x87, 0x7c, 0x3a, 0xfb, 0x5e, 0x7c, 0xc8, 0x47, 0xb0, 0x10, 0x3f, 0x9b, - 0x95, 0x5a, 0x5e, 0xc4, 0x5a, 0x5e, 0x3b, 0x3e, 0x2a, 0x5e, 0x4e, 0x1c, 0xef, 0xe9, 0x15, 0xf5, - 0xe1, 0x46, 0xbe, 0x0e, 0xf3, 0xfa, 0xf9, 0xac, 0xd4, 0x64, 0x60, 0x4d, 0xb8, 0x74, 0xc2, 0x83, - 0x3d, 0xbd, 0x86, 0x9e, 0x3c, 0x48, 0x00, 0xc5, 0xd4, 0xd9, 0xad, 0x54, 0xf3, 0x52, 0xd4, 0xa0, - 0xc4, 0x2a, 0x49, 0xaf, 0xee, 0x24, 0x96, 0xe4, 0x00, 0x2e, 0xa6, 0x1d, 0x13, 0x4a, 0xa5, 0x2f, - 0x87, 0x4a, 0xe0, 0xd7, 0xd3, 0x8f, 0x9c, 0xf4, 0x9a, 0x4f, 0x60, 0x4b, 0xbe, 0x02, 0x67, 0x94, - 0xf5, 0xa5, 0xd4, 0xf7, 0x0a, 0xd6, 0x87, 0xae, 0xe0, 0xea, 0xc2, 0x4c, 0xaf, 0x25, 0x9d, 0x07, - 0x69, 0xc1, 0xac, 0x6c, 0x38, 0x6a, 0xdb, 0xc5, 0xd1, 0x73, 0x59, 0xdb, 0x55, 0x93, 0x18, 0x4b, - 0x97, 0xc4, 0xae, 0x3a, 0xdf, 0xd8, 0xb6, 0x3a, 0x11, 0xa1, 0x3a, 0xd3, 0x53, 0xf8, 0x92, 0x15, - 0x18, 0xa9, 0x6d, 0x54, 0x6f, 0xdf, 0x5e, 0x9e, 0x7f, 0x15, 0x6b, 0x90, 0x7e, 0x63, 0x1c, 0xa8, - 0x5d, 0x9a, 0x84, 0xb9, 0x62, 0xc7, 0xd9, 0xd9, 0xd1, 0x1e, 0xac, 0x38, 0x2a, 0xf9, 0xeb, 0x68, - 0x28, 0xc8, 0x76, 0xd4, 0x92, 0xef, 0x3b, 0xbb, 0x18, 0x75, 0xda, 0x9f, 0x7f, 0x4d, 0x7b, 0xef, - 0x97, 0x11, 0xb9, 0xcb, 0x98, 0xb0, 0x2c, 0x81, 0xce, 0xa5, 0x4d, 0x76, 0xff, 0x17, 0x3b, 0xb7, - 0x65, 0x47, 0xac, 0xd4, 0x4d, 0x3c, 0x59, 0x11, 0xeb, 0xb7, 0x5d, 0x27, 0xb0, 0xf6, 0xba, 0x5a, - 0xf3, 0xe7, 0x5f, 0xd7, 0x22, 0x30, 0xf3, 0x34, 0x6e, 0x4a, 0xaf, 0xbd, 0x2c, 0x2a, 0x7c, 0x81, - 0xdf, 0x96, 0x7b, 0xf4, 0xdc, 0xcc, 0x6e, 0x8c, 0xce, 0xbf, 0x3b, 0x94, 0xbf, 0x52, 0xb8, 0x7a, - 0x77, 0x28, 0x7f, 0xb5, 0xf0, 0x9a, 0xf9, 0x42, 0xad, 0xb4, 0xb6, 0x5a, 0x6d, 0xc8, 0x73, 0x45, - 0x86, 0x1b, 0xe7, 0x43, 0x6b, 0x5e, 0xee, 0x57, 0x1a, 0x0d, 0xbc, 0xf1, 0xb7, 0x33, 0x50, 0x3c, - 0xa1, 0x7f, 0xd8, 0x56, 0x1e, 0x7d, 0x44, 0x8d, 0x06, 0x6a, 0xd0, 0xf2, 0xe8, 0xd3, 0x2d, 0xdd, - 0x62, 0x42, 0x27, 0x41, 0x7f, 0x3b, 0x91, 0x29, 0x43, 0x71, 0xbb, 0x4c, 0x66, 0xc8, 0x90, 0x58, - 0xc6, 0x2a, 0x14, 0xe2, 0xfd, 0x46, 0x3e, 0x0f, 0x93, 0x6a, 0x9c, 0x7e, 0x79, 0x8b, 0xe6, 0x31, - 0x36, 0xbc, 0x5d, 0xed, 0x2c, 0xd0, 0x10, 0x8d, 0x5f, 0xcc, 0xc0, 0x6c, 0xca, 0xe4, 0x22, 0x97, - 0x61, 0x08, 0x13, 0x69, 0x29, 0x06, 0x33, 0xb1, 0x04, 0x5a, 0x58, 0x4e, 0x3e, 0x03, 0xa3, 0x95, - 0xf5, 0x5a, 0xad, 0xb4, 0x2e, 0xef, 0xe1, 0xfc, 0x0c, 0x6a, 0xfb, 0x96, 0x6f, 0xeb, 0xef, 0xec, - 0x02, 0x8d, 0xbc, 0x09, 0x23, 0xd5, 0x0d, 0x24, 0xe0, 0x66, 0x9f, 0xd8, 0x5e, 0xa7, 0x13, 0xc7, - 0x17, 0x48, 0xc6, 0x4f, 0x64, 0x80, 0x24, 0x57, 0x0a, 0xb9, 0x01, 0xe3, 0xea, 0x7a, 0xe4, 0xed, - 0xc5, 0xc7, 0x47, 0x65, 0xce, 0x98, 0x2a, 0x0e, 0xa9, 0xc0, 0x30, 0xa6, 0x40, 0x0d, 0x1f, 0xf8, - 0x53, 0x4f, 0xf5, 0x73, 0x89, 0x53, 0x7d, 0x18, 0x13, 0xac, 0x9a, 0x9c, 0xd8, 0xf8, 0xdd, 0x0c, - 0x90, 0x74, 0xb3, 0xbd, 0x81, 0x0c, 0x8c, 0xde, 0x52, 0xdc, 0xf6, 0xd5, 0x54, 0x39, 0x61, 0x9e, - 0x33, 0xf5, 0x06, 0x1c, 0x39, 0xf8, 0x5f, 0xd6, 0x34, 0x2e, 0xbd, 0x7d, 0x3d, 0xaf, 0xc2, 0xf0, - 0x03, 0xea, 0x6d, 0x4b, 0x8b, 0x66, 0xb4, 0x82, 0x7c, 0xc4, 0x00, 0xaa, 0x06, 0x02, 0x31, 0x8c, - 0x3f, 0xc9, 0xc0, 0x5c, 0x9a, 0x78, 0x7e, 0x82, 0x4b, 0xa6, 0x11, 0xf3, 0x26, 0x45, 0xe3, 0x22, - 0x6e, 0x22, 0x19, 0xfa, 0x90, 0x16, 0x61, 0x98, 0x35, 0x56, 0x8e, 0x30, 0x6a, 0x80, 0x58, 0x6f, - 0xf8, 0x26, 0x87, 0x33, 0x04, 0x1e, 0x9e, 0x6e, 0x08, 0x23, 0x1b, 0x22, 0x02, 0xce, 0x6e, 0x93, - 0xc3, 0x19, 0xc2, 0x9a, 0xdb, 0x08, 0xb3, 0xff, 0x23, 0x42, 0x8b, 0x01, 0x4c, 0x0e, 0x27, 0x97, - 0x61, 0xf4, 0x7e, 0x7b, 0x95, 0xda, 0x8f, 0x64, 0xba, 0x06, 0x34, 0x86, 0x72, 0xdb, 0x56, 0x93, - 0xc1, 0x4c, 0x59, 0x68, 0xfc, 0x6c, 0x06, 0x66, 0x12, 0x37, 0x83, 0x93, 0xbd, 0x4e, 0xfb, 0xbb, - 0x7f, 0x0d, 0xd2, 0x3e, 0xfe, 0xf9, 0x43, 0xe9, 0x9f, 0x6f, 0xfc, 0xb7, 0x23, 0x70, 0xae, 0x87, - 0xa2, 0x26, 0x72, 0x4f, 0xcd, 0x9c, 0xe8, 0x9e, 0xfa, 0x55, 0x98, 0x2c, 0x37, 0x6d, 0xa7, 0xe5, - 0x6f, 0xba, 0xd1, 0x17, 0x47, 0x5e, 0x2e, 0x58, 0x26, 0x5c, 0x00, 0x42, 0x77, 0x88, 0xf3, 0x75, - 0xa4, 0xb0, 0x02, 0x37, 0x29, 0x27, 0x6a, 0xcc, 0x12, 0x0e, 0xa2, 0xb9, 0xbf, 0x24, 0x0e, 0xa2, - 0xba, 0xcb, 0xd2, 0xd0, 0x53, 0x75, 0x59, 0x4a, 0x37, 0x77, 0x1e, 0x7e, 0x12, 0xe3, 0xf7, 0x32, - 0x4c, 0x72, 0x6b, 0xb0, 0x92, 0xcf, 0x07, 0x69, 0x24, 0x61, 0x41, 0x66, 0xfb, 0xc9, 0xb1, 0xd0, - 0x68, 0xc8, 0x8a, 0xee, 0x5e, 0x33, 0x8a, 0xcf, 0xa5, 0x97, 0x7b, 0xbb, 0xcf, 0x68, 0x66, 0x12, - 0x9a, 0x1b, 0xcd, 0xb7, 0x60, 0x2e, 0xed, 0xa6, 0x37, 0x9f, 0xd7, 0x0c, 0x4d, 0x7b, 0x1a, 0x28, - 0x0f, 0x7e, 0x5f, 0xdc, 0x4f, 0xbd, 0x2f, 0x4a, 0xb7, 0xe7, 0x31, 0x2d, 0x9a, 0x71, 0x8f, 0xb5, - 0xc0, 0x71, 0xfb, 0x3b, 0x47, 0x1b, 0x5f, 0x85, 0x0b, 0x7d, 0xc9, 0xc9, 0x3b, 0x5a, 0x78, 0x9d, - 0x57, 0x93, 0xe1, 0x75, 0xbe, 0x7b, 0x54, 0x9c, 0xd1, 0x5c, 0x16, 0xd7, 0x42, 0x5d, 0xb7, 0xf1, - 0xb3, 0x59, 0xdd, 0xd9, 0xf6, 0x2f, 0xe3, 0x42, 0xbd, 0x0a, 0xc3, 0x0f, 0xf7, 0xa8, 0x27, 0x8f, - 0x07, 0xfc, 0x90, 0x03, 0x06, 0x50, 0x3f, 0x04, 0x31, 0xc8, 0x6d, 0x98, 0xda, 0xe0, 0x13, 0x57, - 0xce, 0xc6, 0xa1, 0x48, 0xdd, 0xd0, 0x11, 0x4a, 0xb1, 0x94, 0xe9, 0x18, 0xa3, 0x32, 0xee, 0xc4, - 0x3a, 0x5d, 0x04, 0x07, 0xe2, 0x4e, 0x41, 0x5c, 0x80, 0x98, 0x8a, 0xdc, 0xa0, 0xa2, 0xcd, 0xd6, - 0x8c, 0x41, 0x8d, 0x1d, 0xb8, 0xd8, 0x97, 0x11, 0x3b, 0xb7, 0xa1, 0x13, 0xfe, 0x8a, 0x19, 0x1d, - 0xf7, 0x25, 0x35, 0x15, 0x3a, 0xe3, 0x5b, 0x30, 0xa1, 0xf6, 0x32, 0x1e, 0x41, 0xec, 0xb7, 0x98, - 0x15, 0xfc, 0x08, 0x62, 0x00, 0x93, 0xc3, 0xa3, 0x67, 0x8c, 0x6c, 0xfa, 0x33, 0x46, 0x34, 0xfc, - 0xb9, 0x93, 0x86, 0x9f, 0x55, 0x8e, 0x3b, 0x9c, 0x52, 0x39, 0xfe, 0x56, 0x2b, 0xc7, 0xe8, 0x3f, - 0x26, 0x87, 0x3f, 0xd5, 0xca, 0xff, 0x89, 0xcc, 0xef, 0x85, 0x3e, 0x47, 0x72, 0xb9, 0x67, 0xa2, - 0x24, 0x5d, 0x69, 0xab, 0x37, 0xc2, 0x8c, 0x64, 0x8a, 0xec, 0x49, 0x32, 0xc5, 0x69, 0x26, 0x22, - 0xca, 0xbd, 0x7c, 0x48, 0x87, 0x22, 0x39, 0xd0, 0x4e, 0x18, 0x7a, 0x48, 0x2c, 0xe3, 0xdb, 0x19, - 0x38, 0x93, 0xaa, 0x2e, 0x66, 0xb5, 0x72, 0xbd, 0xb4, 0xb2, 0x0e, 0xe3, 0x4a, 0x69, 0x8e, 0x71, - 0x9a, 0xd0, 0x0f, 0x83, 0xb7, 0xc5, 0x78, 0x11, 0xc6, 0xc2, 0xc7, 0x4a, 0x32, 0x27, 0x87, 0x0e, - 0x4d, 0x02, 0xe5, 0x9b, 0x57, 0x0d, 0x80, 0x7d, 0xc1, 0x53, 0xb5, 0x2a, 0x36, 0xfe, 0x49, 0x96, - 0xe7, 0x7e, 0x7d, 0x66, 0xa3, 0xb8, 0xa6, 0x9b, 0x02, 0xb3, 0x26, 0xf5, 0x8e, 0xdd, 0x4a, 0x96, - 0x61, 0xa4, 0x16, 0xd8, 0x41, 0x57, 0x46, 0xac, 0x98, 0x55, 0xc9, 0xb0, 0xe0, 0xc1, 0x62, 0x14, - 0xb3, 0xc0, 0x47, 0x88, 0x76, 0x41, 0x46, 0x88, 0x62, 0x51, 0xfc, 0x07, 0x19, 0x98, 0x50, 0x89, - 0xc9, 0x87, 0x30, 0x25, 0x63, 0x53, 0xf2, 0x38, 0x1e, 0xe2, 0x65, 0x55, 0x5a, 0x41, 0xc9, 0xd8, - 0x94, 0x6a, 0xdc, 0x0f, 0x0d, 0x5f, 0xdd, 0xaa, 0x3b, 0x2a, 0x32, 0x69, 0x00, 0x69, 0xed, 0xd8, - 0xd6, 0x01, 0xb5, 0xf7, 0xa9, 0x1f, 0x58, 0xdc, 0x5a, 0x45, 0x3c, 0xc0, 0x4a, 0xf6, 0x6b, 0xb7, - 0x4b, 0xdc, 0x50, 0x85, 0x8d, 0x84, 0x08, 0x32, 0x9a, 0xa0, 0x51, 0x5f, 0x95, 0x5a, 0x3b, 0xf6, - 0x43, 0x5e, 0xc8, 0xe9, 0x8c, 0x3f, 0x1d, 0xe1, 0xd3, 0x4d, 0x84, 0xb2, 0xdd, 0x86, 0xa9, 0xfb, - 0xd5, 0x4a, 0x59, 0xd1, 0x31, 0xeb, 0x99, 0x90, 0x96, 0x1f, 0x07, 0xd4, 0x6b, 0xdb, 0x4d, 0x79, - 0xdf, 0x8d, 0x8e, 0x20, 0xd7, 0x69, 0xd4, 0xd3, 0xf5, 0xcf, 0x31, 0x8e, 0xac, 0x0e, 0x7e, 0xb3, - 0x0e, 0xeb, 0xc8, 0x0e, 0x58, 0x87, 0x6f, 0xb7, 0x9a, 0x3d, 0xea, 0xd0, 0x39, 0x92, 0x3d, 0xbc, - 0xfa, 0xee, 0x75, 0xb7, 0x95, 0x5a, 0x72, 0xfd, 0x6b, 0x79, 0x49, 0xd4, 0xf2, 0xbc, 0xd0, 0x28, - 0xa4, 0xd6, 0x93, 0xe0, 0x1a, 0xed, 0x13, 0x43, 0x27, 0xee, 0x13, 0x7f, 0x23, 0x03, 0x23, 0x5c, - 0x7c, 0x15, 0xd3, 0xb8, 0x87, 0x80, 0xfc, 0xf0, 0xe9, 0x08, 0xc8, 0x05, 0x3c, 0x27, 0xb4, 0x09, - 0xcd, 0xcb, 0x48, 0x25, 0xb6, 0x2e, 0xa4, 0x21, 0x3c, 0xbe, 0x16, 0xf1, 0x92, 0x93, 0x97, 0x05, - 0xa9, 0x46, 0x51, 0x24, 0x46, 0x4f, 0x74, 0x54, 0x96, 0x91, 0x37, 0x46, 0x45, 0x14, 0x09, 0x3d, - 0x76, 0xc4, 0x2a, 0x8c, 0x89, 0xd8, 0x14, 0x4b, 0x87, 0xe2, 0x4d, 0xb8, 0xa0, 0x59, 0xf5, 0x34, - 0x96, 0x0e, 0x23, 0xd1, 0x5c, 0x44, 0xb7, 0xb0, 0xb6, 0x0f, 0xb5, 0x54, 0xba, 0x12, 0x91, 0xdc, - 0xe7, 0x29, 0x26, 0x79, 0xb0, 0x5f, 0x3d, 0xba, 0x7f, 0x08, 0x17, 0x51, 0xaf, 0xa4, 0x83, 0x7b, - 0x4a, 0x6c, 0xdf, 0x88, 0x07, 0x59, 0x85, 0x02, 0x5a, 0x82, 0xd1, 0x06, 0x5f, 0x35, 0xd5, 0x0a, - 0x8f, 0x7f, 0x20, 0xac, 0x79, 0x03, 0x5e, 0x26, 0x96, 0x5b, 0xcc, 0xf5, 0x30, 0x41, 0xc9, 0xae, - 0xd3, 0x85, 0xf8, 0xec, 0x23, 0xef, 0xc2, 0x78, 0x18, 0x6c, 0x39, 0x74, 0x7e, 0xc6, 0xb7, 0xa1, - 0x28, 0x3a, 0xb3, 0x9e, 0x98, 0x50, 0x41, 0x27, 0x8b, 0x90, 0x67, 0x8b, 0x38, 0x9e, 0xc4, 0xb7, - 0x2b, 0x60, 0xaa, 0x33, 0x92, 0xc4, 0x23, 0x35, 0x98, 0x65, 0x8b, 0xa6, 0xe6, 0xb4, 0x77, 0x9b, - 0x74, 0xd5, 0xdd, 0x75, 0xbb, 0x41, 0x94, 0xa7, 0x8f, 0x5f, 0x60, 0xec, 0x56, 0x53, 0x2b, 0xd6, - 0xb3, 0xf4, 0xa5, 0x50, 0x2b, 0x5b, 0xe5, 0x1f, 0x65, 0x61, 0x5c, 0x99, 0x4f, 0xe4, 0x2a, 0xe4, - 0xab, 0xfe, 0xaa, 0x5b, 0xdf, 0x0f, 0xc3, 0x22, 0x4e, 0x1e, 0x1f, 0x15, 0xc7, 0x1c, 0xdf, 0x6a, - 0x22, 0xd0, 0x0c, 0x8b, 0xc9, 0x12, 0x4c, 0xf2, 0xbf, 0x64, 0x12, 0x8c, 0x6c, 0xa4, 0x2c, 0xe3, - 0xc8, 0x32, 0xfd, 0x85, 0xba, 0x7b, 0x6a, 0x24, 0xe4, 0x6b, 0x00, 0x1c, 0x80, 0x8e, 0xf4, 0xb9, - 0xc1, 0x43, 0x00, 0x88, 0x0a, 0x52, 0x5c, 0xe8, 0x15, 0x86, 0xe4, 0x1b, 0x3c, 0x38, 0xb3, 0x9c, - 0xff, 0x43, 0x83, 0xc7, 0x30, 0x60, 0xfc, 0xad, 0xf4, 0x50, 0x2a, 0x2a, 0x4b, 0x91, 0xb7, 0x66, - 0xc1, 0xa4, 0x75, 0xf7, 0x11, 0xf5, 0x0e, 0x4b, 0x01, 0x22, 0x2a, 0x18, 0xc6, 0xff, 0x9a, 0x51, - 0x56, 0x0d, 0x59, 0xc7, 0xbc, 0xd3, 0x7c, 0x46, 0x08, 0xf3, 0xa8, 0xf0, 0xce, 0x20, 0xe1, 0x26, - 0xdd, 0x59, 0x7a, 0x5e, 0x58, 0x6a, 0xcd, 0x86, 0xf3, 0x2a, 0x96, 0x8f, 0x9a, 0x03, 0xc9, 0x17, - 0x61, 0x08, 0xbb, 0x2e, 0x7b, 0x62, 0xd3, 0xe4, 0xb1, 0x3d, 0xc4, 0xfa, 0x0c, 0x1b, 0x82, 0x94, - 0xe4, 0x33, 0xc2, 0x09, 0x99, 0x77, 0xfe, 0x94, 0x72, 0xf6, 0xb2, 0xef, 0x08, 0xcf, 0xeb, 0x28, - 0x9a, 0x8e, 0x32, 0x7b, 0xfe, 0x76, 0x16, 0x0a, 0xf1, 0xb5, 0x4a, 0x3e, 0x80, 0x09, 0x79, 0x9e, - 0xae, 0xd8, 0x22, 0x83, 0xc3, 0x84, 0xc8, 0xa0, 0x20, 0x0f, 0xd5, 0x3d, 0x5b, 0x35, 0xa7, 0x32, - 0x35, 0x02, 0x26, 0xdc, 0x6c, 0x8a, 0xe8, 0x76, 0xca, 0x2a, 0x09, 0xdc, 0xa0, 0x13, 0x8b, 0x09, - 0x2c, 0xd1, 0xc8, 0x5b, 0x90, 0x5b, 0xbb, 0x5d, 0x12, 0xce, 0x6a, 0x85, 0xf8, 0xa9, 0xcb, 0xad, - 0x3e, 0x75, 0x1b, 0x54, 0x86, 0x4f, 0x56, 0x95, 0xf0, 0xd9, 0x23, 0x9a, 0xe9, 0x9c, 0x04, 0x87, - 0x8d, 0x3b, 0x39, 0x8e, 0xf6, 0xdd, 0xa1, 0x7c, 0xae, 0x30, 0x24, 0x02, 0xc2, 0xfe, 0xf7, 0x39, - 0x18, 0x0b, 0xeb, 0x27, 0x44, 0x75, 0x01, 0xe6, 0xee, 0xbe, 0xe4, 0x3c, 0xe4, 0xa5, 0xb8, 0x26, - 0x7c, 0xd6, 0x46, 0x7d, 0x21, 0xaa, 0xcd, 0x83, 0x94, 0xcb, 0xf8, 0x32, 0x37, 0xe5, 0x4f, 0x72, - 0x03, 0x42, 0xa1, 0xab, 0x97, 0x74, 0x36, 0xc4, 0x06, 0xcc, 0x0c, 0xd1, 0xc8, 0x14, 0x64, 0x1d, - 0x1e, 0x64, 0x6c, 0xcc, 0xcc, 0x3a, 0x0d, 0xf2, 0x01, 0xe4, 0xed, 0x46, 0x83, 0x36, 0x2c, 0x5b, - 0xda, 0x19, 0xf5, 0x9b, 0x34, 0x79, 0xc6, 0x8d, 0x1f, 0x02, 0x48, 0x55, 0x0a, 0x48, 0x09, 0xc6, - 0x9a, 0x36, 0xb7, 0x5c, 0x6c, 0x0c, 0x70, 0xa2, 0x44, 0x1c, 0xf2, 0x8c, 0x6c, 0xcb, 0xa7, 0x0d, - 0xf2, 0x2a, 0x0c, 0xb1, 0xd1, 0x14, 0x47, 0x88, 0x94, 0x12, 0xd9, 0x60, 0xf2, 0x0e, 0x5b, 0x79, - 0xce, 0x44, 0x04, 0xf2, 0x32, 0xe4, 0xba, 0x8b, 0x3b, 0xe2, 0x70, 0x28, 0x44, 0xa1, 0xec, 0x43, - 0x34, 0x56, 0x4c, 0x6e, 0x42, 0xfe, 0x40, 0x8f, 0x82, 0x7e, 0x26, 0x36, 0x8c, 0x21, 0x7e, 0x88, - 0x48, 0x5e, 0x85, 0x9c, 0xef, 0xbb, 0xc2, 0x38, 0x67, 0x36, 0xb4, 0x98, 0xbc, 0x1f, 0x8e, 0x1a, - 0xe3, 0xee, 0xfb, 0xee, 0x52, 0x1e, 0x46, 0xf8, 0x89, 0x61, 0x5c, 0x04, 0x88, 0xbe, 0x31, 0xe9, - 0x83, 0x68, 0x7c, 0x0d, 0xc6, 0xc2, 0x6f, 0x23, 0x17, 0x00, 0xf6, 0xe9, 0xa1, 0xb5, 0x67, 0xb7, - 0x1b, 0x4d, 0x2e, 0x6e, 0x4e, 0x98, 0x63, 0xfb, 0xf4, 0x70, 0x05, 0x01, 0xe4, 0x1c, 0x8c, 0x76, - 0xd8, 0xf0, 0x8b, 0x39, 0x3e, 0x61, 0x8e, 0x74, 0xba, 0xdb, 0x6c, 0x2a, 0xcf, 0xc3, 0x28, 0x2a, - 0x4e, 0xc5, 0x8a, 0x9c, 0x34, 0xe5, 0x4f, 0xe3, 0xcf, 0x72, 0x98, 0x2a, 0x48, 0x69, 0x10, 0x79, - 0x09, 0x26, 0xeb, 0x1e, 0xc5, 0xc3, 0xc9, 0x66, 0x22, 0x97, 0xa8, 0x67, 0x22, 0x02, 0x56, 0x1b, - 0xe4, 0x32, 0x4c, 0x77, 0xba, 0xdb, 0x4d, 0xa7, 0xce, 0x6a, 0xb3, 0xea, 0xdb, 0x22, 0xb7, 0xc1, - 0x84, 0x39, 0xc9, 0xc1, 0xf7, 0xe8, 0x61, 0x79, 0x1b, 0xa3, 0xe8, 0x15, 0xd4, 0x20, 0xc8, 0x41, - 0x98, 0xc4, 0xdd, 0x9c, 0x56, 0xe0, 0x68, 0x67, 0x78, 0x16, 0x46, 0x6c, 0x7b, 0xb7, 0xeb, 0xf0, - 0x68, 0x57, 0x13, 0xa6, 0xf8, 0x45, 0x5e, 0x87, 0x99, 0x28, 0x2e, 0xb7, 0x6c, 0xc6, 0x30, 0x36, - 0xa3, 0x10, 0x16, 0x94, 0x39, 0x9c, 0xbc, 0x09, 0x44, 0xad, 0xcf, 0xdd, 0xfe, 0x88, 0xd6, 0xf9, - 0x9c, 0x9c, 0x30, 0x67, 0x94, 0x92, 0xfb, 0x58, 0x40, 0x5e, 0x84, 0x09, 0x8f, 0xfa, 0x28, 0xee, - 0x61, 0xb7, 0x61, 0x26, 0x3d, 0x73, 0x5c, 0xc2, 0x58, 0xdf, 0x5d, 0x81, 0x82, 0xd2, 0x1d, 0x18, - 0x67, 0x9a, 0x07, 0xf6, 0x37, 0xa7, 0x22, 0xb8, 0xd9, 0xa9, 0x36, 0xc8, 0x97, 0x61, 0x41, 0xc1, - 0xe4, 0x49, 0xfd, 0x2c, 0xda, 0x74, 0x76, 0x9d, 0xed, 0x26, 0x15, 0xf3, 0x2d, 0x39, 0xab, 0xc3, - 0x3b, 0xa1, 0x39, 0x1f, 0x51, 0xf3, 0x74, 0x7f, 0xcb, 0x82, 0x96, 0xac, 0xc2, 0x5c, 0x8c, 0x33, - 0x6d, 0x58, 0xdd, 0x4e, 0xcf, 0xf0, 0x72, 0x11, 0x4f, 0xa2, 0xf3, 0xa4, 0x8d, 0xad, 0x8e, 0xf1, - 0x2d, 0x98, 0x50, 0xe7, 0x24, 0xeb, 0x04, 0x55, 0xd0, 0x10, 0xb3, 0x6f, 0x3c, 0x84, 0x55, 0xd9, - 0x45, 0x6f, 0x2a, 0x42, 0x09, 0xc2, 0x7c, 0xf5, 0xe6, 0x64, 0x08, 0xc5, 0x21, 0x7c, 0x11, 0x26, - 0x1a, 0x8e, 0xdf, 0x69, 0xda, 0x87, 0x56, 0x94, 0xad, 0xda, 0x1c, 0x17, 0x30, 0xd4, 0xe4, 0x2c, - 0xc1, 0x4c, 0x62, 0x1f, 0x24, 0x6f, 0xf2, 0x1b, 0xaa, 0x10, 0x7e, 0x26, 0xf8, 0x2d, 0x1f, 0xad, - 0x98, 0x35, 0xb9, 0x47, 0x20, 0x19, 0x6d, 0x98, 0x50, 0xcf, 0xb5, 0x13, 0x92, 0x70, 0x9c, 0xc5, - 0x90, 0x32, 0x7c, 0xd3, 0x1f, 0x39, 0x3e, 0x2a, 0x66, 0x9d, 0x06, 0x06, 0x92, 0xb9, 0x02, 0x79, - 0x29, 0x82, 0x09, 0xc9, 0x07, 0x5f, 0x07, 0x64, 0x86, 0x62, 0x33, 0x2c, 0x35, 0x5e, 0x85, 0x51, - 0x71, 0x74, 0xf5, 0x7f, 0x13, 0x30, 0x7e, 0x24, 0x0b, 0xd3, 0x26, 0x65, 0x1b, 0x2b, 0xe5, 0x99, - 0x77, 0x9e, 0xd9, 0x3b, 0x77, 0x7a, 0x60, 0x52, 0xad, 0x6d, 0x7d, 0x72, 0xde, 0xfc, 0xc3, 0x0c, - 0xcc, 0xa6, 0xe0, 0x7e, 0xac, 0x9c, 0xaf, 0xb7, 0x60, 0xac, 0xe2, 0xd8, 0xcd, 0x52, 0xa3, 0x11, - 0xc6, 0x97, 0x41, 0xc1, 0x1d, 0x13, 0x43, 0xd9, 0x0c, 0xaa, 0x0a, 0x31, 0x21, 0x2a, 0x79, 0x4d, - 0x4c, 0x8a, 0x28, 0x63, 0x3a, 0x4e, 0x8a, 0xef, 0x1e, 0x15, 0x81, 0x7f, 0xd3, 0x66, 0x38, 0x45, - 0x30, 0x58, 0x30, 0x07, 0x46, 0x3e, 0x42, 0xcf, 0xec, 0xd0, 0xa5, 0x07, 0x0b, 0x8e, 0x37, 0x6f, - 0xa0, 0xb4, 0x37, 0x3f, 0x99, 0x85, 0xb3, 0xe9, 0x84, 0x1f, 0x37, 0x7d, 0x2f, 0x26, 0x1c, 0x52, - 0x02, 0x9c, 0x63, 0xfa, 0x5e, 0x9e, 0x9d, 0x08, 0xf1, 0x23, 0x04, 0xb2, 0x03, 0x93, 0xab, 0xb6, - 0x1f, 0xac, 0x50, 0xdb, 0x0b, 0xb6, 0xa9, 0x1d, 0x0c, 0x20, 0xc9, 0x4b, 0xcb, 0x80, 0x79, 0x14, - 0x26, 0xf6, 0x24, 0x65, 0x4c, 0xd6, 0xd6, 0xd9, 0x86, 0x13, 0x65, 0x68, 0x80, 0x89, 0xf2, 0x4d, - 0x98, 0xae, 0xd1, 0x96, 0xdd, 0xd9, 0x73, 0x3d, 0xe9, 0xfb, 0x7f, 0x0d, 0x26, 0x43, 0x50, 0xea, - 0x6c, 0xd1, 0x8b, 0x35, 0x7c, 0xa5, 0x23, 0xa2, 0xad, 0x44, 0x2f, 0x36, 0xfe, 0x4e, 0x16, 0xce, - 0x95, 0xea, 0xc2, 0xcc, 0x51, 0x14, 0x48, 0x6b, 0xec, 0x4f, 0xb8, 0x6e, 0x72, 0x1d, 0xc6, 0xd6, - 0xec, 0xc7, 0xab, 0xd4, 0xf6, 0xa9, 0x2f, 0x92, 0x27, 0x72, 0xb1, 0xd7, 0x7e, 0x1c, 0xbd, 0xe6, - 0x98, 0x11, 0x8e, 0xaa, 0x17, 0x18, 0x7a, 0x42, 0xbd, 0x80, 0x01, 0x23, 0x2b, 0x6e, 0xb3, 0x21, - 0xce, 0x7a, 0xf1, 0x84, 0xbc, 0x87, 0x10, 0x53, 0x94, 0xb0, 0xeb, 0xf4, 0x54, 0xf8, 0xc5, 0xf8, - 0x09, 0x9f, 0x78, 0x97, 0x5c, 0x86, 0x51, 0xac, 0x28, 0xcc, 0xf2, 0x8e, 0x87, 0x46, 0x93, 0x62, - 0x0a, 0xbc, 0x86, 0x29, 0x0b, 0xd5, 0x9e, 0x18, 0x7e, 0xb2, 0x9e, 0x30, 0xfe, 0x01, 0xbe, 0x4e, - 0xab, 0xad, 0x64, 0x27, 0x91, 0xf2, 0x21, 0x99, 0x01, 0x3f, 0x24, 0xfb, 0xd4, 0x86, 0x24, 0xd7, - 0x73, 0x48, 0x7e, 0x34, 0x0b, 0xe3, 0xe1, 0xc7, 0x7e, 0xca, 0xa2, 0xec, 0x87, 0xed, 0x1a, 0x28, - 0x5e, 0x4f, 0x4d, 0xd9, 0x2b, 0x44, 0x58, 0x9c, 0x2f, 0xc2, 0x88, 0x58, 0x4c, 0x99, 0x98, 0x55, - 0x72, 0x6c, 0x74, 0x97, 0xa6, 0x04, 0xeb, 0x11, 0x1c, 0x50, 0xdf, 0x14, 0x74, 0x18, 0x10, 0xe9, - 0x21, 0xdd, 0x16, 0xc6, 0x0a, 0xcf, 0xec, 0x19, 0x95, 0x1e, 0x10, 0x29, 0x6a, 0xd8, 0x40, 0xa7, - 0xd3, 0x3f, 0xcd, 0x43, 0x21, 0x4e, 0x72, 0x72, 0x1e, 0x83, 0x8d, 0xee, 0x36, 0xbf, 0xaa, 0xf0, - 0x3c, 0x06, 0x9d, 0xee, 0xb6, 0xc9, 0x60, 0x68, 0xcb, 0xe4, 0x39, 0x8f, 0xb0, 0xd5, 0x13, 0xc2, - 0x96, 0xc9, 0x73, 0x1e, 0x69, 0xb6, 0x4c, 0x9e, 0xf3, 0x08, 0x15, 0x09, 0xab, 0x35, 0x0c, 0x16, - 0x80, 0xf7, 0x14, 0xa1, 0x48, 0x68, 0xfa, 0xf1, 0x9c, 0x64, 0x12, 0x8d, 0x1d, 0x95, 0x4b, 0xd4, - 0xf6, 0x44, 0xcc, 0x7d, 0xb1, 0x9d, 0xe1, 0x51, 0xb9, 0x8d, 0x60, 0x2b, 0x60, 0x70, 0x53, 0x45, - 0x22, 0x4d, 0x20, 0xca, 0x4f, 0xb9, 0x80, 0x4f, 0xbe, 0x5b, 0x4b, 0x8b, 0xc2, 0x39, 0x95, 0xb5, - 0xa5, 0xae, 0xe6, 0x14, 0xbe, 0x4f, 0x53, 0x9d, 0xbb, 0x21, 0x02, 0x89, 0xa2, 0x02, 0x29, 0x7f, - 0x22, 0x33, 0x19, 0xe4, 0x04, 0x78, 0xa0, 0xd1, 0x50, 0x8d, 0x14, 0x31, 0x21, 0xef, 0xc3, 0xb8, - 0x1a, 0x02, 0x82, 0x07, 0x2a, 0x78, 0x81, 0xc7, 0x86, 0xec, 0x91, 0xc5, 0x56, 0x25, 0x20, 0xdb, - 0x70, 0xae, 0xec, 0xb6, 0xfd, 0x6e, 0x4b, 0x46, 0xa1, 0x8c, 0x62, 0x5f, 0x03, 0x0e, 0x05, 0xfa, - 0x93, 0xd7, 0x05, 0x8a, 0x88, 0x38, 0x20, 0x5d, 0x3e, 0xf4, 0x0b, 0x48, 0x2f, 0x46, 0x64, 0x13, - 0xc6, 0x51, 0x25, 0x2a, 0x6c, 0x4a, 0xc7, 0xf5, 0x6d, 0x23, 0x2a, 0xa9, 0xb0, 0x85, 0xc1, 0x23, - 0xa0, 0xd9, 0xad, 0xa6, 0xf4, 0x38, 0x50, 0x55, 0xbb, 0x0a, 0x32, 0xf9, 0x1a, 0x4c, 0xf1, 0x2b, - 0xda, 0x43, 0xba, 0xcd, 0xe7, 0xce, 0x84, 0xa6, 0x89, 0xd0, 0x0b, 0xf9, 0xeb, 0xbc, 0x50, 0x44, - 0x1f, 0xd0, 0x6d, 0x3e, 0xf6, 0x9a, 0xbf, 0x8f, 0x86, 0x4f, 0xb6, 0x60, 0x76, 0xc5, 0xf6, 0x39, - 0x50, 0xf1, 0xe5, 0x9f, 0x44, 0x0d, 0x2d, 0xda, 0x61, 0xef, 0xd9, 0xbe, 0xd4, 0x6c, 0xa7, 0xfa, - 0xee, 0xa7, 0xd1, 0x93, 0x1f, 0xc9, 0xc0, 0xbc, 0xa6, 0xf8, 0x16, 0x86, 0x63, 0x2d, 0xda, 0x0e, - 0xd0, 0xb1, 0x67, 0x6a, 0xb1, 0x28, 0x85, 0xd2, 0x1e, 0x68, 0x7c, 0x48, 0x62, 0xba, 0x75, 0x2f, - 0x2a, 0x57, 0x0d, 0x9c, 0x7b, 0xf1, 0x10, 0x0b, 0x15, 0xd7, 0xf4, 0xb4, 0xbe, 0x50, 0x63, 0xeb, - 0x5a, 0xa2, 0x19, 0xb7, 0xe2, 0xfd, 0x2d, 0x14, 0x5d, 0x99, 0x50, 0xd1, 0x35, 0x07, 0xc3, 0xd8, - 0xab, 0x32, 0x22, 0x14, 0xfe, 0x30, 0x3e, 0xa3, 0xee, 0x43, 0x42, 0x2c, 0xec, 0xbb, 0x0f, 0x19, - 0xff, 0xe3, 0x08, 0x4c, 0xc7, 0xa6, 0x85, 0xb8, 0xa7, 0x66, 0x12, 0xf7, 0xd4, 0x1a, 0x00, 0x57, - 0xf5, 0x0e, 0xa8, 0x93, 0x95, 0x4e, 0x85, 0xe3, 0xc2, 0x25, 0x38, 0x5c, 0x53, 0x0a, 0x1b, 0xc6, - 0x94, 0xaf, 0xd8, 0x01, 0x75, 0xe4, 0x21, 0x53, 0xbe, 0xe8, 0x15, 0xa6, 0x11, 0x1b, 0x52, 0x84, - 0x61, 0x8c, 0x05, 0xab, 0xfa, 0x74, 0x3a, 0x0c, 0x60, 0x72, 0x38, 0x79, 0x09, 0x46, 0x98, 0x10, - 0x55, 0xad, 0x88, 0x4d, 0x10, 0xcf, 0x16, 0x26, 0x65, 0x31, 0x89, 0x45, 0x14, 0x91, 0x5b, 0x30, - 0xc1, 0xff, 0x12, 0x21, 0x63, 0x46, 0x74, 0x6b, 0x46, 0xcb, 0x69, 0xc8, 0xa8, 0x31, 0x1a, 0x1e, - 0xbb, 0x5d, 0xd4, 0xba, 0xa8, 0xd6, 0xa9, 0x56, 0x44, 0xf0, 0x70, 0xbc, 0x5d, 0xf8, 0x1c, 0xc8, - 0xaa, 0x88, 0x10, 0x98, 0x2c, 0x23, 0x3c, 0x2b, 0xf2, 0x78, 0xa7, 0x44, 0x59, 0x86, 0x7b, 0x54, - 0x98, 0xa2, 0x84, 0x5c, 0xe5, 0x4f, 0x2b, 0x28, 0x16, 0xf2, 0x1c, 0x8c, 0xf8, 0x6e, 0x81, 0x8a, - 0x09, 0x94, 0x0d, 0xc3, 0x62, 0x56, 0x39, 0xfb, 0x7b, 0xb9, 0x65, 0x3b, 0x4d, 0xb1, 0xad, 0x60, - 0xe5, 0x88, 0x4b, 0x19, 0xd4, 0x8c, 0x10, 0xc8, 0xbb, 0x30, 0xc5, 0x7e, 0x94, 0xdd, 0x56, 0xcb, - 0x6d, 0x23, 0xfb, 0xf1, 0x28, 0x28, 0x1c, 0x92, 0xd4, 0xb1, 0x88, 0xd7, 0x12, 0xc3, 0x65, 0xe7, - 0x09, 0x3e, 0xdb, 0x76, 0xf9, 0xa3, 0xcf, 0x44, 0x74, 0x9e, 0x20, 0xa9, 0xcf, 0xe1, 0xa6, 0x8a, - 0x44, 0xde, 0x86, 0x49, 0xf6, 0xf3, 0x8e, 0xf3, 0x88, 0xf2, 0x0a, 0x27, 0x23, 0x7b, 0x05, 0xa4, - 0xda, 0x65, 0x25, 0xbc, 0x3e, 0x1d, 0x93, 0x7c, 0x09, 0xce, 0x20, 0xa7, 0xba, 0xdb, 0xa1, 0x8d, - 0xd2, 0xce, 0x8e, 0xd3, 0x74, 0xb8, 0x79, 0x19, 0x0f, 0x8e, 0x82, 0x3a, 0x78, 0x5e, 0x31, 0x62, - 0x58, 0x76, 0x84, 0x62, 0xa6, 0x53, 0x92, 0x87, 0x50, 0x28, 0x77, 0xfd, 0xc0, 0x6d, 0x95, 0x82, - 0xc0, 0x73, 0xb6, 0xbb, 0x01, 0xf5, 0xe7, 0xa7, 0xb5, 0x10, 0x22, 0x6c, 0x71, 0x84, 0x85, 0x5c, - 0x1f, 0x54, 0x47, 0x0a, 0xcb, 0x0e, 0x49, 0xcc, 0x04, 0x13, 0xe3, 0x9f, 0x65, 0x60, 0x52, 0x23, - 0x25, 0x6f, 0xc1, 0xc4, 0x6d, 0xcf, 0xa1, 0xed, 0x46, 0xf3, 0x50, 0xb9, 0xa8, 0xe2, 0x2d, 0x66, - 0x47, 0xc0, 0x79, 0xab, 0x35, 0xb4, 0x50, 0xcf, 0x93, 0x4d, 0xb5, 0xfd, 0xbc, 0xce, 0x5d, 0x8b, - 0xc5, 0x04, 0xcd, 0x45, 0x31, 0x8d, 0x70, 0x82, 0x8a, 0xd9, 0xa9, 0xa0, 0x90, 0xf7, 0x60, 0x84, - 0x3f, 0xf0, 0x0a, 0x43, 0xc4, 0xf3, 0x69, 0xcd, 0xe4, 0x6e, 0xec, 0x38, 0x11, 0xd1, 0x8a, 0xc7, - 0x37, 0x05, 0x91, 0xf1, 0x73, 0x19, 0x20, 0x49, 0xd4, 0x13, 0xf4, 0x5e, 0x27, 0x5a, 0x07, 0x7d, - 0x31, 0x5c, 0x8d, 0x39, 0x4d, 0x67, 0xce, 0x6a, 0xe2, 0x05, 0xbc, 0xe3, 0xc5, 0xaa, 0x53, 0x15, - 0x71, 0xbc, 0xd8, 0xf8, 0xe1, 0x2c, 0x40, 0x84, 0x4d, 0x3e, 0xcf, 0x53, 0x6e, 0x7d, 0xa9, 0x6b, - 0x37, 0x9d, 0x1d, 0x47, 0x8f, 0x41, 0x8b, 0x4c, 0xbe, 0x29, 0x4b, 0x4c, 0x1d, 0x91, 0x7c, 0x00, - 0xd3, 0xb5, 0x0d, 0x9d, 0x56, 0xb1, 0x73, 0xf7, 0x3b, 0x56, 0x8c, 0x3c, 0x8e, 0x8d, 0x06, 0xc7, - 0xea, 0x68, 0x70, 0x83, 0x63, 0x3e, 0x10, 0xa2, 0x84, 0x6d, 0x2c, 0xb5, 0x0d, 0x61, 0xca, 0xdf, - 0xa8, 0x56, 0xc4, 0x2e, 0x85, 0x5f, 0xe7, 0x77, 0xac, 0x8e, 0xb0, 0xf1, 0x67, 0xfb, 0x84, 0x86, - 0x17, 0x75, 0xe4, 0x70, 0x0f, 0x57, 0xf5, 0x9f, 0x47, 0xb5, 0x5f, 0xcb, 0x0d, 0xa8, 0xd0, 0x76, - 0x3c, 0xb3, 0xf7, 0x9e, 0xc8, 0x3a, 0x60, 0x58, 0xf3, 0xc0, 0xd5, 0x5a, 0x27, 0x2c, 0x60, 0x6e, - 0x46, 0x97, 0x14, 0x6e, 0x27, 0x90, 0x62, 0x34, 0xf3, 0xf7, 0x33, 0x70, 0x26, 0x95, 0x96, 0x5c, - 0x03, 0x88, 0x74, 0x4a, 0xa2, 0x97, 0x70, 0xc7, 0x8c, 0x22, 0xf9, 0x98, 0x0a, 0x06, 0xf9, 0x6a, - 0x5c, 0x1b, 0x74, 0xf2, 0x41, 0xb8, 0x20, 0x03, 0xe8, 0xe9, 0xda, 0xa0, 0x14, 0x1d, 0x90, 0xf1, - 0x0f, 0x73, 0x30, 0xa3, 0x04, 0x0a, 0xe2, 0xdf, 0x7a, 0x82, 0x01, 0xf8, 0x3e, 0x4c, 0xb0, 0xd6, - 0x38, 0x75, 0xe1, 0x06, 0xc8, 0x2d, 0x59, 0x5e, 0x4b, 0xf8, 0x50, 0x0a, 0x6e, 0xd7, 0x54, 0x64, - 0x1e, 0xd6, 0x12, 0xb7, 0x4e, 0x7c, 0x90, 0xa8, 0x27, 0xdd, 0x01, 0x35, 0xe6, 0xc4, 0x87, 0xc9, - 0xca, 0x61, 0xdb, 0x6e, 0x85, 0xb5, 0x71, 0x8b, 0x96, 0xd7, 0x7b, 0xd6, 0xa6, 0x61, 0xf3, 0xea, - 0x22, 0x6f, 0x23, 0x5e, 0x96, 0xe2, 0xe8, 0xae, 0x51, 0x2d, 0x7c, 0x00, 0x33, 0x89, 0x8f, 0x3e, - 0x55, 0x84, 0xcd, 0x87, 0x40, 0x92, 0xdf, 0x91, 0xc2, 0xe1, 0x75, 0x3d, 0x7e, 0xeb, 0x99, 0xf0, - 0xf1, 0xba, 0xd5, 0xb2, 0xdb, 0x0d, 0x6e, 0x1f, 0xb3, 0xa8, 0xc6, 0xdf, 0xfc, 0xf9, 0xac, 0xea, - 0xc7, 0xfa, 0xac, 0xaf, 0xba, 0x2f, 0x6a, 0xb7, 0xe1, 0x8b, 0xbd, 0xc6, 0x74, 0x20, 0xad, 0xc3, - 0x77, 0x72, 0x70, 0xae, 0x07, 0x25, 0x39, 0x8c, 0x4f, 0x22, 0xae, 0x85, 0xb8, 0xd1, 0xbf, 0xc2, - 0xa7, 0x31, 0x95, 0xc8, 0xe7, 0x79, 0x24, 0x8b, 0x3a, 0x26, 0xbe, 0x17, 0xf7, 0x6f, 0x54, 0xe3, - 0xef, 0x87, 0xd0, 0x78, 0x08, 0x0b, 0x0e, 0x25, 0x1f, 0xc0, 0x30, 0x3a, 0x31, 0xc7, 0x42, 0x15, - 0x32, 0x0c, 0x84, 0x2b, 0xc1, 0x36, 0xd9, 0x4f, 0x2d, 0xd8, 0x26, 0x03, 0x90, 0xcf, 0x41, 0xae, - 0xf4, 0xb0, 0x26, 0xc6, 0x65, 0x4a, 0x25, 0x7f, 0x58, 0x8b, 0x12, 0x85, 0xd8, 0x5a, 0x46, 0x0f, - 0x46, 0xc1, 0x08, 0xef, 0x94, 0x37, 0xc4, 0xa8, 0xa8, 0x84, 0x77, 0xca, 0x1b, 0x11, 0xe1, 0x6e, - 0x5d, 0x0b, 0xfc, 0x74, 0xa7, 0xbc, 0xf1, 0xc9, 0x4d, 0xfb, 0x7f, 0x27, 0xcb, 0xc3, 0x6f, 0xf0, - 0x86, 0x7d, 0x00, 0x13, 0x5a, 0x7c, 0xed, 0x4c, 0x24, 0x8f, 0x85, 0xb1, 0xd0, 0x63, 0x26, 0x40, - 0x1a, 0x81, 0x4c, 0xb9, 0xc3, 0x7e, 0xa3, 0xc4, 0xab, 0x1a, 0xdb, 0x84, 0x1c, 0x50, 0x26, 0x8e, - 0xa7, 0xdc, 0x09, 0x49, 0xc8, 0x4d, 0xc8, 0x6f, 0xd2, 0xb6, 0xdd, 0x0e, 0x42, 0x85, 0x28, 0x5a, - 0x0b, 0x07, 0x08, 0xd3, 0xa5, 0x86, 0x10, 0x11, 0x2d, 0x5b, 0xbb, 0xdb, 0x7e, 0xdd, 0x73, 0x30, - 0x4c, 0x4f, 0x78, 0x16, 0x73, 0xcb, 0x56, 0xa5, 0x44, 0x67, 0x10, 0x23, 0x32, 0x7e, 0x3e, 0x03, - 0xa3, 0x62, 0x20, 0x79, 0xaa, 0xb4, 0xdd, 0xe8, 0x2c, 0x11, 0xde, 0x00, 0xbb, 0x4e, 0xdc, 0x1b, - 0x60, 0x97, 0xc7, 0xc2, 0x19, 0x13, 0x9e, 0x72, 0xe1, 0xd3, 0x20, 0xce, 0x46, 0xe9, 0xc2, 0xa8, - 0x67, 0xc2, 0x0a, 0x51, 0x07, 0xf5, 0xb0, 0x32, 0xfe, 0xae, 0xf8, 0xb2, 0x3b, 0xe5, 0x0d, 0xb2, - 0x08, 0xf9, 0x55, 0x97, 0x87, 0x75, 0x52, 0xf3, 0xde, 0x36, 0x05, 0x4c, 0xed, 0x20, 0x89, 0xc7, - 0xbe, 0x6f, 0xc3, 0x73, 0xc5, 0x5d, 0x46, 0xf9, 0xbe, 0x0e, 0x07, 0xc6, 0xbe, 0x2f, 0x44, 0x1d, - 0xf8, 0xfb, 0x68, 0xca, 0x26, 0xf1, 0xe0, 0x26, 0xe6, 0x22, 0xb9, 0xab, 0x7a, 0xae, 0x89, 0x22, - 0xb9, 0x53, 0x2c, 0xf4, 0xda, 0x29, 0x1e, 0xdc, 0x34, 0x53, 0xa8, 0xf0, 0x5d, 0x2d, 0x02, 0xd7, - 0xa8, 0xf7, 0xe8, 0x19, 0xde, 0xa5, 0xd3, 0xdf, 0xd5, 0xe2, 0xcd, 0x1b, 0x68, 0x93, 0xfe, 0x83, - 0x2c, 0x9c, 0x4d, 0x27, 0x54, 0xdb, 0x92, 0xe9, 0xd3, 0x96, 0x2b, 0x90, 0x5f, 0x71, 0xfd, 0x40, - 0xb1, 0xfa, 0x43, 0xf5, 0xff, 0x9e, 0x80, 0x99, 0x61, 0x29, 0xbb, 0x73, 0xb3, 0xbf, 0xc3, 0xe5, - 0x89, 0xfc, 0x30, 0xe8, 0x04, 0xbb, 0x73, 0xf3, 0x22, 0x72, 0x07, 0xf2, 0xa6, 0xf0, 0x9c, 0x8a, - 0x75, 0x8d, 0x04, 0x87, 0xd2, 0x14, 0xf1, 0x04, 0x44, 0x0b, 0x73, 0x2e, 0x60, 0xa4, 0x04, 0xa3, - 0x62, 0xf4, 0x63, 0x4f, 0xc7, 0x29, 0x53, 0x46, 0xcf, 0x3c, 0x20, 0xe9, 0xd8, 0x8e, 0x82, 0x8f, - 0x80, 0xd5, 0x8a, 0x74, 0x82, 0xc2, 0x1d, 0x85, 0x3f, 0x12, 0xea, 0x06, 0x96, 0x21, 0xa2, 0xf1, - 0x23, 0x59, 0x00, 0xa9, 0xb5, 0x79, 0x66, 0x67, 0xd8, 0xe7, 0xb4, 0x19, 0xa6, 0xd8, 0x1b, 0x0d, - 0x9e, 0xda, 0xf7, 0x3e, 0x9a, 0xf3, 0x0c, 0x9e, 0xd8, 0xb7, 0x08, 0xc3, 0x9b, 0x91, 0x42, 0x4b, - 0xf8, 0x98, 0xa0, 0x3a, 0x9a, 0xc3, 0x8d, 0x6d, 0x98, 0xbb, 0x43, 0x83, 0x48, 0xbd, 0x25, 0x9f, - 0x1e, 0xfb, 0xb3, 0x7d, 0x03, 0xc6, 0x04, 0x7e, 0xb8, 0x7f, 0x71, 0x5d, 0x8c, 0x88, 0xe3, 0x82, - 0xba, 0x18, 0x89, 0xc0, 0x76, 0xa3, 0x0a, 0x6d, 0xd2, 0x80, 0x7e, 0xb2, 0xd5, 0xd4, 0x80, 0xf0, - 0xa6, 0x60, 0xcb, 0x06, 0xab, 0xe1, 0xc4, 0xfe, 0x79, 0x00, 0x67, 0xc2, 0x6f, 0x7f, 0x9a, 0x7c, - 0xaf, 0xb3, 0x2b, 0xa5, 0x08, 0xda, 0x1f, 0x71, 0xec, 0x63, 0x7b, 0xf2, 0x18, 0x16, 0x24, 0xc1, - 0x43, 0x27, 0x34, 0x9c, 0x1c, 0x88, 0x96, 0xbc, 0x0b, 0xe3, 0x0a, 0x8d, 0x08, 0x3a, 0x8f, 0x6a, - 0xea, 0x03, 0x27, 0xd8, 0xb3, 0x7c, 0x0e, 0x57, 0xd5, 0xd4, 0x0a, 0xba, 0xf1, 0x15, 0x78, 0x3e, - 0xf4, 0x03, 0x4a, 0xa9, 0x3a, 0xc6, 0x3c, 0x73, 0x3a, 0xe6, 0xeb, 0x51, 0xb3, 0xaa, 0xed, 0xd0, - 0xd5, 0x59, 0xf2, 0x26, 0x6a, 0xb3, 0x44, 0x63, 0x5e, 0x48, 0x38, 0x4f, 0x2b, 0x3e, 0xd2, 0xc6, - 0x3b, 0xca, 0xc7, 0xa6, 0x30, 0xd4, 0x88, 0x33, 0x71, 0xe2, 0x1f, 0xc9, 0xc2, 0xf4, 0xfd, 0x6a, - 0xa5, 0x1c, 0x5a, 0x1f, 0x7d, 0xca, 0x12, 0x0f, 0x6b, 0x6d, 0xeb, 0xbd, 0xdf, 0x18, 0x5b, 0x30, - 0x1b, 0xeb, 0x06, 0x14, 0x1d, 0xde, 0xe7, 0x1e, 0x24, 0x21, 0x58, 0x8a, 0x0d, 0x67, 0xd3, 0xd8, - 0x3f, 0xb8, 0x69, 0xc6, 0xb0, 0x8d, 0xff, 0x02, 0x62, 0x7c, 0xc5, 0x16, 0xf6, 0x06, 0x8c, 0x55, - 0x7d, 0xbf, 0x4b, 0xbd, 0x2d, 0x73, 0x55, 0x55, 0x15, 0x38, 0x08, 0xb4, 0xba, 0x5e, 0xd3, 0x8c, - 0x10, 0xc8, 0x55, 0xc8, 0x8b, 0x80, 0xdf, 0x72, 0x4f, 0x40, 0xad, 0x6d, 0x18, 0x2f, 0xdc, 0x0c, - 0x8b, 0xc9, 0x5b, 0x30, 0xc1, 0xff, 0xe6, 0xb3, 0x4d, 0x74, 0x38, 0x2a, 0x07, 0x05, 0x3a, 0x9f, - 0x9d, 0xa6, 0x86, 0x46, 0x5e, 0x83, 0x5c, 0xa9, 0x6c, 0x0a, 0x75, 0x90, 0x90, 0x1b, 0x3d, 0x8b, - 0xeb, 0xec, 0xb4, 0x4b, 0x44, 0xd9, 0x64, 0xd2, 0x9f, 0x8c, 0x1e, 0x21, 0x34, 0xd9, 0x38, 0x03, - 0xa4, 0xb6, 0x29, 0x76, 0x98, 0x21, 0x8c, 0x5c, 0x87, 0xd1, 0x0a, 0x37, 0x99, 0x13, 0x7a, 0x6c, - 0x9e, 0x55, 0x8f, 0x83, 0xb4, 0x68, 0x09, 0x1c, 0x44, 0xae, 0xca, 0x6c, 0x63, 0xf9, 0xc8, 0x11, - 0xa5, 0x47, 0x4a, 0xb1, 0x37, 0x60, 0x44, 0x84, 0xc5, 0x1e, 0x53, 0xf2, 0x90, 0xc4, 0xc3, 0x61, - 0x0b, 0x9c, 0xa4, 0x47, 0x2a, 0x3c, 0x4d, 0x8f, 0xd4, 0x6d, 0x38, 0x77, 0x07, 0xb5, 0x37, 0x7a, - 0x70, 0xa7, 0x2d, 0xb3, 0x2a, 0xf4, 0xe1, 0xf8, 0x0c, 0xc4, 0x15, 0x3c, 0xf1, 0xf8, 0x50, 0x56, - 0xd7, 0x53, 0x93, 0xc4, 0xf6, 0x62, 0x44, 0xbe, 0x0c, 0x73, 0x69, 0x45, 0x42, 0x6b, 0x8e, 0x61, - 0x8c, 0xd2, 0x2b, 0x50, 0xc3, 0x18, 0xa5, 0x71, 0x20, 0xab, 0x50, 0xe0, 0xf0, 0x52, 0xa3, 0xe5, - 0xb4, 0xb9, 0xe6, 0x9f, 0x6b, 0xd5, 0xd1, 0x33, 0x44, 0x70, 0xb5, 0x59, 0x21, 0x7f, 0x01, 0xd0, - 0x7c, 0x89, 0x62, 0x94, 0xe4, 0xa7, 0x33, 0xec, 0x36, 0xc7, 0x83, 0x48, 0x6f, 0x99, 0xab, 0xbe, - 0x08, 0x81, 0x77, 0x36, 0x72, 0x13, 0xaa, 0x05, 0x9e, 0xd3, 0xde, 0x15, 0x7e, 0x42, 0x9b, 0xc2, - 0x4f, 0xe8, 0xdd, 0x8f, 0xe5, 0x27, 0xc4, 0x59, 0xf9, 0xc7, 0x47, 0xc5, 0x09, 0x4f, 0xd4, 0x89, - 0xab, 0x48, 0xfb, 0x02, 0xd6, 0x75, 0xe8, 0x2c, 0xbb, 0xd5, 0xe6, 0x21, 0x6c, 0x69, 0x83, 0x37, - 0x72, 0x1a, 0x77, 0x70, 0xec, 0x3a, 0xcc, 0x6f, 0x61, 0x75, 0x43, 0x84, 0x44, 0x43, 0x53, 0x39, - 0xb0, 0x8b, 0xa7, 0xf4, 0x45, 0xe1, 0xee, 0xb5, 0x85, 0xe8, 0xe2, 0x29, 0x1d, 0x57, 0x2c, 0x9c, - 0x46, 0xea, 0xe4, 0xd1, 0x48, 0xc8, 0x75, 0x18, 0x59, 0xb3, 0x1f, 0x97, 0x76, 0xa9, 0xc8, 0x22, - 0x39, 0x29, 0xb7, 0x3f, 0x04, 0x2e, 0xe5, 0xff, 0x90, 0xfb, 0x3a, 0x3c, 0x67, 0x0a, 0x34, 0xf2, - 0xfd, 0x19, 0x38, 0xcb, 0x97, 0xb1, 0x6c, 0x65, 0x8d, 0x06, 0x01, 0xeb, 0x07, 0x11, 0x0b, 0xef, - 0x52, 0x64, 0xb0, 0x9d, 0x8e, 0x87, 0xae, 0xf4, 0x86, 0xd8, 0x19, 0xc2, 0x8e, 0xf3, 0x45, 0xa9, - 0x16, 0x54, 0x38, 0x95, 0x9e, 0x6c, 0xc2, 0xf8, 0xda, 0xed, 0x52, 0x58, 0x2d, 0x8f, 0x34, 0x5e, - 0x4c, 0xdb, 0x1d, 0x15, 0xb4, 0x34, 0x4f, 0x03, 0x95, 0x8d, 0xf0, 0x0e, 0xf8, 0x9c, 0xec, 0x0f, - 0xf2, 0xa6, 0xea, 0x5b, 0x9a, 0x43, 0xe9, 0x79, 0xb4, 0x65, 0x3f, 0xb6, 0xec, 0x5d, 0xaa, 0xbd, - 0x92, 0x0b, 0xed, 0xf5, 0xcf, 0x66, 0xe0, 0x7c, 0xcf, 0x26, 0x93, 0x5b, 0x70, 0xce, 0xe6, 0x1e, - 0xd3, 0xd6, 0x5e, 0x10, 0x74, 0x7c, 0x4b, 0x5e, 0x31, 0x84, 0x37, 0xaa, 0x79, 0x46, 0x14, 0xaf, - 0xb0, 0x52, 0x79, 0xeb, 0xf0, 0xc9, 0x07, 0xf0, 0x82, 0xd3, 0xf6, 0x69, 0xbd, 0xeb, 0x51, 0x4b, - 0x32, 0xa8, 0x3b, 0x0d, 0xcf, 0xf2, 0xec, 0xf6, 0xae, 0x74, 0xad, 0x35, 0xcf, 0x4b, 0x1c, 0xe1, - 0x95, 0x5d, 0x76, 0x1a, 0x9e, 0x89, 0x08, 0xc6, 0x3f, 0xcb, 0xc0, 0x7c, 0xaf, 0x2e, 0x21, 0xf3, - 0x30, 0x4a, 0x95, 0x9c, 0x23, 0x79, 0x53, 0xfe, 0x24, 0xcf, 0x43, 0xb4, 0xd3, 0x8b, 0xd3, 0x3f, - 0x5f, 0x17, 0xf9, 0x1f, 0xd0, 0xb4, 0x5d, 0xdd, 0xd7, 0x85, 0x81, 0xf2, 0x44, 0x5d, 0xdd, 0xdd, - 0x2f, 0x00, 0x44, 0xdb, 0x39, 0x57, 0x4c, 0x98, 0x63, 0x76, 0xdd, 0xe3, 0x2b, 0x8f, 0x9c, 0x85, - 0x11, 0xbe, 0x5d, 0x0a, 0xff, 0x07, 0xf1, 0x8b, 0x9d, 0xdb, 0xa2, 0x93, 0x71, 0x9f, 0xcf, 0x2d, - 0x4d, 0x68, 0x9d, 0x3d, 0xd2, 0xc2, 0xc1, 0x31, 0x7e, 0x66, 0x92, 0x8b, 0x10, 0xa5, 0x6e, 0xb0, - 0x27, 0x85, 0x8e, 0xc5, 0x34, 0x07, 0x30, 0x6e, 0x4b, 0xa9, 0xd8, 0x65, 0xeb, 0x6e, 0x5f, 0xf2, - 0xed, 0x27, 0x9b, 0xfa, 0xf6, 0xf3, 0x06, 0x8c, 0x95, 0xf7, 0x68, 0x7d, 0x3f, 0x74, 0xc2, 0xc9, - 0x0b, 0xe5, 0x3a, 0x03, 0xf2, 0xf0, 0xde, 0x11, 0x02, 0xb9, 0x0e, 0x80, 0x7e, 0xa7, 0x5c, 0x22, - 0x55, 0x52, 0x74, 0xa0, 0x9b, 0xaa, 0x30, 0x4f, 0x51, 0x50, 0x90, 0x7d, 0xcd, 0xbc, 0xad, 0xda, - 0xb3, 0x70, 0xf6, 0xbe, 0xb7, 0x23, 0xd0, 0x23, 0x04, 0xd6, 0x3c, 0x65, 0x5f, 0x11, 0xa7, 0x60, - 0x21, 0xb1, 0xf9, 0xa8, 0x48, 0xe4, 0x1a, 0x8c, 0x6d, 0x48, 0x47, 0x02, 0x3c, 0x04, 0x27, 0x90, - 0x02, 0x22, 0xa7, 0x83, 0xf9, 0x8c, 0x19, 0xa1, 0x90, 0xcf, 0xc1, 0x68, 0x99, 0x7a, 0xc1, 0xe6, - 0xe6, 0x2a, 0x1a, 0x9d, 0xf0, 0x4c, 0x16, 0x79, 0xcc, 0x3a, 0x10, 0x04, 0xcd, 0xef, 0x1e, 0x15, - 0x27, 0x03, 0xa7, 0x45, 0xc3, 0x08, 0xdd, 0xa6, 0xc4, 0x26, 0x4b, 0x50, 0xe0, 0xcf, 0xe2, 0xd1, - 0xdd, 0x03, 0x4f, 0xc6, 0x3c, 0x3f, 0xa7, 0xc5, 0x1b, 0xfa, 0x01, 0xdd, 0x0e, 0x73, 0x2e, 0x24, - 0xf0, 0xc9, 0xb2, 0x4c, 0x55, 0xa2, 0x36, 0x13, 0x22, 0x65, 0x58, 0x7c, 0xc7, 0x60, 0xad, 0x4d, - 0x52, 0x90, 0x12, 0x4c, 0x96, 0xdd, 0x56, 0xc7, 0x0e, 0x1c, 0xcc, 0xe9, 0x78, 0x28, 0x0e, 0x41, - 0x54, 0xe8, 0xd5, 0xd5, 0x02, 0xed, 0x44, 0x55, 0x0b, 0xc8, 0x6d, 0x98, 0x32, 0xdd, 0x2e, 0x1b, - 0x26, 0x79, 0x0b, 0xe7, 0xe7, 0x1c, 0x9a, 0x86, 0x78, 0xac, 0x84, 0x1d, 0xcb, 0xe2, 0xca, 0xad, - 0x45, 0x33, 0xd5, 0xa8, 0xc8, 0x7a, 0xca, 0x73, 0x88, 0x7a, 0xb8, 0xa9, 0x99, 0x17, 0x12, 0xcc, - 0x52, 0x5e, 0x52, 0x6e, 0xc2, 0x78, 0xad, 0x76, 0x7f, 0x93, 0xfa, 0xc1, 0xed, 0xa6, 0x7b, 0x80, - 0x67, 0x5b, 0x5e, 0x24, 0x0a, 0xf3, 0x5d, 0x2b, 0xa0, 0x7e, 0x60, 0xed, 0x34, 0xdd, 0x03, 0x53, - 0xc5, 0x22, 0x5f, 0x67, 0xfd, 0xa1, 0x48, 0x82, 0x22, 0x6e, 0x6b, 0x3f, 0x61, 0x15, 0x4f, 0x90, - 0x68, 0xd1, 0x30, 0x91, 0x55, 0xef, 0x2c, 0x05, 0x1d, 0x7d, 0xca, 0x3c, 0xf7, 0xf1, 0x61, 0xa9, - 0xd1, 0xf0, 0xa8, 0xef, 0x8b, 0x43, 0x88, 0xfb, 0x94, 0xa1, 0xb2, 0xc1, 0xe6, 0x05, 0x9a, 0x4f, - 0x99, 0x42, 0x40, 0x7e, 0x2c, 0x03, 0x67, 0x54, 0x6f, 0x13, 0x5c, 0x2e, 0x68, 0xe6, 0xc2, 0x8f, - 0xa4, 0x37, 0xaf, 0xc9, 0x43, 0xf8, 0x9a, 0x82, 0x76, 0xed, 0xd1, 0x8d, 0x6b, 0xa5, 0xe8, 0x67, - 0x4d, 0x12, 0x61, 0x0c, 0xba, 0x62, 0x2a, 0x3f, 0x2d, 0xcf, 0xce, 0x9c, 0x9d, 0x42, 0x4c, 0xca, - 0x4c, 0x52, 0x63, 0x33, 0x0a, 0x0d, 0xa7, 0xaa, 0x1b, 0x78, 0xa6, 0x09, 0x8d, 0xaa, 0x98, 0x7f, - 0xdc, 0xc4, 0xca, 0xe9, 0xe8, 0x02, 0x99, 0x42, 0x43, 0xaa, 0x30, 0xcd, 0x01, 0x6c, 0x5b, 0xe0, - 0x29, 0x8b, 0x66, 0xa3, 0xa4, 0x09, 0x82, 0x0d, 0xbe, 0xf5, 0x63, 0xda, 0x22, 0x35, 0xd0, 0x68, - 0x8c, 0x8e, 0x7c, 0x00, 0x53, 0x18, 0x0f, 0x3e, 0x5a, 0xaf, 0x73, 0xb8, 0x8a, 0x31, 0x5e, 0xaa, - 0x28, 0x89, 0x79, 0xde, 0x4d, 0xf8, 0xfe, 0x5e, 0xb4, 0xa2, 0x3f, 0x80, 0x29, 0xb4, 0xd5, 0x89, - 0x18, 0x9c, 0x89, 0x18, 0x88, 0x92, 0x38, 0x83, 0xa0, 0xe9, 0x47, 0x0c, 0xfe, 0x66, 0x06, 0xce, - 0xb3, 0x8a, 0xd2, 0x47, 0xe8, 0xec, 0xc7, 0x19, 0x21, 0x8c, 0x20, 0xd9, 0x93, 0xa7, 0x2a, 0x8e, - 0xfa, 0xfe, 0x5e, 0x1a, 0x07, 0xfc, 0x28, 0xf6, 0xf1, 0xe9, 0x1f, 0x75, 0xee, 0x63, 0x7f, 0x54, - 0x4f, 0x9e, 0xea, 0x47, 0x05, 0x4d, 0x3f, 0x8d, 0x03, 0x5e, 0x6b, 0x6b, 0xa5, 0xb5, 0xd5, 0xe8, - 0x6e, 0xf6, 0xe9, 0x72, 0x5b, 0xd1, 0xda, 0xd6, 0xc7, 0x6d, 0x65, 0x8b, 0xbb, 0x45, 0x2b, 0xdd, - 0x20, 0xaf, 0xb5, 0x1a, 0x38, 0x7e, 0xad, 0x8d, 0xd1, 0x98, 0x31, 0x6c, 0xe3, 0x97, 0x21, 0xc6, - 0x57, 0x98, 0xaa, 0x1a, 0x30, 0xc2, 0x6f, 0xad, 0xa2, 0x93, 0xd1, 0x66, 0x81, 0xdf, 0x69, 0x4d, - 0x51, 0x42, 0xce, 0x43, 0xae, 0x56, 0xbb, 0x2f, 0x3a, 0x19, 0x0d, 0x56, 0x7d, 0xdf, 0x35, 0x19, - 0x8c, 0x8d, 0x10, 0x5a, 0xa1, 0x2a, 0xf1, 0xf5, 0xd9, 0x79, 0x67, 0x22, 0x94, 0xf5, 0xb7, 0xbc, - 0x43, 0x0e, 0x45, 0xfd, 0x2d, 0xee, 0x90, 0xd1, 0xcd, 0xb1, 0x0c, 0xf3, 0x25, 0xdf, 0xa7, 0x1e, - 0x9b, 0x10, 0xc2, 0xb8, 0xd1, 0x13, 0xf7, 0x1c, 0x71, 0xb0, 0x63, 0xa5, 0x76, 0xdd, 0x37, 0x7b, - 0x22, 0x92, 0x2b, 0x90, 0x2f, 0x75, 0x1b, 0x0e, 0x6d, 0xd7, 0xb5, 0x38, 0x6b, 0xb6, 0x80, 0x99, - 0x61, 0x29, 0xf9, 0x12, 0x9c, 0x89, 0x85, 0x54, 0x14, 0x3d, 0x30, 0x1a, 0xed, 0xbd, 0xf2, 0x1e, - 0x16, 0x19, 0x64, 0xf0, 0x2e, 0x49, 0xa7, 0x24, 0x25, 0x28, 0x2c, 0xa3, 0x9b, 0x56, 0x85, 0xf2, - 0xb7, 0x21, 0xd7, 0xe3, 0xfe, 0x79, 0xfc, 0xd6, 0xcc, 0x5d, 0xb8, 0xac, 0x46, 0x58, 0x68, 0x26, - 0xd0, 0xc9, 0x3d, 0x98, 0x8d, 0xc3, 0xd8, 0x09, 0xce, 0x2f, 0xc8, 0xb8, 0xdf, 0x24, 0xb8, 0xe0, - 0x19, 0x9e, 0x46, 0x45, 0xb6, 0x61, 0x26, 0x32, 0x48, 0xd2, 0xaf, 0xcd, 0xd2, 0xce, 0x39, 0x2c, - 0x97, 0x57, 0xe7, 0xe7, 0xc5, 0x64, 0x9c, 0x8d, 0x8c, 0x9b, 0xc2, 0xeb, 0xb3, 0x99, 0x64, 0x47, - 0x1a, 0x30, 0x55, 0x73, 0x76, 0xdb, 0x4e, 0x7b, 0xf7, 0x1e, 0x3d, 0xdc, 0xb0, 0x1d, 0x4f, 0x58, - 0x9c, 0x4a, 0x7b, 0xf2, 0x92, 0x7f, 0xd8, 0x6a, 0xd1, 0xc0, 0xc3, 0x8d, 0x90, 0x95, 0xa3, 0x0f, - 0x3a, 0xbb, 0x0e, 0x2d, 0xf8, 0x9c, 0x0e, 0xdd, 0x36, 0x3b, 0xb6, 0xa3, 0x09, 0x01, 0x3a, 0x4f, - 0x4d, 0x75, 0x31, 0x31, 0xa0, 0xea, 0xa2, 0x09, 0x33, 0xcb, 0xed, 0xba, 0x77, 0x88, 0x4f, 0x74, - 0xf2, 0xe3, 0x26, 0x4f, 0xf8, 0xb8, 0x97, 0xc5, 0xc7, 0xbd, 0x60, 0xcb, 0x19, 0x96, 0xf6, 0x79, - 0x49, 0xc6, 0xa4, 0x06, 0x33, 0x78, 0x71, 0xa8, 0x56, 0x36, 0xaa, 0x6d, 0x27, 0x70, 0xec, 0x80, - 0x36, 0x84, 0x70, 0x11, 0x66, 0x25, 0xe1, 0x57, 0x54, 0xa7, 0xd1, 0xb1, 0x1c, 0x89, 0xa2, 0x32, - 0x4d, 0xd0, 0xf7, 0xbb, 0x27, 0x4e, 0xff, 0x05, 0xdd, 0x13, 0xab, 0x30, 0x1d, 0x8f, 0xcd, 0x50, - 0x88, 0xce, 0x61, 0x1f, 0x8b, 0xd8, 0x71, 0xee, 0x76, 0x51, 0x98, 0xd4, 0x12, 0x81, 0xea, 0x74, - 0xf1, 0x2b, 0xe7, 0x8c, 0x76, 0xe5, 0xd4, 0x76, 0xa5, 0x53, 0x5c, 0x39, 0xc9, 0x06, 0xc0, 0x6d, - 0xd7, 0xab, 0xd3, 0x12, 0xfa, 0x47, 0x13, 0x2d, 0x77, 0x13, 0x63, 0x1a, 0x15, 0xf2, 0xf5, 0xb3, - 0xc3, 0x7e, 0x5b, 0x71, 0x37, 0x77, 0x85, 0x87, 0xf1, 0xe3, 0x59, 0x98, 0xef, 0xf5, 0x39, 0x7d, - 0xae, 0x7b, 0xaf, 0x43, 0x72, 0x85, 0x8b, 0x6b, 0x5f, 0x81, 0xc6, 0xd7, 0xf9, 0x22, 0xa4, 0x2f, - 0x64, 0x71, 0x0d, 0x9c, 0x8d, 0x13, 0x6c, 0x79, 0x4d, 0x72, 0x0b, 0xc6, 0x95, 0x8f, 0xc7, 0xbd, - 0xb4, 0x57, 0x53, 0x4d, 0xd8, 0x09, 0xff, 0x66, 0xd7, 0x44, 0xbe, 0x6f, 0xc9, 0x6b, 0x22, 0xff, - 0x45, 0x0a, 0xdc, 0x45, 0x7c, 0x84, 0x5b, 0x01, 0xf8, 0xbe, 0x4b, 0x08, 0xe0, 0xbe, 0xcd, 0xb7, - 0x40, 0x13, 0xff, 0x36, 0x7e, 0x63, 0x82, 0x9f, 0xc8, 0xea, 0x2d, 0xb1, 0x97, 0x7d, 0x70, 0xec, - 0xf6, 0x98, 0x3d, 0xcd, 0xed, 0x31, 0x77, 0xf2, 0xed, 0x71, 0xe8, 0xa4, 0xdb, 0x63, 0xec, 0x7a, - 0x37, 0x7c, 0xea, 0xeb, 0xdd, 0xc8, 0xa9, 0xae, 0x77, 0xa3, 0xa7, 0xba, 0xde, 0x69, 0x37, 0xd5, - 0xfc, 0x49, 0x37, 0xd5, 0xbf, 0xba, 0x0c, 0x3e, 0xab, 0x97, 0xc1, 0x34, 0x11, 0xef, 0x54, 0x97, - 0xc1, 0x1f, 0xed, 0x79, 0x97, 0x2b, 0x7c, 0x1c, 0xa1, 0xfc, 0xa5, 0x01, 0xee, 0x72, 0x83, 0xde, - 0xe4, 0x66, 0x9e, 0xce, 0x4d, 0x8e, 0x3c, 0xb5, 0x9b, 0xdc, 0xec, 0x93, 0xde, 0xe4, 0xe6, 0x9e, - 0xe6, 0x4d, 0xee, 0xcc, 0x5f, 0xc6, 0x9b, 0xdc, 0xd9, 0x7f, 0x33, 0x37, 0xb9, 0xbf, 0x06, 0x85, - 0xb8, 0x70, 0x79, 0x72, 0x18, 0xe3, 0xa7, 0x16, 0x43, 0x92, 0x89, 0xbe, 0x71, 0xe1, 0x8e, 0x5c, - 0x07, 0xd8, 0xf0, 0x9c, 0x47, 0x76, 0x40, 0xef, 0x49, 0xeb, 0x37, 0x11, 0x82, 0x9b, 0x43, 0xd9, - 0xc8, 0x9b, 0x0a, 0x4a, 0x78, 0xaf, 0xc9, 0xa6, 0xdd, 0x6b, 0x8c, 0x1f, 0xcb, 0xc2, 0x0c, 0x0f, - 0xc4, 0xf6, 0xec, 0x3f, 0xc2, 0xbe, 0xaf, 0xdd, 0x56, 0x5f, 0x88, 0xe2, 0xdd, 0xab, 0xad, 0xeb, - 0xf3, 0x0c, 0xfb, 0x35, 0x38, 0x93, 0xe8, 0x0a, 0xbc, 0xb1, 0x56, 0x64, 0x08, 0xbc, 0xc4, 0x9d, - 0x75, 0x3e, 0xbd, 0x92, 0x07, 0x37, 0xcd, 0x04, 0x85, 0xf1, 0x67, 0x43, 0x09, 0xfe, 0xe2, 0x41, - 0x56, 0x7d, 0x62, 0xcd, 0x9c, 0xee, 0x89, 0x35, 0x3b, 0xd8, 0x13, 0x6b, 0x4c, 0xa8, 0xc8, 0x0d, - 0x22, 0x54, 0x7c, 0x09, 0x26, 0x37, 0xa9, 0xdd, 0xf2, 0x37, 0x5d, 0x91, 0x3c, 0x89, 0xfb, 0x5a, - 0xc8, 0x08, 0x77, 0xac, 0x4c, 0x5e, 0xb8, 0x42, 0x9b, 0xd1, 0x80, 0x11, 0xb0, 0x63, 0x90, 0x67, - 0x53, 0x32, 0x75, 0x0e, 0xea, 0x2d, 0x7a, 0xb8, 0xcf, 0x2d, 0xba, 0x06, 0x13, 0x82, 0x2e, 0x8a, - 0xdd, 0x1c, 0x5d, 0xf7, 0x58, 0x11, 0xc2, 0x65, 0xed, 0x61, 0x66, 0xf7, 0xb0, 0x76, 0x7e, 0xd3, - 0xd3, 0x98, 0xb0, 0x2e, 0x58, 0x6e, 0x37, 0x3a, 0xae, 0xd3, 0xc6, 0x2e, 0x18, 0x8d, 0xba, 0x80, - 0x0a, 0x30, 0xef, 0x02, 0x05, 0x89, 0xbc, 0x0b, 0x53, 0xa5, 0x8d, 0xaa, 0x4a, 0x96, 0x8f, 0x5e, - 0x79, 0xed, 0x8e, 0x63, 0x69, 0xa4, 0x31, 0xdc, 0x7e, 0x37, 0x9f, 0xb1, 0xbf, 0x98, 0x9b, 0x8f, - 0xf1, 0x2f, 0x27, 0xe4, 0xf2, 0xfe, 0x64, 0x1f, 0x48, 0xf4, 0x27, 0x8f, 0xdc, 0x29, 0x9f, 0x3c, - 0x86, 0x4e, 0x12, 0x24, 0x35, 0xf9, 0x76, 0xf8, 0x54, 0xf2, 0xed, 0xc8, 0x13, 0x3f, 0x5f, 0x8c, - 0x9e, 0x52, 0x62, 0x8d, 0xad, 0xb5, 0xfc, 0x20, 0x6b, 0x2d, 0x55, 0xca, 0x1d, 0x7b, 0x72, 0x29, - 0x17, 0x4e, 0x2d, 0xe5, 0xd6, 0x22, 0xdf, 0xe5, 0xf1, 0x13, 0x5d, 0x42, 0x2e, 0x08, 0xad, 0xc0, - 0x4c, 0x7a, 0x14, 0xbe, 0xd0, 0x8b, 0xf9, 0x53, 0x25, 0x3a, 0x7f, 0x23, 0x5d, 0x74, 0xee, 0x7f, - 0xde, 0x9c, 0x4a, 0x78, 0xfe, 0xb1, 0xa7, 0x2b, 0x3c, 0x3f, 0xdd, 0x87, 0x90, 0xbf, 0x12, 0x9f, - 0xff, 0x4a, 0x7c, 0x1e, 0x50, 0x7c, 0xf6, 0x70, 0x79, 0x3d, 0xb4, 0xbd, 0x36, 0xaa, 0x9d, 0xae, - 0xc3, 0xa8, 0x0c, 0x43, 0x9a, 0x89, 0x34, 0xca, 0xc9, 0xf8, 0xa3, 0x12, 0x8b, 0x2c, 0x42, 0x5e, - 0x12, 0xab, 0x89, 0x6e, 0x0e, 0x04, 0x4c, 0x8b, 0xf0, 0x28, 0x60, 0xc6, 0xbf, 0x3f, 0x24, 0xb7, - 0x70, 0x36, 0x67, 0x36, 0x6c, 0xcf, 0x6e, 0x61, 0xfa, 0xb7, 0x70, 0x85, 0x29, 0xc2, 0x7b, 0x6c, - 0x51, 0xc6, 0x4c, 0xfb, 0x75, 0x92, 0x8f, 0x15, 0x18, 0x36, 0xca, 0xb0, 0x9b, 0x1b, 0x20, 0xc3, - 0xee, 0xdb, 0x5a, 0x7a, 0xda, 0xa1, 0x28, 0x1f, 0x22, 0xdb, 0xd6, 0xfa, 0x27, 0xa6, 0xbd, 0xa5, - 0xe6, 0x91, 0x1d, 0x8e, 0xa2, 0x7a, 0x21, 0x65, 0x9f, 0x0c, 0xb2, 0xe1, 0x6d, 0x64, 0xe4, 0x34, - 0x21, 0x97, 0x47, 0xff, 0x8d, 0x86, 0x5c, 0x5e, 0x06, 0x10, 0x47, 0x6d, 0x64, 0x9e, 0xf0, 0x0a, - 0xae, 0x7e, 0x61, 0xa6, 0x1c, 0x04, 0xcd, 0x1e, 0x39, 0x39, 0x14, 0x42, 0xe3, 0xf7, 0x09, 0xcc, - 0xd4, 0x6a, 0xf7, 0x2b, 0x8e, 0xbd, 0xdb, 0x76, 0xfd, 0xc0, 0xa9, 0x57, 0xdb, 0x3b, 0x2e, 0x13, - 0xc5, 0xc3, 0xe3, 0x40, 0x89, 0xad, 0x1b, 0x1d, 0x05, 0x61, 0x31, 0xbb, 0xea, 0x2d, 0x7b, 0x9e, - 0xd4, 0x8f, 0xf2, 0xab, 0x1e, 0x65, 0x00, 0x93, 0xc3, 0x99, 0xb4, 0x5b, 0xeb, 0x62, 0x64, 0x0b, - 0x61, 0x33, 0x82, 0xd2, 0xae, 0xcf, 0x41, 0xa6, 0x2c, 0x23, 0x34, 0x39, 0x61, 0xc5, 0xed, 0xe7, - 0x9c, 0x16, 0xb8, 0x39, 0x2a, 0xe6, 0x87, 0x9d, 0x10, 0x46, 0x70, 0xdb, 0xec, 0x20, 0x5c, 0xb5, - 0x88, 0x4b, 0xac, 0x81, 0x43, 0x38, 0xa3, 0xf9, 0x3c, 0x0f, 0xfa, 0x98, 0xf2, 0x9a, 0x90, 0xae, - 0x0d, 0x0c, 0xb1, 0x91, 0xf2, 0xa2, 0xa2, 0xe6, 0x73, 0x4b, 0xad, 0x81, 0x9d, 0x67, 0x17, 0x52, - 0x4b, 0xc2, 0xd5, 0x3d, 0xae, 0x05, 0xcf, 0x56, 0x36, 0x0d, 0x9e, 0xb9, 0xae, 0x57, 0xd5, 0x56, - 0xca, 0x56, 0xd0, 0xbf, 0x26, 0xf2, 0x9b, 0x19, 0x38, 0xa7, 0x61, 0x84, 0xdb, 0x95, 0x1f, 0x86, - 0x03, 0x49, 0x9d, 0xd7, 0x1f, 0x3d, 0x9d, 0x79, 0xfd, 0x92, 0xde, 0x96, 0x68, 0x43, 0x55, 0xdb, - 0xd0, 0xeb, 0x0b, 0xc9, 0x23, 0x98, 0xc1, 0x22, 0xf9, 0xb0, 0xc3, 0xe6, 0xac, 0x78, 0x0f, 0x9a, - 0x8b, 0x3e, 0x9b, 0xfb, 0xf1, 0x63, 0xf6, 0xf1, 0xc5, 0xef, 0x1c, 0x15, 0x27, 0x35, 0x74, 0x19, - 0x8e, 0xda, 0x8a, 0x5e, 0x87, 0x9c, 0xf6, 0x8e, 0xab, 0xa5, 0x96, 0x8f, 0x57, 0x41, 0xfe, 0xab, - 0x0c, 0x7f, 0x4e, 0xe0, 0xcd, 0xb8, 0xed, 0xb9, 0xad, 0xb0, 0x5c, 0x9a, 0x56, 0xf6, 0xe8, 0xb6, - 0xe6, 0xd3, 0xe9, 0xb6, 0x57, 0xf0, 0x93, 0xf9, 0x9e, 0x60, 0xed, 0x78, 0x6e, 0x2b, 0xfa, 0x7c, - 0xb5, 0xe3, 0x7a, 0x7e, 0x24, 0xf9, 0x81, 0x0c, 0x9c, 0xd7, 0xb4, 0x9a, 0x6a, 0x6e, 0x10, 0x11, - 0x2d, 0x61, 0x36, 0x8c, 0xa3, 0x12, 0x15, 0x2d, 0x5d, 0x13, 0xf3, 0xff, 0x32, 0x7e, 0x81, 0x12, - 0xb6, 0x93, 0x21, 0x59, 0x2d, 0x8e, 0xa5, 0x7c, 0x42, 0xef, 0x5a, 0x88, 0x03, 0x33, 0x68, 0x65, - 0xa3, 0x99, 0x00, 0xcf, 0xf5, 0x36, 0x01, 0x0e, 0xb3, 0xfe, 0x60, 0x46, 0x80, 0xde, 0x76, 0xc0, - 0x49, 0xae, 0xe4, 0xaf, 0xc3, 0xf9, 0x04, 0x30, 0x5c, 0x6d, 0x67, 0x7a, 0xae, 0xb6, 0xd7, 0x8f, - 0x8f, 0x8a, 0xaf, 0xa6, 0xd5, 0x96, 0xb6, 0xd2, 0x7a, 0xd7, 0x40, 0x6c, 0x80, 0xa8, 0x50, 0x88, - 0x1f, 0xe9, 0x13, 0xf4, 0x75, 0x31, 0x3f, 0x14, 0x7c, 0xb6, 0x97, 0x2b, 0xdf, 0xa0, 0x1e, 0x79, - 0x11, 0x12, 0xa1, 0x30, 0xa1, 0x64, 0x43, 0x38, 0x14, 0xc6, 0x1e, 0x3d, 0x2a, 0xf9, 0xce, 0x51, - 0x51, 0xc3, 0x66, 0x17, 0x22, 0x35, 0xcd, 0x82, 0x26, 0xed, 0xa9, 0x88, 0xe4, 0xd7, 0x33, 0x30, - 0xc7, 0x00, 0xd1, 0xa4, 0x12, 0x8d, 0x9a, 0xef, 0x37, 0xeb, 0xf7, 0x9e, 0xce, 0xac, 0x7f, 0x11, - 0xbf, 0x51, 0x9d, 0xf5, 0x89, 0x2e, 0x49, 0xfd, 0x38, 0x9c, 0xed, 0x9a, 0x41, 0x97, 0x36, 0xdb, - 0xcf, 0x0f, 0x30, 0xdb, 0xf9, 0x00, 0x9c, 0x3c, 0xdb, 0x7b, 0xd6, 0x42, 0x36, 0x61, 0x42, 0xdc, - 0x85, 0x78, 0x87, 0x5d, 0xd4, 0xc2, 0x38, 0xab, 0x45, 0xfc, 0x82, 0x2a, 0x92, 0x45, 0x24, 0x5a, - 0xa8, 0x71, 0x21, 0x6d, 0x98, 0xe5, 0xbf, 0x75, 0xdd, 0x54, 0xb1, 0xa7, 0x6e, 0xea, 0x8a, 0x68, - 0xd1, 0x25, 0xc1, 0x3f, 0xa6, 0xa2, 0x52, 0xc3, 0x2f, 0xa5, 0x30, 0x26, 0x1d, 0x20, 0x1a, 0x98, - 0x2f, 0xda, 0x4b, 0xfd, 0x35, 0x52, 0xaf, 0x8a, 0x3a, 0x8b, 0xf1, 0x3a, 0xe3, 0x2b, 0x37, 0x85, - 0x37, 0xb1, 0x61, 0x5a, 0x40, 0xdd, 0x7d, 0xca, 0x77, 0xf8, 0x17, 0xb5, 0x00, 0x58, 0xb1, 0x52, - 0x7e, 0x89, 0x92, 0x35, 0x61, 0x80, 0xb2, 0xd8, 0x86, 0x1e, 0xe7, 0x47, 0xee, 0xc3, 0x4c, 0xa9, - 0xd3, 0x69, 0x3a, 0xb4, 0x81, 0xad, 0x34, 0xbb, 0xac, 0x4d, 0x46, 0x94, 0x6f, 0xcd, 0xe6, 0x85, - 0xe2, 0x66, 0xe7, 0x75, 0x63, 0xdb, 0x4d, 0x82, 0xd6, 0xf8, 0xd1, 0x4c, 0xe2, 0xa3, 0xc9, 0x1b, - 0x30, 0x86, 0x3f, 0x94, 0x98, 0x2a, 0xa8, 0xe2, 0xe1, 0x9f, 0x88, 0xca, 0xa3, 0x08, 0x81, 0x09, - 0x4b, 0x6a, 0x5c, 0xc5, 0x1c, 0x17, 0x96, 0x84, 0x5e, 0x21, 0xd2, 0x24, 0x14, 0xa5, 0x6b, 0x46, - 0x2e, 0x12, 0xba, 0xd0, 0x35, 0x43, 0x38, 0x64, 0x18, 0x3f, 0x90, 0xd5, 0xa7, 0x1d, 0xb9, 0xa2, - 0xc8, 0xed, 0x4a, 0x64, 0x47, 0x29, 0xb7, 0x2b, 0xd2, 0xfa, 0xdf, 0xcf, 0xc0, 0xec, 0x7d, 0x25, - 0x51, 0xe7, 0xa6, 0x8b, 0xe3, 0xd2, 0x3f, 0x75, 0xe5, 0xd3, 0x4a, 0xc1, 0xa7, 0x66, 0x08, 0x65, - 0x33, 0x05, 0xa7, 0x8c, 0x99, 0xf6, 0x3d, 0xe8, 0xec, 0x86, 0x1f, 0xa6, 0x64, 0x42, 0xe4, 0xe8, - 0x1c, 0x6e, 0xfc, 0x64, 0x16, 0xc6, 0x95, 0x25, 0x40, 0x3e, 0x0b, 0x13, 0x2a, 0x1f, 0x55, 0xe1, - 0xa7, 0x56, 0x6b, 0x6a, 0x58, 0xa8, 0xf1, 0xa3, 0x76, 0x4b, 0xd3, 0xf8, 0xb1, 0x89, 0x8e, 0xd0, - 0x53, 0x5e, 0x6d, 0x3e, 0x48, 0xb9, 0xda, 0xe0, 0xb4, 0x55, 0x34, 0x36, 0x7d, 0x2f, 0x38, 0xef, - 0x26, 0x2f, 0x38, 0xa8, 0x3c, 0x52, 0xe8, 0x7b, 0x5f, 0x73, 0x8c, 0x9f, 0xc9, 0x40, 0x21, 0xbe, - 0x48, 0x3f, 0x91, 0x5e, 0x39, 0xc5, 0xeb, 0xce, 0x4f, 0x64, 0xc3, 0x54, 0x28, 0xd2, 0x85, 0xf7, - 0x59, 0x35, 0x13, 0x7c, 0x4f, 0x7b, 0x78, 0x79, 0x5e, 0x8f, 0x46, 0xa7, 0x06, 0xbf, 0x48, 0x0f, - 0x41, 0x39, 0xf4, 0xed, 0x5f, 0x2a, 0x3e, 0x67, 0x7c, 0x08, 0x73, 0xf1, 0xee, 0xc0, 0xc7, 0x97, - 0x12, 0x4c, 0xeb, 0xf0, 0x78, 0x22, 0xa5, 0x38, 0x95, 0x19, 0xc7, 0x37, 0xfe, 0x30, 0x1b, 0xe7, - 0x2d, 0x4c, 0x06, 0xd9, 0xa6, 0xa3, 0x1a, 0xc2, 0x88, 0x4d, 0x87, 0x83, 0x4c, 0x59, 0x76, 0x9a, - 0x04, 0x66, 0xa1, 0x23, 0x6a, 0x2e, 0xdd, 0x11, 0x95, 0xdc, 0x8a, 0x59, 0x49, 0x2b, 0x51, 0x93, - 0x0e, 0xe8, 0xb6, 0x15, 0x59, 0x4a, 0xc7, 0x8c, 0xa3, 0xcb, 0x30, 0xa7, 0x85, 0x00, 0x97, 0xf4, - 0xc3, 0x91, 0xae, 0x3d, 0xc0, 0x02, 0x4e, 0x9c, 0x8a, 0x4c, 0x56, 0x60, 0x94, 0x7d, 0xe6, 0x9a, - 0xdd, 0x11, 0x6f, 0x2a, 0x24, 0x74, 0x4b, 0x6f, 0x86, 0x17, 0x3e, 0xc5, 0x33, 0xbd, 0x49, 0xd9, - 0x91, 0xaf, 0x4e, 0x2c, 0x81, 0x68, 0xfc, 0x8b, 0x0c, 0x5b, 0xff, 0xf5, 0xfd, 0x4f, 0x59, 0x16, - 0x34, 0xd6, 0xa4, 0x3e, 0x16, 0xad, 0x7f, 0x9c, 0xe5, 0xb9, 0x70, 0xc4, 0xf4, 0x79, 0x1b, 0x46, - 0x36, 0x6d, 0x6f, 0x57, 0xe4, 0xa0, 0xd6, 0xb9, 0xf0, 0x82, 0x28, 0xa6, 0x53, 0x80, 0xbf, 0x4d, - 0x41, 0xa0, 0xea, 0xc2, 0xb2, 0x03, 0xe9, 0xc2, 0x14, 0xbd, 0x7c, 0xee, 0xa9, 0xe9, 0xe5, 0xbf, - 0x27, 0x4c, 0x7b, 0x53, 0x0a, 0x06, 0x88, 0x30, 0x7d, 0x29, 0x9e, 0x36, 0x2a, 0x11, 0x0b, 0x3c, - 0x62, 0x47, 0x6e, 0xa9, 0x89, 0xa8, 0x14, 0xdf, 0xce, 0x13, 0x52, 0x4e, 0x19, 0x7f, 0x9c, 0xe3, - 0x7d, 0x2c, 0x3a, 0xea, 0xb2, 0xe6, 0xf7, 0x8d, 0xeb, 0x84, 0x6d, 0xf4, 0x6a, 0x08, 0x0e, 0x34, - 0x9b, 0xba, 0x0c, 0x43, 0x6c, 0x6e, 0x8a, 0xde, 0x44, 0x3c, 0x36, 0x7f, 0x55, 0x3c, 0x56, 0xce, - 0xd6, 0x32, 0x9e, 0x49, 0x6a, 0x86, 0x41, 0x3c, 0xb6, 0xd4, 0xb5, 0x8c, 0x18, 0xe4, 0x0a, 0x0c, - 0xad, 0xbb, 0x0d, 0x19, 0xc9, 0x7c, 0x0e, 0xa3, 0x7f, 0x68, 0x29, 0x4c, 0xe7, 0x33, 0x26, 0x62, - 0xb0, 0xb6, 0x86, 0xf9, 0x1f, 0xd4, 0xb6, 0xb6, 0x76, 0xec, 0x64, 0xe6, 0x38, 0x25, 0xe9, 0xcc, - 0x32, 0x4c, 0xe9, 0x79, 0xf6, 0x85, 0xbd, 0x2f, 0x6a, 0xd7, 0x63, 0xe9, 0xfa, 0xd5, 0x67, 0x11, - 0x9d, 0x88, 0x2c, 0xc1, 0xa4, 0x16, 0x41, 0x55, 0x3c, 0x6e, 0xa2, 0x7a, 0x53, 0x8f, 0xbf, 0xaa, - 0xaa, 0x37, 0x35, 0x12, 0x76, 0x9e, 0x8b, 0xef, 0x57, 0x9e, 0x38, 0x13, 0xdf, 0x2e, 0x70, 0xc8, - 0x4d, 0xc8, 0xf3, 0x30, 0x1b, 0xd5, 0x8a, 0xfa, 0x4c, 0xe5, 0x23, 0x2c, 0x16, 0xa6, 0x46, 0x22, - 0x2a, 0x61, 0x15, 0x3e, 0x03, 0x05, 0xb1, 0x25, 0x45, 0xc9, 0xcf, 0x5f, 0x80, 0xa1, 0x72, 0xb5, - 0x62, 0xaa, 0xdb, 0x48, 0xdd, 0x69, 0x78, 0x26, 0x42, 0xd1, 0xab, 0x6e, 0x9d, 0x06, 0x07, 0xae, - 0xb7, 0x6f, 0x52, 0x3f, 0xf0, 0x1c, 0x9e, 0xa0, 0x12, 0x17, 0xe2, 0x67, 0xc9, 0xbb, 0x30, 0x8c, - 0x86, 0xa7, 0xb1, 0x93, 0x21, 0x5e, 0xc7, 0xd2, 0xa4, 0x98, 0xc0, 0xc3, 0x68, 0xc5, 0x6a, 0x72, - 0x22, 0xf2, 0x36, 0x0c, 0x55, 0x68, 0xfb, 0x30, 0x96, 0x3b, 0x2f, 0x41, 0x1c, 0x6e, 0x08, 0x0d, - 0xda, 0x3e, 0x34, 0x91, 0xc4, 0xf8, 0x99, 0x2c, 0x9c, 0x49, 0xf9, 0xac, 0x07, 0x9f, 0x7d, 0x46, - 0x77, 0xc5, 0x25, 0x6d, 0x57, 0x94, 0xef, 0xd3, 0x3d, 0x3b, 0x3e, 0x75, 0x93, 0xfc, 0x85, 0x0c, - 0x9c, 0xd3, 0x27, 0xa8, 0xb0, 0x34, 0x7f, 0x70, 0x93, 0xbc, 0x03, 0x23, 0x2b, 0xd4, 0x6e, 0x50, - 0x99, 0x57, 0xeb, 0x4c, 0x18, 0x10, 0x8f, 0xc7, 0x10, 0xe0, 0x85, 0x9c, 0x6d, 0xe4, 0x71, 0xca, - 0xa1, 0xa4, 0x22, 0x3e, 0x8e, 0xcb, 0xe3, 0x86, 0x8c, 0xe7, 0x91, 0x56, 0x55, 0x1f, 0x2b, 0x8f, - 0xef, 0x64, 0xe0, 0xf9, 0x3e, 0x34, 0x6c, 0xe0, 0xd8, 0xd0, 0xab, 0x03, 0x87, 0x27, 0x2a, 0x42, - 0xc9, 0xfb, 0x30, 0xbd, 0x29, 0xe4, 0x79, 0x39, 0x1c, 0xd9, 0x68, 0xbd, 0x48, 0x51, 0xdf, 0x92, - 0xe3, 0x12, 0x47, 0xd6, 0x02, 0xcd, 0xe4, 0xfa, 0x06, 0x9a, 0x51, 0xe3, 0xb6, 0x0c, 0x0d, 0x1a, - 0xb7, 0xe5, 0x43, 0x98, 0xd3, 0xdb, 0x26, 0xc2, 0xe7, 0x46, 0x51, 0x6b, 0x32, 0xbd, 0xa3, 0xd6, - 0xf4, 0x0d, 0xd2, 0x69, 0xfc, 0x64, 0x06, 0x0a, 0x3a, 0xef, 0x27, 0x1d, 0xcf, 0xf7, 0xb4, 0xf1, - 0x7c, 0x3e, 0x7d, 0x3c, 0x7b, 0x0f, 0xe4, 0xff, 0x9d, 0x89, 0x37, 0x76, 0xa0, 0x11, 0x34, 0x60, - 0xa4, 0xe2, 0xb6, 0x6c, 0xa7, 0xad, 0xe6, 0xd2, 0x6f, 0x20, 0xc4, 0x14, 0x25, 0x83, 0x05, 0xf9, - 0xb9, 0x04, 0xc3, 0xeb, 0x6e, 0xbb, 0x54, 0x11, 0x26, 0xbd, 0xc8, 0xa7, 0xed, 0xb6, 0x2d, 0xbb, - 0x61, 0xf2, 0x02, 0xb2, 0x0a, 0x50, 0xab, 0x7b, 0x94, 0xb6, 0x6b, 0xce, 0xf7, 0xd2, 0x98, 0xa4, - 0xc1, 0x7a, 0xa8, 0xd9, 0xc5, 0x8d, 0x85, 0x3f, 0x5d, 0x22, 0xa2, 0xe5, 0x3b, 0xdf, 0xab, 0xee, - 0xb7, 0x0a, 0x3d, 0xae, 0x2b, 0x11, 0x07, 0x2d, 0x36, 0x0e, 0x37, 0x3e, 0x89, 0x75, 0x95, 0x5a, - 0x15, 0xf6, 0xf0, 0x8d, 0xd4, 0xe1, 0xf8, 0x83, 0x0c, 0x3c, 0xdf, 0x87, 0xe6, 0x29, 0x8c, 0xca, - 0x5f, 0x74, 0x87, 0x53, 0x80, 0x88, 0x08, 0x53, 0x13, 0x3b, 0x8d, 0x80, 0xe7, 0xca, 0x9b, 0x14, - 0xa9, 0x89, 0x19, 0x40, 0x4b, 0x4d, 0xcc, 0x00, 0xec, 0x2c, 0x5d, 0xa1, 0xce, 0xee, 0x1e, 0x37, - 0xcf, 0x9a, 0xe4, 0x7b, 0xc3, 0x1e, 0x42, 0xd4, 0xb3, 0x94, 0xe3, 0x18, 0xff, 0x6a, 0x18, 0xce, - 0x9b, 0x74, 0xd7, 0x61, 0xf7, 0x92, 0x2d, 0xdf, 0x69, 0xef, 0x6a, 0x71, 0x6f, 0x8c, 0xd8, 0xca, - 0x15, 0x49, 0x22, 0x18, 0x24, 0x9c, 0x89, 0x57, 0x21, 0xcf, 0xc4, 0x10, 0x65, 0xf1, 0xe2, 0xa3, - 0x15, 0x13, 0x56, 0x44, 0x60, 0x65, 0x59, 0x4c, 0x5e, 0x13, 0x62, 0x92, 0x92, 0xc6, 0x87, 0x89, - 0x49, 0xdf, 0x3d, 0x2a, 0x42, 0xed, 0xd0, 0x0f, 0x28, 0x5e, 0x91, 0x85, 0xa8, 0x14, 0xde, 0x65, - 0x86, 0x7a, 0xdc, 0x65, 0xd6, 0x60, 0xae, 0xd4, 0xe0, 0xa7, 0xa3, 0xdd, 0xdc, 0xf0, 0x9c, 0x76, - 0xdd, 0xe9, 0xd8, 0x4d, 0x79, 0x3f, 0xc7, 0x5e, 0xb6, 0xc3, 0x72, 0xab, 0x13, 0x22, 0x98, 0xa9, - 0x64, 0xac, 0x19, 0x95, 0xf5, 0x1a, 0x86, 0x87, 0x11, 0xef, 0x91, 0xd8, 0x8c, 0x46, 0xdb, 0xc7, - 0x56, 0xf8, 0x66, 0x58, 0x8c, 0xb7, 0x28, 0x7c, 0x90, 0xdf, 0x5c, 0xad, 0x45, 0x2e, 0xcd, 0x3c, - 0xcb, 0x00, 0x7f, 0xd8, 0x0f, 0x9a, 0x3e, 0x9a, 0x42, 0x6a, 0x78, 0x11, 0x5d, 0xad, 0xb6, 0xc2, - 0xe8, 0xf2, 0x09, 0x3a, 0xdf, 0xdf, 0x53, 0xe9, 0x38, 0x1e, 0xb9, 0xce, 0xa6, 0x42, 0xcb, 0x0d, - 0x28, 0x4e, 0xe1, 0xb1, 0xe8, 0xce, 0xe5, 0x21, 0x94, 0xdf, 0xb9, 0x14, 0x14, 0xf2, 0x2e, 0xcc, - 0x2e, 0x97, 0x17, 0xa5, 0x16, 0xb9, 0xe2, 0xd6, 0xbb, 0xf8, 0x10, 0x0f, 0x58, 0x1f, 0x8e, 0x21, - 0xad, 0x2f, 0xb2, 0xdd, 0x24, 0x0d, 0x8d, 0x5c, 0x86, 0xd1, 0x6a, 0x85, 0xf7, 0xfd, 0xb8, 0x9a, - 0x4a, 0x4b, 0x58, 0x46, 0xc9, 0x42, 0x72, 0x3f, 0xba, 0x14, 0x4c, 0x9c, 0x28, 0xbd, 0x9f, 0x1f, - 0xe0, 0x42, 0xf0, 0x36, 0x4c, 0x2e, 0xb9, 0x41, 0xb5, 0xed, 0x07, 0x76, 0xbb, 0x4e, 0xab, 0x15, - 0x35, 0xae, 0xf5, 0xb6, 0x1b, 0x58, 0x8e, 0x28, 0x61, 0x5f, 0xae, 0x63, 0x92, 0xcf, 0x23, 0xe9, - 0x1d, 0xda, 0xa6, 0x5e, 0x14, 0xcf, 0x7a, 0x98, 0xf7, 0x2d, 0x23, 0xdd, 0x0d, 0x4b, 0x4c, 0x1d, - 0x51, 0xa4, 0xf9, 0xe2, 0xc9, 0x39, 0xcb, 0x6e, 0x83, 0xfa, 0x7c, 0xb7, 0xf8, 0x14, 0xa5, 0xf9, - 0x52, 0xda, 0xd6, 0x67, 0x07, 0xfd, 0x77, 0x31, 0xcd, 0x57, 0x02, 0x97, 0x7c, 0x1e, 0x86, 0xf1, - 0xa7, 0x90, 0x6e, 0x67, 0x53, 0xd8, 0x46, 0x92, 0x6d, 0x9d, 0x61, 0x9a, 0x9c, 0x80, 0x54, 0x61, - 0x54, 0x5c, 0xac, 0x4e, 0x93, 0xac, 0x46, 0xdc, 0xd0, 0xf8, 0xcc, 0x10, 0xf4, 0x46, 0x03, 0x26, - 0xd4, 0x0a, 0xd9, 0x8a, 0x58, 0xb1, 0xfd, 0x3d, 0xda, 0x60, 0xbf, 0x44, 0x9e, 0x39, 0x5c, 0x11, - 0x7b, 0x08, 0xb5, 0xd8, 0x77, 0x98, 0x0a, 0x0a, 0x3b, 0x53, 0xab, 0xfe, 0x96, 0x2f, 0x3e, 0x45, - 0xa8, 0x5a, 0x1c, 0x54, 0xdb, 0x35, 0x4c, 0x51, 0x64, 0x7c, 0x0f, 0xcc, 0xad, 0x77, 0x9b, 0x4d, - 0x7b, 0xbb, 0x49, 0x65, 0x1e, 0x12, 0xcc, 0xe0, 0xbd, 0x04, 0xc3, 0x35, 0x25, 0x27, 0x78, 0x98, - 0x0b, 0x52, 0xc1, 0x41, 0x23, 0xd4, 0x0c, 0x86, 0xea, 0x89, 0x65, 0x03, 0xe7, 0xa4, 0xc6, 0xef, - 0x65, 0x60, 0x4e, 0xbe, 0xff, 0x7b, 0x76, 0x7d, 0x3f, 0x4c, 0x0c, 0x7f, 0x59, 0x9b, 0x6b, 0x38, - 0x61, 0x63, 0xd3, 0x88, 0xcf, 0xba, 0xbb, 0xf2, 0x23, 0x74, 0x81, 0x25, 0xed, 0x83, 0x4f, 0xfa, - 0x18, 0xf2, 0x2e, 0x8c, 0x8b, 0xe3, 0x51, 0x09, 0x30, 0x89, 0x51, 0xbc, 0xc4, 0x75, 0x2f, 0x6e, - 0x8d, 0xa2, 0xa2, 0xa3, 0x2c, 0xa6, 0x37, 0xe5, 0x49, 0x65, 0x80, 0x74, 0x59, 0x4c, 0xaf, 0xa3, - 0xcf, 0xd4, 0xfd, 0xed, 0xf1, 0x78, 0xdf, 0x8a, 0xb9, 0x7b, 0x4b, 0x0d, 0x29, 0x97, 0x89, 0x6e, - 0xc6, 0x51, 0x48, 0x39, 0xf5, 0x66, 0x1c, 0xa2, 0x86, 0x63, 0x92, 0x3d, 0x61, 0x4c, 0xde, 0x97, - 0x63, 0x92, 0xeb, 0x3d, 0x31, 0x66, 0xfb, 0x8c, 0x43, 0x2d, 0x5a, 0x21, 0x43, 0x03, 0xa9, 0x55, - 0x9e, 0xc3, 0xd8, 0xf9, 0x9c, 0x24, 0xbe, 0x8b, 0x0a, 0x4e, 0xaa, 0xae, 0x66, 0x78, 0x70, 0xa6, - 0x27, 0x6c, 0xcd, 0x5f, 0x80, 0x89, 0x52, 0x10, 0xd8, 0xf5, 0x3d, 0xda, 0xa8, 0xb0, 0xed, 0x49, - 0x89, 0x7e, 0x65, 0x0b, 0xb8, 0xfa, 0x68, 0xa6, 0xe2, 0xf2, 0x68, 0xae, 0xb6, 0x2f, 0x8c, 0x59, - 0xc3, 0x68, 0xae, 0x0c, 0xa2, 0x47, 0x73, 0x65, 0x10, 0x72, 0x1d, 0x46, 0xab, 0xed, 0x47, 0x0e, - 0xeb, 0x13, 0x1e, 0x00, 0x0b, 0x75, 0x53, 0x0e, 0x07, 0xa9, 0x9b, 0xab, 0xc0, 0x22, 0x6f, 0x2b, - 0x97, 0x9a, 0xb1, 0x48, 0x81, 0xc1, 0x55, 0x5e, 0x61, 0x84, 0x1b, 0xf5, 0xc2, 0x12, 0xde, 0x72, - 0x6e, 0xc1, 0xa8, 0xd4, 0x64, 0x42, 0xa4, 0xb4, 0x10, 0x94, 0xc9, 0x80, 0x11, 0x12, 0x19, 0x93, - 0x7c, 0x2b, 0xf9, 0xf2, 0xc6, 0x95, 0x24, 0xdf, 0x4a, 0xbe, 0x3c, 0x2d, 0xc9, 0xb7, 0x92, 0x39, - 0x2f, 0x54, 0x02, 0x4d, 0x9c, 0xa8, 0x04, 0x7a, 0x00, 0x13, 0x1b, 0xb6, 0x17, 0x38, 0x4c, 0x46, - 0x69, 0x07, 0xfe, 0xfc, 0xa4, 0xa6, 0x37, 0x55, 0x8a, 0x96, 0x2e, 0xca, 0xbc, 0xd4, 0x1d, 0x05, - 0x5f, 0x4f, 0xa0, 0x1c, 0xc1, 0xd3, 0x4d, 0x59, 0xa7, 0x9e, 0xc4, 0x94, 0x15, 0x3b, 0x15, 0x75, - 0x65, 0xd3, 0x91, 0x46, 0x06, 0x2f, 0x2d, 0x31, 0x85, 0x59, 0x88, 0x48, 0xbe, 0x0a, 0x13, 0xec, - 0xef, 0x0d, 0xb7, 0xe9, 0xd4, 0x1d, 0xea, 0xcf, 0x17, 0xb0, 0x71, 0x17, 0x53, 0x57, 0x3f, 0x22, - 0x1d, 0xd6, 0x68, 0xc0, 0x17, 0x30, 0x32, 0x8e, 0x2b, 0xc1, 0x35, 0x6e, 0xe4, 0x03, 0x98, 0x60, - 0xb3, 0x6f, 0xdb, 0xf6, 0xb9, 0x68, 0x3a, 0x13, 0x19, 0x23, 0x37, 0x04, 0x3c, 0x11, 0x50, 0x59, - 0x25, 0x60, 0xc7, 0x7c, 0xa9, 0xc3, 0x37, 0x48, 0xa2, 0xcc, 0xf6, 0x4e, 0x62, 0x73, 0x94, 0x68, - 0xe4, 0x8b, 0x30, 0x51, 0xea, 0x74, 0xa2, 0x1d, 0x67, 0x56, 0x51, 0x84, 0x75, 0x3a, 0x56, 0xea, - 0xae, 0xa3, 0x51, 0xc4, 0x37, 0xe6, 0xb9, 0x53, 0x6d, 0xcc, 0xe4, 0xcd, 0x50, 0x5a, 0x3f, 0x13, - 0x69, 0x75, 0xc5, 0xc5, 0x51, 0x13, 0xfd, 0xb9, 0xe0, 0x5e, 0x86, 0x49, 0xae, 0xe6, 0x94, 0xd2, - 0xcc, 0xd9, 0xc4, 0xea, 0x49, 0x11, 0x6a, 0x74, 0x1a, 0xb2, 0x0c, 0x53, 0xdc, 0xdb, 0xba, 0x29, - 0x22, 0x5d, 0xcf, 0x9f, 0xc3, 0x55, 0x8b, 0x5c, 0xb8, 0x93, 0x76, 0x13, 0x13, 0xa0, 0xd8, 0x1a, - 0x97, 0x18, 0x91, 0xf1, 0x27, 0x19, 0x38, 0xd7, 0x63, 0xc4, 0xc3, 0x38, 0xc8, 0x99, 0xfe, 0x71, - 0x90, 0xd9, 0xce, 0xa1, 0x6b, 0x45, 0xb0, 0xfd, 0x42, 0xca, 0x52, 0xc7, 0x4b, 0xca, 0x5b, 0x2e, - 0x10, 0x91, 0x63, 0x48, 0x54, 0x7d, 0xd7, 0x45, 0xd5, 0x6c, 0x2e, 0x79, 0x08, 0x09, 0x3c, 0xfe, - 0x51, 0x4b, 0xc6, 0xf1, 0x51, 0xf1, 0xa2, 0x48, 0x61, 0x14, 0x0e, 0xeb, 0x47, 0xae, 0xb6, 0x82, - 0x53, 0x58, 0x1b, 0x47, 0x19, 0x18, 0x57, 0xd6, 0x21, 0xb9, 0xa4, 0x78, 0x01, 0x17, 0x78, 0x12, - 0x2c, 0x85, 0x43, 0x96, 0x9f, 0x44, 0xb8, 0xa8, 0xb2, 0x27, 0x2b, 0xa0, 0xd7, 0x98, 0x28, 0xa4, - 0xc4, 0x8a, 0x6e, 0x69, 0xda, 0x62, 0x13, 0xcb, 0x31, 0x9d, 0xbe, 0xed, 0x07, 0xa5, 0x7a, 0xe0, - 0x3c, 0xa2, 0x03, 0x1c, 0x3a, 0x51, 0x3a, 0x7d, 0xdb, 0x0f, 0x2c, 0x1b, 0xc9, 0x12, 0xe9, 0xf4, - 0x43, 0x86, 0xc6, 0x0f, 0x66, 0x00, 0xb6, 0xaa, 0x65, 0x0c, 0xf6, 0xfe, 0xa4, 0x42, 0x41, 0x7a, - 0x00, 0x5d, 0xc9, 0xbd, 0x8f, 0x38, 0xf0, 0x3f, 0x65, 0x60, 0x4a, 0x47, 0x23, 0xef, 0xc3, 0x74, - 0xad, 0xee, 0xb9, 0xcd, 0xe6, 0xb6, 0x5d, 0xdf, 0x5f, 0x75, 0xda, 0x94, 0x87, 0x2e, 0x1d, 0xe6, - 0x67, 0x91, 0x1f, 0x16, 0x59, 0x4d, 0x56, 0x66, 0xc6, 0x91, 0xc9, 0x0f, 0x65, 0x60, 0xb2, 0xb6, - 0xe7, 0x1e, 0x84, 0xd1, 0x46, 0xc5, 0x80, 0x7c, 0x8d, 0xad, 0x6d, 0x7f, 0xcf, 0x3d, 0x88, 0x32, - 0x68, 0x6a, 0xc6, 0x9f, 0xef, 0x0d, 0xf6, 0x2e, 0x5f, 0x77, 0xf1, 0x26, 0x13, 0xf8, 0xd7, 0xb4, - 0x4a, 0x4c, 0xbd, 0x4e, 0xe3, 0xcf, 0x33, 0x30, 0x8e, 0x77, 0x9e, 0x66, 0x13, 0x65, 0xae, 0x4f, - 0x53, 0x3a, 0xc6, 0xb0, 0x5d, 0x7d, 0x06, 0xf6, 0x2d, 0x98, 0x8e, 0xa1, 0x11, 0x03, 0x46, 0x6a, - 0xe8, 0xe0, 0xaf, 0x2a, 0x28, 0xb8, 0xcb, 0xbf, 0x29, 0x4a, 0x8c, 0x65, 0x85, 0xec, 0xc1, 0x0d, - 0x7c, 0xd6, 0x5d, 0x04, 0x70, 0x24, 0x48, 0xde, 0x6c, 0x48, 0xfc, 0x4b, 0x1e, 0xdc, 0x30, 0x15, - 0x2c, 0x63, 0x1d, 0x46, 0x6a, 0xae, 0x17, 0x2c, 0x1d, 0xf2, 0xcb, 0x44, 0x85, 0xfa, 0x75, 0xf5, - 0xdd, 0xd6, 0xc1, 0xb7, 0x92, 0xba, 0x29, 0x8a, 0x48, 0x11, 0x86, 0x6f, 0x3b, 0xb4, 0xd9, 0x50, - 0x0d, 0x74, 0x77, 0x18, 0xc0, 0xe4, 0x70, 0x76, 0xe1, 0x3a, 0x1b, 0xe5, 0x44, 0x89, 0x2c, 0x81, - 0x9f, 0x74, 0xdd, 0x94, 0xb5, 0xfe, 0x7d, 0x31, 0xcc, 0x43, 0x90, 0xac, 0xa9, 0x4f, 0x57, 0xff, - 0x47, 0x19, 0x58, 0xe8, 0x4d, 0xa2, 0x1a, 0x17, 0x67, 0xfa, 0x18, 0x17, 0xbf, 0x12, 0x7f, 0x67, - 0x44, 0x34, 0xf1, 0xce, 0x18, 0xbd, 0x2e, 0x56, 0xd0, 0xb6, 0xbb, 0x4e, 0x65, 0x22, 0x94, 0x4b, - 0x7d, 0xbe, 0x19, 0x11, 0xf9, 0x30, 0x07, 0x48, 0x63, 0x0a, 0x5a, 0xe3, 0xb7, 0x86, 0xe0, 0x7c, - 0x4f, 0x0a, 0xb2, 0xa2, 0xa4, 0x57, 0x9a, 0x0a, 0x13, 0xbb, 0xf4, 0xc4, 0xbf, 0x86, 0xff, 0xa2, - 0xf9, 0x5e, 0xdc, 0xdb, 0xec, 0x7e, 0x98, 0x56, 0x27, 0x8b, 0xbc, 0x5e, 0x3f, 0x91, 0x17, 0x47, - 0x47, 0x66, 0x90, 0xcc, 0xb0, 0x83, 0x7e, 0x89, 0x34, 0xb0, 0x9d, 0xa6, 0xaf, 0x2e, 0xbb, 0x06, - 0x07, 0x99, 0xb2, 0x2c, 0xb2, 0xf8, 0x1e, 0x4a, 0xb7, 0xf8, 0x36, 0xfe, 0x55, 0x06, 0xc6, 0xc2, - 0xcf, 0x26, 0x0b, 0x70, 0x76, 0xd3, 0x2c, 0x95, 0x97, 0xad, 0xcd, 0x0f, 0x37, 0x96, 0xad, 0xad, - 0xf5, 0xda, 0xc6, 0x72, 0xb9, 0x7a, 0xbb, 0xba, 0x5c, 0x29, 0x3c, 0x47, 0x66, 0x60, 0x72, 0x6b, - 0xfd, 0xde, 0xfa, 0xfd, 0x87, 0xeb, 0xd6, 0xb2, 0x69, 0xde, 0x37, 0x0b, 0x19, 0x32, 0x09, 0x63, - 0xe6, 0x52, 0xa9, 0x6c, 0xad, 0xdf, 0xaf, 0x2c, 0x17, 0xb2, 0xa4, 0x00, 0x13, 0xe5, 0xfb, 0xeb, - 0xeb, 0xcb, 0xe5, 0xcd, 0xea, 0x83, 0xea, 0xe6, 0x87, 0x85, 0x1c, 0x21, 0x30, 0x85, 0x08, 0x1b, - 0x66, 0x75, 0xbd, 0x5c, 0xdd, 0x28, 0xad, 0x16, 0x86, 0x18, 0x8c, 0xe1, 0x2b, 0xb0, 0xe1, 0x90, - 0xd1, 0xbd, 0xad, 0xa5, 0xe5, 0xc2, 0x08, 0x43, 0x61, 0x7f, 0x29, 0x28, 0xa3, 0xac, 0x7a, 0x44, - 0xa9, 0x94, 0x36, 0x4b, 0x4b, 0xa5, 0xda, 0x72, 0x21, 0x4f, 0xce, 0xc1, 0xac, 0x06, 0xb2, 0x56, - 0xef, 0xdf, 0xa9, 0xae, 0x17, 0xc6, 0xc8, 0x1c, 0x14, 0x42, 0x58, 0x65, 0xc9, 0xda, 0xaa, 0x2d, - 0x9b, 0x05, 0x88, 0x43, 0xd7, 0x4b, 0x6b, 0xcb, 0x85, 0x71, 0xe3, 0x3d, 0xee, 0x07, 0xc8, 0xbb, - 0x9a, 0x9c, 0x05, 0x52, 0xdb, 0x2c, 0x6d, 0x6e, 0xd5, 0x62, 0x8d, 0x1f, 0x87, 0xd1, 0xda, 0x56, - 0xb9, 0xbc, 0x5c, 0xab, 0x15, 0x32, 0x04, 0x60, 0xe4, 0x76, 0xa9, 0xba, 0xba, 0x5c, 0x29, 0x64, - 0x8d, 0x9f, 0xce, 0xc0, 0x8c, 0x94, 0x00, 0xe5, 0xa3, 0xd1, 0x13, 0xae, 0xc5, 0xf7, 0xb5, 0x8b, - 0xad, 0x74, 0xd2, 0x8a, 0x55, 0xd2, 0x67, 0x19, 0xfe, 0x42, 0x06, 0xce, 0xa4, 0x62, 0x93, 0x0f, - 0xa1, 0x20, 0xbf, 0x60, 0xcd, 0x0e, 0xea, 0x7b, 0xd1, 0x3e, 0x76, 0x31, 0x56, 0x4b, 0x0c, 0x8d, - 0xab, 0x35, 0xa3, 0x84, 0xcf, 0x09, 0x36, 0x83, 0xa7, 0x23, 0x30, 0xbe, 0x9d, 0x81, 0x73, 0x3d, - 0xaa, 0x21, 0x65, 0x18, 0x09, 0x13, 0xd3, 0xf4, 0xb1, 0x60, 0x9b, 0xfb, 0xce, 0x51, 0x51, 0x20, - 0x62, 0x86, 0x5c, 0xfc, 0xcb, 0x1c, 0x09, 0x33, 0xcd, 0x60, 0xba, 0x17, 0xde, 0x7d, 0xe7, 0x63, - 0x3d, 0x2f, 0x6a, 0x2a, 0x3d, 0xac, 0x2d, 0x8d, 0x8b, 0xbe, 0xcb, 0xd9, 0x07, 0x3e, 0xe6, 0x7b, - 0x31, 0x7e, 0x36, 0xc3, 0x84, 0xbb, 0x38, 0x22, 0x93, 0x79, 0x4b, 0xbe, 0xdf, 0x6d, 0x51, 0xd3, - 0x6d, 0xd2, 0x92, 0xb9, 0x2e, 0x8e, 0x0d, 0x94, 0x56, 0x6d, 0x2c, 0xc0, 0x6b, 0x85, 0x65, 0x7b, - 0x6d, 0xed, 0xb5, 0x5a, 0xa5, 0x21, 0x6f, 0x03, 0x2c, 0x3f, 0x0e, 0xa8, 0xd7, 0xb6, 0x9b, 0x61, - 0x8c, 0x16, 0x1e, 0x59, 0x4a, 0x40, 0x75, 0x79, 0x5b, 0x41, 0x36, 0xfe, 0x46, 0x06, 0x26, 0xc4, - 0xa5, 0xa9, 0xd4, 0xa4, 0x5e, 0xf0, 0x64, 0xd3, 0xeb, 0x6d, 0x6d, 0x7a, 0x85, 0x0e, 0x1b, 0x0a, - 0x7f, 0x56, 0x9c, 0x3a, 0xb3, 0xfe, 0x69, 0x06, 0x0a, 0x71, 0x44, 0xf2, 0x3e, 0xe4, 0x6b, 0xf4, - 0x11, 0xf5, 0x9c, 0xe0, 0x50, 0x6c, 0x94, 0x32, 0x85, 0x1f, 0xc7, 0x11, 0x65, 0x7c, 0x3e, 0xf8, - 0xe2, 0x97, 0x19, 0xd2, 0x0c, 0xba, 0xdf, 0x2b, 0x6a, 0x8f, 0xdc, 0xd3, 0x52, 0x7b, 0x18, 0xff, - 0x7b, 0x16, 0xce, 0xdd, 0xa1, 0x81, 0xda, 0xa6, 0xd0, 0xbc, 0xe0, 0x33, 0x83, 0xb5, 0x4b, 0x69, - 0xc9, 0x3c, 0x8c, 0x62, 0x91, 0x1c, 0x5f, 0x53, 0xfe, 0x24, 0x4b, 0xe1, 0xbc, 0xce, 0x69, 0x39, - 0xc2, 0x7a, 0xd4, 0x7d, 0x4d, 0xc9, 0x1a, 0x14, 0x4e, 0xeb, 0xcb, 0x30, 0x85, 0x61, 0xf1, 0xbb, - 0x6c, 0x39, 0xd0, 0x86, 0x50, 0xff, 0xe4, 0xcd, 0x18, 0x94, 0xbc, 0x06, 0x05, 0x06, 0x29, 0xd5, - 0xf7, 0xdb, 0xee, 0x41, 0x93, 0x36, 0x76, 0x69, 0x03, 0x8f, 0xf5, 0xbc, 0x99, 0x80, 0x4b, 0x9e, - 0x5b, 0x6d, 0x7e, 0x75, 0xa3, 0x0d, 0xd4, 0xd1, 0x08, 0x9e, 0x11, 0x74, 0xe1, 0x6d, 0x18, 0xff, - 0x98, 0x19, 0xc0, 0x8c, 0xff, 0x2d, 0x03, 0x73, 0xd8, 0x38, 0xa5, 0x62, 0x99, 0x9d, 0x55, 0xf6, - 0x96, 0x92, 0x14, 0xc7, 0x66, 0x20, 0x7d, 0x29, 0x84, 0xbd, 0x18, 0xe9, 0x84, 0xb2, 0x03, 0xe8, - 0x84, 0x6a, 0xa7, 0xc9, 0x44, 0x3f, 0xa0, 0x4a, 0xeb, 0xee, 0x50, 0x3e, 0x57, 0x18, 0x8a, 0x86, - 0xdc, 0xf8, 0xa1, 0x2c, 0x8c, 0x9a, 0x14, 0x53, 0x74, 0x93, 0xcb, 0x30, 0xba, 0xee, 0x06, 0xd4, - 0x5f, 0xd3, 0xf2, 0xb1, 0xb7, 0x19, 0xc8, 0x6a, 0x35, 0x4c, 0x59, 0xc8, 0x26, 0xfc, 0x86, 0xe7, - 0x36, 0xba, 0xf5, 0x40, 0x9d, 0xf0, 0x1d, 0x0e, 0x32, 0x65, 0x19, 0x79, 0x03, 0xc6, 0x04, 0xe7, - 0xf0, 0x51, 0x17, 0x8d, 0x91, 0x3d, 0x1a, 0xa6, 0x78, 0x8f, 0x10, 0x50, 0xa6, 0xe5, 0x02, 0xc6, - 0x90, 0x22, 0xd3, 0x26, 0x64, 0x06, 0x29, 0xaa, 0x0f, 0xf7, 0x11, 0xd5, 0x3f, 0x03, 0x23, 0x25, - 0xdf, 0xa7, 0x81, 0x8c, 0x62, 0x30, 0x11, 0x86, 0x6d, 0xf3, 0x69, 0xc0, 0x19, 0xdb, 0x58, 0x6e, - 0x0a, 0x3c, 0xe3, 0x5f, 0x64, 0x61, 0x18, 0xff, 0xc4, 0x27, 0x53, 0xaf, 0xbe, 0xa7, 0x3d, 0x99, - 0x7a, 0xf5, 0x3d, 0x13, 0xa1, 0xe4, 0x06, 0x6a, 0x2a, 0x64, 0xfe, 0x26, 0xd1, 0x7a, 0x54, 0xc1, - 0x37, 0x22, 0xb0, 0xa9, 0xe2, 0x84, 0x2f, 0xfc, 0xb9, 0xd4, 0xd8, 0x25, 0x67, 0x21, 0x7b, 0xbf, - 0x26, 0x5a, 0x8c, 0x11, 0xb1, 0x5c, 0xdf, 0xcc, 0xde, 0xaf, 0x61, 0x6f, 0xac, 0x94, 0x16, 0xdf, - 0xba, 0x25, 0x1a, 0xca, 0x7b, 0x63, 0xcf, 0x5e, 0x7c, 0xeb, 0x96, 0x29, 0x4a, 0x58, 0xff, 0xe2, - 0x37, 0xe3, 0xc3, 0x2b, 0xf7, 0xb9, 0xc7, 0xfe, 0xc5, 0xb6, 0xe1, 0x23, 0xab, 0x19, 0x21, 0x90, - 0x45, 0x18, 0x17, 0xb1, 0x1e, 0x10, 0x5f, 0x89, 0xc5, 0x20, 0x62, 0x41, 0x70, 0x0a, 0x15, 0x89, - 0x3f, 0xc1, 0x89, 0x01, 0x92, 0x59, 0x66, 0xc5, 0x13, 0x9c, 0x1c, 0x42, 0xdf, 0x54, 0x50, 0xd8, - 0x27, 0xf1, 0x37, 0xbc, 0xc8, 0x97, 0x7e, 0x4a, 0x09, 0x1a, 0x80, 0x69, 0x0e, 0x42, 0x04, 0xe3, - 0x57, 0xb2, 0x90, 0xdf, 0x68, 0x76, 0x77, 0x9d, 0xf6, 0x83, 0x1b, 0x84, 0x00, 0x5e, 0xe3, 0x64, - 0x1e, 0x0c, 0xf6, 0x37, 0x39, 0x0f, 0x79, 0x79, 0x73, 0x93, 0x1b, 0x92, 0x2f, 0x6e, 0x6d, 0xf3, - 0x20, 0xc7, 0x5d, 0x84, 0x3e, 0x93, 0x3f, 0xc9, 0x0d, 0x08, 0xef, 0x5f, 0xbd, 0x2e, 0x6a, 0x43, - 0x6c, 0xb1, 0x98, 0x21, 0x1a, 0x79, 0x13, 0xf0, 0x90, 0x10, 0x97, 0x07, 0xa9, 0xd0, 0xe6, 0x9f, - 0x26, 0xe4, 0x14, 0x4e, 0x82, 0x68, 0xe4, 0x26, 0x88, 0x89, 0x29, 0xb2, 0x99, 0x9f, 0xd1, 0x09, - 0x78, 0x7e, 0x48, 0x49, 0x22, 0x50, 0xc9, 0xbb, 0x30, 0x5e, 0xf7, 0x28, 0xbe, 0x3a, 0xda, 0xcd, - 0x28, 0x49, 0xb9, 0x4a, 0x59, 0x8e, 0xca, 0x1f, 0xdc, 0x30, 0x55, 0x74, 0xe3, 0x57, 0xf2, 0x30, - 0xa1, 0x7e, 0x0f, 0x31, 0x61, 0xd6, 0x6f, 0xb2, 0xbb, 0xbb, 0x30, 0x36, 0xeb, 0x60, 0xa1, 0x38, - 0x4e, 0x2f, 0xe9, 0x1f, 0xc4, 0xf0, 0xb8, 0xe5, 0x99, 0x0c, 0x52, 0xb1, 0xf2, 0x9c, 0x39, 0xe3, - 0x47, 0x60, 0x8e, 0x47, 0x4a, 0x90, 0x77, 0x3b, 0xfe, 0x2e, 0x6d, 0x3b, 0xf2, 0xbd, 0xe5, 0x25, - 0x8d, 0xd1, 0x7d, 0x51, 0x98, 0xe0, 0x15, 0x92, 0x91, 0xb7, 0x60, 0xc4, 0xed, 0xd0, 0xb6, 0xed, - 0x88, 0x33, 0xee, 0xf9, 0x18, 0x03, 0xda, 0x2e, 0x55, 0x15, 0x42, 0x81, 0x4c, 0xae, 0xc3, 0x90, - 0xbb, 0x1f, 0x8e, 0xd7, 0x79, 0x9d, 0x68, 0x3f, 0xb0, 0x15, 0x12, 0x44, 0x64, 0x04, 0x1f, 0xd9, - 0xad, 0x1d, 0x31, 0x62, 0x3a, 0xc1, 0x5d, 0xbb, 0xb5, 0xa3, 0x12, 0x30, 0x44, 0xf2, 0x01, 0x40, - 0xc7, 0xde, 0xa5, 0x9e, 0xd5, 0xe8, 0x06, 0x87, 0x62, 0xdc, 0x2e, 0x6a, 0x64, 0x1b, 0xac, 0xb8, - 0xd2, 0x0d, 0x0e, 0x15, 0xda, 0xb1, 0x8e, 0x04, 0x92, 0x12, 0x40, 0xcb, 0x0e, 0x02, 0xea, 0xb5, - 0x5c, 0x61, 0xed, 0x17, 0x05, 0x21, 0xe4, 0x0c, 0xd6, 0xc2, 0x62, 0x85, 0x83, 0x42, 0x84, 0x1f, - 0xed, 0x78, 0xb6, 0xc8, 0x29, 0x1f, 0xfb, 0x68, 0xc7, 0xd3, 0x5a, 0xc9, 0x10, 0xc9, 0xe7, 0x61, - 0xb4, 0xe1, 0xf8, 0x75, 0xd7, 0x6b, 0x88, 0xe8, 0x25, 0x2f, 0x68, 0x34, 0x15, 0x5e, 0xa6, 0x90, - 0x49, 0x74, 0xf6, 0xb5, 0x22, 0x08, 0xe9, 0xba, 0x7b, 0x80, 0x6a, 0xfe, 0xf8, 0xd7, 0xd6, 0xc2, - 0x62, 0xf5, 0x6b, 0x23, 0x22, 0x36, 0x94, 0xbb, 0x4e, 0xd0, 0xb4, 0xb7, 0xc5, 0x3b, 0xb7, 0x3e, - 0x94, 0x77, 0xb0, 0x48, 0x1d, 0x4a, 0x8e, 0x4c, 0xde, 0x86, 0x3c, 0x6d, 0x07, 0x9e, 0x6d, 0x39, - 0x0d, 0xe1, 0x25, 0xa9, 0x7f, 0x34, 0x3b, 0x80, 0xed, 0x6a, 0x45, 0xfd, 0x68, 0xc4, 0xaf, 0x36, - 0x58, 0xff, 0xf8, 0x75, 0xa7, 0x25, 0x9c, 0x1b, 0xf5, 0xfe, 0xa9, 0x95, 0xab, 0x6b, 0x6a, 0xff, - 0x30, 0x44, 0xf2, 0x3e, 0x8c, 0xb2, 0xf5, 0xdb, 0x70, 0x77, 0x45, 0x40, 0x08, 0x43, 0xef, 0x1f, - 0x5e, 0x96, 0x98, 0xae, 0x92, 0x88, 0x2d, 0x64, 0xfb, 0xc0, 0xb7, 0x9c, 0xba, 0x08, 0xf2, 0xa0, - 0x2f, 0xc7, 0xd2, 0xc3, 0x5a, 0xb5, 0xac, 0x90, 0x0d, 0xdb, 0x07, 0x7e, 0xb5, 0x4e, 0x16, 0x61, - 0x18, 0x53, 0x44, 0x88, 0x40, 0x94, 0x3a, 0x0d, 0x26, 0x87, 0x50, 0x69, 0x10, 0x95, 0x0d, 0x64, - 0xcb, 0x47, 0x7f, 0x11, 0x91, 0xa8, 0x41, 0xef, 0x93, 0xb5, 0x1a, 0x3a, 0x91, 0xa8, 0x9f, 0x28, - 0xd0, 0xc9, 0x45, 0x80, 0xe8, 0x15, 0x9f, 0xbf, 0xb9, 0x98, 0x0a, 0xe4, 0x0b, 0x43, 0xff, 0xd7, - 0x2f, 0x15, 0x33, 0x4b, 0x00, 0x79, 0x19, 0xa1, 0xc6, 0x58, 0x85, 0xf3, 0x3d, 0xd7, 0x3d, 0xb9, - 0x0a, 0x85, 0x1d, 0x5b, 0x68, 0xfd, 0xea, 0x7b, 0x76, 0xbb, 0x4d, 0x9b, 0x62, 0xc7, 0x9d, 0x96, - 0xf0, 0x32, 0x07, 0x73, 0xce, 0xc6, 0x07, 0x30, 0x97, 0x36, 0xe0, 0xe4, 0x45, 0x98, 0x50, 0x83, - 0xf1, 0x08, 0x26, 0xe3, 0x76, 0xc7, 0x91, 0xe1, 0x78, 0x04, 0x83, 0xdf, 0xcc, 0xc0, 0x0b, 0xfd, - 0xb6, 0x0f, 0xb2, 0x00, 0xf9, 0x8e, 0xe7, 0xb8, 0x28, 0xa6, 0x8a, 0x6c, 0x07, 0xf2, 0x37, 0x26, - 0x32, 0x40, 0x79, 0x2a, 0xb0, 0x77, 0x85, 0x83, 0x87, 0x39, 0x86, 0x90, 0x4d, 0x7b, 0xd7, 0x27, - 0xaf, 0xc3, 0x4c, 0x83, 0xee, 0xd8, 0xdd, 0x66, 0x60, 0xf9, 0xf5, 0x3d, 0xda, 0x40, 0x9f, 0x2a, - 0x34, 0xdc, 0x33, 0x0b, 0xa2, 0xa0, 0x26, 0xe1, 0x89, 0x2f, 0x1e, 0xee, 0xf1, 0xc5, 0x77, 0x87, - 0xf2, 0x99, 0x42, 0xd6, 0x44, 0x4b, 0x29, 0xe3, 0xfb, 0xb3, 0x30, 0xdf, 0x6b, 0xbd, 0x90, 0xf7, - 0xd2, 0xfa, 0x80, 0x3f, 0x5c, 0xa8, 0x70, 0xf5, 0xe1, 0x42, 0xa9, 0x8d, 0x2c, 0x42, 0xe8, 0x11, - 0x75, 0x52, 0x74, 0x03, 0x09, 0x63, 0x34, 0x1d, 0xdb, 0xf7, 0x0f, 0xd8, 0x96, 0x90, 0x53, 0x02, - 0xda, 0x0a, 0x98, 0x4a, 0x23, 0x61, 0xe4, 0x73, 0x00, 0xf5, 0xa6, 0xeb, 0x53, 0xb4, 0x0f, 0x10, - 0xb2, 0x06, 0x37, 0x0b, 0x0f, 0xa1, 0xea, 0x83, 0x30, 0x42, 0xcb, 0x6e, 0x83, 0x8a, 0x01, 0xb4, - 0xe1, 0x5c, 0x8f, 0x0d, 0x92, 0x0d, 0x4f, 0x94, 0x1d, 0x5e, 0xe6, 0x9a, 0xea, 0x86, 0x39, 0xe2, - 0xe3, 0x3d, 0x9e, 0xed, 0x35, 0x47, 0x0e, 0x81, 0x24, 0x77, 0x41, 0xc6, 0x5d, 0x18, 0x37, 0xff, - 0xff, 0xec, 0x7d, 0x5b, 0x6c, 0x1b, 0xd9, 0x79, 0xb0, 0x87, 0xa4, 0x24, 0xea, 0xa3, 0x2e, 0xa3, - 0xe3, 0x8b, 0xb4, 0x96, 0xd7, 0x5e, 0xcf, 0xda, 0x8e, 0xcd, 0xcd, 0x6e, 0x62, 0xef, 0xbf, 0xd9, - 0xdd, 0xdc, 0x47, 0xe4, 0x48, 0xa4, 0xc5, 0x5b, 0x66, 0x48, 0x29, 0x8e, 0x93, 0x4c, 0xc6, 0xe4, - 0x48, 0x9a, 0x84, 0x22, 0x19, 0x0e, 0xb9, 0x8e, 0x83, 0x1f, 0x68, 0x83, 0x02, 0x09, 0xd0, 0x5b, - 0xda, 0xb4, 0x45, 0x17, 0x7d, 0xc9, 0x43, 0x83, 0xa2, 0x0f, 0x7d, 0x2d, 0x5a, 0xb4, 0x7d, 0xc9, - 0x5b, 0x80, 0x20, 0x40, 0x80, 0xbe, 0xa5, 0xc5, 0xa2, 0x5d, 0xa0, 0x05, 0x7a, 0x79, 0x2b, 0xda, - 0x87, 0x3c, 0x15, 0xe7, 0x3b, 0xe7, 0xcc, 0x9c, 0xb9, 0x90, 0x96, 0xb3, 0x9b, 0xb6, 0x01, 0xf2, - 0x24, 0xf1, 0x3b, 0xdf, 0xf9, 0xe6, 0xdc, 0xcf, 0xf7, 0x7d, 0xe7, 0xbb, 0x4c, 0xc7, 0x01, 0x75, - 0x06, 0xe9, 0x8c, 0xfb, 0xe4, 0x1a, 0x14, 0x44, 0x2e, 0x49, 0xca, 0xcb, 0x33, 0xe2, 0xc0, 0x41, - 0xfb, 0x2e, 0x2e, 0x1e, 0x8c, 0x58, 0x8a, 0x7e, 0x6f, 0x9c, 0x4b, 0x58, 0x46, 0x48, 0xfb, 0xc9, - 0x48, 0xf4, 0xee, 0x8a, 0x58, 0xdf, 0xd1, 0xbb, 0x89, 0x97, 0xfe, 0x81, 0x22, 0xa6, 0x3f, 0x79, - 0xb8, 0x3f, 0xad, 0x7d, 0x04, 0xd0, 0x4b, 0x89, 0x37, 0x0c, 0xff, 0xa7, 0x5c, 0x8b, 0xd8, 0x75, - 0x9c, 0x6b, 0xe1, 0x3f, 0xc9, 0x2d, 0x58, 0x1f, 0x33, 0x3b, 0xd6, 0xc9, 0x90, 0x8f, 0x27, 0xcb, - 0xdb, 0xb1, 0xca, 0xc0, 0xed, 0x21, 0x8e, 0x29, 0x6f, 0xd7, 0xfd, 0x60, 0xc0, 0xa4, 0xbb, 0x8e, - 0xbc, 0x02, 0xcb, 0xf4, 0xae, 0xc3, 0x48, 0x37, 0x31, 0xf7, 0x08, 0xc4, 0x43, 0xce, 0xc1, 0xcc, - 0x7f, 0x99, 0xff, 0xcf, 0x69, 0xbd, 0x9d, 0x11, 0xc4, 0xe4, 0x9b, 0x96, 0x6c, 0xc2, 0xd2, 0x70, - 0x7c, 0x2c, 0x75, 0x6d, 0x71, 0x38, 0x3e, 0xa6, 0xfd, 0xba, 0x0d, 0x2a, 0xf3, 0xd6, 0x61, 0x61, - 0x10, 0xfc, 0x27, 0x03, 0x26, 0x8a, 0xe7, 0xcd, 0x35, 0x06, 0xc7, 0x84, 0xf9, 0x4f, 0x06, 0x5d, - 0x8a, 0xe9, 0xfb, 0x43, 0x5b, 0x0e, 0x70, 0xc5, 0xbb, 0xbd, 0xe6, 0xfb, 0xc3, 0x30, 0xd2, 0x55, - 0x8f, 0xec, 0xc0, 0x2a, 0xa5, 0x13, 0x84, 0xd9, 0xe2, 0x8c, 0xc0, 0xf3, 0x49, 0x46, 0xe0, 0xc9, - 0xa0, 0x2b, 0x9a, 0x68, 0xae, 0xf8, 0xd2, 0x2f, 0xb2, 0x0f, 0xaa, 0xc4, 0x31, 0xa1, 0x3f, 0x66, - 0xcc, 0xa6, 0x3a, 0x24, 0x23, 0x71, 0x5a, 0xd5, 0xc1, 0xd1, 0xd0, 0x5c, 0xef, 0x46, 0x01, 0x7c, - 0x68, 0xbe, 0xab, 0x88, 0xb3, 0x34, 0xa5, 0x12, 0xd1, 0x60, 0xf5, 0xc4, 0xf1, 0x6d, 0xdf, 0x3f, - 0x65, 0x36, 0x62, 0x3c, 0xb0, 0x6f, 0xe1, 0xc4, 0xf1, 0x2d, 0xff, 0x54, 0x24, 0x0e, 0xb9, 0x48, - 0x71, 0x86, 0xce, 0x74, 0x72, 0x62, 0xcb, 0xfc, 0x1f, 0x1b, 0xb1, 0xf3, 0x27, 0x8e, 0xdf, 0xa4, - 0x65, 0x12, 0x6d, 0x72, 0x03, 0xd6, 0x90, 0x6e, 0xd7, 0x13, 0x84, 0x31, 0x94, 0x85, 0xb9, 0x42, - 0x09, 0x77, 0x3d, 0x46, 0x99, 0xb7, 0xf0, 0x5f, 0x32, 0x70, 0x29, 0x7d, 0x74, 0x70, 0x79, 0xd2, - 0x31, 0x45, 0x1f, 0x3d, 0xde, 0xb6, 0x65, 0x0a, 0x61, 0x61, 0x48, 0xd2, 0x26, 0x27, 0x93, 0x3a, - 0x39, 0x45, 0xd8, 0x40, 0x42, 0x9c, 0xd3, 0xec, 0x7b, 0xfe, 0x84, 0x47, 0xd7, 0x30, 0xd7, 0x69, - 0x01, 0x3b, 0xcf, 0x6b, 0x14, 0x4c, 0x6e, 0xc2, 0x9a, 0x38, 0x91, 0x87, 0x8f, 0x07, 0xf4, 0xc3, - 0xec, 0x38, 0x5e, 0xe5, 0xd0, 0x26, 0x02, 0xc9, 0x45, 0x58, 0x74, 0x46, 0x23, 0xfa, 0x49, 0x76, - 0x0a, 0x2f, 0x38, 0xa3, 0x11, 0x4b, 0x6e, 0x83, 0x1e, 0x89, 0xf6, 0x11, 0x5a, 0x09, 0x71, 0x93, - 0x44, 0x73, 0x05, 0x81, 0xcc, 0x72, 0xc8, 0xa7, 0xfb, 0x9e, 0xd6, 0x15, 0x28, 0x4b, 0x88, 0x02, - 0xce, 0x28, 0x40, 0x78, 0x0e, 0xf2, 0xe2, 0xbd, 0x9a, 0x39, 0x56, 0x98, 0x4b, 0x0e, 0x7f, 0xab, - 0x7e, 0x0d, 0x36, 0x7b, 0x9e, 0x8f, 0x8b, 0x97, 0x75, 0x69, 0x34, 0xe2, 0x3e, 0x90, 0x2c, 0x48, - 0xae, 0x79, 0x81, 0x17, 0xd3, 0x91, 0xd4, 0x47, 0x23, 0xe6, 0x09, 0xc9, 0xc7, 0xfa, 0x0d, 0x58, - 0xe7, 0x1c, 0x17, 0xbf, 0x22, 0xb1, 0x2d, 0x7c, 0x03, 0x53, 0x51, 0x88, 0xa7, 0x13, 0x02, 0x0e, - 0xaa, 0xf6, 0x44, 0xcd, 0xbf, 0x57, 0xe0, 0x62, 0x2a, 0xcb, 0x46, 0xbe, 0x04, 0xcc, 0xe5, 0x6b, - 0x32, 0xb4, 0xc7, 0x6e, 0xd7, 0x1b, 0x79, 0x18, 0x14, 0x83, 0xa9, 0x34, 0xef, 0xcd, 0x63, 0xf6, - 0xd0, 0x7d, 0xac, 0x3d, 0x34, 0x83, 0x4a, 0x4c, 0xd7, 0xa2, 0x8e, 0x63, 0xe0, 0xcb, 0x0f, 0xe1, - 0x62, 0x2a, 0x6a, 0x8a, 0x0e, 0xe4, 0x83, 0xd1, 0x64, 0xce, 0xe2, 0x91, 0x2a, 0xd6, 0x69, 0x49, - 0x37, 0xc2, 0xbb, 0xf7, 0xfd, 0xa0, 0x7b, 0x31, 0xe6, 0x8e, 0x18, 0xf1, 0x7d, 0x9d, 0x26, 0x9f, - 0x88, 0x4a, 0xb3, 0xb7, 0xf6, 0x43, 0xb8, 0xc8, 0x17, 0xdf, 0xf1, 0xd8, 0x19, 0x9d, 0x84, 0xe4, - 0x58, 0x43, 0x3f, 0x90, 0x46, 0x8e, 0xad, 0xca, 0x3d, 0x8a, 0x1f, 0x50, 0x3d, 0xef, 0x24, 0x81, - 0xbc, 0x0f, 0xdf, 0xc8, 0x88, 0xad, 0x9e, 0xd2, 0x9c, 0x94, 0x65, 0xad, 0xa4, 0x2d, 0xeb, 0xb3, - 0xef, 0xa9, 0x06, 0x10, 0xf9, 0xb0, 0x62, 0x5a, 0x4f, 0x6e, 0x50, 0x25, 0xf8, 0x74, 0xde, 0x10, - 0xe9, 0x68, 0xb0, 0x58, 0x32, 0xcd, 0x8d, 0x6e, 0x1c, 0x44, 0xb6, 0x61, 0x39, 0xc8, 0x57, 0xcd, - 0x2f, 0x8e, 0x3c, 0x03, 0x54, 0x7b, 0xe4, 0x05, 0x58, 0x61, 0x2c, 0x79, 0x64, 0xcf, 0x01, 0xc2, - 0x74, 0xba, 0xf1, 0xc4, 0x18, 0x28, 0xf0, 0xc2, 0xd3, 0xc6, 0x90, 0x1c, 0xc2, 0x25, 0x34, 0xeb, - 0xf0, 0x87, 0xc1, 0x34, 0xd8, 0x5d, 0xa7, 0x7b, 0xe2, 0xf2, 0x55, 0xab, 0xa5, 0x4e, 0xc6, 0x68, - 0x64, 0x59, 0x4d, 0x69, 0x1e, 0x46, 0x23, 0xcb, 0x1f, 0x8a, 0xdf, 0x25, 0x5a, 0x9d, 0xb7, 0xa1, - 0x07, 0xdb, 0x73, 0x6a, 0x4a, 0x07, 0x87, 0x22, 0x1f, 0x1c, 0xb7, 0x41, 0x3d, 0x72, 0x7b, 0x94, - 0x27, 0x76, 0x7b, 0xd8, 0xb4, 0xb7, 0xee, 0xb1, 0x0c, 0xed, 0xe6, 0x5a, 0x00, 0xb7, 0xfc, 0xe1, - 0xc1, 0x3d, 0xfe, 0x95, 0x53, 0x71, 0xe5, 0xc9, 0x62, 0x05, 0x79, 0x05, 0xce, 0xc7, 0x02, 0x8e, - 0x84, 0x1e, 0xec, 0xe6, 0x06, 0x2d, 0x8a, 0x86, 0xa7, 0xba, 0x0e, 0x2b, 0x62, 0x55, 0x8c, 0x03, - 0x3f, 0x38, 0xb3, 0xc0, 0x61, 0x74, 0xd7, 0xf1, 0xcf, 0x4d, 0x45, 0xa7, 0x52, 0x25, 0x92, 0x33, - 0xf0, 0xd2, 0xe4, 0x65, 0x20, 0x01, 0xdf, 0x1e, 0x1c, 0x14, 0xfc, 0x83, 0x1b, 0xa2, 0x24, 0xd8, - 0xe1, 0xfc, 0xb3, 0x7f, 0x93, 0x81, 0xf3, 0x29, 0xa2, 0x0c, 0x15, 0x02, 0xbc, 0xc1, 0xc4, 0x3d, - 0x66, 0x22, 0x84, 0xdc, 0xc9, 0x75, 0x09, 0xce, 0xf5, 0x53, 0x8b, 0x2c, 0x03, 0x39, 0xff, 0x16, - 0xff, 0x45, 0x0f, 0x0f, 0x67, 0x2c, 0x54, 0x2f, 0xf4, 0x5f, 0x52, 0x85, 0x0d, 0x4c, 0xab, 0xe0, - 0x7b, 0x43, 0xcc, 0xce, 0x80, 0x4c, 0x48, 0x2e, 0x22, 0xec, 0x60, 0x2b, 0x5a, 0x12, 0x12, 0xe5, - 0x42, 0x4c, 0x75, 0x14, 0x83, 0x90, 0x8f, 0xc1, 0x65, 0xe9, 0xae, 0xb1, 0x63, 0x3b, 0x0f, 0x2d, - 0xdd, 0xcd, 0x4d, 0x27, 0xb8, 0x75, 0xca, 0x91, 0x3d, 0xb8, 0x03, 0x57, 0x71, 0x12, 0xbd, 0xde, - 0xc8, 0x4e, 0xe4, 0xe1, 0xc0, 0xae, 0xb2, 0xc0, 0xf5, 0x97, 0x29, 0x56, 0xb5, 0x37, 0x8a, 0xa5, - 0xe4, 0xa0, 0xbd, 0xe6, 0xc3, 0xf7, 0x10, 0x2e, 0xa6, 0xb6, 0x98, 0x5e, 0x30, 0x68, 0x48, 0x15, - 0xf2, 0x46, 0x4b, 0xf4, 0x37, 0x65, 0x8e, 0xae, 0xc3, 0xca, 0x23, 0xd7, 0x19, 0xbb, 0x63, 0x7e, - 0x73, 0xf3, 0x25, 0xc1, 0x60, 0xf2, 0xc5, 0xdd, 0x8b, 0x4e, 0x0d, 0xd7, 0x19, 0x91, 0x3a, 0x9c, - 0x67, 0x37, 0xa0, 0x77, 0x8a, 0xcc, 0x20, 0xd7, 0x33, 0x29, 0x11, 0x76, 0x08, 0xab, 0xe0, 0xd5, - 0x54, 0x45, 0x2c, 0x56, 0xdb, 0xdc, 0x38, 0x8e, 0x83, 0xe8, 0x8e, 0xbe, 0x94, 0x8e, 0x4d, 0x76, - 0xa0, 0xc0, 0x88, 0x33, 0xb1, 0x80, 0x3d, 0x10, 0x5c, 0x9f, 0xfb, 0x85, 0x12, 0xda, 0x17, 0xfb, - 0xc1, 0xff, 0xf4, 0xbe, 0xc6, 0xb7, 0x58, 0xfb, 0x54, 0x7e, 0xff, 0x30, 0x57, 0x10, 0xc8, 0xdf, - 0x3d, 0xb4, 0xbf, 0x55, 0x44, 0x57, 0x23, 0xc2, 0x31, 0x5d, 0x5a, 0xbe, 0x3b, 0x10, 0x6f, 0x40, - 0xcb, 0x26, 0xff, 0xf5, 0x8c, 0x4b, 0x9d, 0xbc, 0x0e, 0x2b, 0x94, 0xec, 0xf1, 0x74, 0xc0, 0x96, - 0x5c, 0x36, 0x12, 0x68, 0xa7, 0xce, 0x8a, 0xe8, 0xb4, 0x55, 0xce, 0x99, 0x85, 0xd3, 0xf0, 0x27, - 0xe5, 0x96, 0xfd, 0xd3, 0xc9, 0x48, 0x5e, 0xa8, 0x42, 0x51, 0x68, 0xd5, 0xdb, 0x2d, 0x5e, 0x25, - 0x4f, 0x71, 0x42, 0x6e, 0x79, 0x67, 0x91, 0xa9, 0x0a, 0xb5, 0x97, 0xa0, 0x20, 0xd1, 0xa6, 0x9d, - 0x61, 0x9e, 0x33, 0xa2, 0x33, 0xec, 0x17, 0x9f, 0xec, 0x47, 0x90, 0x17, 0x24, 0xa9, 0x58, 0x70, - 0x32, 0xf4, 0xc5, 0x26, 0xc7, 0xff, 0x29, 0x8c, 0x8e, 0x32, 0x76, 0x72, 0xc1, 0xc4, 0xff, 0xf1, - 0x2e, 0x99, 0x38, 0x54, 0x1e, 0xe8, 0xfb, 0xf6, 0x08, 0x2d, 0xb0, 0x02, 0xe6, 0x99, 0xc2, 0xdb, - 0x7d, 0x9f, 0xd9, 0x65, 0xf1, 0x6f, 0xfc, 0x65, 0x70, 0x09, 0xc7, 0xb4, 0x09, 0xb3, 0xce, 0xcc, - 0xc8, 0x95, 0x91, 0x49, 0x5e, 0x19, 0x2c, 0x80, 0x0a, 0xaf, 0xc9, 0xbe, 0x0c, 0x08, 0xc3, 0x2b, - 0x43, 0x3a, 0x19, 0x72, 0x91, 0x93, 0x41, 0x92, 0xc9, 0xc3, 0xd9, 0x63, 0x37, 0x8e, 0x90, 0xc9, - 0xe3, 0xe7, 0xd4, 0x9f, 0x64, 0x84, 0x8a, 0x60, 0x67, 0x38, 0x9c, 0xf8, 0x93, 0xb1, 0x33, 0x8a, - 0xa8, 0x42, 0xc9, 0x29, 0x3c, 0x87, 0x1c, 0xf4, 0x3d, 0x4c, 0x61, 0x31, 0x1c, 0x8b, 0x98, 0x1d, - 0xc1, 0xca, 0x2d, 0xdc, 0xfb, 0x50, 0x94, 0xc7, 0xd7, 0x29, 0xb6, 0x2e, 0x23, 0xd3, 0x05, 0x2b, - 0x51, 0xad, 0x9c, 0x33, 0x37, 0x19, 0xcd, 0x04, 0x16, 0xa9, 0xa4, 0x6c, 0xe2, 0xb8, 0x2e, 0x74, - 0x27, 0xdc, 0xd1, 0x51, 0xaa, 0xf2, 0x5e, 0x27, 0x9f, 0x84, 0x65, 0xaf, 0x27, 0x67, 0x6a, 0x8c, - 0x6b, 0xe1, 0xaa, 0x3d, 0x16, 0x2d, 0x3a, 0xa4, 0x41, 0xd7, 0x9c, 0xc7, 0xa1, 0x3b, 0xab, 0x11, - 0xa5, 0xb1, 0xb6, 0x23, 0xa4, 0xd1, 0x64, 0x35, 0xb2, 0x06, 0x99, 0x60, 0x86, 0x33, 0x5e, 0x8f, - 0x6d, 0xaf, 0x30, 0x5e, 0xb5, 0xc9, 0x7f, 0x69, 0xff, 0x1f, 0x6e, 0x9f, 0x75, 0x8c, 0xe8, 0x56, - 0x9c, 0x31, 0xe0, 0xcb, 0xe6, 0x86, 0x93, 0x18, 0xb7, 0xeb, 0x20, 0x87, 0xdb, 0xf5, 0xc4, 0xe1, - 0x27, 0x60, 0x9d, 0xb1, 0xa7, 0xfd, 0x45, 0x16, 0xd6, 0xa2, 0x6a, 0x72, 0xf2, 0x12, 0xe4, 0xa4, - 0x13, 0x68, 0x33, 0x45, 0x97, 0x8e, 0xe7, 0x0e, 0x22, 0x9d, 0xe9, 0xc4, 0x21, 0xf7, 0x61, 0x0d, - 0x0d, 0xf7, 0x90, 0xf5, 0x9c, 0x78, 0xfc, 0xf1, 0x65, 0xfe, 0xfb, 0x59, 0xfe, 0x07, 0xef, 0x5c, - 0x3b, 0x87, 0x4f, 0x65, 0x2b, 0xb4, 0x2e, 0xe5, 0xfe, 0x68, 0xa1, 0xa4, 0x05, 0xcd, 0xcd, 0xd6, - 0x82, 0xf2, 0xae, 0xcc, 0xd0, 0x82, 0x2e, 0xcc, 0xd1, 0x82, 0x86, 0x35, 0x65, 0x2d, 0x28, 0xea, - 0xc2, 0x97, 0x66, 0xe9, 0xc2, 0xc3, 0x3a, 0x4c, 0x17, 0x1e, 0x6a, 0x31, 0xf3, 0x33, 0xb5, 0x98, - 0x61, 0x1d, 0xae, 0xc5, 0xbc, 0xc1, 0xc7, 0x68, 0xec, 0x3c, 0xb6, 0x71, 0xf0, 0xf8, 0xb5, 0x88, - 0xbd, 0x37, 0x9d, 0xc7, 0x68, 0x5c, 0xb3, 0xb3, 0x0c, 0xc2, 0x22, 0x47, 0xfb, 0x3d, 0x25, 0xa6, - 0x09, 0x14, 0xf3, 0x77, 0x13, 0xd6, 0xd8, 0x65, 0xe5, 0xf6, 0x24, 0x59, 0x73, 0xd5, 0x5c, 0x15, - 0x50, 0x26, 0x6f, 0x7e, 0x00, 0xd6, 0x03, 0x34, 0x2e, 0x72, 0xa1, 0xa7, 0x9e, 0x19, 0xd4, 0xe6, - 0x61, 0x67, 0x5e, 0x82, 0x8d, 0x00, 0x91, 0x6b, 0x73, 0x98, 0xb8, 0xb9, 0x6a, 0xaa, 0xa2, 0xa0, - 0xc5, 0xe1, 0xda, 0x71, 0x5c, 0xf2, 0xf8, 0x39, 0xb5, 0x4a, 0xfb, 0x7e, 0x36, 0xa2, 0x25, 0x11, - 0x9f, 0xa1, 0xb7, 0xa8, 0x3f, 0xb4, 0xf9, 0x20, 0xf1, 0xb3, 0xe8, 0xfa, 0x8c, 0x39, 0xe3, 0x36, - 0x4d, 0x96, 0xd5, 0x34, 0xc1, 0xf7, 0x87, 0xc2, 0xc4, 0xc9, 0x66, 0x1c, 0x35, 0xbb, 0xf7, 0x71, - 0xcd, 0x0a, 0x72, 0xec, 0xe0, 0x29, 0xce, 0x27, 0x27, 0xc4, 0x54, 0xba, 0x64, 0x91, 0xb3, 0x0e, - 0x7e, 0x89, 0x0f, 0x74, 0x00, 0x95, 0x8a, 0x7e, 0x94, 0x78, 0x36, 0x45, 0x76, 0x4a, 0x10, 0xc7, - 0x51, 0x42, 0xca, 0xea, 0x54, 0xfc, 0x2b, 0xc8, 0x1a, 0xb0, 0x82, 0x3a, 0x0a, 0x41, 0x30, 0x97, - 0xa2, 0x82, 0x4f, 0x76, 0xbe, 0x54, 0xad, 0x9b, 0x05, 0x5a, 0x4f, 0x90, 0x39, 0x81, 0xe7, 0x64, - 0xcd, 0x42, 0xb4, 0x91, 0x0b, 0x22, 0x8a, 0xee, 0xdc, 0x11, 0x08, 0x15, 0x10, 0xd8, 0xd4, 0x4b, - 0x4e, 0x14, 0xc0, 0xd1, 0xb4, 0x13, 0xb8, 0x3c, 0x7b, 0x4a, 0xe6, 0x64, 0x68, 0x0a, 0x2f, 0xd0, - 0x8c, 0x7c, 0x81, 0xca, 0x7a, 0x86, 0x6c, 0x44, 0xcf, 0xa0, 0xfd, 0x71, 0x16, 0x5e, 0x3c, 0xc3, - 0x74, 0xcd, 0xf9, 0xe6, 0xa7, 0xa3, 0xec, 0x59, 0x26, 0x22, 0x19, 0x52, 0xa2, 0xfc, 0x80, 0xa4, - 0x52, 0x6a, 0x3a, 0x73, 0xf6, 0x25, 0x58, 0x67, 0xa7, 0x20, 0x33, 0x4b, 0x3c, 0x9a, 0xf6, 0xcf, - 0x70, 0x0c, 0x6e, 0x0b, 0x1f, 0xaa, 0x58, 0x55, 0x3c, 0x19, 0xf1, 0xc4, 0xb0, 0x02, 0x18, 0x69, - 0x43, 0x01, 0xd1, 0x8e, 0x1c, 0xaf, 0x7f, 0x26, 0x67, 0x1e, 0xe1, 0xa1, 0x25, 0x57, 0x63, 0xd6, - 0xd4, 0x14, 0xb0, 0x8b, 0xbf, 0xc9, 0x2d, 0x58, 0x1f, 0x4c, 0x4f, 0x29, 0xe3, 0xc1, 0xd6, 0x02, - 0xb7, 0xfe, 0x58, 0x30, 0x57, 0x07, 0xd3, 0x53, 0x7d, 0x34, 0xc2, 0x29, 0x45, 0x33, 0x91, 0x0d, - 0x8a, 0xc7, 0x76, 0xad, 0xc0, 0x5c, 0x44, 0x4c, 0x4a, 0x80, 0xed, 0x5b, 0x8e, 0x7b, 0x01, 0x98, - 0xd1, 0x20, 0xcf, 0x50, 0xc5, 0x7e, 0x68, 0xff, 0x95, 0x11, 0xf2, 0xee, 0xec, 0x75, 0xff, 0xcb, - 0x29, 0x4a, 0x99, 0xa2, 0xdb, 0xa0, 0xd2, 0xa1, 0x0f, 0x0f, 0x95, 0x60, 0x8e, 0xd6, 0x06, 0xd3, - 0xd3, 0x60, 0xec, 0xe4, 0x81, 0x5f, 0x94, 0x07, 0xfe, 0x75, 0x21, 0x0f, 0xa7, 0x1e, 0x0f, 0xb3, - 0x87, 0x5c, 0xfb, 0xf7, 0x2c, 0xdc, 0x3a, 0xdb, 0x21, 0xf0, 0xcb, 0x79, 0x4b, 0x99, 0xb7, 0x98, - 0xea, 0x74, 0x21, 0xa1, 0x3a, 0x4d, 0xd9, 0x7b, 0x8b, 0x69, 0x7b, 0x2f, 0xa1, 0xa8, 0x5d, 0x4a, - 0x51, 0xd4, 0xa6, 0x6e, 0xd0, 0xfc, 0x53, 0x36, 0xe8, 0xb2, 0xbc, 0x4e, 0xfe, 0x39, 0x50, 0x60, - 0x44, 0xe5, 0x81, 0x87, 0x70, 0x5e, 0xc8, 0x03, 0xec, 0xe6, 0x08, 0xf5, 0xef, 0x85, 0x7b, 0x77, - 0xd2, 0x24, 0x01, 0x44, 0x4b, 0xe1, 0xd6, 0x37, 0xb8, 0x0c, 0x10, 0x96, 0xff, 0xdf, 0xe1, 0xfe, - 0xc9, 0x03, 0xb8, 0x84, 0xf1, 0xdd, 0xbb, 0xf2, 0xcb, 0x81, 0x3d, 0x76, 0x8f, 0xf8, 0x7a, 0xb8, - 0x9e, 0xe0, 0x95, 0xbd, 0xae, 0xd4, 0x1c, 0xd3, 0x3d, 0xaa, 0x9c, 0x33, 0x2f, 0xf8, 0x29, 0xf0, - 0xb8, 0x60, 0xf1, 0x67, 0x0a, 0x68, 0x4f, 0x1f, 0x2f, 0x54, 0x54, 0xc5, 0x07, 0x7c, 0xd9, 0x2c, - 0x38, 0xd2, 0xe8, 0xbd, 0x08, 0xab, 0x63, 0xf7, 0x68, 0xec, 0xfa, 0x27, 0x11, 0x0d, 0xc8, 0x0a, - 0x07, 0x8a, 0x81, 0x11, 0x51, 0x26, 0x9f, 0x89, 0x33, 0x17, 0x95, 0xb4, 0xdd, 0x40, 0x5e, 0x4c, - 0x9d, 0x07, 0xba, 0x9a, 0xe4, 0x06, 0xb2, 0x1f, 0xf7, 0x73, 0xf9, 0x8c, 0x9a, 0x35, 0x79, 0x2c, - 0xcc, 0x23, 0xaf, 0xef, 0x6a, 0x7f, 0xa5, 0x08, 0x8e, 0x20, 0x6d, 0xf0, 0xc8, 0x43, 0xc9, 0x98, - 0x37, 0x9b, 0x60, 0x43, 0xd2, 0xaa, 0xc8, 0x76, 0x8f, 0x3c, 0x3c, 0x23, 0x02, 0x22, 0xe1, 0x19, - 0x11, 0xf2, 0x1e, 0x2c, 0x12, 0xb9, 0xd4, 0xfc, 0xa6, 0xb0, 0x08, 0xa2, 0x67, 0xde, 0xc1, 0x5d, - 0x72, 0x07, 0x96, 0x98, 0x11, 0x90, 0x68, 0xee, 0x7a, 0xa4, 0xb9, 0x07, 0x77, 0x4d, 0x51, 0xae, - 0xbd, 0x1d, 0xbc, 0x6b, 0x25, 0x3a, 0x71, 0x70, 0x97, 0xbc, 0x7e, 0x36, 0xe3, 0xdc, 0xbc, 0x30, - 0xce, 0x0d, 0x0c, 0x73, 0xdf, 0x88, 0x18, 0xe6, 0xde, 0x98, 0x3f, 0x5a, 0xfc, 0x35, 0x92, 0x85, - 0x23, 0x0c, 0xc3, 0x54, 0xfd, 0x24, 0x03, 0xcf, 0xcf, 0xad, 0x41, 0xae, 0x40, 0x5e, 0x6f, 0x55, - 0xdb, 0xe1, 0xfc, 0xd2, 0x3d, 0x23, 0x20, 0x64, 0x0f, 0x96, 0x77, 0x1c, 0xdf, 0xeb, 0xd2, 0x65, - 0x9c, 0xfa, 0x3c, 0x90, 0x20, 0x1b, 0xa0, 0x57, 0xce, 0x99, 0x61, 0x5d, 0x62, 0xc3, 0x06, 0xee, - 0x85, 0x48, 0xea, 0xa7, 0x6c, 0x8a, 0xae, 0x21, 0x41, 0x30, 0x51, 0x8d, 0x9e, 0x33, 0x09, 0x20, - 0x79, 0x04, 0xc4, 0xb2, 0x2a, 0x25, 0x77, 0x3c, 0xe1, 0x32, 0xf8, 0xc4, 0x0b, 0x2c, 0x3d, 0x3f, - 0xfc, 0x94, 0xb1, 0x4b, 0xd4, 0xab, 0x9c, 0x33, 0x53, 0xa8, 0xc5, 0xb7, 0xf9, 0x5b, 0x82, 0xdf, - 0x99, 0x3d, 0x08, 0xcf, 0x10, 0xbb, 0xf5, 0x36, 0xe4, 0x5b, 0xc2, 0x16, 0x41, 0xb2, 0x98, 0x17, - 0x76, 0x07, 0x66, 0x50, 0xaa, 0xfd, 0xa6, 0x22, 0x94, 0x0e, 0x4f, 0x1f, 0x2c, 0x29, 0x33, 0x57, - 0x6f, 0x7e, 0x66, 0xae, 0xde, 0xcf, 0x98, 0x99, 0x4b, 0xf3, 0xe0, 0xce, 0x99, 0x07, 0x96, 0x7c, - 0x1c, 0x54, 0x4c, 0x62, 0xe4, 0x48, 0x93, 0xc4, 0xf6, 0xd7, 0x46, 0x10, 0xcc, 0xbb, 0xc2, 0x33, - 0xc5, 0x99, 0xeb, 0xdd, 0x68, 0x6d, 0xed, 0x4f, 0x79, 0x10, 0xf7, 0x6a, 0xaf, 0x15, 0x53, 0x34, - 0xbf, 0x57, 0x27, 0x0b, 0x23, 0xb2, 0xd9, 0x5e, 0x94, 0x92, 0x48, 0x26, 0xbf, 0x35, 0xdb, 0xd7, - 0x42, 0xda, 0x79, 0x7f, 0x98, 0x85, 0x2b, 0xf3, 0xaa, 0xa7, 0xa6, 0xa9, 0x56, 0x9e, 0x2d, 0x4d, - 0xf5, 0x1d, 0xc8, 0x33, 0x58, 0xe0, 0x41, 0x80, 0x73, 0xcb, 0xab, 0xd2, 0xb9, 0x15, 0xc5, 0xe4, - 0x45, 0x58, 0xd4, 0x4b, 0x56, 0x98, 0x39, 0x0d, 0x4d, 0x7d, 0x9d, 0xae, 0x8f, 0x46, 0xa4, 0xbc, - 0x88, 0x7c, 0x31, 0x99, 0x2c, 0x90, 0xa7, 0x4c, 0xdb, 0x96, 0x06, 0x24, 0x91, 0x5f, 0x01, 0xdb, - 0x1b, 0xe6, 0x03, 0xe0, 0x21, 0xb6, 0xcd, 0x64, 0xe2, 0x41, 0x0d, 0x16, 0x5b, 0x63, 0xd7, 0x77, - 0x27, 0xb2, 0x19, 0xee, 0x08, 0x21, 0x26, 0x2f, 0xe1, 0x46, 0xb2, 0xce, 0x13, 0x16, 0x13, 0x61, - 0x51, 0x8e, 0x53, 0x83, 0x56, 0xb5, 0x14, 0x6c, 0x4a, 0x28, 0xb4, 0x42, 0xcd, 0x99, 0x0e, 0xba, - 0x27, 0x1d, 0xb3, 0xc6, 0x39, 0x27, 0x56, 0xa1, 0x8f, 0x50, 0xda, 0x41, 0xdf, 0x94, 0x50, 0xb4, - 0x6f, 0x29, 0x70, 0x21, 0xad, 0x1f, 0xe4, 0x0a, 0xe4, 0x06, 0xa9, 0x79, 0x11, 0x07, 0xcc, 0x95, - 0xbb, 0x40, 0xff, 0xda, 0x47, 0xc3, 0xf1, 0xa9, 0x33, 0x91, 0x8d, 0x95, 0x25, 0xb0, 0x09, 0xf4, - 0xc7, 0x2e, 0xfe, 0x4f, 0xae, 0x89, 0x2b, 0x27, 0x9b, 0xc8, 0xa4, 0x88, 0x7f, 0x34, 0x1d, 0xa0, - 0xda, 0x6b, 0x35, 0x47, 0x2c, 0xbe, 0xff, 0xab, 0x90, 0xa3, 0xcd, 0x8a, 0xad, 0x5e, 0xba, 0x7e, - 0xf4, 0x7a, 0x8d, 0x23, 0xb1, 0x56, 0xf9, 0xce, 0x69, 0xdf, 0x44, 0x64, 0xed, 0x10, 0xd6, 0xa2, - 0x18, 0xc4, 0x88, 0x46, 0x84, 0x2d, 0xdc, 0x53, 0x39, 0xa5, 0x9d, 0xe1, 0x90, 0x39, 0xcc, 0xec, - 0x3c, 0xf7, 0x93, 0x77, 0xae, 0x01, 0xfd, 0xc9, 0xea, 0xa4, 0x45, 0x8c, 0xd5, 0xbe, 0x9d, 0x81, - 0x0b, 0xa1, 0x8f, 0xbe, 0xd8, 0x43, 0xbf, 0xb0, 0x0e, 0xa3, 0x7a, 0xc4, 0xa1, 0x51, 0xf0, 0x8d, - 0xc9, 0x0e, 0xce, 0xf1, 0xa3, 0xda, 0x83, 0xad, 0x59, 0xf8, 0xe4, 0x25, 0x58, 0xc6, 0xb0, 0x4e, - 0x23, 0xa7, 0xeb, 0xca, 0xc7, 0xec, 0x40, 0x00, 0xcd, 0xb0, 0x5c, 0xfb, 0x91, 0x02, 0x97, 0xb9, - 0x9b, 0x47, 0xdd, 0xf1, 0x06, 0xf8, 0x4a, 0xd0, 0x75, 0xdf, 0x1f, 0x87, 0xe7, 0xbd, 0xc8, 0x39, - 0x76, 0x33, 0xea, 0xcd, 0x93, 0xf8, 0xda, 0xec, 0xde, 0x92, 0x3b, 0x18, 0xaa, 0x8c, 0xbf, 0xa2, - 0xe7, 0x58, 0x80, 0x89, 0x01, 0x05, 0xc8, 0x01, 0x26, 0x10, 0x43, 0xfb, 0x15, 0xb8, 0x3a, 0xff, - 0x03, 0xe4, 0x0b, 0xb0, 0x8a, 0xb9, 0xaf, 0x3a, 0xa3, 0xe3, 0xb1, 0xd3, 0x73, 0x85, 0x66, 0x4f, - 0x68, 0x63, 0xe5, 0x32, 0x16, 0x79, 0x8d, 0x07, 0x3c, 0x38, 0xc6, 0xac, 0x5a, 0xbc, 0x52, 0xc4, - 0x97, 0x4a, 0xa6, 0xa6, 0xfd, 0xaa, 0x02, 0x24, 0x49, 0x83, 0x7c, 0x04, 0x56, 0x3a, 0xed, 0x92, - 0x35, 0x71, 0xc6, 0x93, 0xca, 0x70, 0x3a, 0xe6, 0x61, 0xcf, 0x98, 0xff, 0xfb, 0xa4, 0x6b, 0xb3, - 0xf7, 0xa0, 0x93, 0xe1, 0x74, 0x6c, 0x46, 0xf0, 0x30, 0x69, 0x93, 0xeb, 0x7e, 0xa5, 0xe7, 0x3c, - 0x89, 0x26, 0x6d, 0xe2, 0xb0, 0x48, 0xd2, 0x26, 0x0e, 0xd3, 0xbe, 0xa7, 0xc0, 0xb6, 0x30, 0x8e, - 0xec, 0xa5, 0xb4, 0xa5, 0x84, 0x51, 0x5e, 0xc6, 0x22, 0xce, 0xee, 0x3c, 0x0e, 0x7d, 0x43, 0x04, - 0x42, 0xc2, 0x06, 0x22, 0xab, 0xce, 0xea, 0x92, 0x4f, 0x43, 0xce, 0x9a, 0x0c, 0x47, 0x67, 0x88, - 0x84, 0xa4, 0x06, 0x33, 0x3a, 0x19, 0x8e, 0x90, 0x04, 0xd6, 0xd4, 0x5c, 0xb8, 0x20, 0x37, 0x4e, - 0xb4, 0x98, 0xd4, 0x61, 0x89, 0x87, 0xbc, 0x8b, 0xd9, 0x1d, 0xcc, 0xe9, 0xd3, 0xce, 0xba, 0x08, - 0xb7, 0xc4, 0xe3, 0xbc, 0x9a, 0x82, 0x86, 0xf6, 0xdb, 0x0a, 0x14, 0x28, 0x63, 0x83, 0x42, 0xe9, - 0x7b, 0x5d, 0xd2, 0x51, 0x3e, 0x58, 0x98, 0xd1, 0x04, 0xe4, 0xcf, 0x74, 0x1b, 0xbf, 0x06, 0xeb, - 0xb1, 0x0a, 0x44, 0xc3, 0x40, 0x1b, 0x7d, 0xaf, 0xeb, 0xb0, 0x1c, 0x30, 0xcc, 0x04, 0x25, 0x02, - 0xd3, 0x7e, 0x5d, 0x81, 0x0b, 0xcd, 0xaf, 0x4c, 0x1c, 0xf6, 0x6c, 0x6b, 0x4e, 0xfb, 0x62, 0xbf, - 0x53, 0x66, 0x4d, 0x58, 0xd9, 0xb2, 0x20, 0x00, 0x8c, 0x59, 0xe3, 0x30, 0x33, 0x28, 0x25, 0x15, - 0xc8, 0xf3, 0xfb, 0xc5, 0xe7, 0xe1, 0x59, 0xaf, 0x4a, 0xba, 0x91, 0x90, 0x30, 0x47, 0xa2, 0x3d, - 0xc1, 0x23, 0x8c, 0xd7, 0x31, 0x83, 0xda, 0xda, 0x7f, 0x28, 0xb0, 0x39, 0xa3, 0x0e, 0xf9, 0x04, - 0x2c, 0xa0, 0x83, 0x22, 0x9f, 0xbd, 0x2b, 0x33, 0x3e, 0x31, 0xe9, 0x9e, 0x1c, 0xdc, 0x65, 0x17, - 0xd1, 0x29, 0xfd, 0x61, 0xb2, 0x5a, 0xe4, 0x21, 0x2c, 0xeb, 0xbd, 0x1e, 0x97, 0xce, 0x32, 0x11, - 0xe9, 0x6c, 0xc6, 0x17, 0x5f, 0x09, 0xf0, 0x99, 0x74, 0xc6, 0x5c, 0x65, 0x7a, 0x3d, 0x9b, 0x3b, - 0x5f, 0x86, 0xf4, 0x2e, 0x7f, 0x1c, 0xd6, 0xa2, 0xc8, 0xcf, 0xe4, 0x2f, 0xf6, 0xb6, 0x02, 0x6a, - 0xb4, 0x0d, 0x3f, 0x9f, 0x40, 0x51, 0x69, 0xd3, 0xfc, 0x94, 0x45, 0xf5, 0xbb, 0x19, 0xb8, 0x98, - 0x3a, 0xc2, 0xe4, 0x65, 0x58, 0xd4, 0x47, 0xa3, 0x6a, 0x99, 0xaf, 0x2a, 0xce, 0x21, 0xa1, 0xd2, - 0x3b, 0x22, 0xbc, 0x32, 0x24, 0xf2, 0x2a, 0xe4, 0x99, 0x75, 0x40, 0x59, 0x1c, 0x38, 0x18, 0xf9, - 0x86, 0x9b, 0x2e, 0x44, 0x03, 0xa5, 0x0a, 0x44, 0xb2, 0x0b, 0x6b, 0x3c, 0x66, 0x8c, 0xe9, 0x1e, - 0xbb, 0x5f, 0x0b, 0x22, 0xf6, 0x63, 0x52, 0x01, 0xa1, 0x49, 0xb7, 0xc7, 0xac, 0x4c, 0x8e, 0x9a, - 0x12, 0xad, 0x45, 0x6a, 0xa0, 0x22, 0x4d, 0x99, 0x12, 0x8b, 0xd6, 0x8a, 0x51, 0x7c, 0x58, 0x23, - 0x66, 0xd0, 0x4a, 0xd4, 0x0c, 0xa6, 0x4b, 0xf7, 0x7d, 0xef, 0x78, 0x70, 0xea, 0x0e, 0x26, 0x3f, - 0xbf, 0xe9, 0x0a, 0xbf, 0x71, 0xa6, 0xe9, 0xfa, 0xfd, 0x1c, 0xdb, 0xcc, 0xf1, 0x6a, 0x94, 0xa3, - 0x91, 0x02, 0x74, 0x23, 0x47, 0x43, 0xe5, 0x33, 0x1e, 0x15, 0xa5, 0x0c, 0x4b, 0x2c, 0x5a, 0x8d, - 0xd8, 0x19, 0xcf, 0xa7, 0x36, 0x81, 0xe1, 0x1c, 0xdc, 0x65, 0xec, 0x0b, 0xf3, 0x94, 0xf4, 0x4d, - 0x51, 0x95, 0x1c, 0x40, 0xa1, 0xd4, 0x77, 0x9d, 0xc1, 0x74, 0xd4, 0x3e, 0xdb, 0x0b, 0xea, 0x16, - 0xef, 0xcb, 0x4a, 0x97, 0x55, 0xc3, 0x97, 0x57, 0x3c, 0xc9, 0x65, 0x42, 0xa4, 0x1d, 0x38, 0x4f, - 0xe5, 0x50, 0xf1, 0xfa, 0xe1, 0x39, 0xe3, 0x13, 0x07, 0x62, 0xbd, 0xa8, 0x67, 0x20, 0xf7, 0xae, - 0xb2, 0x61, 0xad, 0xe6, 0xf8, 0x93, 0xf6, 0xd8, 0x19, 0xf8, 0x18, 0xe5, 0xf2, 0x0c, 0x51, 0xc0, - 0xb6, 0x45, 0x06, 0x65, 0x54, 0x99, 0x4e, 0x82, 0xaa, 0x4c, 0x21, 0x1b, 0x25, 0x47, 0xf9, 0xa5, - 0x5d, 0x6f, 0xe0, 0xf4, 0xbd, 0xaf, 0x0b, 0x1f, 0x53, 0xc6, 0x2f, 0x1d, 0x09, 0xa0, 0x19, 0x96, - 0x6b, 0x9f, 0x4f, 0xcc, 0x1b, 0x6b, 0x65, 0x01, 0x96, 0x78, 0x04, 0x02, 0xe6, 0x91, 0xdf, 0x32, - 0x1a, 0xe5, 0x6a, 0x63, 0x4f, 0x55, 0xc8, 0x1a, 0x40, 0xcb, 0x6c, 0x96, 0x0c, 0xcb, 0xa2, 0xbf, - 0x33, 0xf4, 0x37, 0x77, 0xd7, 0xdf, 0xed, 0xd4, 0xd4, 0xac, 0xe4, 0xb1, 0x9f, 0xd3, 0x7e, 0xa8, - 0xc0, 0xa5, 0xf4, 0xa9, 0x24, 0x6d, 0xc0, 0x98, 0x0d, 0xfc, 0x2d, 0xfd, 0x23, 0x73, 0xe7, 0x3d, - 0x15, 0x1c, 0x8f, 0xfd, 0x30, 0x61, 0x31, 0x05, 0x32, 0xe2, 0xed, 0x8b, 0x39, 0x29, 0x7a, 0x3d, - 0x33, 0xe3, 0xf5, 0xb4, 0x12, 0x6c, 0xcd, 0xa2, 0x11, 0xed, 0xea, 0x3a, 0x14, 0xf4, 0x56, 0xab, - 0x56, 0x2d, 0xe9, 0xed, 0x6a, 0xb3, 0xa1, 0x2a, 0x64, 0x19, 0x16, 0xf6, 0xcc, 0x66, 0xa7, 0xa5, - 0x66, 0xb4, 0xef, 0x28, 0xb0, 0x5a, 0x0d, 0xad, 0xce, 0xde, 0xeb, 0xe6, 0xfb, 0x68, 0x64, 0xf3, - 0x6d, 0x05, 0xd1, 0x4d, 0x82, 0x0f, 0x9c, 0x69, 0xe7, 0xbd, 0x9b, 0x81, 0x8d, 0x44, 0x1d, 0x62, - 0xc1, 0x92, 0x7e, 0x68, 0x35, 0xab, 0xe5, 0x12, 0x6f, 0xd9, 0xb5, 0xd0, 0x5c, 0x0a, 0x13, 0x58, - 0x25, 0xbe, 0xc2, 0x3c, 0x82, 0x1f, 0xfb, 0xf6, 0xd0, 0xeb, 0x49, 0xc9, 0x67, 0x2b, 0xe7, 0x4c, - 0x41, 0x09, 0x6f, 0xb2, 0xaf, 0x4f, 0xc7, 0x2e, 0x92, 0xcd, 0x44, 0xf4, 0xba, 0x01, 0x3c, 0x49, - 0x18, 0xfd, 0x37, 0x1c, 0x5a, 0x9e, 0x24, 0x1d, 0xd2, 0x23, 0x0d, 0x58, 0xdc, 0xf3, 0x26, 0x95, - 0xe9, 0x23, 0xbe, 0x7f, 0xaf, 0x86, 0xe9, 0x8c, 0x2a, 0xd3, 0x47, 0x49, 0xb2, 0xa8, 0xb2, 0x64, - 0xd1, 0x7b, 0x22, 0x24, 0x39, 0x95, 0xb8, 0x13, 0x63, 0xee, 0x99, 0x9c, 0x18, 0x77, 0x56, 0xa1, - 0xc0, 0x65, 0x28, 0x14, 0x4f, 0xbe, 0xaf, 0xc0, 0xd6, 0xac, 0x91, 0xa3, 0x62, 0x59, 0x34, 0x58, - 0xc1, 0xa5, 0x20, 0x3d, 0x46, 0x34, 0x4a, 0x81, 0x40, 0x23, 0x9f, 0x82, 0x42, 0xd5, 0xf7, 0xa7, - 0xee, 0xd8, 0x7a, 0xb5, 0x63, 0x56, 0xf9, 0x72, 0x7d, 0xfe, 0x5f, 0xdf, 0xb9, 0xb6, 0x89, 0x3e, - 0x1f, 0x63, 0xdb, 0x7f, 0xd5, 0x9e, 0x8e, 0xbd, 0x48, 0x2a, 0x01, 0xb9, 0x06, 0xe5, 0xa2, 0x9d, - 0x69, 0xcf, 0x73, 0x85, 0x0c, 0x21, 0x1c, 0xba, 0x39, 0x4c, 0xbe, 0xd3, 0x04, 0x4c, 0xfb, 0xa6, - 0x02, 0x97, 0x67, 0x4f, 0x13, 0xbd, 0x27, 0xdb, 0xcc, 0xa4, 0x4a, 0xb8, 0x54, 0xe3, 0x3d, 0x19, - 0xd8, 0x5d, 0xc9, 0x34, 0x05, 0x22, 0xad, 0x14, 0xa4, 0xa6, 0xcf, 0x24, 0xf2, 0x51, 0x47, 0x2b, - 0x09, 0x44, 0xed, 0x01, 0x6c, 0xce, 0x98, 0x54, 0xf2, 0xc9, 0xd4, 0xa4, 0x3b, 0xe8, 0xa6, 0x24, - 0x27, 0xdd, 0x89, 0xa4, 0x63, 0x93, 0xe0, 0xda, 0xbf, 0x65, 0xe0, 0x12, 0xdd, 0x5d, 0x7d, 0xd7, - 0xf7, 0xf5, 0xe9, 0xe4, 0x84, 0x4e, 0x27, 0xe3, 0x37, 0xc9, 0xeb, 0xb0, 0x78, 0xf2, 0x6c, 0xaa, - 0x62, 0x86, 0x4e, 0x08, 0xe0, 0x8d, 0x25, 0x9c, 0x63, 0xe8, 0xff, 0xe4, 0x3a, 0xc8, 0xc9, 0xc5, - 0xb3, 0x18, 0xde, 0x34, 0xb3, 0xa5, 0x98, 0xcb, 0xa3, 0x20, 0x0f, 0xf0, 0x1b, 0xb0, 0x80, 0xfa, - 0x14, 0x7e, 0x77, 0x08, 0x9e, 0x3f, 0xbd, 0x75, 0xa8, 0x6d, 0x31, 0x59, 0x05, 0xf2, 0x21, 0x80, - 0x30, 0x33, 0x04, 0xbf, 0x1c, 0x84, 0x9e, 0x21, 0x48, 0x0e, 0x61, 0x2e, 0x9f, 0x1e, 0x39, 0x3c, - 0xdd, 0x42, 0x11, 0x36, 0xc4, 0x88, 0x8f, 0x44, 0x54, 0x44, 0xfe, 0x8a, 0xb9, 0xce, 0x0a, 0xaa, - 0x23, 0x11, 0x19, 0xf1, 0x46, 0x22, 0x41, 0x32, 0x06, 0x47, 0x8e, 0x65, 0x41, 0xbe, 0x91, 0xc8, - 0x82, 0x9c, 0x67, 0x58, 0x72, 0xaa, 0x63, 0xed, 0x9f, 0x32, 0xb0, 0x7c, 0x48, 0xb9, 0x32, 0xd4, - 0x35, 0xcc, 0xd7, 0x5d, 0xdc, 0x83, 0x42, 0x6d, 0xe8, 0xf0, 0xe7, 0x22, 0xee, 0x53, 0xc2, 0x7c, - 0xba, 0xfb, 0x43, 0x47, 0xbc, 0x3c, 0xf9, 0xa6, 0x8c, 0xf4, 0x14, 0x7f, 0xf4, 0xfb, 0xb0, 0xc8, - 0x9e, 0xef, 0xb8, 0x1a, 0x4d, 0xf0, 0xe5, 0x41, 0x8b, 0x5e, 0x61, 0xc5, 0xd2, 0x0b, 0x07, 0x7b, - 0x02, 0x94, 0x99, 0x44, 0x1e, 0xe3, 0x55, 0xd2, 0xac, 0x2c, 0x9c, 0x4d, 0xb3, 0x22, 0xc5, 0xb2, - 0x5b, 0x3c, 0x4b, 0x2c, 0xbb, 0xcb, 0x6f, 0x42, 0x41, 0x6a, 0xcf, 0x33, 0xb1, 0xe9, 0xdf, 0xc8, - 0xc0, 0x2a, 0xf6, 0x2a, 0xb0, 0xe5, 0xf9, 0xc5, 0xd4, 0x13, 0x7d, 0x34, 0xa2, 0x27, 0xda, 0x92, - 0xe7, 0x8b, 0xf5, 0x6c, 0x8e, 0x82, 0xe8, 0x3e, 0x6c, 0x24, 0x10, 0xc9, 0x6b, 0xb0, 0x40, 0x9b, - 0x2f, 0xe4, 0x6a, 0x35, 0xbe, 0x02, 0xc2, 0xb8, 0xc7, 0xb4, 0xe3, 0xbe, 0xc9, 0xb0, 0xb5, 0xff, - 0x54, 0x60, 0x85, 0xa7, 0x1d, 0x19, 0x1c, 0x0d, 0x9f, 0x3a, 0x9c, 0xb7, 0xe2, 0xc3, 0xc9, 0xa2, - 0xab, 0xf0, 0xe1, 0xfc, 0x9f, 0x1e, 0xc4, 0x37, 0x23, 0x83, 0xb8, 0x19, 0x44, 0x41, 0x14, 0xdd, - 0x99, 0x33, 0x86, 0x7f, 0x8d, 0x71, 0x81, 0xa3, 0x88, 0xe4, 0x8b, 0xb0, 0xdc, 0x70, 0x1f, 0x47, - 0xc4, 0xd3, 0x5b, 0x33, 0x88, 0xbe, 0x12, 0x20, 0xb2, 0x3d, 0x85, 0x37, 0xfb, 0xc0, 0x7d, 0x6c, - 0x27, 0x5e, 0x0e, 0x43, 0x92, 0x54, 0x42, 0x8d, 0x56, 0x7b, 0x96, 0xa5, 0xcf, 0x1d, 0x5c, 0x31, - 0x60, 0xd0, 0xb7, 0xb2, 0x00, 0xa1, 0x6f, 0x20, 0xdd, 0x80, 0x11, 0xa3, 0x09, 0xa1, 0xd9, 0x47, - 0x90, 0xbc, 0xc6, 0x85, 0x2d, 0xc5, 0x2d, 0xae, 0x81, 0xce, 0xcc, 0x8e, 0x52, 0x89, 0xba, 0xe8, - 0x12, 0x77, 0x46, 0xeb, 0xb9, 0x7d, 0x87, 0x9d, 0xed, 0xd9, 0x9d, 0x1b, 0x18, 0x94, 0x38, 0x80, - 0xce, 0xc8, 0x1f, 0x8d, 0x2e, 0x6b, 0x65, 0x8a, 0x90, 0xf0, 0xb7, 0xcd, 0x3d, 0x9b, 0xbf, 0x6d, - 0x0b, 0x96, 0xbd, 0xc1, 0x5b, 0xee, 0x60, 0x32, 0x1c, 0x3f, 0x41, 0xb5, 0x7b, 0xa8, 0xcf, 0xa3, - 0x43, 0x50, 0x15, 0x65, 0x6c, 0x1e, 0xf0, 0xce, 0x0d, 0xf0, 0xe5, 0x69, 0x08, 0x80, 0x81, 0xbf, - 0xf0, 0x82, 0xba, 0x78, 0x3f, 0x97, 0x5f, 0x54, 0x97, 0xee, 0xe7, 0xf2, 0x79, 0x75, 0xf9, 0x7e, - 0x2e, 0xbf, 0xac, 0x82, 0x29, 0xbd, 0x99, 0x05, 0x6f, 0x62, 0xd2, 0x33, 0x56, 0xf4, 0x89, 0x4a, - 0xfb, 0x69, 0x06, 0x48, 0xb2, 0x19, 0xe4, 0xa3, 0x50, 0x60, 0x07, 0xac, 0x3d, 0xf6, 0xbf, 0xca, - 0xdd, 0x0d, 0x58, 0xd8, 0x25, 0x09, 0x2c, 0x87, 0x5d, 0x62, 0x60, 0xd3, 0xff, 0x6a, 0x9f, 0x7c, - 0x01, 0xce, 0xe3, 0xf0, 0x8e, 0xdc, 0xb1, 0x37, 0xec, 0xd9, 0x18, 0x23, 0xd7, 0xe9, 0xf3, 0x5c, - 0x8f, 0x2f, 0x63, 0x52, 0xe2, 0x64, 0xf1, 0x8c, 0x69, 0x40, 0x17, 0xc0, 0x16, 0x62, 0xb6, 0x18, - 0x22, 0x69, 0x83, 0x2a, 0xd7, 0x3f, 0x9a, 0xf6, 0xfb, 0x7c, 0x66, 0x8b, 0x54, 0xa2, 0x8f, 0x97, - 0xcd, 0x20, 0xbc, 0x16, 0x12, 0xde, 0x9d, 0xf6, 0xfb, 0xe4, 0x75, 0x80, 0xe1, 0xc0, 0x3e, 0xf5, - 0x7c, 0x9f, 0x3d, 0xe6, 0x04, 0xde, 0xca, 0x21, 0x54, 0x9e, 0x8c, 0xe1, 0xa0, 0xce, 0x80, 0xe4, - 0xff, 0x01, 0x46, 0x6b, 0xc0, 0x30, 0x26, 0xcc, 0x1a, 0x89, 0x67, 0x6f, 0x11, 0xc0, 0xa8, 0x73, - 0xf4, 0xb1, 0x6b, 0x79, 0x5f, 0x17, 0xae, 0x1e, 0x9f, 0x83, 0x0d, 0x6e, 0x3c, 0x7c, 0xe8, 0x4d, - 0x4e, 0xb8, 0x28, 0xf1, 0x5e, 0xe4, 0x10, 0x49, 0x96, 0xf8, 0xbb, 0x1c, 0x80, 0x7e, 0x68, 0x89, - 0x08, 0x61, 0x77, 0x60, 0x81, 0x0a, 0x48, 0x42, 0xd1, 0x82, 0x6a, 0x6a, 0xa4, 0x2b, 0xab, 0xa9, - 0x11, 0x83, 0xee, 0x46, 0x13, 0x8d, 0xea, 0x85, 0x92, 0x05, 0x77, 0x23, 0xb3, 0xb3, 0x8f, 0x44, - 0x68, 0xe6, 0x58, 0xa4, 0x06, 0x10, 0xc6, 0xec, 0xe2, 0x2c, 0xff, 0x46, 0x18, 0xfc, 0x86, 0x17, - 0xf0, 0x2c, 0x11, 0x61, 0xdc, 0x2f, 0x79, 0xf9, 0x84, 0x68, 0x64, 0x1f, 0x72, 0x6d, 0x27, 0xf0, - 0xc5, 0x9d, 0x11, 0xc9, 0xec, 0x05, 0x9e, 0x8b, 0x33, 0x8c, 0x66, 0xb6, 0x36, 0x71, 0x22, 0x29, - 0x8b, 0x91, 0x08, 0x31, 0x60, 0x91, 0xe7, 0x59, 0x9f, 0x11, 0x01, 0x93, 0xa7, 0x59, 0xe7, 0x71, - 0xaf, 0x11, 0x28, 0xf3, 0x14, 0x3c, 0xa3, 0xfa, 0x3d, 0xc8, 0x5a, 0x56, 0x9d, 0xc7, 0xef, 0x58, - 0x0d, 0xc5, 0x2f, 0xcb, 0xaa, 0xb3, 0x77, 0x5f, 0xdf, 0x3f, 0x95, 0xaa, 0x51, 0x64, 0xf2, 0x31, - 0x28, 0x48, 0x4c, 0x31, 0x8f, 0x7c, 0x83, 0x63, 0x20, 0x79, 0x3b, 0xc9, 0x87, 0x86, 0x84, 0x4d, - 0x6a, 0xa0, 0xee, 0x4f, 0x1f, 0xb9, 0xfa, 0x68, 0x84, 0x6e, 0x90, 0x6f, 0xb9, 0x63, 0xc6, 0xb6, - 0xe5, 0xc3, 0x90, 0xd1, 0xe8, 0x23, 0xd1, 0x13, 0xa5, 0xb2, 0xb2, 0x29, 0x5e, 0x93, 0xb4, 0x60, - 0xc3, 0x72, 0x27, 0xd3, 0x11, 0xb3, 0xaf, 0xd9, 0x1d, 0x8e, 0xa9, 0x7c, 0xc3, 0xe2, 0xe4, 0x60, - 0x74, 0x5d, 0x9f, 0x16, 0x0a, 0xa3, 0xa6, 0xa3, 0xe1, 0x38, 0x26, 0xeb, 0x24, 0x2b, 0x6b, 0xae, - 0x3c, 0xe5, 0xf4, 0x56, 0x8d, 0x4a, 0x4d, 0x78, 0xab, 0x0a, 0xa9, 0x29, 0x94, 0x95, 0x3e, 0x94, - 0x12, 0xcb, 0x0d, 0x5f, 0x06, 0xa5, 0x58, 0x6e, 0x91, 0x08, 0x6e, 0xdf, 0xcb, 0x49, 0xe1, 0x44, - 0xf9, 0x5c, 0x7c, 0x02, 0xe0, 0xfe, 0xd0, 0x1b, 0xd4, 0xdd, 0xc9, 0xc9, 0xb0, 0x27, 0x85, 0x94, - 0x2b, 0x7c, 0x79, 0xe8, 0x0d, 0xec, 0x53, 0x04, 0xff, 0xf4, 0x9d, 0x6b, 0x12, 0x92, 0x29, 0xfd, - 0x4f, 0x3e, 0x08, 0xcb, 0xf4, 0x57, 0x3b, 0xb4, 0x12, 0x62, 0x3a, 0x59, 0xac, 0xcd, 0x92, 0x6e, - 0x84, 0x08, 0xe4, 0x4d, 0x4c, 0x33, 0xe3, 0x8d, 0x26, 0x12, 0xf3, 0x2a, 0x72, 0xca, 0x78, 0xa3, - 0x49, 0x3c, 0x42, 0xb4, 0x84, 0x4c, 0x2a, 0x41, 0xd3, 0x45, 0x66, 0x28, 0x9e, 0xcd, 0x06, 0x15, - 0x8f, 0x7c, 0xad, 0xd9, 0x22, 0x34, 0xad, 0x9c, 0xc3, 0x37, 0x56, 0x0d, 0x1b, 0x61, 0x55, 0xca, - 0xec, 0xa5, 0x88, 0x33, 0xb5, 0xac, 0x11, 0xfe, 0x49, 0xcf, 0xee, 0x22, 0x38, 0xd2, 0x88, 0x00, - 0x99, 0xec, 0xc0, 0x3a, 0xe3, 0xf1, 0x83, 0x0c, 0x93, 0x9c, 0xc5, 0xc5, 0xb3, 0x2d, 0x4c, 0x41, - 0x29, 0x7f, 0x3e, 0x56, 0x81, 0xec, 0xc2, 0x02, 0xca, 0x9a, 0xdc, 0x35, 0x60, 0x5b, 0x56, 0x13, - 0xc4, 0xf7, 0x11, 0x9e, 0x2b, 0xa8, 0x20, 0x90, 0xcf, 0x15, 0x44, 0x25, 0x9f, 0x05, 0x30, 0x06, - 0xe3, 0x61, 0xbf, 0x8f, 0xc1, 0x93, 0xf3, 0x28, 0x4a, 0x3d, 0x1f, 0xdd, 0x8f, 0x48, 0x25, 0x44, - 0xe2, 0x81, 0xfe, 0xf0, 0xb7, 0x1d, 0x0b, 0xb1, 0x2c, 0xd1, 0xd2, 0xaa, 0xb0, 0xc8, 0x36, 0x23, - 0x06, 0x22, 0xe7, 0xa9, 0x55, 0xa4, 0x30, 0xd6, 0x2c, 0x10, 0x39, 0x87, 0x27, 0x03, 0x91, 0x4b, - 0x15, 0xb4, 0x7d, 0xb8, 0x90, 0xd6, 0xb1, 0x88, 0x74, 0xac, 0x9c, 0x55, 0x3a, 0xfe, 0x6e, 0x16, - 0x56, 0x90, 0x9a, 0x38, 0x85, 0x75, 0x58, 0xb5, 0xa6, 0x8f, 0x82, 0x28, 0x5d, 0xe2, 0x34, 0xc6, - 0xf6, 0xf9, 0x72, 0x81, 0xfc, 0x86, 0x17, 0xa9, 0x41, 0x0c, 0x58, 0x13, 0x37, 0xc1, 0x9e, 0xf0, - 0x1c, 0x08, 0x62, 0x80, 0x8b, 0x48, 0x93, 0xc9, 0x0c, 0xbb, 0xb1, 0x4a, 0xe1, 0x7d, 0x90, 0x7d, - 0x96, 0xfb, 0x20, 0x77, 0xa6, 0xfb, 0xe0, 0x21, 0xac, 0x88, 0xaf, 0xe1, 0x49, 0xbe, 0xf0, 0xde, - 0x4e, 0xf2, 0x08, 0x31, 0x52, 0x0b, 0x4e, 0xf4, 0xc5, 0xb9, 0x27, 0x3a, 0x3e, 0x8c, 0x8a, 0x5d, - 0x36, 0x42, 0x58, 0xf2, 0x60, 0xc7, 0x14, 0x94, 0x7b, 0xa5, 0xd6, 0xcf, 0x70, 0x4b, 0xbe, 0x06, - 0xcb, 0xb5, 0xa1, 0x78, 0x13, 0x93, 0x1e, 0x23, 0xfa, 0x02, 0x28, 0xb3, 0x0b, 0x01, 0x66, 0x70, - 0xbb, 0x65, 0xdf, 0x8f, 0xdb, 0xed, 0x4d, 0x00, 0xee, 0x92, 0x12, 0xa6, 0x8e, 0xc3, 0x2d, 0x23, - 0x22, 0x94, 0x44, 0xdf, 0x44, 0x24, 0x64, 0x7a, 0x3a, 0x71, 0x73, 0x1b, 0xbd, 0xdb, 0x1d, 0x4e, - 0x07, 0x93, 0x48, 0xae, 0x65, 0xe1, 0xc1, 0xea, 0xf0, 0x32, 0xf9, 0x78, 0x88, 0x55, 0x7b, 0x7f, - 0x27, 0x84, 0x7c, 0x26, 0x30, 0x7e, 0x5c, 0x9a, 0x37, 0x42, 0x5a, 0x62, 0x84, 0x66, 0x9a, 0x3c, - 0x6a, 0x3f, 0x54, 0xe4, 0x04, 0x0c, 0x3f, 0xc3, 0x54, 0xbf, 0x01, 0x10, 0x18, 0x25, 0x88, 0xb9, - 0x66, 0xf2, 0x52, 0x00, 0x95, 0x47, 0x39, 0xc4, 0x95, 0x7a, 0x93, 0x7d, 0xbf, 0x7a, 0xd3, 0x86, - 0x42, 0xf3, 0x2b, 0x13, 0x27, 0xb4, 0x62, 0x01, 0x2b, 0xe0, 0x64, 0xf1, 0x64, 0xca, 0xee, 0xdc, - 0xc4, 0xbb, 0x21, 0xe4, 0x83, 0x67, 0xb0, 0xc0, 0x52, 0x45, 0xed, 0xcf, 0x15, 0x58, 0x97, 0xdd, - 0xee, 0x9f, 0x0c, 0xba, 0xe4, 0x93, 0x2c, 0x1e, 0xac, 0x12, 0x11, 0x59, 0x24, 0x24, 0x7a, 0xe4, - 0x3e, 0x19, 0x74, 0x19, 0x03, 0xe4, 0x3c, 0x96, 0x1b, 0x4b, 0x2b, 0x92, 0x47, 0xb0, 0xd2, 0x1a, - 0xf6, 0xfb, 0x94, 0xad, 0x19, 0xbf, 0xc5, 0x05, 0x00, 0x4a, 0x28, 0xfe, 0x34, 0x22, 0x1a, 0xb4, - 0xf3, 0x22, 0x97, 0x73, 0x37, 0x47, 0xf4, 0xbc, 0xf7, 0x78, 0xbd, 0x90, 0xec, 0xdb, 0xe8, 0x27, - 0x27, 0xd3, 0xd4, 0x7e, 0xac, 0x00, 0x49, 0x36, 0x49, 0x3e, 0xb2, 0x94, 0xff, 0x05, 0x16, 0x36, - 0xc6, 0xfa, 0xe5, 0x9e, 0x85, 0xf5, 0x2b, 0xfe, 0x8e, 0x02, 0xeb, 0x55, 0xbd, 0xce, 0x53, 0x32, - 0xb0, 0x17, 0x9c, 0xeb, 0xf0, 0x7c, 0x55, 0xaf, 0xdb, 0xad, 0x66, 0xad, 0x5a, 0x7a, 0x60, 0xa7, - 0x46, 0x5a, 0x7e, 0x1e, 0x9e, 0x4b, 0xa2, 0x84, 0x2f, 0x3d, 0x57, 0x60, 0x2b, 0x59, 0x2c, 0xa2, - 0x31, 0xa7, 0x57, 0x16, 0x81, 0x9b, 0xb3, 0xc5, 0x4f, 0xc1, 0xba, 0x88, 0x3c, 0xdc, 0xae, 0x59, - 0x98, 0xdb, 0x60, 0x1d, 0x0a, 0x07, 0x86, 0x59, 0xdd, 0x7d, 0x60, 0xef, 0x76, 0x6a, 0x35, 0xf5, - 0x1c, 0x59, 0x85, 0x65, 0x0e, 0x28, 0xe9, 0xaa, 0x42, 0x56, 0x20, 0x5f, 0x6d, 0x58, 0x46, 0xa9, - 0x63, 0x1a, 0x6a, 0xa6, 0xf8, 0x29, 0x58, 0x6b, 0x8d, 0xbd, 0xb7, 0x9c, 0x89, 0xbb, 0xef, 0x3e, - 0xc1, 0x87, 0x9a, 0x25, 0xc8, 0x9a, 0xfa, 0xa1, 0x7a, 0x8e, 0x00, 0x2c, 0xb6, 0xf6, 0x4b, 0xd6, - 0xdd, 0xbb, 0xaa, 0x42, 0x0a, 0xb0, 0xb4, 0x57, 0x6a, 0xd9, 0xfb, 0x75, 0x4b, 0xcd, 0xd0, 0x1f, - 0xfa, 0xa1, 0x85, 0x3f, 0xb2, 0xc5, 0x0f, 0xc3, 0x06, 0x32, 0x24, 0x35, 0xcf, 0x9f, 0xb8, 0x03, - 0x77, 0x8c, 0x6d, 0x58, 0x81, 0xbc, 0xe5, 0xd2, 0x93, 0x64, 0xe2, 0xb2, 0x06, 0xd4, 0xa7, 0xfd, - 0x89, 0x37, 0xea, 0xbb, 0x5f, 0x53, 0x95, 0xe2, 0x9b, 0xb0, 0x6e, 0x0e, 0xa7, 0x13, 0x6f, 0x70, - 0x6c, 0x4d, 0x28, 0xc6, 0xf1, 0x13, 0x72, 0x11, 0x36, 0x3a, 0x0d, 0xbd, 0xbe, 0x53, 0xdd, 0xeb, - 0x34, 0x3b, 0x96, 0x5d, 0xd7, 0xdb, 0xa5, 0x0a, 0x7b, 0x26, 0xaa, 0x37, 0xad, 0xb6, 0x6d, 0x1a, - 0x25, 0xa3, 0xd1, 0x56, 0x95, 0xe2, 0xb7, 0x51, 0xb7, 0xd2, 0x1d, 0x0e, 0x7a, 0xbb, 0x4e, 0x77, - 0x32, 0x1c, 0x63, 0x83, 0x35, 0xb8, 0x6a, 0x19, 0xa5, 0x66, 0xa3, 0x6c, 0xef, 0xea, 0xa5, 0x76, - 0xd3, 0x4c, 0x0b, 0xf5, 0x7d, 0x19, 0x2e, 0xa5, 0xe0, 0x34, 0xdb, 0x2d, 0x55, 0x21, 0xd7, 0x60, - 0x3b, 0xa5, 0xec, 0xd0, 0xd8, 0xd1, 0x3b, 0xed, 0x4a, 0x43, 0xcd, 0xcc, 0xa8, 0x6c, 0x59, 0x4d, - 0x35, 0x5b, 0xfc, 0x0d, 0x05, 0xd6, 0x3a, 0x3e, 0x37, 0x39, 0xef, 0xa0, 0xb7, 0xe9, 0x0b, 0x70, - 0xa5, 0x63, 0x19, 0xa6, 0xdd, 0x6e, 0xee, 0x1b, 0x0d, 0xbb, 0x63, 0xe9, 0x7b, 0xf1, 0xd6, 0x5c, - 0x83, 0x6d, 0x09, 0xc3, 0x34, 0x4a, 0xcd, 0x03, 0xc3, 0xb4, 0x5b, 0xba, 0x65, 0x1d, 0x36, 0xcd, - 0xb2, 0xaa, 0xd0, 0x2f, 0xa6, 0x20, 0xd4, 0x77, 0x75, 0xd6, 0x9a, 0x48, 0x59, 0xc3, 0x38, 0xd4, - 0x6b, 0xf6, 0x4e, 0xb3, 0xad, 0x66, 0x8b, 0x75, 0x7a, 0xbf, 0x63, 0xc0, 0x5d, 0x66, 0x59, 0x98, - 0x87, 0x5c, 0xa3, 0xd9, 0x30, 0xe2, 0x8f, 0x8b, 0x2b, 0x90, 0xd7, 0x5b, 0x2d, 0xb3, 0x79, 0x80, - 0x4b, 0x0c, 0x60, 0xb1, 0x6c, 0x34, 0x68, 0xcb, 0xb2, 0xb4, 0xa4, 0x65, 0x36, 0xeb, 0xcd, 0xb6, - 0x51, 0x56, 0x73, 0x45, 0x53, 0x6c, 0x61, 0x41, 0xb4, 0x3b, 0x64, 0x2f, 0x79, 0x65, 0x63, 0x57, - 0xef, 0xd4, 0xda, 0x7c, 0x8a, 0x1e, 0xd8, 0xa6, 0xf1, 0x99, 0x8e, 0x61, 0xb5, 0x2d, 0x55, 0x21, - 0x2a, 0xac, 0x34, 0x0c, 0xa3, 0x6c, 0xd9, 0xa6, 0x71, 0x50, 0x35, 0x0e, 0xd5, 0x0c, 0xa5, 0xc9, - 0xfe, 0xa7, 0x5f, 0x28, 0x7e, 0x4f, 0x01, 0xc2, 0x82, 0x15, 0x8b, 0x0c, 0x38, 0xb8, 0x62, 0xae, - 0xc2, 0xe5, 0x0a, 0x9d, 0x6a, 0xec, 0x5a, 0xbd, 0x59, 0x8e, 0x0f, 0xd9, 0x25, 0x20, 0xb1, 0xf2, - 0xe6, 0xee, 0xae, 0xaa, 0x90, 0x6d, 0x38, 0x1f, 0x83, 0x97, 0xcd, 0x66, 0x4b, 0xcd, 0x5c, 0xce, - 0xe4, 0x15, 0xb2, 0x99, 0x28, 0xdc, 0x37, 0x8c, 0x96, 0x9a, 0xa5, 0x53, 0x14, 0x2b, 0x10, 0x5b, - 0x82, 0x55, 0xcf, 0x15, 0xbf, 0xa9, 0xc0, 0x25, 0xd6, 0x4c, 0xb1, 0xbf, 0x82, 0xa6, 0x5e, 0x81, - 0x2d, 0x1e, 0x82, 0x3d, 0xad, 0xa1, 0x17, 0x40, 0x8d, 0x94, 0xb2, 0x66, 0x5e, 0x84, 0x8d, 0x08, - 0x14, 0xdb, 0x91, 0xa1, 0xa7, 0x47, 0x04, 0xbc, 0x63, 0x58, 0x6d, 0xdb, 0xd8, 0xdd, 0x6d, 0x9a, - 0x6d, 0xd6, 0x90, 0x6c, 0x51, 0x83, 0x8d, 0x92, 0x3b, 0x9e, 0x50, 0xd1, 0x6b, 0xe0, 0x7b, 0xc3, - 0x01, 0x36, 0x61, 0x15, 0x96, 0x8d, 0xcf, 0xb6, 0x8d, 0x86, 0x55, 0x6d, 0x36, 0xd4, 0x73, 0xc5, - 0x2b, 0x31, 0x1c, 0xb1, 0x8f, 0x2d, 0xab, 0xa2, 0x9e, 0x2b, 0x3a, 0xb0, 0x2a, 0x0c, 0xaf, 0xd9, - 0xaa, 0xb8, 0x0a, 0x97, 0xc5, 0x5a, 0xc3, 0x13, 0x25, 0xde, 0x85, 0x2d, 0xb8, 0x90, 0x2c, 0x37, - 0xda, 0xaa, 0x42, 0x67, 0x21, 0x56, 0x42, 0xe1, 0x99, 0xe2, 0xaf, 0x29, 0xb0, 0x1a, 0x3c, 0x9a, - 0xa0, 0x9a, 0xf6, 0x1a, 0x6c, 0xd7, 0x77, 0x75, 0xbb, 0x6c, 0x1c, 0x54, 0x4b, 0x86, 0xbd, 0x5f, - 0x6d, 0x94, 0x63, 0x1f, 0x79, 0x0e, 0x2e, 0xa6, 0x20, 0xe0, 0x57, 0xb6, 0xe0, 0x42, 0xbc, 0xa8, - 0x4d, 0xb7, 0x6a, 0x86, 0x0e, 0x7d, 0xbc, 0x24, 0xd8, 0xa7, 0xd9, 0xe2, 0x01, 0xac, 0x59, 0x7a, - 0xbd, 0xb6, 0x3b, 0x1c, 0x77, 0x5d, 0x7d, 0x3a, 0x39, 0x19, 0x90, 0x6d, 0xd8, 0xdc, 0x6d, 0x9a, - 0x25, 0xc3, 0x46, 0x94, 0x58, 0x0b, 0xce, 0xc3, 0xba, 0x5c, 0xf8, 0xc0, 0xa0, 0xcb, 0x97, 0xc0, - 0x9a, 0x0c, 0x6c, 0x34, 0xd5, 0x4c, 0xf1, 0xf3, 0xb0, 0x12, 0x49, 0x84, 0xb7, 0x09, 0xe7, 0xe5, - 0xdf, 0x2d, 0x77, 0xd0, 0xf3, 0x06, 0xc7, 0xea, 0xb9, 0x78, 0x81, 0x39, 0x1d, 0x0c, 0x68, 0x01, - 0xee, 0x67, 0xb9, 0xa0, 0xed, 0x8e, 0x4f, 0xbd, 0x81, 0x33, 0x71, 0x7b, 0x6a, 0xa6, 0xf8, 0x0a, - 0xac, 0x46, 0xc2, 0x6f, 0xd3, 0x89, 0xab, 0x35, 0xf9, 0x01, 0x5c, 0x37, 0xca, 0xd5, 0x4e, 0x5d, - 0x5d, 0xa0, 0x3b, 0xb9, 0x52, 0xdd, 0xab, 0xa8, 0x50, 0xfc, 0x8e, 0x42, 0xe5, 0x0c, 0x4c, 0xaa, - 0x53, 0xdf, 0xd5, 0xc5, 0x54, 0xd3, 0x65, 0xc6, 0x82, 0xfa, 0x1b, 0x96, 0xc5, 0xde, 0xd4, 0xaf, - 0xc0, 0x16, 0xff, 0x61, 0xeb, 0x8d, 0xb2, 0x5d, 0xd1, 0xcd, 0xf2, 0xa1, 0x6e, 0xd2, 0xb5, 0xf7, - 0x40, 0xcd, 0xe0, 0x86, 0x92, 0x20, 0x76, 0xbb, 0xd9, 0x29, 0x55, 0xd4, 0x2c, 0x5d, 0xbf, 0x11, - 0x78, 0xab, 0xda, 0x50, 0x73, 0xb8, 0x3d, 0x13, 0xd8, 0x48, 0x96, 0x96, 0x2f, 0x14, 0xdf, 0x55, - 0x60, 0xd3, 0xf2, 0x8e, 0x07, 0xce, 0x64, 0x3a, 0x76, 0xf5, 0xfe, 0xf1, 0x70, 0xec, 0x4d, 0x4e, - 0x4e, 0xad, 0xa9, 0x37, 0x71, 0xc9, 0x1d, 0xb8, 0x69, 0x55, 0xf7, 0x1a, 0x7a, 0x9b, 0x6e, 0x2f, - 0xbd, 0xb6, 0xd7, 0x34, 0xab, 0xed, 0x4a, 0xdd, 0xb6, 0x3a, 0xd5, 0xc4, 0xca, 0xbb, 0x01, 0x2f, - 0xcc, 0x46, 0xad, 0x19, 0x7b, 0x7a, 0xe9, 0x81, 0xaa, 0xcc, 0x27, 0xb8, 0xa3, 0xd7, 0xf4, 0x46, - 0xc9, 0x28, 0xdb, 0x07, 0x77, 0xd5, 0x0c, 0xb9, 0x09, 0xd7, 0x67, 0xa3, 0xee, 0x56, 0x5b, 0x16, - 0x45, 0xcb, 0xce, 0xff, 0x6e, 0xc5, 0xaa, 0x53, 0xac, 0x5c, 0xf1, 0x8f, 0x14, 0xd8, 0x9a, 0x15, - 0x83, 0x89, 0xdc, 0x02, 0xcd, 0x68, 0xb4, 0x4d, 0xbd, 0x5a, 0xb6, 0x4b, 0xa6, 0x51, 0x36, 0x1a, - 0xed, 0xaa, 0x5e, 0xb3, 0x6c, 0xab, 0xd9, 0xa1, 0xab, 0x29, 0x34, 0x7d, 0x78, 0x11, 0xae, 0xcd, - 0xc1, 0x6b, 0x56, 0xcb, 0x25, 0x55, 0x21, 0x77, 0xe1, 0xe5, 0x39, 0x48, 0xd6, 0x03, 0xab, 0x6d, - 0xd4, 0xe5, 0x12, 0x35, 0x53, 0x2c, 0xc1, 0xe5, 0xd9, 0x41, 0x5a, 0xe8, 0x31, 0x1d, 0x1d, 0xe9, - 0x3c, 0xe4, 0xca, 0xf4, 0x66, 0x88, 0xe4, 0x7e, 0x28, 0x7a, 0xa0, 0xc6, 0xe3, 0x2c, 0x24, 0x6c, - 0x54, 0xcc, 0x4e, 0xa3, 0xc1, 0xae, 0x91, 0x75, 0x28, 0x34, 0xdb, 0x15, 0xc3, 0xe4, 0xd9, 0x33, - 0x30, 0x5d, 0x46, 0xa7, 0x41, 0x37, 0x4e, 0xd3, 0xac, 0x7e, 0x0e, 0xef, 0x93, 0x2d, 0xb8, 0x60, - 0xd5, 0xf4, 0xd2, 0xbe, 0xdd, 0x68, 0xb6, 0xed, 0x6a, 0xc3, 0x2e, 0x55, 0xf4, 0x46, 0xc3, 0xa8, - 0xa9, 0x80, 0x83, 0x39, 0xcb, 0xb7, 0x92, 0x7c, 0x10, 0x6e, 0x37, 0xf7, 0xdb, 0xba, 0xdd, 0xaa, - 0x75, 0xf6, 0xaa, 0x0d, 0xdb, 0x7a, 0xd0, 0x28, 0x09, 0xde, 0xa7, 0x94, 0x3c, 0x72, 0x6f, 0xc3, - 0x8d, 0xb9, 0xd8, 0x61, 0x9e, 0x8b, 0x5b, 0xa0, 0xcd, 0xc5, 0xe4, 0x1d, 0x29, 0xfe, 0x48, 0x81, - 0xed, 0x39, 0x6f, 0xc8, 0xe4, 0x65, 0xb8, 0x53, 0x31, 0xf4, 0x72, 0xcd, 0xb0, 0x2c, 0x3c, 0x28, - 0xe8, 0x34, 0x30, 0x5b, 0x96, 0xd4, 0x03, 0xf5, 0x0e, 0xdc, 0x9c, 0x8f, 0x1e, 0x5e, 0xcd, 0xb7, - 0xe1, 0xc6, 0x7c, 0x54, 0x7e, 0x55, 0x67, 0x48, 0x11, 0x6e, 0xcd, 0xc7, 0x0c, 0xae, 0xf8, 0x6c, - 0xf1, 0xb7, 0x14, 0xb8, 0x94, 0xae, 0xc8, 0xa1, 0x6d, 0xab, 0x36, 0xac, 0xb6, 0x5e, 0xab, 0xd9, - 0x2d, 0xdd, 0xd4, 0xeb, 0xb6, 0xd1, 0x30, 0x9b, 0xb5, 0x5a, 0xda, 0xd5, 0x76, 0x03, 0x5e, 0x98, - 0x8d, 0x6a, 0x95, 0xcc, 0x6a, 0x8b, 0x9e, 0xde, 0x1a, 0x5c, 0x9d, 0x8d, 0x65, 0x54, 0x4b, 0x86, - 0x9a, 0xd9, 0xf9, 0xc4, 0x0f, 0xfe, 0xf1, 0xea, 0xb9, 0x1f, 0xbc, 0x7b, 0x55, 0xf9, 0xf1, 0xbb, - 0x57, 0x95, 0x7f, 0x78, 0xf7, 0xaa, 0xf2, 0xb9, 0x97, 0xce, 0x96, 0x22, 0x0a, 0xf9, 0xfe, 0x47, - 0x8b, 0x28, 0xa1, 0xbc, 0xfa, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x84, 0x40, 0xdc, 0x1a, 0x88, - 0xbc, 0x01, 0x00, + 0x9a, 0x04, 0x40, 0x6c, 0x35, 0x40, 0xec, 0x68, 0x1f, 0xb5, 0x85, 0xee, 0x04, 0x50, 0x83, 0xee, + 0xae, 0xde, 0xaa, 0x6a, 0x92, 0xd0, 0xde, 0xf9, 0xf4, 0x3c, 0x59, 0x21, 0xeb, 0x75, 0x27, 0x9d, + 0xf6, 0x1c, 0x3a, 0x59, 0x21, 0xdf, 0xd9, 0x8a, 0x73, 0x48, 0x61, 0x4b, 0x96, 0x7d, 0xb6, 0xc2, + 0xb2, 0x74, 0x71, 0x96, 0x65, 0x85, 0xe3, 0xa4, 0xb0, 0xcf, 0x76, 0x78, 0x7d, 0x01, 0x59, 0x96, + 0x7f, 0x38, 0x10, 0xe1, 0x08, 0xc9, 0x17, 0xe1, 0x08, 0xef, 0x85, 0xee, 0x1c, 0xf9, 0x65, 0x66, + 0x55, 0x66, 0x55, 0x75, 0xa3, 0x31, 0xe4, 0xe8, 0xc4, 0x09, 0xfd, 0x21, 0xd1, 0x5f, 0x7e, 0xdf, + 0x97, 0x95, 0xef, 0x2f, 0xbf, 0xfc, 0x1e, 0xf0, 0x62, 0x40, 0x9b, 0xb4, 0xe3, 0x7a, 0xc1, 0xf5, + 0x26, 0xdd, 0xb3, 0xeb, 0x87, 0xd7, 0x83, 0xc3, 0x0e, 0xf5, 0xf9, 0xbf, 0xd7, 0x3a, 0x9e, 0x1b, + 0xb8, 0x64, 0x18, 0x7f, 0x2c, 0xcc, 0xed, 0xb9, 0x7b, 0x2e, 0x42, 0xae, 0xb3, 0xbf, 0x78, 0xe1, + 0xc2, 0xc5, 0x3d, 0xd7, 0xdd, 0x6b, 0xd2, 0xeb, 0xf8, 0x6b, 0xa7, 0xbb, 0x7b, 0xbd, 0xd1, 0xf5, + 0xec, 0xc0, 0x71, 0xdb, 0xa2, 0xbc, 0x18, 0x2f, 0x0f, 0x9c, 0x16, 0xf5, 0x03, 0xbb, 0xd5, 0xe9, + 0xc5, 0xe0, 0x91, 0x67, 0x77, 0x3a, 0xd4, 0x13, 0xb5, 0x2f, 0x5c, 0x0d, 0x3f, 0xd0, 0x0e, 0x02, + 0x46, 0xc9, 0x98, 0x5f, 0x7f, 0x78, 0x43, 0xfd, 0x29, 0x50, 0x6f, 0xf5, 0x68, 0x8b, 0xd7, 0xf5, + 0x03, 0xda, 0xb0, 0x1a, 0xf4, 0xa1, 0x53, 0xa7, 0x96, 0x47, 0xbf, 0xd9, 0x75, 0x3c, 0xda, 0xa2, + 0xed, 0x40, 0xd0, 0xbd, 0x99, 0x4e, 0x27, 0x3f, 0x24, 0xf6, 0x45, 0xc6, 0x2f, 0xe4, 0x60, 0xec, + 0x1e, 0xa5, 0x9d, 0x52, 0xd3, 0x79, 0x48, 0xc9, 0x4b, 0x30, 0xb4, 0x6e, 0xb7, 0xe8, 0x7c, 0xe6, + 0x52, 0xe6, 0xca, 0xd8, 0xd2, 0xf4, 0xf1, 0x51, 0x71, 0xdc, 0xa7, 0xde, 0x43, 0xea, 0x59, 0x6d, + 0xbb, 0x45, 0x4d, 0x2c, 0x24, 0xaf, 0xc3, 0x18, 0xfb, 0xdf, 0xef, 0xd8, 0x75, 0x3a, 0x9f, 0x45, + 0xcc, 0xc9, 0xe3, 0xa3, 0xe2, 0x58, 0x5b, 0x02, 0xcd, 0xa8, 0x9c, 0x54, 0x61, 0x74, 0xf9, 0x71, + 0xc7, 0xf1, 0xa8, 0x3f, 0x3f, 0x74, 0x29, 0x73, 0x65, 0x7c, 0x71, 0xe1, 0x1a, 0xef, 0xa3, 0x6b, + 0xb2, 0x8f, 0xae, 0x6d, 0xca, 0x4e, 0x5c, 0x9a, 0xfd, 0xbd, 0xa3, 0xe2, 0x73, 0xc7, 0x47, 0xc5, + 0x51, 0xca, 0x49, 0x7e, 0xea, 0x8f, 0x8a, 0x19, 0x53, 0xd2, 0x93, 0x77, 0x61, 0x68, 0xf3, 0xb0, + 0x43, 0xe7, 0xc7, 0x2e, 0x65, 0xae, 0x4c, 0x2d, 0x5e, 0xbc, 0xc6, 0x87, 0x35, 0xfc, 0xf8, 0xe8, + 0x2f, 0x86, 0xb5, 0x94, 0x3f, 0x3e, 0x2a, 0x0e, 0x31, 0x14, 0x13, 0xa9, 0xc8, 0x9b, 0x30, 0xb2, + 0xe2, 0xfa, 0x41, 0xb5, 0x32, 0x0f, 0xf8, 0xc9, 0x67, 0x8e, 0x8f, 0x8a, 0x33, 0xfb, 0xae, 0x1f, + 0x58, 0x4e, 0xe3, 0x0d, 0xb7, 0xe5, 0x04, 0xb4, 0xd5, 0x09, 0x0e, 0x4d, 0x81, 0x64, 0x3c, 0x86, + 0x49, 0x8d, 0x1f, 0x19, 0x87, 0xd1, 0xad, 0xf5, 0x7b, 0xeb, 0xf7, 0xb7, 0xd7, 0x0b, 0xcf, 0x91, + 0x3c, 0x0c, 0xad, 0xdf, 0xaf, 0x2c, 0x17, 0x32, 0x64, 0x14, 0x72, 0xa5, 0x8d, 0x8d, 0x42, 0x96, + 0x4c, 0x40, 0xbe, 0x52, 0xda, 0x2c, 0x2d, 0x95, 0x6a, 0xcb, 0x85, 0x1c, 0x99, 0x85, 0xe9, 0xed, + 0xea, 0x7a, 0xe5, 0xfe, 0x76, 0xcd, 0xaa, 0x2c, 0xd7, 0xee, 0x6d, 0xde, 0xdf, 0x28, 0x0c, 0x91, + 0x29, 0x80, 0x7b, 0x5b, 0x4b, 0xcb, 0xe6, 0xfa, 0xf2, 0xe6, 0x72, 0xad, 0x30, 0x4c, 0xe6, 0xa0, + 0x20, 0x49, 0xac, 0xda, 0xb2, 0xf9, 0xa0, 0x5a, 0x5e, 0x2e, 0x8c, 0xdc, 0x1d, 0xca, 0xe7, 0x0a, + 0x43, 0xe6, 0xe8, 0x2a, 0xb5, 0x7d, 0x5a, 0xad, 0x18, 0xff, 0x7e, 0x0e, 0xf2, 0x6b, 0x34, 0xb0, + 0x1b, 0x76, 0x60, 0x93, 0x17, 0xb4, 0xf1, 0xc1, 0x26, 0x2a, 0x03, 0xf3, 0x52, 0x72, 0x60, 0x86, + 0x8f, 0x8f, 0x8a, 0x99, 0x37, 0xd5, 0x01, 0x79, 0x07, 0xc6, 0x2b, 0xd4, 0xaf, 0x7b, 0x4e, 0x87, + 0x4d, 0xb6, 0xf9, 0x1c, 0xa2, 0x9d, 0x3f, 0x3e, 0x2a, 0x9e, 0x69, 0x44, 0x60, 0xa5, 0x43, 0x54, + 0x6c, 0x52, 0x85, 0x91, 0x55, 0x7b, 0x87, 0x36, 0xfd, 0xf9, 0xe1, 0x4b, 0xb9, 0x2b, 0xe3, 0x8b, + 0xcf, 0x8b, 0x41, 0x90, 0x1f, 0x78, 0x8d, 0x97, 0x2e, 0xb7, 0x03, 0xef, 0x70, 0x69, 0xee, 0xf8, + 0xa8, 0x58, 0x68, 0x22, 0x40, 0xed, 0x60, 0x8e, 0x42, 0x6a, 0xd1, 0xc4, 0x18, 0x39, 0x71, 0x62, + 0x5c, 0xf8, 0xbd, 0xa3, 0x62, 0x86, 0x0d, 0x98, 0x98, 0x18, 0x11, 0x3f, 0x7d, 0x8a, 0x2c, 0x42, + 0xde, 0xa4, 0x0f, 0x1d, 0x9f, 0xb5, 0x2c, 0x8f, 0x2d, 0x3b, 0x7b, 0x7c, 0x54, 0x24, 0x9e, 0x80, + 0x29, 0x9f, 0x11, 0xe2, 0x2d, 0xbc, 0x0d, 0xe3, 0xca, 0x57, 0x93, 0x02, 0xe4, 0x0e, 0xe8, 0x21, + 0xef, 0x61, 0x93, 0xfd, 0x49, 0xe6, 0x60, 0xf8, 0xa1, 0xdd, 0xec, 0x8a, 0x2e, 0x35, 0xf9, 0x8f, + 0x2f, 0x64, 0x3f, 0x9f, 0xb9, 0x3b, 0x94, 0x1f, 0x2d, 0xe4, 0xcd, 0x6c, 0xb5, 0x62, 0xfc, 0xad, + 0x21, 0xc8, 0x9b, 0x2e, 0x5f, 0xc0, 0xe4, 0x2a, 0x0c, 0xd7, 0x02, 0x3b, 0x90, 0xc3, 0x34, 0x7b, + 0x7c, 0x54, 0x9c, 0x66, 0x8b, 0x9b, 0x2a, 0xf5, 0x73, 0x0c, 0x86, 0xba, 0xb1, 0x6f, 0xfb, 0x72, + 0xb8, 0x10, 0xb5, 0xc3, 0x00, 0x2a, 0x2a, 0x62, 0x90, 0xcb, 0x30, 0xb4, 0xe6, 0x36, 0xa8, 0x18, + 0x31, 0x72, 0x7c, 0x54, 0x9c, 0x6a, 0xb9, 0x0d, 0x15, 0x11, 0xcb, 0xc9, 0x1b, 0x30, 0x56, 0xee, + 0x7a, 0x1e, 0x6d, 0xb3, 0xb9, 0x3e, 0x84, 0xc8, 0x53, 0xc7, 0x47, 0x45, 0xa8, 0x73, 0xa0, 0xe5, + 0x34, 0xcc, 0x08, 0x81, 0x0d, 0x43, 0x2d, 0xb0, 0xbd, 0x80, 0x36, 0xe6, 0x87, 0x07, 0x1a, 0x06, + 0xb6, 0x3e, 0x67, 0x7c, 0x4e, 0x12, 0x1f, 0x06, 0xc1, 0x89, 0xac, 0xc0, 0xf8, 0x1d, 0xcf, 0xae, + 0xd3, 0x0d, 0xea, 0x39, 0x6e, 0x03, 0xc7, 0x37, 0xb7, 0x74, 0xf9, 0xf8, 0xa8, 0x78, 0x76, 0x8f, + 0x81, 0xad, 0x0e, 0xc2, 0x23, 0xea, 0xef, 0x1e, 0x15, 0xf3, 0x15, 0xb1, 0xd5, 0x9a, 0x2a, 0x29, + 0xf9, 0x06, 0x1b, 0x1c, 0x3f, 0xc0, 0xae, 0xa5, 0x8d, 0xf9, 0xd1, 0x13, 0x3f, 0xd1, 0x10, 0x9f, + 0x78, 0xb6, 0x69, 0xfb, 0x81, 0xe5, 0x71, 0xba, 0xd8, 0x77, 0xaa, 0x2c, 0xc9, 0x7d, 0xc8, 0xd7, + 0xea, 0xfb, 0xb4, 0xd1, 0x6d, 0x52, 0x9c, 0x32, 0xe3, 0x8b, 0xe7, 0xc4, 0xa4, 0x96, 0xe3, 0x29, + 0x8b, 0x97, 0x16, 0x04, 0x6f, 0xe2, 0x0b, 0x88, 0x3a, 0x9f, 0x24, 0xd6, 0x17, 0xf2, 0xdf, 0xfe, + 0xc5, 0xe2, 0x73, 0xdf, 0xf7, 0xcf, 0x2f, 0x3d, 0x67, 0xfc, 0xe7, 0x59, 0x28, 0xc4, 0x99, 0x90, + 0x5d, 0x98, 0xdc, 0xea, 0x34, 0xec, 0x80, 0x96, 0x9b, 0x0e, 0x6d, 0x07, 0x3e, 0x4e, 0x92, 0xfe, + 0x6d, 0x7a, 0x59, 0xd4, 0x3b, 0xdf, 0x45, 0x42, 0xab, 0xce, 0x29, 0x63, 0xad, 0xd2, 0xd9, 0x46, + 0xf5, 0xd4, 0x70, 0x03, 0xf7, 0x71, 0x86, 0x9d, 0xae, 0x1e, 0xbe, 0xf5, 0xf7, 0xa8, 0x47, 0xb0, + 0x15, 0x13, 0xa8, 0xdd, 0xd8, 0x39, 0xc4, 0x99, 0x39, 0xf8, 0x04, 0x62, 0x24, 0x29, 0x13, 0x88, + 0x81, 0x8d, 0xff, 0x33, 0x03, 0x53, 0x26, 0xf5, 0xdd, 0xae, 0x57, 0xa7, 0x2b, 0xd4, 0x6e, 0x50, + 0x8f, 0x4d, 0xff, 0x7b, 0x4e, 0xbb, 0x21, 0xd6, 0x14, 0x4e, 0xff, 0x03, 0xa7, 0xad, 0x6e, 0xdd, + 0x58, 0x4e, 0x3e, 0x03, 0xa3, 0xb5, 0xee, 0x0e, 0xa2, 0x66, 0xa3, 0x1d, 0xc0, 0xef, 0xee, 0x58, + 0x31, 0x74, 0x89, 0x46, 0xae, 0xc3, 0xe8, 0x03, 0xea, 0xf9, 0xd1, 0x6e, 0x88, 0x47, 0xc3, 0x43, + 0x0e, 0x52, 0x09, 0x04, 0x16, 0xb9, 0x13, 0xed, 0xc8, 0xe2, 0x50, 0x9b, 0x8e, 0xed, 0x83, 0xd1, + 0x54, 0x69, 0x09, 0x88, 0x3a, 0x55, 0x24, 0x96, 0xf1, 0xd3, 0x59, 0x28, 0x54, 0xec, 0xc0, 0xde, + 0xb1, 0x7d, 0xd1, 0x9f, 0x0f, 0x6e, 0xb2, 0x3d, 0x5e, 0x69, 0x28, 0xee, 0xf1, 0xec, 0xcb, 0x3f, + 0x76, 0xf3, 0x5e, 0x89, 0x37, 0x6f, 0x9c, 0x9d, 0xb0, 0xa2, 0x79, 0x51, 0xa3, 0xde, 0x3b, 0xb9, + 0x51, 0x05, 0xd1, 0xa8, 0xbc, 0x6c, 0x54, 0xd4, 0x14, 0xf2, 0x1e, 0x0c, 0xd5, 0x3a, 0xb4, 0x2e, + 0x36, 0x11, 0x79, 0x2e, 0xe8, 0x8d, 0x63, 0x08, 0x0f, 0x6e, 0x2e, 0x4d, 0x08, 0x36, 0x43, 0x7e, + 0x87, 0xd6, 0x4d, 0x24, 0x53, 0x16, 0xcd, 0x3f, 0xca, 0xc1, 0x5c, 0x1a, 0x99, 0xda, 0x8e, 0x91, + 0x3e, 0xed, 0xb8, 0x02, 0x79, 0x76, 0x84, 0xb3, 0x63, 0x11, 0xb7, 0x8b, 0xb1, 0xa5, 0x09, 0xf6, + 0xc9, 0xfb, 0x02, 0x66, 0x86, 0xa5, 0xe4, 0xa5, 0x50, 0x22, 0xc8, 0x47, 0xfc, 0x84, 0x44, 0x20, + 0xe5, 0x00, 0x36, 0xd6, 0x72, 0x09, 0xa3, 0xe0, 0x10, 0x75, 0x8b, 0x04, 0x47, 0x63, 0xed, 0x09, + 0x88, 0x76, 0xcc, 0xc8, 0x43, 0x61, 0x19, 0xf2, 0xb2, 0x59, 0xf3, 0x13, 0xc8, 0x68, 0x26, 0xd6, + 0x49, 0x0f, 0x6e, 0xf2, 0xc1, 0x6c, 0x88, 0xdf, 0x2a, 0x1b, 0x89, 0x43, 0x6e, 0x42, 0x7e, 0xc3, + 0x73, 0x1f, 0x1f, 0x56, 0x2b, 0xfe, 0xfc, 0xe4, 0xa5, 0xdc, 0x95, 0xb1, 0xa5, 0x73, 0xc7, 0x47, + 0xc5, 0xd9, 0x0e, 0x83, 0x59, 0x4e, 0x43, 0x3d, 0x69, 0x43, 0xc4, 0xbb, 0x43, 0xf9, 0x4c, 0x21, + 0x7b, 0x77, 0x28, 0x9f, 0x2d, 0xe4, 0xb8, 0x78, 0x71, 0x77, 0x28, 0x3f, 0x54, 0x18, 0xbe, 0x3b, + 0x94, 0x1f, 0x46, 0x81, 0x63, 0xac, 0x00, 0x77, 0x87, 0xf2, 0xe3, 0x85, 0x09, 0xed, 0xb4, 0x47, + 0x06, 0x81, 0x5b, 0x77, 0x9b, 0x66, 0x6e, 0xcb, 0xac, 0x9a, 0x23, 0xe5, 0x52, 0x99, 0x7a, 0x81, + 0x99, 0x2b, 0x6d, 0xd7, 0xcc, 0xc9, 0xca, 0x61, 0xdb, 0x6e, 0x39, 0x75, 0x7e, 0x74, 0x9a, 0xb9, + 0x3b, 0xe5, 0x0d, 0xa3, 0x04, 0x53, 0x51, 0x5b, 0x56, 0x1d, 0x3f, 0x20, 0xd7, 0x61, 0x4c, 0x42, + 0xd8, 0x46, 0x97, 0x4b, 0x6d, 0xb5, 0x19, 0xe1, 0x18, 0xbf, 0x9b, 0x05, 0x88, 0x4a, 0x9e, 0xd1, + 0xb5, 0xf0, 0x39, 0x6d, 0x2d, 0x9c, 0x89, 0xaf, 0x85, 0x9e, 0xab, 0x80, 0x7c, 0x00, 0x23, 0x4c, + 0x2c, 0xe8, 0x4a, 0x91, 0xe8, 0x5c, 0x9c, 0x14, 0x0b, 0x1f, 0xdc, 0x5c, 0x9a, 0x12, 0xc4, 0x23, + 0x3e, 0x42, 0x4c, 0x41, 0xa6, 0x2c, 0xa3, 0x5f, 0x18, 0x8d, 0x06, 0x43, 0x2c, 0xa0, 0x2b, 0x10, + 0x0e, 0xa8, 0xe8, 0x50, 0x5c, 0x19, 0x1d, 0x39, 0xc8, 0x61, 0x29, 0x39, 0x0f, 0x6c, 0xc0, 0x45, + 0xa7, 0x8e, 0x1e, 0x1f, 0x15, 0x73, 0x5d, 0xcf, 0xc1, 0x49, 0x40, 0xae, 0x83, 0x98, 0x06, 0xa2, + 0x03, 0xd9, 0xec, 0x9b, 0xa9, 0xdb, 0x56, 0x9d, 0x7a, 0x41, 0xd4, 0xe3, 0xf3, 0x19, 0x39, 0x5b, + 0x48, 0x07, 0xf4, 0xa9, 0x32, 0x3f, 0x84, 0xd3, 0xe0, 0x4a, 0x6a, 0xaf, 0x5c, 0xd3, 0x50, 0xb9, + 0x18, 0x79, 0x49, 0x9e, 0x4a, 0x0d, 0x5e, 0x66, 0x25, 0x44, 0x4a, 0xbd, 0x02, 0x72, 0x13, 0xd8, + 0x0c, 0x15, 0xbd, 0x0f, 0xa2, 0x9e, 0xd2, 0x76, 0x6d, 0xe9, 0x8c, 0xe0, 0x34, 0x69, 0x3f, 0x52, + 0xc9, 0x19, 0x36, 0x79, 0x07, 0xd8, 0x14, 0x16, 0xfd, 0x4e, 0x04, 0xd1, 0x9d, 0xf2, 0x46, 0xb9, + 0xe9, 0x76, 0x1b, 0xb5, 0x2f, 0xad, 0x46, 0xc4, 0x7b, 0xf5, 0x8e, 0x4a, 0x7c, 0xa7, 0xbc, 0x41, + 0xde, 0x81, 0xe1, 0xd2, 0xf7, 0x76, 0x3d, 0x2a, 0xe4, 0x93, 0x09, 0x59, 0x27, 0x83, 0x2d, 0x9d, + 0x13, 0x84, 0xd3, 0x36, 0xfb, 0xa9, 0xca, 0x75, 0x58, 0xce, 0x6a, 0xde, 0x5c, 0xad, 0x09, 0xd9, + 0x83, 0xc4, 0xba, 0x65, 0x73, 0x55, 0xf9, 0xec, 0x40, 0x6b, 0x35, 0xa3, 0x22, 0xd7, 0x21, 0x5b, + 0xaa, 0xe0, 0x8d, 0x68, 0x7c, 0x71, 0x4c, 0x56, 0x5b, 0x59, 0x9a, 0x13, 0x24, 0x13, 0xb6, 0xba, + 0x0c, 0xb2, 0xa5, 0x0a, 0x59, 0x82, 0xe1, 0xb5, 0xc3, 0xda, 0x97, 0x56, 0xc5, 0x66, 0x36, 0x2b, + 0xe7, 0x35, 0x83, 0xdd, 0xc7, 0x65, 0xef, 0x47, 0x5f, 0xdc, 0x3a, 0xf4, 0xbf, 0xd9, 0x54, 0xbf, + 0x18, 0xd1, 0xc8, 0x06, 0x8c, 0x95, 0x1a, 0x2d, 0xa7, 0xbd, 0xe5, 0x53, 0x6f, 0x7e, 0x1c, 0xf9, + 0xcc, 0xc7, 0xbe, 0x3b, 0x2c, 0x5f, 0x9a, 0x3f, 0x3e, 0x2a, 0xce, 0xd9, 0xec, 0xa7, 0xd5, 0xf5, + 0xa9, 0xa7, 0x70, 0x8b, 0x98, 0x90, 0x0d, 0x80, 0x35, 0xb7, 0xbd, 0xe7, 0x96, 0x82, 0xa6, 0xed, + 0xc7, 0xb6, 0xc7, 0xa8, 0x20, 0x14, 0x1f, 0xce, 0xb4, 0x18, 0xcc, 0xb2, 0x19, 0x50, 0x61, 0xa8, + 0xf0, 0x20, 0xb7, 0x61, 0xe4, 0xbe, 0x67, 0xd7, 0x9b, 0x74, 0x7e, 0x12, 0xb9, 0xcd, 0x09, 0x6e, + 0x1c, 0x28, 0x5b, 0x3a, 0x2f, 0x18, 0x16, 0x5c, 0x04, 0xab, 0xd7, 0x14, 0x8e, 0xb8, 0xb0, 0x0d, + 0x24, 0x39, 0x27, 0x53, 0x2e, 0x09, 0xaf, 0xab, 0x97, 0x84, 0x68, 0xd1, 0x97, 0xdd, 0x56, 0xcb, + 0x6e, 0x37, 0x90, 0xf6, 0xc1, 0xa2, 0x72, 0x77, 0x30, 0xbe, 0x09, 0x33, 0x89, 0xce, 0x3a, 0xe1, + 0x7e, 0xf7, 0x3e, 0x4c, 0x57, 0xe8, 0xae, 0xdd, 0x6d, 0x06, 0xe1, 0x49, 0xc2, 0x97, 0x28, 0xde, + 0xb4, 0x1a, 0xbc, 0xc8, 0x92, 0xc7, 0x87, 0x19, 0x47, 0x36, 0xde, 0x83, 0x49, 0xad, 0xf9, 0xec, + 0xaa, 0x50, 0xea, 0x36, 0x9c, 0x00, 0x07, 0x32, 0x13, 0x5d, 0x15, 0x6c, 0x06, 0xc4, 0xe1, 0x32, + 0x23, 0x04, 0xe3, 0xef, 0xab, 0xd2, 0x8a, 0xd8, 0x89, 0xd8, 0xb5, 0x5a, 0xec, 0x07, 0x99, 0x48, + 0x76, 0x4a, 0xec, 0x07, 0xe1, 0x6e, 0x70, 0x95, 0xaf, 0xcd, 0x6c, 0x62, 0x6d, 0x8e, 0x8b, 0x91, + 0xc8, 0xd9, 0x8f, 0x7c, 0xbe, 0x22, 0xc3, 0x99, 0x9a, 0xfb, 0xf8, 0x33, 0xf5, 0x03, 0x98, 0x58, + 0xb3, 0xdb, 0xf6, 0x1e, 0x6d, 0xb0, 0x16, 0xf0, 0xbd, 0x67, 0x6c, 0xe9, 0xf9, 0xe3, 0xa3, 0xe2, + 0xb9, 0x16, 0x87, 0x63, 0x2b, 0xd5, 0x49, 0xa4, 0x11, 0x90, 0x1b, 0x72, 0x65, 0x0f, 0xa7, 0xac, + 0xec, 0x49, 0x51, 0xfb, 0x30, 0xae, 0x6c, 0xb1, 0x9e, 0x8d, 0xdf, 0x1e, 0xc3, 0x36, 0x92, 0x37, + 0x60, 0xc4, 0xa4, 0x7b, 0xec, 0xa8, 0xc9, 0x44, 0x83, 0xe4, 0x21, 0x44, 0xed, 0x18, 0x8e, 0x83, + 0x72, 0x06, 0x6d, 0xf8, 0xfb, 0xce, 0x6e, 0x20, 0x7a, 0x27, 0x94, 0x33, 0x04, 0x58, 0x91, 0x33, + 0x04, 0x44, 0xbf, 0xce, 0x72, 0x18, 0xdb, 0xfd, 0xcc, 0x4a, 0x4d, 0x74, 0x9a, 0xec, 0x61, 0xb3, + 0xa2, 0x6c, 0x23, 0x9e, 0x26, 0x25, 0x30, 0x6c, 0x72, 0x0b, 0xc6, 0x4a, 0xf5, 0xba, 0xdb, 0x55, + 0xee, 0x8c, 0x7c, 0xdd, 0x72, 0xa0, 0xae, 0x22, 0x89, 0x50, 0x49, 0x0d, 0xc6, 0x97, 0xd9, 0x45, + 0xcb, 0x29, 0xdb, 0xf5, 0x7d, 0xd9, 0x49, 0x72, 0x0f, 0x53, 0x4a, 0xa2, 0x95, 0x4b, 0x11, 0x58, + 0x67, 0x40, 0x55, 0xc9, 0xa0, 0xe0, 0x92, 0x4d, 0x18, 0xaf, 0xd1, 0xba, 0x47, 0x83, 0x5a, 0xe0, + 0x7a, 0x34, 0xb6, 0x25, 0x2b, 0x25, 0x4b, 0x17, 0xe5, 0x5d, 0xcf, 0x47, 0xa0, 0xe5, 0x33, 0xa8, + 0xca, 0x55, 0x41, 0xe6, 0x42, 0x7b, 0xcb, 0xf5, 0x0e, 0x2b, 0x4b, 0x62, 0x9b, 0x8e, 0xce, 0x74, + 0x0e, 0x56, 0x85, 0x76, 0x06, 0x69, 0xec, 0xe8, 0x42, 0x3b, 0xc7, 0xc2, 0x91, 0xaa, 0xd4, 0x50, + 0xb6, 0x12, 0x9b, 0xf6, 0x74, 0xd4, 0xcb, 0x08, 0x56, 0x46, 0xaa, 0xe1, 0xa3, 0x64, 0xa6, 0x8d, + 0x94, 0xc0, 0x22, 0x1d, 0x20, 0x72, 0xd4, 0xb8, 0xa0, 0xdb, 0xa4, 0xbe, 0x2f, 0xf6, 0xf2, 0xf3, + 0xb1, 0xc1, 0x8f, 0x10, 0x96, 0x5e, 0x11, 0xcc, 0x2f, 0xc8, 0x69, 0x20, 0xee, 0x69, 0xac, 0x50, + 0xa9, 0x27, 0x85, 0x37, 0x79, 0x1b, 0x60, 0xf9, 0x71, 0x40, 0xbd, 0xb6, 0xdd, 0x0c, 0xf5, 0x60, + 0xa8, 0xfa, 0xa1, 0x02, 0xaa, 0x0f, 0xb4, 0x82, 0x4c, 0xca, 0x30, 0x59, 0xf2, 0xfd, 0x6e, 0x8b, + 0x9a, 0x6e, 0x93, 0x96, 0xcc, 0x75, 0xdc, 0xf7, 0xc7, 0x96, 0x2e, 0x1c, 0x1f, 0x15, 0xcf, 0xdb, + 0x58, 0x60, 0x79, 0x6e, 0x93, 0x5a, 0xb6, 0xa7, 0xce, 0x6e, 0x9d, 0x86, 0xdc, 0x07, 0xb8, 0xdf, + 0xa1, 0xed, 0x1a, 0xb5, 0xbd, 0xfa, 0x7e, 0x6c, 0x9b, 0x8f, 0x0a, 0x96, 0x5e, 0x10, 0x2d, 0x9c, + 0x73, 0x3b, 0xb4, 0xed, 0x23, 0x4c, 0xfd, 0xaa, 0x08, 0x93, 0x6c, 0xc3, 0x74, 0xb5, 0xb4, 0xb6, + 0xe1, 0x36, 0x9d, 0xfa, 0xa1, 0x90, 0x9c, 0xa6, 0x50, 0x3b, 0x78, 0x56, 0x70, 0x8d, 0x95, 0xf2, + 0xed, 0xc9, 0xb1, 0x5b, 0x56, 0x07, 0xa1, 0x96, 0x90, 0x9f, 0xe2, 0x5c, 0xc8, 0x87, 0x6c, 0x0e, + 0xfa, 0x4c, 0x18, 0xdc, 0xb4, 0xf7, 0xfc, 0xf9, 0x69, 0x4d, 0xdb, 0x55, 0xda, 0xae, 0x5d, 0x53, + 0x4a, 0xb9, 0x98, 0xb2, 0xc0, 0x27, 0x22, 0x42, 0xad, 0xc0, 0xde, 0xf3, 0xf5, 0x89, 0x18, 0x62, + 0x93, 0xbb, 0x00, 0x15, 0xb7, 0xde, 0x6d, 0xd1, 0x76, 0x50, 0x59, 0x9a, 0x2f, 0xe8, 0x57, 0x81, + 0xb0, 0x20, 0xda, 0xda, 0x1a, 0x6e, 0x5d, 0x9b, 0x89, 0x0a, 0xf5, 0xc2, 0xfb, 0x50, 0x88, 0x7f, + 0xc8, 0x29, 0x15, 0x58, 0x93, 0x85, 0x29, 0xa5, 0xf5, 0xcb, 0x8f, 0x1d, 0x3f, 0xf0, 0x8d, 0x6f, + 0x69, 0x2b, 0x90, 0xed, 0x0e, 0xf7, 0xe8, 0xe1, 0x86, 0x47, 0x77, 0x9d, 0xc7, 0x62, 0x33, 0xc3, + 0xdd, 0xe1, 0x80, 0x1e, 0x5a, 0x1d, 0x84, 0xaa, 0xbb, 0x43, 0x88, 0x4a, 0x3e, 0x0b, 0xf9, 0x7b, + 0x6b, 0xb5, 0x7b, 0xf4, 0xb0, 0x5a, 0x11, 0x07, 0x15, 0x27, 0x6b, 0xf9, 0x16, 0x23, 0xd5, 0xe6, + 0x5a, 0x88, 0x69, 0x2c, 0x45, 0x3b, 0x21, 0xab, 0xb9, 0xdc, 0xec, 0xfa, 0x01, 0xf5, 0xaa, 0x15, + 0xb5, 0xe6, 0x3a, 0x07, 0xc6, 0xf6, 0xa5, 0x10, 0xd5, 0xf8, 0xd7, 0x59, 0xdc, 0x05, 0xd9, 0x84, + 0xaf, 0xb6, 0xfd, 0xc0, 0x6e, 0xd7, 0x69, 0xc8, 0x00, 0x27, 0xbc, 0x23, 0xa0, 0xb1, 0x09, 0x1f, + 0x21, 0xeb, 0x55, 0x67, 0x07, 0xae, 0x9a, 0x55, 0x29, 0x35, 0x17, 0xd5, 0x8a, 0xaa, 0x5e, 0xf5, + 0x04, 0x34, 0x56, 0x65, 0x84, 0x4c, 0x2e, 0xc3, 0x68, 0xb5, 0xb4, 0x56, 0xea, 0x06, 0xfb, 0xb8, + 0x07, 0xe7, 0xb9, 0x7c, 0xce, 0x66, 0xab, 0xdd, 0x0d, 0xf6, 0x4d, 0x59, 0x48, 0xae, 0xe3, 0xbd, + 0xa7, 0x4d, 0x03, 0xae, 0x86, 0x15, 0x87, 0xae, 0xcf, 0x41, 0xb1, 0x6b, 0x0f, 0x03, 0x91, 0xd7, + 0x60, 0xf8, 0xc1, 0x46, 0xb9, 0x5a, 0x11, 0x17, 0x67, 0x3c, 0x89, 0x1e, 0x76, 0xea, 0xfa, 0x97, + 0x70, 0x14, 0xb2, 0x0c, 0x53, 0x35, 0x5a, 0xef, 0x7a, 0x4e, 0x70, 0x78, 0xc7, 0x73, 0xbb, 0x1d, + 0x7f, 0x7e, 0x14, 0xeb, 0xc0, 0x95, 0xee, 0x8b, 0x12, 0x6b, 0x0f, 0x8b, 0x14, 0xea, 0x18, 0x91, + 0xf1, 0x3b, 0x99, 0x68, 0x9b, 0x24, 0x97, 0x35, 0xb1, 0x06, 0x75, 0x37, 0x4c, 0xac, 0x51, 0x75, + 0x37, 0x28, 0xe0, 0x98, 0x40, 0xca, 0x5d, 0x3f, 0x70, 0x5b, 0xcb, 0xed, 0x46, 0xc7, 0x75, 0xda, + 0x01, 0x52, 0xf1, 0xce, 0x37, 0x8e, 0x8f, 0x8a, 0x17, 0xeb, 0x58, 0x6a, 0x51, 0x51, 0x6c, 0xc5, + 0xb8, 0xa4, 0x50, 0x3f, 0xc1, 0x78, 0x18, 0xbf, 0x9f, 0xd5, 0x8e, 0x37, 0xf6, 0x79, 0x26, 0xed, + 0x34, 0x9d, 0x3a, 0xde, 0xe8, 0xb1, 0xa1, 0xe1, 0xac, 0xc2, 0xcf, 0xf3, 0xa2, 0x52, 0xde, 0x43, + 0x3a, 0xef, 0x14, 0x6a, 0xf2, 0x45, 0x98, 0x60, 0x92, 0x86, 0xf8, 0xe9, 0xcf, 0x67, 0xb1, 0xb3, + 0x5f, 0x40, 0x2d, 0x9c, 0x4f, 0xbd, 0x90, 0x8d, 0x26, 0xa2, 0xa8, 0x14, 0xa4, 0x01, 0xf3, 0x9b, + 0x9e, 0xdd, 0xf6, 0x9d, 0x60, 0xb9, 0x5d, 0xf7, 0x0e, 0x51, 0x32, 0x5a, 0x6e, 0xdb, 0x3b, 0x4d, + 0xda, 0xc0, 0xe6, 0xe6, 0x97, 0xae, 0x1c, 0x1f, 0x15, 0x5f, 0x0e, 0x38, 0x8e, 0x45, 0x43, 0x24, + 0x8b, 0x72, 0x2c, 0x85, 0x73, 0x4f, 0x4e, 0x4c, 0x92, 0x92, 0xdd, 0x8a, 0x8f, 0x30, 0x5c, 0x48, + 0x40, 0x49, 0x2a, 0x1c, 0x0d, 0xb6, 0x87, 0xa9, 0x9f, 0xa9, 0x12, 0x18, 0xff, 0x6f, 0x26, 0x3a, + 0x80, 0xc9, 0xbb, 0x30, 0x2e, 0x56, 0x8c, 0x32, 0x2f, 0x70, 0x07, 0x95, 0xcb, 0x2b, 0x36, 0xb2, + 0x2a, 0x3a, 0xbb, 0xf7, 0x97, 0xca, 0xab, 0xca, 0xdc, 0xc0, 0x7b, 0xbf, 0x5d, 0x6f, 0xc6, 0xa9, + 0x24, 0x1a, 0x9b, 0x04, 0x9b, 0xab, 0x35, 0xbd, 0x57, 0x70, 0x12, 0x04, 0x4d, 0x3f, 0xa5, 0x1b, + 0x14, 0xe4, 0x27, 0x6f, 0xf8, 0xff, 0x92, 0x49, 0x3b, 0xe7, 0xc9, 0x12, 0x4c, 0x6e, 0xbb, 0xde, + 0x01, 0x8e, 0xaf, 0xd2, 0x09, 0x38, 0xf2, 0x8f, 0x64, 0x41, 0xbc, 0x41, 0x3a, 0x89, 0xfa, 0x6d, + 0x4a, 0x6f, 0xe8, 0xdf, 0x16, 0xe3, 0xa0, 0x11, 0xb0, 0x71, 0x08, 0x39, 0x86, 0xab, 0x03, 0xc7, + 0x21, 0xfa, 0x04, 0x6d, 0x0a, 0xab, 0xe8, 0xc6, 0x7f, 0x95, 0x51, 0xcf, 0x73, 0xd6, 0xc9, 0x15, + 0xb7, 0x65, 0x3b, 0x6d, 0xa5, 0x39, 0xfc, 0x61, 0x09, 0xa1, 0xf1, 0x2f, 0x51, 0x90, 0xc9, 0x4d, + 0xc8, 0xf3, 0x5f, 0xe1, 0x5e, 0x8b, 0x5a, 0x2d, 0x41, 0xa8, 0x1f, 0x14, 0x12, 0x31, 0x31, 0x32, + 0xb9, 0xd3, 0x8e, 0xcc, 0x6f, 0x67, 0xd4, 0xa3, 0xf8, 0xe3, 0x1e, 0x36, 0xb1, 0x43, 0x26, 0x7b, + 0x9a, 0x43, 0xe6, 0x89, 0x9b, 0xf0, 0x7d, 0x19, 0x18, 0x57, 0xb4, 0x14, 0xac, 0x0d, 0x1b, 0x9e, + 0xfb, 0x11, 0xad, 0x07, 0x7a, 0x1b, 0x3a, 0x1c, 0x18, 0x6b, 0x43, 0x88, 0xfa, 0x04, 0x6d, 0x30, + 0xfe, 0x2c, 0x23, 0xee, 0x48, 0x03, 0x6f, 0xf3, 0xfa, 0x96, 0x9c, 0x3d, 0xcd, 0x11, 0xf9, 0x45, + 0x18, 0x36, 0x69, 0xc3, 0xf1, 0xc5, 0xfd, 0x66, 0x46, 0xbd, 0x8f, 0x61, 0x41, 0x24, 0x37, 0x79, + 0xec, 0xa7, 0x7a, 0xbe, 0x61, 0x39, 0x13, 0x64, 0xab, 0xfe, 0xed, 0x26, 0x7d, 0xec, 0xf0, 0xc5, + 0x28, 0x8e, 0x5a, 0x3c, 0xde, 0x1c, 0xdf, 0xda, 0x65, 0x25, 0x42, 0xa2, 0x56, 0x17, 0x9e, 0x46, + 0x63, 0x7c, 0x08, 0x10, 0x55, 0x49, 0xee, 0x41, 0x41, 0xcc, 0x06, 0xa7, 0xbd, 0xc7, 0x05, 0x29, + 0xd1, 0x07, 0xc5, 0xe3, 0xa3, 0xe2, 0xf3, 0xf5, 0xb0, 0x4c, 0x48, 0x9d, 0x0a, 0xdf, 0x04, 0xa1, + 0xf1, 0x1f, 0x66, 0x21, 0x5b, 0xc2, 0x01, 0xb9, 0x47, 0x0f, 0x03, 0x7b, 0xe7, 0xb6, 0xd3, 0xd4, + 0x16, 0xd3, 0x01, 0x42, 0xad, 0x5d, 0x47, 0x53, 0x57, 0x28, 0xc8, 0x6c, 0x31, 0xdd, 0xf3, 0x76, + 0xde, 0x42, 0x42, 0x65, 0x31, 0x1d, 0x78, 0x3b, 0x6f, 0xc5, 0xc9, 0x42, 0x44, 0x62, 0xc0, 0x08, + 0x5f, 0x58, 0x62, 0x0e, 0xc2, 0xf1, 0x51, 0x71, 0x84, 0xaf, 0x3f, 0x53, 0x94, 0x90, 0xf3, 0x90, + 0xab, 0x6d, 0xac, 0x8b, 0x1d, 0x10, 0xd5, 0x82, 0x7e, 0xa7, 0x6d, 0x32, 0x18, 0xab, 0x73, 0xb5, + 0x52, 0xda, 0x40, 0x45, 0xc0, 0x70, 0x54, 0x67, 0xb3, 0x61, 0x77, 0xe2, 0xaa, 0x80, 0x10, 0x91, + 0xbc, 0x07, 0xe3, 0xf7, 0x2a, 0xe5, 0x15, 0xd7, 0xe7, 0xbb, 0xd7, 0x48, 0x34, 0xf9, 0x0f, 0x1a, + 0x75, 0x0b, 0x35, 0xf1, 0xf1, 0x63, 0x40, 0xc1, 0x37, 0x7e, 0x38, 0x0b, 0xe3, 0x8a, 0x9e, 0x8c, + 0x7c, 0x56, 0x3c, 0x90, 0x66, 0xb4, 0x1b, 0x80, 0x82, 0xc1, 0x4a, 0xb9, 0x52, 0xa5, 0xe5, 0x36, + 0xa8, 0x78, 0x2e, 0x8d, 0x14, 0x18, 0xd9, 0x41, 0x14, 0x18, 0x6f, 0x03, 0xf0, 0x39, 0x80, 0x9f, + 0xac, 0x88, 0x13, 0x8a, 0x9d, 0x84, 0x3a, 0x2e, 0x11, 0x32, 0x79, 0x00, 0xb3, 0x9b, 0x5e, 0xd7, + 0x0f, 0x6a, 0x87, 0x7e, 0x40, 0x5b, 0x8c, 0xdb, 0x86, 0xeb, 0x36, 0xc5, 0xfc, 0x7b, 0xf9, 0xf8, + 0xa8, 0x78, 0x09, 0x8d, 0x3b, 0x2c, 0x1f, 0xcb, 0xf1, 0x03, 0xac, 0x8e, 0xeb, 0xaa, 0x6a, 0x8d, + 0x34, 0x06, 0x86, 0x09, 0x13, 0xaa, 0x52, 0x84, 0x9d, 0x2c, 0xe2, 0x31, 0x49, 0xa8, 0xba, 0x95, + 0x93, 0x45, 0x7c, 0x65, 0xf2, 0x71, 0x4b, 0x27, 0x31, 0x3e, 0xab, 0x2a, 0xe4, 0x06, 0x5d, 0xd8, + 0xc6, 0x0f, 0x64, 0xa2, 0x6d, 0xe4, 0xc1, 0x0d, 0xf2, 0x0e, 0x8c, 0xf0, 0xc7, 0x3b, 0xf1, 0xc6, + 0x79, 0x26, 0xbc, 0xd4, 0xaa, 0x2f, 0x7b, 0x5c, 0x13, 0xfe, 0x87, 0xfc, 0x81, 0xff, 0x39, 0x53, + 0x90, 0x84, 0x4a, 0x74, 0x5d, 0x9f, 0x26, 0xb9, 0xa3, 0xba, 0xf8, 0x46, 0x9a, 0x12, 0xdd, 0xf8, + 0xf1, 0x61, 0x98, 0xd2, 0xd1, 0xd4, 0x17, 0xbe, 0xcc, 0x40, 0x2f, 0x7c, 0x5f, 0x84, 0x3c, 0xeb, + 0x0f, 0xa7, 0x4e, 0xa5, 0x44, 0xf6, 0x32, 0x3e, 0x2d, 0x08, 0x98, 0xf6, 0x72, 0x0d, 0x7c, 0x38, + 0xd8, 0x1d, 0xd7, 0x0c, 0xa9, 0xc8, 0xa2, 0xf2, 0x0c, 0x95, 0x8b, 0x84, 0x14, 0xf9, 0x0c, 0xa5, + 0xae, 0x87, 0xf0, 0x41, 0xea, 0x4d, 0x18, 0x61, 0xf2, 0x7d, 0xa8, 0x82, 0xc1, 0xaf, 0x64, 0xa2, + 0x7f, 0xcc, 0x44, 0x85, 0x23, 0x91, 0x6d, 0xc8, 0xaf, 0xda, 0x7e, 0x50, 0xa3, 0xb4, 0x3d, 0xc0, + 0xdb, 0x7d, 0x51, 0x74, 0xd5, 0x2c, 0x3e, 0x8c, 0xfb, 0x94, 0xb6, 0x63, 0x8f, 0xaf, 0x21, 0x33, + 0xf2, 0x35, 0x80, 0xb2, 0xdb, 0x0e, 0x3c, 0xb7, 0xb9, 0xea, 0xee, 0xcd, 0x8f, 0xe0, 0xdd, 0xf7, + 0x62, 0x6c, 0x00, 0x22, 0x04, 0x7e, 0xfd, 0x0d, 0x15, 0x3c, 0x75, 0x5e, 0x60, 0x35, 0xdd, 0x3d, + 0x75, 0x1d, 0x44, 0xf8, 0xe4, 0x36, 0x14, 0xa4, 0x62, 0x61, 0xab, 0xb3, 0xe7, 0xe1, 0x04, 0x19, + 0x8d, 0x24, 0x0f, 0xfa, 0x38, 0xb0, 0xba, 0x02, 0xae, 0xee, 0x94, 0x71, 0x1a, 0xf2, 0x55, 0x38, + 0x17, 0x87, 0xc9, 0x51, 0xce, 0x47, 0x32, 0xb9, 0xca, 0x2e, 0x65, 0xde, 0xf7, 0x62, 0x41, 0xee, + 0xc0, 0x34, 0xeb, 0x90, 0x35, 0x6a, 0xfb, 0x5d, 0x6e, 0x60, 0x25, 0x54, 0x33, 0x17, 0xa4, 0x26, + 0x8a, 0xaf, 0xc2, 0xa6, 0x5b, 0x3f, 0x50, 0x90, 0xcc, 0x38, 0x95, 0x71, 0x94, 0x85, 0xb3, 0xe9, + 0xb8, 0xe4, 0x6f, 0xc0, 0x19, 0xd1, 0x2f, 0x4d, 0xea, 0x29, 0x38, 0x03, 0xd8, 0x04, 0xbc, 0x29, + 0xfa, 0xfb, 0xc5, 0x7a, 0xc8, 0x20, 0xdc, 0x38, 0x18, 0x8b, 0xd8, 0xe0, 0xa6, 0xd7, 0x43, 0xbe, + 0x01, 0xe3, 0x6a, 0xb5, 0xd9, 0xc1, 0xcd, 0x2b, 0xfa, 0xd4, 0xa5, 0xb2, 0x24, 0x36, 0x4c, 0x9b, + 0xf4, 0x9b, 0x5d, 0xea, 0x07, 0xd2, 0xc0, 0x43, 0x1c, 0xdd, 0xe7, 0x13, 0xb5, 0x48, 0x84, 0x50, + 0xff, 0x53, 0xf0, 0x38, 0xa5, 0x25, 0xcd, 0xf0, 0xbe, 0xcd, 0xd8, 0xc7, 0xf9, 0x19, 0xdf, 0xcd, + 0xc2, 0xb9, 0x1e, 0xd3, 0x92, 0xed, 0x5c, 0x28, 0x58, 0x29, 0x3b, 0x57, 0x4c, 0x9e, 0xe2, 0xd6, + 0x61, 0x97, 0x20, 0x2b, 0x44, 0x91, 0xa1, 0xa5, 0xc2, 0xf1, 0x51, 0x71, 0x42, 0x5b, 0x71, 0xd9, + 0x6a, 0x85, 0xdc, 0x85, 0x21, 0xd6, 0x0d, 0x03, 0x18, 0x39, 0x48, 0xed, 0xdf, 0x54, 0xe0, 0xa8, + 0x0b, 0x1d, 0xfb, 0x06, 0x79, 0x90, 0xcf, 0x42, 0x6e, 0x73, 0x73, 0x15, 0x57, 0x79, 0x0e, 0x67, + 0xe9, 0x64, 0x10, 0x34, 0xb5, 0x4d, 0x65, 0x92, 0xd1, 0x86, 0x3d, 0x62, 0x32, 0x74, 0xf2, 0xe5, + 0x98, 0xf1, 0xd5, 0x6b, 0xfd, 0x97, 0xe4, 0xe0, 0xb6, 0x58, 0x4f, 0x60, 0x02, 0x65, 0xfc, 0x7c, + 0x36, 0xda, 0x6d, 0x6f, 0x3b, 0xcd, 0x80, 0x7a, 0x64, 0x81, 0x6f, 0x9e, 0x91, 0x18, 0x6d, 0x86, + 0xbf, 0xc9, 0x7c, 0xb4, 0x13, 0x73, 0x56, 0xe1, 0x96, 0xfb, 0x9a, 0xb2, 0xe5, 0xe6, 0x70, 0xcb, + 0x9d, 0xea, 0xb9, 0xb9, 0xbe, 0x96, 0xb2, 0x83, 0xe0, 0x96, 0x99, 0xb2, 0x4b, 0xbc, 0x0c, 0x93, + 0xeb, 0xee, 0xf2, 0xe3, 0x20, 0x44, 0x64, 0x5b, 0x65, 0xde, 0xd4, 0x81, 0x8c, 0xe3, 0xfd, 0x66, + 0x83, 0x7a, 0x9b, 0xfb, 0x76, 0x5b, 0xb3, 0x32, 0x30, 0x13, 0x70, 0x86, 0xbb, 0x4e, 0x1f, 0xe9, + 0xb8, 0xa3, 0x1c, 0x37, 0x0e, 0x37, 0xbe, 0x3f, 0x2b, 0x3b, 0xe3, 0xc1, 0xe2, 0x33, 0xfa, 0x9a, + 0xfd, 0x96, 0xf6, 0x9a, 0x3d, 0x1b, 0xea, 0xe1, 0x43, 0xd3, 0x8c, 0xc5, 0x13, 0x2c, 0x3a, 0xfe, + 0xfe, 0x08, 0x4c, 0xa8, 0xe8, 0xac, 0x1f, 0x4a, 0x8d, 0x86, 0xa7, 0xf6, 0x83, 0xdd, 0x68, 0x78, + 0x26, 0x42, 0x35, 0x03, 0x8e, 0x5c, 0x5f, 0x03, 0x8e, 0xaf, 0xc3, 0x58, 0xb9, 0xd5, 0xd0, 0x9e, + 0x95, 0x8d, 0x94, 0xcf, 0xbb, 0x16, 0x22, 0xf1, 0xb5, 0x10, 0xaa, 0x97, 0xeb, 0xad, 0x46, 0xf2, + 0x31, 0x39, 0x62, 0xa9, 0xd9, 0x7e, 0x0c, 0x3f, 0x89, 0xed, 0xc7, 0x2d, 0x18, 0xdb, 0xf2, 0xe9, + 0x66, 0xb7, 0xdd, 0xa6, 0x4d, 0x9c, 0x56, 0x79, 0x7e, 0x2b, 0xeb, 0xfa, 0xd4, 0x0a, 0x10, 0xaa, + 0x7e, 0x40, 0x88, 0xaa, 0x0e, 0xf0, 0x68, 0x9f, 0x01, 0xbe, 0x09, 0xf9, 0x0d, 0x4a, 0x3d, 0xec, + 0xd3, 0xf1, 0x48, 0xf8, 0xee, 0x50, 0xea, 0x59, 0xac, 0x63, 0x35, 0x9b, 0x10, 0x81, 0xa8, 0x19, + 0x92, 0x4c, 0x0c, 0x68, 0x48, 0x42, 0x5e, 0x84, 0x89, 0x4e, 0x77, 0xa7, 0xe9, 0xd4, 0x91, 0xaf, + 0xb0, 0x40, 0x31, 0xc7, 0x39, 0x8c, 0xb1, 0xf5, 0xc9, 0x97, 0x61, 0x12, 0x6f, 0xa3, 0xe1, 0x94, + 0x9b, 0xd2, 0xde, 0x5f, 0xb5, 0x32, 0x2e, 0x93, 0xd6, 0x19, 0xc8, 0x4a, 0x31, 0x94, 0xd2, 0x19, + 0x91, 0xbb, 0x30, 0xba, 0xe7, 0x04, 0xd6, 0x7e, 0x77, 0x67, 0x7e, 0x5a, 0xb3, 0x32, 0xba, 0xe3, + 0x04, 0x2b, 0xdd, 0x1d, 0x3e, 0xe4, 0x21, 0x6b, 0xdc, 0xf1, 0xf6, 0x9c, 0x60, 0xbf, 0xab, 0x2a, + 0xcf, 0x47, 0xf6, 0x10, 0x77, 0xa1, 0x06, 0x53, 0xfa, 0xac, 0x78, 0x0a, 0x4f, 0xba, 0xa1, 0x81, + 0x4d, 0xbe, 0x30, 0x76, 0x77, 0x28, 0x0f, 0x85, 0x71, 0x6e, 0x5a, 0x63, 0xc2, 0x46, 0xd8, 0x3f, + 0x26, 0xb9, 0xd7, 0xdd, 0xa1, 0x5e, 0x9b, 0x06, 0xd4, 0x17, 0x57, 0x3f, 0xdf, 0x1c, 0x2a, 0x75, + 0x3a, 0xbe, 0xf1, 0x9f, 0x66, 0x61, 0xb4, 0xb4, 0x5d, 0xab, 0xb6, 0x77, 0x5d, 0x7c, 0x98, 0x0d, + 0xdf, 0xe3, 0xd4, 0x87, 0xd9, 0xf0, 0x3d, 0x4e, 0x7d, 0x85, 0xbb, 0x9e, 0x72, 0x79, 0x47, 0xdb, + 0x6d, 0xe5, 0xf2, 0xae, 0xa9, 0x1d, 0xa2, 0xa7, 0xc9, 0xdc, 0x00, 0x4f, 0x93, 0xa1, 0xf6, 0x78, + 0xe8, 0x64, 0xed, 0xf1, 0x3b, 0x30, 0x5e, 0x6d, 0x07, 0x74, 0xcf, 0x8b, 0x56, 0x4d, 0xa8, 0x48, + 0x08, 0xc1, 0xea, 0x85, 0x4e, 0xc1, 0x66, 0x53, 0x92, 0x6b, 0xac, 0x43, 0x4d, 0x35, 0x4e, 0x49, + 0xae, 0xd8, 0x8e, 0x69, 0x81, 0x24, 0xa2, 0x51, 0x89, 0xcd, 0x37, 0x69, 0xfe, 0xc1, 0x45, 0xa8, + 0xa9, 0xe8, 0xc9, 0x86, 0x75, 0xec, 0xd2, 0x4c, 0xba, 0xf9, 0x87, 0xf1, 0xb7, 0x33, 0x30, 0x97, + 0x36, 0x8d, 0xc8, 0xfb, 0x30, 0xe1, 0x7a, 0x7b, 0x76, 0xdb, 0xf9, 0x5e, 0xde, 0x22, 0x45, 0x55, + 0xa9, 0xc2, 0x55, 0x05, 0x8d, 0x0a, 0x67, 0x1d, 0xa2, 0xb4, 0x5c, 0xd7, 0xac, 0xa4, 0x76, 0x88, + 0x02, 0x36, 0x7e, 0x24, 0x0b, 0xe3, 0xa5, 0x4e, 0xe7, 0x19, 0x37, 0x0d, 0xfc, 0xbc, 0x76, 0x80, + 0xc8, 0x7b, 0x79, 0xd8, 0xae, 0x81, 0xac, 0x02, 0x7f, 0x35, 0x0b, 0xd3, 0x31, 0x0a, 0xf5, 0xeb, + 0x33, 0x03, 0x1a, 0x04, 0x66, 0x07, 0x34, 0x08, 0xcc, 0x0d, 0x66, 0x10, 0x38, 0xf4, 0x24, 0x87, + 0xc2, 0xab, 0x90, 0x2b, 0x75, 0x3a, 0x71, 0xc3, 0x82, 0x4e, 0xe7, 0xc1, 0x4d, 0xae, 0x5b, 0xb1, + 0x3b, 0x1d, 0x93, 0x61, 0x68, 0x3b, 0xf5, 0xc8, 0x80, 0x3b, 0xb5, 0xf1, 0x26, 0x8c, 0x21, 0x2f, + 0x34, 0xc3, 0xbb, 0x04, 0xb8, 0xc5, 0x08, 0x0b, 0x3c, 0xad, 0x2e, 0xb1, 0xf9, 0xfc, 0xcb, 0x0c, + 0x0c, 0xe3, 0xef, 0x67, 0x74, 0x8e, 0x2d, 0x6a, 0x73, 0xac, 0xa0, 0xcc, 0xb1, 0x41, 0x66, 0xd7, + 0x3f, 0xcc, 0x01, 0x94, 0xef, 0x9b, 0x35, 0xae, 0x82, 0x23, 0xb7, 0x61, 0xda, 0x6e, 0x36, 0xdd, + 0x47, 0xb4, 0x61, 0xb9, 0x9e, 0xb3, 0xe7, 0xb4, 0x79, 0xcf, 0xc9, 0xd7, 0x6e, 0xbd, 0x48, 0x7d, + 0x03, 0x13, 0x45, 0xf7, 0x79, 0x89, 0xca, 0xa7, 0x45, 0x83, 0x7d, 0xb7, 0x21, 0x95, 0x09, 0x1a, + 0x1f, 0x51, 0x94, 0xc2, 0x67, 0x8d, 0x97, 0xa8, 0x7c, 0xf6, 0x51, 0x39, 0x22, 0x25, 0x64, 0x8d, + 0x8f, 0x28, 0x4a, 0xe1, 0xc3, 0x35, 0x2a, 0x3e, 0x59, 0x85, 0x19, 0x84, 0x58, 0x75, 0x8f, 0x36, + 0x68, 0x3b, 0x70, 0xec, 0xa6, 0x2f, 0xd4, 0x4f, 0xa8, 0xa8, 0x4c, 0x14, 0xaa, 0xd7, 0x6f, 0x2c, + 0x2c, 0x47, 0x65, 0xe4, 0x1a, 0x8c, 0xb6, 0xec, 0xc7, 0x96, 0xbd, 0xc7, 0xed, 0x3e, 0x26, 0xb9, + 0xba, 0x42, 0x80, 0xd4, 0x63, 0xa4, 0x65, 0x3f, 0x2e, 0xed, 0x51, 0xd6, 0x0a, 0xfa, 0xb8, 0xe3, + 0xfa, 0x4a, 0x2b, 0x46, 0xa2, 0x56, 0xc4, 0x8a, 0xd4, 0x56, 0x88, 0x22, 0xd1, 0x0a, 0xe3, 0x57, + 0x32, 0xf0, 0x7c, 0x15, 0xbf, 0x22, 0x38, 0x2c, 0xd3, 0x76, 0x40, 0xbd, 0x0d, 0xea, 0xb5, 0x1c, + 0x7c, 0x05, 0xaf, 0xd1, 0x80, 0xbc, 0x04, 0xb9, 0x92, 0xb9, 0x2e, 0xe6, 0x2f, 0xdf, 0xef, 0x35, + 0x9b, 0x04, 0x56, 0x1a, 0x6a, 0xb4, 0xb2, 0x27, 0xa8, 0xaa, 0x4b, 0x30, 0x51, 0xf2, 0x7d, 0x67, + 0xaf, 0xdd, 0xe2, 0xfe, 0x14, 0x39, 0xcd, 0xea, 0x41, 0xc0, 0x13, 0x6f, 0x2c, 0x2a, 0x89, 0xf1, + 0x9f, 0x65, 0x60, 0xa6, 0xd4, 0xe9, 0xe8, 0x9f, 0xac, 0x5b, 0xdc, 0x64, 0x06, 0xb7, 0xb8, 0x71, + 0x60, 0x4a, 0x6b, 0x2e, 0x9f, 0x52, 0x91, 0xe0, 0xdb, 0xa7, 0x67, 0xf8, 0x67, 0x77, 0x42, 0x90, + 0xe5, 0xeb, 0xcf, 0xc5, 0x31, 0xc6, 0xc6, 0xbf, 0x37, 0x8a, 0x7b, 0x88, 0xd8, 0x6d, 0x85, 0x4d, + 0x68, 0x26, 0xc5, 0x26, 0xf4, 0x6d, 0x50, 0x24, 0x1c, 0xf5, 0x88, 0x53, 0x64, 0x45, 0x55, 0x17, + 0x14, 0x21, 0x93, 0x83, 0xb8, 0x75, 0x68, 0x0e, 0x5b, 0xf3, 0x52, 0x7c, 0x01, 0x3f, 0x15, 0xc3, + 0xd0, 0x15, 0x20, 0xd5, 0x36, 0x3e, 0x61, 0xd3, 0xda, 0x81, 0xd3, 0x79, 0x40, 0x3d, 0x67, 0xf7, + 0x50, 0x2c, 0x00, 0xec, 0x7c, 0x47, 0x94, 0x5a, 0xfe, 0x81, 0xd3, 0xb1, 0x1e, 0x62, 0xb9, 0x99, + 0x42, 0x43, 0x3e, 0x80, 0x51, 0x93, 0x3e, 0xf2, 0x9c, 0x40, 0xda, 0x3c, 0x4d, 0x85, 0xaa, 0x4d, + 0x84, 0xf2, 0xb5, 0xe0, 0xf1, 0x1f, 0xea, 0xae, 0x28, 0xca, 0xc9, 0x22, 0x17, 0x52, 0xb8, 0x6d, + 0xd3, 0x64, 0xd4, 0xda, 0xd2, 0x76, 0xad, 0x97, 0x8c, 0x42, 0xae, 0xc2, 0x30, 0x4a, 0x3a, 0xe2, + 0x2e, 0x80, 0xbe, 0x42, 0x28, 0x3b, 0xab, 0x62, 0x18, 0x62, 0x90, 0x8b, 0x00, 0xe1, 0x1b, 0xb1, + 0x3f, 0x9f, 0x47, 0x29, 0x5d, 0x81, 0xc4, 0xc5, 0xb4, 0xb1, 0x53, 0x89, 0x69, 0xab, 0x50, 0x30, + 0xb9, 0xdb, 0x61, 0xa3, 0xd4, 0xc1, 0x87, 0x48, 0x7f, 0x1e, 0x70, 0x25, 0x5f, 0x3a, 0x3e, 0x2a, + 0xbe, 0x20, 0x5c, 0x12, 0x1b, 0x96, 0xdd, 0xe1, 0xef, 0x97, 0xda, 0x36, 0x12, 0xa7, 0x24, 0x6f, + 0xc3, 0x10, 0xdb, 0x7a, 0x85, 0x1d, 0xa9, 0x7c, 0xd0, 0x89, 0x76, 0x63, 0xbe, 0x38, 0xeb, 0xae, + 0xb6, 0x27, 0x20, 0x09, 0xb1, 0x60, 0x4a, 0x9f, 0xee, 0xc2, 0xa4, 0x68, 0x3e, 0xea, 0x4f, 0xbd, + 0x5c, 0xbc, 0xf2, 0x08, 0x98, 0x55, 0x47, 0xa0, 0xba, 0x02, 0x62, 0x8b, 0x74, 0x19, 0xf2, 0x9b, + 0xe5, 0x8d, 0x0d, 0xd7, 0x0b, 0xf8, 0x55, 0x27, 0x3a, 0x59, 0x18, 0xcc, 0xb4, 0xdb, 0x7b, 0x94, + 0x9f, 0xc5, 0x41, 0xbd, 0x63, 0x75, 0x18, 0x9a, 0x7a, 0x16, 0x4b, 0xd2, 0x4f, 0xce, 0x86, 0xf4, + 0x57, 0xb3, 0xf0, 0x52, 0x28, 0x15, 0xdd, 0xf7, 0x6a, 0xa5, 0xb5, 0xd5, 0x6a, 0x63, 0x43, 0xa8, + 0x49, 0x36, 0x3c, 0xf7, 0xa1, 0xd3, 0xa0, 0xde, 0x83, 0x1b, 0x27, 0x9c, 0xe9, 0xab, 0x7c, 0x99, + 0xf3, 0xd7, 0xb0, 0xac, 0x66, 0x6d, 0xa7, 0x08, 0x9f, 0x62, 0x7b, 0xea, 0x74, 0x12, 0x8f, 0x63, + 0x2b, 0xcf, 0x99, 0x11, 0x03, 0xf2, 0x03, 0x19, 0x38, 0x9b, 0xfe, 0x21, 0x42, 0x75, 0x56, 0x94, + 0x57, 0xf4, 0x1e, 0x5f, 0xbb, 0xf4, 0xea, 0xf1, 0x51, 0xf1, 0x25, 0xdf, 0x6e, 0x35, 0x2d, 0xa7, + 0xc1, 0x6b, 0x73, 0xea, 0xd4, 0xea, 0x08, 0x04, 0xad, 0xde, 0x1e, 0x35, 0x7d, 0x01, 0xe4, 0xd1, + 0x3e, 0x9f, 0x59, 0x02, 0xc8, 0xcb, 0x07, 0x07, 0xe3, 0x37, 0x32, 0xa0, 0x2c, 0xc1, 0xbc, 0x49, + 0x1b, 0x8e, 0x47, 0xeb, 0x81, 0x38, 0xde, 0x85, 0xaf, 0x20, 0x87, 0xc5, 0x8c, 0x2b, 0x11, 0x46, + 0xde, 0x87, 0x51, 0x71, 0x0c, 0x89, 0x6d, 0x57, 0x2e, 0x5d, 0xf1, 0x94, 0xc1, 0x9d, 0x4a, 0x13, + 0x47, 0x98, 0x24, 0x62, 0xbb, 0xfe, 0xdd, 0xed, 0xcd, 0x72, 0xd3, 0x76, 0x5a, 0xbe, 0x38, 0x4b, + 0xb0, 0x5b, 0x3f, 0x7a, 0x14, 0x58, 0x75, 0x84, 0xaa, 0xbb, 0x7e, 0x88, 0x6a, 0xdc, 0x91, 0x2f, + 0x29, 0x27, 0x58, 0x08, 0x17, 0x61, 0xf8, 0x41, 0xa4, 0xa7, 0x5b, 0x1a, 0x3b, 0x3e, 0x2a, 0xf2, + 0xe9, 0x62, 0x72, 0xb8, 0xf1, 0x15, 0x18, 0x0b, 0xa7, 0x2e, 0xe3, 0xc5, 0x7e, 0x20, 0xaf, 0x49, + 0xce, 0x8b, 0x4d, 0x62, 0x13, 0xa1, 0x4c, 0xd4, 0x5b, 0x6e, 0x37, 0x10, 0x21, 0x8b, 0x08, 0xd8, + 0x3d, 0xb4, 0xdd, 0xc0, 0x99, 0xae, 0xb6, 0x4e, 0xa0, 0x19, 0x3f, 0x96, 0x81, 0x29, 0x7d, 0xb2, + 0x92, 0x6b, 0x30, 0x22, 0x9c, 0x00, 0x33, 0xa8, 0xec, 0x64, 0x3c, 0x46, 0xb8, 0xfb, 0x9f, 0xe6, + 0xf4, 0x27, 0xb0, 0x98, 0xb4, 0x28, 0x38, 0x08, 0x51, 0x09, 0xa5, 0xc5, 0x3a, 0x07, 0x99, 0xb2, + 0x8c, 0x18, 0xec, 0x02, 0xeb, 0x77, 0x9b, 0x81, 0xfa, 0x5a, 0xe9, 0x21, 0xc4, 0x14, 0x25, 0x46, + 0x19, 0x46, 0xf8, 0x86, 0x1a, 0x33, 0x7b, 0xcc, 0x9c, 0xc2, 0xec, 0xd1, 0x38, 0xca, 0x00, 0xd4, + 0x6a, 0x2b, 0xf7, 0xe8, 0xe1, 0x86, 0xed, 0xe0, 0xa9, 0xcd, 0x0f, 0xaf, 0x7b, 0x62, 0xe5, 0x4e, + 0x88, 0xe7, 0x75, 0x7e, 0xd0, 0x1d, 0xd0, 0x43, 0xed, 0x79, 0x5d, 0xa2, 0xe2, 0x09, 0xe9, 0x39, + 0x0f, 0xed, 0x80, 0x32, 0xc2, 0x2c, 0x12, 0xf2, 0x13, 0x92, 0x43, 0x63, 0x94, 0x0a, 0x32, 0xf9, + 0x1a, 0x4c, 0x45, 0xbf, 0x42, 0x23, 0x81, 0xa9, 0x70, 0x77, 0xd0, 0x0b, 0x97, 0x2e, 0x1e, 0x1f, + 0x15, 0x17, 0x14, 0xae, 0x71, 0xf3, 0x81, 0x18, 0x33, 0xe3, 0x97, 0x32, 0x68, 0x1a, 0x23, 0x1b, + 0x78, 0x19, 0x86, 0x42, 0x63, 0xee, 0x09, 0xb1, 0xf5, 0xea, 0x0f, 0xa1, 0x58, 0xce, 0x84, 0xac, + 0xa8, 0x25, 0x78, 0x60, 0xe9, 0x2d, 0x60, 0xa5, 0xe4, 0x0e, 0x8c, 0x0e, 0xf4, 0xcd, 0x38, 0xb1, + 0x52, 0xbe, 0x55, 0x52, 0xe3, 0x28, 0xdc, 0xdd, 0xde, 0xfc, 0xf4, 0x8e, 0xc2, 0x4f, 0x66, 0x61, + 0x9a, 0xf5, 0x6b, 0xa9, 0x1b, 0xec, 0xbb, 0x9e, 0x13, 0x1c, 0x3e, 0xb3, 0xda, 0xe2, 0x77, 0xb5, + 0x8b, 0xd8, 0x82, 0x3c, 0xc2, 0xd4, 0xb6, 0x0d, 0xa4, 0x34, 0xfe, 0xef, 0x87, 0x61, 0x36, 0x85, + 0x8a, 0xbc, 0xa1, 0x3d, 0xe8, 0xcc, 0x4b, 0x27, 0xff, 0xef, 0x1e, 0x15, 0x27, 0x24, 0xfa, 0x66, + 0xe4, 0xf4, 0xbf, 0xa8, 0xdb, 0x99, 0xf1, 0x9e, 0xc2, 0xf7, 0x1d, 0xd5, 0xce, 0x4c, 0xb7, 0x2e, + 0xbb, 0x0a, 0xc3, 0xa6, 0xdb, 0xa4, 0xd2, 0xb6, 0x12, 0xc5, 0x2c, 0x8f, 0x01, 0x34, 0x5b, 0x12, + 0x06, 0x20, 0x2b, 0x30, 0xca, 0xfe, 0x58, 0xb3, 0x3b, 0xe2, 0x95, 0x94, 0x84, 0xaa, 0x00, 0x84, + 0x76, 0x9c, 0xf6, 0x9e, 0xaa, 0x0d, 0x68, 0x52, 0xab, 0x65, 0x77, 0x34, 0x79, 0x90, 0x23, 0x6a, + 0x5a, 0x85, 0x7c, 0x6f, 0xad, 0x42, 0xe6, 0x44, 0xad, 0xc2, 0x2e, 0x40, 0xcd, 0xd9, 0x6b, 0x3b, + 0xed, 0xbd, 0x52, 0x73, 0x4f, 0x84, 0x4a, 0xb8, 0xda, 0x7b, 0x14, 0xae, 0x45, 0xc8, 0x38, 0x71, + 0x9f, 0x47, 0x53, 0x06, 0x0e, 0xb3, 0xec, 0xe6, 0x9e, 0xe6, 0xd2, 0xa5, 0x70, 0x26, 0xeb, 0x00, + 0xa5, 0x7a, 0xe0, 0x3c, 0x64, 0x53, 0xd8, 0x17, 0xc2, 0x9b, 0xfc, 0xe4, 0x72, 0xe9, 0x1e, 0x3d, + 0xc4, 0x0b, 0x87, 0x7c, 0x14, 0xb6, 0x11, 0x95, 0xad, 0x04, 0xcd, 0x5f, 0x27, 0xe2, 0x40, 0x3a, + 0x70, 0xa6, 0xd4, 0x68, 0x38, 0xac, 0x0d, 0x76, 0x73, 0x93, 0x07, 0xb9, 0x40, 0xd6, 0x13, 0xe9, + 0xac, 0xaf, 0xca, 0xf7, 0x4f, 0x3b, 0xa4, 0xb2, 0x64, 0x6c, 0x8c, 0x58, 0x35, 0xe9, 0x8c, 0x8d, + 0x1a, 0x4c, 0xe9, 0x8d, 0xd7, 0x43, 0x3c, 0x4c, 0x40, 0xde, 0xac, 0x95, 0xac, 0xda, 0x4a, 0xe9, + 0x46, 0x21, 0x43, 0x0a, 0x30, 0x21, 0x7e, 0x2d, 0x5a, 0x8b, 0x6f, 0xdd, 0x2a, 0x64, 0x35, 0xc8, + 0x5b, 0x37, 0x16, 0x0b, 0xb9, 0x85, 0xec, 0x7c, 0x26, 0xe6, 0x5d, 0x39, 0x5a, 0xc8, 0x73, 0x45, + 0xb0, 0xf1, 0x6b, 0x19, 0xc8, 0xcb, 0x6f, 0x27, 0xb7, 0x20, 0x57, 0xab, 0xad, 0xc4, 0xfc, 0x21, + 0xa3, 0x53, 0x86, 0xef, 0xa7, 0xbe, 0xaf, 0x1a, 0xbd, 0x33, 0x02, 0x46, 0xb7, 0xb9, 0x5a, 0x13, + 0x92, 0x87, 0xa4, 0x8b, 0x36, 0x6f, 0x4e, 0x97, 0xe2, 0x24, 0x76, 0x0b, 0x72, 0x77, 0xb7, 0x37, + 0xc5, 0xd5, 0x4a, 0xd2, 0x45, 0xfb, 0x29, 0xa7, 0xfb, 0xe8, 0x91, 0xba, 0xcb, 0x33, 0x02, 0xc3, + 0x84, 0x71, 0x65, 0x22, 0xf3, 0x43, 0xb7, 0xe5, 0x86, 0x71, 0x0d, 0xc4, 0xa1, 0xcb, 0x20, 0xa6, + 0x28, 0x61, 0x02, 0xc8, 0xaa, 0x5b, 0xb7, 0x9b, 0xe2, 0xf4, 0x46, 0x01, 0xa4, 0xc9, 0x00, 0x26, + 0x87, 0x1b, 0xbf, 0x93, 0x81, 0x02, 0x8a, 0x69, 0x68, 0xb4, 0xee, 0x1e, 0xd0, 0xf6, 0x83, 0x1b, + 0xe4, 0x4d, 0xb9, 0xe4, 0x32, 0xa1, 0x7a, 0x6b, 0x18, 0x97, 0x5c, 0xec, 0x05, 0x50, 0x2c, 0x3b, + 0x25, 0x74, 0x44, 0x76, 0x70, 0x97, 0xf3, 0x13, 0x42, 0x47, 0x14, 0x61, 0x18, 0x3f, 0x47, 0x6c, + 0x8e, 0xf8, 0xe5, 0x01, 0x03, 0x98, 0x1c, 0xae, 0xec, 0x4d, 0x3f, 0x9d, 0x4d, 0xb4, 0x61, 0xf1, + 0x53, 0xe5, 0xb6, 0xad, 0x37, 0x6e, 0xa0, 0xfd, 0xfa, 0x43, 0x98, 0x8b, 0x77, 0x09, 0xaa, 0x1e, + 0x4b, 0x30, 0xad, 0xc3, 0xa5, 0x16, 0xf2, 0x5c, 0x6a, 0x5d, 0x0f, 0x16, 0xcd, 0x38, 0xbe, 0xf1, + 0x7f, 0x64, 0x60, 0x0c, 0xff, 0x34, 0xbb, 0x4d, 0x34, 0x1e, 0x2c, 0x6d, 0xd7, 0x84, 0x42, 0x44, + 0x15, 0xe6, 0xec, 0x47, 0xbe, 0x25, 0xb4, 0x27, 0xda, 0x1e, 0x13, 0x22, 0x0b, 0x52, 0xfe, 0xaa, + 0x21, 0x55, 0x71, 0x21, 0x29, 0x7f, 0xfe, 0xf0, 0x63, 0xa4, 0x02, 0x19, 0x4d, 0x8e, 0xb7, 0x6b, + 0x6c, 0xfa, 0xa9, 0xd6, 0x3c, 0x48, 0xe7, 0x36, 0x75, 0x93, 0x63, 0x8e, 0x86, 0xc6, 0x3c, 0xdb, + 0xb5, 0x92, 0xb9, 0xae, 0x19, 0xf3, 0xb0, 0x6f, 0xd4, 0xb4, 0x51, 0x02, 0xc9, 0xf8, 0xf9, 0xf1, + 0x78, 0x07, 0x8a, 0x03, 0xef, 0x94, 0x6b, 0xe3, 0x1d, 0x18, 0x2e, 0x35, 0x9b, 0xee, 0x23, 0xb1, + 0x4b, 0xc8, 0xfb, 0x6a, 0xd8, 0x7f, 0xfc, 0x3c, 0x43, 0x65, 0x9e, 0xe6, 0x8a, 0xca, 0x00, 0xa4, + 0x0c, 0x63, 0xa5, 0xed, 0x5a, 0xb5, 0x5a, 0xd9, 0xdc, 0xe4, 0x6e, 0x77, 0xb9, 0xa5, 0x57, 0x64, + 0xff, 0x38, 0x4e, 0xc3, 0x8a, 0x5b, 0x29, 0x44, 0xf2, 0x7b, 0x44, 0x47, 0xde, 0x03, 0xb8, 0xeb, + 0x3a, 0x6d, 0xae, 0xbc, 0x14, 0x8d, 0x67, 0xf7, 0xee, 0xf1, 0x8f, 0x5c, 0xa7, 0x2d, 0xb4, 0x9d, + 0xec, 0xdb, 0x23, 0x24, 0x53, 0xf9, 0x9b, 0xf5, 0xf4, 0x92, 0xcb, 0x0d, 0x02, 0x87, 0xa3, 0x9e, + 0xde, 0x71, 0x13, 0x5a, 0x36, 0x89, 0x46, 0x5a, 0x30, 0x5d, 0xeb, 0xee, 0xed, 0x51, 0xb6, 0xb3, + 0x0b, 0x2d, 0xd2, 0x88, 0xb8, 0x40, 0x87, 0xc1, 0x8e, 0xf8, 0x7d, 0x84, 0x5d, 0x81, 0xfc, 0xa5, + 0x37, 0xd8, 0x44, 0xfe, 0xce, 0x51, 0x51, 0x58, 0x3f, 0x30, 0x51, 0xcd, 0x97, 0xf4, 0x49, 0x1d, + 0x52, 0x9c, 0x37, 0xb9, 0x0f, 0x23, 0xfc, 0xa5, 0x48, 0xb8, 0x91, 0xbd, 0xd8, 0x67, 0xd1, 0x70, + 0xc4, 0x5e, 0x6f, 0x91, 0xbc, 0x94, 0x6c, 0x43, 0xbe, 0xec, 0x78, 0xf5, 0x26, 0x2d, 0x57, 0xc5, + 0xd9, 0xff, 0x52, 0x1f, 0x96, 0x12, 0x95, 0xf7, 0x4b, 0x1d, 0x7f, 0xd5, 0x1d, 0x55, 0x16, 0x90, + 0x18, 0xe4, 0x6f, 0x67, 0xe0, 0xf9, 0xf0, 0xeb, 0x4b, 0x7b, 0xb4, 0x1d, 0xac, 0xd9, 0x41, 0x7d, + 0x9f, 0x7a, 0xa2, 0x97, 0xc6, 0xfa, 0xf5, 0xd2, 0x17, 0x12, 0xbd, 0x74, 0x25, 0xea, 0x25, 0x9b, + 0x31, 0xb3, 0x5a, 0x9c, 0x5b, 0xb2, 0xcf, 0xfa, 0xd5, 0x4a, 0x2c, 0x80, 0xe8, 0x0d, 0x54, 0xb8, + 0x21, 0xbf, 0xd2, 0xa7, 0xc1, 0x11, 0xb2, 0x70, 0x1f, 0x0a, 0x7f, 0x6b, 0xf6, 0xaf, 0x21, 0x94, + 0xdc, 0x93, 0x3e, 0x9b, 0x5c, 0x2a, 0xb9, 0xd4, 0x87, 0x37, 0xf7, 0xe3, 0x9c, 0xed, 0xe3, 0x9d, + 0xcd, 0x47, 0x7b, 0xd5, 0xde, 0x11, 0x82, 0xc8, 0x09, 0xa3, 0xbd, 0x6a, 0x47, 0xa3, 0xdd, 0xb4, + 0xe3, 0xa3, 0xbd, 0x6a, 0xef, 0x90, 0x32, 0x77, 0x34, 0xe7, 0x5e, 0xc9, 0x17, 0xfb, 0x71, 0x2b, + 0x6f, 0xf0, 0x93, 0x39, 0xc5, 0xe1, 0xfc, 0x2b, 0x30, 0x56, 0xeb, 0xd8, 0x75, 0xda, 0x74, 0x76, + 0x03, 0xf1, 0xc0, 0xfe, 0x72, 0x1f, 0x56, 0x21, 0xae, 0x78, 0x50, 0x95, 0x3f, 0xd5, 0x6b, 0x52, + 0x88, 0xc3, 0xbe, 0x70, 0x73, 0x63, 0x4d, 0xbc, 0xb1, 0xf7, 0xfb, 0xc2, 0xcd, 0x8d, 0x35, 0x21, + 0x73, 0x74, 0x5a, 0x9a, 0xcc, 0xb1, 0xb1, 0x46, 0x3a, 0x30, 0xb5, 0x49, 0x3d, 0xcf, 0xde, 0x75, + 0xbd, 0x16, 0xd7, 0x5a, 0x72, 0x4f, 0xb7, 0xab, 0xfd, 0xf8, 0x69, 0x04, 0x5c, 0x59, 0x17, 0x48, + 0x98, 0x15, 0x57, 0x75, 0xc6, 0xf8, 0xb3, 0x3e, 0x59, 0x72, 0x82, 0x9d, 0x6e, 0xfd, 0x80, 0x06, + 0xf3, 0x33, 0x27, 0xf6, 0x49, 0x88, 0xcb, 0xfb, 0x64, 0x47, 0xfe, 0x54, 0xfb, 0x24, 0xc4, 0x31, + 0x7e, 0x33, 0x07, 0xe7, 0x7a, 0x74, 0x01, 0x59, 0x97, 0x5b, 0x6e, 0x46, 0xd3, 0x5d, 0xf7, 0x40, + 0xbf, 0x76, 0xe2, 0x2e, 0xbc, 0x0a, 0x85, 0xe5, 0x7b, 0x28, 0xab, 0xf3, 0xe7, 0x9b, 0x72, 0x49, + 0x1e, 0x56, 0xa8, 0x5f, 0xa5, 0x07, 0x68, 0x19, 0x2c, 0x9f, 0x7d, 0xea, 0x9a, 0x0b, 0x7c, 0x82, + 0x72, 0xe1, 0xfb, 0xb3, 0x30, 0x84, 0x07, 0x67, 0x2c, 0xf0, 0x57, 0xe6, 0x54, 0x81, 0xbf, 0xbe, + 0x08, 0x13, 0xcb, 0xf7, 0xf8, 0x4d, 0x7a, 0xc5, 0xf6, 0xf7, 0xc5, 0xb6, 0x8e, 0xe6, 0x1b, 0xf4, + 0xc0, 0x12, 0x17, 0xef, 0x7d, 0x5b, 0x93, 0x59, 0x35, 0x0a, 0xb2, 0x05, 0xb3, 0xfc, 0xdb, 0x9c, + 0x5d, 0xa7, 0xce, 0xe3, 0x07, 0x39, 0x76, 0x53, 0xec, 0xf1, 0x2f, 0x1d, 0x1f, 0x15, 0x8b, 0xf4, + 0x00, 0x6d, 0x9e, 0x45, 0xb9, 0xe5, 0x23, 0x82, 0x6a, 0xfc, 0x9c, 0x42, 0xaf, 0x06, 0x35, 0x31, + 0xc7, 0xb0, 0x42, 0x56, 0x1b, 0xab, 0x9b, 0xe1, 0x72, 0x24, 0xe3, 0x4f, 0x87, 0x61, 0xa1, 0xf7, + 0xf6, 0x4c, 0xbe, 0xa4, 0x0f, 0xe0, 0xe5, 0x13, 0x37, 0xf4, 0x93, 0xc7, 0xf0, 0xcb, 0x30, 0xb7, + 0xdc, 0x0e, 0xa8, 0xd7, 0xf1, 0x1c, 0x19, 0xc6, 0x66, 0xc5, 0xf5, 0xa5, 0x8d, 0x39, 0x1a, 0x7b, + 0xd3, 0xb0, 0x5c, 0x68, 0x54, 0xd1, 0xe2, 0x5d, 0x61, 0x95, 0xca, 0x81, 0x2c, 0xc3, 0x94, 0x02, + 0x6f, 0x76, 0xf7, 0xd4, 0x37, 0x29, 0x95, 0x67, 0xb3, 0xab, 0x1a, 0xe0, 0xc6, 0x88, 0xd0, 0x8e, + 0x9d, 0x5d, 0x19, 0xeb, 0x77, 0xb7, 0xef, 0xd5, 0xc4, 0x70, 0x72, 0x3b, 0x76, 0x84, 0x5a, 0x1f, + 0x3d, 0x3a, 0xd0, 0xf6, 0xd7, 0x08, 0x79, 0xe1, 0x97, 0x72, 0x62, 0x46, 0xbd, 0x04, 0xb9, 0x5a, + 0x77, 0x47, 0x7d, 0x69, 0xf3, 0xb5, 0x03, 0x8e, 0x95, 0x92, 0xcf, 0x03, 0x98, 0xb4, 0xe3, 0xfa, + 0x4e, 0xe0, 0x7a, 0x87, 0xaa, 0x23, 0xa5, 0x17, 0x42, 0x75, 0x5f, 0x0f, 0x09, 0x25, 0x2b, 0x30, + 0x1d, 0xfd, 0xba, 0xff, 0xa8, 0x2d, 0x34, 0xc8, 0x63, 0x5c, 0xbb, 0x12, 0x91, 0x5b, 0x2e, 0x2b, + 0x53, 0x8f, 0xec, 0x18, 0x19, 0x59, 0x84, 0xfc, 0xb6, 0xeb, 0x1d, 0xec, 0xb2, 0x31, 0x1e, 0x8a, + 0x84, 0x8a, 0x47, 0x02, 0xa6, 0x1e, 0x9e, 0x12, 0x8f, 0x2d, 0x97, 0xe5, 0xf6, 0x43, 0xc7, 0x73, + 0xf1, 0x1d, 0x4f, 0xb5, 0x64, 0xa1, 0x11, 0x58, 0x73, 0x61, 0x8f, 0xc0, 0xe4, 0x2a, 0x0c, 0x97, + 0xea, 0x81, 0xeb, 0x09, 0x33, 0x16, 0x3e, 0x53, 0x18, 0x40, 0x9b, 0x29, 0x0c, 0xc0, 0x3a, 0xd1, + 0xa4, 0xbb, 0xe2, 0x4d, 0x07, 0x3b, 0xd1, 0xa3, 0xbb, 0x9a, 0x7f, 0x3e, 0xdd, 0x65, 0x42, 0x91, + 0x49, 0x77, 0x51, 0xf1, 0xa1, 0x85, 0xb5, 0xdb, 0x4d, 0xa8, 0xcc, 0x04, 0x9a, 0xf1, 0x7b, 0x63, + 0x3d, 0xa7, 0x3c, 0x3b, 0x85, 0x4e, 0x37, 0xe5, 0x57, 0xed, 0x01, 0xa6, 0xfc, 0x1b, 0xa1, 0x07, + 0x89, 0x1a, 0x94, 0x02, 0x21, 0xea, 0x31, 0xc8, 0x71, 0x16, 0x7e, 0x39, 0x7f, 0x9a, 0x49, 0x24, + 0x3a, 0x29, 0x3b, 0x68, 0x27, 0xe5, 0x06, 0xea, 0x24, 0xb2, 0x04, 0x93, 0x61, 0x60, 0xc4, 0x0d, + 0x3b, 0xd0, 0xb6, 0xb5, 0x30, 0x9a, 0xa5, 0xd5, 0xb1, 0x03, 0x75, 0x5b, 0xd3, 0x49, 0xc8, 0xbb, + 0x30, 0x2e, 0xdc, 0xa8, 0x90, 0xc3, 0x70, 0x64, 0x1f, 0x24, 0x7d, 0xae, 0x62, 0xf4, 0x2a, 0x3a, + 0x5b, 0xcd, 0x1b, 0x4e, 0x87, 0x36, 0x9d, 0x36, 0xad, 0xe1, 0x13, 0x85, 0x98, 0x31, 0xfc, 0xa9, + 0x56, 0x94, 0x58, 0xfc, 0xf5, 0x42, 0xd3, 0x1f, 0x6a, 0x44, 0xf1, 0xc9, 0x3a, 0x7a, 0xaa, 0xc9, + 0xca, 0xad, 0x13, 0xbd, 0x55, 0x77, 0xcf, 0x91, 0x96, 0xf3, 0xd2, 0x3a, 0xd1, 0xb3, 0x9a, 0x0c, + 0x1a, 0xb3, 0x4e, 0xe4, 0xa8, 0xec, 0x86, 0xc3, 0x7e, 0x54, 0x2b, 0xe2, 0xfd, 0x10, 0x6f, 0x38, + 0x48, 0xa4, 0xbb, 0x2b, 0x70, 0x24, 0x59, 0xcd, 0x72, 0xcb, 0x76, 0x9a, 0x22, 0xf6, 0x40, 0x54, + 0x0d, 0x65, 0xd0, 0x78, 0x35, 0x88, 0x4a, 0xea, 0x30, 0x61, 0xd2, 0xdd, 0x0d, 0xcf, 0x0d, 0x68, + 0x3d, 0xa0, 0x0d, 0x21, 0xd5, 0xc9, 0x8b, 0xcd, 0x92, 0xeb, 0x72, 0x89, 0x15, 0x2d, 0xe2, 0x33, + 0xdf, 0x39, 0x2a, 0x02, 0x03, 0x71, 0x5f, 0x98, 0xe3, 0xa3, 0xe2, 0x39, 0x36, 0xfe, 0x1d, 0x49, + 0xac, 0x9e, 0x4e, 0x2a, 0x53, 0xf2, 0x2d, 0xb6, 0x5f, 0x87, 0x5d, 0x12, 0x55, 0x36, 0xd1, 0xa3, + 0xb2, 0xb7, 0x52, 0x2b, 0x2b, 0x2a, 0xbd, 0x9d, 0x5a, 0x69, 0x6a, 0x25, 0xe4, 0x3d, 0x18, 0x2f, + 0x57, 0xcb, 0x6e, 0x7b, 0xd7, 0xd9, 0xab, 0xad, 0x94, 0x50, 0x34, 0x14, 0x7e, 0x50, 0x75, 0xc7, + 0xaa, 0x23, 0xdc, 0xf2, 0xf7, 0x6d, 0xcd, 0x1d, 0x36, 0xc2, 0x27, 0x77, 0x60, 0x4a, 0xfe, 0x34, + 0xe9, 0xee, 0x96, 0x59, 0x45, 0x89, 0x50, 0x3a, 0x9f, 0x85, 0x1c, 0x58, 0x47, 0x74, 0x3d, 0xf5, + 0xa6, 0x10, 0x23, 0x63, 0x93, 0xb1, 0x42, 0x3b, 0x4d, 0xf7, 0x90, 0x7d, 0xde, 0xa6, 0x43, 0x3d, + 0x94, 0x01, 0xc5, 0x64, 0x6c, 0x84, 0x25, 0x56, 0xe0, 0xe8, 0xaf, 0xa6, 0x3a, 0x11, 0x59, 0x87, + 0x19, 0x31, 0xc5, 0x1f, 0x38, 0xbe, 0xb3, 0xe3, 0x34, 0x9d, 0xe0, 0x10, 0xa5, 0x3f, 0x21, 0xc0, + 0xc8, 0x75, 0xf1, 0x30, 0x2c, 0x55, 0x98, 0x25, 0x49, 0x8d, 0x5f, 0xcb, 0xc2, 0x0b, 0xfd, 0x6e, + 0x42, 0xa4, 0xa6, 0x6f, 0x66, 0x57, 0x06, 0xb8, 0x3d, 0x9d, 0xbc, 0x9d, 0x2d, 0xc3, 0xd4, 0x7d, + 0xc5, 0x90, 0x2f, 0x34, 0xac, 0xc4, 0xce, 0x50, 0x4d, 0xfc, 0xf4, 0xd9, 0x1e, 0x23, 0x5a, 0x78, + 0x28, 0xb6, 0xb9, 0x8f, 0xeb, 0x98, 0x79, 0x0b, 0xc6, 0xca, 0x6e, 0x3b, 0xa0, 0x8f, 0x83, 0x58, + 0x18, 0x02, 0x0e, 0x8c, 0x3b, 0xa5, 0x4a, 0x54, 0xe3, 0x5f, 0x67, 0xe1, 0x42, 0xdf, 0xab, 0x00, + 0xd9, 0xd4, 0x7b, 0xed, 0xea, 0x20, 0xf7, 0x87, 0x93, 0xbb, 0x6d, 0x31, 0x61, 0x6d, 0x77, 0xa2, + 0xdf, 0xd3, 0xc2, 0xff, 0x98, 0x11, 0x9d, 0xf4, 0x19, 0x18, 0xc5, 0xaa, 0xc2, 0x2e, 0xe2, 0x5a, + 0x32, 0xdc, 0x85, 0x1d, 0x5d, 0x4b, 0xc6, 0xd1, 0xc8, 0x4d, 0xc8, 0x97, 0xed, 0x66, 0x53, 0x09, + 0xd2, 0x80, 0xd2, 0x7c, 0x1d, 0x61, 0x31, 0x93, 0x51, 0x89, 0xc8, 0x64, 0x1f, 0xfe, 0xb7, 0x72, + 0x56, 0xe0, 0x66, 0x29, 0xc8, 0x62, 0xc7, 0x85, 0x82, 0x8c, 0xa1, 0x5d, 0xeb, 0x6e, 0xe8, 0x06, + 0xce, 0x43, 0xbb, 0x32, 0x80, 0x16, 0xda, 0x95, 0x01, 0x8c, 0x5f, 0xcf, 0xc1, 0xc5, 0xfe, 0xf7, + 0x59, 0xb2, 0xa5, 0x0f, 0xc1, 0x6b, 0x03, 0xdd, 0x82, 0x4f, 0x1e, 0x03, 0x19, 0x28, 0x99, 0x77, + 0xc8, 0x95, 0xa4, 0xd3, 0xcb, 0x77, 0x8f, 0x8a, 0x8a, 0x1d, 0xf2, 0x5d, 0xd7, 0x69, 0x2b, 0x6f, + 0x26, 0xdf, 0xd4, 0x24, 0x43, 0xfe, 0x66, 0x7f, 0x6b, 0xb0, 0x2f, 0x8b, 0xe8, 0xf8, 0xbe, 0x32, + 0xa8, 0x44, 0xf9, 0x05, 0x28, 0xc4, 0x49, 0xc9, 0x65, 0x18, 0xc2, 0x0f, 0x50, 0x3c, 0x77, 0x62, + 0x1c, 0xb0, 0x7c, 0x61, 0x4d, 0xcc, 0x1d, 0x8c, 0x5b, 0x81, 0x56, 0x00, 0xba, 0x6e, 0x50, 0xc4, + 0xad, 0xe0, 0x46, 0x04, 0x49, 0xfd, 0x60, 0x8c, 0xc8, 0xf8, 0xf3, 0x0c, 0x9c, 0xef, 0xa9, 0x29, + 0x20, 0x1b, 0xfa, 0x80, 0xbd, 0x72, 0x92, 0x6a, 0xe1, 0xc4, 0xb1, 0x5a, 0xf8, 0x71, 0x39, 0xf7, + 0xdf, 0x87, 0x89, 0x5a, 0x77, 0x27, 0x7e, 0x3f, 0xe3, 0x51, 0x65, 0x14, 0xb8, 0x7a, 0x82, 0xa9, + 0xf8, 0xac, 0xfd, 0xd2, 0xcc, 0x41, 0x98, 0xfd, 0x28, 0xb6, 0x86, 0xa1, 0x63, 0x75, 0x32, 0x6e, + 0x87, 0x4e, 0x64, 0xfc, 0x6a, 0x36, 0xfd, 0xa2, 0x7b, 0xa7, 0xbc, 0x71, 0x9a, 0x8b, 0xee, 0x9d, + 0xf2, 0xc6, 0xc9, 0x6d, 0xff, 0xc7, 0xb2, 0xed, 0xf8, 0x30, 0x2b, 0x76, 0x3c, 0xa9, 0xe8, 0x14, + 0x0f, 0xb3, 0x72, 0x77, 0xf4, 0xf5, 0x87, 0x59, 0x89, 0x4c, 0xde, 0x82, 0xb1, 0x55, 0x97, 0x87, + 0xd4, 0x90, 0x2d, 0xe6, 0x9e, 0xc7, 0x12, 0xa8, 0x6e, 0x8f, 0x21, 0x26, 0xbb, 0x5b, 0xe8, 0x03, + 0x2f, 0x4d, 0x2a, 0xf1, 0x6e, 0x11, 0x9b, 0x2e, 0xba, 0x3a, 0x50, 0x27, 0x33, 0xfe, 0x93, 0x61, + 0x30, 0x4e, 0x56, 0x66, 0x90, 0x0f, 0xf5, 0xbe, 0xbb, 0x36, 0xb0, 0x1a, 0x64, 0xa0, 0x2d, 0xb7, + 0xd4, 0x6d, 0x38, 0xb4, 0x5d, 0xd7, 0xe3, 0x61, 0x08, 0x98, 0xba, 0x05, 0x4a, 0xbc, 0x8f, 0xe3, + 0x9e, 0xba, 0xf0, 0xdf, 0xe6, 0xa2, 0xa5, 0x16, 0x3b, 0x1a, 0x33, 0x1f, 0xe3, 0x68, 0x24, 0xf7, + 0xa0, 0xa0, 0x42, 0x94, 0x17, 0x5a, 0x94, 0x5c, 0x34, 0x46, 0xb1, 0x8f, 0x4a, 0x10, 0xea, 0xe7, + 0x6b, 0x6e, 0xf0, 0xf3, 0x35, 0x12, 0xdf, 0xb1, 0xfe, 0xa1, 0xa4, 0xf8, 0x1e, 0x77, 0x41, 0x57, + 0xd0, 0x65, 0xfc, 0x0c, 0x5f, 0x1c, 0x5a, 0xc3, 0x7a, 0xfc, 0x8c, 0x94, 0x83, 0x4b, 0x45, 0x97, + 0x21, 0x40, 0xf0, 0xa7, 0xe2, 0x01, 0x1f, 0x86, 0x00, 0xe1, 0xf4, 0x69, 0x21, 0x40, 0x42, 0x12, + 0x76, 0x00, 0x9a, 0xdd, 0x36, 0x8f, 0x21, 0x3e, 0x1a, 0x1d, 0x80, 0x5e, 0xb7, 0x6d, 0xc5, 0xe3, + 0x88, 0x87, 0x88, 0xc6, 0x3f, 0x1a, 0x4a, 0x17, 0x0e, 0x42, 0x7d, 0xd7, 0x69, 0x84, 0x83, 0x90, + 0xe8, 0x93, 0x99, 0xa9, 0x5b, 0x30, 0x2b, 0xad, 0xf2, 0xa4, 0x79, 0xd7, 0x96, 0xb9, 0x2a, 0x86, + 0x18, 0xf5, 0x46, 0xa1, 0x3d, 0x9f, 0x34, 0x11, 0xb3, 0xba, 0x9e, 0xa6, 0x37, 0x4a, 0xa1, 0x5f, + 0xf8, 0x0d, 0xa9, 0x16, 0x53, 0x07, 0x61, 0x6b, 0x2b, 0x9c, 0xcb, 0xb1, 0x41, 0xe8, 0x76, 0xb5, + 0x61, 0xd4, 0x49, 0xf8, 0xde, 0x2b, 0x55, 0x0e, 0xc8, 0x44, 0x91, 0x15, 0x15, 0x45, 0x45, 0x8c, + 0x4b, 0x8c, 0x88, 0xec, 0xc1, 0xf9, 0x48, 0x94, 0x56, 0x6e, 0x0a, 0xc8, 0x91, 0x37, 0xf8, 0xea, + 0xf1, 0x51, 0xf1, 0x15, 0x45, 0x14, 0x57, 0x2f, 0x1c, 0x31, 0xee, 0xbd, 0x79, 0xb1, 0xfd, 0x76, + 0xc9, 0xb3, 0xdb, 0xf5, 0x7d, 0x65, 0xce, 0xe3, 0x7e, 0xbb, 0x83, 0xd0, 0x44, 0x10, 0x83, 0x08, + 0xd9, 0xf8, 0xf1, 0x2c, 0x4c, 0xf1, 0xb3, 0x9a, 0xbf, 0xce, 0x3d, 0xb3, 0x2f, 0x9f, 0xef, 0x68, + 0x2f, 0x9f, 0x32, 0xde, 0x9e, 0xda, 0xb4, 0x81, 0xde, 0x3d, 0xf7, 0x81, 0x24, 0x69, 0x88, 0x09, + 0x13, 0x2a, 0xb4, 0xff, 0x93, 0xe7, 0x8d, 0x28, 0x34, 0xa3, 0x10, 0x95, 0xf0, 0xdd, 0xd9, 0x37, + 0x35, 0x1e, 0xc6, 0x8f, 0x65, 0x61, 0x52, 0xb1, 0x53, 0x79, 0x66, 0x3b, 0xfe, 0x0b, 0x5a, 0xc7, + 0xcf, 0x87, 0x7e, 0x81, 0x61, 0xcb, 0x06, 0xea, 0xf7, 0x2e, 0xcc, 0x24, 0x48, 0xe2, 0xe6, 0x3e, + 0x99, 0x41, 0xcc, 0x7d, 0xde, 0x48, 0xc6, 0x79, 0xe3, 0xe9, 0x12, 0xc2, 0xa8, 0x3f, 0x6a, 0x60, + 0xb9, 0x9f, 0xcc, 0xc2, 0x9c, 0xf8, 0x85, 0x81, 0x51, 0xb9, 0xb0, 0xfa, 0xcc, 0x8e, 0x45, 0x49, + 0x1b, 0x8b, 0xa2, 0x3e, 0x16, 0x4a, 0x03, 0x7b, 0x0f, 0x89, 0xf1, 0x43, 0x00, 0xf3, 0xbd, 0x08, + 0x06, 0x76, 0xbf, 0x8f, 0x1c, 0x12, 0xb3, 0x03, 0x38, 0x24, 0xae, 0x42, 0x01, 0xab, 0x12, 0xa1, + 0x0f, 0xfd, 0x2d, 0xb3, 0x2a, 0x3a, 0x09, 0xf5, 0x0b, 0x3c, 0x7a, 0xad, 0x08, 0xc5, 0xe8, 0xc7, + 0x74, 0x1e, 0x09, 0x4a, 0xf2, 0x4b, 0x19, 0x98, 0x42, 0xe0, 0xf2, 0x43, 0xda, 0x0e, 0x90, 0xd9, + 0x90, 0xf0, 0x54, 0x0b, 0x1f, 0x46, 0x6b, 0x81, 0xe7, 0xb4, 0xf7, 0xc4, 0xcb, 0xe8, 0x8e, 0x78, + 0x19, 0x7d, 0x97, 0xbf, 0xe8, 0x5e, 0xab, 0xbb, 0xad, 0xeb, 0x7b, 0x9e, 0xfd, 0xd0, 0xe1, 0x26, + 0x58, 0x76, 0xf3, 0x7a, 0x94, 0xe5, 0xa7, 0xe3, 0xc4, 0xf2, 0xef, 0x08, 0x56, 0xf8, 0xea, 0xcc, + 0x3f, 0x94, 0x62, 0xb5, 0x71, 0xd5, 0x8c, 0xfe, 0x45, 0xe4, 0x7b, 0xe0, 0x1c, 0x0f, 0x48, 0xc6, + 0x6e, 0xf8, 0x4e, 0xbb, 0xeb, 0x76, 0xfd, 0x25, 0xbb, 0x7e, 0xc0, 0xc4, 0x7c, 0xee, 0x4f, 0x8c, + 0x2d, 0xaf, 0x87, 0x85, 0xd6, 0x0e, 0x2f, 0xd5, 0x22, 0x5d, 0xa4, 0x33, 0x20, 0x2b, 0x30, 0xc3, + 0x8b, 0x4a, 0xdd, 0xc0, 0xad, 0xd5, 0xed, 0xa6, 0xd3, 0xde, 0x43, 0x59, 0x22, 0xcf, 0x45, 0x19, + 0xbb, 0x1b, 0xb8, 0x96, 0xcf, 0xe1, 0xaa, 0xa6, 0x26, 0x41, 0x44, 0xaa, 0x30, 0x6d, 0x52, 0xbb, + 0xb1, 0x66, 0x3f, 0x2e, 0xdb, 0x1d, 0xbb, 0xee, 0x04, 0x3c, 0x42, 0x6a, 0x8e, 0x0b, 0x74, 0x1e, + 0xb5, 0x1b, 0x56, 0xcb, 0x7e, 0x6c, 0xd5, 0x45, 0xa1, 0xae, 0xb2, 0xd7, 0xe8, 0x42, 0x56, 0x4e, + 0x3b, 0x64, 0x35, 0x16, 0x67, 0xe5, 0xb4, 0x7b, 0xb3, 0x8a, 0xe8, 0x24, 0xab, 0x4d, 0xdb, 0xdb, + 0xa3, 0x01, 0x37, 0x8f, 0x86, 0x4b, 0x99, 0x2b, 0x19, 0x85, 0x55, 0x80, 0x65, 0x16, 0x9a, 0x4a, + 0xc7, 0x59, 0x29, 0x74, 0x6c, 0xe6, 0x6d, 0x7b, 0x4e, 0x40, 0xd5, 0x16, 0x8e, 0xe3, 0x67, 0x61, + 0xff, 0xa3, 0x61, 0x79, 0xaf, 0x26, 0x26, 0x28, 0x23, 0x6e, 0x4a, 0x23, 0x27, 0x12, 0xdc, 0xd2, + 0x5b, 0x99, 0xa0, 0x0c, 0xb9, 0xa9, 0xed, 0x9c, 0xc4, 0x76, 0x2a, 0xdc, 0x7a, 0x34, 0x34, 0x41, + 0x49, 0xd6, 0x59, 0xa7, 0x05, 0x4c, 0x6e, 0x72, 0xdb, 0xc2, 0x82, 0x7b, 0x0a, 0x3f, 0xed, 0x65, + 0x61, 0x86, 0x58, 0xf0, 0x64, 0xb1, 0x95, 0x62, 0xcf, 0x1d, 0x27, 0x26, 0x7f, 0x0d, 0xa6, 0xb7, + 0x7c, 0x7a, 0xbb, 0xba, 0x51, 0x93, 0xf1, 0xcb, 0x50, 0xb9, 0x38, 0xb5, 0x78, 0xe3, 0x84, 0x4d, + 0xe7, 0x9a, 0x4a, 0x83, 0x49, 0x73, 0xf8, 0xb8, 0x75, 0x7d, 0x6a, 0xed, 0x3a, 0x1d, 0x3f, 0x0c, + 0x06, 0xa9, 0x8e, 0x5b, 0xac, 0x2a, 0x63, 0x05, 0x66, 0x12, 0x6c, 0xc8, 0x14, 0x00, 0x03, 0x5a, + 0x5b, 0xeb, 0xb5, 0xe5, 0xcd, 0xc2, 0x73, 0xa4, 0x00, 0x13, 0xf8, 0x7b, 0x79, 0xbd, 0xb4, 0xb4, + 0xba, 0x5c, 0x29, 0x64, 0xc8, 0x0c, 0x4c, 0x22, 0xa4, 0x52, 0xad, 0x71, 0x50, 0x96, 0xa7, 0x4c, + 0x30, 0x0b, 0x7c, 0xe9, 0x06, 0x6c, 0x01, 0xe0, 0x99, 0x62, 0xfc, 0xdd, 0x2c, 0x9c, 0x97, 0xc7, + 0x0a, 0x0d, 0x98, 0xe0, 0xe8, 0xb4, 0xf7, 0x9e, 0xf1, 0xd3, 0xe1, 0xb6, 0x76, 0x3a, 0xbc, 0x1c, + 0x3b, 0xa9, 0x63, 0xad, 0xec, 0x73, 0x44, 0xfc, 0xf6, 0x18, 0x5c, 0xe8, 0x4b, 0x45, 0xbe, 0xc4, + 0x4e, 0x73, 0x87, 0xb6, 0x83, 0x6a, 0xa3, 0x49, 0x37, 0x9d, 0x16, 0x75, 0xbb, 0x81, 0xf0, 0x18, + 0x78, 0x09, 0xf5, 0x79, 0x58, 0x68, 0x39, 0x8d, 0x26, 0xb5, 0x02, 0x5e, 0xac, 0x4d, 0xb7, 0x24, + 0x35, 0x63, 0x19, 0x26, 0xf0, 0xaa, 0xb6, 0x03, 0xea, 0x3d, 0x44, 0xab, 0xc4, 0x90, 0xe5, 0x01, + 0xa5, 0x1d, 0xcb, 0x66, 0xa5, 0x96, 0x23, 0x8a, 0x75, 0x96, 0x09, 0x6a, 0x72, 0x5b, 0x61, 0x59, + 0x66, 0xb7, 0xff, 0x35, 0xfb, 0xb1, 0x30, 0x93, 0x12, 0xf1, 0x70, 0x43, 0x96, 0xdc, 0x89, 0xaf, + 0x65, 0x3f, 0x36, 0x93, 0x24, 0xe4, 0x6b, 0x70, 0x46, 0x1c, 0x40, 0x22, 0x64, 0x8b, 0x6c, 0x31, + 0x0f, 0x08, 0xf3, 0xea, 0xf1, 0x51, 0xf1, 0x9c, 0x8c, 0x24, 0x2c, 0xc3, 0x29, 0xa5, 0xb5, 0x3a, + 0x9d, 0x0b, 0xd9, 0x64, 0x07, 0x72, 0xac, 0x3b, 0xd6, 0xa8, 0xef, 0x4b, 0x4f, 0x4d, 0x71, 0x33, + 0x56, 0x3b, 0xd3, 0x6a, 0xf1, 0x72, 0xb3, 0x27, 0x25, 0x59, 0x81, 0xa9, 0x6d, 0xba, 0xa3, 0x8e, + 0xcf, 0x48, 0xb8, 0x55, 0x15, 0x1e, 0xd1, 0x9d, 0xde, 0x83, 0x13, 0xa3, 0x23, 0x0e, 0xbe, 0x0f, + 0x3c, 0x3e, 0x5c, 0x75, 0xfc, 0x80, 0xb6, 0xa9, 0x87, 0x41, 0xdb, 0x46, 0x71, 0x33, 0x98, 0x8f, + 0x24, 0x64, 0xbd, 0x7c, 0xe9, 0xc5, 0xe3, 0xa3, 0xe2, 0x05, 0xee, 0xf2, 0xdc, 0x14, 0x70, 0x2b, + 0x96, 0xfe, 0x2a, 0xc9, 0x95, 0x7c, 0x03, 0xa6, 0x4d, 0xb7, 0x1b, 0x38, 0xed, 0xbd, 0x5a, 0xe0, + 0xd9, 0x01, 0xdd, 0xe3, 0x07, 0x52, 0x14, 0x1d, 0x2e, 0x56, 0x2a, 0x9e, 0x96, 0x39, 0xd0, 0xf2, + 0x05, 0x54, 0x3b, 0x11, 0x74, 0x02, 0xf2, 0x75, 0x98, 0xe2, 0xc1, 0x3a, 0xc2, 0x0a, 0xc6, 0xb4, + 0xd4, 0x1d, 0x7a, 0xe1, 0x83, 0x1b, 0xc2, 0xaa, 0x05, 0xa1, 0x69, 0x15, 0xc4, 0xb8, 0x91, 0xaf, + 0x88, 0xce, 0xda, 0x70, 0xda, 0x7b, 0xe1, 0x34, 0x06, 0xec, 0xf9, 0x37, 0xa3, 0x2e, 0xe9, 0xb0, + 0xcf, 0x95, 0xd3, 0xb8, 0x87, 0x89, 0x5e, 0x92, 0x0f, 0x09, 0xe0, 0x42, 0xc9, 0xf7, 0x1d, 0x3f, + 0x10, 0x7e, 0x35, 0xcb, 0x8f, 0x69, 0xbd, 0xcb, 0x90, 0xd9, 0xf5, 0x96, 0x7a, 0xdc, 0xae, 0x7b, + 0x78, 0xe9, 0xda, 0xf1, 0x51, 0xf1, 0x35, 0x1b, 0x11, 0x2d, 0xe1, 0x8a, 0x63, 0x51, 0x89, 0x6a, + 0x3d, 0xe2, 0xb8, 0x4a, 0x1b, 0xfa, 0x33, 0x25, 0x5f, 0x87, 0xb3, 0x65, 0xdb, 0xa7, 0xd5, 0xb6, + 0x4f, 0xdb, 0xbe, 0x13, 0x38, 0x0f, 0xa9, 0xe8, 0x54, 0x3c, 0xfc, 0xf2, 0x98, 0x28, 0xcc, 0xa8, + 0xdb, 0x3e, 0x5b, 0x98, 0x21, 0x8a, 0x25, 0x06, 0x45, 0xa9, 0xa6, 0x07, 0x17, 0x62, 0xc2, 0x54, + 0xad, 0xb6, 0x52, 0x71, 0xec, 0x70, 0x5d, 0x4d, 0x62, 0x7f, 0xbd, 0x86, 0xaa, 0x3d, 0x7f, 0xdf, + 0x6a, 0x38, 0x76, 0xb8, 0xa0, 0x7a, 0x74, 0x56, 0x8c, 0x83, 0x71, 0x94, 0x81, 0x42, 0x7c, 0x28, + 0xc9, 0x97, 0x61, 0x8c, 0xdb, 0xb7, 0x51, 0x7f, 0x5f, 0xc4, 0x9b, 0x90, 0xe6, 0x52, 0x21, 0x5c, + 0x27, 0x12, 0x4e, 0x74, 0xdc, 0x7a, 0x8e, 0xaa, 0xd6, 0x32, 0xe8, 0x44, 0x27, 0x89, 0x48, 0x03, + 0x26, 0xf8, 0x68, 0x51, 0x0c, 0x0d, 0x29, 0xcc, 0x9c, 0x5f, 0x54, 0x57, 0x87, 0x28, 0x8a, 0xf1, + 0xc7, 0x57, 0x43, 0x31, 0x27, 0x38, 0x82, 0x56, 0x85, 0xc6, 0x75, 0x09, 0x20, 0x2f, 0x09, 0x8d, + 0xf3, 0x70, 0xae, 0xc7, 0x37, 0x1b, 0x0f, 0xd1, 0x92, 0xa0, 0x47, 0x8d, 0xe4, 0xcb, 0x30, 0x87, + 0x84, 0x65, 0xb7, 0xdd, 0xa6, 0xf5, 0x00, 0xb7, 0x23, 0xa9, 0x7d, 0xcf, 0x71, 0x4b, 0x17, 0xde, + 0xde, 0x7a, 0x88, 0x60, 0xc5, 0x95, 0xf0, 0xa9, 0x1c, 0x8c, 0x9f, 0xcb, 0xc2, 0xbc, 0xd8, 0xe1, + 0x4c, 0x5a, 0x77, 0xbd, 0xc6, 0xb3, 0x7f, 0xa2, 0x2e, 0x6b, 0x27, 0xea, 0x4b, 0x61, 0xb0, 0xa2, + 0xb4, 0x46, 0xf6, 0x39, 0x50, 0x7f, 0x35, 0x03, 0x2f, 0xf4, 0x23, 0x62, 0xbd, 0x13, 0x86, 0xc2, + 0x1c, 0x4b, 0x84, 0xbc, 0xec, 0xc0, 0x2c, 0x0e, 0x68, 0x79, 0x9f, 0xd6, 0x0f, 0xfc, 0x15, 0xd7, + 0x0f, 0xd0, 0xd3, 0x22, 0xdb, 0xe3, 0xad, 0xfb, 0x8d, 0xd4, 0xb7, 0xee, 0xb3, 0x7c, 0x96, 0xd5, + 0x91, 0x07, 0x0f, 0xd6, 0x79, 0x40, 0x0f, 0x7d, 0x33, 0x8d, 0x35, 0x5a, 0xcc, 0x97, 0xba, 0xc1, + 0xfe, 0x86, 0x47, 0x77, 0xa9, 0x47, 0xdb, 0x75, 0xfa, 0x29, 0xb3, 0x98, 0xd7, 0x1b, 0x37, 0x90, + 0x06, 0xe3, 0x1f, 0x4f, 0xc2, 0x5c, 0x1a, 0x19, 0xeb, 0x17, 0xe5, 0xd2, 0x1c, 0xcf, 0x63, 0xfa, + 0x83, 0x19, 0x98, 0xa8, 0xd1, 0xba, 0xdb, 0x6e, 0xdc, 0x46, 0x8b, 0x22, 0xd1, 0x3b, 0x16, 0x17, + 0x1a, 0x18, 0xdc, 0xda, 0x8d, 0x99, 0x1a, 0x7d, 0xf7, 0xa8, 0xf8, 0xc5, 0xc1, 0xee, 0xaa, 0x75, + 0x17, 0x83, 0x04, 0x05, 0x98, 0x67, 0x23, 0xac, 0x02, 0x1f, 0x07, 0xb5, 0x4a, 0xc9, 0x12, 0x4c, + 0x8a, 0xe5, 0xea, 0xaa, 0x91, 0x50, 0x79, 0x3c, 0x27, 0x59, 0x90, 0x50, 0x5d, 0x6b, 0x24, 0xe4, + 0x26, 0xe4, 0xb6, 0x16, 0x6f, 0x8b, 0x31, 0x90, 0x99, 0x4a, 0xb6, 0x16, 0x6f, 0xa3, 0x3a, 0x8c, + 0x5d, 0x31, 0x26, 0xbb, 0x8b, 0x9a, 0x91, 0xcf, 0xd6, 0xe2, 0x6d, 0xf2, 0x37, 0xe0, 0x4c, 0xc5, + 0xf1, 0x45, 0x15, 0xdc, 0x77, 0xa3, 0x81, 0x1e, 0x8b, 0x23, 0x3d, 0x66, 0xef, 0xe7, 0x52, 0x67, + 0xef, 0x8b, 0x8d, 0x90, 0x89, 0xc5, 0x1d, 0x43, 0x1a, 0xf1, 0x88, 0xaf, 0xe9, 0xf5, 0x90, 0x8f, + 0x60, 0x0a, 0x95, 0xd9, 0xe8, 0xce, 0x82, 0xb1, 0xfa, 0x47, 0x7b, 0xd4, 0xfc, 0x99, 0xd4, 0x9a, + 0x17, 0x78, 0x94, 0x0d, 0x74, 0x8a, 0xc1, 0xb8, 0xfe, 0xda, 0xad, 0x5f, 0xe3, 0x4c, 0xee, 0xc2, + 0xb4, 0x10, 0xbf, 0xee, 0xef, 0x6e, 0xee, 0xd3, 0x8a, 0x7d, 0x28, 0xec, 0x73, 0xf0, 0x46, 0x27, + 0x64, 0x36, 0xcb, 0xdd, 0xb5, 0x82, 0x7d, 0x6a, 0x35, 0x6c, 0x4d, 0x50, 0x89, 0x11, 0x92, 0x6f, + 0xc1, 0xf8, 0xaa, 0x5b, 0x67, 0x92, 0x37, 0xee, 0x0c, 0xdc, 0x64, 0xe7, 0x43, 0xcc, 0x94, 0xc9, + 0xc1, 0x31, 0x71, 0xea, 0xbb, 0x47, 0xc5, 0x77, 0x4e, 0x3b, 0x69, 0x94, 0x0a, 0x4c, 0xb5, 0x36, + 0x52, 0x86, 0xfc, 0x36, 0xdd, 0x61, 0xad, 0x8d, 0x67, 0xd1, 0x93, 0x60, 0x61, 0x91, 0x27, 0x7e, + 0x69, 0x16, 0x79, 0x02, 0x46, 0x3c, 0x98, 0xc1, 0xfe, 0xd9, 0xb0, 0x7d, 0xff, 0x91, 0xeb, 0x35, + 0x30, 0x5d, 0x4a, 0x2f, 0x6b, 0xa0, 0xc5, 0xd4, 0xce, 0x7f, 0x81, 0x77, 0x7e, 0x47, 0xe1, 0xa0, + 0x0a, 0x90, 0x09, 0xf6, 0xe4, 0x1b, 0x30, 0x25, 0x22, 0x16, 0xac, 0xdd, 0x2e, 0xe1, 0xaa, 0x9c, + 0xd0, 0xfc, 0x3e, 0xf5, 0x42, 0x2e, 0xa5, 0x8a, 0x00, 0x08, 0x52, 0x03, 0x65, 0xb5, 0x76, 0x6d, + 0x5d, 0xe9, 0xaf, 0x92, 0x90, 0x0d, 0x18, 0xaf, 0x60, 0x2e, 0x67, 0xf4, 0x4d, 0x13, 0x76, 0xe1, + 0x61, 0x1a, 0xb0, 0xa8, 0x84, 0xeb, 0x62, 0x44, 0xda, 0x67, 0xf4, 0x74, 0xd3, 0x6d, 0x75, 0x43, + 0x44, 0x72, 0x0b, 0x72, 0xd5, 0xca, 0x86, 0x30, 0x0b, 0x9f, 0x09, 0xe3, 0x82, 0x6c, 0xc8, 0xa4, + 0x49, 0x68, 0x3f, 0xe7, 0x34, 0x34, 0xa3, 0xf2, 0x6a, 0x65, 0x83, 0xec, 0xc2, 0x24, 0x76, 0xc0, + 0x0a, 0xb5, 0x79, 0xdf, 0x4e, 0xf7, 0xe8, 0xdb, 0x6b, 0xa9, 0x7d, 0x3b, 0xcf, 0xfb, 0x76, 0x5f, + 0x50, 0x6b, 0x59, 0x60, 0x54, 0xb6, 0x4c, 0xa4, 0x15, 0x99, 0xa9, 0x64, 0xee, 0x92, 0xcd, 0x55, + 0xb4, 0x0f, 0x12, 0x22, 0xad, 0x4c, 0x64, 0x15, 0x26, 0x53, 0xe9, 0xe9, 0x75, 0x92, 0xe4, 0x43, + 0xbe, 0x00, 0x43, 0xf7, 0x0f, 0x02, 0x5b, 0x18, 0x80, 0xcb, 0x7e, 0x64, 0x20, 0xd9, 0x7c, 0xd4, + 0x42, 0xba, 0x07, 0x5a, 0xa4, 0x39, 0xa4, 0x61, 0x43, 0xb1, 0x62, 0x7b, 0x8d, 0x47, 0xb6, 0x87, + 0x0e, 0xc2, 0xb3, 0x1a, 0x0b, 0xa5, 0x84, 0x0f, 0xc5, 0xbe, 0x00, 0xc4, 0xbc, 0x86, 0x55, 0x16, + 0xe4, 0x7b, 0xe0, 0xbc, 0xef, 0xec, 0xb5, 0xed, 0xa0, 0xeb, 0x51, 0xcb, 0x6e, 0xee, 0xb9, 0x9e, + 0x13, 0xec, 0xb7, 0x2c, 0xbf, 0xeb, 0x04, 0x74, 0x7e, 0x4e, 0xcb, 0x63, 0x5d, 0x93, 0x78, 0x25, + 0x89, 0x56, 0x63, 0x58, 0xe6, 0x39, 0x3f, 0xbd, 0x80, 0x7c, 0x05, 0x26, 0xd5, 0x2d, 0xd9, 0x9f, + 0x3f, 0x73, 0x29, 0x77, 0x65, 0x2a, 0xbc, 0x78, 0xc4, 0x37, 0x70, 0x19, 0xff, 0x59, 0x39, 0x21, + 0x7c, 0x3d, 0xfe, 0xb3, 0xc2, 0x2b, 0xcc, 0x0c, 0x49, 0x0a, 0xb3, 0xe6, 0x8c, 0x98, 0xb1, 0xa2, + 0x97, 0xd7, 0x6e, 0x97, 0xcc, 0xd1, 0x8d, 0xea, 0x83, 0x5a, 0xd3, 0x0d, 0x8c, 0xff, 0x22, 0x83, + 0x9b, 0x38, 0x79, 0x0d, 0xc3, 0x47, 0x85, 0xaf, 0x67, 0xa8, 0xbf, 0xb5, 0x3b, 0xb1, 0xe4, 0x01, + 0x1c, 0x85, 0xbc, 0x01, 0x23, 0xb7, 0xed, 0xba, 0x0c, 0x5d, 0x23, 0x90, 0x77, 0x11, 0xa2, 0x2a, + 0x7b, 0x39, 0x0e, 0x93, 0x2f, 0xf9, 0xe4, 0x2e, 0x45, 0x29, 0xd2, 0xcb, 0x25, 0xf9, 0x5c, 0x8f, + 0xf2, 0xa5, 0x58, 0x14, 0x4a, 0x0e, 0xf5, 0x98, 0x55, 0x7c, 0x2a, 0x07, 0xe3, 0x4f, 0x33, 0xd1, + 0xae, 0x44, 0x5e, 0x85, 0x21, 0x73, 0x23, 0xfc, 0x7e, 0xee, 0xf4, 0x1b, 0xfb, 0x7c, 0x44, 0x20, + 0x5f, 0x81, 0x33, 0x0a, 0x9f, 0x84, 0x89, 0xfe, 0x2b, 0xe8, 0x93, 0xaa, 0x7c, 0x49, 0xba, 0x9d, + 0x7e, 0x3a, 0x0f, 0x14, 0xa6, 0xa3, 0x82, 0x0a, 0x6d, 0x3b, 0x9c, 0xb7, 0xd2, 0x58, 0x95, 0x77, + 0x03, 0x11, 0xe2, 0x8d, 0x4d, 0xe3, 0xc0, 0x5d, 0x52, 0x8d, 0xdf, 0xca, 0x68, 0xbb, 0x4d, 0x98, + 0x53, 0x3a, 0x73, 0x42, 0x4e, 0xe9, 0xb7, 0x01, 0x4a, 0xdd, 0xc0, 0x5d, 0x6e, 0x7b, 0x6e, 0x93, + 0x6b, 0x51, 0x44, 0xfe, 0x0c, 0xd4, 0x0d, 0x53, 0x04, 0x6b, 0x9e, 0x73, 0x21, 0x72, 0xaa, 0x37, + 0x43, 0xee, 0xe3, 0x7a, 0x33, 0x18, 0xbf, 0x9f, 0xd1, 0xd6, 0x28, 0x93, 0x12, 0xc5, 0x54, 0x54, + 0x2d, 0xc6, 0x3a, 0xce, 0x43, 0xcb, 0x6f, 0xba, 0x5a, 0x90, 0x0a, 0x81, 0x46, 0xfe, 0xed, 0x0c, + 0x9c, 0xe5, 0x6e, 0x01, 0xeb, 0xdd, 0xd6, 0x0e, 0xf5, 0x1e, 0xd8, 0x4d, 0xa7, 0x11, 0x05, 0xe7, + 0x8b, 0xcc, 0x07, 0x95, 0x6a, 0xd2, 0xf1, 0xf9, 0x45, 0x95, 0xbb, 0x29, 0x58, 0x6d, 0x2c, 0xb4, + 0x1e, 0x86, 0xa5, 0xea, 0x45, 0x35, 0x9d, 0xde, 0xf8, 0xb5, 0x0c, 0xbc, 0x78, 0x62, 0x2d, 0xe4, + 0x3a, 0x8c, 0xca, 0xc4, 0x25, 0x19, 0xec, 0x78, 0xb4, 0xb3, 0x4d, 0x26, 0x2d, 0x91, 0x58, 0xe4, + 0xab, 0x70, 0x46, 0x65, 0xb5, 0xe9, 0xd9, 0x8e, 0x9a, 0x1e, 0x24, 0xe5, 0xab, 0x03, 0x86, 0x12, + 0x97, 0xd6, 0xd2, 0x99, 0x18, 0xff, 0x5f, 0x46, 0xc9, 0x32, 0xff, 0x8c, 0xca, 0xf0, 0xb7, 0x34, + 0x19, 0x5e, 0x86, 0x26, 0x0d, 0x5b, 0xc5, 0xca, 0x52, 0xef, 0x5d, 0xd3, 0x8a, 0xbd, 0x38, 0x02, + 0x7e, 0x24, 0x0b, 0xe3, 0x5b, 0x3e, 0xf5, 0xf8, 0x43, 0xee, 0xa7, 0x2b, 0x40, 0x63, 0xd8, 0xae, + 0x81, 0x42, 0xe8, 0xfd, 0x71, 0x06, 0x15, 0xfc, 0x2a, 0x05, 0xeb, 0x0d, 0x25, 0xb3, 0x24, 0xf6, + 0x06, 0xe6, 0x94, 0x44, 0x28, 0x0f, 0x28, 0xb6, 0xaa, 0x27, 0x99, 0xc5, 0x4c, 0xc3, 0xab, 0xe4, + 0x8b, 0x30, 0xbc, 0x85, 0xea, 0x4a, 0x3d, 0xc8, 0x46, 0xc8, 0x1f, 0x0b, 0xf9, 0x26, 0xdd, 0xf5, + 0xf5, 0x68, 0x73, 0x9c, 0x90, 0xd4, 0x60, 0xb4, 0xec, 0x51, 0xcc, 0x19, 0x3f, 0x34, 0xb8, 0x8b, + 0x78, 0x9d, 0x93, 0xc4, 0x5d, 0xc4, 0x05, 0x27, 0xe3, 0x67, 0xb3, 0x40, 0xa2, 0x36, 0x62, 0x82, + 0x34, 0xff, 0x99, 0x1d, 0xf4, 0x0f, 0xb4, 0x41, 0xbf, 0x90, 0x18, 0x74, 0xde, 0xbc, 0x81, 0xc6, + 0xfe, 0x77, 0x32, 0x70, 0x36, 0x9d, 0x90, 0xbc, 0x04, 0x23, 0xf7, 0x37, 0x37, 0x64, 0x9c, 0x16, + 0xd1, 0x14, 0xb7, 0x83, 0xba, 0x02, 0x53, 0x14, 0x91, 0x37, 0x61, 0xe4, 0x4b, 0x66, 0x99, 0x9d, + 0x43, 0x4a, 0x0a, 0x8e, 0x6f, 0x7a, 0x56, 0x5d, 0x3f, 0x8a, 0x04, 0x92, 0x3a, 0xb6, 0xb9, 0xa7, + 0x36, 0xb6, 0x3f, 0x99, 0x85, 0xe9, 0x52, 0xbd, 0x4e, 0x7d, 0x5f, 0x84, 0x97, 0x7f, 0x66, 0x07, + 0x36, 0x3d, 0x02, 0x8b, 0xd6, 0xb6, 0x81, 0x46, 0xf5, 0x77, 0x33, 0x70, 0x46, 0x52, 0x3d, 0x74, + 0xe8, 0xa3, 0xcd, 0x7d, 0x8f, 0xfa, 0xfb, 0x6e, 0xb3, 0x31, 0x70, 0x9e, 0x1f, 0x26, 0xe8, 0x61, + 0x48, 0x78, 0xf5, 0x55, 0x7f, 0x17, 0x21, 0x9a, 0xa0, 0xc7, 0xc3, 0xc6, 0x5f, 0x87, 0xd1, 0x52, + 0xa7, 0xe3, 0xb9, 0x0f, 0xf9, 0xb2, 0x17, 0xf1, 0x24, 0x6d, 0x0e, 0xd2, 0x3c, 0xec, 0x39, 0x88, + 0x7d, 0x46, 0x85, 0xb6, 0x79, 0x00, 0xbf, 0x49, 0xfe, 0x19, 0x0d, 0xda, 0x56, 0x65, 0x71, 0x2c, + 0x37, 0x6a, 0x40, 0x36, 0x3c, 0xb7, 0xe5, 0x06, 0xb4, 0xc1, 0xdb, 0x83, 0x81, 0x09, 0x4e, 0x0c, + 0xa4, 0xb5, 0xe9, 0x04, 0x4d, 0x2d, 0x90, 0x56, 0xc0, 0x00, 0x26, 0x87, 0x1b, 0xff, 0xcf, 0x30, + 0x4c, 0xa8, 0xbd, 0x43, 0x0c, 0x9e, 0xbc, 0xc3, 0xf5, 0xd4, 0xe8, 0x18, 0x36, 0x42, 0x4c, 0x51, + 0x12, 0x85, 0x96, 0xc9, 0x9e, 0x18, 0x5a, 0x66, 0x1b, 0x26, 0x37, 0x3c, 0x17, 0x03, 0x5f, 0xe2, + 0x6b, 0xa5, 0xd8, 0x0a, 0x67, 0x95, 0x7b, 0x27, 0x1b, 0x48, 0x7c, 0x0f, 0x45, 0xc9, 0xbe, 0x23, + 0xb0, 0x31, 0xa5, 0xa5, 0xa6, 0x75, 0xd1, 0xf8, 0x70, 0x53, 0x0b, 0xdb, 0x17, 0xd1, 0x6b, 0x43, + 0x53, 0x0b, 0x06, 0xd1, 0x4d, 0x2d, 0x18, 0x44, 0x5d, 0x6b, 0xc3, 0x4f, 0x6b, 0xad, 0x91, 0x9f, + 0xcd, 0xc0, 0x78, 0xa9, 0xdd, 0x16, 0x21, 0x6b, 0x4e, 0xf0, 0xd6, 0xff, 0xaa, 0xb0, 0xb6, 0x78, + 0xe7, 0x63, 0x59, 0x5b, 0xa0, 0xdc, 0xe2, 0xa3, 0xa4, 0x1a, 0x55, 0xa8, 0xde, 0xd6, 0x94, 0xef, + 0x20, 0xef, 0x40, 0x21, 0x9c, 0xe4, 0xd5, 0x76, 0x83, 0x3e, 0xa6, 0x3c, 0xf9, 0xe1, 0xa4, 0x88, + 0xa6, 0xad, 0x4a, 0xa6, 0x71, 0x44, 0xb2, 0x09, 0x60, 0x87, 0xb3, 0x2b, 0x96, 0xc5, 0x35, 0x39, + 0xfd, 0x84, 0xf4, 0x8c, 0xbf, 0xf1, 0x41, 0x4b, 0x95, 0x9e, 0x23, 0x3e, 0xa4, 0x05, 0xd3, 0x3c, + 0x85, 0x6a, 0x2d, 0xb0, 0xbd, 0x00, 0x13, 0x50, 0xc0, 0x89, 0xe3, 0xf0, 0xaa, 0xd0, 0x9f, 0x3d, + 0x2f, 0x12, 0xb3, 0xfa, 0x8c, 0xd6, 0x4a, 0xc9, 0x46, 0x11, 0xe7, 0xcd, 0x63, 0x97, 0x9b, 0xe7, + 0x92, 0xdf, 0xcb, 0x27, 0xfd, 0x4f, 0x66, 0xe0, 0xac, 0x3a, 0xe9, 0x6b, 0xdd, 0x1d, 0x11, 0x30, + 0x94, 0x5c, 0x83, 0x31, 0x31, 0x27, 0xc3, 0x4b, 0x54, 0x32, 0x8f, 0x46, 0x84, 0x42, 0x96, 0xd9, + 0x34, 0x64, 0x3c, 0x84, 0xd4, 0x3d, 0x1b, 0xdb, 0xa7, 0x58, 0x51, 0x94, 0x9e, 0xdb, 0xc3, 0xdf, + 0xfa, 0xfc, 0x64, 0x10, 0xe3, 0x7d, 0x98, 0xd1, 0x47, 0xa2, 0x46, 0x03, 0x72, 0x15, 0x46, 0xe5, + 0xf0, 0x65, 0xd2, 0x87, 0x4f, 0x96, 0x1b, 0xdb, 0x40, 0x12, 0xf4, 0x3e, 0x9a, 0x45, 0xb1, 0xfb, + 0x29, 0x37, 0xdb, 0x93, 0x8f, 0x92, 0x09, 0xc4, 0xa5, 0x59, 0xf1, 0x7d, 0xe3, 0x9a, 0x5b, 0x02, + 0x06, 0x4f, 0xfd, 0xd3, 0x29, 0x98, 0x4d, 0xd9, 0x73, 0x4f, 0x90, 0x89, 0x8a, 0xfa, 0x06, 0x31, + 0x16, 0x06, 0xfb, 0x90, 0xdb, 0xc2, 0xfb, 0x30, 0x7c, 0xe2, 0x76, 0xc0, 0x9d, 0x52, 0x62, 0xbb, + 0x00, 0x27, 0xfb, 0x44, 0xe4, 0x22, 0x35, 0x1e, 0xcf, 0xf0, 0x53, 0x8b, 0xc7, 0xb3, 0x04, 0x93, + 0xa2, 0x55, 0x62, 0xbb, 0x52, 0x8c, 0xa3, 0x65, 0x5e, 0x98, 0xc4, 0xb6, 0xa5, 0x93, 0x70, 0x1e, + 0xbe, 0xdb, 0x7c, 0x48, 0x05, 0x8f, 0x51, 0x95, 0x07, 0x16, 0xa4, 0xf2, 0x50, 0x48, 0xc8, 0x7f, + 0x84, 0xe9, 0x1b, 0x11, 0xa2, 0xee, 0x59, 0xf9, 0x7e, 0x7b, 0x56, 0xe3, 0xe9, 0xec, 0x59, 0x17, + 0xe4, 0x37, 0xa6, 0xef, 0x5d, 0x29, 0x9f, 0x45, 0x7e, 0x39, 0x03, 0x33, 0x3c, 0x28, 0x8c, 0xfa, + 0xb1, 0x7d, 0x03, 0x7d, 0xd4, 0x9f, 0xce, 0xc7, 0xbe, 0x20, 0x32, 0x02, 0xa5, 0x7f, 0x6b, 0xf2, + 0xa3, 0xc8, 0xf7, 0x00, 0x84, 0x2b, 0x8a, 0x07, 0x90, 0x1d, 0x5f, 0x7c, 0x21, 0x65, 0x17, 0x08, + 0x91, 0xa2, 0xc4, 0x1d, 0x41, 0x48, 0xa7, 0x25, 0xed, 0x0c, 0xa1, 0xe4, 0x6f, 0xc0, 0x1c, 0x5b, + 0x2f, 0x21, 0x44, 0x84, 0xb0, 0x9a, 0x1f, 0xc7, 0x5a, 0x3e, 0xdb, 0x5b, 0x26, 0xba, 0x96, 0x46, + 0xc6, 0xc3, 0x0d, 0x47, 0xf9, 0xd3, 0x03, 0x35, 0xda, 0x45, 0x6a, 0x45, 0x18, 0x19, 0x0e, 0xbf, + 0x9e, 0x27, 0xd7, 0xe8, 0xb1, 0xbf, 0x9d, 0x97, 0x6b, 0x81, 0xef, 0x6f, 0xbe, 0xee, 0xa3, 0x8c, + 0x20, 0xf2, 0x25, 0x20, 0x61, 0x34, 0x15, 0x0e, 0xa3, 0x32, 0xf1, 0x06, 0x57, 0x37, 0x47, 0x51, + 0x59, 0x3c, 0x59, 0xac, 0x4e, 0x92, 0x24, 0x31, 0xa1, 0x30, 0x27, 0x1a, 0xcd, 0xa0, 0x32, 0xb7, + 0xa2, 0x3f, 0x3f, 0xa5, 0x05, 0x08, 0x8b, 0x4a, 0xa2, 0x44, 0xeb, 0x4a, 0x82, 0x46, 0x4d, 0xe5, + 0x94, 0xc6, 0x8e, 0xdc, 0x82, 0x31, 0x74, 0x14, 0x5e, 0x91, 0xc6, 0x5e, 0xc2, 0xf0, 0x04, 0x5d, + 0x8a, 0xad, 0x7d, 0xdd, 0x64, 0x2b, 0x42, 0x65, 0xd7, 0x81, 0x8a, 0x77, 0x68, 0x76, 0xdb, 0xa8, + 0x14, 0x16, 0xfa, 0x8e, 0x86, 0x77, 0x68, 0x79, 0x5d, 0xdd, 0x93, 0x1c, 0x91, 0xc8, 0x37, 0x60, + 0x7c, 0xcd, 0x7e, 0x1c, 0x66, 0x97, 0x9a, 0x19, 0x3c, 0x87, 0x55, 0xcb, 0x7e, 0x1c, 0xa6, 0x96, + 0x8a, 0xe7, 0xb0, 0x52, 0x58, 0x92, 0xaf, 0x01, 0x28, 0x9a, 0x6a, 0x72, 0x62, 0x05, 0x2f, 0xca, + 0xb0, 0x77, 0xa9, 0x1a, 0x6c, 0xe4, 0xaf, 0x30, 0x8c, 0x49, 0x0e, 0x73, 0x9f, 0x9c, 0xe4, 0x70, + 0xe6, 0x93, 0x93, 0x1c, 0x16, 0x76, 0xe0, 0x7c, 0xcf, 0xa5, 0x93, 0x12, 0xea, 0xf8, 0xba, 0x1e, + 0xea, 0xf8, 0x7c, 0xaf, 0x23, 0xd6, 0xd7, 0xf3, 0xab, 0xcc, 0x16, 0xe6, 0x7a, 0x4b, 0x27, 0xdf, + 0xc9, 0xc6, 0x8e, 0x5c, 0x71, 0xb1, 0xe0, 0xb9, 0xbd, 0x7a, 0xc9, 0x24, 0x59, 0x4c, 0xbc, 0xcd, + 0x0f, 0x65, 0x25, 0x1a, 0x3c, 0x3b, 0x94, 0xd5, 0x43, 0x1d, 0x8f, 0xe7, 0x27, 0x3d, 0x7d, 0xdf, + 0x85, 0x29, 0x9e, 0x2b, 0xf7, 0x1e, 0x3d, 0x7c, 0xe4, 0x7a, 0x0d, 0x9e, 0xb5, 0x48, 0xc8, 0xe0, + 0x89, 0x44, 0xf7, 0x31, 0x5c, 0x52, 0x91, 0xbe, 0xa7, 0xc3, 0x58, 0xfb, 0xf9, 0xd4, 0x5d, 0x8c, + 0x21, 0xf4, 0x73, 0x4b, 0x25, 0x6f, 0x85, 0x82, 0x1a, 0xf5, 0xd4, 0x2c, 0x2b, 0x9e, 0x04, 0xa6, + 0xc8, 0x6b, 0xd4, 0x33, 0xfe, 0x79, 0x0e, 0x08, 0xaf, 0xa9, 0x6c, 0x77, 0x6c, 0xf4, 0xcc, 0x76, + 0x30, 0xd6, 0x52, 0x41, 0xe0, 0xd8, 0x3b, 0x4d, 0xaa, 0x06, 0x2a, 0x13, 0xc6, 0xb5, 0x61, 0x99, + 0x15, 0xbf, 0xe8, 0x24, 0x08, 0x7b, 0x6c, 0x75, 0xd9, 0x27, 0xd9, 0xea, 0xbe, 0x01, 0xcf, 0x97, + 0x3a, 0x98, 0x74, 0x5b, 0xd6, 0x72, 0xdb, 0xf5, 0xe4, 0x26, 0xa5, 0xf9, 0xfc, 0xd9, 0x21, 0x5a, + 0xe2, 0x4b, 0xfb, 0xb1, 0x50, 0xe4, 0x14, 0x36, 0x2f, 0x3b, 0x81, 0x1a, 0x43, 0x42, 0xca, 0x29, + 0x1d, 0x2c, 0x49, 0x91, 0x53, 0x38, 0x89, 0xe4, 0xe1, 0x78, 0x52, 0x4e, 0xc1, 0x1c, 0x65, 0x11, + 0x0f, 0xc7, 0xa3, 0x3d, 0x64, 0x9d, 0x90, 0x84, 0xbc, 0x0b, 0xe3, 0xa5, 0x6e, 0xe0, 0x0a, 0xc6, + 0xc2, 0x2a, 0x3c, 0xb2, 0xdf, 0x16, 0x9f, 0xa2, 0x5d, 0x7d, 0x22, 0x74, 0xe3, 0x4f, 0x72, 0x70, + 0x3e, 0x39, 0xbc, 0xa2, 0x34, 0x5c, 0x1f, 0x99, 0x13, 0xd6, 0x47, 0xda, 0x6c, 0xc8, 0x46, 0xf9, + 0x25, 0x9e, 0xc6, 0x6c, 0xe0, 0xb9, 0xbb, 0x3f, 0xe6, 0x6c, 0xa8, 0xc1, 0xb8, 0x7a, 0xde, 0x0d, + 0x7d, 0xdc, 0xf3, 0x4e, 0xe5, 0xc2, 0x2e, 0xf5, 0x3c, 0x74, 0xc6, 0x70, 0xf4, 0x74, 0x14, 0x8f, + 0x9a, 0xc1, 0x31, 0xc8, 0xbf, 0x05, 0x97, 0xf8, 0x9e, 0x14, 0x6f, 0xec, 0xd2, 0xa1, 0xe4, 0x28, + 0x06, 0x6e, 0xf1, 0xf8, 0xa8, 0x78, 0x8d, 0xab, 0x4a, 0xac, 0x44, 0xb7, 0x59, 0x3b, 0x87, 0x96, + 0xfc, 0x32, 0xa5, 0x92, 0x13, 0x79, 0x1b, 0x65, 0x38, 0x2f, 0x4a, 0x23, 0xa7, 0x6d, 0x59, 0xc8, + 0x06, 0xf9, 0x20, 0xd2, 0x76, 0xe1, 0x20, 0xc7, 0x14, 0x59, 0x58, 0x8e, 0x59, 0xbf, 0x95, 0x8c, + 0xcc, 0x6f, 0xa6, 0xf9, 0xdc, 0xf0, 0xa8, 0xdd, 0x1c, 0xac, 0xbb, 0xdb, 0x48, 0x9d, 0x5a, 0x36, + 0x55, 0xa7, 0x26, 0x95, 0x32, 0xb9, 0x54, 0xa5, 0x4c, 0x05, 0xa6, 0x6b, 0xdd, 0x1d, 0x59, 0x77, + 0xdc, 0x5f, 0xd3, 0xef, 0xee, 0xa4, 0xf5, 0x4a, 0x9c, 0xc4, 0xf8, 0xd1, 0x2c, 0x4c, 0x6c, 0x34, + 0xbb, 0x7b, 0x4e, 0xbb, 0x62, 0x07, 0xf6, 0x33, 0xab, 0xe6, 0x7b, 0x5b, 0x53, 0xf3, 0x85, 0xae, + 0x65, 0x61, 0xc3, 0x06, 0xd2, 0xf1, 0xfd, 0x4c, 0x06, 0xa6, 0x23, 0x12, 0x7e, 0x58, 0xaf, 0xc0, + 0x10, 0xfb, 0x21, 0x2e, 0xbf, 0x97, 0x12, 0x8c, 0x79, 0x72, 0xc9, 0xf0, 0x2f, 0xa1, 0x78, 0xd3, + 0x33, 0xb7, 0x21, 0x87, 0x85, 0xcf, 0xc1, 0x58, 0xc4, 0xf6, 0x34, 0x49, 0x25, 0x7f, 0x3d, 0x03, + 0x85, 0x78, 0x4b, 0xc8, 0x3d, 0x18, 0x65, 0x9c, 0x1c, 0x2a, 0xef, 0xe5, 0x2f, 0xf7, 0x68, 0xf3, + 0x35, 0x81, 0xc6, 0x3f, 0x0f, 0x3b, 0x9f, 0x72, 0x88, 0x29, 0x39, 0x2c, 0x98, 0x30, 0xa1, 0x62, + 0xa5, 0x7c, 0xdd, 0x1b, 0xba, 0x84, 0x72, 0x36, 0xbd, 0x1f, 0xb4, 0x54, 0x98, 0xda, 0x57, 0x0b, + 0xe1, 0xe3, 0xb2, 0x36, 0xb9, 0x52, 0x57, 0x15, 0x4e, 0x9a, 0xc5, 0x28, 0x4b, 0x81, 0x3a, 0xcf, + 0x52, 0x26, 0x74, 0x88, 0x47, 0xde, 0x80, 0x11, 0x5e, 0x9f, 0x9a, 0xc6, 0xad, 0x83, 0x10, 0x55, + 0x4e, 0xe6, 0x38, 0xc6, 0xdf, 0xcb, 0xc1, 0xd9, 0xe8, 0xf3, 0xb6, 0x3a, 0x0d, 0x3b, 0xa0, 0x1b, + 0xb6, 0x67, 0xb7, 0xfc, 0x13, 0x56, 0xc0, 0x95, 0xc4, 0xa7, 0x61, 0x02, 0x2d, 0xf9, 0x69, 0xca, + 0x07, 0x19, 0xb1, 0x0f, 0x42, 0x1d, 0x28, 0xff, 0x20, 0xf9, 0x19, 0xe4, 0x1e, 0xe4, 0x6a, 0x34, + 0x10, 0x7b, 0xef, 0xe5, 0x44, 0xaf, 0xaa, 0xdf, 0x75, 0xad, 0x46, 0x03, 0x3e, 0x88, 0x3c, 0x2e, + 0x94, 0x16, 0x9c, 0x8f, 0x71, 0x21, 0xdb, 0x30, 0xb2, 0xfc, 0xb8, 0x43, 0xeb, 0x81, 0x48, 0x89, + 0x7a, 0xb5, 0x3f, 0x3f, 0x8e, 0xab, 0x64, 0x44, 0xa5, 0x08, 0x50, 0x3b, 0x8b, 0xa3, 0x2c, 0xdc, + 0x82, 0xbc, 0xac, 0xfc, 0x34, 0x33, 0x77, 0xe1, 0x6d, 0x18, 0x57, 0x2a, 0x39, 0xd5, 0xa4, 0xff, + 0x05, 0xb6, 0xaf, 0xba, 0x4d, 0x99, 0x45, 0x75, 0x39, 0x21, 0x2b, 0x2a, 0x39, 0xa8, 0xb8, 0xac, + 0x68, 0x1d, 0x88, 0xa2, 0x3e, 0x42, 0x63, 0x15, 0xa6, 0x6b, 0x07, 0x4e, 0x27, 0x0a, 0x14, 0xab, + 0x9d, 0xc8, 0x98, 0xe7, 0x46, 0x5c, 0xdc, 0xe3, 0x27, 0x72, 0x9c, 0xce, 0xf8, 0xf3, 0x0c, 0x8c, + 0xb0, 0xbf, 0x1e, 0xdc, 0x7a, 0x46, 0xb7, 0xcc, 0x9b, 0xda, 0x96, 0x39, 0xa3, 0xc4, 0x6a, 0xc7, + 0x8d, 0xe3, 0xd6, 0x09, 0x9b, 0xe5, 0x91, 0x18, 0x20, 0x8e, 0x4c, 0xee, 0xc0, 0xa8, 0x30, 0x29, + 0x12, 0xb6, 0xdf, 0x6a, 0xf0, 0x77, 0x69, 0x6c, 0x14, 0xde, 0xf0, 0xdd, 0x4e, 0x5c, 0x25, 0x22, + 0xa9, 0x99, 0x5c, 0x2f, 0x43, 0xf6, 0x6a, 0x59, 0xd2, 0x5d, 0x74, 0xd6, 0xe3, 0xa1, 0xcb, 0xfd, + 0xa5, 0x73, 0x82, 0x53, 0x2f, 0xdf, 0xfa, 0x92, 0x78, 0x0d, 0xc9, 0xf5, 0x63, 0x72, 0x56, 0xa6, + 0x26, 0x4e, 0x7d, 0x28, 0x69, 0xc1, 0xd9, 0x5a, 0x6d, 0x05, 0xcd, 0x0f, 0x37, 0x5c, 0x2f, 0xb8, + 0xed, 0x7a, 0x8f, 0x6c, 0xb4, 0x2d, 0x46, 0x0d, 0x9f, 0x62, 0x83, 0x90, 0x66, 0x14, 0xf6, 0x6a, + 0xaa, 0x51, 0x58, 0x1f, 0x3b, 0x05, 0xa3, 0x0d, 0xe7, 0x6a, 0xb5, 0x15, 0x1e, 0x38, 0xfc, 0x2f, + 0xa2, 0xbe, 0x5f, 0xcf, 0xc0, 0x4c, 0xad, 0xb6, 0x12, 0xab, 0x6a, 0x55, 0x46, 0x2c, 0xcf, 0xe8, + 0xd9, 0xbd, 0x53, 0x3b, 0x02, 0x47, 0x21, 0xc3, 0x25, 0xbc, 0xba, 0x16, 0x9c, 0x92, 0x33, 0x21, + 0x1b, 0x61, 0x8c, 0xf4, 0xac, 0xe6, 0x0f, 0xd0, 0xa3, 0xa1, 0xa8, 0xe1, 0x16, 0xde, 0x74, 0xac, + 0x54, 0xd7, 0x70, 0x33, 0x88, 0xf1, 0xdf, 0x9c, 0xe5, 0x51, 0xd8, 0xe5, 0x6c, 0x79, 0x0f, 0x26, + 0x04, 0x3d, 0x1a, 0xcd, 0x0b, 0x9b, 0x90, 0xf3, 0x6c, 0x83, 0xdc, 0xe5, 0x70, 0x1e, 0x9d, 0xf7, + 0xbb, 0x47, 0xc5, 0x21, 0xd6, 0x35, 0xa6, 0x86, 0x4e, 0xee, 0xc3, 0xe4, 0x9a, 0xfd, 0x58, 0x51, + 0x67, 0x70, 0x97, 0xa8, 0xab, 0x6c, 0x57, 0x69, 0xd9, 0x8f, 0x07, 0x30, 0xba, 0xd3, 0xe9, 0xc9, + 0x01, 0x4c, 0xe9, 0x6d, 0x12, 0x33, 0x30, 0x39, 0x62, 0x37, 0x52, 0x47, 0xec, 0x7c, 0xc7, 0xf5, + 0x02, 0x6b, 0x37, 0x24, 0xd7, 0x32, 0x0e, 0xc4, 0x58, 0x93, 0xf7, 0x60, 0x46, 0x09, 0x01, 0x7a, + 0xdb, 0xf5, 0x5a, 0xb6, 0xbc, 0x70, 0xa1, 0x8e, 0x1f, 0x6d, 0x89, 0x76, 0x11, 0x6c, 0x26, 0x31, + 0xc9, 0x57, 0xd2, 0xdc, 0xcc, 0x86, 0x23, 0xcb, 0xc3, 0x14, 0x37, 0xb3, 0x5e, 0x96, 0x87, 0x49, + 0x87, 0xb3, 0xbd, 0x7e, 0x96, 0xc9, 0x79, 0xde, 0xfa, 0x81, 0x2c, 0x8f, 0xc3, 0x91, 0xeb, 0x61, + 0x81, 0xbc, 0x08, 0xb9, 0xa5, 0x8d, 0xdb, 0xf8, 0x32, 0x25, 0x8d, 0xa8, 0xda, 0xfb, 0x76, 0xbb, + 0x8e, 0x17, 0x21, 0xe1, 0x0d, 0xa0, 0x1e, 0x94, 0x4b, 0x1b, 0xb7, 0x89, 0x0d, 0xb3, 0x98, 0xdd, + 0x2d, 0xf8, 0xf2, 0x8d, 0x1b, 0xca, 0x50, 0xe5, 0xf1, 0xd3, 0xae, 0x8b, 0x4f, 0x2b, 0x62, 0x6e, + 0xb8, 0xc0, 0x7a, 0x7c, 0xe3, 0x46, 0xea, 0x80, 0x84, 0x1f, 0x96, 0xc6, 0x8b, 0x1d, 0x58, 0x6b, + 0xf6, 0xe3, 0xc8, 0x89, 0xc3, 0x17, 0x0e, 0xbb, 0x17, 0xe4, 0xd4, 0x8a, 0x1c, 0x40, 0xb4, 0x03, + 0x4b, 0x27, 0x62, 0xf7, 0xd8, 0x68, 0x82, 0xf9, 0xc2, 0xd5, 0x69, 0x41, 0xaa, 0xeb, 0xa4, 0x57, + 0xb7, 0x7a, 0x19, 0x53, 0xd0, 0xc9, 0x56, 0x78, 0x1b, 0xe7, 0xb7, 0x59, 0x91, 0x0f, 0xf9, 0xba, + 0x7a, 0x1b, 0xe7, 0x4a, 0x32, 0xad, 0x59, 0xd3, 0xa1, 0x0a, 0x87, 0x7b, 0xb5, 0x98, 0x3a, 0x97, + 0xe4, 0x25, 0x7f, 0xe2, 0xf4, 0x97, 0x7c, 0x0a, 0x43, 0xab, 0x6e, 0xfd, 0x40, 0x04, 0xe7, 0xfb, + 0x12, 0xdb, 0x85, 0xf5, 0xe4, 0xf9, 0x4f, 0x6a, 0x71, 0x8d, 0xec, 0xc9, 0x3a, 0xfb, 0x54, 0x36, + 0x0b, 0x44, 0x9f, 0x08, 0x2b, 0xde, 0xb9, 0xf0, 0x96, 0xab, 0x94, 0x71, 0x79, 0x94, 0x4f, 0x1a, + 0xd9, 0xb5, 0xa6, 0x4e, 0x4e, 0x28, 0x14, 0x2a, 0xd4, 0x3f, 0x08, 0xdc, 0x4e, 0xb9, 0xe9, 0x74, + 0x76, 0x5c, 0xdb, 0x93, 0xa1, 0x9c, 0x07, 0xde, 0x93, 0x1b, 0x9c, 0xde, 0xaa, 0x4b, 0x06, 0x66, + 0x82, 0x25, 0xf9, 0x0a, 0x4c, 0xb1, 0xc9, 0xbd, 0xfc, 0x38, 0xa0, 0x6d, 0x3e, 0xf2, 0x33, 0x28, + 0xd1, 0xcd, 0x29, 0xb9, 0x4b, 0xc2, 0x42, 0x3e, 0xa7, 0x70, 0xb1, 0xd3, 0x90, 0x40, 0x0b, 0x6c, + 0xa8, 0xb1, 0x22, 0x0d, 0x98, 0x5f, 0xb3, 0x1f, 0x2b, 0x99, 0x97, 0x95, 0x49, 0x4a, 0x70, 0x82, + 0x5d, 0x39, 0x3e, 0x2a, 0xbe, 0xcc, 0x26, 0x58, 0x14, 0x5d, 0xbc, 0xc7, 0x7c, 0xed, 0xc9, 0x89, + 0x7c, 0x0b, 0xce, 0x89, 0x66, 0x55, 0x30, 0x5b, 0x98, 0xeb, 0x1d, 0xd6, 0xf6, 0x6d, 0xf4, 0xdf, + 0x9a, 0xed, 0xd1, 0x61, 0xd7, 0xd3, 0xb7, 0x44, 0xd9, 0x61, 0x0d, 0xc9, 0xc7, 0xf2, 0x39, 0x23, + 0xb3, 0x57, 0x0d, 0xe4, 0x23, 0x98, 0xe2, 0xcf, 0x71, 0x2b, 0xae, 0x1f, 0xa0, 0xb2, 0x66, 0xee, + 0x74, 0x6e, 0x09, 0xfc, 0x8d, 0x8f, 0x3b, 0xf2, 0xc4, 0x94, 0x3b, 0x31, 0xce, 0xe4, 0x1d, 0x18, + 0xdf, 0x70, 0xda, 0x3c, 0xf4, 0x68, 0x75, 0x03, 0xd5, 0xca, 0xe2, 0x04, 0xea, 0x38, 0x6d, 0x4b, + 0x6a, 0x4c, 0x3a, 0xe1, 0x76, 0xa1, 0x62, 0x93, 0x6d, 0x18, 0xaf, 0xd5, 0x56, 0x6e, 0x3b, 0x4c, + 0x2e, 0xe9, 0x1c, 0xce, 0x9f, 0xed, 0xf1, 0x95, 0x2f, 0xa5, 0x7e, 0xe5, 0xa4, 0xef, 0xef, 0x5b, + 0xbb, 0x4e, 0x93, 0x5a, 0x75, 0xb7, 0x73, 0x68, 0xaa, 0x9c, 0x52, 0x4c, 0xf5, 0xcf, 0x3d, 0x65, + 0x53, 0xfd, 0x2a, 0x4c, 0x2b, 0xc6, 0xb3, 0x68, 0x38, 0x3b, 0x1f, 0xc5, 0xab, 0x52, 0x4d, 0xf3, + 0xe3, 0xae, 0xa9, 0x71, 0x3a, 0x69, 0xa3, 0x7f, 0xfe, 0xb4, 0x36, 0xfa, 0x0e, 0xcc, 0xf0, 0xc1, + 0x10, 0xf3, 0x00, 0x47, 0x7a, 0xa1, 0x47, 0x1f, 0x5e, 0x4d, 0xed, 0xc3, 0x59, 0x31, 0xd2, 0x72, + 0x92, 0xe1, 0xf3, 0x73, 0x92, 0x2b, 0xd9, 0x05, 0x22, 0x80, 0x76, 0x60, 0xef, 0xd8, 0x3e, 0xc5, + 0xba, 0x9e, 0xef, 0x51, 0xd7, 0xcb, 0xa9, 0x75, 0x4d, 0xc9, 0xba, 0x76, 0x78, 0x35, 0x29, 0x1c, + 0x49, 0x5b, 0xd6, 0x23, 0xe7, 0x17, 0x76, 0xec, 0x0b, 0x9a, 0x8e, 0x3b, 0x89, 0xc0, 0x43, 0x3f, + 0xc5, 0x27, 0x6d, 0xbc, 0xdf, 0x53, 0x38, 0x93, 0xc7, 0x70, 0x36, 0xf9, 0x15, 0x58, 0xe7, 0x05, + 0xac, 0xf3, 0x82, 0x56, 0x67, 0x1c, 0x89, 0xcf, 0x1b, 0xbd, 0x59, 0xf1, 0x5a, 0x7b, 0xf0, 0x27, + 0x3f, 0x94, 0x81, 0x73, 0x6b, 0xb7, 0x4b, 0x98, 0x43, 0xd4, 0xe1, 0x91, 0xe8, 0x42, 0x97, 0xde, + 0x8b, 0xe2, 0x1d, 0x24, 0xfe, 0x36, 0x23, 0x25, 0x0e, 0xdc, 0x2a, 0x98, 0xe8, 0xfe, 0x52, 0x6b, + 0xd7, 0xe6, 0xa9, 0x49, 0x05, 0x8b, 0x14, 0xbf, 0xdf, 0x6f, 0xff, 0x51, 0x31, 0x63, 0xf6, 0xaa, + 0x8a, 0x34, 0x61, 0x41, 0xef, 0x16, 0xe9, 0x45, 0xb1, 0x4f, 0x9b, 0xcd, 0xf9, 0x22, 0xce, 0xe8, + 0x37, 0x8e, 0x8f, 0x8a, 0x57, 0x12, 0xbd, 0x1b, 0x7a, 0x66, 0x30, 0x4c, 0xa5, 0xc1, 0x7d, 0xf8, + 0x91, 0x56, 0x8a, 0xd0, 0x3d, 0x7f, 0x49, 0x8b, 0xfd, 0x93, 0x28, 0x5f, 0x7a, 0x45, 0x48, 0x24, + 0x17, 0xd8, 0x7a, 0xef, 0x29, 0x20, 0x9a, 0x49, 0xce, 0x77, 0x87, 0xf2, 0x93, 0x85, 0xa9, 0x14, + 0x97, 0x05, 0xe3, 0xb7, 0xb3, 0xb1, 0x83, 0x91, 0x54, 0x61, 0x54, 0xcc, 0xf7, 0x9e, 0x97, 0x8c, + 0x0b, 0xa9, 0xb3, 0x7a, 0x54, 0x2c, 0x1d, 0x53, 0xd2, 0x93, 0x47, 0x8c, 0x15, 0x36, 0x5a, 0xdc, + 0x78, 0xbf, 0xc6, 0xcf, 0x3d, 0x04, 0x69, 0x27, 0x7c, 0xe5, 0xf4, 0x8e, 0x78, 0xba, 0x9f, 0x27, + 0x1e, 0xf5, 0xb2, 0x36, 0x72, 0xc0, 0x53, 0x49, 0xe5, 0x42, 0x6f, 0x2e, 0x3d, 0x6f, 0xd4, 0x53, + 0xab, 0x90, 0xd5, 0x62, 0xfc, 0x56, 0x06, 0x26, 0xb5, 0x93, 0x95, 0xdc, 0x52, 0x5c, 0x15, 0x23, + 0xef, 0x7d, 0x0d, 0x07, 0x37, 0xdb, 0xb8, 0x13, 0xe3, 0x2d, 0xe1, 0x77, 0x90, 0xed, 0x4d, 0x87, + 0x8b, 0x2d, 0xee, 0xb9, 0xda, 0x5f, 0x3f, 0x1c, 0x66, 0xbf, 0x1c, 0xea, 0x91, 0xfd, 0xf2, 0x97, + 0x2e, 0xc0, 0x94, 0x7e, 0x23, 0x26, 0x6f, 0xc0, 0x08, 0xea, 0xe6, 0xa5, 0x7a, 0x05, 0xd5, 0x42, + 0xa8, 0xbe, 0xd7, 0x9c, 0x51, 0x38, 0x0e, 0x79, 0x05, 0x20, 0x34, 0x00, 0x97, 0x2f, 0x53, 0xc3, + 0xc7, 0x47, 0xc5, 0xcc, 0x9b, 0xa6, 0x52, 0x40, 0xbe, 0x0e, 0xb0, 0xee, 0x36, 0x68, 0x98, 0xd2, + 0xb8, 0x8f, 0xf5, 0xc5, 0xab, 0x89, 0x34, 0x2b, 0x67, 0xda, 0x6e, 0x83, 0x26, 0x73, 0xaa, 0x28, + 0x1c, 0xc9, 0x17, 0x60, 0xd8, 0xec, 0x36, 0xa9, 0x7c, 0xc1, 0x18, 0x97, 0x27, 0x5c, 0xb7, 0x49, + 0x23, 0x3d, 0x81, 0xd7, 0x8d, 0x1b, 0x16, 0x32, 0x00, 0xf9, 0x80, 0xa7, 0x5f, 0x11, 0x31, 0x42, + 0x87, 0xa3, 0xb7, 0x3a, 0x45, 0xf2, 0x49, 0x44, 0x09, 0x55, 0x48, 0xc8, 0x7d, 0x18, 0x55, 0x1f, + 0x99, 0x14, 0x9f, 0x77, 0xf5, 0x21, 0x52, 0x51, 0x3a, 0x88, 0x5c, 0xc8, 0xf1, 0xf7, 0x27, 0xc9, + 0x85, 0xbc, 0x0b, 0x63, 0x8c, 0x3d, 0xdb, 0x39, 0x7c, 0x71, 0xab, 0xc1, 0x17, 0x39, 0xe5, 0x83, + 0xd8, 0xee, 0xa3, 0x45, 0xf2, 0x0c, 0x09, 0xc8, 0x57, 0x30, 0x7b, 0xad, 0xe8, 0xea, 0xbe, 0x56, + 0x39, 0x97, 0x13, 0x5d, 0x8d, 0xe9, 0x6c, 0x13, 0x3d, 0x1d, 0xf1, 0x23, 0x7b, 0x61, 0xc8, 0xb5, + 0x41, 0x52, 0xe6, 0xbc, 0x96, 0xa8, 0x60, 0x5e, 0x46, 0x11, 0x4b, 0xa6, 0xa6, 0xd6, 0xf8, 0x92, + 0x0e, 0x14, 0x22, 0xa1, 0x52, 0xd4, 0x05, 0xfd, 0xea, 0x7a, 0x33, 0x51, 0x97, 0x3a, 0x80, 0x89, + 0xea, 0x12, 0xdc, 0x49, 0x03, 0xa6, 0xe4, 0x01, 0x25, 0xea, 0x1b, 0xef, 0x57, 0xdf, 0x2b, 0x89, + 0xfa, 0x66, 0x1b, 0x3b, 0xc9, 0x7a, 0x62, 0x3c, 0xc9, 0xbb, 0x30, 0x29, 0x21, 0x3c, 0x51, 0xf4, + 0x44, 0x94, 0x69, 0xb7, 0xb1, 0x93, 0x48, 0x0f, 0xad, 0x23, 0xab, 0xd4, 0x7c, 0x76, 0x4c, 0x6a, + 0xd4, 0xf1, 0x59, 0xa1, 0x23, 0x93, 0x0f, 0x61, 0xbc, 0xda, 0x62, 0x0d, 0x71, 0xdb, 0x76, 0x40, + 0x85, 0x3f, 0xa4, 0xb4, 0x30, 0x52, 0x4a, 0x94, 0xa9, 0xca, 0x53, 0x60, 0x47, 0x45, 0x5a, 0x0a, + 0xec, 0x08, 0xcc, 0x3a, 0x8f, 0xbf, 0x2a, 0x8a, 0x39, 0x2c, 0x7d, 0x25, 0x2f, 0xa4, 0x58, 0xf9, + 0x28, 0xec, 0x45, 0x3c, 0x48, 0x06, 0x95, 0xaf, 0x7a, 0xb1, 0x58, 0xbc, 0x2a, 0x4f, 0xf2, 0x1e, + 0x8c, 0x8b, 0x6c, 0x62, 0x25, 0x73, 0xdd, 0x9f, 0x2f, 0x60, 0xe3, 0x31, 0xc2, 0x83, 0x4c, 0x3c, + 0x66, 0xd9, 0x5e, 0xcc, 0x9c, 0x35, 0xc2, 0x27, 0x5f, 0x86, 0xb9, 0x6d, 0xa7, 0xdd, 0x70, 0x1f, + 0xf9, 0xe2, 0x98, 0x12, 0x1b, 0xdd, 0x4c, 0xe4, 0x4c, 0xf6, 0x88, 0x97, 0x87, 0xb2, 0x60, 0x62, + 0xe3, 0x4b, 0xe5, 0x40, 0xfe, 0x7a, 0x82, 0x33, 0x9f, 0x41, 0xa4, 0xdf, 0x0c, 0x5a, 0x4c, 0xcc, + 0xa0, 0x64, 0xf5, 0xf1, 0xe9, 0x94, 0x5a, 0x0d, 0x71, 0x81, 0xe8, 0xe7, 0xfb, 0x5d, 0xd7, 0x69, + 0xcf, 0xcf, 0xe2, 0x5e, 0xf8, 0x7c, 0x3c, 0xa6, 0x02, 0xe2, 0x89, 0x54, 0xe2, 0xc6, 0xf1, 0x51, + 0xf1, 0x62, 0x5c, 0xe6, 0xff, 0xc8, 0xd5, 0x9e, 0x4b, 0x52, 0x58, 0x93, 0x0f, 0x61, 0x82, 0xfd, + 0x1f, 0x2a, 0x25, 0xe6, 0x34, 0xbb, 0x50, 0x05, 0x53, 0xd4, 0x83, 0x63, 0x84, 0xe9, 0xce, 0x52, + 0xf4, 0x15, 0x1a, 0x2b, 0xf2, 0x36, 0x00, 0x13, 0x9b, 0xc4, 0x76, 0x7c, 0x26, 0x0a, 0x7d, 0x8c, + 0x52, 0x57, 0x72, 0x23, 0x8e, 0x90, 0xc9, 0xbb, 0x30, 0xce, 0x7e, 0xd5, 0xba, 0x0d, 0x97, 0xad, + 0x8d, 0xb3, 0x48, 0xcb, 0x5d, 0x53, 0x19, 0xad, 0xcf, 0xe1, 0x9a, 0x6b, 0x6a, 0x84, 0x4e, 0x56, + 0x60, 0x1a, 0x43, 0x54, 0x8b, 0xe0, 0xa8, 0x0e, 0xf5, 0xe7, 0xcf, 0x29, 0xd6, 0x10, 0xac, 0xc8, + 0x72, 0xc2, 0x32, 0xf5, 0x2e, 0x13, 0x23, 0x23, 0x3e, 0xcc, 0x26, 0x9f, 0x93, 0xfd, 0xf9, 0x79, + 0xec, 0x24, 0x29, 0xc1, 0x27, 0x31, 0xf8, 0x7e, 0xcc, 0x46, 0x44, 0xd9, 0xb8, 0xe4, 0xa3, 0x92, + 0x5a, 0x61, 0x1a, 0x77, 0x62, 0x02, 0xb9, 0x53, 0xde, 0x88, 0xc7, 0x70, 0x3e, 0x8f, 0x2d, 0xc0, + 0x61, 0xde, 0xab, 0x47, 0xb9, 0xc3, 0x53, 0xe2, 0x38, 0xa7, 0x50, 0x93, 0xef, 0x85, 0x33, 0x72, + 0x07, 0x11, 0x45, 0x62, 0x5e, 0x2f, 0x9c, 0x72, 0x27, 0x6e, 0xec, 0x84, 0x55, 0x27, 0xa6, 0x74, + 0x7a, 0x15, 0xc4, 0x86, 0x71, 0x1c, 0x56, 0x51, 0xe3, 0xf3, 0xfd, 0x6a, 0xbc, 0x92, 0xa8, 0xf1, + 0x2c, 0x4e, 0x94, 0x64, 0x65, 0x2a, 0x4f, 0xb2, 0x04, 0x93, 0x62, 0x1d, 0x89, 0xd9, 0xf6, 0x02, + 0xf6, 0x16, 0x2a, 0xb1, 0xe4, 0x0a, 0x4c, 0x4c, 0x38, 0x9d, 0x44, 0xdd, 0x91, 0xf9, 0x63, 0xd2, + 0x05, 0x6d, 0x47, 0x8e, 0xbf, 0x21, 0xe9, 0xc8, 0x6c, 0x47, 0x8a, 0xa4, 0x98, 0xe5, 0xc7, 0x1d, + 0x4f, 0xa8, 0xa8, 0x2e, 0x46, 0x59, 0x91, 0x14, 0xe1, 0xc7, 0xa2, 0x21, 0x86, 0xba, 0x25, 0xa4, + 0x71, 0x20, 0x5b, 0x30, 0x1b, 0x9e, 0xda, 0x0a, 0xe3, 0x62, 0x14, 0x25, 0x38, 0x3a, 0xea, 0xd3, + 0xf9, 0xa6, 0xd1, 0x13, 0x1b, 0xce, 0x69, 0xe7, 0xb4, 0xc2, 0xfa, 0x12, 0xb2, 0xc6, 0x5c, 0xf5, + 0xfa, 0x21, 0x9f, 0xce, 0xbe, 0x17, 0x1f, 0xf2, 0x11, 0x2c, 0xc4, 0xcf, 0x66, 0xa5, 0x96, 0x17, + 0xb1, 0x96, 0xd7, 0x8e, 0x8f, 0x8a, 0x97, 0x13, 0xc7, 0x7b, 0x7a, 0x45, 0x7d, 0xb8, 0x91, 0xaf, + 0xc3, 0xbc, 0x7e, 0x3e, 0x2b, 0x35, 0x19, 0x58, 0x13, 0x2e, 0x9d, 0xf0, 0x60, 0x4f, 0xaf, 0xa1, + 0x27, 0x0f, 0x12, 0x40, 0x31, 0x75, 0x76, 0x2b, 0xd5, 0xbc, 0x14, 0x35, 0x28, 0xb1, 0x4a, 0xd2, + 0xab, 0x3b, 0x89, 0x25, 0x79, 0x04, 0x17, 0xd3, 0x8e, 0x09, 0xa5, 0xd2, 0x97, 0x43, 0x25, 0xf0, + 0xeb, 0xe9, 0x47, 0x4e, 0x7a, 0xcd, 0x27, 0xb0, 0x25, 0x5f, 0x81, 0x33, 0xca, 0xfa, 0x52, 0xea, + 0x7b, 0x05, 0xeb, 0x43, 0x57, 0x70, 0x75, 0x61, 0xa6, 0xd7, 0x92, 0xce, 0x83, 0xb4, 0x60, 0x56, + 0x36, 0x1c, 0xb5, 0xed, 0xe2, 0xe8, 0xb9, 0xac, 0xed, 0xaa, 0x49, 0x8c, 0xa5, 0x4b, 0x62, 0x57, + 0x9d, 0x6f, 0xec, 0x58, 0x9d, 0x88, 0x50, 0x9d, 0xe9, 0x29, 0x7c, 0xc9, 0x0a, 0x8c, 0xd4, 0x36, + 0xaa, 0xb7, 0x6f, 0x2f, 0xcf, 0xbf, 0x8a, 0x35, 0x48, 0xbf, 0x31, 0x0e, 0xd4, 0x2e, 0x4d, 0xc2, + 0x5c, 0xb1, 0xe3, 0xec, 0xee, 0x6a, 0x0f, 0x56, 0x1c, 0x95, 0xfc, 0x75, 0x34, 0x14, 0x64, 0x3b, + 0x6a, 0xc9, 0xf7, 0x9d, 0x3d, 0x8c, 0x3a, 0xed, 0xcf, 0xbf, 0xa6, 0xbd, 0xf7, 0xcb, 0x88, 0xdc, + 0x65, 0x4c, 0x58, 0x96, 0x40, 0xe7, 0xd2, 0x26, 0xbb, 0xff, 0x8b, 0x9d, 0xdb, 0xb2, 0x23, 0x56, + 0xea, 0x26, 0x9e, 0xac, 0x88, 0xf5, 0xdb, 0x9e, 0x13, 0x58, 0xfb, 0x5d, 0xad, 0xf9, 0xf3, 0xaf, + 0x6b, 0x11, 0x98, 0x79, 0x1a, 0x37, 0xa5, 0xd7, 0x5e, 0x16, 0x15, 0xbe, 0xc0, 0x6f, 0xcb, 0x3d, + 0x7a, 0x6e, 0x66, 0x2f, 0x46, 0xe7, 0xdf, 0x1d, 0xca, 0x5f, 0x29, 0x5c, 0xbd, 0x3b, 0x94, 0xbf, + 0x5a, 0x78, 0xcd, 0x7c, 0xa1, 0x56, 0x5a, 0x5b, 0xad, 0x36, 0xe4, 0xb9, 0x22, 0xc3, 0x8d, 0xf3, + 0xa1, 0x35, 0x2f, 0xf7, 0x2b, 0x8d, 0x06, 0xde, 0xf8, 0x3b, 0x19, 0x28, 0x9e, 0xd0, 0x3f, 0x6c, + 0x2b, 0x8f, 0x3e, 0xa2, 0x46, 0x03, 0x35, 0x68, 0x79, 0xf4, 0xe9, 0x96, 0x6e, 0x31, 0xa1, 0x93, + 0xa0, 0xbf, 0x9d, 0xc8, 0x94, 0xa1, 0xb8, 0x5d, 0x26, 0x33, 0x64, 0x48, 0x2c, 0x63, 0x15, 0x0a, + 0xf1, 0x7e, 0x23, 0x9f, 0x87, 0x49, 0x35, 0x4e, 0xbf, 0xbc, 0x45, 0xf3, 0x18, 0x1b, 0xde, 0x9e, + 0x76, 0x16, 0x68, 0x88, 0xc6, 0x2f, 0x64, 0x60, 0x36, 0x65, 0x72, 0x91, 0xcb, 0x30, 0x84, 0x89, + 0xb4, 0x14, 0x83, 0x99, 0x58, 0x02, 0x2d, 0x2c, 0x27, 0x9f, 0x81, 0xd1, 0xca, 0x7a, 0xad, 0x56, + 0x5a, 0x97, 0xf7, 0x70, 0x7e, 0x06, 0xb5, 0x7d, 0xcb, 0xb7, 0xf5, 0x77, 0x76, 0x81, 0x46, 0xde, + 0x84, 0x91, 0xea, 0x06, 0x12, 0x70, 0xb3, 0x4f, 0x6c, 0xaf, 0xd3, 0x89, 0xe3, 0x0b, 0x24, 0xe3, + 0xc7, 0x33, 0x40, 0x92, 0x2b, 0x85, 0xdc, 0x80, 0x71, 0x75, 0x3d, 0xf2, 0xf6, 0xe2, 0xe3, 0xa3, + 0x32, 0x67, 0x4c, 0x15, 0x87, 0x54, 0x60, 0x18, 0x53, 0xa0, 0x86, 0x0f, 0xfc, 0xa9, 0xa7, 0xfa, + 0xb9, 0xc4, 0xa9, 0x3e, 0x8c, 0x09, 0x56, 0x4d, 0x4e, 0x6c, 0xfc, 0x6e, 0x06, 0x48, 0xba, 0xd9, + 0xde, 0x40, 0x06, 0x46, 0x6f, 0x29, 0x6e, 0xfb, 0x6a, 0xaa, 0x9c, 0x30, 0xcf, 0x99, 0x7a, 0x03, + 0x8e, 0x1c, 0xfc, 0x2f, 0x6b, 0x1a, 0x97, 0xde, 0xbe, 0x9e, 0x57, 0x61, 0xf8, 0x01, 0xf5, 0x76, + 0xa4, 0x45, 0x33, 0x5a, 0x41, 0x3e, 0x64, 0x00, 0x55, 0x03, 0x81, 0x18, 0xc6, 0x9f, 0x64, 0x60, + 0x2e, 0x4d, 0x3c, 0x3f, 0xc1, 0x25, 0xd3, 0x88, 0x79, 0x93, 0xa2, 0x71, 0x11, 0x37, 0x91, 0x0c, + 0x7d, 0x48, 0x8b, 0x30, 0xcc, 0x1a, 0x2b, 0x47, 0x18, 0x35, 0x40, 0xac, 0x37, 0x7c, 0x93, 0xc3, + 0x19, 0x02, 0x0f, 0x4f, 0x37, 0x84, 0x91, 0x0d, 0x11, 0x01, 0x67, 0xb7, 0xc9, 0xe1, 0x0c, 0x61, + 0xcd, 0x6d, 0x84, 0xd9, 0xff, 0x11, 0xa1, 0xc5, 0x00, 0x26, 0x87, 0x93, 0xcb, 0x30, 0x7a, 0xbf, + 0xbd, 0x4a, 0xed, 0x87, 0x32, 0x5d, 0x03, 0x1a, 0x43, 0xb9, 0x6d, 0xab, 0xc9, 0x60, 0xa6, 0x2c, + 0x34, 0x7e, 0x26, 0x03, 0x33, 0x89, 0x9b, 0xc1, 0xc9, 0x5e, 0xa7, 0xfd, 0xdd, 0xbf, 0x06, 0x69, + 0x1f, 0xff, 0xfc, 0xa1, 0xf4, 0xcf, 0x37, 0xfe, 0xbb, 0x11, 0x38, 0xd7, 0x43, 0x51, 0x13, 0xb9, + 0xa7, 0x66, 0x4e, 0x74, 0x4f, 0xfd, 0x2a, 0x4c, 0x96, 0x9b, 0xb6, 0xd3, 0xf2, 0x37, 0xdd, 0xe8, + 0x8b, 0x23, 0x2f, 0x17, 0x2c, 0x13, 0x2e, 0x00, 0xa1, 0x3b, 0xc4, 0xf9, 0x3a, 0x52, 0x58, 0x81, + 0x9b, 0x94, 0x13, 0x35, 0x66, 0x09, 0x07, 0xd1, 0xdc, 0x5f, 0x12, 0x07, 0x51, 0xdd, 0x65, 0x69, + 0xe8, 0xa9, 0xba, 0x2c, 0xa5, 0x9b, 0x3b, 0x0f, 0x3f, 0x89, 0xf1, 0x7b, 0x19, 0x26, 0xb9, 0x35, + 0x58, 0xc9, 0xe7, 0x83, 0x34, 0x92, 0xb0, 0x20, 0xb3, 0xfd, 0xe4, 0x58, 0x68, 0x34, 0x64, 0x45, + 0x77, 0xaf, 0x19, 0xc5, 0xe7, 0xd2, 0xcb, 0xbd, 0xdd, 0x67, 0x34, 0x33, 0x09, 0xcd, 0x8d, 0xe6, + 0x5b, 0x30, 0x97, 0x76, 0xd3, 0x9b, 0xcf, 0x6b, 0x86, 0xa6, 0x3d, 0x0d, 0x94, 0x07, 0xbf, 0x2f, + 0x1e, 0xa4, 0xde, 0x17, 0xa5, 0xdb, 0xf3, 0x98, 0x16, 0xcd, 0xb8, 0xc7, 0x5a, 0xe0, 0xb8, 0xfd, + 0x9d, 0xa3, 0x8d, 0xaf, 0xc2, 0x85, 0xbe, 0xe4, 0xe4, 0x1d, 0x2d, 0xbc, 0xce, 0xab, 0xc9, 0xf0, + 0x3a, 0xdf, 0x3d, 0x2a, 0xce, 0x68, 0x2e, 0x8b, 0x6b, 0xa1, 0xae, 0xdb, 0xf8, 0x99, 0xac, 0xee, + 0x6c, 0xfb, 0x97, 0x71, 0xa1, 0x5e, 0x85, 0xe1, 0xed, 0x7d, 0xea, 0xc9, 0xe3, 0x01, 0x3f, 0xe4, + 0x11, 0x03, 0xa8, 0x1f, 0x82, 0x18, 0xe4, 0x36, 0x4c, 0x6d, 0xf0, 0x89, 0x2b, 0x67, 0xe3, 0x50, + 0xa4, 0x6e, 0xe8, 0x08, 0xa5, 0x58, 0xca, 0x74, 0x8c, 0x51, 0x19, 0x77, 0x62, 0x9d, 0x2e, 0x82, + 0x03, 0x71, 0xa7, 0x20, 0x2e, 0x40, 0x4c, 0x45, 0x6e, 0x50, 0xd1, 0x66, 0x6b, 0xc6, 0xa0, 0xc6, + 0x2e, 0x5c, 0xec, 0xcb, 0x88, 0x9d, 0xdb, 0xd0, 0x09, 0x7f, 0xc5, 0x8c, 0x8e, 0xfb, 0x92, 0x9a, + 0x0a, 0x9d, 0xf1, 0x2d, 0x98, 0x50, 0x7b, 0x19, 0x8f, 0x20, 0xf6, 0x5b, 0xcc, 0x0a, 0x7e, 0x04, + 0x31, 0x80, 0xc9, 0xe1, 0xd1, 0x33, 0x46, 0x36, 0xfd, 0x19, 0x23, 0x1a, 0xfe, 0xdc, 0x49, 0xc3, + 0xcf, 0x2a, 0xc7, 0x1d, 0x4e, 0xa9, 0x1c, 0x7f, 0xab, 0x95, 0x63, 0xf4, 0x1f, 0x93, 0xc3, 0x9f, + 0x6a, 0xe5, 0xff, 0x44, 0xe6, 0xf7, 0x42, 0x9f, 0x23, 0xb9, 0xdc, 0x33, 0x51, 0x92, 0xae, 0xb4, + 0xd5, 0x1b, 0x61, 0x46, 0x32, 0x45, 0xf6, 0x24, 0x99, 0xe2, 0x34, 0x13, 0x11, 0xe5, 0x5e, 0x3e, + 0xa4, 0x43, 0x91, 0x1c, 0x68, 0x27, 0x0c, 0x3d, 0x24, 0x96, 0xf1, 0xed, 0x0c, 0x9c, 0x49, 0x55, + 0x17, 0xb3, 0x5a, 0xb9, 0x5e, 0x5a, 0x59, 0x87, 0x71, 0xa5, 0x34, 0xc7, 0x38, 0x4d, 0xe8, 0x87, + 0xc1, 0xdb, 0x62, 0xbc, 0x08, 0x63, 0xe1, 0x63, 0x25, 0x99, 0x93, 0x43, 0x87, 0x26, 0x81, 0xf2, + 0xcd, 0xab, 0x06, 0xc0, 0xbe, 0xe0, 0xa9, 0x5a, 0x15, 0x1b, 0xff, 0x24, 0xcb, 0x73, 0xbf, 0x3e, + 0xb3, 0x51, 0x5c, 0xd3, 0x4d, 0x81, 0x59, 0x93, 0x7a, 0xc7, 0x6e, 0x25, 0xcb, 0x30, 0x52, 0x0b, + 0xec, 0xa0, 0x2b, 0x23, 0x56, 0xcc, 0xaa, 0x64, 0x58, 0xf0, 0x60, 0x31, 0x8a, 0x59, 0xe0, 0x23, + 0x44, 0xbb, 0x20, 0x23, 0x44, 0xb1, 0x28, 0xfe, 0x83, 0x0c, 0x4c, 0xa8, 0xc4, 0xe4, 0x43, 0x98, + 0x92, 0xb1, 0x29, 0x79, 0x1c, 0x0f, 0xf1, 0xb2, 0x2a, 0xad, 0xa0, 0x64, 0x6c, 0x4a, 0x35, 0xee, + 0x87, 0x86, 0xaf, 0x6e, 0xd5, 0x1d, 0x15, 0x99, 0x34, 0x80, 0xb4, 0x76, 0x6d, 0xeb, 0x11, 0xb5, + 0x0f, 0xa8, 0x1f, 0x58, 0xdc, 0x5a, 0x45, 0x3c, 0xc0, 0x4a, 0xf6, 0x6b, 0xb7, 0x4b, 0xdc, 0x50, + 0x85, 0x8d, 0x84, 0x08, 0x32, 0x9a, 0xa0, 0x51, 0x5f, 0x95, 0x5a, 0xbb, 0xf6, 0x36, 0x2f, 0xe4, + 0x74, 0xc6, 0x9f, 0x8e, 0xf0, 0xe9, 0x26, 0x42, 0xd9, 0xee, 0xc0, 0xd4, 0xfd, 0x6a, 0xa5, 0xac, + 0xe8, 0x98, 0xf5, 0x4c, 0x48, 0xcb, 0x8f, 0x03, 0xea, 0xb5, 0xed, 0xa6, 0xbc, 0xef, 0x46, 0x47, + 0x90, 0xeb, 0x34, 0xea, 0xe9, 0xfa, 0xe7, 0x18, 0x47, 0x56, 0x07, 0xbf, 0x59, 0x87, 0x75, 0x64, + 0x07, 0xac, 0xc3, 0xb7, 0x5b, 0xcd, 0x1e, 0x75, 0xe8, 0x1c, 0xc9, 0x3e, 0x5e, 0x7d, 0xf7, 0xbb, + 0x3b, 0x4a, 0x2d, 0xb9, 0xfe, 0xb5, 0xbc, 0x24, 0x6a, 0x79, 0x5e, 0x68, 0x14, 0x52, 0xeb, 0x49, + 0x70, 0x8d, 0xf6, 0x89, 0xa1, 0x13, 0xf7, 0x89, 0xbf, 0x99, 0x81, 0x11, 0x2e, 0xbe, 0x8a, 0x69, + 0xdc, 0x43, 0x40, 0xde, 0x7e, 0x3a, 0x02, 0x72, 0x01, 0xcf, 0x09, 0x6d, 0x42, 0xf3, 0x32, 0x52, + 0x89, 0xad, 0x0b, 0x69, 0x08, 0x8f, 0xaf, 0x45, 0xbc, 0xe4, 0xe4, 0x65, 0x41, 0xaa, 0x51, 0x14, + 0x89, 0xd1, 0x13, 0x1d, 0x95, 0x65, 0xe4, 0x8d, 0x51, 0x11, 0x45, 0x42, 0x8f, 0x1d, 0xb1, 0x0a, + 0x63, 0x22, 0x36, 0xc5, 0xd2, 0xa1, 0x78, 0x13, 0x2e, 0x68, 0x56, 0x3d, 0x8d, 0xa5, 0xc3, 0x48, + 0x34, 0x17, 0xd1, 0x2d, 0xac, 0x9d, 0x43, 0x2d, 0x95, 0xae, 0x44, 0x24, 0xf7, 0x79, 0x8a, 0x49, + 0x1e, 0xec, 0x57, 0x8f, 0xee, 0x1f, 0xc2, 0x45, 0xd4, 0x2b, 0xe9, 0xe0, 0x9e, 0x12, 0xdb, 0x37, + 0xe2, 0x41, 0x56, 0xa1, 0x80, 0x96, 0x60, 0xb4, 0xc1, 0x57, 0x4d, 0xb5, 0xc2, 0xe3, 0x1f, 0x08, + 0x6b, 0xde, 0x80, 0x97, 0x89, 0xe5, 0x16, 0x73, 0x3d, 0x4c, 0x50, 0xb2, 0xeb, 0x74, 0x21, 0x3e, + 0xfb, 0xc8, 0xbb, 0x30, 0x1e, 0x06, 0x5b, 0x0e, 0x9d, 0x9f, 0xf1, 0x6d, 0x28, 0x8a, 0xce, 0xac, + 0x27, 0x26, 0x54, 0xd0, 0xc9, 0x22, 0xe4, 0xd9, 0x22, 0x8e, 0x27, 0xf1, 0xed, 0x0a, 0x98, 0xea, + 0x8c, 0x24, 0xf1, 0x48, 0x0d, 0x66, 0xd9, 0xa2, 0xa9, 0x39, 0xed, 0xbd, 0x26, 0x5d, 0x75, 0xf7, + 0xdc, 0x6e, 0x10, 0xe5, 0xe9, 0xe3, 0x17, 0x18, 0xbb, 0xd5, 0xd4, 0x8a, 0xf5, 0x2c, 0x7d, 0x29, + 0xd4, 0xca, 0x56, 0xf9, 0x47, 0x59, 0x18, 0x57, 0xe6, 0x13, 0xb9, 0x0a, 0xf9, 0xaa, 0xbf, 0xea, + 0xd6, 0x0f, 0xc2, 0xb0, 0x88, 0x93, 0xc7, 0x47, 0xc5, 0x31, 0xc7, 0xb7, 0x9a, 0x08, 0x34, 0xc3, + 0x62, 0xb2, 0x04, 0x93, 0xfc, 0x2f, 0x99, 0x04, 0x23, 0x1b, 0x29, 0xcb, 0x38, 0xb2, 0x4c, 0x7f, + 0xa1, 0xee, 0x9e, 0x1a, 0x09, 0xf9, 0x1a, 0x00, 0x07, 0xa0, 0x23, 0x7d, 0x6e, 0xf0, 0x10, 0x00, + 0xa2, 0x82, 0x14, 0x17, 0x7a, 0x85, 0x21, 0xf9, 0x06, 0x0f, 0xce, 0x2c, 0xe7, 0xff, 0xd0, 0xe0, + 0x31, 0x0c, 0x18, 0x7f, 0x2b, 0x3d, 0x94, 0x8a, 0xca, 0x52, 0xe4, 0xad, 0x59, 0x30, 0x69, 0xdd, + 0x7d, 0x48, 0xbd, 0xc3, 0x52, 0x80, 0x88, 0x0a, 0x86, 0xf1, 0xbf, 0x66, 0x94, 0x55, 0x43, 0xd6, + 0x31, 0xef, 0x34, 0x9f, 0x11, 0xc2, 0x3c, 0x2a, 0xbc, 0x33, 0x48, 0xb8, 0x49, 0x77, 0x97, 0x9e, + 0x17, 0x96, 0x5a, 0xb3, 0xe1, 0xbc, 0x8a, 0xe5, 0xa3, 0xe6, 0x40, 0xf2, 0x45, 0x18, 0xc2, 0xae, + 0xcb, 0x9e, 0xd8, 0x34, 0x79, 0x6c, 0x0f, 0xb1, 0x3e, 0xc3, 0x86, 0x20, 0x25, 0xf9, 0x8c, 0x70, + 0x42, 0xe6, 0x9d, 0x3f, 0xa5, 0x9c, 0xbd, 0xec, 0x3b, 0xc2, 0xf3, 0x3a, 0x8a, 0xa6, 0xa3, 0xcc, + 0x9e, 0xbf, 0x93, 0x85, 0x42, 0x7c, 0xad, 0x92, 0x0f, 0x60, 0x42, 0x9e, 0xa7, 0x2b, 0xb6, 0xc8, + 0xe0, 0x30, 0x21, 0x32, 0x28, 0xc8, 0x43, 0x75, 0xdf, 0x56, 0xcd, 0xa9, 0x4c, 0x8d, 0x80, 0x09, + 0x37, 0x9b, 0x22, 0xba, 0x9d, 0xb2, 0x4a, 0x02, 0x37, 0xe8, 0xc4, 0x62, 0x02, 0x4b, 0x34, 0xf2, + 0x16, 0xe4, 0xd6, 0x6e, 0x97, 0x84, 0xb3, 0x5a, 0x21, 0x7e, 0xea, 0x72, 0xab, 0x4f, 0xdd, 0x06, + 0x95, 0xe1, 0x93, 0x55, 0x25, 0x7c, 0xf6, 0x88, 0x66, 0x3a, 0x27, 0xc1, 0x61, 0xe3, 0x4e, 0x8e, + 0xa3, 0x7d, 0x77, 0x28, 0x9f, 0x2b, 0x0c, 0x89, 0x80, 0xb0, 0xff, 0x43, 0x0e, 0xc6, 0xc2, 0xfa, + 0x09, 0x51, 0x5d, 0x80, 0xb9, 0xbb, 0x2f, 0x39, 0x0f, 0x79, 0x29, 0xae, 0x09, 0x9f, 0xb5, 0x51, + 0x5f, 0x88, 0x6a, 0xf3, 0x20, 0xe5, 0x32, 0xbe, 0xcc, 0x4d, 0xf9, 0x93, 0xdc, 0x80, 0x50, 0xe8, + 0xea, 0x25, 0x9d, 0x0d, 0xb1, 0x01, 0x33, 0x43, 0x34, 0x32, 0x05, 0x59, 0x87, 0x07, 0x19, 0x1b, + 0x33, 0xb3, 0x4e, 0x83, 0x7c, 0x00, 0x79, 0xbb, 0xd1, 0xa0, 0x0d, 0xcb, 0x96, 0x76, 0x46, 0xfd, + 0x26, 0x4d, 0x9e, 0x71, 0xe3, 0x87, 0x00, 0x52, 0x95, 0x02, 0x52, 0x82, 0xb1, 0xa6, 0xcd, 0x2d, + 0x17, 0x1b, 0x03, 0x9c, 0x28, 0x11, 0x87, 0x3c, 0x23, 0xdb, 0xf2, 0x69, 0x83, 0xbc, 0x0a, 0x43, + 0x6c, 0x34, 0xc5, 0x11, 0x22, 0xa5, 0x44, 0x36, 0x98, 0xbc, 0xc3, 0x56, 0x9e, 0x33, 0x11, 0x81, + 0xbc, 0x0c, 0xb9, 0xee, 0xe2, 0xae, 0x38, 0x1c, 0x0a, 0x51, 0x28, 0xfb, 0x10, 0x8d, 0x15, 0x93, + 0x9b, 0x90, 0x7f, 0xa4, 0x47, 0x41, 0x3f, 0x13, 0x1b, 0xc6, 0x10, 0x3f, 0x44, 0x24, 0xaf, 0x42, + 0xce, 0xf7, 0x5d, 0x61, 0x9c, 0x33, 0x1b, 0x5a, 0x4c, 0xde, 0x0f, 0x47, 0x8d, 0x71, 0xf7, 0x7d, + 0x77, 0x29, 0x0f, 0x23, 0xfc, 0xc4, 0x30, 0x2e, 0x02, 0x44, 0xdf, 0x98, 0xf4, 0x41, 0x34, 0xbe, + 0x06, 0x63, 0xe1, 0xb7, 0x91, 0x0b, 0x00, 0x07, 0xf4, 0xd0, 0xda, 0xb7, 0xdb, 0x8d, 0x26, 0x17, + 0x37, 0x27, 0xcc, 0xb1, 0x03, 0x7a, 0xb8, 0x82, 0x00, 0x72, 0x0e, 0x46, 0x3b, 0x6c, 0xf8, 0xc5, + 0x1c, 0x9f, 0x30, 0x47, 0x3a, 0xdd, 0x1d, 0x36, 0x95, 0xe7, 0x61, 0x14, 0x15, 0xa7, 0x62, 0x45, + 0x4e, 0x9a, 0xf2, 0xa7, 0xf1, 0x67, 0x39, 0x4c, 0x15, 0xa4, 0x34, 0x88, 0xbc, 0x04, 0x93, 0x75, + 0x8f, 0xe2, 0xe1, 0x64, 0x33, 0x91, 0x4b, 0xd4, 0x33, 0x11, 0x01, 0xab, 0x0d, 0x72, 0x19, 0xa6, + 0x3b, 0xdd, 0x9d, 0xa6, 0x53, 0x67, 0xb5, 0x59, 0xf5, 0x1d, 0x91, 0xdb, 0x60, 0xc2, 0x9c, 0xe4, + 0xe0, 0x7b, 0xf4, 0xb0, 0xbc, 0x83, 0x51, 0xf4, 0x0a, 0x6a, 0x10, 0xe4, 0x20, 0x4c, 0xe2, 0x6e, + 0x4e, 0x2b, 0x70, 0xb4, 0x33, 0x3c, 0x0b, 0x23, 0xb6, 0xbd, 0xd7, 0x75, 0x78, 0xb4, 0xab, 0x09, + 0x53, 0xfc, 0x22, 0xaf, 0xc3, 0x4c, 0x14, 0x97, 0x5b, 0x36, 0x63, 0x18, 0x9b, 0x51, 0x08, 0x0b, + 0xca, 0x1c, 0x4e, 0xde, 0x04, 0xa2, 0xd6, 0xe7, 0xee, 0x7c, 0x44, 0xeb, 0x7c, 0x4e, 0x4e, 0x98, + 0x33, 0x4a, 0xc9, 0x7d, 0x2c, 0x20, 0x2f, 0xc2, 0x84, 0x47, 0x7d, 0x14, 0xf7, 0xb0, 0xdb, 0x30, + 0x93, 0x9e, 0x39, 0x2e, 0x61, 0xac, 0xef, 0xae, 0x40, 0x41, 0xe9, 0x0e, 0x8c, 0x33, 0xcd, 0x03, + 0xfb, 0x9b, 0x53, 0x11, 0xdc, 0xec, 0x54, 0x1b, 0xe4, 0xcb, 0xb0, 0xa0, 0x60, 0xf2, 0xa4, 0x7e, + 0x16, 0x6d, 0x3a, 0x7b, 0xce, 0x4e, 0x93, 0x8a, 0xf9, 0x96, 0x9c, 0xd5, 0xe1, 0x9d, 0xd0, 0x9c, + 0x8f, 0xa8, 0x79, 0xba, 0xbf, 0x65, 0x41, 0x4b, 0x56, 0x61, 0x2e, 0xc6, 0x99, 0x36, 0xac, 0x6e, + 0xa7, 0x67, 0x78, 0xb9, 0x88, 0x27, 0xd1, 0x79, 0xd2, 0xc6, 0x56, 0xc7, 0xf8, 0x16, 0x4c, 0xa8, + 0x73, 0x92, 0x75, 0x82, 0x2a, 0x68, 0x88, 0xd9, 0x37, 0x1e, 0xc2, 0xaa, 0xec, 0xa2, 0x37, 0x15, + 0xa1, 0x04, 0x61, 0xbe, 0x7a, 0x73, 0x32, 0x84, 0xe2, 0x10, 0xbe, 0x08, 0x13, 0x0d, 0xc7, 0xef, + 0x34, 0xed, 0x43, 0x2b, 0xca, 0x56, 0x6d, 0x8e, 0x0b, 0x18, 0x6a, 0x72, 0x96, 0x60, 0x26, 0xb1, + 0x0f, 0x92, 0x37, 0xf9, 0x0d, 0x55, 0x08, 0x3f, 0x13, 0xfc, 0x96, 0x8f, 0x56, 0xcc, 0x9a, 0xdc, + 0x23, 0x90, 0x8c, 0x36, 0x4c, 0xa8, 0xe7, 0xda, 0x09, 0x49, 0x38, 0xce, 0x62, 0x48, 0x19, 0xbe, + 0xe9, 0x8f, 0x1c, 0x1f, 0x15, 0xb3, 0x4e, 0x03, 0x03, 0xc9, 0x5c, 0x81, 0xbc, 0x14, 0xc1, 0x84, + 0xe4, 0x83, 0xaf, 0x03, 0x32, 0x43, 0xb1, 0x19, 0x96, 0x1a, 0xaf, 0xc2, 0xa8, 0x38, 0xba, 0xfa, + 0xbf, 0x09, 0x18, 0x3f, 0x9c, 0x85, 0x69, 0x93, 0xb2, 0x8d, 0x95, 0xf2, 0xcc, 0x3b, 0xcf, 0xec, + 0x9d, 0x3b, 0x3d, 0x30, 0xa9, 0xd6, 0xb6, 0x3e, 0x39, 0x6f, 0x7e, 0x25, 0x03, 0xb3, 0x29, 0xb8, + 0x1f, 0x2b, 0xe7, 0xeb, 0x2d, 0x18, 0xab, 0x38, 0x76, 0xb3, 0xd4, 0x68, 0x84, 0xf1, 0x65, 0x50, + 0x70, 0xc7, 0xc4, 0x50, 0x36, 0x83, 0xaa, 0x42, 0x4c, 0x88, 0x4a, 0x5e, 0x13, 0x93, 0x22, 0xca, + 0x98, 0x8e, 0x93, 0xe2, 0xbb, 0x47, 0x45, 0xe0, 0xdf, 0xb4, 0x19, 0x4e, 0x11, 0x0c, 0x16, 0xcc, + 0x81, 0x91, 0x8f, 0xd0, 0x33, 0x3b, 0x74, 0xe9, 0xc1, 0x82, 0xe3, 0xcd, 0x1b, 0x28, 0xed, 0xcd, + 0x4f, 0x64, 0xe1, 0x6c, 0x3a, 0xe1, 0xc7, 0x4d, 0xdf, 0x8b, 0x09, 0x87, 0x94, 0x00, 0xe7, 0x98, + 0xbe, 0x97, 0x67, 0x27, 0x42, 0xfc, 0x08, 0x81, 0xec, 0xc2, 0xe4, 0xaa, 0xed, 0x07, 0x2b, 0xd4, + 0xf6, 0x82, 0x1d, 0x6a, 0x07, 0x03, 0x48, 0xf2, 0xd2, 0x32, 0x60, 0x1e, 0x85, 0x89, 0x7d, 0x49, + 0x19, 0x93, 0xb5, 0x75, 0xb6, 0xe1, 0x44, 0x19, 0x1a, 0x60, 0xa2, 0x7c, 0x13, 0xa6, 0x6b, 0xb4, + 0x65, 0x77, 0xf6, 0x5d, 0x4f, 0xfa, 0xfe, 0x5f, 0x83, 0xc9, 0x10, 0x94, 0x3a, 0x5b, 0xf4, 0x62, + 0x0d, 0x5f, 0xe9, 0x88, 0x68, 0x2b, 0xd1, 0x8b, 0x8d, 0xbf, 0x9b, 0x85, 0x73, 0xa5, 0xba, 0x30, + 0x73, 0x14, 0x05, 0xd2, 0x1a, 0xfb, 0x13, 0xae, 0x9b, 0x5c, 0x87, 0xb1, 0x35, 0xfb, 0xf1, 0x2a, + 0xb5, 0x7d, 0xea, 0x8b, 0xe4, 0x89, 0x5c, 0xec, 0xb5, 0x1f, 0x47, 0xaf, 0x39, 0x66, 0x84, 0xa3, + 0xea, 0x05, 0x86, 0x9e, 0x50, 0x2f, 0x60, 0xc0, 0xc8, 0x8a, 0xdb, 0x6c, 0x88, 0xb3, 0x5e, 0x3c, + 0x21, 0xef, 0x23, 0xc4, 0x14, 0x25, 0xec, 0x3a, 0x3d, 0x15, 0x7e, 0x31, 0x7e, 0xc2, 0x27, 0xde, + 0x25, 0x97, 0x61, 0x14, 0x2b, 0x0a, 0xb3, 0xbc, 0xe3, 0xa1, 0xd1, 0xa4, 0x98, 0x02, 0xaf, 0x61, + 0xca, 0x42, 0xb5, 0x27, 0x86, 0x9f, 0xac, 0x27, 0x8c, 0x7f, 0x88, 0xaf, 0xd3, 0x6a, 0x2b, 0xd9, + 0x49, 0xa4, 0x7c, 0x48, 0x66, 0xc0, 0x0f, 0xc9, 0x3e, 0xb5, 0x21, 0xc9, 0xf5, 0x1c, 0x92, 0x1f, + 0xc9, 0xc2, 0x78, 0xf8, 0xb1, 0x9f, 0xb2, 0x28, 0xfb, 0x61, 0xbb, 0x06, 0x8a, 0xd7, 0x53, 0x53, + 0xf6, 0x0a, 0x11, 0x16, 0xe7, 0x8b, 0x30, 0x22, 0x16, 0x53, 0x26, 0x66, 0x95, 0x1c, 0x1b, 0xdd, + 0xa5, 0x29, 0xc1, 0x7a, 0x04, 0x07, 0xd4, 0x37, 0x05, 0x1d, 0x06, 0x44, 0xda, 0xa6, 0x3b, 0xc2, + 0x58, 0xe1, 0x99, 0x3d, 0xa3, 0xd2, 0x03, 0x22, 0x45, 0x0d, 0x1b, 0xe8, 0x74, 0xfa, 0xa7, 0x79, + 0x28, 0xc4, 0x49, 0x4e, 0xce, 0x63, 0xb0, 0xd1, 0xdd, 0xe1, 0x57, 0x15, 0x9e, 0xc7, 0xa0, 0xd3, + 0xdd, 0x31, 0x19, 0x0c, 0x6d, 0x99, 0x3c, 0xe7, 0x21, 0xb6, 0x7a, 0x42, 0xd8, 0x32, 0x79, 0xce, + 0x43, 0xcd, 0x96, 0xc9, 0x73, 0x1e, 0xa2, 0x22, 0x61, 0xb5, 0x86, 0xc1, 0x02, 0xf0, 0x9e, 0x22, + 0x14, 0x09, 0x4d, 0x3f, 0x9e, 0x93, 0x4c, 0xa2, 0xb1, 0xa3, 0x72, 0x89, 0xda, 0x9e, 0x88, 0xb9, + 0x2f, 0xb6, 0x33, 0x3c, 0x2a, 0x77, 0x10, 0x6c, 0x05, 0x0c, 0x6e, 0xaa, 0x48, 0xa4, 0x09, 0x44, + 0xf9, 0x29, 0x17, 0xf0, 0xc9, 0x77, 0x6b, 0x69, 0x51, 0x38, 0xa7, 0xb2, 0xb6, 0xd4, 0xd5, 0x9c, + 0xc2, 0xf7, 0x69, 0xaa, 0x73, 0x37, 0x44, 0x20, 0x51, 0x54, 0x20, 0xe5, 0x4f, 0x64, 0x26, 0x83, + 0x9c, 0x00, 0x0f, 0x34, 0x1a, 0xaa, 0x91, 0x22, 0x26, 0xe4, 0x7d, 0x18, 0x57, 0x43, 0x40, 0xf0, + 0x40, 0x05, 0x2f, 0xf0, 0xd8, 0x90, 0x3d, 0xb2, 0xd8, 0xaa, 0x04, 0x64, 0x07, 0xce, 0x95, 0xdd, + 0xb6, 0xdf, 0x6d, 0xc9, 0x28, 0x94, 0x51, 0xec, 0x6b, 0xc0, 0xa1, 0x40, 0x7f, 0xf2, 0xba, 0x40, + 0x11, 0x11, 0x07, 0xa4, 0xcb, 0x87, 0x7e, 0x01, 0xe9, 0xc5, 0x88, 0x6c, 0xc2, 0x38, 0xaa, 0x44, + 0x85, 0x4d, 0xe9, 0xb8, 0xbe, 0x6d, 0x44, 0x25, 0x15, 0xb6, 0x30, 0x78, 0x04, 0x34, 0xbb, 0xd5, + 0x94, 0x1e, 0x07, 0xaa, 0x6a, 0x57, 0x41, 0x26, 0x5f, 0x83, 0x29, 0x7e, 0x45, 0xdb, 0xa6, 0x3b, + 0x7c, 0xee, 0x4c, 0x68, 0x9a, 0x08, 0xbd, 0x90, 0xbf, 0xce, 0x0b, 0x45, 0xf4, 0x23, 0xba, 0xc3, + 0xc7, 0x5e, 0xf3, 0xf7, 0xd1, 0xf0, 0xc9, 0x16, 0xcc, 0xae, 0xd8, 0x3e, 0x07, 0x2a, 0xbe, 0xfc, + 0x93, 0xa8, 0xa1, 0x45, 0x3b, 0xec, 0x7d, 0xdb, 0x97, 0x9a, 0xed, 0x54, 0xdf, 0xfd, 0x34, 0x7a, + 0xf2, 0xc3, 0x19, 0x98, 0xd7, 0x14, 0xdf, 0xc2, 0x70, 0xac, 0x45, 0xdb, 0x01, 0x3a, 0xf6, 0x4c, + 0x2d, 0x16, 0xa5, 0x50, 0xda, 0x03, 0x8d, 0x0f, 0x49, 0x4c, 0xb7, 0xee, 0x45, 0xe5, 0xaa, 0x81, + 0x73, 0x2f, 0x1e, 0x62, 0xa1, 0xe2, 0x9a, 0x9e, 0xd6, 0x17, 0x6a, 0x6c, 0x5d, 0x4b, 0x34, 0xe3, + 0x56, 0xbc, 0xbf, 0x85, 0xa2, 0x2b, 0x13, 0x2a, 0xba, 0xe6, 0x60, 0x18, 0x7b, 0x55, 0x46, 0x84, + 0xc2, 0x1f, 0xc6, 0x67, 0xd4, 0x7d, 0x48, 0x88, 0x85, 0x7d, 0xf7, 0x21, 0xe3, 0x7f, 0x1a, 0x81, + 0xe9, 0xd8, 0xb4, 0x10, 0xf7, 0xd4, 0x4c, 0xe2, 0x9e, 0x5a, 0x03, 0xe0, 0xaa, 0xde, 0x01, 0x75, + 0xb2, 0xd2, 0xa9, 0x70, 0x5c, 0xb8, 0x04, 0x87, 0x6b, 0x4a, 0x61, 0xc3, 0x98, 0xf2, 0x15, 0x3b, + 0xa0, 0x8e, 0x3c, 0x64, 0xca, 0x17, 0xbd, 0xc2, 0x34, 0x62, 0x43, 0x8a, 0x30, 0x8c, 0xb1, 0x60, + 0x55, 0x9f, 0x4e, 0x87, 0x01, 0x4c, 0x0e, 0x27, 0x2f, 0xc1, 0x08, 0x13, 0xa2, 0xaa, 0x15, 0xb1, + 0x09, 0xe2, 0xd9, 0xc2, 0xa4, 0x2c, 0x26, 0xb1, 0x88, 0x22, 0x72, 0x0b, 0x26, 0xf8, 0x5f, 0x22, + 0x64, 0xcc, 0x88, 0x6e, 0xcd, 0x68, 0x39, 0x0d, 0x19, 0x35, 0x46, 0xc3, 0x63, 0xb7, 0x8b, 0x5a, + 0x17, 0xd5, 0x3a, 0xd5, 0x8a, 0x08, 0x1e, 0x8e, 0xb7, 0x0b, 0x9f, 0x03, 0x59, 0x15, 0x11, 0x02, + 0x93, 0x65, 0x84, 0x67, 0x45, 0x1e, 0xef, 0x94, 0x28, 0xcb, 0x70, 0x8f, 0x0a, 0x53, 0x94, 0x90, + 0xab, 0xfc, 0x69, 0x05, 0xc5, 0x42, 0x9e, 0x83, 0x11, 0xdf, 0x2d, 0x50, 0x31, 0x81, 0xb2, 0x61, + 0x58, 0xcc, 0x2a, 0x67, 0x7f, 0x2f, 0xb7, 0x6c, 0xa7, 0x29, 0xb6, 0x15, 0xac, 0x1c, 0x71, 0x29, + 0x83, 0x9a, 0x11, 0x02, 0x79, 0x17, 0xa6, 0xd8, 0x8f, 0xb2, 0xdb, 0x6a, 0xb9, 0x6d, 0x64, 0x3f, + 0x1e, 0x05, 0x85, 0x43, 0x92, 0x3a, 0x16, 0xf1, 0x5a, 0x62, 0xb8, 0xec, 0x3c, 0xc1, 0x67, 0xdb, + 0x2e, 0x7f, 0xf4, 0x99, 0x88, 0xce, 0x13, 0x24, 0xf5, 0x39, 0xdc, 0x54, 0x91, 0xc8, 0xdb, 0x30, + 0xc9, 0x7e, 0xde, 0x71, 0x1e, 0x52, 0x5e, 0xe1, 0x64, 0x64, 0xaf, 0x80, 0x54, 0x7b, 0xac, 0x84, + 0xd7, 0xa7, 0x63, 0x92, 0x2f, 0xc1, 0x19, 0xe4, 0x54, 0x77, 0x3b, 0xb4, 0x51, 0xda, 0xdd, 0x75, + 0x9a, 0x0e, 0x37, 0x2f, 0xe3, 0xc1, 0x51, 0x50, 0x07, 0xcf, 0x2b, 0x46, 0x0c, 0xcb, 0x8e, 0x50, + 0xcc, 0x74, 0x4a, 0xb2, 0x0d, 0x85, 0x72, 0xd7, 0x0f, 0xdc, 0x56, 0x29, 0x08, 0x3c, 0x67, 0xa7, + 0x1b, 0x50, 0x7f, 0x7e, 0x5a, 0x0b, 0x21, 0xc2, 0x16, 0x47, 0x58, 0xc8, 0xf5, 0x41, 0x75, 0xa4, + 0xb0, 0xec, 0x90, 0xc4, 0x4c, 0x30, 0x31, 0xfe, 0x59, 0x06, 0x26, 0x35, 0x52, 0xf2, 0x16, 0x4c, + 0xdc, 0xf6, 0x1c, 0xda, 0x6e, 0x34, 0x0f, 0x95, 0x8b, 0x2a, 0xde, 0x62, 0x76, 0x05, 0x9c, 0xb7, + 0x5a, 0x43, 0x0b, 0xf5, 0x3c, 0xd9, 0x54, 0xdb, 0xcf, 0xeb, 0xdc, 0xb5, 0x58, 0x4c, 0xd0, 0x5c, + 0x14, 0xd3, 0x08, 0x27, 0xa8, 0x98, 0x9d, 0x0a, 0x0a, 0x79, 0x0f, 0x46, 0xf8, 0x03, 0xaf, 0x30, + 0x44, 0x3c, 0x9f, 0xd6, 0x4c, 0xee, 0xc6, 0x8e, 0x13, 0x11, 0xad, 0x78, 0x7c, 0x53, 0x10, 0x19, + 0x3f, 0x9b, 0x01, 0x92, 0x44, 0x3d, 0x41, 0xef, 0x75, 0xa2, 0x75, 0xd0, 0x17, 0xc3, 0xd5, 0x98, + 0xd3, 0x74, 0xe6, 0xac, 0x26, 0x5e, 0xc0, 0x3b, 0x5e, 0xac, 0x3a, 0x55, 0x11, 0xc7, 0x8b, 0x8d, + 0x1f, 0xca, 0x02, 0x44, 0xd8, 0xe4, 0xf3, 0x3c, 0xe5, 0xd6, 0x97, 0xba, 0x76, 0xd3, 0xd9, 0x75, + 0xf4, 0x18, 0xb4, 0xc8, 0xe4, 0x9b, 0xb2, 0xc4, 0xd4, 0x11, 0xc9, 0x07, 0x30, 0x5d, 0xdb, 0xd0, + 0x69, 0x15, 0x3b, 0x77, 0xbf, 0x63, 0xc5, 0xc8, 0xe3, 0xd8, 0x68, 0x70, 0xac, 0x8e, 0x06, 0x37, + 0x38, 0xe6, 0x03, 0x21, 0x4a, 0xd8, 0xc6, 0x52, 0xdb, 0x10, 0xa6, 0xfc, 0x8d, 0x6a, 0x45, 0xec, + 0x52, 0xf8, 0x75, 0x7e, 0xc7, 0xea, 0x08, 0x1b, 0x7f, 0xb6, 0x4f, 0x68, 0x78, 0x51, 0x47, 0x0e, + 0xf7, 0x70, 0x55, 0xff, 0x39, 0x54, 0xfb, 0xb5, 0xdc, 0x80, 0x0a, 0x6d, 0xc7, 0x33, 0x7b, 0xef, + 0x89, 0xac, 0x03, 0x86, 0x35, 0x0f, 0x5c, 0xad, 0x75, 0xc2, 0x02, 0xe6, 0x66, 0x74, 0x49, 0xe1, + 0x76, 0x02, 0x29, 0x46, 0x33, 0xff, 0x20, 0x03, 0x67, 0x52, 0x69, 0xc9, 0x35, 0x80, 0x48, 0xa7, + 0x24, 0x7a, 0x09, 0x77, 0xcc, 0x28, 0x92, 0x8f, 0xa9, 0x60, 0x90, 0xaf, 0xc6, 0xb5, 0x41, 0x27, + 0x1f, 0x84, 0x0b, 0x32, 0x80, 0x9e, 0xae, 0x0d, 0x4a, 0xd1, 0x01, 0x19, 0xbf, 0x92, 0x83, 0x19, + 0x25, 0x50, 0x10, 0xff, 0xd6, 0x13, 0x0c, 0xc0, 0x0f, 0x60, 0x82, 0xb5, 0xc6, 0xa9, 0x0b, 0x37, + 0x40, 0x6e, 0xc9, 0xf2, 0x5a, 0xc2, 0x87, 0x52, 0x70, 0xbb, 0xa6, 0x22, 0xf3, 0xb0, 0x96, 0xb8, + 0x75, 0xe2, 0x83, 0x44, 0x3d, 0xe9, 0x0e, 0xa8, 0x31, 0x27, 0x3e, 0x4c, 0x56, 0x0e, 0xdb, 0x76, + 0x2b, 0xac, 0x8d, 0x5b, 0xb4, 0xbc, 0xde, 0xb3, 0x36, 0x0d, 0x9b, 0x57, 0x17, 0x79, 0x1b, 0xf1, + 0xb2, 0x14, 0x47, 0x77, 0x8d, 0x6a, 0xe1, 0x03, 0x98, 0x49, 0x7c, 0xf4, 0xa9, 0x22, 0x6c, 0x6e, + 0x03, 0x49, 0x7e, 0x47, 0x0a, 0x87, 0xd7, 0xf5, 0xf8, 0xad, 0x67, 0xc2, 0xc7, 0xeb, 0x56, 0xcb, + 0x6e, 0x37, 0xb8, 0x7d, 0xcc, 0xa2, 0x1a, 0x7f, 0xf3, 0xe7, 0xb2, 0xaa, 0x1f, 0xeb, 0xb3, 0xbe, + 0xea, 0xbe, 0xa8, 0xdd, 0x86, 0x2f, 0xf6, 0x1a, 0xd3, 0x81, 0xb4, 0x0e, 0xdf, 0xc9, 0xc1, 0xb9, + 0x1e, 0x94, 0xe4, 0x30, 0x3e, 0x89, 0xb8, 0x16, 0xe2, 0x46, 0xff, 0x0a, 0x9f, 0xc6, 0x54, 0x22, + 0x9f, 0xe7, 0x91, 0x2c, 0xea, 0x98, 0xf8, 0x5e, 0xdc, 0xbf, 0x51, 0x8d, 0x7f, 0x10, 0x42, 0xe3, + 0x21, 0x2c, 0x38, 0x94, 0x7c, 0x00, 0xc3, 0xe8, 0xc4, 0x1c, 0x0b, 0x55, 0xc8, 0x30, 0x10, 0xae, + 0x04, 0xdb, 0x64, 0x3f, 0xb5, 0x60, 0x9b, 0x0c, 0x40, 0x3e, 0x07, 0xb9, 0xd2, 0x76, 0x4d, 0x8c, + 0xcb, 0x94, 0x4a, 0xbe, 0x5d, 0x8b, 0x12, 0x85, 0xd8, 0x5a, 0x46, 0x0f, 0x46, 0xc1, 0x08, 0xef, + 0x94, 0x37, 0xc4, 0xa8, 0xa8, 0x84, 0x77, 0xca, 0x1b, 0x11, 0xe1, 0x5e, 0x5d, 0x0b, 0xfc, 0x74, + 0xa7, 0xbc, 0xf1, 0xc9, 0x4d, 0xfb, 0x7f, 0x27, 0xcb, 0xc3, 0x6f, 0xf0, 0x86, 0x7d, 0x00, 0x13, + 0x5a, 0x7c, 0xed, 0x4c, 0x24, 0x8f, 0x85, 0xb1, 0xd0, 0x63, 0x26, 0x40, 0x1a, 0x81, 0x4c, 0xb9, + 0xc3, 0x7e, 0xa3, 0xc4, 0xab, 0x1a, 0xdb, 0x84, 0x1c, 0x50, 0x26, 0x8e, 0xa7, 0xdc, 0x09, 0x49, + 0xc8, 0x4d, 0xc8, 0x6f, 0xd2, 0xb6, 0xdd, 0x0e, 0x42, 0x85, 0x28, 0x5a, 0x0b, 0x07, 0x08, 0xd3, + 0xa5, 0x86, 0x10, 0x11, 0x2d, 0x5b, 0xbb, 0x3b, 0x7e, 0xdd, 0x73, 0x30, 0x4c, 0x4f, 0x78, 0x16, + 0x73, 0xcb, 0x56, 0xa5, 0x44, 0x67, 0x10, 0x23, 0x32, 0x7e, 0x2e, 0x03, 0xa3, 0x62, 0x20, 0x79, + 0xaa, 0xb4, 0xbd, 0xe8, 0x2c, 0x11, 0xde, 0x00, 0x7b, 0x4e, 0xdc, 0x1b, 0x60, 0x8f, 0xc7, 0xc2, + 0x19, 0x13, 0x9e, 0x72, 0xe1, 0xd3, 0x20, 0xce, 0x46, 0xe9, 0xc2, 0xa8, 0x67, 0xc2, 0x0a, 0x51, + 0x07, 0xf5, 0xb0, 0x32, 0xfe, 0x9e, 0xf8, 0xb2, 0x3b, 0xe5, 0x0d, 0xb2, 0x08, 0xf9, 0x55, 0x97, + 0x87, 0x75, 0x52, 0xf3, 0xde, 0x36, 0x05, 0x4c, 0xed, 0x20, 0x89, 0xc7, 0xbe, 0x6f, 0xc3, 0x73, + 0xc5, 0x5d, 0x46, 0xf9, 0xbe, 0x0e, 0x07, 0xc6, 0xbe, 0x2f, 0x44, 0x1d, 0xf8, 0xfb, 0x68, 0xca, + 0x26, 0xf1, 0xe0, 0x26, 0xe6, 0x22, 0xb9, 0xab, 0x7a, 0xae, 0x89, 0x22, 0xb9, 0x53, 0x2c, 0xf4, + 0xda, 0x29, 0x1e, 0xdc, 0x34, 0x53, 0xa8, 0xf0, 0x5d, 0x2d, 0x02, 0xd7, 0xa8, 0xf7, 0xf0, 0x19, + 0xde, 0xa5, 0xd3, 0xdf, 0xd5, 0xe2, 0xcd, 0x1b, 0x68, 0x93, 0xfe, 0x83, 0x2c, 0x9c, 0x4d, 0x27, + 0x54, 0xdb, 0x92, 0xe9, 0xd3, 0x96, 0x2b, 0x90, 0x5f, 0x71, 0xfd, 0x40, 0xb1, 0xfa, 0x43, 0xf5, + 0xff, 0xbe, 0x80, 0x99, 0x61, 0x29, 0xbb, 0x73, 0xb3, 0xbf, 0xc3, 0xe5, 0x89, 0xfc, 0x30, 0xe8, + 0x04, 0xbb, 0x73, 0xf3, 0x22, 0x72, 0x07, 0xf2, 0xa6, 0xf0, 0x9c, 0x8a, 0x75, 0x8d, 0x04, 0x87, + 0xd2, 0x14, 0xf1, 0x04, 0x44, 0x0b, 0x73, 0x2e, 0x60, 0xa4, 0x04, 0xa3, 0x62, 0xf4, 0x63, 0x4f, + 0xc7, 0x29, 0x53, 0x46, 0xcf, 0x3c, 0x20, 0xe9, 0xd8, 0x8e, 0x82, 0x8f, 0x80, 0xd5, 0x8a, 0x74, + 0x82, 0xc2, 0x1d, 0x85, 0x3f, 0x12, 0xea, 0x06, 0x96, 0x21, 0xa2, 0xf1, 0xc3, 0x59, 0x00, 0xa9, + 0xb5, 0x79, 0x66, 0x67, 0xd8, 0xe7, 0xb4, 0x19, 0xa6, 0xd8, 0x1b, 0x0d, 0x9e, 0xda, 0xf7, 0x3e, + 0x9a, 0xf3, 0x0c, 0x9e, 0xd8, 0xb7, 0x08, 0xc3, 0x9b, 0x91, 0x42, 0x4b, 0xf8, 0x98, 0xa0, 0x3a, + 0x9a, 0xc3, 0x8d, 0x1d, 0x98, 0xbb, 0x43, 0x83, 0x48, 0xbd, 0x25, 0x9f, 0x1e, 0xfb, 0xb3, 0x7d, + 0x03, 0xc6, 0x04, 0x7e, 0xb8, 0x7f, 0x71, 0x5d, 0x8c, 0x88, 0xe3, 0x82, 0xba, 0x18, 0x89, 0xc0, + 0x76, 0xa3, 0x0a, 0x6d, 0xd2, 0x80, 0x7e, 0xb2, 0xd5, 0xd4, 0x80, 0xf0, 0xa6, 0x60, 0xcb, 0x06, + 0xab, 0xe1, 0xc4, 0xfe, 0x79, 0x00, 0x67, 0xc2, 0x6f, 0x7f, 0x9a, 0x7c, 0xaf, 0xb3, 0x2b, 0xa5, + 0x08, 0xda, 0x1f, 0x71, 0xec, 0x63, 0x7b, 0xf2, 0x18, 0x16, 0x24, 0xc1, 0xb6, 0x13, 0x1a, 0x4e, + 0x0e, 0x44, 0x4b, 0xde, 0x85, 0x71, 0x85, 0x46, 0x04, 0x9d, 0x47, 0x35, 0xf5, 0x23, 0x27, 0xd8, + 0xb7, 0x7c, 0x0e, 0x57, 0xd5, 0xd4, 0x0a, 0xba, 0xf1, 0x15, 0x78, 0x3e, 0xf4, 0x03, 0x4a, 0xa9, + 0x3a, 0xc6, 0x3c, 0x73, 0x3a, 0xe6, 0xeb, 0x51, 0xb3, 0xaa, 0xed, 0xd0, 0xd5, 0x59, 0xf2, 0x26, + 0x6a, 0xb3, 0x44, 0x63, 0x5e, 0x48, 0x38, 0x4f, 0x2b, 0x3e, 0xd2, 0xc6, 0x3b, 0xca, 0xc7, 0xa6, + 0x30, 0xd4, 0x88, 0x33, 0x71, 0xe2, 0x1f, 0xce, 0xc2, 0xf4, 0xfd, 0x6a, 0xa5, 0x1c, 0x5a, 0x1f, + 0x7d, 0xca, 0x12, 0x0f, 0x6b, 0x6d, 0xeb, 0xbd, 0xdf, 0x18, 0x5b, 0x30, 0x1b, 0xeb, 0x06, 0x14, + 0x1d, 0xde, 0xe7, 0x1e, 0x24, 0x21, 0x58, 0x8a, 0x0d, 0x67, 0xd3, 0xd8, 0x3f, 0xb8, 0x69, 0xc6, + 0xb0, 0x8d, 0xff, 0x12, 0x62, 0x7c, 0xc5, 0x16, 0xf6, 0x06, 0x8c, 0x55, 0x7d, 0xbf, 0x4b, 0xbd, + 0x2d, 0x73, 0x55, 0x55, 0x15, 0x38, 0x08, 0xb4, 0xba, 0x5e, 0xd3, 0x8c, 0x10, 0xc8, 0x55, 0xc8, + 0x8b, 0x80, 0xdf, 0x72, 0x4f, 0x40, 0xad, 0x6d, 0x18, 0x2f, 0xdc, 0x0c, 0x8b, 0xc9, 0x5b, 0x30, + 0xc1, 0xff, 0xe6, 0xb3, 0x4d, 0x74, 0x38, 0x2a, 0x07, 0x05, 0x3a, 0x9f, 0x9d, 0xa6, 0x86, 0x46, + 0x5e, 0x83, 0x5c, 0xa9, 0x6c, 0x0a, 0x75, 0x90, 0x90, 0x1b, 0x3d, 0x8b, 0xeb, 0xec, 0xb4, 0x4b, + 0x44, 0xd9, 0x64, 0xd2, 0x9f, 0x8c, 0x1e, 0x21, 0x34, 0xd9, 0x38, 0x03, 0xa4, 0xb6, 0x29, 0x76, + 0x98, 0x21, 0x8c, 0x5c, 0x87, 0xd1, 0x0a, 0x37, 0x99, 0x13, 0x7a, 0x6c, 0x9e, 0x55, 0x8f, 0x83, + 0xb4, 0x68, 0x09, 0x1c, 0x44, 0xae, 0xca, 0x6c, 0x63, 0xf9, 0xc8, 0x11, 0xa5, 0x47, 0x4a, 0xb1, + 0x37, 0x60, 0x44, 0x84, 0xc5, 0x1e, 0x53, 0xf2, 0x90, 0xc4, 0xc3, 0x61, 0x0b, 0x9c, 0xa4, 0x47, + 0x2a, 0x3c, 0x4d, 0x8f, 0xd4, 0x1d, 0x38, 0x77, 0x07, 0xb5, 0x37, 0x7a, 0x70, 0xa7, 0x2d, 0xb3, + 0x2a, 0xf4, 0xe1, 0xf8, 0x0c, 0xc4, 0x15, 0x3c, 0xf1, 0xf8, 0x50, 0x56, 0xd7, 0x53, 0x93, 0xc4, + 0xf6, 0x62, 0x44, 0xbe, 0x0c, 0x73, 0x69, 0x45, 0x42, 0x6b, 0x8e, 0x61, 0x8c, 0xd2, 0x2b, 0x50, + 0xc3, 0x18, 0xa5, 0x71, 0x20, 0xab, 0x50, 0xe0, 0xf0, 0x52, 0xa3, 0xe5, 0xb4, 0xb9, 0xe6, 0x9f, + 0x6b, 0xd5, 0xd1, 0x33, 0x44, 0x70, 0xb5, 0x59, 0x21, 0x7f, 0x01, 0xd0, 0x7c, 0x89, 0x62, 0x94, + 0xe4, 0xa7, 0x32, 0xec, 0x36, 0xc7, 0x83, 0x48, 0x6f, 0x99, 0xab, 0xbe, 0x08, 0x81, 0x77, 0x36, + 0x72, 0x13, 0xaa, 0x05, 0x9e, 0xd3, 0xde, 0x13, 0x7e, 0x42, 0x9b, 0xc2, 0x4f, 0xe8, 0xdd, 0x8f, + 0xe5, 0x27, 0xc4, 0x59, 0xf9, 0xc7, 0x47, 0xc5, 0x09, 0x4f, 0xd4, 0x89, 0xab, 0x48, 0xfb, 0x02, + 0xd6, 0x75, 0xe8, 0x2c, 0xbb, 0xd5, 0xe6, 0x21, 0x6c, 0x69, 0x83, 0x37, 0x72, 0x1a, 0x77, 0x70, + 0xec, 0x3a, 0xcc, 0x6f, 0x61, 0x75, 0x43, 0x84, 0x44, 0x43, 0x53, 0x39, 0xb0, 0x8b, 0xa7, 0xf4, + 0x45, 0xe1, 0xee, 0xb5, 0x85, 0xe8, 0xe2, 0x29, 0x1d, 0x57, 0x2c, 0x9c, 0x46, 0xea, 0xe4, 0xd1, + 0x48, 0xc8, 0x75, 0x18, 0x59, 0xb3, 0x1f, 0x97, 0xf6, 0xa8, 0xc8, 0x22, 0x39, 0x29, 0xb7, 0x3f, + 0x04, 0x2e, 0xe5, 0xff, 0x90, 0xfb, 0x3a, 0x3c, 0x67, 0x0a, 0x34, 0xf2, 0x7d, 0x19, 0x38, 0xcb, + 0x97, 0xb1, 0x6c, 0x65, 0x8d, 0x06, 0x01, 0xeb, 0x07, 0x11, 0x0b, 0xef, 0x52, 0x64, 0xb0, 0x9d, + 0x8e, 0x87, 0xae, 0xf4, 0x86, 0xd8, 0x19, 0xc2, 0x8e, 0xf3, 0x45, 0xa9, 0x16, 0x54, 0x38, 0x95, + 0x9e, 0x6c, 0xc2, 0xf8, 0xda, 0xed, 0x52, 0x58, 0x2d, 0x8f, 0x34, 0x5e, 0x4c, 0xdb, 0x1d, 0x15, + 0xb4, 0x34, 0x4f, 0x03, 0x95, 0x8d, 0xf0, 0x0e, 0xf8, 0x9c, 0xec, 0x0f, 0xf2, 0xa6, 0xea, 0x5b, + 0x9a, 0x43, 0xe9, 0x79, 0xb4, 0x65, 0x3f, 0xb6, 0xec, 0x3d, 0xaa, 0xbd, 0x92, 0x0b, 0xed, 0xf5, + 0xcf, 0x64, 0xe0, 0x7c, 0xcf, 0x26, 0x93, 0x5b, 0x70, 0xce, 0xe6, 0x1e, 0xd3, 0xd6, 0x7e, 0x10, + 0x74, 0x7c, 0x4b, 0x5e, 0x31, 0x84, 0x37, 0xaa, 0x79, 0x46, 0x14, 0xaf, 0xb0, 0x52, 0x79, 0xeb, + 0xf0, 0xc9, 0x07, 0xf0, 0x82, 0xd3, 0xf6, 0x69, 0xbd, 0xeb, 0x51, 0x4b, 0x32, 0xa8, 0x3b, 0x0d, + 0xcf, 0xf2, 0xec, 0xf6, 0x9e, 0x74, 0xad, 0x35, 0xcf, 0x4b, 0x1c, 0xe1, 0x95, 0x5d, 0x76, 0x1a, + 0x9e, 0x89, 0x08, 0xc6, 0x3f, 0xcb, 0xc0, 0x7c, 0xaf, 0x2e, 0x21, 0xf3, 0x30, 0x4a, 0x95, 0x9c, + 0x23, 0x79, 0x53, 0xfe, 0x24, 0xcf, 0x43, 0xb4, 0xd3, 0x8b, 0xd3, 0x3f, 0x5f, 0x17, 0xf9, 0x1f, + 0xd0, 0xb4, 0x5d, 0xdd, 0xd7, 0x85, 0x81, 0xf2, 0x44, 0x5d, 0xdd, 0xdd, 0x2f, 0x00, 0x44, 0xdb, + 0x39, 0x57, 0x4c, 0x98, 0x63, 0x76, 0xdd, 0xe3, 0x2b, 0x8f, 0x9c, 0x85, 0x11, 0xbe, 0x5d, 0x0a, + 0xff, 0x07, 0xf1, 0x8b, 0x9d, 0xdb, 0xa2, 0x93, 0x71, 0x9f, 0xcf, 0x2d, 0x4d, 0x68, 0x9d, 0x3d, + 0xd2, 0xc2, 0xc1, 0x31, 0x7e, 0x7a, 0x92, 0x8b, 0x10, 0xa5, 0x6e, 0xb0, 0x2f, 0x85, 0x8e, 0xc5, + 0x34, 0x07, 0x30, 0x6e, 0x4b, 0xa9, 0xd8, 0x65, 0xeb, 0x6e, 0x5f, 0xf2, 0xed, 0x27, 0x9b, 0xfa, + 0xf6, 0xf3, 0x06, 0x8c, 0x95, 0xf7, 0x69, 0xfd, 0x20, 0x74, 0xc2, 0xc9, 0x0b, 0xe5, 0x3a, 0x03, + 0xf2, 0xf0, 0xde, 0x11, 0x02, 0xb9, 0x0e, 0x80, 0x7e, 0xa7, 0x5c, 0x22, 0x55, 0x52, 0x74, 0xa0, + 0x9b, 0xaa, 0x30, 0x4f, 0x51, 0x50, 0x90, 0x7d, 0xcd, 0xbc, 0xad, 0xda, 0xb3, 0x70, 0xf6, 0xbe, + 0xb7, 0x2b, 0xd0, 0x23, 0x04, 0xd6, 0x3c, 0x65, 0x5f, 0x11, 0xa7, 0x60, 0x21, 0xb1, 0xf9, 0xa8, + 0x48, 0xe4, 0x1a, 0x8c, 0x6d, 0x48, 0x47, 0x02, 0x3c, 0x04, 0x27, 0x90, 0x02, 0x22, 0xa7, 0x83, + 0xf9, 0x8c, 0x19, 0xa1, 0x90, 0xcf, 0xc1, 0x68, 0x99, 0x7a, 0xc1, 0xe6, 0xe6, 0x2a, 0x1a, 0x9d, + 0xf0, 0x4c, 0x16, 0x79, 0xcc, 0x3a, 0x10, 0x04, 0xcd, 0xef, 0x1e, 0x15, 0x27, 0x03, 0xa7, 0x45, + 0xc3, 0x08, 0xdd, 0xa6, 0xc4, 0x26, 0x4b, 0x50, 0xe0, 0xcf, 0xe2, 0xd1, 0xdd, 0x03, 0x4f, 0xc6, + 0x3c, 0x3f, 0xa7, 0xc5, 0x1b, 0xfa, 0x23, 0xba, 0x13, 0xe6, 0x5c, 0x48, 0xe0, 0x93, 0x65, 0x99, + 0xaa, 0x44, 0x6d, 0x26, 0x44, 0xca, 0xb0, 0xf8, 0x8e, 0xc1, 0x5a, 0x9b, 0xa4, 0x20, 0x25, 0x98, + 0x2c, 0xbb, 0xad, 0x8e, 0x1d, 0x38, 0x98, 0xd3, 0xf1, 0x50, 0x1c, 0x82, 0xa8, 0xd0, 0xab, 0xab, + 0x05, 0xda, 0x89, 0xaa, 0x16, 0x90, 0xdb, 0x30, 0x65, 0xba, 0x5d, 0x36, 0x4c, 0xf2, 0x16, 0xce, + 0xcf, 0x39, 0x34, 0x0d, 0xf1, 0x58, 0x09, 0x3b, 0x96, 0xc5, 0x95, 0x5b, 0x8b, 0x66, 0xaa, 0x51, + 0x91, 0xf5, 0x94, 0xe7, 0x10, 0xf5, 0x70, 0x53, 0x33, 0x2f, 0x24, 0x98, 0xa5, 0xbc, 0xa4, 0xdc, + 0x84, 0xf1, 0x5a, 0xed, 0xfe, 0x26, 0xf5, 0x83, 0xdb, 0x4d, 0xf7, 0x11, 0x9e, 0x6d, 0x79, 0x91, + 0x28, 0xcc, 0x77, 0xad, 0x80, 0xfa, 0x81, 0xb5, 0xdb, 0x74, 0x1f, 0x99, 0x2a, 0x16, 0xf9, 0x3a, + 0xeb, 0x0f, 0x45, 0x12, 0x14, 0x71, 0x5b, 0xfb, 0x09, 0xab, 0x78, 0x82, 0x44, 0x8b, 0x86, 0x89, + 0xac, 0x7a, 0x67, 0x29, 0xe8, 0xe8, 0x53, 0xe6, 0xb9, 0x8f, 0x0f, 0x4b, 0x8d, 0x86, 0x47, 0x7d, + 0x5f, 0x1c, 0x42, 0xdc, 0xa7, 0x0c, 0x95, 0x0d, 0x36, 0x2f, 0xd0, 0x7c, 0xca, 0x14, 0x02, 0xf2, + 0xa3, 0x19, 0x38, 0xa3, 0x7a, 0x9b, 0xe0, 0x72, 0x41, 0x33, 0x17, 0x7e, 0x24, 0xbd, 0x79, 0x4d, + 0x1e, 0xc2, 0xd7, 0x14, 0xb4, 0x6b, 0x0f, 0x6f, 0x5c, 0x2b, 0x45, 0x3f, 0x6b, 0x92, 0x08, 0x63, + 0xd0, 0x15, 0x53, 0xf9, 0x69, 0x79, 0x76, 0xe6, 0xec, 0x14, 0x62, 0x52, 0x66, 0x92, 0x1a, 0x9b, + 0x51, 0x68, 0x38, 0x55, 0xdd, 0xc0, 0x33, 0x4d, 0x68, 0x54, 0xc5, 0xfc, 0xe3, 0x26, 0x56, 0x4e, + 0x47, 0x17, 0xc8, 0x14, 0x1a, 0x52, 0x85, 0x69, 0x0e, 0x60, 0xdb, 0x02, 0x4f, 0x59, 0x34, 0x1b, + 0x25, 0x4d, 0x10, 0x6c, 0xf0, 0xad, 0x1f, 0xd3, 0x16, 0xa9, 0x81, 0x46, 0x63, 0x74, 0xe4, 0x03, + 0x98, 0xc2, 0x78, 0xf0, 0xd1, 0x7a, 0x9d, 0xc3, 0x55, 0x8c, 0xf1, 0x52, 0x45, 0x49, 0xcc, 0xf3, + 0x6e, 0xc2, 0xf7, 0xf7, 0xa3, 0x15, 0xfd, 0x01, 0x4c, 0xa1, 0xad, 0x4e, 0xc4, 0xe0, 0x4c, 0xc4, + 0x40, 0x94, 0xc4, 0x19, 0x04, 0x4d, 0x3f, 0x62, 0xf0, 0xb7, 0x32, 0x70, 0x9e, 0x55, 0x94, 0x3e, + 0x42, 0x67, 0x3f, 0xce, 0x08, 0x61, 0x04, 0xc9, 0x9e, 0x3c, 0x55, 0x71, 0xd4, 0xf7, 0xf7, 0xd3, + 0x38, 0xe0, 0x47, 0xb1, 0x8f, 0x4f, 0xff, 0xa8, 0x73, 0x1f, 0xfb, 0xa3, 0x7a, 0xf2, 0x54, 0x3f, + 0x2a, 0x68, 0xfa, 0x69, 0x1c, 0xf0, 0x5a, 0x5b, 0x2b, 0xad, 0xad, 0x46, 0x77, 0xb3, 0x4f, 0x97, + 0xdb, 0x8a, 0xd6, 0xb6, 0x3e, 0x6e, 0x2b, 0x5b, 0xdc, 0x2d, 0x5a, 0xe9, 0x06, 0x79, 0xad, 0xd5, + 0xc0, 0xf1, 0x6b, 0x6d, 0x8c, 0xc6, 0x8c, 0x61, 0x1b, 0xbf, 0x04, 0x31, 0xbe, 0xc2, 0x54, 0xd5, + 0x80, 0x11, 0x7e, 0x6b, 0x15, 0x9d, 0x8c, 0x36, 0x0b, 0xfc, 0x4e, 0x6b, 0x8a, 0x12, 0x72, 0x1e, + 0x72, 0xb5, 0xda, 0x7d, 0xd1, 0xc9, 0x68, 0xb0, 0xea, 0xfb, 0xae, 0xc9, 0x60, 0x6c, 0x84, 0xd0, + 0x0a, 0x55, 0x89, 0xaf, 0xcf, 0xce, 0x3b, 0x13, 0xa1, 0xac, 0xbf, 0xe5, 0x1d, 0x72, 0x28, 0xea, + 0x6f, 0x71, 0x87, 0x8c, 0x6e, 0x8e, 0x65, 0x98, 0x2f, 0xf9, 0x3e, 0xf5, 0xd8, 0x84, 0x10, 0xc6, + 0x8d, 0x9e, 0xb8, 0xe7, 0x88, 0x83, 0x1d, 0x2b, 0xb5, 0xeb, 0xbe, 0xd9, 0x13, 0x91, 0x5c, 0x81, + 0x7c, 0xa9, 0xdb, 0x70, 0x68, 0xbb, 0xae, 0xc5, 0x59, 0xb3, 0x05, 0xcc, 0x0c, 0x4b, 0xc9, 0x97, + 0xe0, 0x4c, 0x2c, 0xa4, 0xa2, 0xe8, 0x81, 0xd1, 0x68, 0xef, 0x95, 0xf7, 0xb0, 0xc8, 0x20, 0x83, + 0x77, 0x49, 0x3a, 0x25, 0x29, 0x41, 0x61, 0x19, 0xdd, 0xb4, 0x2a, 0x94, 0xbf, 0x0d, 0xb9, 0x1e, + 0xf7, 0xcf, 0xe3, 0xb7, 0x66, 0xee, 0xc2, 0x65, 0x35, 0xc2, 0x42, 0x33, 0x81, 0x4e, 0xee, 0xc1, + 0x6c, 0x1c, 0xc6, 0x4e, 0x70, 0x7e, 0x41, 0xc6, 0xfd, 0x26, 0xc1, 0x05, 0xcf, 0xf0, 0x34, 0x2a, + 0xb2, 0x03, 0x33, 0x91, 0x41, 0x92, 0x7e, 0x6d, 0x96, 0x76, 0xce, 0x61, 0xb9, 0xbc, 0x3a, 0x3f, + 0x2f, 0x26, 0xe3, 0x6c, 0x64, 0xdc, 0x14, 0x5e, 0x9f, 0xcd, 0x24, 0x3b, 0xd2, 0x80, 0xa9, 0x9a, + 0xb3, 0xd7, 0x76, 0xda, 0x7b, 0xf7, 0xe8, 0xe1, 0x86, 0xed, 0x78, 0xc2, 0xe2, 0x54, 0xda, 0x93, + 0x97, 0xfc, 0xc3, 0x56, 0x8b, 0x06, 0x1e, 0x6e, 0x84, 0xac, 0x1c, 0x7d, 0xd0, 0xd9, 0x75, 0x68, + 0xc1, 0xe7, 0x74, 0xe8, 0xb6, 0xd9, 0xb1, 0x1d, 0x4d, 0x08, 0xd0, 0x79, 0x6a, 0xaa, 0x8b, 0x89, + 0x01, 0x55, 0x17, 0x4d, 0x98, 0x59, 0x6e, 0xd7, 0xbd, 0x43, 0x7c, 0xa2, 0x93, 0x1f, 0x37, 0x79, + 0xc2, 0xc7, 0xbd, 0x2c, 0x3e, 0xee, 0x05, 0x5b, 0xce, 0xb0, 0xb4, 0xcf, 0x4b, 0x32, 0x26, 0x35, + 0x98, 0xc1, 0x8b, 0x43, 0xb5, 0xb2, 0x51, 0x6d, 0x3b, 0x81, 0x63, 0x07, 0xb4, 0x21, 0x84, 0x8b, + 0x30, 0x2b, 0x09, 0xbf, 0xa2, 0x3a, 0x8d, 0x8e, 0xe5, 0x48, 0x14, 0x95, 0x69, 0x82, 0xbe, 0xdf, + 0x3d, 0x71, 0xfa, 0x2f, 0xe8, 0x9e, 0x58, 0x85, 0xe9, 0x78, 0x6c, 0x86, 0x42, 0x74, 0x0e, 0xfb, + 0x58, 0xc4, 0x8e, 0x73, 0xb7, 0x8b, 0xc2, 0xa4, 0x96, 0x08, 0x54, 0xa7, 0x8b, 0x5f, 0x39, 0x67, + 0xb4, 0x2b, 0xa7, 0xb6, 0x2b, 0x9d, 0xe2, 0xca, 0x49, 0x36, 0x00, 0x6e, 0xbb, 0x5e, 0x9d, 0x96, + 0xd0, 0x3f, 0x9a, 0x68, 0xb9, 0x9b, 0x18, 0xd3, 0xa8, 0x90, 0xaf, 0x9f, 0x5d, 0xf6, 0xdb, 0x8a, + 0xbb, 0xb9, 0x2b, 0x3c, 0x8c, 0x1f, 0xcb, 0xc2, 0x7c, 0xaf, 0xcf, 0xe9, 0x73, 0xdd, 0x7b, 0x1d, + 0x92, 0x2b, 0x5c, 0x5c, 0xfb, 0x0a, 0x34, 0xbe, 0xce, 0x17, 0x21, 0x7d, 0x21, 0x8b, 0x6b, 0xe0, + 0x6c, 0x9c, 0x60, 0xcb, 0x6b, 0x92, 0x5b, 0x30, 0xae, 0x7c, 0x3c, 0xee, 0xa5, 0xbd, 0x9a, 0x6a, + 0xc2, 0x6e, 0xf8, 0x37, 0xbb, 0x26, 0xf2, 0x7d, 0x4b, 0x5e, 0x13, 0xf9, 0x2f, 0x52, 0xe0, 0x2e, + 0xe2, 0x23, 0xdc, 0x0a, 0xc0, 0xf7, 0x5d, 0x42, 0x00, 0xf7, 0x6d, 0xbe, 0x05, 0x9a, 0xf8, 0xb7, + 0xf1, 0x1b, 0x13, 0xfc, 0x44, 0x56, 0x6f, 0x89, 0xbd, 0xec, 0x83, 0x63, 0xb7, 0xc7, 0xec, 0x69, + 0x6e, 0x8f, 0xb9, 0x93, 0x6f, 0x8f, 0x43, 0x27, 0xdd, 0x1e, 0x63, 0xd7, 0xbb, 0xe1, 0x53, 0x5f, + 0xef, 0x46, 0x4e, 0x75, 0xbd, 0x1b, 0x3d, 0xd5, 0xf5, 0x4e, 0xbb, 0xa9, 0xe6, 0x4f, 0xba, 0xa9, + 0xfe, 0xd5, 0x65, 0xf0, 0x59, 0xbd, 0x0c, 0xa6, 0x89, 0x78, 0xa7, 0xba, 0x0c, 0xfe, 0x48, 0xcf, + 0xbb, 0x5c, 0xe1, 0xe3, 0x08, 0xe5, 0x2f, 0x0d, 0x70, 0x97, 0x1b, 0xf4, 0x26, 0x37, 0xf3, 0x74, + 0x6e, 0x72, 0xe4, 0xa9, 0xdd, 0xe4, 0x66, 0x9f, 0xf4, 0x26, 0x37, 0xf7, 0x34, 0x6f, 0x72, 0x67, + 0xfe, 0x32, 0xde, 0xe4, 0xce, 0xfe, 0x9b, 0xb9, 0xc9, 0xfd, 0x35, 0x28, 0xc4, 0x85, 0xcb, 0x93, + 0xc3, 0x18, 0x3f, 0xb5, 0x18, 0x92, 0x4c, 0xf4, 0x8d, 0x0b, 0x77, 0xe4, 0x3a, 0xc0, 0x86, 0xe7, + 0x3c, 0xb4, 0x03, 0x7a, 0x4f, 0x5a, 0xbf, 0x89, 0x10, 0xdc, 0x1c, 0xca, 0x46, 0xde, 0x54, 0x50, + 0xc2, 0x7b, 0x4d, 0x36, 0xed, 0x5e, 0x63, 0xfc, 0x68, 0x16, 0x66, 0x78, 0x20, 0xb6, 0x67, 0xff, + 0x11, 0xf6, 0x7d, 0xed, 0xb6, 0xfa, 0x42, 0x14, 0xef, 0x5e, 0x6d, 0x5d, 0x9f, 0x67, 0xd8, 0xaf, + 0xc1, 0x99, 0x44, 0x57, 0xe0, 0x8d, 0xb5, 0x22, 0x43, 0xe0, 0x25, 0xee, 0xac, 0xf3, 0xe9, 0x95, + 0x3c, 0xb8, 0x69, 0x26, 0x28, 0x8c, 0x3f, 0x1b, 0x4a, 0xf0, 0x17, 0x0f, 0xb2, 0xea, 0x13, 0x6b, + 0xe6, 0x74, 0x4f, 0xac, 0xd9, 0xc1, 0x9e, 0x58, 0x63, 0x42, 0x45, 0x6e, 0x10, 0xa1, 0xe2, 0x4b, + 0x30, 0xb9, 0x49, 0xed, 0x96, 0xbf, 0xe9, 0x8a, 0xe4, 0x49, 0xdc, 0xd7, 0x42, 0x46, 0xb8, 0x63, + 0x65, 0xf2, 0xc2, 0x15, 0xda, 0x8c, 0x06, 0x8c, 0x80, 0x1d, 0x83, 0x3c, 0x9b, 0x92, 0xa9, 0x73, + 0x50, 0x6f, 0xd1, 0xc3, 0x7d, 0x6e, 0xd1, 0x35, 0x98, 0x10, 0x74, 0x51, 0xec, 0xe6, 0xe8, 0xba, + 0xc7, 0x8a, 0x10, 0x2e, 0x6b, 0x0f, 0x33, 0xbb, 0x87, 0xb5, 0xf3, 0x9b, 0x9e, 0xc6, 0x84, 0x75, + 0xc1, 0x72, 0xbb, 0xd1, 0x71, 0x9d, 0x36, 0x76, 0xc1, 0x68, 0xd4, 0x05, 0x54, 0x80, 0x79, 0x17, + 0x28, 0x48, 0xe4, 0x5d, 0x98, 0x2a, 0x6d, 0x54, 0x55, 0xb2, 0x7c, 0xf4, 0xca, 0x6b, 0x77, 0x1c, + 0x4b, 0x23, 0x8d, 0xe1, 0xf6, 0xbb, 0xf9, 0x8c, 0xfd, 0xc5, 0xdc, 0x7c, 0x8c, 0x7f, 0x39, 0x21, + 0x97, 0xf7, 0x27, 0xfb, 0x40, 0xa2, 0x3f, 0x79, 0xe4, 0x4e, 0xf9, 0xe4, 0x31, 0x74, 0x92, 0x20, + 0xa9, 0xc9, 0xb7, 0xc3, 0xa7, 0x92, 0x6f, 0x47, 0x9e, 0xf8, 0xf9, 0x62, 0xf4, 0x94, 0x12, 0x6b, + 0x6c, 0xad, 0xe5, 0x07, 0x59, 0x6b, 0xa9, 0x52, 0xee, 0xd8, 0x93, 0x4b, 0xb9, 0x70, 0x6a, 0x29, + 0xb7, 0x16, 0xf9, 0x2e, 0x8f, 0x9f, 0xe8, 0x12, 0x72, 0x41, 0x68, 0x05, 0x66, 0xd2, 0xa3, 0xf0, + 0x85, 0x5e, 0xcc, 0x9f, 0x2a, 0xd1, 0xf9, 0x1b, 0xe9, 0xa2, 0x73, 0xff, 0xf3, 0xe6, 0x54, 0xc2, + 0xf3, 0x8f, 0x3e, 0x5d, 0xe1, 0xf9, 0xe9, 0x3e, 0x84, 0xfc, 0x95, 0xf8, 0xfc, 0x57, 0xe2, 0xf3, + 0x80, 0xe2, 0xb3, 0x87, 0xcb, 0x6b, 0xdb, 0xf6, 0xda, 0xa8, 0x76, 0xba, 0x0e, 0xa3, 0x32, 0x0c, + 0x69, 0x26, 0xd2, 0x28, 0x27, 0xe3, 0x8f, 0x4a, 0x2c, 0xb2, 0x08, 0x79, 0x49, 0xac, 0x26, 0xba, + 0x79, 0x24, 0x60, 0x5a, 0x84, 0x47, 0x01, 0x33, 0xfe, 0x83, 0x21, 0xb9, 0x85, 0xb3, 0x39, 0xb3, + 0x61, 0x7b, 0x76, 0x0b, 0xd3, 0xbf, 0x85, 0x2b, 0x4c, 0x11, 0xde, 0x63, 0x8b, 0x32, 0x66, 0xda, + 0xaf, 0x93, 0x7c, 0xac, 0xc0, 0xb0, 0x51, 0x86, 0xdd, 0xdc, 0x00, 0x19, 0x76, 0xdf, 0xd6, 0xd2, + 0xd3, 0x0e, 0x45, 0xf9, 0x10, 0xd9, 0xb6, 0xd6, 0x3f, 0x31, 0xed, 0x2d, 0x35, 0x8f, 0xec, 0x70, + 0x14, 0xd5, 0x0b, 0x29, 0xfb, 0x64, 0x90, 0x0d, 0x6f, 0x23, 0x23, 0xa7, 0x09, 0xb9, 0x3c, 0xfa, + 0x6f, 0x34, 0xe4, 0xf2, 0x32, 0x80, 0x38, 0x6a, 0x23, 0xf3, 0x84, 0x57, 0x70, 0xf5, 0x0b, 0x33, + 0xe5, 0x20, 0x68, 0xf6, 0xc8, 0xc9, 0xa1, 0x10, 0x1a, 0xbf, 0x4f, 0x60, 0xa6, 0x56, 0xbb, 0x5f, + 0x71, 0xec, 0xbd, 0xb6, 0xeb, 0x07, 0x4e, 0xbd, 0xda, 0xde, 0x75, 0x99, 0x28, 0x1e, 0x1e, 0x07, + 0x4a, 0x6c, 0xdd, 0xe8, 0x28, 0x08, 0x8b, 0xd9, 0x55, 0x6f, 0xd9, 0xf3, 0xa4, 0x7e, 0x94, 0x5f, + 0xf5, 0x28, 0x03, 0x98, 0x1c, 0xce, 0xa4, 0xdd, 0x5a, 0x17, 0x23, 0x5b, 0x08, 0x9b, 0x11, 0x94, + 0x76, 0x7d, 0x0e, 0x32, 0x65, 0x19, 0xa1, 0xc9, 0x09, 0x2b, 0x6e, 0x3f, 0xe7, 0xb4, 0xc0, 0xcd, + 0x51, 0x31, 0x3f, 0xec, 0x84, 0x30, 0x82, 0xdb, 0x66, 0x07, 0xe1, 0xaa, 0x45, 0x5c, 0x62, 0x0d, + 0x1c, 0xc2, 0x19, 0xcd, 0xe7, 0x79, 0xd0, 0xc7, 0x94, 0xd7, 0x84, 0x74, 0x6d, 0x60, 0x88, 0x8d, + 0x94, 0x17, 0x15, 0x35, 0x9f, 0x5b, 0x6a, 0x0d, 0xec, 0x3c, 0xbb, 0x90, 0x5a, 0x12, 0xae, 0xee, + 0x71, 0x2d, 0x78, 0xb6, 0xb2, 0x69, 0xf0, 0xcc, 0x75, 0xbd, 0xaa, 0xb6, 0x52, 0xb6, 0x82, 0xfe, + 0x35, 0x91, 0xdf, 0xcc, 0xc0, 0x39, 0x0d, 0x23, 0xdc, 0xae, 0xfc, 0x30, 0x1c, 0x48, 0xea, 0xbc, + 0xfe, 0xe8, 0xe9, 0xcc, 0xeb, 0x97, 0xf4, 0xb6, 0x44, 0x1b, 0xaa, 0xda, 0x86, 0x5e, 0x5f, 0x48, + 0x1e, 0xc2, 0x0c, 0x16, 0xc9, 0x87, 0x1d, 0x36, 0x67, 0xc5, 0x7b, 0xd0, 0x5c, 0xf4, 0xd9, 0xdc, + 0x8f, 0x1f, 0xb3, 0x8f, 0x2f, 0x7e, 0xe7, 0xa8, 0x38, 0xa9, 0xa1, 0xcb, 0x70, 0xd4, 0x56, 0xf4, + 0x3a, 0xe4, 0xb4, 0x77, 0x5d, 0x2d, 0xb5, 0x7c, 0xbc, 0x0a, 0xf2, 0x5f, 0x67, 0xf8, 0x73, 0x02, + 0x6f, 0xc6, 0x6d, 0xcf, 0x6d, 0x85, 0xe5, 0xd2, 0xb4, 0xb2, 0x47, 0xb7, 0x35, 0x9f, 0x4e, 0xb7, + 0xbd, 0x82, 0x9f, 0xcc, 0xf7, 0x04, 0x6b, 0xd7, 0x73, 0x5b, 0xd1, 0xe7, 0xab, 0x1d, 0xd7, 0xf3, + 0x23, 0xc9, 0xf7, 0x67, 0xe0, 0xbc, 0xa6, 0xd5, 0x54, 0x73, 0x83, 0x88, 0x68, 0x09, 0xb3, 0x61, + 0x1c, 0x95, 0xa8, 0x68, 0xe9, 0x9a, 0x98, 0xff, 0x97, 0xf1, 0x0b, 0x94, 0xb0, 0x9d, 0x0c, 0xc9, + 0x6a, 0x71, 0x2c, 0xe5, 0x13, 0x7a, 0xd7, 0x42, 0x1c, 0x98, 0x41, 0x2b, 0x1b, 0xcd, 0x04, 0x78, + 0xae, 0xb7, 0x09, 0x70, 0x98, 0xf5, 0x07, 0x33, 0x02, 0xf4, 0xb6, 0x03, 0x4e, 0x72, 0x25, 0x7f, + 0x1d, 0xce, 0x27, 0x80, 0xe1, 0x6a, 0x3b, 0xd3, 0x73, 0xb5, 0xbd, 0x7e, 0x7c, 0x54, 0x7c, 0x35, + 0xad, 0xb6, 0xb4, 0x95, 0xd6, 0xbb, 0x06, 0x62, 0x03, 0x44, 0x85, 0x42, 0xfc, 0x48, 0x9f, 0xa0, + 0xaf, 0x8b, 0xf9, 0xa1, 0xe0, 0xb3, 0xbd, 0x5c, 0xf9, 0x06, 0xf5, 0xc8, 0x8b, 0x90, 0x08, 0x85, + 0x09, 0x25, 0x1b, 0xc2, 0xa1, 0x30, 0xf6, 0xe8, 0x51, 0xc9, 0x77, 0x8e, 0x8a, 0x1a, 0x36, 0xbb, + 0x10, 0xa9, 0x69, 0x16, 0x34, 0x69, 0x4f, 0x45, 0x24, 0xbf, 0x9e, 0x81, 0x39, 0x06, 0x88, 0x26, + 0x95, 0x68, 0xd4, 0x7c, 0xbf, 0x59, 0xbf, 0xff, 0x74, 0x66, 0xfd, 0x8b, 0xf8, 0x8d, 0xea, 0xac, + 0x4f, 0x74, 0x49, 0xea, 0xc7, 0xe1, 0x6c, 0xd7, 0x0c, 0xba, 0xb4, 0xd9, 0x7e, 0x7e, 0x80, 0xd9, + 0xce, 0x07, 0xe0, 0xe4, 0xd9, 0xde, 0xb3, 0x16, 0xb2, 0x09, 0x13, 0xe2, 0x2e, 0xc4, 0x3b, 0xec, + 0xa2, 0x16, 0xc6, 0x59, 0x2d, 0xe2, 0x17, 0x54, 0x91, 0x2c, 0x22, 0xd1, 0x42, 0x8d, 0x0b, 0x69, + 0xc3, 0x2c, 0xff, 0xad, 0xeb, 0xa6, 0x8a, 0x3d, 0x75, 0x53, 0x57, 0x44, 0x8b, 0x2e, 0x09, 0xfe, + 0x31, 0x15, 0x95, 0x1a, 0x7e, 0x29, 0x85, 0x31, 0xe9, 0x00, 0xd1, 0xc0, 0x7c, 0xd1, 0x5e, 0xea, + 0xaf, 0x91, 0x7a, 0x55, 0xd4, 0x59, 0x8c, 0xd7, 0x19, 0x5f, 0xb9, 0x29, 0xbc, 0x89, 0x0d, 0xd3, + 0x02, 0xea, 0x1e, 0x50, 0xbe, 0xc3, 0xbf, 0xa8, 0x05, 0xc0, 0x8a, 0x95, 0xf2, 0x4b, 0x94, 0xac, + 0x09, 0x03, 0x94, 0xc5, 0x36, 0xf4, 0x38, 0x3f, 0x72, 0x1f, 0x66, 0x4a, 0x9d, 0x4e, 0xd3, 0xa1, + 0x0d, 0x6c, 0xa5, 0xd9, 0x65, 0x6d, 0x32, 0xa2, 0x7c, 0x6b, 0x36, 0x2f, 0x14, 0x37, 0x3b, 0xaf, + 0x1b, 0xdb, 0x6e, 0x12, 0xb4, 0xc6, 0x8f, 0x64, 0x12, 0x1f, 0x4d, 0xde, 0x80, 0x31, 0xfc, 0xa1, + 0xc4, 0x54, 0x41, 0x15, 0x0f, 0xff, 0x44, 0x54, 0x1e, 0x45, 0x08, 0x4c, 0x58, 0x52, 0xe3, 0x2a, + 0xe6, 0xb8, 0xb0, 0x24, 0xf4, 0x0a, 0x91, 0x26, 0xa1, 0x28, 0x5d, 0x33, 0x72, 0x91, 0xd0, 0x85, + 0xae, 0x19, 0xc2, 0x21, 0xc3, 0xf8, 0xfe, 0xac, 0x3e, 0xed, 0xc8, 0x15, 0x45, 0x6e, 0x57, 0x22, + 0x3b, 0x4a, 0xb9, 0x5d, 0x91, 0xd6, 0xff, 0x41, 0x06, 0x66, 0xef, 0x2b, 0x89, 0x3a, 0x37, 0x5d, + 0x1c, 0x97, 0xfe, 0xa9, 0x2b, 0x9f, 0x56, 0x0a, 0x3e, 0x35, 0x43, 0x28, 0x9b, 0x29, 0x38, 0x65, + 0xcc, 0xb4, 0xef, 0x41, 0x67, 0x37, 0xfc, 0x30, 0x25, 0x13, 0x22, 0x47, 0xe7, 0x70, 0xe3, 0x27, + 0xb2, 0x30, 0xae, 0x2c, 0x01, 0xf2, 0x59, 0x98, 0x50, 0xf9, 0xa8, 0x0a, 0x3f, 0xb5, 0x5a, 0x53, + 0xc3, 0x42, 0x8d, 0x1f, 0xb5, 0x5b, 0x9a, 0xc6, 0x8f, 0x4d, 0x74, 0x84, 0x9e, 0xf2, 0x6a, 0xf3, + 0x41, 0xca, 0xd5, 0x06, 0xa7, 0xad, 0xa2, 0xb1, 0xe9, 0x7b, 0xc1, 0x79, 0x37, 0x79, 0xc1, 0x41, + 0xe5, 0x91, 0x42, 0xdf, 0xfb, 0x9a, 0x63, 0xfc, 0x74, 0x06, 0x0a, 0xf1, 0x45, 0xfa, 0x89, 0xf4, + 0xca, 0x29, 0x5e, 0x77, 0x7e, 0x3c, 0x1b, 0xa6, 0x42, 0x91, 0x2e, 0xbc, 0xcf, 0xaa, 0x99, 0xe0, + 0x7b, 0xda, 0xc3, 0xcb, 0xf3, 0x7a, 0x34, 0x3a, 0x35, 0xf8, 0x45, 0x7a, 0x08, 0xca, 0xa1, 0x6f, + 0xff, 0x62, 0xf1, 0x39, 0xe3, 0x43, 0x98, 0x8b, 0x77, 0x07, 0x3e, 0xbe, 0x94, 0x60, 0x5a, 0x87, + 0xc7, 0x13, 0x29, 0xc5, 0xa9, 0xcc, 0x38, 0xbe, 0xf1, 0x87, 0xd9, 0x38, 0x6f, 0x61, 0x32, 0xc8, + 0x36, 0x1d, 0xd5, 0x10, 0x46, 0x6c, 0x3a, 0x1c, 0x64, 0xca, 0xb2, 0xd3, 0x24, 0x30, 0x0b, 0x1d, + 0x51, 0x73, 0xe9, 0x8e, 0xa8, 0xe4, 0x56, 0xcc, 0x4a, 0x5a, 0x89, 0x9a, 0xf4, 0x88, 0xee, 0x58, + 0x91, 0xa5, 0x74, 0xcc, 0x38, 0xba, 0x0c, 0x73, 0x5a, 0x08, 0x70, 0x49, 0x3f, 0x1c, 0xe9, 0xda, + 0x03, 0x2c, 0xe0, 0xc4, 0xa9, 0xc8, 0x64, 0x05, 0x46, 0xd9, 0x67, 0xae, 0xd9, 0x1d, 0xf1, 0xa6, + 0x42, 0x42, 0xb7, 0xf4, 0x66, 0x78, 0xe1, 0x53, 0x3c, 0xd3, 0x9b, 0x94, 0x1d, 0xf9, 0xea, 0xc4, + 0x12, 0x88, 0xc6, 0xbf, 0xc8, 0xb0, 0xf5, 0x5f, 0x3f, 0xf8, 0x94, 0x65, 0x41, 0x63, 0x4d, 0xea, + 0x63, 0xd1, 0xfa, 0xc7, 0x59, 0x9e, 0x0b, 0x47, 0x4c, 0x9f, 0xb7, 0x61, 0x64, 0xd3, 0xf6, 0xf6, + 0x44, 0x0e, 0x6a, 0x9d, 0x0b, 0x2f, 0x88, 0x62, 0x3a, 0x05, 0xf8, 0xdb, 0x14, 0x04, 0xaa, 0x2e, + 0x2c, 0x3b, 0x90, 0x2e, 0x4c, 0xd1, 0xcb, 0xe7, 0x9e, 0x9a, 0x5e, 0xfe, 0x7b, 0xc2, 0xb4, 0x37, + 0xa5, 0x60, 0x80, 0x08, 0xd3, 0x97, 0xe2, 0x69, 0xa3, 0x12, 0xb1, 0xc0, 0x23, 0x76, 0xe4, 0x96, + 0x9a, 0x88, 0x4a, 0xf1, 0xed, 0x3c, 0x21, 0xe5, 0x94, 0xf1, 0xc7, 0x39, 0xde, 0xc7, 0xa2, 0xa3, + 0x2e, 0x6b, 0x7e, 0xdf, 0xb8, 0x4e, 0xd8, 0x46, 0xaf, 0x86, 0xe0, 0x40, 0xb3, 0xa9, 0xcb, 0x30, + 0xc4, 0xe6, 0xa6, 0xe8, 0x4d, 0xc4, 0x63, 0xf3, 0x57, 0xc5, 0x63, 0xe5, 0x6c, 0x2d, 0xe3, 0x99, + 0xa4, 0x66, 0x18, 0xc4, 0x63, 0x4b, 0x5d, 0xcb, 0x88, 0x41, 0xae, 0xc0, 0xd0, 0xba, 0xdb, 0x90, + 0x91, 0xcc, 0xe7, 0x30, 0xfa, 0x87, 0x96, 0xc2, 0x74, 0x3e, 0x63, 0x22, 0x06, 0x6b, 0x6b, 0x98, + 0xff, 0x41, 0x6d, 0x6b, 0x6b, 0xd7, 0x4e, 0x66, 0x8e, 0x53, 0x92, 0xce, 0x2c, 0xc3, 0x94, 0x9e, + 0x67, 0x5f, 0xd8, 0xfb, 0xa2, 0x76, 0x3d, 0x96, 0xae, 0x5f, 0x7d, 0x16, 0xd1, 0x89, 0xc8, 0x12, + 0x4c, 0x6a, 0x11, 0x54, 0xc5, 0xe3, 0x26, 0xaa, 0x37, 0xf5, 0xf8, 0xab, 0xaa, 0x7a, 0x53, 0x23, + 0x61, 0xe7, 0xb9, 0xf8, 0x7e, 0xe5, 0x89, 0x33, 0xf1, 0xed, 0x02, 0x87, 0xdc, 0x84, 0x3c, 0x0f, + 0xb3, 0x51, 0xad, 0xa8, 0xcf, 0x54, 0x3e, 0xc2, 0x62, 0x61, 0x6a, 0x24, 0xa2, 0x12, 0x56, 0xe1, + 0x33, 0x50, 0x10, 0x5b, 0x52, 0x94, 0xfc, 0xfc, 0x05, 0x18, 0x2a, 0x57, 0x2b, 0xa6, 0xba, 0x8d, + 0xd4, 0x9d, 0x86, 0x67, 0x22, 0x14, 0xbd, 0xea, 0xd6, 0x69, 0xf0, 0xc8, 0xf5, 0x0e, 0x4c, 0xea, + 0x07, 0x9e, 0xc3, 0x13, 0x54, 0xe2, 0x42, 0xfc, 0x2c, 0x79, 0x17, 0x86, 0xd1, 0xf0, 0x34, 0x76, + 0x32, 0xc4, 0xeb, 0x58, 0x9a, 0x14, 0x13, 0x78, 0x18, 0xad, 0x58, 0x4d, 0x4e, 0x44, 0xde, 0x86, + 0xa1, 0x0a, 0x6d, 0x1f, 0xc6, 0x72, 0xe7, 0x25, 0x88, 0xc3, 0x0d, 0xa1, 0x41, 0xdb, 0x87, 0x26, + 0x92, 0x18, 0x3f, 0x9d, 0x85, 0x33, 0x29, 0x9f, 0xf5, 0xe0, 0xb3, 0xcf, 0xe8, 0xae, 0xb8, 0xa4, + 0xed, 0x8a, 0xf2, 0x7d, 0xba, 0x67, 0xc7, 0xa7, 0x6e, 0x92, 0x3f, 0x9f, 0x81, 0x73, 0xfa, 0x04, + 0x15, 0x96, 0xe6, 0x0f, 0x6e, 0x92, 0x77, 0x60, 0x64, 0x85, 0xda, 0x0d, 0x2a, 0xf3, 0x6a, 0x9d, + 0x09, 0x03, 0xe2, 0xf1, 0x18, 0x02, 0xbc, 0x90, 0xb3, 0x8d, 0x3c, 0x4e, 0x39, 0x94, 0x54, 0xc4, + 0xc7, 0x71, 0x79, 0xdc, 0x90, 0xf1, 0x3c, 0xd2, 0xaa, 0xea, 0x63, 0xe5, 0xf1, 0x9d, 0x0c, 0x3c, + 0xdf, 0x87, 0x86, 0x0d, 0x1c, 0x1b, 0x7a, 0x75, 0xe0, 0xf0, 0x44, 0x45, 0x28, 0x79, 0x1f, 0xa6, + 0x37, 0x85, 0x3c, 0x2f, 0x87, 0x23, 0x1b, 0xad, 0x17, 0x29, 0xea, 0x5b, 0x72, 0x5c, 0xe2, 0xc8, + 0x5a, 0xa0, 0x99, 0x5c, 0xdf, 0x40, 0x33, 0x6a, 0xdc, 0x96, 0xa1, 0x41, 0xe3, 0xb6, 0x7c, 0x08, + 0x73, 0x7a, 0xdb, 0x44, 0xf8, 0xdc, 0x28, 0x6a, 0x4d, 0xa6, 0x77, 0xd4, 0x9a, 0xbe, 0x41, 0x3a, + 0x8d, 0x9f, 0xc8, 0x40, 0x41, 0xe7, 0xfd, 0xa4, 0xe3, 0xf9, 0x9e, 0x36, 0x9e, 0xcf, 0xa7, 0x8f, + 0x67, 0xef, 0x81, 0xfc, 0xbf, 0x33, 0xf1, 0xc6, 0x0e, 0x34, 0x82, 0x06, 0x8c, 0x54, 0xdc, 0x96, + 0xed, 0xb4, 0xd5, 0x5c, 0xfa, 0x0d, 0x84, 0x98, 0xa2, 0x64, 0xb0, 0x20, 0x3f, 0x97, 0x60, 0x78, + 0xdd, 0x6d, 0x97, 0x2a, 0xc2, 0xa4, 0x17, 0xf9, 0xb4, 0xdd, 0xb6, 0x65, 0x37, 0x4c, 0x5e, 0x40, + 0x56, 0x01, 0x6a, 0x75, 0x8f, 0xd2, 0x76, 0xcd, 0xf9, 0x5e, 0x1a, 0x93, 0x34, 0x58, 0x0f, 0x35, + 0xbb, 0xb8, 0xb1, 0xf0, 0xa7, 0x4b, 0x44, 0xb4, 0x7c, 0xe7, 0x7b, 0xd5, 0xfd, 0x56, 0xa1, 0xc7, + 0x75, 0x25, 0xe2, 0xa0, 0xc5, 0xc6, 0xe1, 0xc6, 0x27, 0xb1, 0xae, 0x52, 0xab, 0xc2, 0x1e, 0xbe, + 0x91, 0x3a, 0x1c, 0x7f, 0x90, 0x81, 0xe7, 0xfb, 0xd0, 0x3c, 0x85, 0x51, 0xf9, 0x8b, 0xee, 0x70, + 0x0a, 0x10, 0x11, 0x61, 0x6a, 0x62, 0xa7, 0x11, 0xf0, 0x5c, 0x79, 0x93, 0x22, 0x35, 0x31, 0x03, + 0x68, 0xa9, 0x89, 0x19, 0x80, 0x9d, 0xa5, 0x2b, 0xd4, 0xd9, 0xdb, 0xe7, 0xe6, 0x59, 0x93, 0x7c, + 0x6f, 0xd8, 0x47, 0x88, 0x7a, 0x96, 0x72, 0x1c, 0xe3, 0x5f, 0x0d, 0xc3, 0x79, 0x93, 0xee, 0x39, + 0xec, 0x5e, 0xb2, 0xe5, 0x3b, 0xed, 0x3d, 0x2d, 0xee, 0x8d, 0x11, 0x5b, 0xb9, 0x22, 0x49, 0x04, + 0x83, 0x84, 0x33, 0xf1, 0x2a, 0xe4, 0x99, 0x18, 0xa2, 0x2c, 0x5e, 0x7c, 0xb4, 0x62, 0xc2, 0x8a, + 0x08, 0xac, 0x2c, 0x8b, 0xc9, 0x6b, 0x42, 0x4c, 0x52, 0xd2, 0xf8, 0x30, 0x31, 0xe9, 0xbb, 0x47, + 0x45, 0xa8, 0x1d, 0xfa, 0x01, 0xc5, 0x2b, 0xb2, 0x10, 0x95, 0xc2, 0xbb, 0xcc, 0x50, 0x8f, 0xbb, + 0xcc, 0x1a, 0xcc, 0x95, 0x1a, 0xfc, 0x74, 0xb4, 0x9b, 0x1b, 0x9e, 0xd3, 0xae, 0x3b, 0x1d, 0xbb, + 0x29, 0xef, 0xe7, 0xd8, 0xcb, 0x76, 0x58, 0x6e, 0x75, 0x42, 0x04, 0x33, 0x95, 0x8c, 0x35, 0xa3, + 0xb2, 0x5e, 0xc3, 0xf0, 0x30, 0xe2, 0x3d, 0x12, 0x9b, 0xd1, 0x68, 0xfb, 0xd8, 0x0a, 0xdf, 0x0c, + 0x8b, 0xf1, 0x16, 0x85, 0x0f, 0xf2, 0x9b, 0xab, 0xb5, 0xc8, 0xa5, 0x99, 0x67, 0x19, 0xe0, 0x0f, + 0xfb, 0x41, 0xd3, 0x47, 0x53, 0x48, 0x0d, 0x2f, 0xa2, 0xab, 0xd5, 0x56, 0x18, 0x5d, 0x3e, 0x41, + 0xe7, 0xfb, 0xfb, 0x2a, 0x1d, 0xc7, 0x23, 0xd7, 0xd9, 0x54, 0x68, 0xb9, 0x01, 0xc5, 0x29, 0x3c, + 0x16, 0xdd, 0xb9, 0x3c, 0x84, 0xf2, 0x3b, 0x97, 0x82, 0x42, 0xde, 0x85, 0xd9, 0xe5, 0xf2, 0xa2, + 0xd4, 0x22, 0x57, 0xdc, 0x7a, 0x17, 0x1f, 0xe2, 0x01, 0xeb, 0xc3, 0x31, 0xa4, 0xf5, 0x45, 0xb6, + 0x9b, 0xa4, 0xa1, 0x91, 0xcb, 0x30, 0x5a, 0xad, 0xf0, 0xbe, 0x1f, 0x57, 0x53, 0x69, 0x09, 0xcb, + 0x28, 0x59, 0x48, 0xee, 0x47, 0x97, 0x82, 0x89, 0x13, 0xa5, 0xf7, 0xf3, 0x03, 0x5c, 0x08, 0xde, + 0x86, 0xc9, 0x25, 0x37, 0xa8, 0xb6, 0xfd, 0xc0, 0x6e, 0xd7, 0x69, 0xb5, 0xa2, 0xc6, 0xb5, 0xde, + 0x71, 0x03, 0xcb, 0x11, 0x25, 0xec, 0xcb, 0x75, 0x4c, 0xf2, 0x79, 0x24, 0xbd, 0x43, 0xdb, 0xd4, + 0x8b, 0xe2, 0x59, 0x0f, 0xf3, 0xbe, 0x65, 0xa4, 0x7b, 0x61, 0x89, 0xa9, 0x23, 0x8a, 0x34, 0x5f, + 0x3c, 0x39, 0x67, 0xd9, 0x6d, 0x50, 0x9f, 0xef, 0x16, 0x9f, 0xa2, 0x34, 0x5f, 0x4a, 0xdb, 0xfa, + 0xec, 0xa0, 0xff, 0x2e, 0xa6, 0xf9, 0x4a, 0xe0, 0x92, 0xcf, 0xc3, 0x30, 0xfe, 0x14, 0xd2, 0xed, + 0x6c, 0x0a, 0xdb, 0x48, 0xb2, 0xad, 0x33, 0x4c, 0x93, 0x13, 0x90, 0x2a, 0x8c, 0x8a, 0x8b, 0xd5, + 0x69, 0x92, 0xd5, 0x88, 0x1b, 0x1a, 0x9f, 0x19, 0x82, 0xde, 0x68, 0xc0, 0x84, 0x5a, 0x21, 0x5b, + 0x11, 0x2b, 0xb6, 0xbf, 0x4f, 0x1b, 0xec, 0x97, 0xc8, 0x33, 0x87, 0x2b, 0x62, 0x1f, 0xa1, 0x16, + 0xfb, 0x0e, 0x53, 0x41, 0x61, 0x67, 0x6a, 0xd5, 0xdf, 0xf2, 0xc5, 0xa7, 0x08, 0x55, 0x8b, 0x83, + 0x6a, 0xbb, 0x86, 0x29, 0x8a, 0x8c, 0xef, 0x81, 0xb9, 0xf5, 0x6e, 0xb3, 0x69, 0xef, 0x34, 0xa9, + 0xcc, 0x43, 0x82, 0x19, 0xbc, 0x97, 0x60, 0xb8, 0xa6, 0xe4, 0x04, 0x0f, 0x73, 0x41, 0x2a, 0x38, + 0x68, 0x84, 0x9a, 0xc1, 0x50, 0x3d, 0xb1, 0x6c, 0xe0, 0x9c, 0xd4, 0xf8, 0xbd, 0x0c, 0xcc, 0xc9, + 0xf7, 0x7f, 0xcf, 0xae, 0x1f, 0x84, 0x89, 0xe1, 0x2f, 0x6b, 0x73, 0x0d, 0x27, 0x6c, 0x6c, 0x1a, + 0xf1, 0x59, 0x77, 0x57, 0x7e, 0x84, 0x2e, 0xb0, 0xa4, 0x7d, 0xf0, 0x49, 0x1f, 0x43, 0xde, 0x85, + 0x71, 0x71, 0x3c, 0x2a, 0x01, 0x26, 0x31, 0x8a, 0x97, 0xb8, 0xee, 0xc5, 0xad, 0x51, 0x54, 0x74, + 0x94, 0xc5, 0xf4, 0xa6, 0x3c, 0xa9, 0x0c, 0x90, 0x2e, 0x8b, 0xe9, 0x75, 0xf4, 0x99, 0xba, 0xbf, + 0x3d, 0x1e, 0xef, 0x5b, 0x31, 0x77, 0x6f, 0xa9, 0x21, 0xe5, 0x32, 0xd1, 0xcd, 0x38, 0x0a, 0x29, + 0xa7, 0xde, 0x8c, 0x43, 0xd4, 0x70, 0x4c, 0xb2, 0x27, 0x8c, 0xc9, 0xfb, 0x72, 0x4c, 0x72, 0xbd, + 0x27, 0xc6, 0x6c, 0x9f, 0x71, 0xa8, 0x45, 0x2b, 0x64, 0x68, 0x20, 0xb5, 0xca, 0x73, 0x18, 0x3b, + 0x9f, 0x93, 0xc4, 0x77, 0x51, 0xc1, 0x49, 0xd5, 0xd5, 0x0c, 0x0f, 0xce, 0xf4, 0x84, 0xad, 0xf9, + 0x0b, 0x30, 0x51, 0x0a, 0x02, 0xbb, 0xbe, 0x4f, 0x1b, 0x15, 0xb6, 0x3d, 0x29, 0xd1, 0xaf, 0x6c, + 0x01, 0x57, 0x1f, 0xcd, 0x54, 0x5c, 0x1e, 0xcd, 0xd5, 0xf6, 0x85, 0x31, 0x6b, 0x18, 0xcd, 0x95, + 0x41, 0xf4, 0x68, 0xae, 0x0c, 0x42, 0xae, 0xc3, 0x68, 0xb5, 0xfd, 0xd0, 0x61, 0x7d, 0xc2, 0x03, + 0x60, 0xa1, 0x6e, 0xca, 0xe1, 0x20, 0x75, 0x73, 0x15, 0x58, 0xe4, 0x6d, 0xe5, 0x52, 0x33, 0x16, + 0x29, 0x30, 0xb8, 0xca, 0x2b, 0x8c, 0x70, 0xa3, 0x5e, 0x58, 0xc2, 0x5b, 0xce, 0x2d, 0x18, 0x95, + 0x9a, 0x4c, 0x88, 0x94, 0x16, 0x82, 0x32, 0x19, 0x30, 0x42, 0x22, 0x63, 0x92, 0x6f, 0x25, 0x5f, + 0xde, 0xb8, 0x92, 0xe4, 0x5b, 0xc9, 0x97, 0xa7, 0x25, 0xf9, 0x56, 0x32, 0xe7, 0x85, 0x4a, 0xa0, + 0x89, 0x13, 0x95, 0x40, 0x0f, 0x60, 0x62, 0xc3, 0xf6, 0x02, 0x87, 0xc9, 0x28, 0xed, 0xc0, 0x9f, + 0x9f, 0xd4, 0xf4, 0xa6, 0x4a, 0xd1, 0xd2, 0x45, 0x99, 0x97, 0xba, 0xa3, 0xe0, 0xeb, 0x09, 0x94, + 0x23, 0x78, 0xba, 0x29, 0xeb, 0xd4, 0x93, 0x98, 0xb2, 0x62, 0xa7, 0xa2, 0xae, 0x6c, 0x3a, 0xd2, + 0xc8, 0xe0, 0xa5, 0x25, 0xa6, 0x30, 0x0b, 0x11, 0xc9, 0x57, 0x61, 0x82, 0xfd, 0xbd, 0xe1, 0x36, + 0x9d, 0xba, 0x43, 0xfd, 0xf9, 0x02, 0x36, 0xee, 0x62, 0xea, 0xea, 0x47, 0xa4, 0xc3, 0x1a, 0x0d, + 0xf8, 0x02, 0x46, 0xc6, 0x71, 0x25, 0xb8, 0xc6, 0x8d, 0x7c, 0x00, 0x13, 0x6c, 0xf6, 0xed, 0xd8, + 0x3e, 0x17, 0x4d, 0x67, 0x22, 0x63, 0xe4, 0x86, 0x80, 0x27, 0x02, 0x2a, 0xab, 0x04, 0xec, 0x98, + 0x2f, 0x75, 0xf8, 0x06, 0x49, 0x94, 0xd9, 0xde, 0x49, 0x6c, 0x8e, 0x12, 0x8d, 0x7c, 0x11, 0x26, + 0x4a, 0x9d, 0x4e, 0xb4, 0xe3, 0xcc, 0x2a, 0x8a, 0xb0, 0x4e, 0xc7, 0x4a, 0xdd, 0x75, 0x34, 0x8a, + 0xf8, 0xc6, 0x3c, 0x77, 0xaa, 0x8d, 0x99, 0xbc, 0x19, 0x4a, 0xeb, 0x67, 0x22, 0xad, 0xae, 0xb8, + 0x38, 0x6a, 0xa2, 0x3f, 0x17, 0xdc, 0xcb, 0x30, 0xc9, 0xd5, 0x9c, 0x52, 0x9a, 0x39, 0x9b, 0x58, + 0x3d, 0x29, 0x42, 0x8d, 0x4e, 0x43, 0x96, 0x61, 0x8a, 0x7b, 0x5b, 0x37, 0x45, 0xa4, 0xeb, 0xf9, + 0x73, 0xb8, 0x6a, 0x91, 0x0b, 0x77, 0xd2, 0x6e, 0x62, 0x02, 0x14, 0x5b, 0xe3, 0x12, 0x23, 0x32, + 0xfe, 0x24, 0x03, 0xe7, 0x7a, 0x8c, 0x78, 0x18, 0x07, 0x39, 0xd3, 0x3f, 0x0e, 0x32, 0xdb, 0x39, + 0x74, 0xad, 0x08, 0xb6, 0x5f, 0x48, 0x59, 0xea, 0x78, 0x49, 0x79, 0xcb, 0x05, 0x22, 0x72, 0x0c, + 0x89, 0xaa, 0xef, 0xba, 0xa8, 0x9a, 0xcd, 0x25, 0x0f, 0x21, 0x81, 0xc7, 0x3f, 0x6a, 0xc9, 0x38, + 0x3e, 0x2a, 0x5e, 0x14, 0x29, 0x8c, 0xc2, 0x61, 0xfd, 0xc8, 0xd5, 0x56, 0x70, 0x0a, 0x6b, 0xe3, + 0x28, 0x03, 0xe3, 0xca, 0x3a, 0x24, 0x97, 0x14, 0x2f, 0xe0, 0x02, 0x4f, 0x82, 0xa5, 0x70, 0xc8, + 0xf2, 0x93, 0x08, 0x17, 0x55, 0xf6, 0x64, 0x05, 0xf4, 0x1a, 0x13, 0x85, 0x94, 0x58, 0xd1, 0x2d, + 0x4d, 0x5b, 0x6c, 0x62, 0x39, 0xa6, 0xd3, 0xb7, 0xfd, 0xa0, 0x54, 0x0f, 0x9c, 0x87, 0x74, 0x80, + 0x43, 0x27, 0x4a, 0xa7, 0x6f, 0xfb, 0x81, 0x65, 0x23, 0x59, 0x22, 0x9d, 0x7e, 0xc8, 0xd0, 0xf8, + 0x81, 0x0c, 0xc0, 0x56, 0xb5, 0x8c, 0xc1, 0xde, 0x9f, 0x54, 0x28, 0x48, 0x0f, 0xa0, 0x2b, 0xb9, + 0xf7, 0x11, 0x07, 0xfe, 0xe7, 0x0c, 0x4c, 0xe9, 0x68, 0xe4, 0x7d, 0x98, 0xae, 0xd5, 0x3d, 0xb7, + 0xd9, 0xdc, 0xb1, 0xeb, 0x07, 0xab, 0x4e, 0x9b, 0xf2, 0xd0, 0xa5, 0xc3, 0xfc, 0x2c, 0xf2, 0xc3, + 0x22, 0xab, 0xc9, 0xca, 0xcc, 0x38, 0x32, 0xf9, 0xc1, 0x0c, 0x4c, 0xd6, 0xf6, 0xdd, 0x47, 0x61, + 0xb4, 0x51, 0x31, 0x20, 0x5f, 0x63, 0x6b, 0xdb, 0xdf, 0x77, 0x1f, 0x45, 0x19, 0x34, 0x35, 0xe3, + 0xcf, 0xf7, 0x06, 0x7b, 0x97, 0xaf, 0xbb, 0x78, 0x93, 0x09, 0xfc, 0x6b, 0x5a, 0x25, 0xa6, 0x5e, + 0xa7, 0xf1, 0xe7, 0x19, 0x18, 0xc7, 0x3b, 0x4f, 0xb3, 0x89, 0x32, 0xd7, 0xa7, 0x29, 0x1d, 0x63, + 0xd8, 0xae, 0x3e, 0x03, 0xfb, 0x16, 0x4c, 0xc7, 0xd0, 0x88, 0x01, 0x23, 0x35, 0x74, 0xf0, 0x57, + 0x15, 0x14, 0xdc, 0xe5, 0xdf, 0x14, 0x25, 0xc6, 0xb2, 0x42, 0xf6, 0xe0, 0x06, 0x3e, 0xeb, 0x2e, + 0x02, 0x38, 0x12, 0x24, 0x6f, 0x36, 0x24, 0xfe, 0x25, 0x0f, 0x6e, 0x98, 0x0a, 0x96, 0xb1, 0x0e, + 0x23, 0x35, 0xd7, 0x0b, 0x96, 0x0e, 0xf9, 0x65, 0xa2, 0x42, 0xfd, 0xba, 0xfa, 0x6e, 0xeb, 0xe0, + 0x5b, 0x49, 0xdd, 0x14, 0x45, 0xa4, 0x08, 0xc3, 0xb7, 0x1d, 0xda, 0x6c, 0xa8, 0x06, 0xba, 0xbb, + 0x0c, 0x60, 0x72, 0x38, 0xbb, 0x70, 0x9d, 0x8d, 0x72, 0xa2, 0x44, 0x96, 0xc0, 0x4f, 0xba, 0x6e, + 0xca, 0x5a, 0xff, 0xbe, 0x18, 0xe6, 0x21, 0x48, 0xd6, 0xd4, 0xa7, 0xab, 0xff, 0xe3, 0x0c, 0x2c, + 0xf4, 0x26, 0x51, 0x8d, 0x8b, 0x33, 0x7d, 0x8c, 0x8b, 0x5f, 0x89, 0xbf, 0x33, 0x22, 0x9a, 0x78, + 0x67, 0x8c, 0x5e, 0x17, 0x2b, 0x68, 0xdb, 0x5d, 0xa7, 0x32, 0x11, 0xca, 0xa5, 0x3e, 0xdf, 0x8c, + 0x88, 0x7c, 0x98, 0x03, 0xa4, 0x31, 0x05, 0xad, 0xf1, 0x5b, 0x43, 0x70, 0xbe, 0x27, 0x05, 0x59, + 0x51, 0xd2, 0x2b, 0x4d, 0x85, 0x89, 0x5d, 0x7a, 0xe2, 0x5f, 0xc3, 0x7f, 0xd1, 0x7c, 0x2f, 0xee, + 0x6d, 0x76, 0x3f, 0x4c, 0xab, 0x93, 0x45, 0x5e, 0xaf, 0x9f, 0xc8, 0x8b, 0xa3, 0x23, 0x33, 0x48, + 0x66, 0xd8, 0x41, 0xbf, 0x44, 0x1a, 0xd8, 0x4e, 0xd3, 0x57, 0x97, 0x5d, 0x83, 0x83, 0x4c, 0x59, + 0x16, 0x59, 0x7c, 0x0f, 0xa5, 0x5b, 0x7c, 0x1b, 0xff, 0x2a, 0x03, 0x63, 0xe1, 0x67, 0x93, 0x05, + 0x38, 0xbb, 0x69, 0x96, 0xca, 0xcb, 0xd6, 0xe6, 0x87, 0x1b, 0xcb, 0xd6, 0xd6, 0x7a, 0x6d, 0x63, + 0xb9, 0x5c, 0xbd, 0x5d, 0x5d, 0xae, 0x14, 0x9e, 0x23, 0x33, 0x30, 0xb9, 0xb5, 0x7e, 0x6f, 0xfd, + 0xfe, 0xf6, 0xba, 0xb5, 0x6c, 0x9a, 0xf7, 0xcd, 0x42, 0x86, 0x4c, 0xc2, 0x98, 0xb9, 0x54, 0x2a, + 0x5b, 0xeb, 0xf7, 0x2b, 0xcb, 0x85, 0x2c, 0x29, 0xc0, 0x44, 0xf9, 0xfe, 0xfa, 0xfa, 0x72, 0x79, + 0xb3, 0xfa, 0xa0, 0xba, 0xf9, 0x61, 0x21, 0x47, 0x08, 0x4c, 0x21, 0xc2, 0x86, 0x59, 0x5d, 0x2f, + 0x57, 0x37, 0x4a, 0xab, 0x85, 0x21, 0x06, 0x63, 0xf8, 0x0a, 0x6c, 0x38, 0x64, 0x74, 0x6f, 0x6b, + 0x69, 0xb9, 0x30, 0xc2, 0x50, 0xd8, 0x5f, 0x0a, 0xca, 0x28, 0xab, 0x1e, 0x51, 0x2a, 0xa5, 0xcd, + 0xd2, 0x52, 0xa9, 0xb6, 0x5c, 0xc8, 0x93, 0x73, 0x30, 0xab, 0x81, 0xac, 0xd5, 0xfb, 0x77, 0xaa, + 0xeb, 0x85, 0x31, 0x32, 0x07, 0x85, 0x10, 0x56, 0x59, 0xb2, 0xb6, 0x6a, 0xcb, 0x66, 0x01, 0xe2, + 0xd0, 0xf5, 0xd2, 0xda, 0x72, 0x61, 0xdc, 0x78, 0x8f, 0xfb, 0x01, 0xf2, 0xae, 0x26, 0x67, 0x81, + 0xd4, 0x36, 0x4b, 0x9b, 0x5b, 0xb5, 0x58, 0xe3, 0xc7, 0x61, 0xb4, 0xb6, 0x55, 0x2e, 0x2f, 0xd7, + 0x6a, 0x85, 0x0c, 0x01, 0x18, 0xb9, 0x5d, 0xaa, 0xae, 0x2e, 0x57, 0x0a, 0x59, 0xe3, 0xa7, 0x32, + 0x30, 0x23, 0x25, 0x40, 0xf9, 0x68, 0xf4, 0x84, 0x6b, 0xf1, 0x7d, 0xed, 0x62, 0x2b, 0x9d, 0xb4, + 0x62, 0x95, 0xf4, 0x59, 0x86, 0x3f, 0x9f, 0x81, 0x33, 0xa9, 0xd8, 0xe4, 0x43, 0x28, 0xc8, 0x2f, + 0x58, 0xb3, 0x83, 0xfa, 0x7e, 0xb4, 0x8f, 0x5d, 0x8c, 0xd5, 0x12, 0x43, 0xe3, 0x6a, 0xcd, 0x28, + 0xe1, 0x73, 0x82, 0xcd, 0xe0, 0xe9, 0x08, 0x8c, 0x6f, 0x67, 0xe0, 0x5c, 0x8f, 0x6a, 0x48, 0x19, + 0x46, 0xc2, 0xc4, 0x34, 0x7d, 0x2c, 0xd8, 0xe6, 0xbe, 0x73, 0x54, 0x14, 0x88, 0x98, 0x21, 0x17, + 0xff, 0x32, 0x47, 0xc2, 0x4c, 0x33, 0x98, 0xee, 0x85, 0x77, 0xdf, 0xf9, 0x58, 0xcf, 0x8b, 0x9a, + 0x4a, 0xdb, 0xb5, 0xa5, 0x71, 0xd1, 0x77, 0x39, 0xfb, 0x91, 0x8f, 0xf9, 0x5e, 0x8c, 0x9f, 0xc9, + 0x30, 0xe1, 0x2e, 0x8e, 0xc8, 0x64, 0xde, 0x92, 0xef, 0x77, 0x5b, 0xd4, 0x74, 0x9b, 0xb4, 0x64, + 0xae, 0x8b, 0x63, 0x03, 0xa5, 0x55, 0x1b, 0x0b, 0xf0, 0x5a, 0x61, 0xd9, 0x5e, 0x5b, 0x7b, 0xad, + 0x56, 0x69, 0xc8, 0xdb, 0x00, 0xcb, 0x8f, 0x03, 0xea, 0xb5, 0xed, 0x66, 0x18, 0xa3, 0x85, 0x47, + 0x96, 0x12, 0x50, 0x5d, 0xde, 0x56, 0x90, 0x8d, 0xbf, 0x99, 0x81, 0x09, 0x71, 0x69, 0x2a, 0x35, + 0xa9, 0x17, 0x3c, 0xd9, 0xf4, 0x7a, 0x5b, 0x9b, 0x5e, 0xa1, 0xc3, 0x86, 0xc2, 0x9f, 0x15, 0xa7, + 0xce, 0xac, 0x7f, 0x9a, 0x81, 0x42, 0x1c, 0x91, 0xbc, 0x0f, 0xf9, 0x1a, 0x7d, 0x48, 0x3d, 0x27, + 0x38, 0x14, 0x1b, 0xa5, 0x4c, 0xe1, 0xc7, 0x71, 0x44, 0x19, 0x9f, 0x0f, 0xbe, 0xf8, 0x65, 0x86, + 0x34, 0x83, 0xee, 0xf7, 0x8a, 0xda, 0x23, 0xf7, 0xb4, 0xd4, 0x1e, 0xc6, 0xff, 0x9e, 0x85, 0x73, + 0x77, 0x68, 0xa0, 0xb6, 0x29, 0x34, 0x2f, 0xf8, 0xcc, 0x60, 0xed, 0x52, 0x5a, 0x32, 0x0f, 0xa3, + 0x58, 0x24, 0xc7, 0xd7, 0x94, 0x3f, 0xc9, 0x52, 0x38, 0xaf, 0x73, 0x5a, 0x8e, 0xb0, 0x1e, 0x75, + 0x5f, 0x53, 0xb2, 0x06, 0x85, 0xd3, 0xfa, 0x32, 0x4c, 0x61, 0x58, 0xfc, 0x2e, 0x5b, 0x0e, 0xb4, + 0x21, 0xd4, 0x3f, 0x79, 0x33, 0x06, 0x25, 0xaf, 0x41, 0x81, 0x41, 0x4a, 0xf5, 0x83, 0xb6, 0xfb, + 0xa8, 0x49, 0x1b, 0x7b, 0xb4, 0x81, 0xc7, 0x7a, 0xde, 0x4c, 0xc0, 0x25, 0xcf, 0xad, 0x36, 0xbf, + 0xba, 0xd1, 0x06, 0xea, 0x68, 0x04, 0xcf, 0x08, 0xba, 0xf0, 0x36, 0x8c, 0x7f, 0xcc, 0x0c, 0x60, + 0xc6, 0xff, 0x96, 0x81, 0x39, 0x6c, 0x9c, 0x52, 0xb1, 0xcc, 0xce, 0x2a, 0x7b, 0x4b, 0x49, 0x8a, + 0x63, 0x33, 0x90, 0xbe, 0x14, 0xc2, 0x5e, 0x8c, 0x74, 0x42, 0xd9, 0x01, 0x74, 0x42, 0xb5, 0xd3, + 0x64, 0xa2, 0x1f, 0x50, 0xa5, 0x75, 0x77, 0x28, 0x9f, 0x2b, 0x0c, 0x45, 0x43, 0x6e, 0xfc, 0x60, + 0x16, 0x46, 0x4d, 0x8a, 0x29, 0xba, 0xc9, 0x65, 0x18, 0x5d, 0x77, 0x03, 0xea, 0xaf, 0x69, 0xf9, + 0xd8, 0xdb, 0x0c, 0x64, 0xb5, 0x1a, 0xa6, 0x2c, 0x64, 0x13, 0x7e, 0xc3, 0x73, 0x1b, 0xdd, 0x7a, + 0xa0, 0x4e, 0xf8, 0x0e, 0x07, 0x99, 0xb2, 0x8c, 0xbc, 0x01, 0x63, 0x82, 0x73, 0xf8, 0xa8, 0x8b, + 0xc6, 0xc8, 0x1e, 0x0d, 0x53, 0xbc, 0x47, 0x08, 0x28, 0xd3, 0x72, 0x01, 0x63, 0x48, 0x91, 0x69, + 0x13, 0x32, 0x83, 0x14, 0xd5, 0x87, 0xfb, 0x88, 0xea, 0x9f, 0x81, 0x91, 0x92, 0xef, 0xd3, 0x40, + 0x46, 0x31, 0x98, 0x08, 0xc3, 0xb6, 0xf9, 0x34, 0xe0, 0x8c, 0x6d, 0x2c, 0x37, 0x05, 0x9e, 0xf1, + 0x2f, 0xb2, 0x30, 0x8c, 0x7f, 0xe2, 0x93, 0xa9, 0x57, 0xdf, 0xd7, 0x9e, 0x4c, 0xbd, 0xfa, 0xbe, + 0x89, 0x50, 0x72, 0x03, 0x35, 0x15, 0x32, 0x7f, 0x93, 0x68, 0x3d, 0xaa, 0xe0, 0x1b, 0x11, 0xd8, + 0x54, 0x71, 0xc2, 0x17, 0xfe, 0x5c, 0x6a, 0xec, 0x92, 0xb3, 0x90, 0xbd, 0x5f, 0x13, 0x2d, 0xc6, + 0x88, 0x58, 0xae, 0x6f, 0x66, 0xef, 0xd7, 0xb0, 0x37, 0x56, 0x4a, 0x8b, 0x6f, 0xdd, 0x12, 0x0d, + 0xe5, 0xbd, 0xb1, 0x6f, 0x2f, 0xbe, 0x75, 0xcb, 0x14, 0x25, 0xac, 0x7f, 0xf1, 0x9b, 0xf1, 0xe1, + 0x95, 0xfb, 0xdc, 0x63, 0xff, 0x62, 0xdb, 0xf0, 0x91, 0xd5, 0x8c, 0x10, 0xc8, 0x22, 0x8c, 0x8b, + 0x58, 0x0f, 0x88, 0xaf, 0xc4, 0x62, 0x10, 0xb1, 0x20, 0x38, 0x85, 0x8a, 0xc4, 0x9f, 0xe0, 0xc4, + 0x00, 0xc9, 0x2c, 0xb3, 0xe2, 0x09, 0x4e, 0x0e, 0xa1, 0x6f, 0x2a, 0x28, 0xec, 0x93, 0xf8, 0x1b, + 0x5e, 0xe4, 0x4b, 0x3f, 0xa5, 0x04, 0x0d, 0xc0, 0x34, 0x07, 0x21, 0x82, 0xf1, 0xcb, 0x59, 0xc8, + 0x6f, 0x34, 0xbb, 0x7b, 0x4e, 0xfb, 0xc1, 0x0d, 0x42, 0x00, 0xaf, 0x71, 0x32, 0x0f, 0x06, 0xfb, + 0x9b, 0x9c, 0x87, 0xbc, 0xbc, 0xb9, 0xc9, 0x0d, 0xc9, 0x17, 0xb7, 0xb6, 0x79, 0x90, 0xe3, 0x2e, + 0x42, 0x9f, 0xc9, 0x9f, 0xe4, 0x06, 0x84, 0xf7, 0xaf, 0x5e, 0x17, 0xb5, 0x21, 0xb6, 0x58, 0xcc, + 0x10, 0x8d, 0xbc, 0x09, 0x78, 0x48, 0x88, 0xcb, 0x83, 0x54, 0x68, 0xf3, 0x4f, 0x13, 0x72, 0x0a, + 0x27, 0x41, 0x34, 0x72, 0x13, 0xc4, 0xc4, 0x14, 0xd9, 0xcc, 0xcf, 0xe8, 0x04, 0x3c, 0x3f, 0xa4, + 0x24, 0x11, 0xa8, 0xe4, 0x5d, 0x18, 0xaf, 0x7b, 0x14, 0x5f, 0x1d, 0xed, 0x66, 0x94, 0xa4, 0x5c, + 0xa5, 0x2c, 0x47, 0xe5, 0x0f, 0x6e, 0x98, 0x2a, 0xba, 0xf1, 0xcb, 0x79, 0x98, 0x50, 0xbf, 0x87, + 0x98, 0x30, 0xeb, 0x37, 0xd9, 0xdd, 0x5d, 0x18, 0x9b, 0x75, 0xb0, 0x50, 0x1c, 0xa7, 0x97, 0xf4, + 0x0f, 0x62, 0x78, 0xdc, 0xf2, 0x4c, 0x06, 0xa9, 0x58, 0x79, 0xce, 0x9c, 0xf1, 0x23, 0x30, 0xc7, + 0x23, 0x25, 0xc8, 0xbb, 0x1d, 0x7f, 0x8f, 0xb6, 0x1d, 0xf9, 0xde, 0xf2, 0x92, 0xc6, 0xe8, 0xbe, + 0x28, 0x4c, 0xf0, 0x0a, 0xc9, 0xc8, 0x5b, 0x30, 0xe2, 0x76, 0x68, 0xdb, 0x76, 0xc4, 0x19, 0xf7, + 0x7c, 0x8c, 0x01, 0x6d, 0x97, 0xaa, 0x0a, 0xa1, 0x40, 0x26, 0xd7, 0x61, 0xc8, 0x3d, 0x08, 0xc7, + 0xeb, 0xbc, 0x4e, 0x74, 0x10, 0xd8, 0x0a, 0x09, 0x22, 0x32, 0x82, 0x8f, 0xec, 0xd6, 0xae, 0x18, + 0x31, 0x9d, 0xe0, 0xae, 0xdd, 0xda, 0x55, 0x09, 0x18, 0x22, 0xf9, 0x00, 0xa0, 0x63, 0xef, 0x51, + 0xcf, 0x6a, 0x74, 0x83, 0x43, 0x31, 0x6e, 0x17, 0x35, 0xb2, 0x0d, 0x56, 0x5c, 0xe9, 0x06, 0x87, + 0x0a, 0xed, 0x58, 0x47, 0x02, 0x49, 0x09, 0xa0, 0x65, 0x07, 0x01, 0xf5, 0x5a, 0xae, 0xb0, 0xf6, + 0x8b, 0x82, 0x10, 0x72, 0x06, 0x6b, 0x61, 0xb1, 0xc2, 0x41, 0x21, 0xc2, 0x8f, 0x76, 0x3c, 0x5b, + 0xe4, 0x94, 0x8f, 0x7d, 0xb4, 0xe3, 0x69, 0xad, 0x64, 0x88, 0xe4, 0xf3, 0x30, 0xda, 0x70, 0xfc, + 0xba, 0xeb, 0x35, 0x44, 0xf4, 0x92, 0x17, 0x34, 0x9a, 0x0a, 0x2f, 0x53, 0xc8, 0x24, 0x3a, 0xfb, + 0x5a, 0x11, 0x84, 0x74, 0xdd, 0x7d, 0x84, 0x6a, 0xfe, 0xf8, 0xd7, 0xd6, 0xc2, 0x62, 0xf5, 0x6b, + 0x23, 0x22, 0x36, 0x94, 0x7b, 0x4e, 0xd0, 0xb4, 0x77, 0xc4, 0x3b, 0xb7, 0x3e, 0x94, 0x77, 0xb0, + 0x48, 0x1d, 0x4a, 0x8e, 0x4c, 0xde, 0x86, 0x3c, 0x6d, 0x07, 0x9e, 0x6d, 0x39, 0x0d, 0xe1, 0x25, + 0xa9, 0x7f, 0x34, 0x3b, 0x80, 0xed, 0x6a, 0x45, 0xfd, 0x68, 0xc4, 0xaf, 0x36, 0x58, 0xff, 0xf8, + 0x75, 0xa7, 0x25, 0x9c, 0x1b, 0xf5, 0xfe, 0xa9, 0x95, 0xab, 0x6b, 0x6a, 0xff, 0x30, 0x44, 0xf2, + 0x3e, 0x8c, 0xb2, 0xf5, 0xdb, 0x70, 0xf7, 0x44, 0x40, 0x08, 0x43, 0xef, 0x1f, 0x5e, 0x96, 0x98, + 0xae, 0x92, 0x88, 0x2d, 0x64, 0xfb, 0x91, 0x6f, 0x39, 0x75, 0x11, 0xe4, 0x41, 0x5f, 0x8e, 0xa5, + 0xed, 0x5a, 0xb5, 0xac, 0x90, 0x0d, 0xdb, 0x8f, 0xfc, 0x6a, 0x9d, 0x2c, 0xc2, 0x30, 0xa6, 0x88, + 0x10, 0x81, 0x28, 0x75, 0x1a, 0x4c, 0x0e, 0xa1, 0xd2, 0x20, 0x2a, 0x1b, 0xc8, 0x96, 0x8f, 0xfe, + 0x22, 0x22, 0x51, 0x83, 0xde, 0x27, 0x6b, 0x35, 0x74, 0x22, 0x51, 0x3f, 0x51, 0xa0, 0x93, 0x8b, + 0x00, 0xd1, 0x2b, 0x3e, 0x7f, 0x73, 0x31, 0x15, 0xc8, 0x17, 0x86, 0xfe, 0xaf, 0x5f, 0x2c, 0x66, + 0x96, 0x00, 0xf2, 0x32, 0x42, 0x8d, 0xb1, 0x0a, 0xe7, 0x7b, 0xae, 0x7b, 0x72, 0x15, 0x0a, 0xbb, + 0xb6, 0xd0, 0xfa, 0xd5, 0xf7, 0xed, 0x76, 0x9b, 0x36, 0xc5, 0x8e, 0x3b, 0x2d, 0xe1, 0x65, 0x0e, + 0xe6, 0x9c, 0x8d, 0x0f, 0x60, 0x2e, 0x6d, 0xc0, 0xc9, 0x8b, 0x30, 0xa1, 0x06, 0xe3, 0x11, 0x4c, + 0xc6, 0xed, 0x8e, 0x23, 0xc3, 0xf1, 0x08, 0x06, 0xbf, 0x99, 0x81, 0x17, 0xfa, 0x6d, 0x1f, 0x64, + 0x01, 0xf2, 0x1d, 0xcf, 0x71, 0x51, 0x4c, 0x15, 0xd9, 0x0e, 0xe4, 0x6f, 0x4c, 0x64, 0x80, 0xf2, + 0x54, 0x60, 0xef, 0x09, 0x07, 0x0f, 0x73, 0x0c, 0x21, 0x9b, 0xf6, 0x9e, 0x4f, 0x5e, 0x87, 0x99, + 0x06, 0xdd, 0xb5, 0xbb, 0xcd, 0xc0, 0xf2, 0xeb, 0xfb, 0xb4, 0x81, 0x3e, 0x55, 0x68, 0xb8, 0x67, + 0x16, 0x44, 0x41, 0x4d, 0xc2, 0x13, 0x5f, 0x3c, 0xdc, 0xe3, 0x8b, 0xef, 0x0e, 0xe5, 0x33, 0xff, + 0x3f, 0x7b, 0xcf, 0x12, 0xe3, 0x46, 0x72, 0x9d, 0x9a, 0xe4, 0xcc, 0x70, 0x1e, 0xe7, 0xd3, 0x53, + 0xfa, 0xcc, 0xac, 0xbe, 0xab, 0x5e, 0x49, 0x96, 0xb8, 0xde, 0xb5, 0xa5, 0xcd, 0x7a, 0x77, 0x6d, + 0xaf, 0xed, 0x1e, 0x4e, 0xcf, 0x90, 0x12, 0x7f, 0xee, 0x26, 0x47, 0x96, 0x65, 0xbb, 0xdd, 0x22, + 0x7b, 0x66, 0xda, 0xe6, 0xb0, 0x69, 0x36, 0xb9, 0xb2, 0x8c, 0x00, 0xb1, 0x11, 0xc0, 0x06, 0xf2, + 0x73, 0xe2, 0x24, 0xc8, 0x22, 0x17, 0x1f, 0x62, 0x04, 0x39, 0xe4, 0x1a, 0x24, 0x48, 0x72, 0xf1, + 0xcd, 0x80, 0x61, 0xc0, 0x40, 0x6e, 0x4e, 0xb0, 0x48, 0x16, 0x48, 0x80, 0x7c, 0x6e, 0x41, 0x72, + 0xf0, 0x29, 0xa8, 0x57, 0x55, 0xdd, 0xd5, 0x1f, 0x52, 0x23, 0xef, 0x3a, 0x89, 0x01, 0x9f, 0x66, + 0xf8, 0xea, 0xbd, 0xd7, 0xf5, 0xaf, 0x57, 0xaf, 0xde, 0x47, 0xcd, 0x99, 0x68, 0x29, 0xa5, 0x7d, + 0x3d, 0x07, 0x5b, 0xb3, 0xd6, 0x0b, 0x79, 0x33, 0xab, 0x0f, 0xd8, 0xc3, 0x85, 0x0c, 0x97, 0x1f, + 0x2e, 0xa4, 0xaf, 0x91, 0x3b, 0x10, 0x7a, 0x44, 0x3d, 0x2d, 0xba, 0x81, 0x80, 0x51, 0x9a, 0x91, + 0x13, 0x04, 0x8f, 0xe9, 0x96, 0x90, 0x97, 0x02, 0xda, 0x72, 0x98, 0x4c, 0x23, 0x60, 0xe4, 0x35, + 0x80, 0xde, 0xc0, 0x0f, 0x5c, 0xb4, 0x0f, 0xe0, 0xb2, 0x06, 0x33, 0x0b, 0x0f, 0xa1, 0xf2, 0x83, + 0x30, 0x42, 0x2b, 0x7e, 0xdf, 0xe5, 0x03, 0xe8, 0xc0, 0xe6, 0x8c, 0x0d, 0x92, 0x0e, 0x4f, 0x94, + 0x1d, 0x5e, 0xe4, 0x9a, 0x9a, 0x86, 0x39, 0xe2, 0x93, 0x3d, 0x9e, 0x9b, 0x35, 0x47, 0x9e, 0x00, + 0x49, 0xef, 0x82, 0x94, 0x3b, 0x37, 0x6e, 0x9e, 0x8e, 0x43, 0xee, 0x0c, 0xd2, 0x1d, 0x0f, 0xc8, + 0x15, 0x28, 0x89, 0x5c, 0x92, 0x54, 0x96, 0x67, 0xcc, 0x81, 0x83, 0xee, 0xb9, 0x38, 0x79, 0x30, + 0x62, 0x29, 0xfa, 0xbd, 0x71, 0x29, 0x61, 0x19, 0x21, 0x9d, 0x27, 0x23, 0xd1, 0xba, 0x8b, 0x62, + 0x7e, 0xc7, 0xcf, 0x26, 0x5e, 0xfa, 0x87, 0x8a, 0x18, 0xfe, 0xf4, 0xe6, 0xfe, 0xb4, 0xfa, 0x11, + 0x40, 0x2f, 0x25, 0x5e, 0x31, 0xfc, 0x9f, 0x4a, 0x2d, 0x62, 0xd5, 0x71, 0xa9, 0x85, 0xff, 0x24, + 0x37, 0x60, 0x7d, 0xcc, 0xec, 0x58, 0x27, 0x3e, 0xef, 0x4f, 0x96, 0xb7, 0x63, 0x95, 0x81, 0x3b, + 0x3e, 0xf6, 0x29, 0xaf, 0xd7, 0xdd, 0xb0, 0xc3, 0xa4, 0xb3, 0x8e, 0xbc, 0x0c, 0xcb, 0xf4, 0xac, + 0xc3, 0x48, 0x37, 0x09, 0xf7, 0x08, 0xc4, 0x43, 0xc9, 0xc1, 0x2c, 0x7e, 0x89, 0xff, 0xcf, 0x79, + 0xbd, 0x9d, 0x13, 0xcc, 0xe4, 0x93, 0x96, 0x6c, 0xc2, 0x92, 0x3f, 0x3e, 0x94, 0x9a, 0xb6, 0xe8, + 0x8f, 0x0f, 0x69, 0xbb, 0x6e, 0x82, 0xca, 0xbc, 0x75, 0x58, 0x18, 0x84, 0xe0, 0xc9, 0x90, 0x5d, + 0xc5, 0x8b, 0xe6, 0x1a, 0x83, 0x63, 0xc2, 0xfc, 0x27, 0xc3, 0x1e, 0xc5, 0x0c, 0x02, 0xdf, 0x96, + 0x03, 0x5c, 0xf1, 0x66, 0xaf, 0x05, 0x81, 0x1f, 0x45, 0xba, 0xea, 0x93, 0x6d, 0x58, 0xa5, 0x7c, + 0xc2, 0x30, 0x5b, 0x5c, 0x10, 0xb8, 0x94, 0x16, 0x04, 0x9e, 0x0c, 0x7b, 0xa2, 0x8a, 0xe6, 0x4a, + 0x20, 0xfd, 0x22, 0xf7, 0x40, 0x95, 0x24, 0x26, 0xf4, 0xc7, 0x4c, 0xd8, 0x54, 0x47, 0x6c, 0x24, + 0x49, 0xab, 0x36, 0x3c, 0xf0, 0xcd, 0xf5, 0x5e, 0x1c, 0xc0, 0xbb, 0xe6, 0xbb, 0x8a, 0xd8, 0x4b, + 0x33, 0x88, 0x88, 0x06, 0xab, 0x47, 0x4e, 0x60, 0x07, 0xc1, 0x31, 0xb3, 0x11, 0xe3, 0x81, 0x7d, + 0x4b, 0x47, 0x4e, 0x60, 0x05, 0xc7, 0x22, 0x71, 0xc8, 0x59, 0x8a, 0xe3, 0x3b, 0xd3, 0xc9, 0x91, + 0x2d, 0xcb, 0x7f, 0xac, 0xc7, 0x4e, 0x1f, 0x39, 0x41, 0x8b, 0x96, 0x49, 0xbc, 0xc9, 0x35, 0x58, + 0x43, 0xbe, 0x3d, 0x4f, 0x30, 0xc6, 0x50, 0x16, 0xe6, 0x0a, 0x65, 0xdc, 0xf3, 0x18, 0x67, 0x5e, + 0xc3, 0x7f, 0xcd, 0xc1, 0xb9, 0xec, 0xde, 0xc1, 0xe9, 0x49, 0xfb, 0x14, 0x7d, 0xf4, 0x78, 0xdd, + 0x96, 0x29, 0x84, 0x85, 0x21, 0xc9, 0x1a, 0x9c, 0x5c, 0xe6, 0xe0, 0x94, 0x61, 0x03, 0x19, 0x71, + 0x49, 0x73, 0xe0, 0x05, 0x13, 0x1e, 0x5d, 0xc3, 0x5c, 0xa7, 0x05, 0x6c, 0x3f, 0xaf, 0x53, 0x30, + 0xb9, 0x0e, 0x6b, 0x62, 0x47, 0xf6, 0x1f, 0x0f, 0xe9, 0x87, 0xd9, 0x76, 0xbc, 0xca, 0xa1, 0x2d, + 0x04, 0x92, 0xb3, 0xb0, 0xe8, 0x8c, 0x46, 0xf4, 0x93, 0x6c, 0x17, 0x5e, 0x70, 0x46, 0x23, 0x96, + 0xdc, 0x06, 0x3d, 0x12, 0xed, 0x03, 0xb4, 0x12, 0xe2, 0x26, 0x89, 0xe6, 0x0a, 0x02, 0x99, 0xe5, + 0x50, 0x40, 0xd7, 0x3d, 0xa5, 0x15, 0x28, 0x4b, 0x88, 0x02, 0xce, 0x28, 0x44, 0x78, 0x0e, 0x8a, + 0xe2, 0xbd, 0x9a, 0x39, 0x56, 0x98, 0x4b, 0x0e, 0x7f, 0xab, 0x7e, 0x15, 0x36, 0xfb, 0x5e, 0x80, + 0x93, 0x97, 0x35, 0x69, 0x34, 0xe2, 0x3e, 0x90, 0x2c, 0x48, 0xae, 0x79, 0x86, 0x17, 0xd3, 0x9e, + 0xd4, 0x47, 0x23, 0xe6, 0x09, 0xc9, 0xfb, 0xfa, 0x75, 0x58, 0xe7, 0x12, 0x17, 0x3f, 0x22, 0xb1, + 0x2e, 0x7c, 0x01, 0xd3, 0xab, 0x10, 0x4f, 0x27, 0x04, 0x1c, 0x54, 0xeb, 0x0b, 0xca, 0x7f, 0x50, + 0xe0, 0x6c, 0xa6, 0xc8, 0x46, 0xbe, 0x08, 0xcc, 0xe5, 0x6b, 0xe2, 0xdb, 0x63, 0xb7, 0xe7, 0x8d, + 0x3c, 0x0c, 0x8a, 0xc1, 0x54, 0x9a, 0x77, 0xe6, 0x09, 0x7b, 0xe8, 0x3e, 0xd6, 0xf1, 0xcd, 0x90, + 0x88, 0xe9, 0x5a, 0xd4, 0x71, 0x02, 0x7c, 0xfe, 0x21, 0x9c, 0xcd, 0x44, 0xcd, 0xd0, 0x81, 0x7c, + 0x30, 0x9e, 0xcc, 0x59, 0x3c, 0x52, 0x25, 0x1a, 0x2d, 0xe9, 0x46, 0x78, 0xf3, 0xbe, 0x1f, 0x36, + 0x2f, 0x21, 0xdc, 0x11, 0x23, 0xb9, 0xae, 0xb3, 0xee, 0x27, 0x82, 0x68, 0xf6, 0xd2, 0x7e, 0x08, + 0x67, 0xf9, 0xe4, 0x3b, 0x1c, 0x3b, 0xa3, 0xa3, 0x88, 0x1d, 0xab, 0xe8, 0x07, 0xb2, 0xd8, 0xb1, + 0x59, 0xb9, 0x47, 0xf1, 0x43, 0xae, 0xa7, 0x9d, 0x34, 0x90, 0xb7, 0xe1, 0x1b, 0x39, 0xb1, 0xd4, + 0x33, 0xaa, 0x93, 0x31, 0xad, 0x95, 0xac, 0x69, 0x7d, 0xf2, 0x35, 0xd5, 0x04, 0x22, 0x6f, 0x56, + 0x4c, 0xeb, 0xc9, 0x0d, 0xaa, 0x84, 0x9c, 0xce, 0x2b, 0x22, 0x6d, 0x0d, 0x16, 0x4b, 0xa6, 0xb9, + 0xd1, 0x4b, 0x82, 0xc8, 0x05, 0x58, 0x0e, 0xf3, 0x55, 0xf3, 0x83, 0xa3, 0xc8, 0x00, 0xb5, 0x3e, + 0x79, 0x1e, 0x56, 0x98, 0x48, 0x1e, 0x5b, 0x73, 0x80, 0x30, 0x9d, 0x2e, 0x3c, 0xd1, 0x07, 0x0a, + 0x3c, 0xff, 0xb4, 0x3e, 0x24, 0xf7, 0xe1, 0x1c, 0x9a, 0x75, 0x04, 0x7e, 0x38, 0x0c, 0x76, 0xcf, + 0xe9, 0x1d, 0xb9, 0x7c, 0xd6, 0x6a, 0x99, 0x83, 0x31, 0x1a, 0x59, 0x56, 0x4b, 0x1a, 0x87, 0xd1, + 0xc8, 0x0a, 0x7c, 0xf1, 0xbb, 0x42, 0xc9, 0x79, 0x1d, 0xfa, 0x70, 0x61, 0x0e, 0xa5, 0xb4, 0x71, + 0x28, 0xf2, 0xc6, 0x71, 0x13, 0xd4, 0x03, 0xb7, 0x4f, 0x65, 0x62, 0xb7, 0x8f, 0x55, 0x7b, 0xeb, + 0x0e, 0xcb, 0xd0, 0x6e, 0xae, 0x85, 0x70, 0x2b, 0xf0, 0xf7, 0xef, 0xf0, 0xaf, 0x1c, 0x8b, 0x23, + 0x4f, 0xbe, 0x56, 0x90, 0x97, 0xe1, 0x74, 0x22, 0xe0, 0x48, 0xe4, 0xc1, 0x6e, 0x6e, 0xd0, 0xa2, + 0x78, 0x78, 0xaa, 0xab, 0xb0, 0x22, 0x66, 0xc5, 0x38, 0xf4, 0x83, 0x33, 0x4b, 0x1c, 0x46, 0x57, + 0x1d, 0xff, 0xdc, 0x54, 0x34, 0x2a, 0xf3, 0x46, 0x72, 0x02, 0x59, 0x9a, 0xbc, 0x04, 0x24, 0x94, + 0xdb, 0xc3, 0x8d, 0x82, 0x7f, 0x70, 0x43, 0x94, 0x84, 0x2b, 0x9c, 0x7f, 0xf6, 0x6f, 0x73, 0x70, + 0x3a, 0xe3, 0x2a, 0x43, 0x2f, 0x01, 0xde, 0x70, 0xe2, 0x1e, 0xb2, 0x2b, 0x84, 0xdc, 0xc8, 0x75, + 0x09, 0xce, 0xf5, 0x53, 0x8b, 0x2c, 0x03, 0x39, 0xff, 0x16, 0xff, 0x45, 0x37, 0x0f, 0x67, 0x2c, + 0x54, 0x2f, 0xf4, 0x5f, 0x52, 0x83, 0x0d, 0x4c, 0xab, 0x10, 0x78, 0x3e, 0x66, 0x67, 0x40, 0x21, + 0xa4, 0x10, 0xbb, 0xec, 0x60, 0x2d, 0xda, 0x12, 0x12, 0x95, 0x42, 0x4c, 0x75, 0x94, 0x80, 0x90, + 0x8f, 0xc1, 0x79, 0xe9, 0xac, 0xb1, 0x13, 0x2b, 0x0f, 0x2d, 0xdd, 0xcd, 0x4d, 0x27, 0x3c, 0x75, + 0x76, 0x62, 0x6b, 0x70, 0x1b, 0x2e, 0xe3, 0x20, 0x7a, 0xfd, 0x91, 0x9d, 0xca, 0xc3, 0x81, 0x4d, + 0x65, 0x81, 0xeb, 0xcf, 0x53, 0xac, 0x5a, 0x7f, 0x94, 0x48, 0xc9, 0x41, 0x5b, 0xcd, 0xbb, 0xef, + 0x21, 0x9c, 0xcd, 0xac, 0x31, 0x3d, 0x60, 0xd0, 0x90, 0x2a, 0x92, 0x8d, 0x96, 0xe8, 0x6f, 0x2a, + 0x1c, 0x5d, 0x85, 0x95, 0x47, 0xae, 0x33, 0x76, 0xc7, 0xfc, 0xe4, 0xe6, 0x53, 0x82, 0xc1, 0xe4, + 0x83, 0xbb, 0x1f, 0x1f, 0x1a, 0xae, 0x33, 0x22, 0x0d, 0x38, 0xcd, 0x4e, 0x40, 0xef, 0x18, 0x85, + 0x41, 0xae, 0x67, 0x52, 0x62, 0xe2, 0x10, 0x92, 0xe0, 0xd1, 0x54, 0x43, 0x2c, 0x46, 0x6d, 0x6e, + 0x1c, 0x26, 0x41, 0x74, 0x45, 0x9f, 0xcb, 0xc6, 0x26, 0xdb, 0x50, 0x62, 0xcc, 0xd9, 0xb5, 0x80, + 0x3d, 0x10, 0x5c, 0x9d, 0xfb, 0x85, 0x0a, 0xda, 0x17, 0x07, 0xe1, 0xff, 0xf4, 0xbc, 0xc6, 0xb7, + 0x58, 0xfb, 0x58, 0x7e, 0xff, 0x30, 0x57, 0x10, 0xc8, 0xdf, 0x3d, 0xb4, 0xbf, 0x53, 0x44, 0x53, + 0x63, 0x97, 0x63, 0x3a, 0xb5, 0x02, 0x77, 0x28, 0xde, 0x80, 0x96, 0x4d, 0xfe, 0xeb, 0x19, 0xa7, + 0x3a, 0x79, 0x0d, 0x56, 0x28, 0xdb, 0xc3, 0xe9, 0x90, 0x4d, 0xb9, 0x7c, 0x2c, 0xd0, 0x4e, 0x83, + 0x15, 0xd1, 0x61, 0xab, 0x9e, 0x32, 0x4b, 0xc7, 0xd1, 0x4f, 0x2a, 0x2d, 0x07, 0xc7, 0x93, 0x91, + 0x3c, 0x51, 0x85, 0xa2, 0xd0, 0x6a, 0x74, 0xda, 0x9c, 0xa4, 0x48, 0x71, 0x22, 0x69, 0x79, 0x7b, + 0x91, 0xa9, 0x0a, 0xb5, 0x17, 0xa1, 0x24, 0xf1, 0xa6, 0x8d, 0x61, 0x9e, 0x33, 0xa2, 0x31, 0xec, + 0x17, 0x1f, 0xec, 0x47, 0x50, 0x14, 0x2c, 0xe9, 0xb5, 0xe0, 0xc8, 0x0f, 0xc4, 0x22, 0xc7, 0xff, + 0x29, 0x8c, 0xf6, 0x32, 0x36, 0x72, 0xc1, 0xc4, 0xff, 0xf1, 0x2c, 0x99, 0x38, 0xf4, 0x3e, 0x30, + 0x08, 0xec, 0x11, 0x5a, 0x60, 0x85, 0xc2, 0x33, 0x85, 0x77, 0x06, 0x01, 0xb3, 0xcb, 0xe2, 0xdf, + 0xf8, 0xab, 0xf0, 0x10, 0x4e, 0x68, 0x13, 0x66, 0xed, 0x99, 0xb1, 0x23, 0x23, 0x97, 0x3e, 0x32, + 0x58, 0x00, 0x15, 0x4e, 0xc9, 0xbe, 0x0c, 0x08, 0xc3, 0x23, 0x43, 0xda, 0x19, 0x0a, 0xb1, 0x9d, + 0x41, 0xba, 0x93, 0x47, 0xa3, 0xc7, 0x4e, 0x1c, 0x71, 0x27, 0x4f, 0xee, 0x53, 0x7f, 0x9a, 0x13, + 0x2a, 0x82, 0x6d, 0xdf, 0x9f, 0x04, 0x93, 0xb1, 0x33, 0x8a, 0xa9, 0x42, 0xc9, 0x31, 0x3c, 0x87, + 0x12, 0xf4, 0x1d, 0x4c, 0x61, 0xe1, 0x8f, 0x45, 0xcc, 0x8e, 0x70, 0xe6, 0x96, 0xee, 0x7c, 0x28, + 0x2e, 0xe3, 0xeb, 0x14, 0x5b, 0x97, 0x91, 0xe9, 0x84, 0x95, 0xb8, 0x56, 0x4f, 0x99, 0x9b, 0x8c, + 0x67, 0x0a, 0x8b, 0x54, 0x33, 0x16, 0x71, 0x52, 0x17, 0xba, 0x1d, 0xad, 0xe8, 0x38, 0x57, 0x79, + 0xad, 0x93, 0x4f, 0xc0, 0xb2, 0xd7, 0x97, 0x33, 0x35, 0x26, 0xb5, 0x70, 0xb5, 0x3e, 0x8b, 0x16, + 0x1d, 0xf1, 0xa0, 0x73, 0xce, 0xe3, 0xd0, 0xed, 0xd5, 0x98, 0xd2, 0x58, 0xdb, 0x16, 0xb7, 0xd1, + 0x34, 0x19, 0x59, 0x83, 0x5c, 0x38, 0xc2, 0x39, 0xaf, 0xcf, 0x96, 0x57, 0x14, 0xaf, 0xda, 0xe4, + 0xbf, 0xb4, 0x5f, 0x85, 0x9b, 0x27, 0xed, 0x23, 0xba, 0x14, 0x67, 0x74, 0xf8, 0xb2, 0xb9, 0xe1, + 0xa4, 0xfa, 0xed, 0x2a, 0xc8, 0xe1, 0x76, 0x3d, 0xb1, 0xf9, 0x09, 0x58, 0x77, 0xec, 0x69, 0x7f, + 0x99, 0x87, 0xb5, 0xb8, 0x9a, 0x9c, 0xbc, 0x08, 0x05, 0x69, 0x07, 0xda, 0xcc, 0xd0, 0xa5, 0xe3, + 0xbe, 0x83, 0x48, 0x27, 0xda, 0x71, 0xc8, 0x5d, 0x58, 0x43, 0xc3, 0x3d, 0x14, 0x3d, 0x27, 0x1e, + 0x7f, 0x7c, 0x99, 0xff, 0x7e, 0x56, 0xfc, 0xc1, 0x3b, 0x57, 0x4e, 0xe1, 0x53, 0xd9, 0x0a, 0xa5, + 0xa5, 0xd2, 0x1f, 0x2d, 0x94, 0xb4, 0xa0, 0x85, 0xd9, 0x5a, 0x50, 0xde, 0x94, 0x19, 0x5a, 0xd0, + 0x85, 0x39, 0x5a, 0xd0, 0x88, 0x52, 0xd6, 0x82, 0xa2, 0x2e, 0x7c, 0x69, 0x96, 0x2e, 0x3c, 0xa2, + 0x61, 0xba, 0xf0, 0x48, 0x8b, 0x59, 0x9c, 0xa9, 0xc5, 0x8c, 0x68, 0xb8, 0x16, 0xf3, 0x1a, 0xef, + 0xa3, 0xb1, 0xf3, 0xd8, 0xc6, 0xce, 0xe3, 0xc7, 0x22, 0xb6, 0xde, 0x74, 0x1e, 0xa3, 0x71, 0xcd, + 0xf6, 0x32, 0x08, 0x8b, 0x1c, 0xed, 0xf7, 0x95, 0x84, 0x26, 0x50, 0x8c, 0xdf, 0x75, 0x58, 0x63, + 0x87, 0x95, 0xdb, 0x97, 0xee, 0x9a, 0xab, 0xe6, 0xaa, 0x80, 0xb2, 0xfb, 0xe6, 0x07, 0x60, 0x3d, + 0x44, 0xe3, 0x57, 0x2e, 0xf4, 0xd4, 0x33, 0x43, 0x6a, 0x1e, 0x76, 0xe6, 0x45, 0xd8, 0x08, 0x11, + 0xb9, 0x36, 0x87, 0x5d, 0x37, 0x57, 0x4d, 0x55, 0x14, 0xb4, 0x39, 0x5c, 0x3b, 0x4c, 0xde, 0x3c, + 0x7e, 0x4e, 0xb5, 0xd2, 0xbe, 0x9f, 0x8f, 0x69, 0x49, 0xc4, 0x67, 0xe8, 0x29, 0x1a, 0xf8, 0x36, + 0xef, 0x24, 0xbe, 0x17, 0x5d, 0x9d, 0x31, 0x66, 0xdc, 0xa6, 0xc9, 0xb2, 0x5a, 0x26, 0x04, 0x81, + 0x2f, 0x4c, 0x9c, 0x6c, 0x26, 0x51, 0xb3, 0x73, 0x1f, 0xe7, 0xac, 0x60, 0xc7, 0x36, 0x9e, 0xf2, + 0x7c, 0x76, 0xe2, 0x9a, 0x4a, 0xa7, 0x2c, 0x4a, 0xd6, 0xe1, 0x2f, 0xf1, 0x81, 0x2e, 0xa0, 0x52, + 0x31, 0x88, 0x33, 0xcf, 0x67, 0xdc, 0x9d, 0x52, 0xcc, 0xb1, 0x97, 0x90, 0xb3, 0x3a, 0x15, 0xff, + 0x0a, 0xb6, 0x06, 0xac, 0xa0, 0x8e, 0x42, 0x30, 0x2c, 0x64, 0xa8, 0xe0, 0xd3, 0x8d, 0xaf, 0xd4, + 0x1a, 0x66, 0x89, 0xd2, 0x09, 0x36, 0x47, 0xf0, 0x9c, 0xac, 0x59, 0x88, 0x57, 0x72, 0x41, 0x44, + 0xd1, 0x9d, 0xdb, 0x03, 0x91, 0x02, 0x02, 0xab, 0x7a, 0xce, 0x89, 0x03, 0x38, 0x9a, 0x76, 0x04, + 0xe7, 0x67, 0x0f, 0xc9, 0x9c, 0x0c, 0x4d, 0xd1, 0x01, 0x9a, 0x93, 0x0f, 0x50, 0x59, 0xcf, 0x90, + 0x8f, 0xe9, 0x19, 0xb4, 0x3f, 0xc9, 0xc3, 0x0b, 0x27, 0x18, 0xae, 0x39, 0xdf, 0xfc, 0x54, 0x5c, + 0x3c, 0xcb, 0xc5, 0x6e, 0x86, 0x94, 0x29, 0xdf, 0x20, 0xe9, 0x2d, 0x35, 0x5b, 0x38, 0xfb, 0x22, + 0xac, 0xb3, 0x5d, 0x90, 0x99, 0x25, 0x1e, 0x4c, 0x07, 0x27, 0xd8, 0x06, 0x2f, 0x08, 0x1f, 0xaa, + 0x04, 0x29, 0xee, 0x8c, 0xb8, 0x63, 0x58, 0x21, 0x8c, 0x74, 0xa0, 0x84, 0x68, 0x07, 0x8e, 0x37, + 0x38, 0x91, 0x33, 0x8f, 0xf0, 0xd0, 0x92, 0xc9, 0x98, 0x35, 0x35, 0x05, 0xec, 0xe2, 0x6f, 0x72, + 0x03, 0xd6, 0x87, 0xd3, 0x63, 0x2a, 0x78, 0xb0, 0xb9, 0xc0, 0xad, 0x3f, 0x16, 0xcc, 0xd5, 0xe1, + 0xf4, 0x58, 0x1f, 0x8d, 0x70, 0x48, 0xd1, 0x4c, 0x64, 0x83, 0xe2, 0xb1, 0x55, 0x2b, 0x30, 0x17, + 0x11, 0x93, 0x32, 0x60, 0xeb, 0x96, 0xe3, 0x9e, 0x01, 0x66, 0x34, 0xc8, 0x33, 0x54, 0xb1, 0x1f, + 0xda, 0x7f, 0xe7, 0xc4, 0x7d, 0x77, 0xf6, 0xbc, 0xff, 0xe5, 0x10, 0x65, 0x0c, 0xd1, 0x4d, 0x50, + 0x69, 0xd7, 0x47, 0x9b, 0x4a, 0x38, 0x46, 0x6b, 0xc3, 0xe9, 0x71, 0xd8, 0x77, 0x72, 0xc7, 0x2f, + 0xca, 0x1d, 0xff, 0x9a, 0xb8, 0x0f, 0x67, 0x6e, 0x0f, 0xb3, 0xbb, 0x5c, 0xfb, 0x8f, 0x3c, 0xdc, + 0x38, 0xd9, 0x26, 0xf0, 0xcb, 0x71, 0xcb, 0x18, 0xb7, 0x84, 0xea, 0x74, 0x21, 0xa5, 0x3a, 0xcd, + 0x58, 0x7b, 0x8b, 0x59, 0x6b, 0x2f, 0xa5, 0xa8, 0x5d, 0xca, 0x50, 0xd4, 0x66, 0x2e, 0xd0, 0xe2, + 0x53, 0x16, 0xe8, 0xb2, 0x3c, 0x4f, 0xfe, 0x25, 0x54, 0x60, 0xc4, 0xef, 0x03, 0x0f, 0xe1, 0xb4, + 0xb8, 0x0f, 0xb0, 0x93, 0x23, 0xd2, 0xbf, 0x97, 0xee, 0xdc, 0xca, 0xba, 0x09, 0x20, 0x5a, 0x86, + 0xb4, 0xbe, 0xc1, 0xef, 0x00, 0x51, 0xf9, 0xff, 0x1f, 0xe9, 0x9f, 0x3c, 0x80, 0x73, 0x18, 0xdf, + 0xbd, 0x27, 0xbf, 0x1c, 0xd8, 0x63, 0xf7, 0x80, 0xcf, 0x87, 0xab, 0x29, 0x59, 0xd9, 0xeb, 0x49, + 0xd5, 0x31, 0xdd, 0x83, 0xea, 0x29, 0xf3, 0x4c, 0x90, 0x01, 0x4f, 0x5e, 0x2c, 0xfe, 0x5c, 0x01, + 0xed, 0xe9, 0xfd, 0x85, 0x8a, 0xaa, 0x64, 0x87, 0x2f, 0x9b, 0x25, 0x47, 0xea, 0xbd, 0x17, 0x60, + 0x75, 0xec, 0x1e, 0x8c, 0xdd, 0xe0, 0x28, 0xa6, 0x01, 0x59, 0xe1, 0x40, 0xd1, 0x31, 0x22, 0xca, + 0xe4, 0x33, 0x49, 0xe6, 0x82, 0x48, 0xdb, 0x0d, 0xef, 0x8b, 0x99, 0xe3, 0x40, 0x67, 0x93, 0x5c, + 0x41, 0xf6, 0xe3, 0x6e, 0xa1, 0x98, 0x53, 0xf3, 0x26, 0x8f, 0x85, 0x79, 0xe0, 0x0d, 0x5c, 0xed, + 0xaf, 0x15, 0x21, 0x11, 0x64, 0x75, 0x1e, 0x79, 0x28, 0x19, 0xf3, 0xe6, 0x53, 0x62, 0x48, 0x16, + 0x89, 0x6c, 0xf7, 0xc8, 0xc3, 0x33, 0x22, 0x20, 0x16, 0x9e, 0x11, 0x21, 0xef, 0xc1, 0x22, 0x91, + 0xdf, 0x9a, 0xdf, 0x10, 0x16, 0x41, 0x74, 0xcf, 0xdb, 0xbf, 0x4d, 0x6e, 0xc1, 0x12, 0x33, 0x02, + 0x12, 0xd5, 0x5d, 0x8f, 0x55, 0x77, 0xff, 0xb6, 0x29, 0xca, 0xb5, 0xb7, 0xc3, 0x77, 0xad, 0x54, + 0x23, 0xf6, 0x6f, 0x93, 0xd7, 0x4e, 0x66, 0x9c, 0x5b, 0x14, 0xc6, 0xb9, 0xa1, 0x61, 0xee, 0xeb, + 0x31, 0xc3, 0xdc, 0x6b, 0xf3, 0x7b, 0x8b, 0xbf, 0x46, 0xb2, 0x70, 0x84, 0x51, 0x98, 0xaa, 0x9f, + 0xe4, 0xe0, 0xd2, 0x5c, 0x0a, 0x72, 0x11, 0x8a, 0x7a, 0xbb, 0xd6, 0x89, 0xc6, 0x97, 0xae, 0x19, + 0x01, 0x21, 0x7b, 0xb0, 0xbc, 0xed, 0x04, 0x5e, 0x8f, 0x4e, 0xe3, 0xcc, 0xe7, 0x81, 0x14, 0xdb, + 0x10, 0xbd, 0x7a, 0xca, 0x8c, 0x68, 0x89, 0x0d, 0x1b, 0xb8, 0x16, 0x62, 0xa9, 0x9f, 0xf2, 0x19, + 0xba, 0x86, 0x14, 0xc3, 0x14, 0x19, 0xdd, 0x67, 0x52, 0x40, 0xf2, 0x08, 0x88, 0x65, 0x55, 0x2b, + 0xee, 0x78, 0xc2, 0xef, 0xe0, 0x13, 0x2f, 0xb4, 0xf4, 0xfc, 0xf0, 0x53, 0xfa, 0x2e, 0x45, 0x57, + 0x3d, 0x65, 0x66, 0x70, 0x4b, 0x2e, 0xf3, 0xb7, 0x84, 0xbc, 0x33, 0xbb, 0x13, 0x9e, 0x21, 0x76, + 0xeb, 0x4d, 0x28, 0xb6, 0x85, 0x2d, 0x82, 0x64, 0x31, 0x2f, 0xec, 0x0e, 0xcc, 0xb0, 0x54, 0xfb, + 0x2d, 0x45, 0x28, 0x1d, 0x9e, 0xde, 0x59, 0x52, 0x66, 0xae, 0xfe, 0xfc, 0xcc, 0x5c, 0xfd, 0x9f, + 0x31, 0x33, 0x97, 0xe6, 0xc1, 0xad, 0x13, 0x77, 0x2c, 0xf9, 0x38, 0xa8, 0x98, 0xc4, 0xc8, 0x91, + 0x06, 0x89, 0xad, 0xaf, 0x8d, 0x30, 0x98, 0x77, 0x95, 0x67, 0x8a, 0x33, 0xd7, 0x7b, 0x71, 0x6a, + 0xed, 0xcf, 0x78, 0x10, 0xf7, 0x5a, 0xbf, 0x9d, 0x50, 0x34, 0xbf, 0x57, 0x27, 0x0b, 0x23, 0xb6, + 0xd8, 0x5e, 0x90, 0x92, 0x48, 0xa6, 0xbf, 0x35, 0xdb, 0xd7, 0x42, 0x5a, 0x79, 0x7f, 0x94, 0x87, + 0x8b, 0xf3, 0xc8, 0x33, 0xd3, 0x54, 0x2b, 0xcf, 0x96, 0xa6, 0xfa, 0x16, 0x14, 0x19, 0x2c, 0xf4, + 0x20, 0xc0, 0xb1, 0xe5, 0xa4, 0x74, 0x6c, 0x45, 0x31, 0x79, 0x01, 0x16, 0xf5, 0x8a, 0x15, 0x65, + 0x4e, 0x43, 0x53, 0x5f, 0xa7, 0x17, 0xa0, 0x11, 0x29, 0x2f, 0x22, 0x5f, 0x48, 0x27, 0x0b, 0xe4, + 0x29, 0xd3, 0x2e, 0x48, 0x1d, 0x92, 0xca, 0xaf, 0x80, 0xf5, 0x8d, 0xf2, 0x01, 0xf0, 0x10, 0xdb, + 0x66, 0x3a, 0xf1, 0xa0, 0x06, 0x8b, 0xed, 0xb1, 0x1b, 0xb8, 0x13, 0xd9, 0x0c, 0x77, 0x84, 0x10, + 0x93, 0x97, 0x70, 0x23, 0x59, 0xe7, 0x09, 0x8b, 0x89, 0xb0, 0x28, 0xc7, 0xa9, 0x41, 0xab, 0x5a, + 0x0a, 0x36, 0x25, 0x14, 0x4a, 0x50, 0x77, 0xa6, 0xc3, 0xde, 0x51, 0xd7, 0xac, 0x73, 0xc9, 0x89, + 0x11, 0x0c, 0x10, 0x4a, 0x1b, 0x18, 0x98, 0x12, 0x8a, 0xf6, 0x2d, 0x05, 0xce, 0x64, 0xb5, 0x83, + 0x5c, 0x84, 0xc2, 0x30, 0x33, 0x2f, 0xe2, 0x90, 0xb9, 0x72, 0x97, 0xe8, 0x5f, 0xfb, 0xc0, 0x1f, + 0x1f, 0x3b, 0x13, 0xd9, 0x58, 0x59, 0x02, 0x9b, 0x40, 0x7f, 0xec, 0xe2, 0xff, 0xe4, 0x8a, 0x38, + 0x72, 0xf2, 0xa9, 0x4c, 0x8a, 0xf8, 0x47, 0xd3, 0x01, 0x6a, 0xfd, 0x76, 0x6b, 0xc4, 0xe2, 0xfb, + 0xbf, 0x02, 0x05, 0x5a, 0xad, 0xc4, 0xec, 0xa5, 0xf3, 0x47, 0x6f, 0xd4, 0x39, 0x12, 0xab, 0x55, + 0xe0, 0x1c, 0x0f, 0x4c, 0x44, 0xd6, 0xee, 0xc3, 0x5a, 0x1c, 0x83, 0x18, 0xf1, 0x88, 0xb0, 0xa5, + 0x3b, 0x2a, 0xe7, 0xb4, 0xed, 0xfb, 0xcc, 0x61, 0x66, 0xfb, 0xb9, 0x9f, 0xbc, 0x73, 0x05, 0xe8, + 0x4f, 0x46, 0x93, 0x15, 0x31, 0x56, 0xfb, 0x76, 0x0e, 0xce, 0x44, 0x3e, 0xfa, 0x62, 0x0d, 0xfd, + 0xc2, 0x3a, 0x8c, 0xea, 0x31, 0x87, 0x46, 0x21, 0x37, 0xa6, 0x1b, 0x38, 0xc7, 0x8f, 0x6a, 0x0f, + 0xb6, 0x66, 0xe1, 0x93, 0x17, 0x61, 0x19, 0xc3, 0x3a, 0x8d, 0x9c, 0x9e, 0x2b, 0x6f, 0xb3, 0x43, + 0x01, 0x34, 0xa3, 0x72, 0xed, 0x47, 0x0a, 0x9c, 0xe7, 0x6e, 0x1e, 0x0d, 0xc7, 0x1b, 0xe2, 0x2b, + 0x41, 0xcf, 0x7d, 0x7f, 0x1c, 0x9e, 0xf7, 0x62, 0xfb, 0xd8, 0xf5, 0xb8, 0x37, 0x4f, 0xea, 0x6b, + 0xb3, 0x5b, 0x4b, 0x6e, 0x61, 0xa8, 0x32, 0xfe, 0x8a, 0x5e, 0x60, 0x01, 0x26, 0x86, 0x14, 0x20, + 0x07, 0x98, 0x40, 0x0c, 0xed, 0xd7, 0xe0, 0xf2, 0xfc, 0x0f, 0x90, 0xcf, 0xc3, 0x2a, 0xe6, 0xbe, + 0xea, 0x8e, 0x0e, 0xc7, 0x4e, 0xdf, 0x15, 0x9a, 0x3d, 0xa1, 0x8d, 0x95, 0xcb, 0x58, 0xe4, 0x35, + 0x1e, 0xf0, 0xe0, 0x10, 0xb3, 0x6a, 0x71, 0xa2, 0x98, 0x2f, 0x95, 0xcc, 0x4d, 0xfb, 0xba, 0x02, + 0x24, 0xcd, 0x83, 0x7c, 0x04, 0x56, 0xba, 0x9d, 0x8a, 0x35, 0x71, 0xc6, 0x93, 0xaa, 0x3f, 0x1d, + 0xf3, 0xb0, 0x67, 0xcc, 0xff, 0x7d, 0xd2, 0xb3, 0xd9, 0x7b, 0xd0, 0x91, 0x3f, 0x1d, 0x9b, 0x31, + 0x3c, 0x4c, 0xda, 0xe4, 0xba, 0x5f, 0xee, 0x3b, 0x4f, 0xe2, 0x49, 0x9b, 0x38, 0x2c, 0x96, 0xb4, + 0x89, 0xc3, 0xb4, 0xef, 0x29, 0x70, 0x41, 0x18, 0x47, 0xf6, 0x33, 0xea, 0x52, 0xc1, 0x28, 0x2f, + 0x63, 0x11, 0x67, 0x77, 0x9e, 0x84, 0xbe, 0x21, 0x02, 0x21, 0x61, 0x05, 0x51, 0x54, 0x67, 0xb4, + 0xe4, 0x53, 0x50, 0xb0, 0x26, 0xfe, 0xe8, 0x04, 0x91, 0x90, 0xd4, 0x70, 0x44, 0x27, 0xfe, 0x08, + 0x59, 0x20, 0xa5, 0xe6, 0xc2, 0x19, 0xb9, 0x72, 0xa2, 0xc6, 0xa4, 0x01, 0x4b, 0x3c, 0xe4, 0x5d, + 0xc2, 0xee, 0x60, 0x4e, 0x9b, 0xb6, 0xd7, 0x45, 0xb8, 0x25, 0x1e, 0xe7, 0xd5, 0x14, 0x3c, 0xb4, + 0xdf, 0x51, 0xa0, 0x44, 0x05, 0x1b, 0xbc, 0x94, 0xbe, 0xd7, 0x29, 0x1d, 0x97, 0x83, 0x85, 0x19, + 0x4d, 0xc8, 0xfe, 0x44, 0xa7, 0xf1, 0xab, 0xb0, 0x9e, 0x20, 0x20, 0x1a, 0x06, 0xda, 0x18, 0x78, + 0x3d, 0x87, 0xe5, 0x80, 0x61, 0x26, 0x28, 0x31, 0x98, 0xf6, 0x1b, 0x0a, 0x9c, 0x69, 0x7d, 0x79, + 0xe2, 0xb0, 0x67, 0x5b, 0x73, 0x3a, 0x10, 0xeb, 0x9d, 0x0a, 0x6b, 0xc2, 0xca, 0x96, 0x05, 0x01, + 0x60, 0xc2, 0x1a, 0x87, 0x99, 0x61, 0x29, 0xa9, 0x42, 0x91, 0x9f, 0x2f, 0x01, 0x0f, 0xcf, 0x7a, + 0x59, 0xd2, 0x8d, 0x44, 0x8c, 0x39, 0x12, 0x6d, 0x09, 0x6e, 0x61, 0x9c, 0xc6, 0x0c, 0xa9, 0xb5, + 0xff, 0x54, 0x60, 0x73, 0x06, 0x0d, 0x79, 0x13, 0x16, 0xd0, 0x41, 0x91, 0x8f, 0xde, 0xc5, 0x19, + 0x9f, 0x98, 0xf4, 0x8e, 0xf6, 0x6f, 0xb3, 0x83, 0xe8, 0x98, 0xfe, 0x30, 0x19, 0x15, 0x79, 0x08, + 0xcb, 0x7a, 0xbf, 0xcf, 0x6f, 0x67, 0xb9, 0xd8, 0xed, 0x6c, 0xc6, 0x17, 0x5f, 0x0e, 0xf1, 0xd9, + 0xed, 0x8c, 0xb9, 0xca, 0xf4, 0xfb, 0x36, 0x77, 0xbe, 0x8c, 0xf8, 0x9d, 0xff, 0x38, 0xac, 0xc5, + 0x91, 0x9f, 0xc9, 0x5f, 0xec, 0x6d, 0x05, 0xd4, 0x78, 0x1d, 0x7e, 0x3e, 0x81, 0xa2, 0xb2, 0x86, + 0xf9, 0x29, 0x93, 0xea, 0xf7, 0x72, 0x70, 0x36, 0xb3, 0x87, 0xc9, 0x4b, 0xb0, 0xa8, 0x8f, 0x46, + 0xb5, 0x1d, 0x3e, 0xab, 0xb8, 0x84, 0x84, 0x4a, 0xef, 0xd8, 0xe5, 0x95, 0x21, 0x91, 0x57, 0xa0, + 0xc8, 0xac, 0x03, 0x76, 0xc4, 0x86, 0x83, 0x91, 0x6f, 0xb8, 0xe9, 0x42, 0x3c, 0x50, 0xaa, 0x40, + 0x24, 0xbb, 0xb0, 0xc6, 0x63, 0xc6, 0x98, 0xee, 0xa1, 0xfb, 0xd5, 0x30, 0x62, 0x3f, 0x26, 0x15, + 0x10, 0x9a, 0x74, 0x7b, 0xcc, 0xca, 0xe4, 0xa8, 0x29, 0x71, 0x2a, 0x52, 0x07, 0x15, 0x79, 0xca, + 0x9c, 0x58, 0xb4, 0x56, 0x8c, 0xe2, 0xc3, 0x2a, 0x31, 0x83, 0x57, 0x8a, 0x32, 0x1c, 0x2e, 0x3d, + 0x08, 0xbc, 0xc3, 0xe1, 0xb1, 0x3b, 0x9c, 0xfc, 0xfc, 0x86, 0x2b, 0xfa, 0xc6, 0x89, 0x86, 0xeb, + 0x0f, 0x0a, 0x6c, 0x31, 0x27, 0xc9, 0xa8, 0x44, 0x23, 0x05, 0xe8, 0x46, 0x89, 0x86, 0xde, 0xcf, + 0x78, 0x54, 0x94, 0x1d, 0x58, 0x62, 0xd1, 0x6a, 0xc4, 0xca, 0xb8, 0x94, 0x59, 0x05, 0x86, 0xb3, + 0x7f, 0x9b, 0x89, 0x2f, 0xcc, 0x53, 0x32, 0x30, 0x05, 0x29, 0xd9, 0x87, 0x52, 0x65, 0xe0, 0x3a, + 0xc3, 0xe9, 0xa8, 0x73, 0xb2, 0x17, 0xd4, 0x2d, 0xde, 0x96, 0x95, 0x1e, 0x23, 0xc3, 0x97, 0x57, + 0xdc, 0xc9, 0x65, 0x46, 0xa4, 0x13, 0x3a, 0x4f, 0x15, 0x50, 0xf1, 0xfa, 0xe1, 0x39, 0xfd, 0x93, + 0x04, 0x22, 0x5d, 0xdc, 0x33, 0x90, 0x7b, 0x57, 0xd9, 0xb0, 0x56, 0x77, 0x82, 0x49, 0x67, 0xec, + 0x0c, 0x03, 0x8c, 0x72, 0x79, 0x82, 0x28, 0x60, 0x17, 0x44, 0x06, 0x65, 0x54, 0x99, 0x4e, 0x42, + 0x52, 0xa6, 0x90, 0x8d, 0xb3, 0xa3, 0xf2, 0xd2, 0xae, 0x37, 0x74, 0x06, 0xde, 0xd7, 0x84, 0x8f, + 0x29, 0x93, 0x97, 0x0e, 0x04, 0xd0, 0x8c, 0xca, 0xb5, 0xcf, 0xa5, 0xc6, 0x8d, 0xd5, 0xb2, 0x04, + 0x4b, 0x3c, 0x02, 0x01, 0xf3, 0xc8, 0x6f, 0x1b, 0xcd, 0x9d, 0x5a, 0x73, 0x4f, 0x55, 0xc8, 0x1a, + 0x40, 0xdb, 0x6c, 0x55, 0x0c, 0xcb, 0xa2, 0xbf, 0x73, 0xf4, 0x37, 0x77, 0xd7, 0xdf, 0xed, 0xd6, + 0xd5, 0xbc, 0xe4, 0xb1, 0x5f, 0xd0, 0x7e, 0xa8, 0xc0, 0xb9, 0xec, 0xa1, 0x24, 0x1d, 0xc0, 0x98, + 0x0d, 0xfc, 0x2d, 0xfd, 0x23, 0x73, 0xc7, 0x3d, 0x13, 0x9c, 0x8c, 0xfd, 0x30, 0x61, 0x31, 0x05, + 0x72, 0xe2, 0xed, 0x8b, 0x39, 0x29, 0x7a, 0x7d, 0x33, 0xe7, 0xf5, 0xb5, 0x0a, 0x6c, 0xcd, 0xe2, + 0x11, 0x6f, 0xea, 0x3a, 0x94, 0xf4, 0x76, 0xbb, 0x5e, 0xab, 0xe8, 0x9d, 0x5a, 0xab, 0xa9, 0x2a, + 0x64, 0x19, 0x16, 0xf6, 0xcc, 0x56, 0xb7, 0xad, 0xe6, 0xb4, 0xef, 0x28, 0xb0, 0x5a, 0x8b, 0xac, + 0xce, 0xde, 0xeb, 0xe2, 0xfb, 0x68, 0x6c, 0xf1, 0x6d, 0x85, 0xd1, 0x4d, 0xc2, 0x0f, 0x9c, 0x68, + 0xe5, 0xbd, 0x9b, 0x83, 0x8d, 0x14, 0x0d, 0xb1, 0x60, 0x49, 0xbf, 0x6f, 0xb5, 0x6a, 0x3b, 0x15, + 0x5e, 0xb3, 0x2b, 0x91, 0xb9, 0x14, 0x26, 0xb0, 0x4a, 0x7d, 0x85, 0x79, 0x04, 0x3f, 0x0e, 0x6c, + 0xdf, 0xeb, 0x4b, 0xc9, 0x67, 0xab, 0xa7, 0x4c, 0xc1, 0x09, 0x4f, 0xb2, 0xaf, 0x4d, 0xc7, 0x2e, + 0xb2, 0xcd, 0xc5, 0xf4, 0xba, 0x21, 0x3c, 0xcd, 0x18, 0xfd, 0x37, 0x1c, 0x5a, 0x9e, 0x66, 0x1d, + 0xf1, 0x23, 0x4d, 0x58, 0xdc, 0xf3, 0x26, 0xd5, 0xe9, 0x23, 0xbe, 0x7e, 0x2f, 0x47, 0xe9, 0x8c, + 0xaa, 0xd3, 0x47, 0x69, 0xb6, 0xa8, 0xb2, 0x64, 0xd1, 0x7b, 0x62, 0x2c, 0x39, 0x97, 0xa4, 0x13, + 0x63, 0xe1, 0x99, 0x9c, 0x18, 0xb7, 0x57, 0xa1, 0xc4, 0xef, 0x50, 0x78, 0x3d, 0xf9, 0xbe, 0x02, + 0x5b, 0xb3, 0x7a, 0x8e, 0x5e, 0xcb, 0xe2, 0xc1, 0x0a, 0xce, 0x85, 0xe9, 0x31, 0xe2, 0x51, 0x0a, + 0x04, 0x1a, 0xf9, 0x24, 0x94, 0x6a, 0x41, 0x30, 0x75, 0xc7, 0xd6, 0x2b, 0x5d, 0xb3, 0xc6, 0xa7, + 0xeb, 0xa5, 0x7f, 0x7b, 0xe7, 0xca, 0x26, 0xfa, 0x7c, 0x8c, 0xed, 0xe0, 0x15, 0x7b, 0x3a, 0xf6, + 0x62, 0xa9, 0x04, 0x64, 0x0a, 0x2a, 0x45, 0x3b, 0xd3, 0xbe, 0xe7, 0x8a, 0x3b, 0x84, 0x70, 0xe8, + 0xe6, 0x30, 0xf9, 0x4c, 0x13, 0x30, 0xed, 0x9b, 0x0a, 0x9c, 0x9f, 0x3d, 0x4c, 0xf4, 0x9c, 0xec, + 0x30, 0x93, 0x2a, 0xe1, 0x52, 0x8d, 0xe7, 0x64, 0x68, 0x77, 0x25, 0xf3, 0x14, 0x88, 0x94, 0x28, + 0x4c, 0x4d, 0x9f, 0x4b, 0xe5, 0xa3, 0x8e, 0x13, 0x09, 0x44, 0xed, 0x01, 0x6c, 0xce, 0x18, 0x54, + 0xf2, 0x89, 0xcc, 0xa4, 0x3b, 0xe8, 0xa6, 0x24, 0x27, 0xdd, 0x89, 0xa5, 0x63, 0x93, 0xe0, 0xda, + 0xbf, 0xe7, 0xe0, 0x1c, 0x5d, 0x5d, 0x03, 0x37, 0x08, 0xf4, 0xe9, 0xe4, 0x88, 0x0e, 0x27, 0x93, + 0x37, 0xc9, 0x6b, 0xb0, 0x78, 0xf4, 0x6c, 0xaa, 0x62, 0x86, 0x4e, 0x08, 0xe0, 0x89, 0x25, 0x9c, + 0x63, 0xe8, 0xff, 0xe4, 0x2a, 0xc8, 0xc9, 0xc5, 0xf3, 0x18, 0xde, 0x34, 0xb7, 0xa5, 0x98, 0xcb, + 0xa3, 0x30, 0x0f, 0xf0, 0xeb, 0xb0, 0x80, 0xfa, 0x14, 0x7e, 0x76, 0x08, 0x99, 0x3f, 0xbb, 0x76, + 0xa8, 0x6d, 0x31, 0x19, 0x01, 0xf9, 0x10, 0x40, 0x94, 0x19, 0x82, 0x1f, 0x0e, 0x42, 0xcf, 0x10, + 0x26, 0x87, 0x30, 0x97, 0x8f, 0x0f, 0x1c, 0x9e, 0x6e, 0xa1, 0x0c, 0x1b, 0xa2, 0xc7, 0x47, 0x22, + 0x2a, 0x22, 0x7f, 0xc5, 0x5c, 0x67, 0x05, 0xb5, 0x91, 0x88, 0x8c, 0x78, 0x2d, 0x95, 0x20, 0x19, + 0x83, 0x23, 0x27, 0xb2, 0x20, 0x5f, 0x4b, 0x65, 0x41, 0x2e, 0x32, 0x2c, 0x39, 0xd5, 0xb1, 0xf6, + 0xcf, 0x39, 0x58, 0xbe, 0x4f, 0xa5, 0x32, 0xd4, 0x35, 0xcc, 0xd7, 0x5d, 0xdc, 0x81, 0x52, 0xdd, + 0x77, 0xf8, 0x73, 0x11, 0xf7, 0x29, 0x61, 0x3e, 0xdd, 0x03, 0xdf, 0x11, 0x2f, 0x4f, 0x81, 0x29, + 0x23, 0x3d, 0xc5, 0x1f, 0xfd, 0x2e, 0x2c, 0xb2, 0xe7, 0x3b, 0xae, 0x46, 0x13, 0x72, 0x79, 0x58, + 0xa3, 0x97, 0x59, 0xb1, 0xf4, 0xc2, 0xc1, 0x9e, 0x00, 0x65, 0x21, 0x91, 0xc7, 0x78, 0x95, 0x34, + 0x2b, 0x0b, 0x27, 0xd3, 0xac, 0x48, 0xb1, 0xec, 0x16, 0x4f, 0x12, 0xcb, 0xee, 0xfc, 0x1b, 0x50, + 0x92, 0xea, 0xf3, 0x4c, 0x62, 0xfa, 0x37, 0x72, 0xb0, 0x8a, 0xad, 0x0a, 0x6d, 0x79, 0x7e, 0x31, + 0xf5, 0x44, 0x1f, 0x8d, 0xe9, 0x89, 0xb6, 0xe4, 0xf1, 0x62, 0x2d, 0x9b, 0xa3, 0x20, 0xba, 0x0b, + 0x1b, 0x29, 0x44, 0xf2, 0x2a, 0x2c, 0xd0, 0xea, 0x8b, 0x7b, 0xb5, 0x9a, 0x9c, 0x01, 0x51, 0xdc, + 0x63, 0xda, 0xf0, 0xc0, 0x64, 0xd8, 0xda, 0x7f, 0x29, 0xb0, 0xc2, 0xd3, 0x8e, 0x0c, 0x0f, 0xfc, + 0xa7, 0x76, 0xe7, 0x8d, 0x64, 0x77, 0xb2, 0xe8, 0x2a, 0xbc, 0x3b, 0xff, 0xb7, 0x3b, 0xf1, 0x8d, + 0x58, 0x27, 0x6e, 0x86, 0x51, 0x10, 0x45, 0x73, 0xe6, 0xf4, 0xe1, 0xdf, 0x60, 0x5c, 0xe0, 0x38, + 0x22, 0xf9, 0x02, 0x2c, 0x37, 0xdd, 0xc7, 0xb1, 0xeb, 0xe9, 0x8d, 0x19, 0x4c, 0x5f, 0x0e, 0x11, + 0xd9, 0x9a, 0xc2, 0x93, 0x7d, 0xe8, 0x3e, 0xb6, 0x53, 0x2f, 0x87, 0x11, 0x4b, 0x7a, 0x43, 0x8d, + 0x93, 0x3d, 0xcb, 0xd4, 0xe7, 0x0e, 0xae, 0x18, 0x30, 0xe8, 0x5b, 0x79, 0x80, 0xc8, 0x37, 0x90, + 0x2e, 0xc0, 0x98, 0xd1, 0x84, 0xd0, 0xec, 0x23, 0x48, 0x9e, 0xe3, 0xc2, 0x96, 0xe2, 0x06, 0xd7, + 0x40, 0xe7, 0x66, 0x47, 0xa9, 0x44, 0x5d, 0x74, 0x85, 0x3b, 0xa3, 0xf5, 0xdd, 0x81, 0xc3, 0xf6, + 0xf6, 0xfc, 0xf6, 0x35, 0x0c, 0x4a, 0x1c, 0x42, 0x67, 0xe4, 0x8f, 0x46, 0x97, 0xb5, 0x1d, 0x8a, + 0x90, 0xf2, 0xb7, 0x2d, 0x3c, 0x9b, 0xbf, 0x6d, 0x1b, 0x96, 0xbd, 0xe1, 0x5b, 0xee, 0x70, 0xe2, + 0x8f, 0x9f, 0xa0, 0xda, 0x3d, 0xd2, 0xe7, 0xd1, 0x2e, 0xa8, 0x89, 0x32, 0x36, 0x0e, 0x78, 0xe6, + 0x86, 0xf8, 0xf2, 0x30, 0x84, 0xc0, 0xd0, 0x5f, 0x78, 0x41, 0x5d, 0xbc, 0x5b, 0x28, 0x2e, 0xaa, + 0x4b, 0x77, 0x0b, 0xc5, 0xa2, 0xba, 0x7c, 0xb7, 0x50, 0x5c, 0x56, 0xc1, 0x94, 0xde, 0xcc, 0xc2, + 0x37, 0x31, 0xe9, 0x19, 0x2b, 0xfe, 0x44, 0xa5, 0xfd, 0x34, 0x07, 0x24, 0x5d, 0x0d, 0xf2, 0x51, + 0x28, 0xb1, 0x0d, 0xd6, 0x1e, 0x07, 0x5f, 0xe1, 0xee, 0x06, 0x2c, 0xec, 0x92, 0x04, 0x96, 0xc3, + 0x2e, 0x31, 0xb0, 0x19, 0x7c, 0x65, 0x40, 0x3e, 0x0f, 0xa7, 0xb1, 0x7b, 0x47, 0xee, 0xd8, 0xf3, + 0xfb, 0x36, 0xc6, 0xc8, 0x75, 0x06, 0x3c, 0xd7, 0xe3, 0x4b, 0x98, 0x94, 0x38, 0x5d, 0x3c, 0x63, + 0x18, 0xd0, 0x05, 0xb0, 0x8d, 0x98, 0x6d, 0x86, 0x48, 0x3a, 0xa0, 0xca, 0xf4, 0x07, 0xd3, 0xc1, + 0x80, 0x8f, 0x6c, 0x99, 0xde, 0xe8, 0x93, 0x65, 0x33, 0x18, 0xaf, 0x45, 0x8c, 0x77, 0xa7, 0x83, + 0x01, 0x79, 0x0d, 0xc0, 0x1f, 0xda, 0xc7, 0x5e, 0x10, 0xb0, 0xc7, 0x9c, 0xd0, 0x5b, 0x39, 0x82, + 0xca, 0x83, 0xe1, 0x0f, 0x1b, 0x0c, 0x48, 0x7e, 0x05, 0x30, 0x5a, 0x03, 0x86, 0x31, 0x61, 0xd6, + 0x48, 0x3c, 0x7b, 0x8b, 0x00, 0xc6, 0x9d, 0xa3, 0x0f, 0x5d, 0xcb, 0xfb, 0x9a, 0x70, 0xf5, 0xf8, + 0x2c, 0x6c, 0x70, 0xe3, 0xe1, 0xfb, 0xde, 0xe4, 0x88, 0x5f, 0x25, 0xde, 0xcb, 0x3d, 0x44, 0xba, + 0x4b, 0xfc, 0x7d, 0x01, 0x40, 0xbf, 0x6f, 0x89, 0x08, 0x61, 0xb7, 0x60, 0x81, 0x5e, 0x90, 0x84, + 0xa2, 0x05, 0xd5, 0xd4, 0xc8, 0x57, 0x56, 0x53, 0x23, 0x06, 0x5d, 0x8d, 0x26, 0x1a, 0xd5, 0x0b, + 0x25, 0x0b, 0xae, 0x46, 0x66, 0x67, 0x1f, 0x8b, 0xd0, 0xcc, 0xb1, 0x48, 0x1d, 0x20, 0x8a, 0xd9, + 0xc5, 0x45, 0xfe, 0x8d, 0x28, 0xf8, 0x0d, 0x2f, 0xe0, 0x59, 0x22, 0xa2, 0xb8, 0x5f, 0xf2, 0xf4, + 0x89, 0xd0, 0xc8, 0x3d, 0x28, 0x74, 0x9c, 0xd0, 0x17, 0x77, 0x46, 0x24, 0xb3, 0xe7, 0x79, 0x2e, + 0xce, 0x28, 0x9a, 0xd9, 0xda, 0xc4, 0x89, 0xa5, 0x2c, 0x46, 0x26, 0xc4, 0x80, 0x45, 0x9e, 0x67, + 0x7d, 0x46, 0x04, 0x4c, 0x9e, 0x66, 0x9d, 0xc7, 0xbd, 0x46, 0xa0, 0x2c, 0x53, 0xf0, 0x8c, 0xea, + 0x77, 0x20, 0x6f, 0x59, 0x0d, 0x1e, 0xbf, 0x63, 0x35, 0xba, 0x7e, 0x59, 0x56, 0x83, 0xbd, 0xfb, + 0x06, 0xc1, 0xb1, 0x44, 0x46, 0x91, 0xc9, 0xc7, 0xa0, 0x24, 0x09, 0xc5, 0x3c, 0xf2, 0x0d, 0xf6, + 0x81, 0xe4, 0xed, 0x24, 0x6f, 0x1a, 0x12, 0x36, 0xa9, 0x83, 0x7a, 0x6f, 0xfa, 0xc8, 0xd5, 0x47, + 0x23, 0x74, 0x83, 0x7c, 0xcb, 0x1d, 0x33, 0xb1, 0xad, 0x18, 0x85, 0x8c, 0x46, 0x1f, 0x89, 0xbe, + 0x28, 0x95, 0x95, 0x4d, 0x49, 0x4a, 0xd2, 0x86, 0x0d, 0xcb, 0x9d, 0x4c, 0x47, 0xcc, 0xbe, 0x66, + 0xd7, 0x1f, 0xd3, 0xfb, 0x0d, 0x8b, 0x93, 0x83, 0xd1, 0x75, 0x03, 0x5a, 0x28, 0x8c, 0x9a, 0x0e, + 0xfc, 0x71, 0xe2, 0xae, 0x93, 0x26, 0xd6, 0x5c, 0x79, 0xc8, 0xe9, 0xa9, 0x1a, 0xbf, 0x35, 0xe1, + 0xa9, 0x2a, 0x6e, 0x4d, 0xd1, 0x5d, 0xe9, 0x43, 0x19, 0xb1, 0xdc, 0xf0, 0x65, 0x50, 0x8a, 0xe5, + 0x16, 0x8b, 0xe0, 0xf6, 0xbd, 0x82, 0x14, 0x4e, 0x94, 0x8f, 0xc5, 0x9b, 0x00, 0x77, 0x7d, 0x6f, + 0xd8, 0x70, 0x27, 0x47, 0x7e, 0x5f, 0x0a, 0x29, 0x57, 0xfa, 0x92, 0xef, 0x0d, 0xed, 0x63, 0x04, + 0xff, 0xf4, 0x9d, 0x2b, 0x12, 0x92, 0x29, 0xfd, 0x4f, 0x3e, 0x08, 0xcb, 0xf4, 0x57, 0x27, 0xb2, + 0x12, 0x62, 0x3a, 0x59, 0xa4, 0x66, 0x49, 0x37, 0x22, 0x04, 0xf2, 0x06, 0xa6, 0x99, 0xf1, 0x46, + 0x13, 0x49, 0x78, 0x15, 0x39, 0x65, 0xbc, 0xd1, 0x24, 0x19, 0x21, 0x5a, 0x42, 0x26, 0xd5, 0xb0, + 0xea, 0x22, 0x33, 0x14, 0xcf, 0x66, 0x83, 0x8a, 0x47, 0x3e, 0xd7, 0x6c, 0x11, 0x9a, 0x56, 0xce, + 0xe1, 0x9b, 0x20, 0xc3, 0x4a, 0x58, 0xd5, 0x1d, 0xf6, 0x52, 0xc4, 0x85, 0x5a, 0x56, 0x89, 0xe0, + 0xa8, 0x6f, 0xf7, 0x10, 0x1c, 0xab, 0x44, 0x88, 0x4c, 0xb6, 0x61, 0x9d, 0xc9, 0xf8, 0x61, 0x86, + 0x49, 0x2e, 0xe2, 0xe2, 0xde, 0x16, 0xa5, 0xa0, 0x94, 0x3f, 0x9f, 0x20, 0x20, 0xbb, 0xb0, 0x80, + 0x77, 0x4d, 0xee, 0x1a, 0x70, 0x41, 0x56, 0x13, 0x24, 0xd7, 0x11, 0xee, 0x2b, 0xa8, 0x20, 0x90, + 0xf7, 0x15, 0x44, 0x25, 0x9f, 0x01, 0x30, 0x86, 0x63, 0x7f, 0x30, 0xc0, 0xe0, 0xc9, 0x45, 0xbc, + 0x4a, 0x5d, 0x8a, 0xaf, 0x47, 0xe4, 0x12, 0x21, 0xf1, 0x40, 0x7f, 0xf8, 0xdb, 0x4e, 0x84, 0x58, + 0x96, 0x78, 0x69, 0x35, 0x58, 0x64, 0x8b, 0x11, 0x03, 0x91, 0xf3, 0xd4, 0x2a, 0x52, 0x18, 0x6b, + 0x16, 0x88, 0x9c, 0xc3, 0xd3, 0x81, 0xc8, 0x25, 0x02, 0xed, 0x1e, 0x9c, 0xc9, 0x6a, 0x58, 0xec, + 0x76, 0xac, 0x9c, 0xf4, 0x76, 0xfc, 0xdd, 0x3c, 0xac, 0x20, 0x37, 0xb1, 0x0b, 0xeb, 0xb0, 0x6a, + 0x4d, 0x1f, 0x85, 0x51, 0xba, 0xc4, 0x6e, 0x8c, 0xf5, 0x0b, 0xe4, 0x02, 0xf9, 0x0d, 0x2f, 0x46, + 0x41, 0x0c, 0x58, 0x13, 0x27, 0xc1, 0x9e, 0xf0, 0x1c, 0x08, 0x63, 0x80, 0x8b, 0x48, 0x93, 0xe9, + 0x0c, 0xbb, 0x09, 0xa2, 0xe8, 0x3c, 0xc8, 0x3f, 0xcb, 0x79, 0x50, 0x38, 0xd1, 0x79, 0xf0, 0x10, + 0x56, 0xc4, 0xd7, 0x70, 0x27, 0x5f, 0x78, 0x6f, 0x3b, 0x79, 0x8c, 0x19, 0xa9, 0x87, 0x3b, 0xfa, + 0xe2, 0xdc, 0x1d, 0x1d, 0x1f, 0x46, 0xc5, 0x2a, 0x1b, 0x21, 0x2c, 0xbd, 0xb1, 0x63, 0x0a, 0xca, + 0xbd, 0x4a, 0xfb, 0x67, 0x38, 0x25, 0x5f, 0x85, 0xe5, 0xba, 0x2f, 0xde, 0xc4, 0xa4, 0xc7, 0x88, + 0x81, 0x00, 0xca, 0xe2, 0x42, 0x88, 0x19, 0x9e, 0x6e, 0xf9, 0xf7, 0xe3, 0x74, 0x7b, 0x03, 0x80, + 0xbb, 0xa4, 0x44, 0xa9, 0xe3, 0x70, 0xc9, 0x88, 0x08, 0x25, 0xf1, 0x37, 0x11, 0x09, 0x99, 0xee, + 0x4e, 0xdc, 0xdc, 0x46, 0xef, 0xf5, 0xfc, 0xe9, 0x70, 0x12, 0xcb, 0xb5, 0x2c, 0x3c, 0x58, 0x1d, + 0x5e, 0x26, 0x6f, 0x0f, 0x09, 0xb2, 0xf7, 0x77, 0x40, 0xc8, 0xa7, 0x43, 0xe3, 0xc7, 0xa5, 0x79, + 0x3d, 0xa4, 0xa5, 0x7a, 0x68, 0xa6, 0xc9, 0xa3, 0xf6, 0x43, 0x45, 0x4e, 0xc0, 0xf0, 0x33, 0x0c, + 0xf5, 0xeb, 0x00, 0xa1, 0x51, 0x82, 0x18, 0x6b, 0x76, 0x5f, 0x0a, 0xa1, 0x72, 0x2f, 0x47, 0xb8, + 0x52, 0x6b, 0xf2, 0xef, 0x57, 0x6b, 0x3a, 0x50, 0x6a, 0x7d, 0x79, 0xe2, 0x44, 0x56, 0x2c, 0x60, + 0x85, 0x92, 0x2c, 0xee, 0x4c, 0xf9, 0xed, 0xeb, 0x78, 0x36, 0x44, 0x72, 0xf0, 0x0c, 0x11, 0x58, + 0x22, 0xd4, 0xfe, 0x42, 0x81, 0x75, 0xd9, 0xed, 0xfe, 0xc9, 0xb0, 0x47, 0x3e, 0xc1, 0xe2, 0xc1, + 0x2a, 0xb1, 0x2b, 0x8b, 0x84, 0x44, 0xb7, 0xdc, 0x27, 0xc3, 0x1e, 0x13, 0x80, 0x9c, 0xc7, 0x72, + 0x65, 0x29, 0x21, 0x79, 0x04, 0x2b, 0x6d, 0x7f, 0x30, 0xa0, 0x62, 0xcd, 0xf8, 0x2d, 0x7e, 0x01, + 0xa0, 0x8c, 0x92, 0x4f, 0x23, 0xa2, 0x42, 0xdb, 0x2f, 0xf0, 0x7b, 0xee, 0xe6, 0x88, 0xee, 0xf7, + 0x1e, 0xa7, 0x8b, 0xd8, 0xbe, 0x8d, 0x7e, 0x72, 0x32, 0x4f, 0xed, 0xc7, 0x0a, 0x90, 0x74, 0x95, + 0xe4, 0x2d, 0x4b, 0xf9, 0x3f, 0x10, 0x61, 0x13, 0xa2, 0x5f, 0xe1, 0x59, 0x44, 0xbf, 0xf2, 0xef, + 0x2a, 0xb0, 0x5e, 0xd3, 0x1b, 0x3c, 0x25, 0x03, 0x7b, 0xc1, 0xb9, 0x0a, 0x97, 0x6a, 0x7a, 0xc3, + 0x6e, 0xb7, 0xea, 0xb5, 0xca, 0x03, 0x3b, 0x33, 0xd2, 0xf2, 0x25, 0x78, 0x2e, 0x8d, 0x12, 0xbd, + 0xf4, 0x5c, 0x84, 0xad, 0x74, 0xb1, 0x88, 0xc6, 0x9c, 0x4d, 0x2c, 0x02, 0x37, 0xe7, 0xcb, 0x9f, + 0x84, 0x75, 0x11, 0x79, 0xb8, 0x53, 0xb7, 0x30, 0xb7, 0xc1, 0x3a, 0x94, 0xf6, 0x0d, 0xb3, 0xb6, + 0xfb, 0xc0, 0xde, 0xed, 0xd6, 0xeb, 0xea, 0x29, 0xb2, 0x0a, 0xcb, 0x1c, 0x50, 0xd1, 0x55, 0x85, + 0xac, 0x40, 0xb1, 0xd6, 0xb4, 0x8c, 0x4a, 0xd7, 0x34, 0xd4, 0x5c, 0xf9, 0x93, 0xb0, 0xd6, 0x1e, + 0x7b, 0x6f, 0x39, 0x13, 0xf7, 0x9e, 0xfb, 0x04, 0x1f, 0x6a, 0x96, 0x20, 0x6f, 0xea, 0xf7, 0xd5, + 0x53, 0x04, 0x60, 0xb1, 0x7d, 0xaf, 0x62, 0xdd, 0xbe, 0xad, 0x2a, 0xa4, 0x04, 0x4b, 0x7b, 0x95, + 0xb6, 0x7d, 0xaf, 0x61, 0xa9, 0x39, 0xfa, 0x43, 0xbf, 0x6f, 0xe1, 0x8f, 0x7c, 0xf9, 0xc3, 0xb0, + 0x81, 0x02, 0x49, 0xdd, 0x0b, 0x26, 0xee, 0xd0, 0x1d, 0x63, 0x1d, 0x56, 0xa0, 0x68, 0xb9, 0x74, + 0x27, 0x99, 0xb8, 0xac, 0x02, 0x8d, 0xe9, 0x60, 0xe2, 0x8d, 0x06, 0xee, 0x57, 0x55, 0xa5, 0xfc, + 0x06, 0xac, 0x9b, 0xfe, 0x74, 0xe2, 0x0d, 0x0f, 0xad, 0x09, 0xc5, 0x38, 0x7c, 0x42, 0xce, 0xc2, + 0x46, 0xb7, 0xa9, 0x37, 0xb6, 0x6b, 0x7b, 0xdd, 0x56, 0xd7, 0xb2, 0x1b, 0x7a, 0xa7, 0x52, 0x65, + 0xcf, 0x44, 0x8d, 0x96, 0xd5, 0xb1, 0x4d, 0xa3, 0x62, 0x34, 0x3b, 0xaa, 0x52, 0xfe, 0x36, 0xea, + 0x56, 0x7a, 0xfe, 0xb0, 0xbf, 0xeb, 0xf4, 0x26, 0xfe, 0x18, 0x2b, 0xac, 0xc1, 0x65, 0xcb, 0xa8, + 0xb4, 0x9a, 0x3b, 0xf6, 0xae, 0x5e, 0xe9, 0xb4, 0xcc, 0xac, 0x50, 0xdf, 0xe7, 0xe1, 0x5c, 0x06, + 0x4e, 0xab, 0xd3, 0x56, 0x15, 0x72, 0x05, 0x2e, 0x64, 0x94, 0xdd, 0x37, 0xb6, 0xf5, 0x6e, 0xa7, + 0xda, 0x54, 0x73, 0x33, 0x88, 0x2d, 0xab, 0xa5, 0xe6, 0xcb, 0xbf, 0xa9, 0xc0, 0x5a, 0x37, 0xe0, + 0x26, 0xe7, 0x5d, 0xf4, 0x36, 0x7d, 0x1e, 0x2e, 0x76, 0x2d, 0xc3, 0xb4, 0x3b, 0xad, 0x7b, 0x46, + 0xd3, 0xee, 0x5a, 0xfa, 0x5e, 0xb2, 0x36, 0x57, 0xe0, 0x82, 0x84, 0x61, 0x1a, 0x95, 0xd6, 0xbe, + 0x61, 0xda, 0x6d, 0xdd, 0xb2, 0xee, 0xb7, 0xcc, 0x1d, 0x55, 0xa1, 0x5f, 0xcc, 0x40, 0x68, 0xec, + 0xea, 0xac, 0x36, 0xb1, 0xb2, 0xa6, 0x71, 0x5f, 0xaf, 0xdb, 0xdb, 0xad, 0x8e, 0x9a, 0x2f, 0x37, + 0xe8, 0xf9, 0x8e, 0x01, 0x77, 0x99, 0x65, 0x61, 0x11, 0x0a, 0xcd, 0x56, 0xd3, 0x48, 0x3e, 0x2e, + 0xae, 0x40, 0x51, 0x6f, 0xb7, 0xcd, 0xd6, 0x3e, 0x4e, 0x31, 0x80, 0xc5, 0x1d, 0xa3, 0x49, 0x6b, + 0x96, 0xa7, 0x25, 0x6d, 0xb3, 0xd5, 0x68, 0x75, 0x8c, 0x1d, 0xb5, 0x50, 0x36, 0xc5, 0x12, 0x16, + 0x4c, 0x7b, 0x3e, 0x7b, 0xc9, 0xdb, 0x31, 0x76, 0xf5, 0x6e, 0xbd, 0xc3, 0x87, 0xe8, 0x81, 0x6d, + 0x1a, 0x9f, 0xee, 0x1a, 0x56, 0xc7, 0x52, 0x15, 0xa2, 0xc2, 0x4a, 0xd3, 0x30, 0x76, 0x2c, 0xdb, + 0x34, 0xf6, 0x6b, 0xc6, 0x7d, 0x35, 0x47, 0x79, 0xb2, 0xff, 0xe9, 0x17, 0xca, 0xdf, 0x53, 0x80, + 0xb0, 0x60, 0xc5, 0x22, 0x03, 0x0e, 0xce, 0x98, 0xcb, 0x70, 0xbe, 0x4a, 0x87, 0x1a, 0x9b, 0xd6, + 0x68, 0xed, 0x24, 0xbb, 0xec, 0x1c, 0x90, 0x44, 0x79, 0x6b, 0x77, 0x57, 0x55, 0xc8, 0x05, 0x38, + 0x9d, 0x80, 0xef, 0x98, 0xad, 0xb6, 0x9a, 0x3b, 0x9f, 0x2b, 0x2a, 0x64, 0x33, 0x55, 0x78, 0xcf, + 0x30, 0xda, 0x6a, 0x9e, 0x0e, 0x51, 0xa2, 0x40, 0x2c, 0x09, 0x46, 0x5e, 0x28, 0x7f, 0x53, 0x81, + 0x73, 0xac, 0x9a, 0x62, 0x7d, 0x85, 0x55, 0xbd, 0x08, 0x5b, 0x3c, 0x04, 0x7b, 0x56, 0x45, 0xcf, + 0x80, 0x1a, 0x2b, 0x65, 0xd5, 0x3c, 0x0b, 0x1b, 0x31, 0x28, 0xd6, 0x23, 0x47, 0x77, 0x8f, 0x18, + 0x78, 0xdb, 0xb0, 0x3a, 0xb6, 0xb1, 0xbb, 0xdb, 0x32, 0x3b, 0xac, 0x22, 0xf9, 0xb2, 0x06, 0x1b, + 0x15, 0x77, 0x3c, 0xa1, 0x57, 0xaf, 0x61, 0xe0, 0xf9, 0x43, 0xac, 0xc2, 0x2a, 0x2c, 0x1b, 0x9f, + 0xe9, 0x18, 0x4d, 0xab, 0xd6, 0x6a, 0xaa, 0xa7, 0xca, 0x17, 0x13, 0x38, 0x62, 0x1d, 0x5b, 0x56, + 0x55, 0x3d, 0x55, 0x76, 0x60, 0x55, 0x18, 0x5e, 0xb3, 0x59, 0x71, 0x19, 0xce, 0x8b, 0xb9, 0x86, + 0x3b, 0x4a, 0xb2, 0x09, 0x5b, 0x70, 0x26, 0x5d, 0x6e, 0x74, 0x54, 0x85, 0x8e, 0x42, 0xa2, 0x84, + 0xc2, 0x73, 0xe5, 0x5f, 0x57, 0x60, 0x35, 0x7c, 0x34, 0x41, 0x35, 0xed, 0x15, 0xb8, 0xd0, 0xd8, + 0xd5, 0xed, 0x1d, 0x63, 0xbf, 0x56, 0x31, 0xec, 0x7b, 0xb5, 0xe6, 0x4e, 0xe2, 0x23, 0xcf, 0xc1, + 0xd9, 0x0c, 0x04, 0xfc, 0xca, 0x16, 0x9c, 0x49, 0x16, 0x75, 0xe8, 0x52, 0xcd, 0xd1, 0xae, 0x4f, + 0x96, 0x84, 0xeb, 0x34, 0x5f, 0xde, 0x87, 0x35, 0x4b, 0x6f, 0xd4, 0x77, 0xfd, 0x71, 0xcf, 0xd5, + 0xa7, 0x93, 0xa3, 0x21, 0xb9, 0x00, 0x9b, 0xbb, 0x2d, 0xb3, 0x62, 0xd8, 0x88, 0x92, 0xa8, 0xc1, + 0x69, 0x58, 0x97, 0x0b, 0x1f, 0x18, 0x74, 0xfa, 0x12, 0x58, 0x93, 0x81, 0xcd, 0x96, 0x9a, 0x2b, + 0x7f, 0x0e, 0x56, 0x62, 0x89, 0xf0, 0x36, 0xe1, 0xb4, 0xfc, 0xbb, 0xed, 0x0e, 0xfb, 0xde, 0xf0, + 0x50, 0x3d, 0x95, 0x2c, 0x30, 0xa7, 0xc3, 0x21, 0x2d, 0xc0, 0xf5, 0x2c, 0x17, 0x74, 0xdc, 0xf1, + 0xb1, 0x37, 0x74, 0x26, 0x6e, 0x5f, 0xcd, 0x95, 0x5f, 0x86, 0xd5, 0x58, 0xf8, 0x6d, 0x3a, 0x70, + 0xf5, 0x16, 0xdf, 0x80, 0x1b, 0xc6, 0x4e, 0xad, 0xdb, 0x50, 0x17, 0xe8, 0x4a, 0xae, 0xd6, 0xf6, + 0xaa, 0x2a, 0x94, 0xbf, 0xa3, 0xd0, 0x7b, 0x06, 0x26, 0xd5, 0x69, 0xec, 0xea, 0x62, 0xa8, 0xe9, + 0x34, 0x63, 0x41, 0xfd, 0x0d, 0xcb, 0x62, 0x6f, 0xea, 0x17, 0x61, 0x8b, 0xff, 0xb0, 0xf5, 0xe6, + 0x8e, 0x5d, 0xd5, 0xcd, 0x9d, 0xfb, 0xba, 0x49, 0xe7, 0xde, 0x03, 0x35, 0x87, 0x0b, 0x4a, 0x82, + 0xd8, 0x9d, 0x56, 0xb7, 0x52, 0x55, 0xf3, 0x74, 0xfe, 0xc6, 0xe0, 0xed, 0x5a, 0x53, 0x2d, 0xe0, + 0xf2, 0x4c, 0x61, 0x23, 0x5b, 0x5a, 0xbe, 0x50, 0x7e, 0x57, 0x81, 0x4d, 0xcb, 0x3b, 0x1c, 0x3a, + 0x93, 0xe9, 0xd8, 0xd5, 0x07, 0x87, 0xfe, 0xd8, 0x9b, 0x1c, 0x1d, 0x5b, 0x53, 0x6f, 0xe2, 0x92, + 0x5b, 0x70, 0xdd, 0xaa, 0xed, 0x35, 0xf5, 0x0e, 0x5d, 0x5e, 0x7a, 0x7d, 0xaf, 0x65, 0xd6, 0x3a, + 0xd5, 0x86, 0x6d, 0x75, 0x6b, 0xa9, 0x99, 0x77, 0x0d, 0x9e, 0x9f, 0x8d, 0x5a, 0x37, 0xf6, 0xf4, + 0xca, 0x03, 0x55, 0x99, 0xcf, 0x70, 0x5b, 0xaf, 0xeb, 0xcd, 0x8a, 0xb1, 0x63, 0xef, 0xdf, 0x56, + 0x73, 0xe4, 0x3a, 0x5c, 0x9d, 0x8d, 0xba, 0x5b, 0x6b, 0x5b, 0x14, 0x2d, 0x3f, 0xff, 0xbb, 0x55, + 0xab, 0x41, 0xb1, 0x0a, 0xe5, 0x3f, 0x56, 0x60, 0x6b, 0x56, 0x0c, 0x26, 0x72, 0x03, 0x34, 0xa3, + 0xd9, 0x31, 0xf5, 0xda, 0x8e, 0x5d, 0x31, 0x8d, 0x1d, 0xa3, 0xd9, 0xa9, 0xe9, 0x75, 0xcb, 0xb6, + 0x5a, 0x5d, 0x3a, 0x9b, 0x22, 0xd3, 0x87, 0x17, 0xe0, 0xca, 0x1c, 0xbc, 0x56, 0x6d, 0xa7, 0xa2, + 0x2a, 0xe4, 0x36, 0xbc, 0x34, 0x07, 0xc9, 0x7a, 0x60, 0x75, 0x8c, 0x86, 0x5c, 0xa2, 0xe6, 0xca, + 0x15, 0x38, 0x3f, 0x3b, 0x48, 0x0b, 0xdd, 0xa6, 0xe3, 0x3d, 0x5d, 0x84, 0xc2, 0x0e, 0x3d, 0x19, + 0x62, 0xb9, 0x1f, 0xca, 0x1e, 0xa8, 0xc9, 0x38, 0x0b, 0x29, 0x1b, 0x15, 0xb3, 0xdb, 0x6c, 0xb2, + 0x63, 0x64, 0x1d, 0x4a, 0xad, 0x4e, 0xd5, 0x30, 0x79, 0xf6, 0x0c, 0x4c, 0x97, 0xd1, 0x6d, 0xd2, + 0x85, 0xd3, 0x32, 0x6b, 0x9f, 0xc5, 0xf3, 0x64, 0x0b, 0xce, 0x58, 0x75, 0xbd, 0x72, 0xcf, 0x6e, + 0xb6, 0x3a, 0x76, 0xad, 0x69, 0x57, 0xaa, 0x7a, 0xb3, 0x69, 0xd4, 0x55, 0xc0, 0xce, 0x9c, 0xe5, + 0x5b, 0x49, 0x3e, 0x08, 0x37, 0x5b, 0xf7, 0x3a, 0xba, 0xdd, 0xae, 0x77, 0xf7, 0x6a, 0x4d, 0xdb, + 0x7a, 0xd0, 0xac, 0x08, 0xd9, 0xa7, 0x92, 0xde, 0x72, 0x6f, 0xc2, 0xb5, 0xb9, 0xd8, 0x51, 0x9e, + 0x8b, 0x1b, 0xa0, 0xcd, 0xc5, 0xe4, 0x0d, 0x29, 0xff, 0x48, 0x81, 0x0b, 0x73, 0xde, 0x90, 0xc9, + 0x4b, 0x70, 0xab, 0x6a, 0xe8, 0x3b, 0x75, 0xc3, 0xb2, 0x70, 0xa3, 0xa0, 0xc3, 0xc0, 0x6c, 0x59, + 0x32, 0x37, 0xd4, 0x5b, 0x70, 0x7d, 0x3e, 0x7a, 0x74, 0x34, 0xdf, 0x84, 0x6b, 0xf3, 0x51, 0xf9, + 0x51, 0x9d, 0x23, 0x65, 0xb8, 0x31, 0x1f, 0x33, 0x3c, 0xe2, 0xf3, 0xe5, 0xdf, 0x56, 0xe0, 0x5c, + 0xb6, 0x22, 0x87, 0xd6, 0xad, 0xd6, 0xb4, 0x3a, 0x7a, 0xbd, 0x6e, 0xb7, 0x75, 0x53, 0x6f, 0xd8, + 0x46, 0xd3, 0x6c, 0xd5, 0xeb, 0x59, 0x47, 0xdb, 0x35, 0x78, 0x7e, 0x36, 0xaa, 0x55, 0x31, 0x6b, + 0x6d, 0xba, 0x7b, 0x6b, 0x70, 0x79, 0x36, 0x96, 0x51, 0xab, 0x18, 0x6a, 0x6e, 0xfb, 0xcd, 0x1f, + 0xfc, 0xd3, 0xe5, 0x53, 0x3f, 0x78, 0xf7, 0xb2, 0xf2, 0xe3, 0x77, 0x2f, 0x2b, 0xff, 0xf8, 0xee, + 0x65, 0xe5, 0xb3, 0x2f, 0x9e, 0x2c, 0x45, 0x14, 0xca, 0xfd, 0x8f, 0x16, 0xf1, 0x86, 0xf2, 0xca, + 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x65, 0x8a, 0xa5, 0x19, 0x70, 0xbd, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -28183,6 +28245,13 @@ func (m *IdentityCenterPermissionSet) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.AssignmentID) > 0 { + i -= len(m.AssignmentID) + copy(dAtA[i:], m.AssignmentID) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AssignmentID))) + i-- + dAtA[i] = 0x1a + } if len(m.Name) > 0 { i -= len(m.Name) copy(dAtA[i:], m.Name) @@ -28272,6 +28341,20 @@ func (m *AppSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.TCPPorts) > 0 { + for iNdEx := len(m.TCPPorts) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TCPPorts[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + } + } if m.IdentityCenter != nil { { size, err := m.IdentityCenter.MarshalToSizedBuffer(dAtA[:i]) @@ -28586,6 +28669,43 @@ func (m *Header) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PortRange) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PortRange) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PortRange) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.EndPort != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.EndPort)) + i-- + dAtA[i] = 0x10 + } + if m.Port != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Port)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *CommandLabelV2) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -51571,6 +51691,10 @@ func (m *IdentityCenterPermissionSet) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.AssignmentID) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -51661,6 +51785,12 @@ func (m *AppSpecV3) Size() (n int) { l = m.IdentityCenter.Size() n += 1 + l + sovTypes(uint64(l)) } + if len(m.TCPPorts) > 0 { + for _, e := range m.TCPPorts { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -51758,6 +51888,24 @@ func (m *Header) Size() (n int) { return n } +func (m *PortRange) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Port != 0 { + n += 1 + sovTypes(uint64(m.Port)) + } + if m.EndPort != 0 { + n += 1 + sovTypes(uint64(m.EndPort)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *CommandLabelV2) Size() (n int) { if m == nil { return 0 @@ -70874,6 +71022,38 @@ func (m *IdentityCenterPermissionSet) Unmarshal(dAtA []byte) error { } m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AssignmentID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AssignmentID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -71527,6 +71707,40 @@ func (m *AppSpecV3) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TCPPorts", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TCPPorts = append(m.TCPPorts, &PortRange{}) + if err := m.TCPPorts[len(m.TCPPorts)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -71966,6 +72180,95 @@ func (m *Header) Unmarshal(dAtA []byte) error { } return nil } +func (m *PortRange) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PortRange: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PortRange: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType) + } + m.Port = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Port |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EndPort", wireType) + } + m.EndPort = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EndPort |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *CommandLabelV2) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/utils/net/ports.go b/api/utils/net/ports.go new file mode 100644 index 0000000000000..f75ee79c7db4a --- /dev/null +++ b/api/utils/net/ports.go @@ -0,0 +1,50 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package net + +import ( + "github.com/gravitational/trace" +) + +// ValidatePortRange checks if the given port range is within bounds. If endPort is not zero, it +// also checks if it's bigger than port. A port range with zero as endPort is assumed to describe a +// single port. +func ValidatePortRange(port, endPort int) error { + const minPort = 1 + const maxPort = 65535 + + if port < minPort || port > maxPort { + return trace.BadParameter("port must be between %d and %d, but got %d", minPort, maxPort, port) + } + + if endPort != 0 { + if endPort <= port || endPort > maxPort { + return trace.BadParameter("end port must be between %d and %d, but got %d", port+1, maxPort, endPort) + } + } + + return nil +} + +// IsPortInRange checks if targetPort is between port and endPort (inclusive). If endPort is zero, +// it checks if targetPort equals port. It assumes that the provided port range is valid (see +// [ValidatePortRange]). +func IsPortInRange(port, endPort, targetPort int) bool { + if endPort == 0 { + return targetPort == port + } + + return port <= targetPort && targetPort <= endPort +} diff --git a/api/utils/net/ports_test.go b/api/utils/net/ports_test.go new file mode 100644 index 0000000000000..fcbcf9e21fbba --- /dev/null +++ b/api/utils/net/ports_test.go @@ -0,0 +1,164 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package net + +import ( + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" +) + +func TestValidatePortRange(t *testing.T) { + tests := []struct { + name string + port int + endPort int + check require.ErrorAssertionFunc + }{ + { + name: "valid single port", + port: 1337, + endPort: 0, + check: require.NoError, + }, + { + name: "valid port range", + port: 1337, + endPort: 3456, + check: require.NoError, + }, + { + name: "port smaller than 1", + port: 0, + endPort: 0, + check: badParameterError, + }, + { + name: "port bigger than max port", + port: 98765, + endPort: 0, + check: badParameterError, + }, + { + name: "end port smaller than 2", + port: 5, + endPort: 1, + check: badParameterErrorAndContains("end port must be between 6 and 65535"), + }, + { + name: "end port bigger than max port", + port: 5, + endPort: 98765, + check: badParameterErrorAndContains("end port must be between 6 and 65535"), + }, + { + name: "end port smaller than port", + port: 10, + endPort: 5, + check: badParameterErrorAndContains("end port must be between 11 and 65535"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.check(t, ValidatePortRange(tt.port, tt.endPort)) + }) + } +} + +func TestIsPortInRange(t *testing.T) { + tests := []struct { + name string + port int + endPort int + targetPort int + check require.BoolAssertionFunc + }{ + { + name: "within single port range", + port: 1337, + endPort: 0, + targetPort: 1337, + check: require.True, + }, + { + name: "within port range", + port: 1337, + endPort: 3456, + targetPort: 2550, + check: require.True, + }, + { + name: "equal to range start", + port: 1337, + endPort: 3456, + targetPort: 1337, + check: require.True, + }, + { + name: "equal to range end", + port: 1337, + endPort: 3456, + targetPort: 3456, + check: require.True, + }, + { + name: "outside of single port range", + port: 1337, + endPort: 0, + targetPort: 7331, + check: require.False, + }, + { + name: "equal to end of single port range", + port: 1337, + endPort: 0, + targetPort: 0, + check: require.False, + }, + { + name: "smaller than range start", + port: 1337, + endPort: 3456, + targetPort: 42, + check: require.False, + }, + { + name: "bigger than range end", + port: 1337, + endPort: 3456, + targetPort: 7331, + check: require.False, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tt.check(t, IsPortInRange(tt.port, tt.endPort, tt.targetPort), "compared %d against %d-%d", tt.targetPort, tt.port, tt.endPort) + }) + } +} + +func badParameterError(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.True(t, trace.IsBadParameter(err), "expected bad parameter error, got %+v", err) +} + +func badParameterErrorAndContains(msg string) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.True(t, trace.IsBadParameter(err), "expected bad parameter error, got %+v", err) + require.ErrorContains(t, err, msg, msgAndArgs...) + } +} diff --git a/assets/aws/go.mod b/assets/aws/go.mod index 246e375d07ba5..a401d78599015 100644 --- a/assets/aws/go.mod +++ b/assets/aws/go.mod @@ -4,24 +4,24 @@ go 1.21 require ( github.com/alecthomas/kingpin/v2 v2.3.2 // replaced - github.com/aws/aws-sdk-go-v2 v1.32.3 - github.com/aws/aws-sdk-go-v2/config v1.28.1 - github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0 + github.com/aws/aws-sdk-go-v2 v1.32.5 + github.com/aws/aws-sdk-go-v2/config v1.28.5 + github.com/aws/aws-sdk-go-v2/service/ec2 v1.194.0 ) require ( github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.42 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.46 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect - github.com/aws/smithy-go v1.22.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect ) diff --git a/assets/aws/go.sum b/assets/aws/go.sum index 8d56811064fc8..e2dcb8facdf3c 100644 --- a/assets/aws/go.sum +++ b/assets/aws/go.sum @@ -1,33 +1,33 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk= -github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw= -github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ= +github.com/aws/aws-sdk-go-v2 v1.32.5 h1:U8vdWJuY7ruAkzaOdD7guwJjD06YSKmnKCJs7s3IkIo= +github.com/aws/aws-sdk-go-v2 v1.32.5/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/config v1.28.5 h1:Za41twdCXbuyyWv9LndXxZZv3QhTG1DinqlFsSuvtI0= +github.com/aws/aws-sdk-go-v2/config v1.28.5/go.mod h1:4VsPbHP8JdcdUDmbTVgNL/8w9SqOkM5jyY8ljIxLO3o= +github.com/aws/aws-sdk-go-v2/credentials v1.17.46 h1:AU7RcriIo2lXjUfHFnFKYsLCwgbz1E7Mm95ieIRDNUg= +github.com/aws/aws-sdk-go-v2/credentials v1.17.46/go.mod h1:1FmYyLGL08KQXQ6mcTlifyFXfJVCNJTVGuQP4m0d/UA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20 h1:sDSXIrlsFSFJtWKLQS4PUWRvrT580rrnuLydJrCQ/yA= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.20/go.mod h1:WZ/c+w0ofps+/OUqMwWgnfrgzZH1DZO1RIkktICsqnY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24 h1:4usbeaes3yJnCFC7kfeyhkdkPtoRYPa/hTmCqMpKpLI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.24/go.mod h1:5CI1JemjVwde8m2WG3cz23qHKPOxbpkq0HaoreEgLIY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24 h1:N1zsICrQglfzaBnrfM0Ys00860C+QFwu6u/5+LomP+o= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.24/go.mod h1:dCn9HbJ8+K31i8IQ8EWmWj0EiIk0+vKiHNMxTTYveAg= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0 h1:cA4hWo269CN5RY7Arqt8BfzXF0KIN8DSNo/KcqHKkWk= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0/go.mod h1:ossaD9Z1ugYb6sq9QIqQLEOorCGcqUoxlhud9M9yE70= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE= -github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= -github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.194.0 h1:56YXcRmryw9wiTrvdVeJEUwBCoN/+o33R52PA7CCi08= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.194.0/go.mod h1:mzj8EEjIHSN2oZRXiw1Dd+uB4HZTl7hC8nBzX9IZMWw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5 h1:wtpJ4zcwrSbwhECWQoI/g6WM9zqCcSpHDJIWSbMLOu4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.5/go.mod h1:qu/W9HXQbbQ4+1+JcZp0ZNPV31ym537ZJN+fiS7Ti8E= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.6 h1:3zu537oLmsPfDMyjnUS2g+F2vITgy5pB74tHI+JBNoM= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.6/go.mod h1:WJSZH2ZvepM6t6jwu4w/Z45Eoi75lPN7DcydSRtJg6Y= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5 h1:K0OQAsDywb0ltlFrZm0JHPY3yZp/S9OaoLU33S7vPS8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.5/go.mod h1:ORITg+fyuMoeiQFiVGoqB3OydVTLkClw/ljbblMq6Cc= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.1 h1:6SZUVRQNvExYlMLbHdlKB48x0fLbc2iVROyaNEwBHbU= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.1/go.mod h1:GqWyYCwLXnlUB1lOAXQyNSPqPLQJvmo8J0DWBzp9mtg= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/assets/backport/go.mod b/assets/backport/go.mod index 8a86d7cd26c6e..6b68eb58c31eb 100644 --- a/assets/backport/go.mod +++ b/assets/backport/go.mod @@ -5,8 +5,8 @@ go 1.18 require ( github.com/google/go-github/v41 v41.0.0 github.com/gravitational/trace v1.4.0 - github.com/stretchr/testify v1.9.0 - golang.org/x/oauth2 v0.23.0 + github.com/stretchr/testify v1.10.0 + golang.org/x/oauth2 v0.24.0 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/assets/backport/go.sum b/assets/backport/go.sum index d82f43d14889f..13bab01e9ef06 100644 --- a/assets/backport/go.sum +++ b/assets/backport/go.sum @@ -844,8 +844,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1026,8 +1026,8 @@ 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.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/build.assets/tooling/go.mod b/build.assets/tooling/go.mod index 77374c5c2dc37..5870c74535be8 100644 --- a/build.assets/tooling/go.mod +++ b/build.assets/tooling/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/build.assets/tooling -go 1.23.3 +go 1.23.4 require ( github.com/Masterminds/sprig/v3 v3.3.0 @@ -14,14 +14,14 @@ require ( github.com/hashicorp/go-hclog v1.6.3 github.com/hashicorp/go-retryablehttp v0.7.7 // indirect github.com/sirupsen/logrus v1.9.3 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/waigani/diffparser v0.0.0-20190828052634-7391f219313d golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 - golang.org/x/mod v0.21.0 - golang.org/x/oauth2 v0.23.0 - helm.sh/helm/v3 v3.16.2 + golang.org/x/mod v0.22.0 + golang.org/x/oauth2 v0.24.0 + helm.sh/helm/v3 v3.16.3 howett.net/plist v1.0.1 - k8s.io/apiextensions-apiserver v0.31.2 + k8s.io/apiextensions-apiserver v0.31.3 ) require ( @@ -61,7 +61,7 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 - k8s.io/apimachinery v0.31.2 // indirect + k8s.io/apimachinery v0.31.3 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/build.assets/tooling/go.sum b/build.assets/tooling/go.sum index 4745133b4f5ca..f89acb6f5295f 100644 --- a/build.assets/tooling/go.sum +++ b/build.assets/tooling/go.sum @@ -949,8 +949,8 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F 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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/waigani/diffparser v0.0.0-20190828052634-7391f219313d h1:xQcF7b7cZLWZG/+7A4G7un1qmEDYHIvId9qxRS1mZMs= github.com/waigani/diffparser v0.0.0-20190828052634-7391f219313d/go.mod h1:BzSc3WEF8R+lCaP5iGFRxd5kIXy4JKOZAwNe1w0cdc0= @@ -1052,8 +1052,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1145,8 +1145,8 @@ 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.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1641,8 +1641,8 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -helm.sh/helm/v3 v3.16.2 h1:Y9v7ry+ubQmi+cb5zw1Llx8OKHU9Hk9NQ/+P+LGBe2o= -helm.sh/helm/v3 v3.16.2/go.mod h1:SyTXgKBjNqi2NPsHCW5dDAsHqvGIu0kdNYNH9gQaw70= +helm.sh/helm/v3 v3.16.3 h1:kb8bSxMeRJ+knsK/ovvlaVPfdis0X3/ZhYCSFRP+YmY= +helm.sh/helm/v3 v3.16.3/go.mod h1:zeVWGDR4JJgiRbT3AnNsjYaX8OTJlIE9zC+Q7F7iUSU= 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= @@ -1654,10 +1654,10 @@ honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM= howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= -k8s.io/apiextensions-apiserver v0.31.2 h1:W8EwUb8+WXBLu56ser5IudT2cOho0gAKeTOnywBLxd0= -k8s.io/apiextensions-apiserver v0.31.2/go.mod h1:i+Geh+nGCJEGiCGR3MlBDkS7koHIIKWVfWeRFiOsUcM= -k8s.io/apimachinery v0.31.2 h1:i4vUt2hPK56W6mlT7Ry+AO8eEsyxMD1U44NR22CLTYw= -k8s.io/apimachinery v0.31.2/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/apiextensions-apiserver v0.31.3 h1:+GFGj2qFiU7rGCsA5o+p/rul1OQIq6oYpQw4+u+nciE= +k8s.io/apiextensions-apiserver v0.31.3/go.mod h1:2DSpFhUZZJmn/cr/RweH1cEVVbzFw9YBu4T+U3mf1e4= +k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4= +k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= diff --git a/build.assets/versions.mk b/build.assets/versions.mk index edd1e5b5d7c86..15a01e3006f58 100644 --- a/build.assets/versions.mk +++ b/build.assets/versions.mk @@ -3,7 +3,7 @@ # Keep versions in sync with devbox.json, when applicable. # Sync with devbox.json. -GOLANG_VERSION ?= go1.23.3 +GOLANG_VERSION ?= go1.23.4 GOLANGCI_LINT_VERSION ?= v1.62.2 NODE_VERSION ?= 20.18.0 diff --git a/constants.go b/constants.go index af059bc1ffe54..0f07d97b89bd5 100644 --- a/constants.go +++ b/constants.go @@ -283,7 +283,7 @@ const ( // ComponentProxySecureGRPC represents a secure gRPC server running on Proxy (used for Kube). ComponentProxySecureGRPC = "proxy:secure-grpc" - // ComponentUpdater represents the agent updater. + // ComponentUpdater represents the teleport-update binary. ComponentUpdater = "updater" // VerboseLogsEnvVar forces all logs to be verbose (down to DEBUG level) @@ -410,6 +410,10 @@ const ( // MinimumEtcdVersion is the minimum version of etcd supported by Teleport MinimumEtcdVersion = "3.3.0" + + // EnvVarAllowNoSecondFactor is used to allow disabling second factor auth + // todo(tross): DELETE WHEN ABLE TO + EnvVarAllowNoSecondFactor = "TELEPORT_ALLOW_NO_SECOND_FACTOR" ) const ( diff --git a/docs/config.json b/docs/config.json index 9a92f7ada9a42..10947e64273f4 100644 --- a/docs/config.json +++ b/docs/config.json @@ -132,7 +132,7 @@ "aws_secret_access_key": "zyxw9876-this-is-an-example" }, "cloud": { - "version": "16.4.7", + "version": "16.4.8", "major_version": "16", "sla": { "monthly_percentage": "99.9%", diff --git a/docs/cspell.json b/docs/cspell.json index ce6e144d68667..08c89c4305a08 100644 --- a/docs/cspell.json +++ b/docs/cspell.json @@ -59,7 +59,6 @@ "Elastcsearch", "Elasticvue", "Entra", - "entraid", "Exadata", "Exfiltrate", "Exrch", @@ -457,6 +456,7 @@ "enablerepo", "enterappname", "entityandreplyurl", + "entraid", "envfile", "enzos", "errcode", @@ -602,6 +602,7 @@ "lmnop", "loadbalancer", "localca", + "localinstall", "loginerrortroubleshooting", "loginrule", "loginrules", @@ -795,6 +796,7 @@ "relogged", "remotefx", "removelock", + "removerepo", "replaceall", "replicaset", "replicationgroup", @@ -1014,11 +1016,9 @@ "zxvf", "zztop" ], - "flagWords": [ - "hte" - ], + "flagWords": ["hte"], "ignorePaths": [ "**/reference/terraform-provider/**", "**/reference/operator-resources/**" ] -} \ No newline at end of file +} diff --git a/docs/img/database-access/guides/sqlserver/azure-set-ad-admin.png b/docs/img/database-access/guides/sqlserver/azure-set-ad-admin.png index 5b6d81726197f..61f532f1649ea 100644 Binary files a/docs/img/database-access/guides/sqlserver/azure-set-ad-admin.png and b/docs/img/database-access/guides/sqlserver/azure-set-ad-admin.png differ diff --git a/docs/img/database-access/guides/sqlserver/cloud-sql-aad.png b/docs/img/database-access/guides/sqlserver/cloud-sql-aad.png index c1a6b2867b065..9d160142f768b 100644 Binary files a/docs/img/database-access/guides/sqlserver/cloud-sql-aad.png and b/docs/img/database-access/guides/sqlserver/cloud-sql-aad.png differ diff --git a/docs/img/database-access/guides/sqlserver/sql-aad.png b/docs/img/database-access/guides/sqlserver/sql-aad.png index 07a30c8708692..accf6498cef37 100644 Binary files a/docs/img/database-access/guides/sqlserver/sql-aad.png and b/docs/img/database-access/guides/sqlserver/sql-aad.png differ diff --git a/docs/pages/admin-guides/management/admin/uninstall-teleport.mdx b/docs/pages/admin-guides/management/admin/uninstall-teleport.mdx index c1675c103443e..17ca404890208 100644 --- a/docs/pages/admin-guides/management/admin/uninstall-teleport.mdx +++ b/docs/pages/admin-guides/management/admin/uninstall-teleport.mdx @@ -132,6 +132,22 @@ Follow the instructions for your Linux distribution: ``` + + + + Uninstall the Teleport binary using zypper: + + ```code + # Change the package name to "teleport" for Teleport Community Edition + $ sudo zypper -y remove teleport-ent + ``` + + Uninstall the Teleport zypper repo: + + ```code + $ sudo zypper removerepo teleport + ``` + @@ -160,7 +176,7 @@ Follow the instructions for your Linux distribution: You can use `dirname $(which teleport)` to look this up automatically. - Remove the Teleport binaries from the machine: + Remove the Teleport binaries and links to Teleport software from the machine: ```code $ sudo rm -f /usr/local/bin/tbot @@ -171,10 +187,17 @@ Follow the instructions for your Linux distribution: ``` - If you installed the macOS `tsh` client-only package and/or Teleport Connect for macOS, you can optionally remove those too: + + You may have Teleport software in the `/Applications` folder if you: + - Installed from a macOS tarball for v17+ that includes `tsh.app` and `tctl.app` + - Installed the macOS `tsh` client-only package for v16 or older versions. + - Installed Teleport Connect for macOS + + You can remove those with these commands: ```code $ sudo rm -rf /Applications/tsh.app + $ sudo rm -rf /Applications/tctl.app $ sudo rm -rf /Applications/Teleport\ Connect.app ``` diff --git a/docs/pages/admin-guides/management/guides/ec2-tags.mdx b/docs/pages/admin-guides/management/guides/ec2-tags.mdx index 409cc020efc31..93338221fd7b6 100644 --- a/docs/pages/admin-guides/management/guides/ec2-tags.mdx +++ b/docs/pages/admin-guides/management/guides/ec2-tags.mdx @@ -10,7 +10,7 @@ this way will have the `aws/` prefix. When the Teleport process starts, it fetch the instance metadata service and adds them as labels. The process will update the tags every hour, so newly created or deleted tags will be reflected in the labels. -If the tag `TeleportHostname` (case-sensitive) is present, its value will override the node's hostname. +If the tag `TeleportHostname` is present, its value (must be lower case) will override the node's hostname. ```code $ tsh ls diff --git a/docs/pages/admin-guides/management/guides/gcp-tags.mdx b/docs/pages/admin-guides/management/guides/gcp-tags.mdx index 80e9451716d10..031f8679b5bef 100644 --- a/docs/pages/admin-guides/management/guides/gcp-tags.mdx +++ b/docs/pages/admin-guides/management/guides/gcp-tags.mdx @@ -17,7 +17,7 @@ When the Teleport process starts, it fetches all tags and labels from the GCP API and adds them as labels. The process will update the tags every hour, so newly created or deleted tags will be reflected in the labels. -If the GCP label `TeleportHostname` (case-sensitive) is present, its value will override the node's hostname. This +If the GCP label `TeleportHostname` is present, its value (must be lower case) will override the node's hostname. This does not apply to GCP tags. ```code diff --git a/docs/pages/enroll-resources/database-access/enroll-azure-databases/azure-sql-server-ad.mdx b/docs/pages/enroll-resources/database-access/enroll-azure-databases/azure-sql-server-ad.mdx index f0522aa24f426..ef54ea2de657c 100644 --- a/docs/pages/enroll-resources/database-access/enroll-azure-databases/azure-sql-server-ad.mdx +++ b/docs/pages/enroll-resources/database-access/enroll-azure-databases/azure-sql-server-ad.mdx @@ -1,6 +1,6 @@ --- title: Database Access with SQL Server on Azure -description: How to configure Teleport database access with Azure SQL Server using Azure Active Directory authentication. +description: How to configure Teleport database access with Azure SQL Server using Microsoft Entra authentication. --- (!docs/pages/includes/database-access/db-introduction.mdx dbType="Azure SQL Server" dbConfigure="with Microsoft Entra ID-based authentication"!) @@ -8,25 +8,25 @@ description: How to configure Teleport database access with Azure SQL Server usi ## How it works The Teleport Database Service runs on an Azure virtual machine with an attached -Azure identity with permissions to retrieve authentication tokens from Azure -Active Directory. When a user connects to SQL Server with Teleport, the Teleport +Azure identity with permissions to retrieve authentication tokens from +Microsoft Entra ID. When a user connects to SQL Server with Teleport, the Teleport Database service authenticates with Azure AD, then uses an authentication token to connect to SQL Server. The Database Service then forwards user traffic to the database. -![Teleport Database Access Azure SQL Server Azure Active Directory Self-Hosted](../../../../img/database-access/guides/sqlserver/sql-aad.png) +![Access Azure SQL Server Microsoft Entra Self-Hosted](../../../../img/database-access/guides/sqlserver/sql-aad.png) -![Teleport Database Access Azure SQL Server Azure Active Directory Cloud](../../../../img/database-access/guides/sqlserver/cloud-sql-aad.png) +![Access Azure SQL Server Microsoft Entra Cloud](../../../../img/database-access/guides/sqlserver/cloud-sql-aad.png) ## Prerequisites -Database access for Azure SQL Server with Azure Active Directory authentication +Database access for Azure SQL Server with Microsoft Entra authentication is available starting from Teleport `11.0`. (!docs/pages/includes/edition-prereqs-tabs.mdx!) @@ -39,20 +39,20 @@ is available starting from Teleport `11.0`. (!docs/pages/includes/database-access/create-user.mdx!) -## Step 2/8. Enable the SQL Server Azure Active Directory integration +## Step 2/8. Enable the Microsoft Entra authentication If you have it enabled, you can go to the next step. Go to the [Azure Portal](https://portal.azure.com/), select **Database -servers**, and select the database you wish to enable the Azure Active Directory -integration. +servers**, and select the database you wish to enable the Microsoft Entra +authentication. -Select **Azure Active Directory** in the left-hand column. +Select **Microsoft Entra ID** under "Settings" in the left-hand column. Select **Set Admin**, and choose an account that will be added as an admin login to SQL Server. -![Azure SQL Server Azure Active Directory admin page](../../../../img/database-access/guides/sqlserver/azure-set-ad-admin.png) +![Azure SQL Server Microsoft Entra admin page](../../../../img/database-access/guides/sqlserver/azure-set-ad-admin.png) ## Step 3/8. Configure IAM permissions for Teleport @@ -282,3 +282,5 @@ To check if the VM has access, you can do the following on the VM: (!docs/pages/includes/database-access/guides-next-steps.mdx!) +## Further reading +- [Microsoft Entra authentication for Azure SQL](https://learn.microsoft.com/en-us/azure/azure-sql/database/authentication-aad-overview?view=azuresql) diff --git a/docs/pages/enroll-resources/database-access/faq.mdx b/docs/pages/enroll-resources/database-access/faq.mdx index 624e8c7e5c3e2..7fcbcb5bcf44d 100644 --- a/docs/pages/enroll-resources/database-access/faq.mdx +++ b/docs/pages/enroll-resources/database-access/faq.mdx @@ -25,13 +25,14 @@ The Teleport Database Service currently supports the following protocols: - Redis - Snowflake -For PostgreSQL and MySQL, the following Cloud-hosted versions are supported in addition to self-hosted deployments: +For PostgreSQL, Oracle and MySQL, the following Cloud-hosted versions are supported in addition to self-hosted deployments: - Amazon RDS - Amazon Aurora (except for Amazon Aurora Serverless, which doesn't support IAM authentication) - Amazon Redshift - Google Cloud SQL - Azure Database +- Oracle Exadata See the available [guides](guides/guides.mdx) for all supported configurations. diff --git a/docs/pages/includes/database-access/self-hosted-introduction.mdx b/docs/pages/includes/database-access/self-hosted-introduction.mdx index da9db52cd28e3..5fcd5bd3e7f08 100644 --- a/docs/pages/includes/database-access/self-hosted-introduction.mdx +++ b/docs/pages/includes/database-access/self-hosted-introduction.mdx @@ -5,14 +5,14 @@ system](../../enroll-resources/database-access/rbac.mdx). The Teleport Database Service proxies traffic from database clients to self-hosted databases in your infrastructure. Teleport maintains a certificate -authority for database clients. You configure your database to trust the +authority (CA) for database clients. You configure your database to trust the Teleport database client CA, and the Teleport Database Service presents certificates signed by this CA when proxying user traffic. With this setup, there is no need to store long-lived credentials for self-hosted databases. Meanwhile, the Teleport Database Service verifies self-hosted databases by checking their TLS certificates against either the Teleport database CA or a -custom CA chosen by the user. +custom CA used with the database. In this guide, you will: diff --git a/docs/pages/includes/helm-reference/zz_generated.teleport-operator.mdx b/docs/pages/includes/helm-reference/zz_generated.teleport-operator.mdx index 8fce50395c01d..a1cda3b612cda 100644 --- a/docs/pages/includes/helm-reference/zz_generated.teleport-operator.mdx +++ b/docs/pages/includes/helm-reference/zz_generated.teleport-operator.mdx @@ -151,6 +151,26 @@ put on the `Pod` resources created by the chart. `annotations.serviceAccount` contains the Kubernetes annotations put on the `Deployment` resource created by the chart. +## `annotations` + +### `labels.deployment` + +| Type | Default | +|------|---------| +| `object` | `{}` | + +`labels.deployment` contains the Kubernetes labels +put on the `Deployment` resource created by the chart. + +### `labels.pod` + +| Type | Default | +|------|---------| +| `object` | `{}` | + +`labels.pod` contains the Kubernetes labels +put on the `Pod` resources created by the chart. + ## `serviceAccount` ### `serviceAccount.create` diff --git a/docs/pages/includes/provision-token/github-spec.mdx b/docs/pages/includes/provision-token/github-spec.mdx index 3b252c185af86..9e86dfa0694df 100644 --- a/docs/pages/includes/provision-token/github-spec.mdx +++ b/docs/pages/includes/provision-token/github-spec.mdx @@ -22,6 +22,16 @@ spec: # this value should be configured to the hostname of your GHES instance. enterprise_server_host: ghes.example.com + # static_jwks allows the JSON Web Key Set (JWKS) used to verify the token + # issued by GitHub Actions to be overridden. This can be used in scenarios + # where the Teleport Auth Service is unable to reach a GHES server. + # + # This field is optional and should only be used with GitHub Enterprise + # Server. When unspecified, the JWKS will be fetched automatically using the + # GHES server specified in `enterprise_server_host`. + static_jwks: | + {"keys":[--snip--]} + # enterprise_slug allows the slug of a GitHub Enterprise organisation to be # included in the expected issuer of the OIDC tokens. This is for # compatibility with the include_enterprise_slug option in GHE. diff --git a/docs/pages/includes/role-spec.mdx b/docs/pages/includes/role-spec.mdx index 2ac34fad5fd79..ef780959cd30b 100644 --- a/docs/pages/includes/role-spec.mdx +++ b/docs/pages/includes/role-spec.mdx @@ -366,6 +366,14 @@ spec: kubernetes_resources: - kind: "namespace" + # 'reason' defines settings for the reason for the access provided by the user. + reason: + # 'mode' can be either "required" or "optional". Empty string is treated as + # "optional". If a role has the request reason mode set to "required", then reason + # is required for all Access Requests requesting roles or resources allowed by + # this role. It applies only to users who have this role assigned. + mode: "optional" + # thresholds specifies minimum amount of approvers and deniers, # defaults to 1 for both (enterprise-only) thresholds: diff --git a/docs/pages/installation.mdx b/docs/pages/installation.mdx index bc5793a03d31e..fbc2671d74b92 100644 --- a/docs/pages/installation.mdx +++ b/docs/pages/installation.mdx @@ -317,14 +317,15 @@ repositories. -### TAR archives (self-hosted only) +### Downloading packages and TAR archives (self-hosted only) -For self-hosted deployments, Teleport maintains TAR archives for +Teleport maintains TAR archives as well as DEB and RPM packages for Linux-compatible binaries at `https://cdn.teleport.dev`. This section explains -the Teleport TAR archives and how to use them. +how to install Teleport by manually downloading a release. -It is not possible to install the automatic agent updater using TAR archives. -Teleport Cloud customers must use the [one-line installation +It is not possible to install the automatic agent updater using this method, so +using packages and TAR archives is only available for users who self-hosted +Teleport. Teleport Cloud customers must use the [one-line installation script](#one-line-installation-script) or manually install Teleport from a [package repository](#package-repositories) in order to install the updater. @@ -354,38 +355,98 @@ script](#one-line-installation-script) or manually install Teleport from a The following architecture values are available: - - `amd64` + - `amd64` (`x86_84` if downloading an RPM package) - `arm64` - `arm` - - `386` + - `386` (`i386` if downloading a DEB or RPM package) -1. Run the following commands to download the Teleport archive, unpack it, and - install binaries: +1. Run the following commands to download a Teleport package or archive, unpack + it, and install binaries: + + + ```code $ curl https://cdn.teleport.dev/${TELEPORT_PKG?}-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-bin.tar.gz.sha256 # $ curl -O https://cdn.teleport.dev/${TELEPORT_PKG?}-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-bin.tar.gz - $ shasum -a 256 ${TELEPORT_PKG?}-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-bin.tar.gz - # Verify that the checksums match + $ shasum --check -a 256 ${TELEPORT_PKG?}-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-bin.tar.gz $ tar -xvf ${TELEPORT_PKG?}-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-bin.tar.gz $ cd ${TELEPORT_PKG?} $ sudo ./install ``` + + + + ```code + $ curl https://cdn.teleport.dev/${TELEPORT_PKG?}_${TELEPORT_VERSION?}_${SYSTEM_ARCH?}.deb.sha256 + # + $ curl -O https://cdn.teleport.dev/${TELEPORT_PKG?}_${TELEPORT_VERSION?}_${SYSTEM_ARCH?}.deb + $ shasum --check -a 256 ${TELEPORT_PKG?}_${TELEPORT_VERSION?}_${SYSTEM_ARCH?}.deb + $ sudo dpkg -i ${TELEPORT_PKG?}_${TELEPORT_VERSION?}_${SYSTEM_ARCH?}.deb + ``` + + + + + ```code + $ curl https://cdn.teleport.dev/${TELEPORT_PKG?}-${TELEPORT_VERSION?}-1.${SYSTEM_ARCH?}.rpm.sha256 + # + $ curl -O https://cdn.teleport.dev/${TELEPORT_PKG?}-${TELEPORT_VERSION?}-1.${SYSTEM_ARCH?}.rpm + $ shasum --check -a 256 https://cdn.teleport.dev/${TELEPORT_PKG?}-${TELEPORT_VERSION?}-1.${SYSTEM_ARCH?}.rpm + # Or use yum localinstall, dnf localinstall etc. + $ sudo rpm -i https://cdn.teleport.dev/${TELEPORT_PKG?}-${TELEPORT_VERSION?}-1.${SYSTEM_ARCH?}.rpm + ``` + + + For FedRAMP/FIPS-compliant installations of Teleport Enterprise, package URLs are slightly different: + + + ```code $ curl https://cdn.teleport.dev/teleport-ent-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-fips-bin.tar.gz.sha256 # $ curl -O https://cdn.teleport.dev/teleport-ent-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-fips-bin.tar.gz - $ shasum -a 256 teleport-ent-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-fips-bin.tar.gz - # Verify that the checksums match + $ shasum --check -a 256 teleport-ent-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-fips-bin.tar.gz $ tar -xvf teleport-ent-v${TELEPORT_VERSION?}-linux-${SYSTEM_ARCH?}-fips-bin.tar.gz $ cd teleport-ent $ sudo ./install ``` + + + + FIPS builds are only available for the `arm64` and `amd64` system + architectures. + + ```code + $ curl https://cdn.teleport.dev/teleport-ent_${TELEPORT_VERSION}-fips_${SYSTEM_ARCH}.deb.sha256 + # + $ curl -O https://cdn.teleport.dev/teleport-ent_${TELEPORT_VERSION}-fips_${SYSTEM_ARCH}.deb + $ shasum --check -a 256 teleport-ent_${TELEPORT_VERSION}-fips_${SYSTEM_ARCH}.deb + $ sudo dpkg -i teleport-ent_${TELEPORT_VERSION}-fips_${SYSTEM_ARCH}.deb + ``` + + + + + FIPS builds are only available for the `arm64` and `x86_64` system + architectures. + + ```code + $ curl https://cdn.teleport.dev/teleport-ent-${TELEPORT_VERSION?}-1-fips.${SYSTEM_ARCH?}.rpm.sha256 + # + $ curl -O https://cdn.teleport.dev/teleport-ent-${TELEPORT_VERSION?}-1-fips.${SYSTEM_ARCH?}.rpm + $ shasum --check -a 256 https://cdn.teleport.dev/teleport-ent-${TELEPORT_VERSION?}-1-fips.${SYSTEM_ARCH?}.rpm + # Or use yum localinstall, dnf localinstall etc. + $ sudo rpm -i https://cdn.teleport.dev/teleport-ent-${TELEPORT_VERSION?}-1-fips.${SYSTEM_ARCH?}.rpm + ``` + + + ### From your browser diff --git a/docs/pages/reference/access-controls/authentication.mdx b/docs/pages/reference/access-controls/authentication.mdx index 1f6feafcd791c..bb05f0ab722e0 100644 --- a/docs/pages/reference/access-controls/authentication.mdx +++ b/docs/pages/reference/access-controls/authentication.mdx @@ -267,3 +267,49 @@ See [GitHub OAuth 2.0](../../admin-guides/access-controls/sso/github-sso.mdx) fo + +## Require displaying a message of the day + +Teleport can display a custom message of the day (MOTD) for users prior to authenticating +in the Teleport Web UI and CLI. + +### Self-Hosted + +Add the following to your Teleport configuration file, which is stored in +`/etc/teleport.yaml` by default. + +```yaml +auth_service: + message_of_the_day: | + Welcome to the Example Teleport Cluster + All activity is monitored and should follow organization policies +``` + +Restart the Teleport Auth Service instances to apply this change. + +### Teleport Enterprise Cloud/Dynamic + +Edit your `cluster_auth_preference` resource: + +```code +$ tctl edit cap +``` + +Ensure that the resource includes the `message_of_the_day` field: + +```yaml +kind: cluster_auth_preference +metadata: + name: cluster-auth-preference +spec: + message_of_the_day: | + Welcome to the Example Teleport Cluster + All activity is monitored and should follow organization policies + type: local + second_factor: "on" + webauthn: + rp_id: example.teleport.sh +version: v2 +``` + +Save and close the file in your editor to apply changes. diff --git a/docs/pages/reference/helm-reference/teleport-cluster.mdx b/docs/pages/reference/helm-reference/teleport-cluster.mdx index aac3dccac9bab..b28c0c36540dd 100644 --- a/docs/pages/reference/helm-reference/teleport-cluster.mdx +++ b/docs/pages/reference/helm-reference/teleport-cluster.mdx @@ -655,6 +655,63 @@ the same Kubernetes cluster or installing the CRDs on your own you should not ha ## `operator` +### `operator.annotations.deployment` + +| Type | Default value | +|----------|---------------| +| `object` | `{}` | + +[Kubernetes reference](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) + +Kubernetes annotations which should be applied to the `Deployment` created by the chart. + +`values.yaml` example: + + ```yaml + operator: + annotations: + deployment: + kubernetes.io/annotation: value + ``` + +### `operator.annotations.pod` + +| Type | Default value | +|----------|---------------| +| `object` | `{}` | + +[Kubernetes reference](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) + +Kubernetes annotations which should be applied to the `Pod` created by the chart. + +`values.yaml` example: + + ```yaml + operator: + annotations: + pod: + kubernetes.io/annotation: value + ``` + +### `operator.annotations.serviceAccount` + +| Type | Default value | +|----------|---------------| +| `object` | `{}` | + +[Kubernetes reference](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) + +Kubernetes annotations which should be applied to the `ServiceAccount` created by the chart. + +`values.yaml` example: + + ```yaml + operator: + annotations: + serviceAccount: + kubernetes.io/annotation: value + ``` + ### `operator.enabled` | Type | Default value | @@ -671,7 +728,7 @@ If you are deploying multiple releases of the Helm chart in the same cluster you ```yaml operator: - enabled: true + enabled: true ``` ### `operator.image` @@ -692,6 +749,44 @@ This setting requires [`operator.enabled`](#operatorenabled). image: my.docker.registry/teleport-operator-image-name ``` +### `operator.labels.deployment` + +| Type | Default value | +|----------|---------------| +| `object` | `{}` | + +[Kubernetes reference](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/) + +Kubernetes labels which should be applied to the `Deployment` created by the chart. + +`values.yaml` example: + + ```yaml + operator: + labels: + deployment: + label: value + ``` + +### `operator.labels.pod` + +| Type | Default value | +|----------|---------------| +| `object` | `{}` | + +[Kubernetes reference](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/) + +Kubernetes labels which should be applied to the `Pod` created by the chart. + +`values.yaml` example: + + ```yaml + operator: + labels: + pod: + label: value + ``` + ### `operator.resources` | Type | Default value | @@ -1789,6 +1884,14 @@ is true. `extraLabels.job` are labels to set on the Job run by the Helm hook. +### `extraLabels.jobPod` + +| Type | Default value | +|----------|---------------| +| `object` | `{}` | + +`extraLabels.jobPod` are labels to set on the Pods created by the Job run by the Helm hook. + ### `extraLabels.persistentVolumeClaim` | Type | Default value | diff --git a/docs/pages/reference/terraform-provider/data-sources/app.mdx b/docs/pages/reference/terraform-provider/data-sources/app.mdx index b2899fb41b508..db743284d4819 100644 --- a/docs/pages/reference/terraform-provider/data-sources/app.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/app.mdx @@ -51,6 +51,7 @@ Optional: - `public_addr` (String) PublicAddr is the public address the application is accessible at. - `required_app_names` (List of String) RequiredAppNames is a list of app names that are required for this app to function. Any app listed here will be part of the authentication redirect flow and authenticate along side this app. - `rewrite` (Attributes) Rewrite is a list of rewriting rules to apply to requests and responses. (see [below for nested schema](#nested-schema-for-specrewrite)) +- `tcp_ports` (Attributes List) TCPPorts is a list of ports and port ranges that an app agent can forward connections to. Only applicable to TCP App Access. If this field is not empty, URI is expected to contain no port number and start with the tcp protocol. (see [below for nested schema](#nested-schema-for-spectcp_ports)) - `uri` (String) URI is the web app endpoint. - `user_groups` (List of String) UserGroups are a list of user group IDs that this app is associated with. @@ -94,6 +95,7 @@ Optional: Optional: - `arn` (String) ARN is the fully-formed ARN of the Permission Set. +- `assignment_name` (String) AssignmentID is the ID of the Teelport Account Assignment resource that represents this permission being assigned on the enclosing Account. - `name` (String) Name is the human-readable name of the Permission Set. @@ -113,3 +115,12 @@ Optional: - `name` (String) Name is the http header name. - `value` (String) Value is the http header value. + + +### Nested Schema for `spec.tcp_ports` + +Optional: + +- `end_port` (Number) EndPort describes the end of the range, inclusive. If set, it must be between 2 and 65535 and be greater than Port when describing a port range. When omitted or set to zero, it signifies that the port range defines a single port. +- `port` (Number) Port describes the start of the range. It must be between 1 and 65535. + diff --git a/docs/pages/reference/terraform-provider/resources/app.mdx b/docs/pages/reference/terraform-provider/resources/app.mdx index 6901673e50c8c..5176f3452e1f1 100644 --- a/docs/pages/reference/terraform-provider/resources/app.mdx +++ b/docs/pages/reference/terraform-provider/resources/app.mdx @@ -70,6 +70,7 @@ Optional: - `public_addr` (String) PublicAddr is the public address the application is accessible at. - `required_app_names` (List of String) RequiredAppNames is a list of app names that are required for this app to function. Any app listed here will be part of the authentication redirect flow and authenticate along side this app. - `rewrite` (Attributes) Rewrite is a list of rewriting rules to apply to requests and responses. (see [below for nested schema](#nested-schema-for-specrewrite)) +- `tcp_ports` (Attributes List) TCPPorts is a list of ports and port ranges that an app agent can forward connections to. Only applicable to TCP App Access. If this field is not empty, URI is expected to contain no port number and start with the tcp protocol. (see [below for nested schema](#nested-schema-for-spectcp_ports)) - `uri` (String) URI is the web app endpoint. - `user_groups` (List of String) UserGroups are a list of user group IDs that this app is associated with. @@ -113,6 +114,7 @@ Optional: Optional: - `arn` (String) ARN is the fully-formed ARN of the Permission Set. +- `assignment_name` (String) AssignmentID is the ID of the Teelport Account Assignment resource that represents this permission being assigned on the enclosing Account. - `name` (String) Name is the human-readable name of the Permission Set. @@ -132,3 +134,12 @@ Optional: - `name` (String) Name is the http header name. - `value` (String) Value is the http header value. + + +### Nested Schema for `spec.tcp_ports` + +Optional: + +- `end_port` (Number) EndPort describes the end of the range, inclusive. If set, it must be between 2 and 65535 and be greater than Port when describing a port range. When omitted or set to zero, it signifies that the port range defines a single port. +- `port` (Number) Port describes the start of the range. It must be between 1 and 65535. + diff --git a/docs/vale-styles/3rd-party-products/aws-vs-amazon.yml b/docs/vale-styles/3rd-party-products/aws-vs-amazon.yml index c52b383736a42..ee31641ada6cf 100644 --- a/docs/vale-styles/3rd-party-products/aws-vs-amazon.yml +++ b/docs/vale-styles/3rd-party-products/aws-vs-amazon.yml @@ -15,7 +15,6 @@ # /^AWS /{ print gensub(/AWS (.*)/," \"Amazon \\1\"","1") ": " $0}' extends: substitution message: "Incorrect AWS product name. Use %s instead of %s." -scope: raw level: warning ignorecase: true swap: diff --git a/docs/vale-styles/examples/teleport-accounts.yml b/docs/vale-styles/examples/teleport-accounts.yml index 1b487a3398dee..dd5d49e21136b 100644 --- a/docs/vale-styles/examples/teleport-accounts.yml +++ b/docs/vale-styles/examples/teleport-accounts.yml @@ -1,8 +1,8 @@ extends: substitution message: "Incorrect example of a Teleport account URL. Use %s instead of %s." -level: error +scope: raw # So we can catch instances in code fences +level: warning scope: - - raw ignorecase: true swap: - 'https://(?!status|example)\w+.teleport\.sh': 'example.teleport.sh (or status.teleport.sh for the status page)' diff --git a/docs/vale-styles/messaging/capitalization.yml b/docs/vale-styles/messaging/capitalization.yml index 5e96accb7a5fa..214045a982528 100644 --- a/docs/vale-styles/messaging/capitalization.yml +++ b/docs/vale-styles/messaging/capitalization.yml @@ -5,7 +5,7 @@ scope: - list - paragraph message: "Capitalize the names of Teleport services and features (%s is incorrect). See the Core Concepts page (https://goteleport.com/docs/core-concepts/) for a reference." -level: error +level: warning ignorecase: false tokens: # Allow for mentions of a local proxy service, but not "proxy service". diff --git a/docs/vale-styles/messaging/consistent-terms.yml b/docs/vale-styles/messaging/consistent-terms.yml index 027c0c59f2e18..95aea349b7cd1 100644 --- a/docs/vale-styles/messaging/consistent-terms.yml +++ b/docs/vale-styles/messaging/consistent-terms.yml @@ -7,7 +7,7 @@ scope: - list - paragraph message: For consistent product messaging in the docs, use '%s' instead of '%s'. -level: error +level: warning # Ignoring case because this rule is about word choice, rather than its # presentation/format. ignorecase: true diff --git a/docs/vale-styles/messaging/protocol-products.yml b/docs/vale-styles/messaging/protocol-products.yml index 45a0348f8ade9..2515b2975a3f6 100644 --- a/docs/vale-styles/messaging/protocol-products.yml +++ b/docs/vale-styles/messaging/protocol-products.yml @@ -1,6 +1,6 @@ extends: existence message: Avoid the impression that Teleport consists of multiple products for secure access, e.g., "Database Access" or "Server Access". Instead, talk about enrolling resources in your Teleport cluster, protecting resources with Teleport, or the ability for Teleport to proxy various protocols. -level: error +level: warning ignorecase: false tokens: - 'Server Access' diff --git a/docs/vale-styles/structure/architecture-h2.yml b/docs/vale-styles/structure/architecture-h2.yml index 4889bd4aaf96d..297571def5150 100644 --- a/docs/vale-styles/structure/architecture-h2.yml +++ b/docs/vale-styles/structure/architecture-h2.yml @@ -6,7 +6,7 @@ # This style defines a how-to guide as any guide that includes at least one H2 # beginning "Step [0-9]". extends: script -level: error +level: warning message: "In a how-to guide, the first H2-level section must be called `## How it works`. Use this section to include 1-3 paragraphs that describe the high-level architecture of the setup shown in the guide, i.e., which infrastructure components are involved and how they communicate. If there is already architectural information in the guide, include it in a `## How it works` section." scope: raw script: | diff --git a/docs/vale-styles/structure/intro-paragraph.yml b/docs/vale-styles/structure/intro-paragraph.yml index 3bee6806e4d66..1c34b054b2c2a 100644 --- a/docs/vale-styles/structure/intro-paragraph.yml +++ b/docs/vale-styles/structure/intro-paragraph.yml @@ -1,7 +1,7 @@ # This style enforces the presence of an introductory paragraph before the first # H2 of a docs page. extends: script -level: error +level: warning message: There must be a brief intro paragraph before the first H2-level section of a docs page. Use this to describe the purpose of the guide so a reader can determine whether they should continue reading. If the guide introduces a feature, describe the purpose and benefits of the feature. If there is already an "Introduction" H2 or similar, remove the heading. scope: raw script: | diff --git a/e b/e index b7ee0144cfbc3..bef544252a504 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit b7ee0144cfbc3e1ec28a6f6bda4efc72b86122a5 +Subproject commit bef544252a50498a0232998bb942150268fc5efe diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/.lint/labels.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/.lint/labels.yaml new file mode 100644 index 0000000000000..15d33de282dfa --- /dev/null +++ b/examples/chart/teleport-cluster/charts/teleport-operator/.lint/labels.yaml @@ -0,0 +1,10 @@ +labels: + deployment: + kubernetes.io/deployment: "test-label" + kubernetes.io/deployment-different: 3 + pod: + kubernetes.io/pod: "test-label" + kubernetes.io/pod-different: 4 +teleportAddress: "example.teleport.sh:443" +token: "my-operator-bot" +teleportClusterName: "example.teleport.sh" diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/templates/deployment.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/templates/deployment.yaml index cd6d67643d81e..ae0395a1c6bd8 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/templates/deployment.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/templates/deployment.yaml @@ -4,7 +4,11 @@ kind: Deployment metadata: name: {{ include "teleport-cluster.operator.fullname" . }} namespace: {{ .Release.Namespace }} - labels: {{- include "teleport-cluster.operator.labels" . | nindent 4 }} + labels: + {{- include "teleport-cluster.operator.labels" . | nindent 4 }} + {{- if .Values.labels.deployment }} + {{- toYaml .Values.labels.deployment | nindent 4 }} + {{- end }} {{- if .Values.annotations.deployment }} annotations: {{- toYaml .Values.annotations.deployment | nindent 4 }} {{- end }} @@ -22,7 +26,11 @@ spec: {{- if .Values.annotations.pod }} annotations: {{- toYaml .Values.annotations.pod | nindent 8 }} {{- end }} - labels: {{- include "teleport-cluster.operator.labels" . | nindent 8 }} + labels: + {{- include "teleport-cluster.operator.labels" . | nindent 8 }} + {{- if .Values.labels.pod }} + {{- toYaml .Values.labels.pod | nindent 8 }} + {{- end }} spec: {{- if .Values.nodeSelector }} nodeSelector: {{- toYaml .Values.nodeSelector | nindent 8 }} diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/tests/deployment_test.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/tests/deployment_test.yaml index 56f8f5163280c..ca261d8056be4 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/tests/deployment_test.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/tests/deployment_test.yaml @@ -59,6 +59,25 @@ tests: path: metadata.annotations.kubernetes\.io/deployment-different value: 3 + - it: sets labels when specified + values: + - ../.lint/labels.yaml + asserts: + # Pod labels + - equal: + path: spec.template.metadata.labels.kubernetes\.io/pod + value: test-label + - equal: + path: spec.template.metadata.labels.kubernetes\.io/pod-different + value: 4 + # Deployment labels + - equal: + path: metadata.labels.kubernetes\.io/deployment + value: test-label + - equal: + path: metadata.labels.kubernetes\.io/deployment-different + value: 3 + - it: should mount tls.existingCASecretName and set environment when set in values values: - ../.lint/existing-tls-ca.yaml diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/values.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/values.yaml index f576b26ce68df..e79f4bb4b5222 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/values.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/values.yaml @@ -89,6 +89,15 @@ annotations: # put on the `Deployment` resource created by the chart. serviceAccount: {} +# annotations -- +labels: + # labels.deployment(object) -- contains the Kubernetes labels + # put on the `Deployment` resource created by the chart. + deployment: {} + # labels.pod(object) -- contains the Kubernetes labels + # put on the `Pod` resources created by the chart. + pod: {} + # serviceAccount -- serviceAccount: # serviceAccount.create(bool) -- controls if the chart should create the Kubernetes diff --git a/examples/chart/teleport-cluster/templates/auth/predeploy_job.yaml b/examples/chart/teleport-cluster/templates/auth/predeploy_job.yaml index d5a38e93ead74..c557c718042c3 100644 --- a/examples/chart/teleport-cluster/templates/auth/predeploy_job.yaml +++ b/examples/chart/teleport-cluster/templates/auth/predeploy_job.yaml @@ -17,6 +17,12 @@ metadata: spec: backoffLimit: 1 template: + metadata: + labels: + {{- include "teleport-cluster.auth.labels" . | nindent 8 }} + {{- if $auth.extraLabels.jobPod }} + {{- toYaml $auth.extraLabels.jobPod | nindent 8 }} + {{- end }} spec: {{- if $auth.affinity }} affinity: {{- toYaml $auth.affinity | nindent 8 }} diff --git a/examples/chart/teleport-cluster/templates/proxy/predeploy_job.yaml b/examples/chart/teleport-cluster/templates/proxy/predeploy_job.yaml index 0f4ddb4f7fff4..4484d9cadc095 100644 --- a/examples/chart/teleport-cluster/templates/proxy/predeploy_job.yaml +++ b/examples/chart/teleport-cluster/templates/proxy/predeploy_job.yaml @@ -17,6 +17,12 @@ metadata: spec: backoffLimit: 1 template: + metadata: + labels: + {{- include "teleport-cluster.proxy.labels" . | nindent 8 }} + {{- if $proxy.extraLabels.jobPod }} + {{- toYaml $proxy.extraLabels.jobPod | nindent 8 }} + {{- end }} spec: {{- if $proxy.affinity }} affinity: {{- toYaml $proxy.affinity | nindent 8 }} diff --git a/examples/chart/teleport-cluster/tests/predeploy_test.yaml b/examples/chart/teleport-cluster/tests/predeploy_test.yaml index 3ab3ad799e99c..7481cae5217df 100644 --- a/examples/chart/teleport-cluster/tests/predeploy_test.yaml +++ b/examples/chart/teleport-cluster/tests/predeploy_test.yaml @@ -133,6 +133,26 @@ tests: path: metadata.labels.baz value: overridden + - it: should set extraLabels.jobPod on auth predeploy job when set in values + template: auth/predeploy_job.yaml + set: + clusterName: helm-lint + extraLabels: + jobPod: + foo: bar + baz: override-me + auth: + extraLabels: + jobPod: + baz: overridden + asserts: + - equal: + path: spec.template.metadata.labels.foo + value: bar + - equal: + path: spec.template.metadata.labels.baz + value: overridden + - it: should set extraLabels on auth predeploy config when set in values template: auth/predeploy_config.yaml set: @@ -152,6 +172,7 @@ tests: - equal: path: metadata.labels.baz value: overridden + - it: should set extraLabels on proxy predeploy job when set in values template: proxy/predeploy_job.yaml set: @@ -172,6 +193,26 @@ tests: path: metadata.labels.baz value: overridden + - it: should set extraLabels.jobPod on proxy predeploy job when set in values + template: proxy/predeploy_job.yaml + set: + clusterName: helm-lint + extraLabels: + jobPod: + foo: bar + baz: override-me + proxy: + extraLabels: + jobPod: + baz: overridden + asserts: + - equal: + path: spec.template.metadata.labels.foo + value: bar + - equal: + path: spec.template.metadata.labels.baz + value: overridden + - it: should set extraLabels on proxy predeploy config when set in values template: proxy/predeploy_config.yaml set: diff --git a/examples/chart/teleport-cluster/values.yaml b/examples/chart/teleport-cluster/values.yaml index eba1e7c370a08..69344fc594897 100644 --- a/examples/chart/teleport-cluster/values.yaml +++ b/examples/chart/teleport-cluster/values.yaml @@ -654,6 +654,9 @@ extraLabels: ingress: {} # extraLabels.job(object) -- are labels to set on the Job run by the Helm hook. job: {} + # extraLabels.jobPod(object) -- are labels to set on the Pods created by the + # Job run by the Helm hook. + jobPod: {} # extraLabels.persistentVolumeClaim(object) -- are labels to set on the PersistentVolumeClaim. persistentVolumeClaim: {} # extraLabels.pod(object) -- are labels to set on the Pods created by the diff --git a/gen/proto/go/accessgraph/v1alpha/access_graph_service.pb.go b/gen/proto/go/accessgraph/v1alpha/access_graph_service.pb.go index 1e751856eb604..8a6ddfbfa2d54 100644 --- a/gen/proto/go/accessgraph/v1alpha/access_graph_service.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/access_graph_service.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: accessgraph/v1alpha/access_graph_service.proto @@ -1347,6 +1347,179 @@ func (*EntraEventsStreamResponse) Descriptor() ([]byte, []int) { return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{20} } +// AzureEventsStreamRequest is a request to send commands to the Azure importer +type AzureEventsStreamRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Operation: + // + // *AzureEventsStreamRequest_Sync + // *AzureEventsStreamRequest_Upsert + // *AzureEventsStreamRequest_Delete + Operation isAzureEventsStreamRequest_Operation `protobuf_oneof:"operation"` +} + +func (x *AzureEventsStreamRequest) Reset() { + *x = AzureEventsStreamRequest{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureEventsStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureEventsStreamRequest) ProtoMessage() {} + +func (x *AzureEventsStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[21] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureEventsStreamRequest.ProtoReflect.Descriptor instead. +func (*AzureEventsStreamRequest) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{21} +} + +func (m *AzureEventsStreamRequest) GetOperation() isAzureEventsStreamRequest_Operation { + if m != nil { + return m.Operation + } + return nil +} + +func (x *AzureEventsStreamRequest) GetSync() *AzureSyncOperation { + if x, ok := x.GetOperation().(*AzureEventsStreamRequest_Sync); ok { + return x.Sync + } + return nil +} + +func (x *AzureEventsStreamRequest) GetUpsert() *AzureResourceList { + if x, ok := x.GetOperation().(*AzureEventsStreamRequest_Upsert); ok { + return x.Upsert + } + return nil +} + +func (x *AzureEventsStreamRequest) GetDelete() *AzureResourceList { + if x, ok := x.GetOperation().(*AzureEventsStreamRequest_Delete); ok { + return x.Delete + } + return nil +} + +type isAzureEventsStreamRequest_Operation interface { + isAzureEventsStreamRequest_Operation() +} + +type AzureEventsStreamRequest_Sync struct { + // sync is a command to sync the access graph with the Teleport database state. + // it's issued once Teleport finishes syncing all resources with the database. + Sync *AzureSyncOperation `protobuf:"bytes,1,opt,name=sync,proto3,oneof"` +} + +type AzureEventsStreamRequest_Upsert struct { + // upsert is a command to put a resource into the access graph or update it. + Upsert *AzureResourceList `protobuf:"bytes,2,opt,name=upsert,proto3,oneof"` +} + +type AzureEventsStreamRequest_Delete struct { + // delete is a command to delete a resource from the access graph when it's deleted from Teleport. + Delete *AzureResourceList `protobuf:"bytes,3,opt,name=delete,proto3,oneof"` +} + +func (*AzureEventsStreamRequest_Sync) isAzureEventsStreamRequest_Operation() {} + +func (*AzureEventsStreamRequest_Upsert) isAzureEventsStreamRequest_Operation() {} + +func (*AzureEventsStreamRequest_Delete) isAzureEventsStreamRequest_Operation() {} + +// AzureSyncOperation is a command that Teleport sends to the access graph service +// at the end of the sync process. +type AzureSyncOperation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AzureSyncOperation) Reset() { + *x = AzureSyncOperation{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureSyncOperation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureSyncOperation) ProtoMessage() {} + +func (x *AzureSyncOperation) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[22] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureSyncOperation.ProtoReflect.Descriptor instead. +func (*AzureSyncOperation) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{22} +} + +// AzureEventsStreamResponse is a response from AzureEventsStream +type AzureEventsStreamResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *AzureEventsStreamResponse) Reset() { + *x = AzureEventsStreamResponse{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureEventsStreamResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureEventsStreamResponse) ProtoMessage() {} + +func (x *AzureEventsStreamResponse) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[23] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureEventsStreamResponse.ProtoReflect.Descriptor instead. +func (*AzureEventsStreamResponse) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{23} +} + var File_accessgraph_v1alpha_access_graph_service_proto protoreflect.FileDescriptor var file_accessgraph_v1alpha_access_graph_service_proto_rawDesc = []byte{ @@ -1357,32 +1530,61 @@ var file_accessgraph_v1alpha_access_graph_service_proto_rawDesc = []byte{ 0x61, 0x6c, 0x70, 0x68, 0x61, 0x1a, 0x1d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x61, 0x77, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x67, 0x69, 0x74, - 0x6c, 0x61, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x61, 0x63, 0x63, 0x65, + 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x65, 0x6e, 0x74, 0x72, 0x61, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x67, 0x69, + 0x74, 0x6c, 0x61, 0x62, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x24, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x71, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x64, 0x67, - 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xaa, 0x03, - 0x0a, 0x13, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0x24, 0x0a, 0x0c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x71, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x05, 0x65, 0x64, 0x67, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x64, + 0x67, 0x65, 0x52, 0x05, 0x65, 0x64, 0x67, 0x65, 0x73, 0x22, 0x2c, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x22, 0x25, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xaa, + 0x03, 0x0a, 0x13, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, + 0x12, 0x3b, 0x0a, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, + 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x12, 0x41, 0x0a, + 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x5b, 0x0a, 0x14, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x73, + 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, + 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x6f, 0x0a, + 0x1b, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x48, 0x00, 0x52, 0x18, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x42, 0x0b, + 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xac, 0x03, 0x0a, 0x15, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, @@ -1408,177 +1610,175 @@ var file_accessgraph_v1alpha_access_graph_service_proto_rawDesc = []byte{ 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x18, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x42, 0x0b, 0x0a, - 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xac, 0x03, 0x0a, 0x15, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x32, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x3b, - 0x0a, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x79, + 0x6e, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x16, 0x0a, 0x14, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x0a, 0x16, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, + 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x6f, 0x0a, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x58, + 0x0a, 0x13, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, + 0x68, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x22, 0x54, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x5f, + 0x70, 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x43, + 0x61, 0x50, 0x65, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x11, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43, 0x41, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x5f, 0x70, 0x65, 0x6d, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x43, 0x61, 0x50, 0x65, 0x6d, + 0x22, 0x14, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43, 0x41, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x16, 0x41, 0x57, 0x53, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x3b, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x3e, + 0x0a, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x12, 0x3e, + 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x0b, + 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x12, 0x0a, 0x10, 0x41, + 0x57, 0x53, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x19, 0x0a, 0x17, 0x41, 0x57, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xee, 0x01, 0x0a, 0x19, 0x47, + 0x69, 0x74, 0x6c, 0x61, 0x62, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, 0x69, 0x74, + 0x6c, 0x61, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x41, 0x0a, 0x06, 0x75, 0x70, 0x73, 0x65, + 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, + 0x69, 0x74, 0x6c, 0x61, 0x62, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x12, 0x41, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x5b, - 0x0a, 0x14, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x73, 0x5f, 0x6d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x73, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x6f, 0x0a, 0x1b, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, - 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x73, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x48, 0x00, 0x52, 0x18, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x42, 0x0b, 0x0a, 0x09, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x53, 0x79, 0x6e, - 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x5b, 0x0a, 0x16, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x6f, 0x0a, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x58, 0x0a, - 0x13, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x54, 0x0a, 0x0f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x5f, 0x70, - 0x65, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x43, 0x61, - 0x50, 0x65, 0x6d, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x0a, 0x11, 0x52, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43, 0x41, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1e, 0x0a, 0x0b, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x5f, 0x70, 0x65, 0x6d, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0c, 0x52, 0x09, 0x68, 0x6f, 0x73, 0x74, 0x43, 0x61, 0x50, 0x65, 0x6d, 0x22, - 0x14, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43, 0x41, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x16, 0x41, 0x57, 0x53, 0x45, 0x76, 0x65, + 0x61, 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x0b, + 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1c, 0x0a, 0x1a, 0x47, + 0x69, 0x74, 0x6c, 0x61, 0x62, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xea, 0x01, 0x0a, 0x18, 0x45, 0x6e, + 0x74, 0x72, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x61, + 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, + 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x40, 0x0a, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, + 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1b, 0x0a, 0x19, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xea, 0x01, 0x0a, 0x18, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3b, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, + 0x12, 0x3d, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x3e, 0x0a, - 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x12, 0x3e, 0x0a, - 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x0b, 0x0a, - 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x12, 0x0a, 0x10, 0x41, 0x57, - 0x53, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x19, - 0x0a, 0x17, 0x41, 0x57, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xee, 0x01, 0x0a, 0x19, 0x47, 0x69, - 0x74, 0x6c, 0x61, 0x62, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, 0x69, 0x74, 0x6c, - 0x61, 0x62, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, - 0x00, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x41, 0x0a, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, 0x69, - 0x74, 0x6c, 0x61, 0x62, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x12, 0x41, 0x0a, 0x06, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x63, 0x63, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x12, + 0x40, 0x0a, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, + 0x74, 0x12, 0x40, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x14, 0x0a, 0x12, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1b, 0x0a, 0x19, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x32, 0xa3, 0x08, 0x0a, 0x12, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x05, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x21, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, - 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x0b, 0x0a, - 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1c, 0x0a, 0x1a, 0x47, 0x69, - 0x74, 0x6c, 0x61, 0x62, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xea, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x74, - 0x72, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x04, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x53, - 0x79, 0x6e, 0x63, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x04, - 0x73, 0x79, 0x6e, 0x63, 0x12, 0x40, 0x0a, 0x06, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x61, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, - 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, - 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x6e, 0x74, - 0x72, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1b, 0x0a, 0x19, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x32, 0xab, 0x07, 0x0a, 0x12, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x05, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x21, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x65, 0x0a, 0x0c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, - 0x28, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x63, 0x63, 0x65, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x65, 0x0a, 0x0c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x12, 0x28, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x12, 0x6d, 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x32, 0x12, 0x2a, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x12, 0x6d, 0x0a, 0x0e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x32, 0x12, 0x2a, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x32, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x57, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5d, - 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43, 0x41, 0x73, 0x12, 0x26, 0x2e, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43, 0x41, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x43, 0x41, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, - 0x0f, 0x41, 0x57, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x12, 0x2b, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x32, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x57, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x24, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x5d, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43, 0x41, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x12, 0x79, 0x0a, - 0x12, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x12, 0x2e, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x76, 0x0a, 0x11, 0x45, 0x6e, 0x74, 0x72, - 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x2d, 0x2e, + 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x43, 0x41, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x43, 0x41, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, + 0x0a, 0x0f, 0x41, 0x57, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x12, 0x2b, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x57, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x12, 0x79, + 0x0a, 0x12, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x12, 0x2e, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, + 0x62, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, + 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x47, 0x69, 0x74, 0x6c, 0x61, + 0x62, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x12, 0x76, 0x0a, 0x11, 0x45, 0x6e, 0x74, + 0x72, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x2d, + 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, - 0x42, 0x57, 0x5a, 0x55, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, - 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x67, 0x6f, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, - 0x70, 0x68, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, + 0x01, 0x12, 0x76, 0x0a, 0x11, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x2d, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, + 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x57, 0x5a, 0x55, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, + 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3b, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1593,7 +1793,7 @@ func file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP() []byte { return file_accessgraph_v1alpha_access_graph_service_proto_rawDescData } -var file_accessgraph_v1alpha_access_graph_service_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_accessgraph_v1alpha_access_graph_service_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_accessgraph_v1alpha_access_graph_service_proto_goTypes = []any{ (*QueryRequest)(nil), // 0: accessgraph.v1alpha.QueryRequest (*QueryResponse)(nil), // 1: accessgraph.v1alpha.QueryResponse @@ -1616,66 +1816,75 @@ var file_accessgraph_v1alpha_access_graph_service_proto_goTypes = []any{ (*GitlabEventsStreamResponse)(nil), // 18: accessgraph.v1alpha.GitlabEventsStreamResponse (*EntraEventsStreamRequest)(nil), // 19: accessgraph.v1alpha.EntraEventsStreamRequest (*EntraEventsStreamResponse)(nil), // 20: accessgraph.v1alpha.EntraEventsStreamResponse - (*Node)(nil), // 21: accessgraph.v1alpha.Node - (*Edge)(nil), // 22: accessgraph.v1alpha.Edge - (*ResourceList)(nil), // 23: accessgraph.v1alpha.ResourceList - (*ResourceHeaderList)(nil), // 24: accessgraph.v1alpha.ResourceHeaderList - (*AccessListsMembers)(nil), // 25: accessgraph.v1alpha.AccessListsMembers - (*ExcludeAccessListsMembers)(nil), // 26: accessgraph.v1alpha.ExcludeAccessListsMembers - (*AccessPathChanged)(nil), // 27: accessgraph.v1alpha.AccessPathChanged - (*AWSResourceList)(nil), // 28: accessgraph.v1alpha.AWSResourceList - (*GitlabSyncOperation)(nil), // 29: accessgraph.v1alpha.GitlabSyncOperation - (*GitlabResourceList)(nil), // 30: accessgraph.v1alpha.GitlabResourceList - (*EntraSyncOperation)(nil), // 31: accessgraph.v1alpha.EntraSyncOperation - (*EntraResourceList)(nil), // 32: accessgraph.v1alpha.EntraResourceList + (*AzureEventsStreamRequest)(nil), // 21: accessgraph.v1alpha.AzureEventsStreamRequest + (*AzureSyncOperation)(nil), // 22: accessgraph.v1alpha.AzureSyncOperation + (*AzureEventsStreamResponse)(nil), // 23: accessgraph.v1alpha.AzureEventsStreamResponse + (*Node)(nil), // 24: accessgraph.v1alpha.Node + (*Edge)(nil), // 25: accessgraph.v1alpha.Edge + (*ResourceList)(nil), // 26: accessgraph.v1alpha.ResourceList + (*ResourceHeaderList)(nil), // 27: accessgraph.v1alpha.ResourceHeaderList + (*AccessListsMembers)(nil), // 28: accessgraph.v1alpha.AccessListsMembers + (*ExcludeAccessListsMembers)(nil), // 29: accessgraph.v1alpha.ExcludeAccessListsMembers + (*AccessPathChanged)(nil), // 30: accessgraph.v1alpha.AccessPathChanged + (*AWSResourceList)(nil), // 31: accessgraph.v1alpha.AWSResourceList + (*GitlabSyncOperation)(nil), // 32: accessgraph.v1alpha.GitlabSyncOperation + (*GitlabResourceList)(nil), // 33: accessgraph.v1alpha.GitlabResourceList + (*EntraSyncOperation)(nil), // 34: accessgraph.v1alpha.EntraSyncOperation + (*EntraResourceList)(nil), // 35: accessgraph.v1alpha.EntraResourceList + (*AzureResourceList)(nil), // 36: accessgraph.v1alpha.AzureResourceList } var file_accessgraph_v1alpha_access_graph_service_proto_depIdxs = []int32{ - 21, // 0: accessgraph.v1alpha.QueryResponse.nodes:type_name -> accessgraph.v1alpha.Node - 22, // 1: accessgraph.v1alpha.QueryResponse.edges:type_name -> accessgraph.v1alpha.Edge + 24, // 0: accessgraph.v1alpha.QueryResponse.nodes:type_name -> accessgraph.v1alpha.Node + 25, // 1: accessgraph.v1alpha.QueryResponse.edges:type_name -> accessgraph.v1alpha.Edge 6, // 2: accessgraph.v1alpha.EventsStreamRequest.sync:type_name -> accessgraph.v1alpha.SyncOperation - 23, // 3: accessgraph.v1alpha.EventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.ResourceList - 24, // 4: accessgraph.v1alpha.EventsStreamRequest.delete:type_name -> accessgraph.v1alpha.ResourceHeaderList - 25, // 5: accessgraph.v1alpha.EventsStreamRequest.access_lists_members:type_name -> accessgraph.v1alpha.AccessListsMembers - 26, // 6: accessgraph.v1alpha.EventsStreamRequest.exclude_access_list_members:type_name -> accessgraph.v1alpha.ExcludeAccessListsMembers + 26, // 3: accessgraph.v1alpha.EventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.ResourceList + 27, // 4: accessgraph.v1alpha.EventsStreamRequest.delete:type_name -> accessgraph.v1alpha.ResourceHeaderList + 28, // 5: accessgraph.v1alpha.EventsStreamRequest.access_lists_members:type_name -> accessgraph.v1alpha.AccessListsMembers + 29, // 6: accessgraph.v1alpha.EventsStreamRequest.exclude_access_list_members:type_name -> accessgraph.v1alpha.ExcludeAccessListsMembers 6, // 7: accessgraph.v1alpha.EventsStreamV2Request.sync:type_name -> accessgraph.v1alpha.SyncOperation - 23, // 8: accessgraph.v1alpha.EventsStreamV2Request.upsert:type_name -> accessgraph.v1alpha.ResourceList - 24, // 9: accessgraph.v1alpha.EventsStreamV2Request.delete:type_name -> accessgraph.v1alpha.ResourceHeaderList - 25, // 10: accessgraph.v1alpha.EventsStreamV2Request.access_lists_members:type_name -> accessgraph.v1alpha.AccessListsMembers - 26, // 11: accessgraph.v1alpha.EventsStreamV2Request.exclude_access_list_members:type_name -> accessgraph.v1alpha.ExcludeAccessListsMembers + 26, // 8: accessgraph.v1alpha.EventsStreamV2Request.upsert:type_name -> accessgraph.v1alpha.ResourceList + 27, // 9: accessgraph.v1alpha.EventsStreamV2Request.delete:type_name -> accessgraph.v1alpha.ResourceHeaderList + 28, // 10: accessgraph.v1alpha.EventsStreamV2Request.access_lists_members:type_name -> accessgraph.v1alpha.AccessListsMembers + 29, // 11: accessgraph.v1alpha.EventsStreamV2Request.exclude_access_list_members:type_name -> accessgraph.v1alpha.ExcludeAccessListsMembers 9, // 12: accessgraph.v1alpha.EventsStreamV2Response.event:type_name -> accessgraph.v1alpha.AuditEvent - 27, // 13: accessgraph.v1alpha.AuditEvent.access_path_changed:type_name -> accessgraph.v1alpha.AccessPathChanged + 30, // 13: accessgraph.v1alpha.AuditEvent.access_path_changed:type_name -> accessgraph.v1alpha.AccessPathChanged 15, // 14: accessgraph.v1alpha.AWSEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.AWSSyncOperation - 28, // 15: accessgraph.v1alpha.AWSEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.AWSResourceList - 28, // 16: accessgraph.v1alpha.AWSEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.AWSResourceList - 29, // 17: accessgraph.v1alpha.GitlabEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.GitlabSyncOperation - 30, // 18: accessgraph.v1alpha.GitlabEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.GitlabResourceList - 30, // 19: accessgraph.v1alpha.GitlabEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.GitlabResourceList - 31, // 20: accessgraph.v1alpha.EntraEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.EntraSyncOperation - 32, // 21: accessgraph.v1alpha.EntraEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.EntraResourceList - 32, // 22: accessgraph.v1alpha.EntraEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.EntraResourceList - 0, // 23: accessgraph.v1alpha.AccessGraphService.Query:input_type -> accessgraph.v1alpha.QueryRequest - 2, // 24: accessgraph.v1alpha.AccessGraphService.GetFile:input_type -> accessgraph.v1alpha.GetFileRequest - 4, // 25: accessgraph.v1alpha.AccessGraphService.EventsStream:input_type -> accessgraph.v1alpha.EventsStreamRequest - 5, // 26: accessgraph.v1alpha.AccessGraphService.EventsStreamV2:input_type -> accessgraph.v1alpha.EventsStreamV2Request - 10, // 27: accessgraph.v1alpha.AccessGraphService.Register:input_type -> accessgraph.v1alpha.RegisterRequest - 12, // 28: accessgraph.v1alpha.AccessGraphService.ReplaceCAs:input_type -> accessgraph.v1alpha.ReplaceCAsRequest - 14, // 29: accessgraph.v1alpha.AccessGraphService.AWSEventsStream:input_type -> accessgraph.v1alpha.AWSEventsStreamRequest - 17, // 30: accessgraph.v1alpha.AccessGraphService.GitlabEventsStream:input_type -> accessgraph.v1alpha.GitlabEventsStreamRequest - 19, // 31: accessgraph.v1alpha.AccessGraphService.EntraEventsStream:input_type -> accessgraph.v1alpha.EntraEventsStreamRequest - 1, // 32: accessgraph.v1alpha.AccessGraphService.Query:output_type -> accessgraph.v1alpha.QueryResponse - 3, // 33: accessgraph.v1alpha.AccessGraphService.GetFile:output_type -> accessgraph.v1alpha.GetFileResponse - 7, // 34: accessgraph.v1alpha.AccessGraphService.EventsStream:output_type -> accessgraph.v1alpha.EventsStreamResponse - 8, // 35: accessgraph.v1alpha.AccessGraphService.EventsStreamV2:output_type -> accessgraph.v1alpha.EventsStreamV2Response - 11, // 36: accessgraph.v1alpha.AccessGraphService.Register:output_type -> accessgraph.v1alpha.RegisterResponse - 13, // 37: accessgraph.v1alpha.AccessGraphService.ReplaceCAs:output_type -> accessgraph.v1alpha.ReplaceCAsResponse - 16, // 38: accessgraph.v1alpha.AccessGraphService.AWSEventsStream:output_type -> accessgraph.v1alpha.AWSEventsStreamResponse - 18, // 39: accessgraph.v1alpha.AccessGraphService.GitlabEventsStream:output_type -> accessgraph.v1alpha.GitlabEventsStreamResponse - 20, // 40: accessgraph.v1alpha.AccessGraphService.EntraEventsStream:output_type -> accessgraph.v1alpha.EntraEventsStreamResponse - 32, // [32:41] is the sub-list for method output_type - 23, // [23:32] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 23, // [23:23] is the sub-list for extension extendee - 0, // [0:23] is the sub-list for field type_name + 31, // 15: accessgraph.v1alpha.AWSEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.AWSResourceList + 31, // 16: accessgraph.v1alpha.AWSEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.AWSResourceList + 32, // 17: accessgraph.v1alpha.GitlabEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.GitlabSyncOperation + 33, // 18: accessgraph.v1alpha.GitlabEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.GitlabResourceList + 33, // 19: accessgraph.v1alpha.GitlabEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.GitlabResourceList + 34, // 20: accessgraph.v1alpha.EntraEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.EntraSyncOperation + 35, // 21: accessgraph.v1alpha.EntraEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.EntraResourceList + 35, // 22: accessgraph.v1alpha.EntraEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.EntraResourceList + 22, // 23: accessgraph.v1alpha.AzureEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.AzureSyncOperation + 36, // 24: accessgraph.v1alpha.AzureEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.AzureResourceList + 36, // 25: accessgraph.v1alpha.AzureEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.AzureResourceList + 0, // 26: accessgraph.v1alpha.AccessGraphService.Query:input_type -> accessgraph.v1alpha.QueryRequest + 2, // 27: accessgraph.v1alpha.AccessGraphService.GetFile:input_type -> accessgraph.v1alpha.GetFileRequest + 4, // 28: accessgraph.v1alpha.AccessGraphService.EventsStream:input_type -> accessgraph.v1alpha.EventsStreamRequest + 5, // 29: accessgraph.v1alpha.AccessGraphService.EventsStreamV2:input_type -> accessgraph.v1alpha.EventsStreamV2Request + 10, // 30: accessgraph.v1alpha.AccessGraphService.Register:input_type -> accessgraph.v1alpha.RegisterRequest + 12, // 31: accessgraph.v1alpha.AccessGraphService.ReplaceCAs:input_type -> accessgraph.v1alpha.ReplaceCAsRequest + 14, // 32: accessgraph.v1alpha.AccessGraphService.AWSEventsStream:input_type -> accessgraph.v1alpha.AWSEventsStreamRequest + 17, // 33: accessgraph.v1alpha.AccessGraphService.GitlabEventsStream:input_type -> accessgraph.v1alpha.GitlabEventsStreamRequest + 19, // 34: accessgraph.v1alpha.AccessGraphService.EntraEventsStream:input_type -> accessgraph.v1alpha.EntraEventsStreamRequest + 21, // 35: accessgraph.v1alpha.AccessGraphService.AzureEventsStream:input_type -> accessgraph.v1alpha.AzureEventsStreamRequest + 1, // 36: accessgraph.v1alpha.AccessGraphService.Query:output_type -> accessgraph.v1alpha.QueryResponse + 3, // 37: accessgraph.v1alpha.AccessGraphService.GetFile:output_type -> accessgraph.v1alpha.GetFileResponse + 7, // 38: accessgraph.v1alpha.AccessGraphService.EventsStream:output_type -> accessgraph.v1alpha.EventsStreamResponse + 8, // 39: accessgraph.v1alpha.AccessGraphService.EventsStreamV2:output_type -> accessgraph.v1alpha.EventsStreamV2Response + 11, // 40: accessgraph.v1alpha.AccessGraphService.Register:output_type -> accessgraph.v1alpha.RegisterResponse + 13, // 41: accessgraph.v1alpha.AccessGraphService.ReplaceCAs:output_type -> accessgraph.v1alpha.ReplaceCAsResponse + 16, // 42: accessgraph.v1alpha.AccessGraphService.AWSEventsStream:output_type -> accessgraph.v1alpha.AWSEventsStreamResponse + 18, // 43: accessgraph.v1alpha.AccessGraphService.GitlabEventsStream:output_type -> accessgraph.v1alpha.GitlabEventsStreamResponse + 20, // 44: accessgraph.v1alpha.AccessGraphService.EntraEventsStream:output_type -> accessgraph.v1alpha.EntraEventsStreamResponse + 23, // 45: accessgraph.v1alpha.AccessGraphService.AzureEventsStream:output_type -> accessgraph.v1alpha.AzureEventsStreamResponse + 36, // [36:46] is the sub-list for method output_type + 26, // [26:36] is the sub-list for method input_type + 26, // [26:26] is the sub-list for extension type_name + 26, // [26:26] is the sub-list for extension extendee + 0, // [0:26] is the sub-list for field type_name } func init() { file_accessgraph_v1alpha_access_graph_service_proto_init() } @@ -1684,6 +1893,7 @@ func file_accessgraph_v1alpha_access_graph_service_proto_init() { return } file_accessgraph_v1alpha_aws_proto_init() + file_accessgraph_v1alpha_azure_proto_init() file_accessgraph_v1alpha_entra_proto_init() file_accessgraph_v1alpha_events_proto_init() file_accessgraph_v1alpha_gitlab_proto_init() @@ -1724,13 +1934,18 @@ func file_accessgraph_v1alpha_access_graph_service_proto_init() { (*EntraEventsStreamRequest_Upsert)(nil), (*EntraEventsStreamRequest_Delete)(nil), } + file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[21].OneofWrappers = []any{ + (*AzureEventsStreamRequest_Sync)(nil), + (*AzureEventsStreamRequest_Upsert)(nil), + (*AzureEventsStreamRequest_Delete)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_accessgraph_v1alpha_access_graph_service_proto_rawDesc, NumEnums: 0, - NumMessages: 21, + NumMessages: 24, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/proto/go/accessgraph/v1alpha/access_graph_service_grpc.pb.go b/gen/proto/go/accessgraph/v1alpha/access_graph_service_grpc.pb.go index 25084921269d9..7bc14a2bb03e0 100644 --- a/gen/proto/go/accessgraph/v1alpha/access_graph_service_grpc.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/access_graph_service_grpc.pb.go @@ -45,6 +45,7 @@ const ( AccessGraphService_AWSEventsStream_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/AWSEventsStream" AccessGraphService_GitlabEventsStream_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/GitlabEventsStream" AccessGraphService_EntraEventsStream_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/EntraEventsStream" + AccessGraphService_AzureEventsStream_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/AzureEventsStream" ) // AccessGraphServiceClient is the client API for AccessGraphService service. @@ -92,6 +93,8 @@ type AccessGraphServiceClient interface { GitlabEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[GitlabEventsStreamRequest, GitlabEventsStreamResponse], error) // EntraEventsStream is a stream of commands to the Entra ID SSO importer. EntraEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[EntraEventsStreamRequest, EntraEventsStreamResponse], error) + // AzureEventsStream is a stream of commands to the Azure importer + AzureEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[AzureEventsStreamRequest, AzureEventsStreamResponse], error) } type accessGraphServiceClient struct { @@ -207,6 +210,19 @@ func (c *accessGraphServiceClient) EntraEventsStream(ctx context.Context, opts . // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type AccessGraphService_EntraEventsStreamClient = grpc.BidiStreamingClient[EntraEventsStreamRequest, EntraEventsStreamResponse] +func (c *accessGraphServiceClient) AzureEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[AzureEventsStreamRequest, AzureEventsStreamResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[5], AccessGraphService_AzureEventsStream_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[AzureEventsStreamRequest, AzureEventsStreamResponse]{ClientStream: stream} + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AccessGraphService_AzureEventsStreamClient = grpc.BidiStreamingClient[AzureEventsStreamRequest, AzureEventsStreamResponse] + // AccessGraphServiceServer is the server API for AccessGraphService service. // All implementations must embed UnimplementedAccessGraphServiceServer // for forward compatibility. @@ -252,6 +268,8 @@ type AccessGraphServiceServer interface { GitlabEventsStream(grpc.BidiStreamingServer[GitlabEventsStreamRequest, GitlabEventsStreamResponse]) error // EntraEventsStream is a stream of commands to the Entra ID SSO importer. EntraEventsStream(grpc.BidiStreamingServer[EntraEventsStreamRequest, EntraEventsStreamResponse]) error + // AzureEventsStream is a stream of commands to the Azure importer + AzureEventsStream(grpc.BidiStreamingServer[AzureEventsStreamRequest, AzureEventsStreamResponse]) error mustEmbedUnimplementedAccessGraphServiceServer() } @@ -289,6 +307,9 @@ func (UnimplementedAccessGraphServiceServer) GitlabEventsStream(grpc.BidiStreami func (UnimplementedAccessGraphServiceServer) EntraEventsStream(grpc.BidiStreamingServer[EntraEventsStreamRequest, EntraEventsStreamResponse]) error { return status.Errorf(codes.Unimplemented, "method EntraEventsStream not implemented") } +func (UnimplementedAccessGraphServiceServer) AzureEventsStream(grpc.BidiStreamingServer[AzureEventsStreamRequest, AzureEventsStreamResponse]) error { + return status.Errorf(codes.Unimplemented, "method AzureEventsStream not implemented") +} func (UnimplementedAccessGraphServiceServer) mustEmbedUnimplementedAccessGraphServiceServer() {} func (UnimplementedAccessGraphServiceServer) testEmbeddedByValue() {} @@ -417,6 +438,13 @@ func _AccessGraphService_EntraEventsStream_Handler(srv interface{}, stream grpc. // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type AccessGraphService_EntraEventsStreamServer = grpc.BidiStreamingServer[EntraEventsStreamRequest, EntraEventsStreamResponse] +func _AccessGraphService_AzureEventsStream_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(AccessGraphServiceServer).AzureEventsStream(&grpc.GenericServerStream[AzureEventsStreamRequest, AzureEventsStreamResponse]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AccessGraphService_AzureEventsStreamServer = grpc.BidiStreamingServer[AzureEventsStreamRequest, AzureEventsStreamResponse] + // AccessGraphService_ServiceDesc is the grpc.ServiceDesc for AccessGraphService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -470,6 +498,12 @@ var AccessGraphService_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, ClientStreams: true, }, + { + StreamName: "AzureEventsStream", + Handler: _AccessGraphService_AzureEventsStream_Handler, + ServerStreams: true, + ClientStreams: true, + }, }, Metadata: "accessgraph/v1alpha/access_graph_service.proto", } diff --git a/gen/proto/go/accessgraph/v1alpha/aws.pb.go b/gen/proto/go/accessgraph/v1alpha/aws.pb.go index f94b60b03a43d..e183e6181f55d 100644 --- a/gen/proto/go/accessgraph/v1alpha/aws.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/aws.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: accessgraph/v1alpha/aws.proto diff --git a/gen/proto/go/accessgraph/v1alpha/azure.pb.go b/gen/proto/go/accessgraph/v1alpha/azure.pb.go new file mode 100644 index 0000000000000..308847e258ba9 --- /dev/null +++ b/gen/proto/go/accessgraph/v1alpha/azure.pb.go @@ -0,0 +1,979 @@ +// +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.2 +// protoc (unknown) +// source: accessgraph/v1alpha/azure.proto + +package accessgraphv1alpha + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// AzureResourceList is a list of Azure resources +type AzureResourceList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Resources []*AzureResource `protobuf:"bytes,1,rep,name=resources,proto3" json:"resources,omitempty"` +} + +func (x *AzureResourceList) Reset() { + *x = AzureResourceList{} + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureResourceList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureResourceList) ProtoMessage() {} + +func (x *AzureResourceList) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureResourceList.ProtoReflect.Descriptor instead. +func (*AzureResourceList) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{0} +} + +func (x *AzureResourceList) GetResources() []*AzureResource { + if x != nil { + return x.Resources + } + return nil +} + +// AzureResource is a list of Azure resources supported by the access graph. +type AzureResource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Resource: + // + // *AzureResource_Principal + // *AzureResource_RoleDefinition + // *AzureResource_RoleAssignment + // *AzureResource_VirtualMachine + Resource isAzureResource_Resource `protobuf_oneof:"resource"` +} + +func (x *AzureResource) Reset() { + *x = AzureResource{} + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureResource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureResource) ProtoMessage() {} + +func (x *AzureResource) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureResource.ProtoReflect.Descriptor instead. +func (*AzureResource) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{1} +} + +func (m *AzureResource) GetResource() isAzureResource_Resource { + if m != nil { + return m.Resource + } + return nil +} + +func (x *AzureResource) GetPrincipal() *AzurePrincipal { + if x, ok := x.GetResource().(*AzureResource_Principal); ok { + return x.Principal + } + return nil +} + +func (x *AzureResource) GetRoleDefinition() *AzureRoleDefinition { + if x, ok := x.GetResource().(*AzureResource_RoleDefinition); ok { + return x.RoleDefinition + } + return nil +} + +func (x *AzureResource) GetRoleAssignment() *AzureRoleAssignment { + if x, ok := x.GetResource().(*AzureResource_RoleAssignment); ok { + return x.RoleAssignment + } + return nil +} + +func (x *AzureResource) GetVirtualMachine() *AzureVirtualMachine { + if x, ok := x.GetResource().(*AzureResource_VirtualMachine); ok { + return x.VirtualMachine + } + return nil +} + +type isAzureResource_Resource interface { + isAzureResource_Resource() +} + +type AzureResource_Principal struct { + // principal is an Azure principal + Principal *AzurePrincipal `protobuf:"bytes,1,opt,name=principal,proto3,oneof"` +} + +type AzureResource_RoleDefinition struct { + // role_definition is an Azure role definition + RoleDefinition *AzureRoleDefinition `protobuf:"bytes,2,opt,name=role_definition,json=roleDefinition,proto3,oneof"` +} + +type AzureResource_RoleAssignment struct { + // role_assignment is an Azure role assignment, which assigns a role definition to a principal + RoleAssignment *AzureRoleAssignment `protobuf:"bytes,3,opt,name=role_assignment,json=roleAssignment,proto3,oneof"` +} + +type AzureResource_VirtualMachine struct { + // virtual_machine is an Azure virtual machine, an instance of a compute resource + VirtualMachine *AzureVirtualMachine `protobuf:"bytes,4,opt,name=virtual_machine,json=virtualMachine,proto3,oneof"` +} + +func (*AzureResource_Principal) isAzureResource_Resource() {} + +func (*AzureResource_RoleDefinition) isAzureResource_Resource() {} + +func (*AzureResource_RoleAssignment) isAzureResource_Resource() {} + +func (*AzureResource_VirtualMachine) isAzureResource_Resource() {} + +// AzureVirtualMachine is an Azure virtual machine +type AzureVirtualMachine struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // id is the ID of the virtual machine + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // subscription_id is the ID of the subscription to which the virtual machine belongs + SubscriptionId string `protobuf:"bytes,2,opt,name=subscription_id,json=subscriptionId,proto3" json:"subscription_id,omitempty"` + // last_sync_time is when the virtual machine was last fetched from Azure + LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"` + // name is the given name of the virtual machine + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // resource_group is the name of the resource group to which the virtual machine belongs + ResourceGroup string `protobuf:"bytes,5,opt,name=resource_group,json=resourceGroup,proto3" json:"resource_group,omitempty"` + // tags are a collection of arbitrary key-values applied to the virtual machine + Tags map[string]string `protobuf:"bytes,6,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // location is the geographical location of the Virtual Machine + Location string `protobuf:"bytes,7,opt,name=location,proto3" json:"location,omitempty"` +} + +func (x *AzureVirtualMachine) Reset() { + *x = AzureVirtualMachine{} + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureVirtualMachine) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureVirtualMachine) ProtoMessage() {} + +func (x *AzureVirtualMachine) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureVirtualMachine.ProtoReflect.Descriptor instead. +func (*AzureVirtualMachine) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{2} +} + +func (x *AzureVirtualMachine) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AzureVirtualMachine) GetSubscriptionId() string { + if x != nil { + return x.SubscriptionId + } + return "" +} + +func (x *AzureVirtualMachine) GetLastSyncTime() *timestamppb.Timestamp { + if x != nil { + return x.LastSyncTime + } + return nil +} + +func (x *AzureVirtualMachine) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AzureVirtualMachine) GetResourceGroup() string { + if x != nil { + return x.ResourceGroup + } + return "" +} + +func (x *AzureVirtualMachine) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + +func (x *AzureVirtualMachine) GetLocation() string { + if x != nil { + return x.Location + } + return "" +} + +// AzureIdentity is a Graph API object identity +type AzureIdentity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // sign_in_type is the type of identity used when signing in, e.g. "emailAddress" or "userName" + SignInType string `protobuf:"bytes,1,opt,name=sign_in_type,json=signInType,proto3" json:"sign_in_type,omitempty"` + // issuer is the issuer of the identity, such as a domain name like "goteleport.com" + Issuer string `protobuf:"bytes,2,opt,name=issuer,proto3" json:"issuer,omitempty"` + // issuer_assigned_id unique identifier assigned to the user by the issuer + IssuerAssignedId string `protobuf:"bytes,3,opt,name=issuer_assigned_id,json=issuerAssignedId,proto3" json:"issuer_assigned_id,omitempty"` +} + +func (x *AzureIdentity) Reset() { + *x = AzureIdentity{} + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureIdentity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureIdentity) ProtoMessage() {} + +func (x *AzureIdentity) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureIdentity.ProtoReflect.Descriptor instead. +func (*AzureIdentity) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{3} +} + +func (x *AzureIdentity) GetSignInType() string { + if x != nil { + return x.SignInType + } + return "" +} + +func (x *AzureIdentity) GetIssuer() string { + if x != nil { + return x.Issuer + } + return "" +} + +func (x *AzureIdentity) GetIssuerAssignedId() string { + if x != nil { + return x.IssuerAssignedId + } + return "" +} + +// AzurePrincipal is a Graph API principal (user, group, service principal) +type AzurePrincipal struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // id is the ID of the principal + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // subscription_id is the ID of the subscription to which the principal belongs + SubscriptionId string `protobuf:"bytes,2,opt,name=subscription_id,json=subscriptionId,proto3" json:"subscription_id,omitempty"` + // last_sync_time is when the principal was last fetched from Azure + LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"` + // display_name is the given name for the principal, e.g. a user's first+last name + DisplayName string `protobuf:"bytes,4,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // member_of lists the groups and directories the principal is assigned to + MemberOf []string `protobuf:"bytes,5,rep,name=member_of,json=memberOf,proto3" json:"member_of,omitempty"` + // identities lists the identities that can be used to sign in to the account + Identities []*AzureIdentity `protobuf:"bytes,6,rep,name=identities,proto3" json:"identities,omitempty"` + // object_type defines the type of principal, e.g. "user" or "group" + ObjectType string `protobuf:"bytes,7,opt,name=object_type,json=objectType,proto3" json:"object_type,omitempty"` +} + +func (x *AzurePrincipal) Reset() { + *x = AzurePrincipal{} + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzurePrincipal) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzurePrincipal) ProtoMessage() {} + +func (x *AzurePrincipal) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzurePrincipal.ProtoReflect.Descriptor instead. +func (*AzurePrincipal) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{4} +} + +func (x *AzurePrincipal) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AzurePrincipal) GetSubscriptionId() string { + if x != nil { + return x.SubscriptionId + } + return "" +} + +func (x *AzurePrincipal) GetLastSyncTime() *timestamppb.Timestamp { + if x != nil { + return x.LastSyncTime + } + return nil +} + +func (x *AzurePrincipal) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *AzurePrincipal) GetMemberOf() []string { + if x != nil { + return x.MemberOf + } + return nil +} + +func (x *AzurePrincipal) GetIdentities() []*AzureIdentity { + if x != nil { + return x.Identities + } + return nil +} + +func (x *AzurePrincipal) GetObjectType() string { + if x != nil { + return x.ObjectType + } + return "" +} + +// AzureRoleAssignment links an Azure principal to a role definition with a scope +type AzureRoleAssignment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // id is the ID of the role assignment + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // subscription_id is the ID of the subscription to which the role assignment belongs + SubscriptionId string `protobuf:"bytes,2,opt,name=subscription_id,json=subscriptionId,proto3" json:"subscription_id,omitempty"` + // last_sync_time is when the role assignment was last fetched from Azure + LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"` + // principal_id is the ID of the principal being assigned a role + PrincipalId string `protobuf:"bytes,4,opt,name=principal_id,json=principalId,proto3" json:"principal_id,omitempty"` + // role_definition_id is the ID of the role definition assigned to the principal + RoleDefinitionId string `protobuf:"bytes,5,opt,name=role_definition_id,json=roleDefinitionId,proto3" json:"role_definition_id,omitempty"` + // scope constrains which resources the assignment applies to + Scope string `protobuf:"bytes,6,opt,name=scope,proto3" json:"scope,omitempty"` + // condition further which resources the assignment applies to + Condition string `protobuf:"bytes,7,opt,name=condition,proto3" json:"condition,omitempty"` +} + +func (x *AzureRoleAssignment) Reset() { + *x = AzureRoleAssignment{} + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureRoleAssignment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureRoleAssignment) ProtoMessage() {} + +func (x *AzureRoleAssignment) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureRoleAssignment.ProtoReflect.Descriptor instead. +func (*AzureRoleAssignment) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{5} +} + +func (x *AzureRoleAssignment) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AzureRoleAssignment) GetSubscriptionId() string { + if x != nil { + return x.SubscriptionId + } + return "" +} + +func (x *AzureRoleAssignment) GetLastSyncTime() *timestamppb.Timestamp { + if x != nil { + return x.LastSyncTime + } + return nil +} + +func (x *AzureRoleAssignment) GetPrincipalId() string { + if x != nil { + return x.PrincipalId + } + return "" +} + +func (x *AzureRoleAssignment) GetRoleDefinitionId() string { + if x != nil { + return x.RoleDefinitionId + } + return "" +} + +func (x *AzureRoleAssignment) GetScope() string { + if x != nil { + return x.Scope + } + return "" +} + +func (x *AzureRoleAssignment) GetCondition() string { + if x != nil { + return x.Condition + } + return "" +} + +// AzureRoleDefinition defines a role by its permissions +type AzureRoleDefinition struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // id is the ID of the role definition + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // subscription_id is the ID of the subscription to which the role definition belongs + SubscriptionId string `protobuf:"bytes,2,opt,name=subscription_id,json=subscriptionId,proto3" json:"subscription_id,omitempty"` + // last_sync_time is when the role definition was last fetched from Azure + LastSyncTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_sync_time,json=lastSyncTime,proto3" json:"last_sync_time,omitempty"` + // name is the given name for the role definition + Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` + // description provides additional detail about the role definition + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` + // assignable_scopes limits the scopes defined in corresponding role assignments + AssignableScopes []string `protobuf:"bytes,6,rep,name=assignable_scopes,json=assignableScopes,proto3" json:"assignable_scopes,omitempty"` + // permissions define the actions and not (disallowed) actions + Permissions []*AzureRBACPermission `protobuf:"bytes,7,rep,name=permissions,proto3" json:"permissions,omitempty"` + // role_name is the given name for the role itself + RoleName string `protobuf:"bytes,8,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + // type defines the type of role + Type string `protobuf:"bytes,9,opt,name=type,proto3" json:"type,omitempty"` +} + +func (x *AzureRoleDefinition) Reset() { + *x = AzureRoleDefinition{} + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureRoleDefinition) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureRoleDefinition) ProtoMessage() {} + +func (x *AzureRoleDefinition) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureRoleDefinition.ProtoReflect.Descriptor instead. +func (*AzureRoleDefinition) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{6} +} + +func (x *AzureRoleDefinition) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AzureRoleDefinition) GetSubscriptionId() string { + if x != nil { + return x.SubscriptionId + } + return "" +} + +func (x *AzureRoleDefinition) GetLastSyncTime() *timestamppb.Timestamp { + if x != nil { + return x.LastSyncTime + } + return nil +} + +func (x *AzureRoleDefinition) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AzureRoleDefinition) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *AzureRoleDefinition) GetAssignableScopes() []string { + if x != nil { + return x.AssignableScopes + } + return nil +} + +func (x *AzureRoleDefinition) GetPermissions() []*AzureRBACPermission { + if x != nil { + return x.Permissions + } + return nil +} + +func (x *AzureRoleDefinition) GetRoleName() string { + if x != nil { + return x.RoleName + } + return "" +} + +func (x *AzureRoleDefinition) GetType() string { + if x != nil { + return x.Type + } + return "" +} + +// AzurePermission defines the actions and not (disallowed) actions for a role definition +type AzureRBACPermission struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // actions define the resources and verbs allowed on the resources + Actions []string `protobuf:"bytes,1,rep,name=actions,proto3" json:"actions,omitempty"` + // not_actions define the resources and verbs disallowed on the resources + NotActions []string `protobuf:"bytes,2,rep,name=not_actions,json=notActions,proto3" json:"not_actions,omitempty"` + // data_actions define fine-grained resources and verbs allowed within the resource + DataActions []string `protobuf:"bytes,3,rep,name=data_actions,json=dataActions,proto3" json:"data_actions,omitempty"` + // not_data_actions define fine-grained resources and verbs disallowed within the resource + NotDataActions []string `protobuf:"bytes,4,rep,name=not_data_actions,json=notDataActions,proto3" json:"not_data_actions,omitempty"` +} + +func (x *AzureRBACPermission) Reset() { + *x = AzureRBACPermission{} + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AzureRBACPermission) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AzureRBACPermission) ProtoMessage() {} + +func (x *AzureRBACPermission) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_azure_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AzureRBACPermission.ProtoReflect.Descriptor instead. +func (*AzureRBACPermission) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_azure_proto_rawDescGZIP(), []int{7} +} + +func (x *AzureRBACPermission) GetActions() []string { + if x != nil { + return x.Actions + } + return nil +} + +func (x *AzureRBACPermission) GetNotActions() []string { + if x != nil { + return x.NotActions + } + return nil +} + +func (x *AzureRBACPermission) GetDataActions() []string { + if x != nil { + return x.DataActions + } + return nil +} + +func (x *AzureRBACPermission) GetNotDataActions() []string { + if x != nil { + return x.NotDataActions + } + return nil +} + +var File_accessgraph_v1alpha_azure_proto protoreflect.FileDescriptor + +var file_accessgraph_v1alpha_azure_proto_rawDesc = []byte{ + 0x0a, 0x1f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x13, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x55, 0x0a, 0x11, 0x41, 0x7a, 0x75, 0x72, 0x65, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x09, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xdf, + 0x02, 0x0a, 0x0d, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x43, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x50, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x48, 0x00, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, + 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x53, 0x0a, 0x0f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x72, 0x6f, 0x6c, 0x65, + 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x0f, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x0e, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x53, 0x0a, 0x0f, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, + 0x7a, 0x75, 0x72, 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x4d, 0x61, 0x63, + 0x68, 0x69, 0x6e, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x22, 0xe8, 0x02, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, + 0x6c, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x46, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x77, 0x0a, 0x0d, 0x41, + 0x7a, 0x75, 0x72, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0c, + 0x73, 0x69, 0x67, 0x6e, 0x5f, 0x69, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x49, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, + 0x5f, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x49, 0x64, 0x22, 0xb0, 0x02, 0x0a, 0x0e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x50, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, + 0x6f, 0x66, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x4f, 0x66, 0x12, 0x42, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x7a, 0x75, + 0x72, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0x95, 0x02, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, + 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, + 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x2c, 0x0a, + 0x12, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x6f, 0x6c, 0x65, 0x44, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xf0, 0x02, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x44, 0x65, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x61, 0x73, 0x73, 0x69, + 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, + 0x63, 0x6f, 0x70, 0x65, 0x73, 0x12, 0x4a, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x42, 0x41, 0x43, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x9d, 0x01, 0x0a, 0x13, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x42, 0x41, 0x43, + 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x6f, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x6f, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x61, 0x74, + 0x61, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x6f, 0x74, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x6f, 0x74, 0x44, 0x61, 0x74, 0x61, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x42, 0x57, 0x5a, 0x55, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, 0x72, 0x61, 0x70, 0x68, + 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_accessgraph_v1alpha_azure_proto_rawDescOnce sync.Once + file_accessgraph_v1alpha_azure_proto_rawDescData = file_accessgraph_v1alpha_azure_proto_rawDesc +) + +func file_accessgraph_v1alpha_azure_proto_rawDescGZIP() []byte { + file_accessgraph_v1alpha_azure_proto_rawDescOnce.Do(func() { + file_accessgraph_v1alpha_azure_proto_rawDescData = protoimpl.X.CompressGZIP(file_accessgraph_v1alpha_azure_proto_rawDescData) + }) + return file_accessgraph_v1alpha_azure_proto_rawDescData +} + +var file_accessgraph_v1alpha_azure_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_accessgraph_v1alpha_azure_proto_goTypes = []any{ + (*AzureResourceList)(nil), // 0: accessgraph.v1alpha.AzureResourceList + (*AzureResource)(nil), // 1: accessgraph.v1alpha.AzureResource + (*AzureVirtualMachine)(nil), // 2: accessgraph.v1alpha.AzureVirtualMachine + (*AzureIdentity)(nil), // 3: accessgraph.v1alpha.AzureIdentity + (*AzurePrincipal)(nil), // 4: accessgraph.v1alpha.AzurePrincipal + (*AzureRoleAssignment)(nil), // 5: accessgraph.v1alpha.AzureRoleAssignment + (*AzureRoleDefinition)(nil), // 6: accessgraph.v1alpha.AzureRoleDefinition + (*AzureRBACPermission)(nil), // 7: accessgraph.v1alpha.AzureRBACPermission + nil, // 8: accessgraph.v1alpha.AzureVirtualMachine.TagsEntry + (*timestamppb.Timestamp)(nil), // 9: google.protobuf.Timestamp +} +var file_accessgraph_v1alpha_azure_proto_depIdxs = []int32{ + 1, // 0: accessgraph.v1alpha.AzureResourceList.resources:type_name -> accessgraph.v1alpha.AzureResource + 4, // 1: accessgraph.v1alpha.AzureResource.principal:type_name -> accessgraph.v1alpha.AzurePrincipal + 6, // 2: accessgraph.v1alpha.AzureResource.role_definition:type_name -> accessgraph.v1alpha.AzureRoleDefinition + 5, // 3: accessgraph.v1alpha.AzureResource.role_assignment:type_name -> accessgraph.v1alpha.AzureRoleAssignment + 2, // 4: accessgraph.v1alpha.AzureResource.virtual_machine:type_name -> accessgraph.v1alpha.AzureVirtualMachine + 9, // 5: accessgraph.v1alpha.AzureVirtualMachine.last_sync_time:type_name -> google.protobuf.Timestamp + 8, // 6: accessgraph.v1alpha.AzureVirtualMachine.tags:type_name -> accessgraph.v1alpha.AzureVirtualMachine.TagsEntry + 9, // 7: accessgraph.v1alpha.AzurePrincipal.last_sync_time:type_name -> google.protobuf.Timestamp + 3, // 8: accessgraph.v1alpha.AzurePrincipal.identities:type_name -> accessgraph.v1alpha.AzureIdentity + 9, // 9: accessgraph.v1alpha.AzureRoleAssignment.last_sync_time:type_name -> google.protobuf.Timestamp + 9, // 10: accessgraph.v1alpha.AzureRoleDefinition.last_sync_time:type_name -> google.protobuf.Timestamp + 7, // 11: accessgraph.v1alpha.AzureRoleDefinition.permissions:type_name -> accessgraph.v1alpha.AzureRBACPermission + 12, // [12:12] is the sub-list for method output_type + 12, // [12:12] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name +} + +func init() { file_accessgraph_v1alpha_azure_proto_init() } +func file_accessgraph_v1alpha_azure_proto_init() { + if File_accessgraph_v1alpha_azure_proto != nil { + return + } + file_accessgraph_v1alpha_azure_proto_msgTypes[1].OneofWrappers = []any{ + (*AzureResource_Principal)(nil), + (*AzureResource_RoleDefinition)(nil), + (*AzureResource_RoleAssignment)(nil), + (*AzureResource_VirtualMachine)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_accessgraph_v1alpha_azure_proto_rawDesc, + NumEnums: 0, + NumMessages: 9, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_accessgraph_v1alpha_azure_proto_goTypes, + DependencyIndexes: file_accessgraph_v1alpha_azure_proto_depIdxs, + MessageInfos: file_accessgraph_v1alpha_azure_proto_msgTypes, + }.Build() + File_accessgraph_v1alpha_azure_proto = out.File + file_accessgraph_v1alpha_azure_proto_rawDesc = nil + file_accessgraph_v1alpha_azure_proto_goTypes = nil + file_accessgraph_v1alpha_azure_proto_depIdxs = nil +} diff --git a/gen/proto/go/accessgraph/v1alpha/entra.pb.go b/gen/proto/go/accessgraph/v1alpha/entra.pb.go index e97d0bb8713d4..55c99c2c50d57 100644 --- a/gen/proto/go/accessgraph/v1alpha/entra.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/entra.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: accessgraph/v1alpha/entra.proto diff --git a/gen/proto/go/accessgraph/v1alpha/events.pb.go b/gen/proto/go/accessgraph/v1alpha/events.pb.go index abd67e05d5a02..a0a49fc311e99 100644 --- a/gen/proto/go/accessgraph/v1alpha/events.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/events.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: accessgraph/v1alpha/events.proto diff --git a/gen/proto/go/accessgraph/v1alpha/gitlab.pb.go b/gen/proto/go/accessgraph/v1alpha/gitlab.pb.go index 758f6872e128c..b9db4d6c5225e 100644 --- a/gen/proto/go/accessgraph/v1alpha/gitlab.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/gitlab.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: accessgraph/v1alpha/gitlab.proto diff --git a/gen/proto/go/accessgraph/v1alpha/graph.pb.go b/gen/proto/go/accessgraph/v1alpha/graph.pb.go index b499981fb7d4f..588bf2e057f71 100644 --- a/gen/proto/go/accessgraph/v1alpha/graph.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/graph.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: accessgraph/v1alpha/graph.proto diff --git a/gen/proto/go/accessgraph/v1alpha/resources.pb.go b/gen/proto/go/accessgraph/v1alpha/resources.pb.go index feafaf8bf6eaf..354aefe4d9200 100644 --- a/gen/proto/go/accessgraph/v1alpha/resources.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/resources.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: accessgraph/v1alpha/resources.proto diff --git a/gen/proto/go/prehog/v1/teleport.pb.go b/gen/proto/go/prehog/v1/teleport.pb.go index 2705157164020..a0bce5c019a80 100644 --- a/gen/proto/go/prehog/v1/teleport.pb.go +++ b/gen/proto/go/prehog/v1/teleport.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: prehog/v1/teleport.proto diff --git a/gen/proto/go/prehog/v1alpha/connect.pb.go b/gen/proto/go/prehog/v1alpha/connect.pb.go index df92af4be3fc9..dcd64900f887c 100644 --- a/gen/proto/go/prehog/v1alpha/connect.pb.go +++ b/gen/proto/go/prehog/v1alpha/connect.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: prehog/v1alpha/connect.proto diff --git a/gen/proto/go/prehog/v1alpha/tbot.pb.go b/gen/proto/go/prehog/v1alpha/tbot.pb.go index 7ef7275c1cabc..306461a22423b 100644 --- a/gen/proto/go/prehog/v1alpha/tbot.pb.go +++ b/gen/proto/go/prehog/v1alpha/tbot.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: prehog/v1alpha/tbot.proto diff --git a/gen/proto/go/prehog/v1alpha/teleport.pb.go b/gen/proto/go/prehog/v1alpha/teleport.pb.go index a4da89c259066..3fb4aaa3da671 100644 --- a/gen/proto/go/prehog/v1alpha/teleport.pb.go +++ b/gen/proto/go/prehog/v1alpha/teleport.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: prehog/v1alpha/teleport.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/access_request.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/access_request.pb.go index 9d1b25386a597..130bd5ba2ac9f 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/access_request.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/access_request.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/access_request.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/app.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/app.pb.go index ce3f381758389..1f5f8430eb672 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/app.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/app.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/app.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/auth_settings.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/auth_settings.pb.go index 59314df038f1e..deea8998bc3f2 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/auth_settings.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/auth_settings.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/auth_settings.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/cluster.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/cluster.pb.go index 17e6e489aaaa7..e27db690a6087 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/cluster.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/cluster.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/cluster.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/database.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/database.pb.go index c101b7649687c..e9906b86bf897 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/database.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/database.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/database.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/gateway.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/gateway.pb.go index 7f5f4f8332bd0..a4c4ca6340a0b 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/gateway.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/gateway.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/gateway.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/kube.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/kube.pb.go index 3f70e2e3cb2b2..bae5b6127aab2 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/kube.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/kube.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/kube.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/label.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/label.pb.go index b3a0ed2b46858..090a72552113a 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/label.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/label.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/label.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/server.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/server.pb.go index e89ecc4aab9d2..c3a84d01d7761 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/server.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/server.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/server.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go index decb858b1d2ef..11133fb3d3583 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/service.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/service.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service.pb.go index cdc68fb467aa2..0ab11da4e3880 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/tshd_events_service.proto diff --git a/gen/proto/go/teleport/lib/teleterm/v1/usage_events.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/usage_events.pb.go index 6cafbb5b71974..2910eca8c37b9 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/usage_events.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/usage_events.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/v1/usage_events.proto diff --git a/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go b/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go index 40890a5c15647..e4aed6fa9d35a 100644 --- a/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/teleterm/vnet/v1/vnet_service.proto diff --git a/gen/proto/go/teleport/quicpeering/v1alpha/dial.pb.go b/gen/proto/go/teleport/quicpeering/v1alpha/dial.pb.go index 2635965418d5b..f307e5bafc6da 100644 --- a/gen/proto/go/teleport/quicpeering/v1alpha/dial.pb.go +++ b/gen/proto/go/teleport/quicpeering/v1alpha/dial.pb.go @@ -16,7 +16,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/quicpeering/v1alpha/dial.proto diff --git a/go.mod b/go.mod index f221ec5ae1691..397b710ee8ef7 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,18 @@ module github.com/gravitational/teleport -go 1.23.3 +go 1.23.4 require ( - cloud.google.com/go/cloudsqlconn v1.12.1 - cloud.google.com/go/compute v1.28.1 + cloud.google.com/go/cloudsqlconn v1.13.1 + cloud.google.com/go/compute v1.28.3 cloud.google.com/go/compute/metadata v0.5.2 - cloud.google.com/go/container v1.40.0 + cloud.google.com/go/container v1.41.0 cloud.google.com/go/firestore v1.17.0 - cloud.google.com/go/iam v1.2.1 - cloud.google.com/go/kms v1.20.0 - cloud.google.com/go/resourcemanager v1.10.1 - cloud.google.com/go/spanner v1.68.0 - cloud.google.com/go/storage v1.43.0 + cloud.google.com/go/iam v1.2.2 + cloud.google.com/go/kms v1.20.1 + cloud.google.com/go/resourcemanager v1.10.2 + cloud.google.com/go/spanner v1.72.0 + cloud.google.com/go/storage v1.47.0 connectrpc.com/connect v1.17.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 @@ -27,7 +27,7 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/redisenterprise/armredisenterprise v1.2.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0 - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1 + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0 github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 github.com/ClickHouse/ch-go v0.63.1 github.com/ClickHouse/clickhouse-go/v2 v2.30.0 @@ -42,42 +42,42 @@ require ( github.com/aquasecurity/libbpfgo v0.5.1-libbpf-1.2 github.com/armon/go-radix v1.0.0 github.com/aws/aws-sdk-go v1.55.5 - github.com/aws/aws-sdk-go-v2 v1.32.3 - github.com/aws/aws-sdk-go-v2/config v1.28.1 - github.com/aws/aws-sdk-go-v2/credentials v1.17.42 - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.13 - github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.48 - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 - github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.33.3 - github.com/aws/aws-sdk-go-v2/service/athena v1.48.1 - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.36.3 - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.3 - github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0 - github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.3 - github.com/aws/aws-sdk-go-v2/service/ecs v1.49.0 - github.com/aws/aws-sdk-go-v2/service/eks v1.51.1 - github.com/aws/aws-sdk-go-v2/service/glue v1.101.0 - github.com/aws/aws-sdk-go-v2/service/iam v1.37.3 - github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.3 - github.com/aws/aws-sdk-go-v2/service/kms v1.37.3 - github.com/aws/aws-sdk-go-v2/service/organizations v1.34.3 - github.com/aws/aws-sdk-go-v2/service/rds v1.89.0 - github.com/aws/aws-sdk-go-v2/service/redshift v1.51.0 - github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 - github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.3 - github.com/aws/aws-sdk-go-v2/service/sns v1.33.3 - github.com/aws/aws-sdk-go-v2/service/sqs v1.36.3 - github.com/aws/aws-sdk-go-v2/service/ssm v1.55.3 - github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.3 - github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 + github.com/aws/aws-sdk-go-v2 v1.32.6 + github.com/aws/aws-sdk-go-v2/config v1.28.6 + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.20 + github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.55 + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 + github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.34.1 + github.com/aws/aws-sdk-go-v2/service/athena v1.49.0 + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.38.0 + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.8 + github.com/aws/aws-sdk-go-v2/service/ec2 v1.195.0 + github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.7 + github.com/aws/aws-sdk-go-v2/service/ecs v1.52.1 + github.com/aws/aws-sdk-go-v2/service/eks v1.53.0 + github.com/aws/aws-sdk-go-v2/service/glue v1.103.0 + github.com/aws/aws-sdk-go-v2/service/iam v1.38.2 + github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.7 + github.com/aws/aws-sdk-go-v2/service/kms v1.37.7 + github.com/aws/aws-sdk-go-v2/service/organizations v1.36.0 + github.com/aws/aws-sdk-go-v2/service/rds v1.92.0 + github.com/aws/aws-sdk-go-v2/service/redshift v1.53.0 + github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 + github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.7 + github.com/aws/aws-sdk-go-v2/service/sns v1.33.7 + github.com/aws/aws-sdk-go-v2/service/sqs v1.37.2 + github.com/aws/aws-sdk-go-v2/service/ssm v1.56.1 + github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.7 + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0 - github.com/aws/smithy-go v1.22.0 - github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20241029204838-fb9784500689 + github.com/aws/smithy-go v1.22.1 + github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20241128053516-b9e7404a33c3 github.com/beevik/etree v1.4.1 github.com/buildkite/bintest/v3 v3.3.0 github.com/charmbracelet/bubbles v0.20.0 - github.com/charmbracelet/bubbletea v1.1.2 + github.com/charmbracelet/bubbletea v1.2.4 github.com/charmbracelet/lipgloss v1.0.0 github.com/coreos/go-oidc v2.2.1+incompatible // replaced github.com/coreos/go-oidc/v3 v3.11.0 @@ -88,13 +88,13 @@ require ( github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 github.com/distribution/reference v0.6.0 github.com/dustin/go-humanize v1.0.1 - github.com/elastic/go-elasticsearch/v8 v8.15.0 + github.com/elastic/go-elasticsearch/v8 v8.16.0 github.com/elimity-com/scim v0.0.0-20240320110924-172bf2aee9c8 github.com/envoyproxy/go-control-plane v0.13.1 github.com/evanphx/json-patch v5.9.0+incompatible github.com/fatih/color v1.18.0 github.com/fsnotify/fsnotify v1.8.0 - github.com/fsouza/fake-gcs-server v1.49.3 + github.com/fsouza/fake-gcs-server v1.50.2 github.com/fxamacker/cbor/v2 v2.7.0 github.com/ghodss/yaml v1.0.0 github.com/gizak/termui/v3 v3.1.0 @@ -103,7 +103,7 @@ require ( github.com/go-logr/logr v1.4.2 github.com/go-mysql-org/go-mysql v1.9.1 // replaced github.com/go-piv/piv-go v1.11.0 - github.com/go-resty/resty/v2 v2.15.3 + github.com/go-resty/resty/v2 v2.16.2 github.com/go-webauthn/webauthn v0.11.2 github.com/gobwas/ws v1.4.0 github.com/gocql/gocql v1.7.0 @@ -121,7 +121,7 @@ require ( github.com/google/safetext v0.0.0-20240104143208-7a7d9b3d812f github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/google/uuid v1.6.0 - github.com/googleapis/gax-go/v2 v2.13.0 + github.com/googleapis/gax-go/v2 v2.14.0 github.com/gorilla/websocket v1.5.3 github.com/gravitational/license v0.0.0-20240313232707-8312e719d624 github.com/gravitational/roundtrip v1.0.2 @@ -146,7 +146,7 @@ require ( github.com/julienschmidt/httprouter v1.3.0 // replaced github.com/keys-pub/go-libfido2 v1.5.3-0.20220306005615-8ab03fb1ec27 // replaced github.com/lib/pq v1.10.9 - github.com/mailgun/mailgun-go/v4 v4.18.1 + github.com/mailgun/mailgun-go/v4 v4.20.4 github.com/mattn/go-sqlite3 v1.14.24 github.com/mdlayher/netlink v1.7.2 github.com/microsoft/go-mssqldb v1.7.2 // replaced @@ -156,8 +156,8 @@ require ( github.com/okta/okta-sdk-golang/v2 v2.20.0 github.com/opencontainers/go-digest v1.0.0 github.com/opensearch-project/opensearch-go/v2 v2.3.0 - github.com/parquet-go/parquet-go v0.23.0 - github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627 + github.com/parquet-go/parquet-go v0.24.0 + github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 github.com/pelletier/go-toml v1.9.5 github.com/pkg/sftp v1.13.7 @@ -165,54 +165,54 @@ require ( github.com/prometheus/client_golang v1.20.5 github.com/prometheus/client_model v0.6.1 github.com/prometheus/common v0.55.0 - github.com/quic-go/quic-go v0.48.1 + github.com/quic-go/quic-go v0.48.2 github.com/redis/go-redis/v9 v9.6.1 // replaced github.com/russellhaering/gosaml2 v0.9.1 github.com/russellhaering/goxmldsig v1.4.0 - github.com/schollz/progressbar/v3 v3.17.0 + github.com/schollz/progressbar/v3 v3.17.1 github.com/scim2/filter-parser/v2 v2.2.0 - github.com/shirou/gopsutil/v4 v4.24.10 + github.com/shirou/gopsutil/v4 v4.24.11 github.com/sigstore/cosign/v2 v2.4.1 github.com/sigstore/sigstore v1.8.10 github.com/sijms/go-ora/v2 v2.8.22 github.com/sirupsen/logrus v1.9.3 github.com/snowflakedb/gosnowflake v1.12.0 github.com/spf13/cobra v1.8.1 - github.com/spiffe/go-spiffe/v2 v2.3.0 - github.com/stretchr/testify v1.9.0 + github.com/spiffe/go-spiffe/v2 v2.4.0 + github.com/stretchr/testify v1.10.0 github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb github.com/vulcand/predicate v1.2.0 // replaced - github.com/xanzy/go-gitlab v0.112.0 - go.etcd.io/etcd/api/v3 v3.5.16 - go.etcd.io/etcd/client/v3 v3.5.16 + github.com/xanzy/go-gitlab v0.114.0 + go.etcd.io/etcd/api/v3 v3.5.17 + go.etcd.io/etcd/client/v3 v3.5.17 go.mongodb.org/mongo-driver v1.14.0 - go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 - go.opentelemetry.io/otel v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 - go.opentelemetry.io/otel/sdk v1.30.0 - go.opentelemetry.io/otel/trace v1.30.0 - go.opentelemetry.io/proto/otlp v1.3.1 + go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 + go.opentelemetry.io/otel v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 + go.opentelemetry.io/otel/sdk v1.32.0 + go.opentelemetry.io/otel/trace v1.32.0 + go.opentelemetry.io/proto/otlp v1.4.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.28.0 - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c - golang.org/x/mod v0.21.0 - golang.org/x/net v0.30.0 - golang.org/x/oauth2 v0.23.0 - golang.org/x/sync v0.8.0 - golang.org/x/sys v0.26.0 - golang.org/x/term v0.25.0 - golang.org/x/text v0.19.0 - golang.org/x/time v0.6.0 + golang.org/x/crypto v0.29.0 + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f + golang.org/x/mod v0.22.0 + golang.org/x/net v0.31.0 + golang.org/x/oauth2 v0.24.0 + golang.org/x/sync v0.10.0 + golang.org/x/sys v0.28.0 + golang.org/x/term v0.26.0 + golang.org/x/text v0.20.0 + golang.org/x/time v0.8.0 golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 - google.golang.org/api v0.197.0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 - google.golang.org/grpc v1.66.3 + google.golang.org/api v0.207.0 + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 + google.golang.org/grpc v1.68.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 - google.golang.org/protobuf v1.35.1 + google.golang.org/protobuf v1.35.2 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c gopkg.in/dnaeon/go-vcr.v3 v3.2.0 gopkg.in/ini.v1 v1.67.0 @@ -220,7 +220,7 @@ require ( gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 gvisor.dev/gvisor v0.0.0-20230927004350-cbd86285d259 - helm.sh/helm/v3 v3.16.2 + helm.sh/helm/v3 v3.16.3 k8s.io/api v0.31.1 k8s.io/apiextensions-apiserver v0.31.1 k8s.io/apimachinery v0.31.1 @@ -231,20 +231,20 @@ require ( k8s.io/klog/v2 v2.130.1 k8s.io/kubectl v0.31.1 k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 - sigs.k8s.io/controller-runtime v0.19.1 + sigs.k8s.io/controller-runtime v0.19.3 sigs.k8s.io/controller-tools v0.16.3 sigs.k8s.io/yaml v1.4.0 software.sslmate.com/src/go-pkcs12 v0.5.0 ) require ( - cel.dev/expr v0.16.0 // indirect - cloud.google.com/go v0.115.1 // indirect - cloud.google.com/go/auth v0.9.4 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect - cloud.google.com/go/longrunning v0.6.1 // indirect - cloud.google.com/go/monitoring v1.21.0 // indirect - cloud.google.com/go/pubsub v1.43.0 // indirect + cel.dev/expr v0.16.1 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.10.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect + cloud.google.com/go/longrunning v0.6.2 // indirect + cloud.google.com/go/monitoring v1.21.2 // indirect + cloud.google.com/go/pubsub v1.45.1 // indirect dario.cat/mergo v1.0.1 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect @@ -255,31 +255,32 @@ require ( github.com/BurntSushi/toml v1.4.0 // indirect github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 // indirect github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/semver/v3 v3.3.0 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect - github.com/Microsoft/hcsshim v0.11.5 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 // indirect github.com/apache/arrow/go/v15 v15.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 // indirect - github.com/aws/aws-sdk-go-v2/service/ecr v1.36.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.27.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/service/ecr v1.36.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.27.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver v3.5.1+incompatible // indirect @@ -289,19 +290,20 @@ require ( github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chai2010/gettext-go v1.0.2 // indirect - github.com/charmbracelet/x/ansi v0.4.2 // indirect - github.com/charmbracelet/x/term v0.2.0 // indirect + github.com/charmbracelet/x/ansi v0.4.5 // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect github.com/cloudflare/cfssl v1.6.4 // indirect - github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59 // indirect - github.com/containerd/containerd v1.7.18 // indirect - github.com/containerd/errdefs v0.1.0 // indirect + github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect + github.com/containerd/containerd v1.7.23 // indirect + github.com/containerd/errdefs v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf // indirect github.com/crewjam/httperr v0.2.0 // indirect github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 // indirect - github.com/cyphar/filepath-securejoin v0.3.1 // indirect + github.com/cyphar/filepath-securejoin v0.3.4 // indirect github.com/danieljoos/wincred v1.2.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/daviddengcn/go-colortext v1.0.0 // indirect @@ -329,7 +331,7 @@ require ( github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-chi/chi v4.1.2+incompatible // indirect - github.com/go-chi/chi/v5 v5.0.12 // indirect + github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-faster/city v1.0.1 // indirect github.com/go-faster/errors v0.7.1 // indirect @@ -375,7 +377,7 @@ require ( github.com/gorilla/mux v1.8.1 // indirect github.com/gosuri/uitable v0.0.4 // indirect github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hashicorp/errwrap v1.1.0 // indirect @@ -420,7 +422,7 @@ require ( github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailgun/errors v0.3.0 // indirect + github.com/mailgun/errors v0.4.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -469,7 +471,7 @@ require ( github.com/pquerna/cachecontrol v0.1.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rs/zerolog v1.28.0 // indirect github.com/rubenv/sql-migrate v1.7.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -479,7 +481,6 @@ require ( github.com/sassoftware/relic v7.2.1+incompatible // indirect github.com/secure-systems-lab/go-securesystemslib v0.8.0 // indirect github.com/segmentio/asm v1.2.0 // indirect - github.com/segmentio/encoding v0.4.0 // indirect github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df // indirect github.com/shibumi/go-pathspec v1.3.0 // indirect github.com/shopspring/decimal v1.4.0 // indirect @@ -520,21 +521,22 @@ require ( github.com/zeebo/xxh3 v1.0.2 // indirect github.com/zmap/zcrypto v0.0.0-20231219022726-a1f61fb1661c // indirect github.com/zmap/zlint/v3 v3.6.0 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.17 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.29.0 // indirect - go.opentelemetry.io/otel/metric v1.30.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.29.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/mock v0.4.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/tools v0.26.0 // indirect + golang.org/x/tools v0.27.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect - google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index e1626f33fbcba..0f52dec2e9423 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.16.0 h1:yloc84fytn4zmJX2GU3TkXGsaieaV7dQ057Qs4sIG2Y= -cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.16.1 h1:NR0+oFYzR1CqLFhTAqg3ql59G9VfN8fKq1TCHJ6gq1g= +cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -38,8 +38,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY 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.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= -cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -101,10 +101,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.9.4 h1:DxF7imbEbiFu9+zdKC6cKBko1e8XeJnipNqIbWZ+kDI= -cloud.google.com/go/auth v0.9.4/go.mod h1:SHia8n6//Ya940F1rLimhJCjjx7KE17t0ctFEci3HkA= -cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +cloud.google.com/go/auth v0.10.2 h1:oKF7rgBfSHdp/kuhXtqU/tNDr0mZqhYbEh+6SiqzkKo= +cloud.google.com/go/auth v0.10.2/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= +cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= @@ -159,8 +159,8 @@ cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudsqlconn v1.12.1 h1:crfkYy4TsYXx+n/wELlPthDYaAmDo2olHLv9DmRuJzY= -cloud.google.com/go/cloudsqlconn v1.12.1/go.mod h1:Y8x/9e+QsjJNkvOj9mdJ8/ixhE95Ab2H/vsyy0mXWNc= +cloud.google.com/go/cloudsqlconn v1.13.1 h1:yWoXgP3jeJiHMzpfLKtf7XrPlDRaX/sYFEkyyXUAuIg= +cloud.google.com/go/cloudsqlconn v1.13.1/go.mod h1:lP+AZa6H8aXN7oFFXybrD27X+37eeNqEMmZW/mIA9H8= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= @@ -182,8 +182,8 @@ cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63 cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o= -cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk= +cloud.google.com/go/compute v1.28.3 h1:+b9s7mbJYe7yQ0qA9o6GS7Tb1Ubygnv6jCLxM0JnbQA= +cloud.google.com/go/compute v1.28.3/go.mod h1:HFlsDurE5DpQZClAGf/cYh+gxssMhBxBovZDYkEn/Og= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= @@ -198,8 +198,8 @@ cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3 cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.40.0 h1:JVoEg/4RvoGW37r2Eja/cTBc3X9c2loGWYq7QDsRDuI= -cloud.google.com/go/container v1.40.0/go.mod h1:wNI1mOUivm+ZkpHMbouutgbD4sQxyphMwK31X5cThY4= +cloud.google.com/go/container v1.41.0 h1:f20+lv3PBeQKgAL7X3VeuDzvF2iYao2AVBTsuTpPk68= +cloud.google.com/go/container v1.41.0/go.mod h1:YL6lDgCUi3frIWNIFU9qrmF7/6K1EYrtspmFTyyqJ+k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= @@ -327,8 +327,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU= -cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g= +cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= +cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= @@ -348,8 +348,8 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4 cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.20.0 h1:uKUvjGqbBlI96xGE669hcVnEMw1Px/Mvfa62dhM5UrY= -cloud.google.com/go/kms v1.20.0/go.mod h1:/dMbFF1tLLFnQV44AoI2GlotbjowyUfgVwezxW291fM= +cloud.google.com/go/kms v1.20.1 h1:og29Wv59uf2FVaZlesaiDAqHFzHaoUyHI3HYp9VUHVg= +cloud.google.com/go/kms v1.20.1/go.mod h1:LywpNiVCvzYNJWS9JUcGJSVTNSwPwi0vBAotzDqn2nc= 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= @@ -360,11 +360,13 @@ cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6 cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= +cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= 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.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc= -cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= 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/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= @@ -388,8 +390,8 @@ cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhI cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.21.0 h1:EMc0tB+d3lUewT2NzKC/hr8cSR9WsUieVywzIHetGro= -cloud.google.com/go/monitoring v1.21.0/go.mod h1:tuJ+KNDdJbetSsbSGTqnaBvbauS5kr3Q/koy3Up6r+4= +cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= +cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= 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= @@ -447,8 +449,8 @@ cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcd 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/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.43.0 h1:s3Qx+F96J7Kwey/uVHdK3QxFLIlOvvw4SfMYw2jFjb4= -cloud.google.com/go/pubsub v1.43.0/go.mod h1:LNLfqItblovg7mHWgU5g84Vhza4J8kTxx0YqIeTzcXY= +cloud.google.com/go/pubsub v1.45.1 h1:ZC/UzYcrmK12THWn1P72z+Pnp2vu/zCZRXyhAfP1hJY= +cloud.google.com/go/pubsub v1.45.1/go.mod h1:3bn7fTmzZFwaUjllitv1WlsNMkqBgGUb3UdMhI54eCc= cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= @@ -478,8 +480,8 @@ cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7L cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.10.1 h1:fO/QoSJ1lepmTM9dCbSXYWgTIhecmQkpY0mM1X9OGN0= -cloud.google.com/go/resourcemanager v1.10.1/go.mod h1:A/ANV/Sv7y7fcjd4LSH7PJGTZcWRkO/69yN5UhYUmvE= +cloud.google.com/go/resourcemanager v1.10.2 h1:LpqZZGM0uJiu1YWM878AA8zZ/qOQ/Ngno60Q8RAraAI= +cloud.google.com/go/resourcemanager v1.10.2/go.mod h1:5f+4zTM/ZOTDm6MmPOp6BQAhR0fi8qFPnvVGSoWszcc= cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= @@ -540,8 +542,8 @@ cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+ cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.68.0 h1:54nL8lEUj5A6frSGnL9VPmHDYbV5UwVkK8fbdnZyDCs= -cloud.google.com/go/spanner v1.68.0/go.mod h1:X5T0XftydYp0K1adeJQDJtdWpbrOeJ7wHecM4tK6FiE= +cloud.google.com/go/spanner v1.72.0 h1:8hOxGVi0gaOWdxzDxyjYL4g/unjVUy2uje1T3okTgiQ= +cloud.google.com/go/spanner v1.72.0/go.mod h1:mw98ua5ggQXVWwp83yjwggqEmW9t8rjs9Po1ohcUGW4= 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= @@ -559,8 +561,8 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= -cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= +cloud.google.com/go/storage v1.47.0 h1:ajqgt30fnOMmLfWfu1PWcb+V9Dxz6n+9WKjdNg5R4HM= +cloud.google.com/go/storage v1.47.0/go.mod h1:Ks0vP374w0PW6jOUameJbapbQKXqkjGd/OJRp2fb9IQ= 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/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= @@ -580,6 +582,8 @@ cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg 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/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= +cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= 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/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= @@ -700,8 +704,8 @@ github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0 h1:DRiANoJ github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.1.0/go.mod h1:qLIye2hwb/ZouqhpSD9Zn3SJipvpEnz1Ywl3VUk9Y0s= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1 h1:cf+OIKbkmMHBaC3u78AXomweqM0oxQSgBXRZf3WH4yM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1/go.mod h1:ap1dmS6vQKJxSMNiGJcq4QuUQkOynyD93gLw6MDF7ek= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0 h1:mlmW46Q0B79I+Aj4azKC6xDMFN9a9SyZWESlGWYXbFs= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0/go.mod h1:PXe2h+LKcWTX9afWdZoHyODqR4fBa5boUM/8uJfZ0Jo= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= @@ -743,6 +747,12 @@ github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1 github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 h1:pB2F2JKCj1Znmp2rwxxt1J0Fg0wezTMgWYk5Mpbi1kg= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= @@ -762,8 +772,8 @@ github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8 github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= -github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ= +github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= @@ -776,8 +786,6 @@ github.com/ThalesIgnite/crypto11 v1.2.5 h1:1IiIIEqYmBvUYFeMnHqRft4bwf/O36jryEUpY github.com/ThalesIgnite/crypto11 v1.2.5/go.mod h1:ILDKtnCKiQ7zRoNxcp36Y1ZR8LBPmR2E23+wTQe/MlE= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= -github.com/ahmetb/go-linq v3.0.0+incompatible h1:qQkjjOXKrKOTy83X8OpRmnKflXKQIL/mC/gMVVDMhOA= -github.com/ahmetb/go-linq v3.0.0+incompatible/go.mod h1:PFffvbdbtw+QTB0WKRP0cNht7vnCfnGlEpak/DVg5cY= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -839,109 +847,109 @@ github.com/aws/aws-sdk-go v1.49.12/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3Tj github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk= -github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= -github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw= -github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= github.com/aws/aws-sdk-go-v2/credentials v1.13.24/go.mod h1:jYPYi99wUOPIFi0rhiOvXeSEReVOzBqFNOX5bXYoG2o= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.13 h1:EiyBn76ZpKQJWRNhgxvgloj6Xmazck05+RS6j0gfy1Y= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.13/go.mod h1:gKf4BQBfUke2acRFz76+Tyqz4A9Me0aMEnDUZwEZ+R0= -github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.48 h1:LSD17tCR5kLNAeq0nBQNozVtydVIRbtVBvTPBdbEt9o= -github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.48/go.mod h1:zzc/IJrpU6yxsvP9rlMFRnGAQK5igXStFPyN7gqvkl8= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.20 h1:bwHhhCScKRAYJtaWVT+jDpt74GybN2nxI6+InkRjqGM= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.20/go.mod h1:/RfYH8CUMQuq/3CIEVGHLkqkA9KtbBF5omt2Ae8xc0s= +github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.55 h1:L7VWZW9+2h9gnPNuHsnUU5WFcgx3i3y2utHOLG+FTaM= +github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.55/go.mod h1:mJ7tAfWUIVja+y4kVGXr/SucTEErhYx5nAZ39WV7W6o= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3/go.mod h1:4Q0UFP0YJf0NrsEuEYHpM9fTSEVnD16Z3uyEF7J9JGM= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 h1:ihPPdcCVSN0IvBByXwqVp28/l4VosBZ6sDulcvU2J7w= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35/go.mod h1:JkgEhs3SVF51Dj3m1Bj+yL8IznpxzkwlA3jLg3x7Kls= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 h1:iLdpkYZ4cXIQMO7ud+cqMWR1xK5ESbt1rvN77tRi1BY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43/go.mod h1:OgbsKPAswXDd5kxnR4vZov69p3oYjbvUyIRBAAV0y9o= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw= -github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.33.3 h1:M6/YarR8ItjAoF0G77hAVLpXsTTdMNtliVZHkSIwNgU= -github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.33.3/go.mod h1:fnXN26jHqVTNn7mckGCuXsee3ALrLlAn5u9gPek09U8= -github.com/aws/aws-sdk-go-v2/service/athena v1.48.1 h1:qj1vutJplyyjoKOpU3OujWckGY93VCv7Lxuypwi7/S4= -github.com/aws/aws-sdk-go-v2/service/athena v1.48.1/go.mod h1:Zzq05nJPTEENpFUYW5CRs4cpH9eeX3lOi70444jPzsA= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.36.3 h1:pS5ka5Z026eG29K3cce+yxG39i5COQARcgheeK9NKQE= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.36.3/go.mod h1:MBT8rSGSZjJiV6X7rlrVGoIt+mCoaw0VbpdVtsrsJfk= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.3 h1:BjzvhVB6Nnx+Xqlnc5JWkQYuWClxUFcvLzZIqFO31lI= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.3/go.mod h1:/6lakUr7RXajwpensF1miKadiR+xTlHV7mma5axITxY= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0 h1:cA4hWo269CN5RY7Arqt8BfzXF0KIN8DSNo/KcqHKkWk= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0/go.mod h1:ossaD9Z1ugYb6sq9QIqQLEOorCGcqUoxlhud9M9yE70= -github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.3 h1:53xnOuDLuRYfj26/wdOx749UrmYWpSHmJdWNKdTHFVg= -github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.3/go.mod h1:9HgSjQIDhQgZ1JCyZuX4/mri5hXi4Ez4WD6BT3x3cwg= -github.com/aws/aws-sdk-go-v2/service/ecr v1.36.3 h1:bqmoQEKpWFRDRxOv4lC5yZLc+N1cogZHPLeQACfVUJo= -github.com/aws/aws-sdk-go-v2/service/ecr v1.36.3/go.mod h1:KwOqlt4MOBK9EpOGkj8RU9fqfTEae5AOUHi1pDEZ3OQ= -github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.27.3 h1:oYLW8b00aHQqcga7JI7iH24a2SqTkzhMvUSnGzmF52w= -github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.27.3/go.mod h1:QxSgBsxxVn4qiU1h0XjCSih9PJCtZahLE0fbUmEK/iE= -github.com/aws/aws-sdk-go-v2/service/ecs v1.49.0 h1:xhCV6zY5ZFzfyAUOiBXK6wh0HVQTBkvNwA/eiz89ZWY= -github.com/aws/aws-sdk-go-v2/service/ecs v1.49.0/go.mod h1:RXYd/Ts+sFnjDrVdAZsAfHVkYxQUxhC+l2zrSpSgCGc= -github.com/aws/aws-sdk-go-v2/service/eks v1.51.1 h1:OQjVHkANBbwE055NK49M/kelQbapsQOsSfUUWP1mi3w= -github.com/aws/aws-sdk-go-v2/service/eks v1.51.1/go.mod h1:9wMtzHTjYbK5MLzYBWSznUPsys/n9LapMwb6UhKOVPQ= -github.com/aws/aws-sdk-go-v2/service/glue v1.101.0 h1:UiKyNrUwlM2FfHk1D8TefZIPVf4ubM3Qr3vmdNKfxtE= -github.com/aws/aws-sdk-go-v2/service/glue v1.101.0/go.mod h1:TjtkCUyO8rZfxl0K6c3BF2L0K+ZbhiM7gClYk4wXyJ0= -github.com/aws/aws-sdk-go-v2/service/iam v1.37.3 h1:uuoXyOwX2ReYgHJW0W84cKDUrvQNQA2l9KhkXUgT+R4= -github.com/aws/aws-sdk-go-v2/service/iam v1.37.3/go.mod h1:RCrjvkN/ZpVAzW3ZmIlyflv7MUM45YlWx3v+6MaVX2w= -github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.3 h1:w9j4dHPGA+cDPtyoJcTZv/MOy3amQBsopzWgbqaAsYc= -github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.3/go.mod h1:tTHlog0zrTTBLQBI91uDoYT90C0AcHu6wEw7AiQFe6s= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.3 h1:wudRPcZMKytcywXERkR6PLqD8gPx754ZyIOo0iVg488= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.3/go.mod h1:yRo5Kj5+m/ScVIZpQOquQvDtSrDM1JLRCnvglBcdNmw= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 h1:r67ps7oHCYnflpgDy2LZU0MAQtQbYIOqNNnqGO6xQkE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25/go.mod h1:GrGY+Q4fIokYLtjCVB/aFfCVL6hhGUFl8inD18fDalE= +github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.34.1 h1:8EwNbY+A/Q5myYggLJ7v9v9f00UuWoh9S04y5kre8UQ= +github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.34.1/go.mod h1:2mMP2R86zLPAUz0TpJdsKW8XawHgs9Nk97fYJomO3o8= +github.com/aws/aws-sdk-go-v2/service/athena v1.49.0 h1:D+iatX9gV6gCuNd6BnUkfwfZJw/cXlEk+LwwDdSMdtw= +github.com/aws/aws-sdk-go-v2/service/athena v1.49.0/go.mod h1:27ljwDsnZvfrZKsLzWD4WFjI4OZutEFIjvVtYfj9gHc= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.38.0 h1:isKhHsjpQR3CypQJ4G1g8QWx7zNpiC/xKw1zjgJYVno= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.38.0/go.mod h1:xDvUyIkwBwNtVZJdHEwAuhFly3mezwdEWkbJ5oNYwIw= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.8 h1:ntqHwZb+ZyVz0CFYUG0sQ02KMMJh+iXeV3bXoba+s4A= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.8/go.mod h1:Hcjb2SiUo9v1GhpXjRNW7hAwfzAPfrsgnlKpP5UYEPY= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.195.0 h1:F3pFi50sK30DZ4IkkNpHwTLGeal5c3nlKuvTgv7xec4= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.195.0/go.mod h1:00zqVNJFK6UASrTnuvjJHJuaqUdkVz5tW8Ip+VhzuNg= +github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.7 h1:n221X4mwD08KKGlfpcsD0WxIsCuVOH32RUDOHniC8/U= +github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.7/go.mod h1:bkT6gKfhFH//cV+66Ut8tqWR2apIcZvsU4no8luLx3w= +github.com/aws/aws-sdk-go-v2/service/ecr v1.36.6 h1:zg+3FGHA0PBs0KM25qE/rOf2o5zsjNa1g/Qq83+SDI0= +github.com/aws/aws-sdk-go-v2/service/ecr v1.36.6/go.mod h1:ZSq54Z9SIsOTf1Efwgw1msilSs4XVEfVQiP9nYVnKpM= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.27.6 h1:9DXEMWmABYPz/NXSFmp9Y14yI5FQ5jmPPvllS9hXXfY= +github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.27.6/go.mod h1:qoPi18scDl8uM9o+tHi77043RLv2WIIFvVHcF1RT8Yk= +github.com/aws/aws-sdk-go-v2/service/ecs v1.52.1 h1:85SGI/Db9I8PT2rvDLIRGxXdSzuyC4ZKDJwfzuv7WqQ= +github.com/aws/aws-sdk-go-v2/service/ecs v1.52.1/go.mod h1:Ghi1OWUv4+VMEULWiHsKH2gNA3KAcMoLWsvU0eRXvIA= +github.com/aws/aws-sdk-go-v2/service/eks v1.53.0 h1:ACTxnLwL6YNmuYbxtp/VR3HGL9SWXU6VZkXPjWST9ZQ= +github.com/aws/aws-sdk-go-v2/service/eks v1.53.0/go.mod h1:ZzOjZXGGUQxOq+T3xmfPLKCZe4OaB5vm1LdGaC8IPn4= +github.com/aws/aws-sdk-go-v2/service/glue v1.103.0 h1:aWkaWcO6AWKOZgnm45es3lL+jZ9tece2kfQ2Na4xoQs= +github.com/aws/aws-sdk-go-v2/service/glue v1.103.0/go.mod h1:ajiRue7mZ0vQjVHQkQG2KBaPHW8lL5GtvmjRTHWDaqk= +github.com/aws/aws-sdk-go-v2/service/iam v1.38.2 h1:8iFKuRj/FJipy/aDZ2lbq0DYuEHdrxp0qVsdi+ZEwnE= +github.com/aws/aws-sdk-go-v2/service/iam v1.38.2/go.mod h1:UBe4z0VZnbXGp6xaCW1ulE9pndjfpsnrU206rWZcR0Y= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.7 h1:y0SG6t2s4xrOwjulhbGQ72ovA2MSlrb2UyAz+pA6n8g= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.7/go.mod h1:cJpIii79T0fjc0awSqvU/1kltAjp8MCmMpkhbOUUiik= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 h1:HCpPsWqmYQieU7SS6E9HXfdAMSud0pteVXieJmcpIRI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6/go.mod h1:ngUiVRCco++u+soRRVBIvBZxSMMvOVMXA4PJ36JLfSw= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.6 h1:nbmKXZzXPJn41CcD4HsHsGWqvKjLKz9kWu6XxvLmf1s= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.6/go.mod h1:SJhcisfKfAawsdNQoZMBEjg+vyN2lH6rO6fP+T94z5Y= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27/go.mod h1:EOwBD4J4S5qYszS5/3DpkejfuK+Z5/1uzICfPaZLtqw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY= -github.com/aws/aws-sdk-go-v2/service/kms v1.37.3 h1:VpyBA6KP6JgzwokQps8ArQPGy9rFej8adwuuQGcduH8= -github.com/aws/aws-sdk-go-v2/service/kms v1.37.3/go.mod h1:TT/9V4PcmSPpd8LPUNJ8hBHJmpqcfhx6MrbWTkvyR+4= -github.com/aws/aws-sdk-go-v2/service/organizations v1.34.3 h1:Er5y2CAfS0ddI6+/7bq7mk/dQjhvqt6B5i24K5PnHRQ= -github.com/aws/aws-sdk-go-v2/service/organizations v1.34.3/go.mod h1:hrfV1T+dtQ8AGlImCftiCAYZCTvn2hNVEcA9gPXui8E= -github.com/aws/aws-sdk-go-v2/service/rds v1.89.0 h1:4x0WbBa+i/AS0AFlj7yvx3n+GuK3XR58J6t61pW6h8U= -github.com/aws/aws-sdk-go-v2/service/rds v1.89.0/go.mod h1:WB+SVZKu1IBpsy3GrpR2EBnqB6A05Bd0r4RDLRqMbdk= -github.com/aws/aws-sdk-go-v2/service/redshift v1.51.0 h1:C1lfIohvp+n8yXW3QVsA5j4TFXegKBF0du789simyjQ= -github.com/aws/aws-sdk-go-v2/service/redshift v1.51.0/go.mod h1:wu1ybDpEYcSyKMAG77oFSn1uXBtHizeCkNBfxErB+bw= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.3 h1:CyA6J82ePPoh1Nj8ErOR2e/JRlzfFzWpGwGMFzFjwZg= -github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.3/go.mod h1:EliITPlGcBz0FRiVl7lRLtzI1cnDybFcfLYMZedOInE= -github.com/aws/aws-sdk-go-v2/service/sns v1.33.3 h1:coZW/SqpINT0VWG8vRWWY9TWUof8TDdxublw2Xur0Zc= -github.com/aws/aws-sdk-go-v2/service/sns v1.33.3/go.mod h1:J/G2xuhwNBlDvEi0WR/bnBbac4KSgpkERna/IXEF52w= -github.com/aws/aws-sdk-go-v2/service/sqs v1.36.3 h1:H1bCg79Q4PDtxQH8Fn5kASQlbVv2WGP5o5IEFEBNOAs= -github.com/aws/aws-sdk-go-v2/service/sqs v1.36.3/go.mod h1:W6Uy6OWgxF9RZuHoikthB6f+A0oYXqnfWmFl5m7E2G4= -github.com/aws/aws-sdk-go-v2/service/ssm v1.55.3 h1:nbFGlCxyyFe2cgg8WNQQtzDRVczO4+1dL4hd3TDU6MM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.55.3/go.mod h1:nzUlOBAMlQx9zKwtI10FOzJa2phU6bmFbXhD6LLbr/A= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 h1:BbGDtTi0T1DYlmjBiCr/le3wzhA37O8QTC5/Ab8+EXk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6/go.mod h1:hLMJt7Q8ePgViKupeymbqI0la+t9/iYFBjxQCFwuAwI= +github.com/aws/aws-sdk-go-v2/service/kms v1.37.7 h1:dZmNIRtPUvtvUIIDVNpvtnJQ8N8Iqm7SQAxf18htZYw= +github.com/aws/aws-sdk-go-v2/service/kms v1.37.7/go.mod h1:vj8PlfJH9mnGeIzd6uMLPi5VgiqzGG7AZoe1kf1uTXM= +github.com/aws/aws-sdk-go-v2/service/organizations v1.36.0 h1:CVHfN8ZVvWzDkAf/Qj+GO53dD5NWVyK16O8pYg/wp3k= +github.com/aws/aws-sdk-go-v2/service/organizations v1.36.0/go.mod h1:SVY+doFrL3KTvVMWzFLKvD7KYQ6GQfwNRPSQS7eA3cA= +github.com/aws/aws-sdk-go-v2/service/rds v1.92.0 h1:W0gUYAjO24u/M6tpR041wMHJWGzleOhxtCnNLImdrZs= +github.com/aws/aws-sdk-go-v2/service/rds v1.92.0/go.mod h1:ADD2uROOoEIXjbjDPEvDDZWnGmfKFYMddgKwG5RlBGw= +github.com/aws/aws-sdk-go-v2/service/redshift v1.53.0 h1:4/hmROBioc89sKlMVjHgOaH92zAkrAAMZR3BIvYwyD0= +github.com/aws/aws-sdk-go-v2/service/redshift v1.53.0/go.mod h1:UydVhUJOB/DaCJWiaBkPlvuzvWVcUlgbS2Bxn33bcKI= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 h1:nyuzXooUNJexRT0Oy0UQY6AhOzxPxhtt4DcBIHyCnmw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0/go.mod h1:sT/iQz8JK3u/5gZkT+Hmr7GzVZehUMkRZpOaAwYXeGY= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.7 h1:Nyfbgei75bohfmZNxgN27i528dGYVzqWJGlAO6lzXy8= +github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.34.7/go.mod h1:FG4p/DciRxPgjA+BEOlwRHN0iA8hX2h9g5buSy3cTDA= +github.com/aws/aws-sdk-go-v2/service/sns v1.33.7 h1:N3o8mXK6/MP24BtD9sb51omEO9J9cgPM3Ughc293dZc= +github.com/aws/aws-sdk-go-v2/service/sns v1.33.7/go.mod h1:AAHZydTB8/V2zn3WNwjLXBK1RAcSEpDNmFfrmjvrJQg= +github.com/aws/aws-sdk-go-v2/service/sqs v1.37.2 h1:mFLfxLZB/TVQwNJAYox4WaxpIu+dFVIcExrmRmRCOhw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.37.2/go.mod h1:GnvfTdlvcpD+or3oslHPOn4Mu6KaCwlCp+0p0oqWnrM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.56.1 h1:cfVjoEwOMOJOI6VoRQua0nI0KjZV9EAnR8bKaMeSppE= +github.com/aws/aws-sdk-go-v2/service/ssm v1.56.1/go.mod h1:fGHwAnTdNrLKhgl+UEeq9uEL4n3Ng4MJucA+7Xi3sC4= github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI= -github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.3 h1:DZqGS0tUMx2DEn6qfeQjUWrvqA1/PSVtHk1v/j0A7bw= -github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.3/go.mod h1:f+sNnIMGVUxVuuXMj3aNJklzymKxBlJEXhJDCY+TUwc= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.7 h1:X+5QChV4btPAoTpQ/GAcEJ1tCrpO6Y8X4C5CG11WNWI= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.7/go.mod h1:LYMBcQuhPc6czFaQpYC9JAcEcMf1DNVie4YHg6iC240= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= github.com/aws/aws-sdk-go-v2/service/sts v1.19.0/go.mod h1:BgQOMsg8av8jset59jelyPW7NoZcZXLVpDsXunGDrk8= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0 h1:EJsHUYgFBV7/N1YtL73lsfZODAOU+CnNSZfEAlqqQaA= github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0/go.mod h1:AxKuXHc0zv2yYaeueUG7R3ONbcnQIuDj0bkdFmPVRzU= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= -github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= -github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20241029204838-fb9784500689 h1:1Wsq5J+j6MVRiPSKTEqJPRfsiO2pg5MnjRt0C7nW2xA= -github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20241029204838-fb9784500689/go.mod h1:Ngigq3Yf0wMR9DxQizomTKBn91l0jSNGJnvFhZPk9dQ= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20241128053516-b9e7404a33c3 h1:Z0GhCczQLlS/GRRS/suhoVxqU4Oz4CftHRd+Kdj22Uo= +github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20241128053516-b9e7404a33c3/go.mod h1:7GP/HkcmpkFy6JyDSTKfdN6PNWCpMgsVMpwTkQwvVc4= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= @@ -1005,14 +1013,14 @@ github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNS github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA= github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQWD9LIutE= github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= -github.com/charmbracelet/bubbletea v1.1.2 h1:naQXF2laRxyLyil/i7fxdpiz1/k06IKquhm4vBfHsIc= -github.com/charmbracelet/bubbletea v1.1.2/go.mod h1:9HIU/hBV24qKjlehyj8z1r/tR9TYTQEag+cWZnuXo8E= +github.com/charmbracelet/bubbletea v1.2.4 h1:KN8aCViA0eps9SCOThb2/XPIlea3ANJLUkv3KnQRNCE= +github.com/charmbracelet/bubbletea v1.2.4/go.mod h1:Qr6fVQw+wX7JkWWkVyXYk/ZUQ92a6XNekLXa3rR18MM= github.com/charmbracelet/lipgloss v1.0.0 h1:O7VkGDvqEdGi93X+DeqsQ7PKHDgtQfF8j8/O2qFMQNg= github.com/charmbracelet/lipgloss v1.0.0/go.mod h1:U5fy9Z+C38obMs+T+tJqst9VGzlOYGj4ri9reL3qUlo= -github.com/charmbracelet/x/ansi v0.4.2 h1:0JM6Aj/g/KC154/gOP4vfxun0ff6itogDYk41kof+qk= -github.com/charmbracelet/x/ansi v0.4.2/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= -github.com/charmbracelet/x/term v0.2.0 h1:cNB9Ot9q8I711MyZ7myUR5HFWL/lc3OpU8jZ4hwm0x0= -github.com/charmbracelet/x/term v0.2.0/go.mod h1:GVxgxAbjUrmpvIINHIQnJJKpMlHiZ4cktEQCN6GWyF0= +github.com/charmbracelet/x/ansi v0.4.5 h1:LqK4vwBNaXw2AyGIICa5/29Sbdq58GbGdFngSexTdRM= +github.com/charmbracelet/x/ansi v0.4.5/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM= github.com/chengxilo/virtualterm v1.0.4/go.mod h1:DyxxBZz/x1iqJjFxTFcr6/x+jSpqN0iwWCOK1q10rlY= github.com/chrismellard/docker-credential-acr-env v0.0.0-20230304212654-82a0ddb27589 h1:krfRl01rzPzxSxyLyrChD+U+MzsBXbm0OwYYB67uF+4= @@ -1041,8 +1049,8 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH 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/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59 h1:fLZ97KE86ELjEYJCEUVzmbhfzDxHHGwBrDVMd4XL6Bs= -github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg= @@ -1053,14 +1061,16 @@ github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be h1:J5BL github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be/go.mod h1:mk5IQ+Y0ZeO87b858TlA645sVcEcbiX6YqP98kt+7+w= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= -github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/containerd v1.7.23 h1:H2CClyUkmpKAGlhQp95g2WXHfLYc7whAuvZGBNYOOwQ= +github.com/containerd/containerd v1.7.23/go.mod h1:7QUzfURqZWCZV7RLNEn1XjUCQLEf0bkaK4GjUaZehxw= github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= -github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= -github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4= +github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= @@ -1083,8 +1093,8 @@ github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46 h1:2Dx4IHfC1yHWI12AxQDJM1QbRCDfk6M+blLzlZCXdrc= github.com/cyberphone/json-canonicalization v0.0.0-20231011164504-785e29786b46/go.mod h1:uzvlm1mxhHkdfqitSA92i7Se+S9ksOn3a3qmv/kyOCw= -github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= -github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= +github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8= +github.com/cyphar/filepath-securejoin v0.3.4/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM= github.com/danieljoos/wincred v1.2.1 h1:dl9cBrupW8+r5250DYkYxocLeZ1Y4vB1kxgtjxw8GQs= github.com/danieljoos/wincred v1.2.1/go.mod h1:uGaFL9fDn3OLTvzCGulzE+SzjEe5NGlh5FdCcyfPwps= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -1141,8 +1151,8 @@ github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/ github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/elastic/elastic-transport-go/v8 v8.6.0 h1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA= github.com/elastic/elastic-transport-go/v8 v8.6.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= -github.com/elastic/go-elasticsearch/v8 v8.15.0 h1:IZyJhe7t7WI3NEFdcHnf6IJXqpRf+8S8QWLtZYYyBYk= -github.com/elastic/go-elasticsearch/v8 v8.15.0/go.mod h1:HCON3zj4btpqs2N1jjsAy4a/fiAul+YBP00mBH4xik8= +github.com/elastic/go-elasticsearch/v8 v8.16.0 h1:f7bR+iBz8GTAVhwyFO3hm4ixsz2eMaEy0QroYnXV3jE= +github.com/elastic/go-elasticsearch/v8 v8.16.0/go.mod h1:lGMlgKIbYoRvay3xWBeKahAiJOgmFDsjZC39nmO3H64= github.com/elimity-com/scim v0.0.0-20240320110924-172bf2aee9c8 h1:0+BTyxIYgiVAry/P5s8R4dYuLkhB9Nhso8ogFWNr4IQ= github.com/elimity-com/scim v0.0.0-20240320110924-172bf2aee9c8/go.mod h1:JkjcmqbLW+khwt2fmBPJFBhx2zGZ8XobRZ+O0VhlwWo= github.com/emicklei/go-restful/v3 v3.11.3 h1:yagOQz/38xJmcNeZJtrUcKjkHRltIaIFXKWeG1SkWGE= @@ -1195,8 +1205,8 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/fsouza/fake-gcs-server v1.49.3 h1:RPt94uYjWb+t19dlZg4PVRJFCvqf7px0YZDvIiUfjcU= -github.com/fsouza/fake-gcs-server v1.49.3/go.mod h1:WsE7OZKNd5WXgiry01oJO6mDvljOr+YLPR3VQtM2sDY= +github.com/fsouza/fake-gcs-server v1.50.2 h1:ulrS1pavCOCbMZfN5ZPgBRMFWclON9xDsuLBniXtQoE= +github.com/fsouza/fake-gcs-server v1.50.2/go.mod h1:VU6Zgei4647KuT4XER8WHv5Hcj2NIySndyG8gfvwckA= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= @@ -1209,8 +1219,8 @@ github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= github.com/go-chi/chi v4.1.2+incompatible h1:fGFk2Gmi/YKXk0OmGfBh0WgmN3XB8lVnEyNz34tQRec= github.com/go-chi/chi v4.1.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= -github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= -github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= @@ -1275,8 +1285,8 @@ github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhO github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-piv/piv-go v1.11.0 h1:5vAaCdRTFSIW4PeqMbnsDlUZ7odMYWnHBDGdmtU/Zhg= github.com/go-piv/piv-go v1.11.0/go.mod h1:NZ2zmjVkfFaL/CF8cVQ/pXdXtuj110zEKGdJM6fJZZM= -github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= -github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= +github.com/go-resty/resty/v2 v2.16.2 h1:CpRqTjIzq/rweXUt9+GxzzQdlkqMdt8Lm/fuK/CAbAg= +github.com/go-resty/resty/v2 v2.16.2/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -1492,8 +1502,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE 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/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= +github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= 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/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -1545,8 +1555,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= 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.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c/go.mod h1:NMPJylDgVpX0MLRlPy15sqSwOFv/U1GZ2m21JhFfek0= github.com/guptarohit/asciigraph v0.7.3 h1:p05XDDn7cBTWiBqWb30mrwxd6oU0claAjqeytllnsPY= @@ -1769,10 +1779,10 @@ github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuz github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailgun/errors v0.3.0 h1:g8R8lodkwqk5WIVMAClyUqt0PSd5JTVgobB+H7C2sLs= -github.com/mailgun/errors v0.3.0/go.mod h1:+ltknP+jhv3gZ1StKY6ugoQECcPxDCaSdmYesqTZcLQ= -github.com/mailgun/mailgun-go/v4 v4.18.1 h1:ShNH/wzj7albTF/6le011FF+DGMd3azcSKL4iO9AgeI= -github.com/mailgun/mailgun-go/v4 v4.18.1/go.mod h1:+d4FCswFAukgYc1XtKK2IxOYaVxjVm8AN2z/5TBiT8M= +github.com/mailgun/errors v0.4.0 h1:6LFBvod6VIW83CMIOT9sYNp28TCX0NejFPP4dSX++i8= +github.com/mailgun/errors v0.4.0/go.mod h1:xGBaaKdEdQT0/FhwvoXv4oBaqqmVZz9P1XEnvD/onc0= +github.com/mailgun/mailgun-go/v4 v4.20.4 h1:9R10uxZ2ELCzMdalUbQ7g4q3sHY0s7qtnIvODgsdAGQ= +github.com/mailgun/mailgun-go/v4 v4.20.4/go.mod h1:768NjUvsxW8Ga8fHIPITmr5f/U8qmnQqnZ3/cs3StUc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU= @@ -1813,8 +1823,8 @@ github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcs github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.75 h1:0uLrB6u6teY2Jt+cJUVi9cTvDRuBKWSRzSAcznRkwlE= -github.com/minio/minio-go/v7 v7.0.75/go.mod h1:qydcVzV8Hqtj1VtEocfxbmVFa2siu6HGa+LDEPogjD8= +github.com/minio/minio-go/v7 v7.0.78 h1:LqW2zy52fxnI4gg8C2oZviTaKHcBV36scS+RzJnxUFs= +github.com/minio/minio-go/v7 v7.0.78/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -1834,6 +1844,8 @@ github.com/moby/spdystream v0.4.0 h1:Vy79D6mHeJJjiPdFEL2yku1kl0chZpJfZcPpb16BRl8 github.com/moby/spdystream v0.4.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1910,12 +1922,12 @@ github.com/opensearch-project/opensearch-go/v2 v2.3.0 h1:nQIEMr+A92CkhHrZgUhcfsr github.com/opensearch-project/opensearch-go/v2 v2.3.0/go.mod h1:8LDr9FCgUTVoT+5ESjc2+iaZuldqE+23Iq0r1XeNue8= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/parquet-go/parquet-go v0.23.0 h1:dyEU5oiHCtbASyItMCD2tXtT2nPmoPbKpqf0+nnGrmk= -github.com/parquet-go/parquet-go v0.23.0/go.mod h1:MnwbUcFHU6uBYMymKAlPPAw9yh3kE1wWl6Gl1uLdkNk= +github.com/parquet-go/parquet-go v0.24.0 h1:VrsifmLPDnas8zpoHmYiWDZ1YHzLmc7NmNwPGkI2JM4= +github.com/parquet-go/parquet-go v0.24.0/go.mod h1:OqBBRGBl7+llplCvDMql8dEKaDqjaFA/VAPw+OJiNiw= github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcMb0= github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= -github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627 h1:pSCLCl6joCFRnjpeojzOpEYs4q7Vditq8fySFG5ap3Y= -github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible h1:IWzUvJ72xMjmrjR9q3H1PF+jwdN0uNQiR2t1BLNalyo= +github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= @@ -1995,8 +2007,8 @@ github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0leargg github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf h1:014O62zIzQwvoD7Ekj3ePDF5bv9Xxy0w6AZk0qYbjUk= github.com/protocolbuffers/txtpbfmt v0.0.0-20231025115547-084445ff1adf/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c= -github.com/quic-go/quic-go v0.48.1 h1:y/8xmfWI9qmGTc+lBr4jKRUWLGSlSigv847ULJ4hYXA= -github.com/quic-go/quic-go v0.48.1/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -2008,12 +2020,12 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= @@ -2042,16 +2054,14 @@ github.com/sassoftware/relic v7.2.1+incompatible/go.mod h1:CWfAxv73/iLZ17rbyhIEq github.com/sassoftware/relic/v7 v7.6.2 h1:rS44Lbv9G9eXsukknS4mSjIAuuX+lMq/FnStgmZlUv4= github.com/sassoftware/relic/v7 v7.6.2/go.mod h1:kjmP0IBVkJZ6gXeAu35/KCEfca//+PKM6vTAsyDPY+k= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/schollz/progressbar/v3 v3.17.0 h1:Fv+vG6O6jnJwdjCelvfyYO7sF2jaUGQVmdH4CxcZdsQ= -github.com/schollz/progressbar/v3 v3.17.0/go.mod h1:5H4fLgifX+KeQCsEJnZTOepgZLe1jFF1lpPXb68IJTA= +github.com/schollz/progressbar/v3 v3.17.1 h1:bI1MTaoQO+v5kzklBjYNRQLoVpe0zbyRZNK6DFkVC5U= +github.com/schollz/progressbar/v3 v3.17.1/go.mod h1:RzqpnsPQNjUyIgdglUjRLgD7sVnxN1wpmBMV+UiEbL4= github.com/scim2/filter-parser/v2 v2.2.0 h1:QGadEcsmypxg8gYChRSM2j1edLyE/2j72j+hdmI4BJM= github.com/scim2/filter-parser/v2 v2.2.0/go.mod h1:jWnkDToqX/Y0ugz0P5VvpVEUKcWcyHHj+X+je9ce5JA= github.com/secure-systems-lab/go-securesystemslib v0.8.0 h1:mr5An6X45Kb2nddcFlbmfHkLguCE9laoZCUzEEpIZXA= github.com/secure-systems-lab/go-securesystemslib v0.8.0/go.mod h1:UH2VZVuJfCYR8WgMlCU1uFsOUU+KeyrTWcSS73NBOzU= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/segmentio/encoding v0.4.0 h1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOVmy8= -github.com/segmentio/encoding v0.4.0/go.mod h1:/d03Cd8PoaDeceuhUUUQWjU0KhWjrmYrWPgtJHYZSnI= github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c= github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= @@ -2061,8 +2071,8 @@ github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df h1:S77Pf5fIG github.com/shabbyrobe/gocovmerge v0.0.0-20230507112040-c3350d9342df/go.mod h1:dcuzJZ83w/SqN9k4eQqwKYMgmKWzg/KzJAURBhRL1tc= github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= -github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= -github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= @@ -2124,8 +2134,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= -github.com/spiffe/go-spiffe/v2 v2.3.0 h1:g2jYNb/PDMB8I7mBGL2Zuq/Ur6hUhoroxGQFyD6tTj8= -github.com/spiffe/go-spiffe/v2 v2.3.0/go.mod h1:Oxsaio7DBgSNqhAO9i/9tLClaVlfRok7zvJnTV8ZyIY= +github.com/spiffe/go-spiffe/v2 v2.4.0 h1:j/FynG7hi2azrBG5cvjRcnQ4sux/VNj8FAVc99Fl66c= +github.com/spiffe/go-spiffe/v2 v2.4.0/go.mod h1:m5qJ1hGzjxjtrkGHZupoXHo/FDWwCB1MdSyBzfHugx0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -2146,8 +2156,9 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= @@ -2181,8 +2192,8 @@ github.com/weppos/publicsuffix-go v0.30.3-0.20240510084413-5f1d03393b3d h1:q80YK github.com/weppos/publicsuffix-go v0.30.3-0.20240510084413-5f1d03393b3d/go.mod h1:vLdXKydr/OJssAXmjY0XBgLXUfivBMrNRIBljgtqCnw= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xanzy/go-gitlab v0.112.0 h1:6Z0cqEooCvBMfBIHw+CgO4AKGRV8na/9781xOb0+DKw= -github.com/xanzy/go-gitlab v0.112.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= +github.com/xanzy/go-gitlab v0.114.0 h1:0wQr/KBckwrZPfEMjRqpUz0HmsKKON9UhCYv9KDy19M= +github.com/xanzy/go-gitlab v0.114.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= @@ -2248,12 +2259,12 @@ github.com/zmap/zlint/v3 v3.6.0/go.mod h1:NVgiIWssgzp0bNl8P4Gz94NHV2ep/4Jyj9V69u go.einride.tech/aip v0.68.0 h1:4seM66oLzTpz50u4K1zlJyOXQ3tCzcJN7I22tKkjipw= go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHHg= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0= -go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= -go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q= -go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= -go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= -go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= +go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w= +go.etcd.io/etcd/api/v3 v3.5.17/go.mod h1:d1hvkRuXkts6PmaYk2Vrgqbv7H4ADfAKhyJqHNLJCB4= +go.etcd.io/etcd/client/pkg/v3 v3.5.17 h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOUKKVw= +go.etcd.io/etcd/client/pkg/v3 v3.5.17/go.mod h1:4DqK1TKacp/86nJk4FLQqo6Mn2vvQFBmruW3pP14H/w= +go.etcd.io/etcd/client/v3 v3.5.17 h1:o48sINNeWz5+pjy/Z0+HKpj/xSnBkuVhVvXkjEXbqZY= +go.etcd.io/etcd/client/v3 v3.5.17/go.mod h1:j2d4eXTHWkT2ClBgnnEPm/Wuu7jsqku41v9DZ3OtjQo= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= @@ -2268,33 +2279,35 @@ 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/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ= go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= -go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0 h1:MnAevUB0SFfKALzF5ApgrArdvHZduRT3/e59L/lNYKE= -go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0/go.mod h1:MHPbT1EvQOZMGbKeuCovYWcyM9iaxcltRf7+GsU8ziE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0 h1:G47XgH32CEM1I9kZ8xrVExSxivATGHNE0tdxuqlx9MQ= +go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0/go.mod h1:aqXlYGrumc8b/n4z9eDHHoiLN4fq2DAO//wMnqdxPhg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY= go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.step.sm/crypto v0.51.2 h1:5EiCGIMg7IvQTGmJrwRosbXeprtT80OhoS/PJarg60o= @@ -2354,8 +2367,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= 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= @@ -2371,8 +2384,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 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-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= 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= @@ -2416,8 +2429,8 @@ golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= 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= @@ -2490,8 +2503,8 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2521,8 +2534,8 @@ 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.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2539,8 +2552,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2649,8 +2662,8 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2669,8 +2682,8 @@ golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= 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= @@ -2691,16 +2704,16 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-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.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2773,8 +2786,8 @@ golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= 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= @@ -2860,8 +2873,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ= -google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw= +google.golang.org/api v0.207.0 h1:Fvt6IGCYjf7YLcQ+GCegeAI2QSQCfIWhRkmrMPj3JRM= +google.golang.org/api v0.207.0/go.mod h1:I53S168Yr/PNDNMi5yPnDc0/LGRZO6o7PoEbl/HY3CM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -3001,12 +3014,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= -google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f h1:zDoHYmMzMacIdjNe+P2XiTmPsLawi/pCbSPfxt6lTfw= +google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f/go.mod h1:Q5m6g8b5KaFFzsQFIGdJkSJDGeJiybVenoYFMMa3ohI= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -3048,11 +3061,13 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.66.3 h1:TWlsh8Mv0QI/1sIbs1W36lqRclxrmF+eFJ4DbI0fuhA= -google.golang.org/grpc v1.66.3/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a h1:UIpYSuWdWHSzjwcAFRLjKcPXFZVVLXGEM23W+NWqipw= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a/go.mod h1:9i1T9n4ZinTUZGgzENMi8MDDgbGC5mqTS75JAv6xN3A= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -3071,8 +3086,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk= gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= @@ -3121,8 +3136,8 @@ gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= gvisor.dev/gvisor v0.0.0-20230927004350-cbd86285d259 h1:TbRPT0HtzFP3Cno1zZo7yPzEEnfu8EjLfl6IU9VfqkQ= gvisor.dev/gvisor v0.0.0-20230927004350-cbd86285d259/go.mod h1:AVgIgHMwK63XvmAzWG9vLQ41YnVHN0du0tEC46fI7yY= -helm.sh/helm/v3 v3.16.2 h1:Y9v7ry+ubQmi+cb5zw1Llx8OKHU9Hk9NQ/+P+LGBe2o= -helm.sh/helm/v3 v3.16.2/go.mod h1:SyTXgKBjNqi2NPsHCW5dDAsHqvGIu0kdNYNH9gQaw70= +helm.sh/helm/v3 v3.16.3 h1:kb8bSxMeRJ+knsK/ovvlaVPfdis0X3/ZhYCSFRP+YmY= +helm.sh/helm/v3 v3.16.3/go.mod h1:zeVWGDR4JJgiRbT3AnNsjYaX8OTJlIE9zC+Q7F7iUSU= 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= @@ -3199,8 +3214,8 @@ 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/controller-runtime v0.19.1 h1:Son+Q40+Be3QWb+niBXAg2vFiYWolDjjRfO8hn/cxOk= -sigs.k8s.io/controller-runtime v0.19.1/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= +sigs.k8s.io/controller-runtime v0.19.3 h1:XO2GvC9OPftRst6xWCpTgBZO04S2cbp0Qqkj8bX1sPw= +sigs.k8s.io/controller-runtime v0.19.3/go.mod h1:j4j87DqtsThvwTv5/Tc5NFRyyF/RF0ip4+62tbTSIUM= sigs.k8s.io/controller-tools v0.16.3 h1:z48C5/d4jCVQQvtiSBL5MYyZ3EO2eFIOXrIKMgHVhFY= sigs.k8s.io/controller-tools v0.16.3/go.mod h1:AEj6k+w1kYpLZv2einOH3mj52ips4W/6FUjnB5tkJGs= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= diff --git a/integration/appaccess/appaccess_test.go b/integration/appaccess/appaccess_test.go index 0b4b1965dbd18..dffd5f8aa1912 100644 --- a/integration/appaccess/appaccess_test.go +++ b/integration/appaccess/appaccess_test.go @@ -48,6 +48,7 @@ import ( "github.com/gravitational/teleport/lib/service" "github.com/gravitational/teleport/lib/service/servicecfg" "github.com/gravitational/teleport/lib/srv/app/common" + "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/web/app" ) @@ -272,8 +273,16 @@ func testClientCert(p *Pack, t *testing.T) { }, }) evilUser, _ := p.CreateUser(t) - rootWs := p.CreateAppSession(t, p.username, p.rootAppClusterName, p.rootAppPublicAddr) - leafWs := p.CreateAppSession(t, p.username, p.leafAppClusterName, p.leafAppPublicAddr) + rootWs := p.CreateAppSession(t, CreateAppSessionParams{ + Username: p.username, + ClusterName: p.rootAppClusterName, + AppPublicAddr: p.rootAppPublicAddr, + }) + leafWs := p.CreateAppSession(t, CreateAppSessionParams{ + Username: p.username, + ClusterName: p.leafAppClusterName, + AppPublicAddr: p.leafAppPublicAddr, + }) tests := []struct { desc string @@ -283,14 +292,24 @@ func testClientCert(p *Pack, t *testing.T) { wantErr bool }{ { - desc: "root cluster, valid TLS config, success", - inTLSConfig: p.makeTLSConfig(t, rootWs.GetName(), rootWs.GetUser(), p.rootAppPublicAddr, p.rootAppClusterName, ""), + desc: "root cluster, valid TLS config, success", + inTLSConfig: p.makeTLSConfig(t, tlsConfigParams{ + sessionID: rootWs.GetName(), + username: rootWs.GetUser(), + publicAddr: p.rootAppPublicAddr, + clusterName: p.rootAppClusterName, + }), outStatusCode: http.StatusOK, outMessage: p.rootMessage, }, { - desc: "leaf cluster, valid TLS config, success", - inTLSConfig: p.makeTLSConfig(t, leafWs.GetName(), leafWs.GetUser(), p.leafAppPublicAddr, p.leafAppClusterName, ""), + desc: "leaf cluster, valid TLS config, success", + inTLSConfig: p.makeTLSConfig(t, tlsConfigParams{ + sessionID: leafWs.GetName(), + username: leafWs.GetUser(), + publicAddr: p.leafAppPublicAddr, + clusterName: p.leafAppClusterName, + }), outStatusCode: http.StatusOK, outMessage: p.leafMessage, }, @@ -300,26 +319,48 @@ func testClientCert(p *Pack, t *testing.T) { outStatusCode: http.StatusForbidden, }, { - desc: "root cluster, invalid session owner", - inTLSConfig: p.makeTLSConfig(t, rootWs.GetName(), evilUser.GetName(), p.rootAppPublicAddr, p.rootAppClusterName, ""), + desc: "root cluster, invalid session owner", + inTLSConfig: p.makeTLSConfig(t, tlsConfigParams{ + sessionID: rootWs.GetName(), + username: evilUser.GetName(), + publicAddr: p.rootAppPublicAddr, + clusterName: p.rootAppClusterName, + }), outStatusCode: http.StatusForbidden, outMessage: "", }, { - desc: "leaf cluster, invalid session owner", - inTLSConfig: p.makeTLSConfig(t, leafWs.GetName(), evilUser.GetName(), p.leafAppPublicAddr, p.leafAppClusterName, ""), + desc: "leaf cluster, invalid session owner", + inTLSConfig: p.makeTLSConfig(t, tlsConfigParams{ + sessionID: leafWs.GetName(), + username: evilUser.GetName(), + publicAddr: p.leafAppPublicAddr, + clusterName: p.leafAppClusterName, + }), outStatusCode: http.StatusForbidden, outMessage: "", }, { - desc: "root cluster, valid TLS config with pinned IP, success", - inTLSConfig: p.makeTLSConfig(t, rootWs.GetName(), rootWs.GetUser(), p.rootAppPublicAddr, p.rootAppClusterName, "127.0.0.1"), + desc: "root cluster, valid TLS config with pinned IP, success", + inTLSConfig: p.makeTLSConfig(t, tlsConfigParams{ + sessionID: rootWs.GetName(), + username: rootWs.GetUser(), + publicAddr: p.rootAppPublicAddr, + clusterName: p.rootAppClusterName, + pinnedIP: "127.0.0.1", + }), outStatusCode: http.StatusOK, outMessage: p.rootMessage, }, { - desc: "root cluster, valid TLS config with wrong pinned IP", - inTLSConfig: p.makeTLSConfig(t, rootWs.GetName(), rootWs.GetUser(), p.rootAppPublicAddr, p.rootAppClusterName, "127.0.0.2"), + desc: "root cluster, valid TLS config with wrong pinned IP", + inTLSConfig: p.makeTLSConfig(t, tlsConfigParams{ + sessionID: rootWs.GetName(), + username: rootWs.GetUser(), + publicAddr: p.rootAppPublicAddr, + clusterName: p.rootAppClusterName, + pinnedIP: "127.0.0.2", + }), outStatusCode: http.StatusForbidden, wantErr: true, }, @@ -593,7 +634,12 @@ func TestInvalidateAppSessionsOnLogout(t *testing.T) { require.Equal(t, http.StatusOK, status) // Generates TLS config for making app requests. - reqTLS := p.makeTLSConfig(t, sessID, p.username, p.rootAppPublicAddr, p.rootAppClusterName, "") + reqTLS := p.makeTLSConfig(t, tlsConfigParams{ + sessionID: sessID, + username: p.username, + publicAddr: p.rootAppPublicAddr, + clusterName: p.rootAppClusterName, + }) require.NotNil(t, reqTLS) // Issue a request to the application to guarantee everything is working correctly. @@ -630,47 +676,160 @@ func TestInvalidateAppSessionsOnLogout(t *testing.T) { func TestTCP(t *testing.T) { pack := Setup(t) evilUser, _ := pack.CreateUser(t) + sessionUsername := pack.tc.Username - rootWs := pack.CreateAppSession(t, pack.tc.Username, pack.rootAppClusterName, pack.rootTCPPublicAddr) - leafWs := pack.CreateAppSession(t, pack.tc.Username, pack.leafAppClusterName, pack.leafTCPPublicAddr) + rootTCPAppAddr, err := utils.ParseAddr(pack.rootTCPAppURI) + require.NoError(t, err) + rootTCPAppPort := rootTCPAppAddr.Port(0) tests := []struct { description string - address string - outMessage string - wantReadErr error + // tlsConfigParams carries information needed to create TLS config for a local proxy. + // tlsConfigParams.sessionID is automatically set from the session created within the test. + tlsConfigParams tlsConfigParams + outMessage string + wantReadErr error }{ { description: "TCP app in root cluster", - address: pack.startLocalProxy(t, - pack.makeTLSConfig(t, rootWs.GetName(), rootWs.GetUser(), pack.rootTCPPublicAddr, pack.rootAppClusterName, "")), + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.rootTCPPublicAddr, + clusterName: pack.rootAppClusterName, + }, outMessage: pack.rootTCPMessage, }, { description: "TCP app in leaf cluster", - address: pack.startLocalProxy(t, - pack.makeTLSConfig(t, leafWs.GetName(), leafWs.GetUser(), pack.leafTCPPublicAddr, pack.leafAppClusterName, "")), + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.leafTCPPublicAddr, + clusterName: pack.leafAppClusterName, + }, outMessage: pack.leafTCPMessage, }, { description: "TCP app in root cluster, invalid session owner", - address: pack.startLocalProxy(t, - pack.makeTLSConfig(t, rootWs.GetName(), evilUser.GetName(), pack.rootTCPPublicAddr, pack.rootAppClusterName, "")), + tlsConfigParams: tlsConfigParams{ + username: evilUser.GetName(), + publicAddr: pack.rootTCPPublicAddr, + clusterName: pack.rootAppClusterName, + }, wantReadErr: io.EOF, // access denied errors should close the tcp conn }, { description: "TCP app in leaf cluster, invalid session owner", - address: pack.startLocalProxy(t, - pack.makeTLSConfig(t, leafWs.GetName(), evilUser.GetName(), pack.leafTCPPublicAddr, pack.leafAppClusterName, "")), + tlsConfigParams: tlsConfigParams{ + username: evilUser.GetName(), + publicAddr: pack.leafTCPPublicAddr, + clusterName: pack.leafAppClusterName, + }, wantReadErr: io.EOF, // access denied errors should close the tcp conn }, + // The following two situation can happen when a multi-port app is updated to be a singe-port + // app but after the user already generated a cert for the multi-port variant. + { + description: "TCP app, target port matches port in URI", + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.rootTCPPublicAddr, + clusterName: pack.rootAppClusterName, + targetPort: rootTCPAppPort, + }, + outMessage: pack.rootTCPMessage, + }, + { + description: "TCP app, target port does not match port in URI", + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.rootTCPPublicAddr, + clusterName: pack.rootAppClusterName, + targetPort: rootTCPAppPort - 1, + }, + wantReadErr: io.EOF, + }, + { + description: "multi-port TCP app in root cluster", + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.rootTCPMultiPortPublicAddr, + clusterName: pack.rootAppClusterName, + targetPort: pack.rootTCPMultiPortAppPortAlpha, + }, + outMessage: pack.rootTCPMultiPortMessageAlpha, + }, + { + description: "multi-port TCP app in root cluster, other port", + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.rootTCPMultiPortPublicAddr, + clusterName: pack.rootAppClusterName, + targetPort: pack.rootTCPMultiPortAppPortBeta, + }, + outMessage: pack.rootTCPMultiPortMessageBeta, + }, + { + description: "multi-port TCP app in leaf cluster", + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.leafTCPMultiPortPublicAddr, + clusterName: pack.leafAppClusterName, + targetPort: pack.leafTCPMultiPortAppPortAlpha, + }, + outMessage: pack.leafTCPMultiPortMessageAlpha, + }, + { + description: "multi-port TCP app in leaf cluster, other port", + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.leafTCPMultiPortPublicAddr, + clusterName: pack.leafAppClusterName, + targetPort: pack.leafTCPMultiPortAppPortBeta, + }, + outMessage: pack.leafTCPMultiPortMessageBeta, + }, + { + // This simulates an older client with no TargetPort connecting to a newer app agent. + description: "multi-port TCP app in root cluster, no target port", + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.rootTCPMultiPortPublicAddr, + clusterName: pack.rootAppClusterName, + }, + // Such client should still be proxied to the first port found in TCP ports of the app. + outMessage: pack.rootTCPMultiPortMessageAlpha, + }, + { + description: "multi-port TCP app, port not in spec", + tlsConfigParams: tlsConfigParams{ + username: sessionUsername, + publicAddr: pack.rootTCPMultiPortPublicAddr, + clusterName: pack.rootAppClusterName, + // 42 should not be handed out to a non-root user when creating a listener on port 0, so + // it's unlikely that 42 is going to end up in the app spec. + targetPort: 42, + }, + wantReadErr: io.EOF, + }, } for _, test := range tests { test := test t.Run(test.description, func(t *testing.T) { t.Parallel() - conn, err := net.Dial("tcp", test.address) + + ws := pack.CreateAppSession(t, CreateAppSessionParams{ + Username: sessionUsername, + ClusterName: test.tlsConfigParams.clusterName, + AppPublicAddr: test.tlsConfigParams.publicAddr, + AppTargetPort: test.tlsConfigParams.targetPort, + }) + + test.tlsConfigParams.sessionID = ws.GetName() + + localProxyAddress := pack.startLocalProxy(t, pack.makeTLSConfig(t, test.tlsConfigParams)) + + conn, err := net.Dial("tcp", localProxyAddress) require.NoError(t, err) buf := make([]byte, 1024) @@ -700,8 +859,17 @@ func TestTCPLock(t *testing.T) { msg := []byte(uuid.New().String()) // Start the proxy to the two way communication app. - rootWs := pack.CreateAppSession(t, pack.tc.Username, pack.rootAppClusterName, pack.rootTCPTwoWayPublicAddr) - tlsConfig := pack.makeTLSConfig(t, rootWs.GetName(), rootWs.GetUser(), pack.rootTCPTwoWayPublicAddr, pack.rootAppClusterName, "") + rootWs := pack.CreateAppSession(t, CreateAppSessionParams{ + Username: pack.tc.Username, + ClusterName: pack.rootAppClusterName, + AppPublicAddr: pack.rootTCPTwoWayPublicAddr, + }) + tlsConfig := pack.makeTLSConfig(t, tlsConfigParams{ + sessionID: rootWs.GetName(), + username: rootWs.GetUser(), + publicAddr: pack.rootTCPTwoWayPublicAddr, + clusterName: pack.rootAppClusterName, + }) address := pack.startLocalProxy(t, tlsConfig) @@ -774,8 +942,17 @@ func TestTCPCertExpiration(t *testing.T) { msg := []byte(uuid.New().String()) // Start the proxy to the two way communication app. - rootWs := pack.CreateAppSession(t, pack.tc.Username, pack.rootAppClusterName, pack.rootTCPTwoWayPublicAddr) - tlsConfig := pack.makeTLSConfig(t, rootWs.GetName(), rootWs.GetUser(), pack.rootTCPTwoWayPublicAddr, pack.rootAppClusterName, "") + rootWs := pack.CreateAppSession(t, CreateAppSessionParams{ + Username: pack.tc.Username, + ClusterName: pack.rootAppClusterName, + AppPublicAddr: pack.rootTCPTwoWayPublicAddr, + }) + tlsConfig := pack.makeTLSConfig(t, tlsConfigParams{ + sessionID: rootWs.GetName(), + username: rootWs.GetUser(), + publicAddr: pack.rootTCPTwoWayPublicAddr, + clusterName: pack.rootAppClusterName, + }) address := pack.startLocalProxy(t, tlsConfig) diff --git a/integration/appaccess/fixtures.go b/integration/appaccess/fixtures.go index d2fb317f88b47..0f5543efb4ff1 100644 --- a/integration/appaccess/fixtures.go +++ b/integration/appaccess/fixtures.go @@ -24,11 +24,13 @@ import ( "net/http" "net/http/httptest" "net/http/httputil" + "strconv" "testing" "time" "github.com/google/uuid" "github.com/gorilla/websocket" + "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" @@ -73,40 +75,50 @@ func SetupWithOptions(t *testing.T, opts AppTestOptions) *Pack { rootAppName: "app-01", rootAppPublicAddr: "app-01.example.com", rootAppClusterName: "example.com", - rootMessage: uuid.New().String(), + rootMessage: uuidWithLabel("app-01"), rootWSAppName: "ws-01", rootWSPublicAddr: "ws-01.example.com", - rootWSMessage: uuid.New().String(), + rootWSMessage: uuidWithLabel("ws-01"), rootWSSAppName: "wss-01", rootWSSPublicAddr: "wss-01.example.com", - rootWSSMessage: uuid.New().String(), + rootWSSMessage: uuidWithLabel("wss-01"), rootTCPAppName: "tcp-01", rootTCPPublicAddr: "tcp-01.example.com", - rootTCPMessage: uuid.New().String(), + rootTCPMessage: uuidWithLabel("tcp-01"), rootTCPTwoWayAppName: "tcp-twoway", rootTCPTwoWayPublicAddr: "tcp-twoway.example.com", - rootTCPTwoWayMessage: uuid.New().String(), + rootTCPTwoWayMessage: uuidWithLabel("tcp-twoway"), + + rootTCPMultiPortAppName: "tcp-multiport-01", + rootTCPMultiPortPublicAddr: "tcp-multiport-01.example.com", + rootTCPMultiPortMessageAlpha: uuidWithLabel("tcp-multiport-01-alpha"), + rootTCPMultiPortMessageBeta: uuidWithLabel("tcp-multiport-01-beta"), leafAppName: "app-02", leafAppPublicAddr: "app-02.example.com", leafAppClusterName: "leaf.example.com", - leafMessage: uuid.New().String(), + leafMessage: uuidWithLabel("app-02"), leafWSAppName: "ws-02", leafWSPublicAddr: "ws-02.example.com", - leafWSMessage: uuid.New().String(), + leafWSMessage: uuidWithLabel("ws-02"), leafWSSAppName: "wss-02", leafWSSPublicAddr: "wss-02.example.com", - leafWSSMessage: uuid.New().String(), + leafWSSMessage: uuidWithLabel("wss-02"), leafTCPAppName: "tcp-02", leafTCPPublicAddr: "tcp-02.example.com", - leafTCPMessage: uuid.New().String(), + leafTCPMessage: uuidWithLabel("tcp-02"), + + leafTCPMultiPortAppName: "tcp-multiport-02", + leafTCPMultiPortPublicAddr: "tcp-multiport-02.example.com", + leafTCPMultiPortMessageAlpha: uuidWithLabel("tcp-multiport-02-alpha"), + leafTCPMultiPortMessageBeta: uuidWithLabel("tcp-multiport-02-beta"), jwtAppName: "app-03", jwtAppPublicAddr: "app-03.example.com", @@ -174,6 +186,19 @@ func SetupWithOptions(t *testing.T, opts AppTestOptions) *Pack { c.Close() }) t.Cleanup(func() { rootTCPTwoWayServer.Close() }) + + // Two TCP servers for the multi-port TCP application in the root cluster. + rootTCPMultiPortServerAlpha := newTCPServer(t, func(c net.Conn) { + c.Write([]byte(p.rootTCPMultiPortMessageAlpha)) + c.Close() + }) + t.Cleanup(func() { rootTCPMultiPortServerAlpha.Close() }) + rootTCPMultiPortServerBeta := newTCPServer(t, func(c net.Conn) { + c.Write([]byte(p.rootTCPMultiPortMessageBeta)) + c.Close() + }) + t.Cleanup(func() { rootTCPMultiPortServerBeta.Close() }) + // HTTP server in leaf cluster. leafServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, p.leafMessage) @@ -197,6 +222,19 @@ func SetupWithOptions(t *testing.T, opts AppTestOptions) *Pack { c.Close() }) t.Cleanup(func() { leafTCPServer.Close() }) + + // Two TCP servers for the multi-port TCP application in the leaf cluster. + leafTCPMultiPortServerAlpha := newTCPServer(t, func(c net.Conn) { + c.Write([]byte(p.leafTCPMultiPortMessageAlpha)) + c.Close() + }) + t.Cleanup(func() { leafTCPMultiPortServerAlpha.Close() }) + leafTCPMultiPortServerBeta := newTCPServer(t, func(c net.Conn) { + c.Write([]byte(p.leafTCPMultiPortMessageBeta)) + c.Close() + }) + t.Cleanup(func() { leafTCPMultiPortServerBeta.Close() }) + // JWT server writes generated JWT token in the response. jwtServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, r.Header.Get(teleport.AppJWTHeader)) @@ -243,15 +281,31 @@ func SetupWithOptions(t *testing.T, opts AppTestOptions) *Pack { })) t.Cleanup(flushServer.Close) + rootMultiPortHost, rootTCPMultiPortAppPortAlpha, err := splitHostPort(rootTCPMultiPortServerAlpha.Addr().String()) + require.NoError(t, err) + _, rootTCPMultiPortAppPortBeta, err := splitHostPort(rootTCPMultiPortServerBeta.Addr().String()) + require.NoError(t, err) + + leafMultiPortHost, leafTCPMultiPortAppPortAlpha, err := splitHostPort(leafTCPMultiPortServerAlpha.Addr().String()) + require.NoError(t, err) + _, leafTCPMultiPortAppPortBeta, err := splitHostPort(leafTCPMultiPortServerBeta.Addr().String()) + require.NoError(t, err) + p.rootAppURI = rootServer.URL p.rootWSAppURI = rootWSServer.URL p.rootWSSAppURI = rootWSSServer.URL p.rootTCPAppURI = fmt.Sprintf("tcp://%v", rootTCPServer.Addr().String()) p.rootTCPTwoWayAppURI = fmt.Sprintf("tcp://%v", rootTCPTwoWayServer.Addr().String()) + p.rootTCPMultiPortAppURI = fmt.Sprintf("tcp://%v", rootMultiPortHost) + p.rootTCPMultiPortAppPortAlpha = rootTCPMultiPortAppPortAlpha + p.rootTCPMultiPortAppPortBeta = rootTCPMultiPortAppPortBeta p.leafAppURI = leafServer.URL p.leafWSAppURI = leafWSServer.URL p.leafWSSAppURI = leafWSSServer.URL p.leafTCPAppURI = fmt.Sprintf("tcp://%v", leafTCPServer.Addr().String()) + p.leafTCPMultiPortAppURI = fmt.Sprintf("tcp://%v", leafMultiPortHost) + p.leafTCPMultiPortAppPortAlpha = leafTCPMultiPortAppPortAlpha + p.leafTCPMultiPortAppPortBeta = leafTCPMultiPortAppPortBeta p.jwtAppURI = jwtServer.URL p.headerAppURI = headerServer.URL p.wsHeaderAppURI = wsHeaderServer.URL @@ -402,3 +456,25 @@ func newTCPServer(t *testing.T, handleConn func(net.Conn)) net.Listener { return listener } + +// uuidWithLabel returns a random UUID with a specific label in front of it. +// It's mostly used to generate unique messages that various cluster app servers are going to +// respond with. The labels make it easier to differentiate between apps when a connection gets +// routed to the wrong app. +func uuidWithLabel(label string) string { + return fmt.Sprintf("%s-%s", label, uuid.New().String()) +} + +func splitHostPort(hostport string) (string, int, error) { + host, portString, err := net.SplitHostPort(hostport) + if err != nil { + return "", 0, trace.Wrap(err) + } + + port, err := strconv.ParseUint(portString, 10, 16) + if err != nil { + return "", 0, trace.Wrap(err) + } + + return host, int(port), nil +} diff --git a/integration/appaccess/pack.go b/integration/appaccess/pack.go index 2e3b75b48473c..609a60adca036 100644 --- a/integration/appaccess/pack.go +++ b/integration/appaccess/pack.go @@ -106,6 +106,14 @@ type Pack struct { rootTCPTwoWayMessage string rootTCPTwoWayAppURI string + rootTCPMultiPortAppName string + rootTCPMultiPortPublicAddr string + rootTCPMultiPortMessageAlpha string + rootTCPMultiPortMessageBeta string + rootTCPMultiPortAppURI string + rootTCPMultiPortAppPortAlpha int + rootTCPMultiPortAppPortBeta int + jwtAppName string jwtAppPublicAddr string jwtAppClusterName string @@ -137,6 +145,14 @@ type Pack struct { leafTCPMessage string leafTCPAppURI string + leafTCPMultiPortAppName string + leafTCPMultiPortPublicAddr string + leafTCPMultiPortMessageAlpha string + leafTCPMultiPortMessageBeta string + leafTCPMultiPortAppURI string + leafTCPMultiPortAppPortAlpha int + leafTCPMultiPortAppPortBeta int + headerAppName string headerAppPublicAddr string headerAppClusterName string @@ -350,26 +366,43 @@ func (p *Pack) CreateAppSessionCookies(t *testing.T, publicAddr, clusterName str // cluster and returns the client cert that can be used for an application // request. func (p *Pack) CreateAppSessionWithClientCert(t *testing.T) []tls.Certificate { - session := p.CreateAppSession(t, p.username, p.rootAppClusterName, p.rootAppPublicAddr) - config := p.makeTLSConfig(t, session.GetName(), session.GetUser(), p.rootAppPublicAddr, p.rootAppClusterName, "") + session := p.CreateAppSession(t, CreateAppSessionParams{ + Username: p.username, + ClusterName: p.rootAppClusterName, + AppPublicAddr: p.rootAppPublicAddr, + }) + config := p.makeTLSConfig(t, tlsConfigParams{ + sessionID: session.GetName(), + username: session.GetUser(), + publicAddr: p.rootAppPublicAddr, + clusterName: p.rootAppClusterName, + }) return config.Certificates } -func (p *Pack) CreateAppSession(t *testing.T, username, clusterName, appPublicAddr string) types.WebSession { +type CreateAppSessionParams struct { + Username string + ClusterName string + AppPublicAddr string + AppTargetPort int +} + +func (p *Pack) CreateAppSession(t *testing.T, params CreateAppSessionParams) types.WebSession { ctx := context.Background() - userState, err := p.rootCluster.Process.GetAuthServer().GetUserOrLoginState(ctx, username) + userState, err := p.rootCluster.Process.GetAuthServer().GetUserOrLoginState(ctx, params.Username) require.NoError(t, err) accessInfo := services.AccessInfoFromUserState(userState) ws, err := p.rootCluster.Process.GetAuthServer().CreateAppSessionFromReq(ctx, auth.NewAppSessionRequest{ NewWebSessionRequest: auth.NewWebSessionRequest{ - User: username, + User: params.Username, Roles: accessInfo.Roles, Traits: accessInfo.Traits, SessionTTL: time.Hour, }, - PublicAddr: appPublicAddr, - ClusterName: clusterName, + PublicAddr: params.AppPublicAddr, + ClusterName: params.ClusterName, + AppTargetPort: params.AppTargetPort, }) require.NoError(t, err) @@ -471,8 +504,17 @@ func (p *Pack) startLocalProxy(t *testing.T, tlsConfig *tls.Config) string { return proxy.GetAddr() } +type tlsConfigParams struct { + sessionID string + username string + publicAddr string + clusterName string + pinnedIP string + targetPort int +} + // makeTLSConfig returns TLS config suitable for making an app access request. -func (p *Pack) makeTLSConfig(t *testing.T, sessionID, username, publicAddr, clusterName, pinnedIP string) *tls.Config { +func (p *Pack) makeTLSConfig(t *testing.T, params tlsConfigParams) *tls.Config { key, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) privateKeyPEM, err := keys.MarshalPrivateKey(key) @@ -483,19 +525,20 @@ func (p *Pack) makeTLSConfig(t *testing.T, sessionID, username, publicAddr, clus // Make sure the session ID can be seen in the backend before we continue onward. require.Eventually(t, func() bool { _, err := p.rootCluster.Process.GetAuthServer().GetAppSession(context.Background(), types.GetAppSessionRequest{ - SessionID: sessionID, + SessionID: params.sessionID, }) return err == nil }, 5*time.Second, 100*time.Millisecond) certificate, err := p.rootCluster.Process.GetAuthServer().GenerateUserAppTestCert( auth.AppTestCertRequest{ PublicKey: publicKeyPEM, - Username: username, + Username: params.username, TTL: time.Hour, - PublicAddr: publicAddr, - ClusterName: clusterName, - SessionID: sessionID, - PinnedIP: pinnedIP, + PublicAddr: params.publicAddr, + TargetPort: params.targetPort, + ClusterName: params.clusterName, + SessionID: params.sessionID, + PinnedIP: params.pinnedIP, }) require.NoError(t, err) @@ -709,6 +752,19 @@ func (p *Pack) startRootAppServers(t *testing.T, count int, opts AppTestOptions) URI: p.rootTCPTwoWayAppURI, PublicAddr: p.rootTCPTwoWayPublicAddr, }, + { + Name: p.rootTCPMultiPortAppName, + URI: p.rootTCPMultiPortAppURI, + PublicAddr: p.rootTCPMultiPortPublicAddr, + TCPPorts: []servicecfg.PortRange{ + servicecfg.PortRange{ + Port: p.rootTCPMultiPortAppPortAlpha, + }, + servicecfg.PortRange{ + Port: p.rootTCPMultiPortAppPortBeta, + }, + }, + }, { Name: p.jwtAppName, URI: p.jwtAppURI, @@ -862,6 +918,19 @@ func (p *Pack) startLeafAppServers(t *testing.T, count int, opts AppTestOptions) URI: p.leafTCPAppURI, PublicAddr: p.leafTCPPublicAddr, }, + { + Name: p.leafTCPMultiPortAppName, + URI: p.leafTCPMultiPortAppURI, + PublicAddr: p.leafTCPMultiPortPublicAddr, + TCPPorts: []servicecfg.PortRange{ + servicecfg.PortRange{ + Port: p.leafTCPMultiPortAppPortAlpha, + }, + servicecfg.PortRange{ + Port: p.leafTCPMultiPortAppPortBeta, + }, + }, + }, { Name: "dumper-leaf", URI: p.dumperAppURI, diff --git a/integration/db/db_integration_test.go b/integration/db/db_integration_test.go index ec68c78c0ed96..bac905afdb65a 100644 --- a/integration/db/db_integration_test.go +++ b/integration/db/db_integration_test.go @@ -44,6 +44,7 @@ import ( "github.com/gravitational/teleport/lib/srv/db" "github.com/gravitational/teleport/lib/srv/db/cassandra" "github.com/gravitational/teleport/lib/srv/db/common" + dbconnect "github.com/gravitational/teleport/lib/srv/db/common/connect" "github.com/gravitational/teleport/lib/srv/db/mongodb" "github.com/gravitational/teleport/lib/srv/db/mysql" "github.com/gravitational/teleport/lib/srv/db/postgres" @@ -607,7 +608,7 @@ func TestDatabaseAccessPostgresSeparateListenerTLSDisabled(t *testing.T) { func init() { // Override database agents shuffle behavior to ensure they're always // tried in the same order during tests. Used for HA tests. - db.SetShuffleFunc(db.ShuffleSort) + db.SetShuffleFunc(dbconnect.ShuffleSort) } // testHARootCluster verifies that proxy falls back to a healthy diff --git a/integration/hsm/hsm_test.go b/integration/hsm/hsm_test.go index 1d6d03f567389..d2aec7359f44c 100644 --- a/integration/hsm/hsm_test.go +++ b/integration/hsm/hsm_test.go @@ -198,6 +198,7 @@ func testAdminClient(t *testing.T, authDataDir string, authAddr string) { // Tests multiple CA rotations and rollbacks with 2 HSM auth servers in an HA configuration func TestHSMDualAuthRotation(t *testing.T) { + t.Setenv("TELEPORT_UNSTABLE_SKIP_VERSION_UPGRADE_CHECK", "1") ctx, cancel := context.WithCancel(context.Background()) t.Cleanup(cancel) log := utils.NewLoggerForTests() @@ -379,6 +380,7 @@ func TestHSMDualAuthRotation(t *testing.T) { // Tests a dual-auth server migration from raw keys to HSM keys func TestHSMMigrate(t *testing.T) { + t.Setenv("TELEPORT_UNSTABLE_SKIP_VERSION_UPGRADE_CHECK", "1") ctx, cancel := context.WithCancel(context.Background()) t.Cleanup(cancel) log := utils.NewLoggerForTests() diff --git a/integration/instance_test.go b/integration/instance_test.go index 857349c8fa462..1e76e26012c41 100644 --- a/integration/instance_test.go +++ b/integration/instance_test.go @@ -82,6 +82,7 @@ func basicDirCopy(src string, dst string) error { // generated by an older teleport version that permitted token mix-and-match. func TestInstanceCertReissue(t *testing.T) { t.Setenv("_insecuredevmode_no_parallel", "1") // panic if the test is or will become parallel + t.Setenv("TELEPORT_UNSTABLE_SKIP_VERSION_UPGRADE_CHECK", "1") lib.SetInsecureDevMode(true) defer lib.SetInsecureDevMode(false) diff --git a/integration/integration_test.go b/integration/integration_test.go index f49dfb06f5e0c..b00e47d7fa404 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -2625,6 +2625,7 @@ func testTwoClustersProxy(t *testing.T, suite *integrationTestSuite) { // TestHA tests scenario when auth server for the cluster goes down // and we switch to local persistent caches func testHA(t *testing.T, suite *integrationTestSuite) { + t.Setenv("TELEPORT_UNSTABLE_SKIP_VERSION_UPGRADE_CHECK", "1") ctx := context.Background() tr := utils.NewTracer(utils.ThisFunction()).Start() defer tr.Stop() diff --git a/integration/utmp_integration_test.go b/integration/utmp_integration_test.go index 6d00c0c91dad2..12cabe63a279e 100644 --- a/integration/utmp_integration_test.go +++ b/integration/utmp_integration_test.go @@ -118,10 +118,10 @@ func TestRootUTMPEntryExists(t *testing.T) { require.NoError(t, err) require.EventuallyWithTf(t, func(collect *assert.CollectT) { - require.NoError(collect, uacc.UserWithPtyInDatabase(s.utmpPath, teleportTestUser)) - require.NoError(collect, uacc.UserWithPtyInDatabase(s.wtmpPath, teleportTestUser)) + assert.NoError(collect, uacc.UserWithPtyInDatabase(s.utmpPath, teleportTestUser)) + assert.NoError(collect, uacc.UserWithPtyInDatabase(s.wtmpPath, teleportTestUser)) // Ensure than an entry was not written to btmp. - require.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.btmpPath, teleportTestUser)), "unexpected error: %v", err) + assert.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.btmpPath, teleportTestUser)), "unexpected error: %v", err) }, 5*time.Minute, time.Second, "did not detect utmp entry within 5 minutes") }) @@ -154,10 +154,10 @@ func TestRootUTMPEntryExists(t *testing.T) { require.NoError(t, err) require.EventuallyWithT(t, func(collect *assert.CollectT) { - require.NoError(collect, uacc.UserWithPtyInDatabase(s.btmpPath, teleportFakeUser)) + assert.NoError(collect, uacc.UserWithPtyInDatabase(s.btmpPath, teleportFakeUser)) // Ensure that entries were not written to utmp and wtmp - require.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.utmpPath, teleportFakeUser)), "unexpected error: %v", err) - require.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.wtmpPath, teleportFakeUser)), "unexpected error: %v", err) + assert.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.utmpPath, teleportFakeUser)), "unexpected error: %v", err) + assert.True(collect, trace.IsNotFound(uacc.UserWithPtyInDatabase(s.wtmpPath, teleportFakeUser)), "unexpected error: %v", err) }, 5*time.Minute, time.Second, "did not detect btmp entry within 5 minutes") }) diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index cc7bc1e7ded82..fe793f8d2028e 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -1,9 +1,9 @@ module github.com/gravitational/teleport/integrations/event-handler -go 1.23.3 +go 1.23.4 require ( - github.com/alecthomas/kong v1.3.0 + github.com/alecthomas/kong v1.5.0 github.com/google/uuid v1.6.0 github.com/gravitational/teleport v0.0.0-00010101000000-000000000000 github.com/gravitational/teleport/api v0.0.0 @@ -14,23 +14,23 @@ require ( github.com/pelletier/go-toml v1.9.5 github.com/peterbourgon/diskv/v3 v3.0.1 github.com/sethvargo/go-limiter v1.0.0 - github.com/stretchr/testify v1.9.0 - golang.org/x/net v0.30.0 - golang.org/x/time v0.7.0 - google.golang.org/protobuf v1.35.1 + github.com/stretchr/testify v1.10.0 + golang.org/x/net v0.31.0 + golang.org/x/time v0.8.0 + google.golang.org/protobuf v1.35.2 ) require ( - cloud.google.com/go v0.115.1 // indirect - cloud.google.com/go/auth v0.9.4 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect - cloud.google.com/go/compute v1.28.1 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.10.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect + cloud.google.com/go/compute v1.28.3 // indirect cloud.google.com/go/compute/metadata v0.5.2 // indirect - cloud.google.com/go/container v1.40.0 // indirect - cloud.google.com/go/iam v1.2.1 // indirect - cloud.google.com/go/kms v1.20.0 // indirect - cloud.google.com/go/longrunning v0.6.1 // indirect - cloud.google.com/go/resourcemanager v1.10.1 // indirect + cloud.google.com/go/container v1.41.0 // indirect + cloud.google.com/go/iam v1.2.2 // indirect + cloud.google.com/go/kms v1.20.1 // indirect + cloud.google.com/go/longrunning v0.6.2 // indirect + cloud.google.com/go/resourcemanager v1.10.2 // indirect connectrpc.com/connect v1.17.0 // indirect dario.cat/mergo v1.0.1 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect @@ -56,45 +56,44 @@ require ( github.com/Masterminds/semver/v3 v3.3.0 // indirect github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect - github.com/Microsoft/hcsshim v0.11.5 // indirect github.com/ThalesIgnite/crypto11 v1.2.5 // indirect github.com/alecthomas/kingpin/v2 v2.4.0 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-radix v1.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go v1.55.5 // indirect - github.com/aws/aws-sdk-go-v2 v1.32.3 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect - github.com/aws/aws-sdk-go-v2/config v1.28.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.42 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect + github.com/aws/aws-sdk-go-v2/config v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 // indirect - github.com/aws/aws-sdk-go-v2/service/athena v1.48.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ecs v1.49.0 // indirect - github.com/aws/aws-sdk-go-v2/service/eks v1.51.1 // indirect - github.com/aws/aws-sdk-go-v2/service/glue v1.101.0 // indirect - github.com/aws/aws-sdk-go-v2/service/iam v1.37.3 // indirect - github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 // indirect - github.com/aws/aws-sdk-go-v2/service/kms v1.37.3 // indirect - github.com/aws/aws-sdk-go-v2/service/organizations v1.34.3 // indirect - github.com/aws/aws-sdk-go-v2/service/rds v1.89.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssm v1.55.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect - github.com/aws/smithy-go v1.22.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/service/athena v1.49.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ec2 v1.195.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ecs v1.52.1 // indirect + github.com/aws/aws-sdk-go-v2/service/eks v1.53.0 // indirect + github.com/aws/aws-sdk-go-v2/service/glue v1.103.0 // indirect + github.com/aws/aws-sdk-go-v2/service/iam v1.38.2 // indirect + github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 // indirect + github.com/aws/aws-sdk-go-v2/service/kms v1.37.7 // indirect + github.com/aws/aws-sdk-go-v2/service/organizations v1.36.0 // indirect + github.com/aws/aws-sdk-go-v2/service/rds v1.92.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssm v1.56.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/beevik/etree v1.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect @@ -104,16 +103,17 @@ require ( github.com/chai2010/gettext-go v1.0.2 // indirect github.com/chzyer/readline v1.5.1 // indirect github.com/cloudflare/cfssl v1.6.4 // indirect - github.com/containerd/containerd v1.7.18 // indirect - github.com/containerd/errdefs v0.1.0 // indirect + github.com/containerd/containerd v1.7.23 // indirect + github.com/containerd/errdefs v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect github.com/coreos/go-oidc v2.2.1+incompatible // indirect github.com/coreos/go-oidc/v3 v3.11.0 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf // indirect github.com/crewjam/httperr v0.2.0 // indirect github.com/crewjam/saml v0.4.14 // indirect - github.com/cyphar/filepath-securejoin v0.3.1 // indirect + github.com/cyphar/filepath-securejoin v0.3.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/di-wu/parser v0.3.0 // indirect github.com/di-wu/xsd-datetime v1.0.0 // indirect @@ -172,7 +172,7 @@ require ( github.com/google/safetext v0.0.0-20240104143208-7a7d9b3d812f // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.13.0 // indirect + github.com/googleapis/gax-go/v2 v2.14.0 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/gosuri/uitable v0.0.4 // indirect @@ -181,7 +181,7 @@ require ( github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -230,7 +230,7 @@ require ( github.com/okta/okta-sdk-golang/v2 v2.20.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627 // indirect + github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect @@ -242,7 +242,7 @@ require ( github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rubenv/sql-migrate v1.7.0 // indirect github.com/russellhaering/gosaml2 v0.9.1 // indirect github.com/russellhaering/goxmldsig v1.4.0 // indirect @@ -254,13 +254,13 @@ require ( github.com/spf13/cast v1.7.0 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spiffe/go-spiffe/v2 v2.3.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.4.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/thales-e-security/pool v0.0.2 // indirect github.com/vulcand/predicate v1.2.0 // indirect github.com/weppos/publicsuffix-go v0.30.3-0.20240510084413-5f1d03393b3d // indirect github.com/x448/float16 v0.8.4 // indirect - github.com/xanzy/go-gitlab v0.112.0 // indirect + github.com/xanzy/go-gitlab v0.114.0 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect @@ -271,37 +271,37 @@ require ( github.com/zmap/zlint/v3 v3.6.0 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect - go.opentelemetry.io/otel v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/metric v1.30.0 // indirect - go.opentelemetry.io/otel/sdk v1.30.0 // indirect - go.opentelemetry.io/otel/trace v1.30.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.4.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect - google.golang.org/api v0.197.0 // indirect - google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/grpc v1.66.3 // indirect + golang.org/x/crypto v0.29.0 // indirect + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.26.0 // indirect + golang.org/x/text v0.20.0 // indirect + google.golang.org/api v0.207.0 // indirect + google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/grpc v1.68.0 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - helm.sh/helm/v3 v3.16.2 // indirect + helm.sh/helm/v3 v3.16.3 // indirect k8s.io/api v0.31.1 // indirect k8s.io/apiextensions-apiserver v0.31.1 // indirect k8s.io/apimachinery v0.31.1 // indirect @@ -315,7 +315,7 @@ require ( k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 // indirect mvdan.cc/sh/v3 v3.7.0 // indirect oras.land/oras-go v1.2.5 // indirect - sigs.k8s.io/controller-runtime v0.19.1 // indirect + sigs.k8s.io/controller-runtime v0.19.3 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize/api v0.17.2 // indirect sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum index c4e6782cb069a..a1c4a0e0ba948 100644 --- a/integrations/event-handler/go.sum +++ b/integrations/event-handler/go.sum @@ -36,8 +36,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY 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.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= -cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -99,10 +99,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.9.4 h1:DxF7imbEbiFu9+zdKC6cKBko1e8XeJnipNqIbWZ+kDI= -cloud.google.com/go/auth v0.9.4/go.mod h1:SHia8n6//Ya940F1rLimhJCjjx7KE17t0ctFEci3HkA= -cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +cloud.google.com/go/auth v0.10.2 h1:oKF7rgBfSHdp/kuhXtqU/tNDr0mZqhYbEh+6SiqzkKo= +cloud.google.com/go/auth v0.10.2/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= +cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= @@ -178,8 +178,8 @@ cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63 cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o= -cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk= +cloud.google.com/go/compute v1.28.3 h1:+b9s7mbJYe7yQ0qA9o6GS7Tb1Ubygnv6jCLxM0JnbQA= +cloud.google.com/go/compute v1.28.3/go.mod h1:HFlsDurE5DpQZClAGf/cYh+gxssMhBxBovZDYkEn/Og= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= @@ -194,8 +194,8 @@ cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3 cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.40.0 h1:JVoEg/4RvoGW37r2Eja/cTBc3X9c2loGWYq7QDsRDuI= -cloud.google.com/go/container v1.40.0/go.mod h1:wNI1mOUivm+ZkpHMbouutgbD4sQxyphMwK31X5cThY4= +cloud.google.com/go/container v1.41.0 h1:f20+lv3PBeQKgAL7X3VeuDzvF2iYao2AVBTsuTpPk68= +cloud.google.com/go/container v1.41.0/go.mod h1:YL6lDgCUi3frIWNIFU9qrmF7/6K1EYrtspmFTyyqJ+k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= @@ -321,8 +321,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU= -cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g= +cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= +cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= @@ -342,8 +342,8 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4 cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.20.0 h1:uKUvjGqbBlI96xGE669hcVnEMw1Px/Mvfa62dhM5UrY= -cloud.google.com/go/kms v1.20.0/go.mod h1:/dMbFF1tLLFnQV44AoI2GlotbjowyUfgVwezxW291fM= +cloud.google.com/go/kms v1.20.1 h1:og29Wv59uf2FVaZlesaiDAqHFzHaoUyHI3HYp9VUHVg= +cloud.google.com/go/kms v1.20.1/go.mod h1:LywpNiVCvzYNJWS9JUcGJSVTNSwPwi0vBAotzDqn2nc= 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= @@ -357,8 +357,8 @@ cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeN 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.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc= -cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= 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/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= @@ -468,8 +468,8 @@ cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7L cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.10.1 h1:fO/QoSJ1lepmTM9dCbSXYWgTIhecmQkpY0mM1X9OGN0= -cloud.google.com/go/resourcemanager v1.10.1/go.mod h1:A/ANV/Sv7y7fcjd4LSH7PJGTZcWRkO/69yN5UhYUmvE= +cloud.google.com/go/resourcemanager v1.10.2 h1:LpqZZGM0uJiu1YWM878AA8zZ/qOQ/Ngno60Q8RAraAI= +cloud.google.com/go/resourcemanager v1.10.2/go.mod h1:5f+4zTM/ZOTDm6MmPOp6BQAhR0fi8qFPnvVGSoWszcc= cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= @@ -692,8 +692,8 @@ github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8 github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= -github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ= +github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= @@ -706,8 +706,8 @@ github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3 github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= -github.com/alecthomas/kong v1.3.0 h1:YJKuU6/TV2XOBtymafSeuzDvLAFR8cYMZiXVNLhAO6g= -github.com/alecthomas/kong v1.3.0/go.mod h1:IDc8HyiouDdpdiEiY81iaEJM8rSIW6LzX8On4FCO0bE= +github.com/alecthomas/kong v1.5.0 h1:pvJ7ucmgyBrGcdHVYD3xc9rqbcnVNRQ63mYv6KNrwYs= +github.com/alecthomas/kong v1.5.0/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -727,70 +727,70 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk= -github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA= -github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw= -github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 h1:ihPPdcCVSN0IvBByXwqVp28/l4VosBZ6sDulcvU2J7w= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35/go.mod h1:JkgEhs3SVF51Dj3m1Bj+yL8IznpxzkwlA3jLg3x7Kls= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 h1:iLdpkYZ4cXIQMO7ud+cqMWR1xK5ESbt1rvN77tRi1BY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43/go.mod h1:OgbsKPAswXDd5kxnR4vZov69p3oYjbvUyIRBAAV0y9o= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw= -github.com/aws/aws-sdk-go-v2/service/athena v1.48.1 h1:qj1vutJplyyjoKOpU3OujWckGY93VCv7Lxuypwi7/S4= -github.com/aws/aws-sdk-go-v2/service/athena v1.48.1/go.mod h1:Zzq05nJPTEENpFUYW5CRs4cpH9eeX3lOi70444jPzsA= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0 h1:cA4hWo269CN5RY7Arqt8BfzXF0KIN8DSNo/KcqHKkWk= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0/go.mod h1:ossaD9Z1ugYb6sq9QIqQLEOorCGcqUoxlhud9M9yE70= -github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.3 h1:53xnOuDLuRYfj26/wdOx749UrmYWpSHmJdWNKdTHFVg= -github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.3/go.mod h1:9HgSjQIDhQgZ1JCyZuX4/mri5hXi4Ez4WD6BT3x3cwg= -github.com/aws/aws-sdk-go-v2/service/ecs v1.49.0 h1:xhCV6zY5ZFzfyAUOiBXK6wh0HVQTBkvNwA/eiz89ZWY= -github.com/aws/aws-sdk-go-v2/service/ecs v1.49.0/go.mod h1:RXYd/Ts+sFnjDrVdAZsAfHVkYxQUxhC+l2zrSpSgCGc= -github.com/aws/aws-sdk-go-v2/service/eks v1.51.1 h1:OQjVHkANBbwE055NK49M/kelQbapsQOsSfUUWP1mi3w= -github.com/aws/aws-sdk-go-v2/service/eks v1.51.1/go.mod h1:9wMtzHTjYbK5MLzYBWSznUPsys/n9LapMwb6UhKOVPQ= -github.com/aws/aws-sdk-go-v2/service/glue v1.101.0 h1:UiKyNrUwlM2FfHk1D8TefZIPVf4ubM3Qr3vmdNKfxtE= -github.com/aws/aws-sdk-go-v2/service/glue v1.101.0/go.mod h1:TjtkCUyO8rZfxl0K6c3BF2L0K+ZbhiM7gClYk4wXyJ0= -github.com/aws/aws-sdk-go-v2/service/iam v1.37.3 h1:uuoXyOwX2ReYgHJW0W84cKDUrvQNQA2l9KhkXUgT+R4= -github.com/aws/aws-sdk-go-v2/service/iam v1.37.3/go.mod h1:RCrjvkN/ZpVAzW3ZmIlyflv7MUM45YlWx3v+6MaVX2w= -github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.3 h1:w9j4dHPGA+cDPtyoJcTZv/MOy3amQBsopzWgbqaAsYc= -github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.3/go.mod h1:tTHlog0zrTTBLQBI91uDoYT90C0AcHu6wEw7AiQFe6s= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY= -github.com/aws/aws-sdk-go-v2/service/kms v1.37.3 h1:VpyBA6KP6JgzwokQps8ArQPGy9rFej8adwuuQGcduH8= -github.com/aws/aws-sdk-go-v2/service/kms v1.37.3/go.mod h1:TT/9V4PcmSPpd8LPUNJ8hBHJmpqcfhx6MrbWTkvyR+4= -github.com/aws/aws-sdk-go-v2/service/organizations v1.34.3 h1:Er5y2CAfS0ddI6+/7bq7mk/dQjhvqt6B5i24K5PnHRQ= -github.com/aws/aws-sdk-go-v2/service/organizations v1.34.3/go.mod h1:hrfV1T+dtQ8AGlImCftiCAYZCTvn2hNVEcA9gPXui8E= -github.com/aws/aws-sdk-go-v2/service/rds v1.89.0 h1:4x0WbBa+i/AS0AFlj7yvx3n+GuK3XR58J6t61pW6h8U= -github.com/aws/aws-sdk-go-v2/service/rds v1.89.0/go.mod h1:WB+SVZKu1IBpsy3GrpR2EBnqB6A05Bd0r4RDLRqMbdk= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE= -github.com/aws/aws-sdk-go-v2/service/ssm v1.55.3 h1:nbFGlCxyyFe2cgg8WNQQtzDRVczO4+1dL4hd3TDU6MM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.55.3/go.mod h1:nzUlOBAMlQx9zKwtI10FOzJa2phU6bmFbXhD6LLbr/A= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI= -github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.3 h1:DZqGS0tUMx2DEn6qfeQjUWrvqA1/PSVtHk1v/j0A7bw= -github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.3/go.mod h1:f+sNnIMGVUxVuuXMj3aNJklzymKxBlJEXhJDCY+TUwc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE= -github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= -github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 h1:r67ps7oHCYnflpgDy2LZU0MAQtQbYIOqNNnqGO6xQkE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25/go.mod h1:GrGY+Q4fIokYLtjCVB/aFfCVL6hhGUFl8inD18fDalE= +github.com/aws/aws-sdk-go-v2/service/athena v1.49.0 h1:D+iatX9gV6gCuNd6BnUkfwfZJw/cXlEk+LwwDdSMdtw= +github.com/aws/aws-sdk-go-v2/service/athena v1.49.0/go.mod h1:27ljwDsnZvfrZKsLzWD4WFjI4OZutEFIjvVtYfj9gHc= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.195.0 h1:F3pFi50sK30DZ4IkkNpHwTLGeal5c3nlKuvTgv7xec4= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.195.0/go.mod h1:00zqVNJFK6UASrTnuvjJHJuaqUdkVz5tW8Ip+VhzuNg= +github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.7 h1:n221X4mwD08KKGlfpcsD0WxIsCuVOH32RUDOHniC8/U= +github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.7/go.mod h1:bkT6gKfhFH//cV+66Ut8tqWR2apIcZvsU4no8luLx3w= +github.com/aws/aws-sdk-go-v2/service/ecs v1.52.1 h1:85SGI/Db9I8PT2rvDLIRGxXdSzuyC4ZKDJwfzuv7WqQ= +github.com/aws/aws-sdk-go-v2/service/ecs v1.52.1/go.mod h1:Ghi1OWUv4+VMEULWiHsKH2gNA3KAcMoLWsvU0eRXvIA= +github.com/aws/aws-sdk-go-v2/service/eks v1.53.0 h1:ACTxnLwL6YNmuYbxtp/VR3HGL9SWXU6VZkXPjWST9ZQ= +github.com/aws/aws-sdk-go-v2/service/eks v1.53.0/go.mod h1:ZzOjZXGGUQxOq+T3xmfPLKCZe4OaB5vm1LdGaC8IPn4= +github.com/aws/aws-sdk-go-v2/service/glue v1.103.0 h1:aWkaWcO6AWKOZgnm45es3lL+jZ9tece2kfQ2Na4xoQs= +github.com/aws/aws-sdk-go-v2/service/glue v1.103.0/go.mod h1:ajiRue7mZ0vQjVHQkQG2KBaPHW8lL5GtvmjRTHWDaqk= +github.com/aws/aws-sdk-go-v2/service/iam v1.38.2 h1:8iFKuRj/FJipy/aDZ2lbq0DYuEHdrxp0qVsdi+ZEwnE= +github.com/aws/aws-sdk-go-v2/service/iam v1.38.2/go.mod h1:UBe4z0VZnbXGp6xaCW1ulE9pndjfpsnrU206rWZcR0Y= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.7 h1:y0SG6t2s4xrOwjulhbGQ72ovA2MSlrb2UyAz+pA6n8g= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.7/go.mod h1:cJpIii79T0fjc0awSqvU/1kltAjp8MCmMpkhbOUUiik= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 h1:HCpPsWqmYQieU7SS6E9HXfdAMSud0pteVXieJmcpIRI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6/go.mod h1:ngUiVRCco++u+soRRVBIvBZxSMMvOVMXA4PJ36JLfSw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 h1:BbGDtTi0T1DYlmjBiCr/le3wzhA37O8QTC5/Ab8+EXk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6/go.mod h1:hLMJt7Q8ePgViKupeymbqI0la+t9/iYFBjxQCFwuAwI= +github.com/aws/aws-sdk-go-v2/service/kms v1.37.7 h1:dZmNIRtPUvtvUIIDVNpvtnJQ8N8Iqm7SQAxf18htZYw= +github.com/aws/aws-sdk-go-v2/service/kms v1.37.7/go.mod h1:vj8PlfJH9mnGeIzd6uMLPi5VgiqzGG7AZoe1kf1uTXM= +github.com/aws/aws-sdk-go-v2/service/organizations v1.36.0 h1:CVHfN8ZVvWzDkAf/Qj+GO53dD5NWVyK16O8pYg/wp3k= +github.com/aws/aws-sdk-go-v2/service/organizations v1.36.0/go.mod h1:SVY+doFrL3KTvVMWzFLKvD7KYQ6GQfwNRPSQS7eA3cA= +github.com/aws/aws-sdk-go-v2/service/rds v1.92.0 h1:W0gUYAjO24u/M6tpR041wMHJWGzleOhxtCnNLImdrZs= +github.com/aws/aws-sdk-go-v2/service/rds v1.92.0/go.mod h1:ADD2uROOoEIXjbjDPEvDDZWnGmfKFYMddgKwG5RlBGw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 h1:nyuzXooUNJexRT0Oy0UQY6AhOzxPxhtt4DcBIHyCnmw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0/go.mod h1:sT/iQz8JK3u/5gZkT+Hmr7GzVZehUMkRZpOaAwYXeGY= +github.com/aws/aws-sdk-go-v2/service/ssm v1.56.1 h1:cfVjoEwOMOJOI6VoRQua0nI0KjZV9EAnR8bKaMeSppE= +github.com/aws/aws-sdk-go-v2/service/ssm v1.56.1/go.mod h1:fGHwAnTdNrLKhgl+UEeq9uEL4n3Ng4MJucA+7Xi3sC4= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.7 h1:X+5QChV4btPAoTpQ/GAcEJ1tCrpO6Y8X4C5CG11WNWI= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.7/go.mod h1:LYMBcQuhPc6czFaQpYC9JAcEcMf1DNVie4YHg6iC240= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/beevik/etree v1.4.1 h1:PmQJDDYahBGNKDcpdX8uPy1xRCwoCGVUiW669MEirVI= github.com/beevik/etree v1.4.1/go.mod h1:gPNJNaBGVZ9AwsidazFZyygnd+0pAU38N4D+WemwKNs= @@ -855,14 +855,16 @@ github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= -github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/containerd v1.7.23 h1:H2CClyUkmpKAGlhQp95g2WXHfLYc7whAuvZGBNYOOwQ= +github.com/containerd/containerd v1.7.23/go.mod h1:7QUzfURqZWCZV7RLNEn1XjUCQLEf0bkaK4GjUaZehxw= github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= -github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= -github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4= +github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= @@ -877,8 +879,8 @@ github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= github.com/crewjam/saml v0.4.14 h1:g9FBNx62osKusnFzs3QTN5L9CVA/Egfgm+stJShzw/c= github.com/crewjam/saml v0.4.14/go.mod h1:UVSZCf18jJkk6GpWNVqcyQJMD5HsRugBPf4I1nl2mME= -github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= -github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= +github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8= +github.com/cyphar/filepath-securejoin v0.3.4/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -1173,8 +1175,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE 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/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= +github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= 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/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -1223,8 +1225,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= 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.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -1369,6 +1371,8 @@ github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1400,8 +1404,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8 github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= -github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627 h1:pSCLCl6joCFRnjpeojzOpEYs4q7Vditq8fySFG5ap3Y= -github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible h1:IWzUvJ72xMjmrjR9q3H1PF+jwdN0uNQiR2t1BLNalyo= +github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 h1:2nosf3P75OZv2/ZO/9Px5ZgZ5gbKrzA3joN1QMfOGMQ= github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0/go.mod h1:lAVhWwbNaveeJmxrxuSTxMgKpF6DjnuVpn6T8WiBwYQ= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= @@ -1465,8 +1469,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/quic-go/quic-go v0.48.1 h1:y/8xmfWI9qmGTc+lBr4jKRUWLGSlSigv847ULJ4hYXA= -github.com/quic-go/quic-go v0.48.1/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= 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.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= @@ -1476,8 +1480,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI= github.com/rubenv/sql-migrate v1.7.0/go.mod h1:S4wtDEG1CKn+0ShpTtzWhFpHHI5PvCUtiGI+C+Z2THE= github.com/russellhaering/gosaml2 v0.9.1 h1:H/whrl8NuSoxyW46Ww5lKPskm+5K+qYLw9afqJ/Zef0= @@ -1489,8 +1493,8 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/schollz/progressbar/v3 v3.17.0 h1:Fv+vG6O6jnJwdjCelvfyYO7sF2jaUGQVmdH4CxcZdsQ= -github.com/schollz/progressbar/v3 v3.17.0/go.mod h1:5H4fLgifX+KeQCsEJnZTOepgZLe1jFF1lpPXb68IJTA= +github.com/schollz/progressbar/v3 v3.17.1 h1:bI1MTaoQO+v5kzklBjYNRQLoVpe0zbyRZNK6DFkVC5U= +github.com/schollz/progressbar/v3 v3.17.1/go.mod h1:RzqpnsPQNjUyIgdglUjRLgD7sVnxN1wpmBMV+UiEbL4= github.com/scim2/filter-parser/v2 v2.2.0 h1:QGadEcsmypxg8gYChRSM2j1edLyE/2j72j+hdmI4BJM= github.com/scim2/filter-parser/v2 v2.2.0/go.mod h1:jWnkDToqX/Y0ugz0P5VvpVEUKcWcyHHj+X+je9ce5JA= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= @@ -1521,8 +1525,8 @@ github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spiffe/go-spiffe/v2 v2.3.0 h1:g2jYNb/PDMB8I7mBGL2Zuq/Ur6hUhoroxGQFyD6tTj8= -github.com/spiffe/go-spiffe/v2 v2.3.0/go.mod h1:Oxsaio7DBgSNqhAO9i/9tLClaVlfRok7zvJnTV8ZyIY= +github.com/spiffe/go-spiffe/v2 v2.4.0 h1:j/FynG7hi2azrBG5cvjRcnQ4sux/VNj8FAVc99Fl66c= +github.com/spiffe/go-spiffe/v2 v2.4.0/go.mod h1:m5qJ1hGzjxjtrkGHZupoXHo/FDWwCB1MdSyBzfHugx0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1539,8 +1543,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gtvVDbmPg= github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU= github.com/weppos/publicsuffix-go v0.13.0/go.mod h1:z3LCPQ38eedDQSwmsSRW4Y7t2L8Ln16JPQ02lHAdn5k= @@ -1549,8 +1553,8 @@ github.com/weppos/publicsuffix-go v0.30.3-0.20240510084413-5f1d03393b3d h1:q80YK github.com/weppos/publicsuffix-go v0.30.3-0.20240510084413-5f1d03393b3d/go.mod h1:vLdXKydr/OJssAXmjY0XBgLXUfivBMrNRIBljgtqCnw= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xanzy/go-gitlab v0.112.0 h1:6Z0cqEooCvBMfBIHw+CgO4AKGRV8na/9781xOb0+DKw= -github.com/xanzy/go-gitlab v0.112.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= +github.com/xanzy/go-gitlab v0.114.0 h1:0wQr/KBckwrZPfEMjRqpUz0HmsKKON9UhCYv9KDy19M= +github.com/xanzy/go-gitlab v0.114.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= @@ -1609,29 +1613,29 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= 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/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= @@ -1662,8 +1666,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= 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= @@ -1679,8 +1683,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 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-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= 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= @@ -1723,8 +1727,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1789,8 +1793,8 @@ golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1820,8 +1824,8 @@ 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.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1838,8 +1842,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1932,8 +1936,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1950,8 +1954,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= 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= @@ -1972,16 +1976,16 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-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.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ= -golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2045,8 +2049,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2120,8 +2124,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ= -google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw= +google.golang.org/api v0.207.0 h1:Fvt6IGCYjf7YLcQ+GCegeAI2QSQCfIWhRkmrMPj3JRM= +google.golang.org/api v0.207.0/go.mod h1:I53S168Yr/PNDNMi5yPnDc0/LGRZO6o7PoEbl/HY3CM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2261,12 +2265,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= -google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f h1:zDoHYmMzMacIdjNe+P2XiTmPsLawi/pCbSPfxt6lTfw= +google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f/go.mod h1:Q5m6g8b5KaFFzsQFIGdJkSJDGeJiybVenoYFMMa3ohI= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -2308,8 +2312,8 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.66.3 h1:TWlsh8Mv0QI/1sIbs1W36lqRclxrmF+eFJ4DbI0fuhA= -google.golang.org/grpc v1.66.3/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= @@ -2331,8 +2335,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2363,8 +2367,8 @@ gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -helm.sh/helm/v3 v3.16.2 h1:Y9v7ry+ubQmi+cb5zw1Llx8OKHU9Hk9NQ/+P+LGBe2o= -helm.sh/helm/v3 v3.16.2/go.mod h1:SyTXgKBjNqi2NPsHCW5dDAsHqvGIu0kdNYNH9gQaw70= +helm.sh/helm/v3 v3.16.3 h1:kb8bSxMeRJ+knsK/ovvlaVPfdis0X3/ZhYCSFRP+YmY= +helm.sh/helm/v3 v3.16.3/go.mod h1:zeVWGDR4JJgiRbT3AnNsjYaX8OTJlIE9zC+Q7F7iUSU= 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= @@ -2437,8 +2441,8 @@ 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/controller-runtime v0.19.1 h1:Son+Q40+Be3QWb+niBXAg2vFiYWolDjjRfO8hn/cxOk= -sigs.k8s.io/controller-runtime v0.19.1/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= +sigs.k8s.io/controller-runtime v0.19.3 h1:XO2GvC9OPftRst6xWCpTgBZO04S2cbp0Qqkj8bX1sPw= +sigs.k8s.io/controller-runtime v0.19.3/go.mod h1:j4j87DqtsThvwTv5/Tc5NFRyyF/RF0ip4+62tbTSIUM= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ= diff --git a/integrations/lib/testing/fakejoin/kubesigner.go b/integrations/lib/testing/fakejoin/kubesigner.go index 271c913d2758f..460bfff21320f 100644 --- a/integrations/lib/testing/fakejoin/kubesigner.go +++ b/integrations/lib/testing/fakejoin/kubesigner.go @@ -30,7 +30,7 @@ import ( "github.com/jonboulle/clockwork" "github.com/gravitational/teleport/lib/cryptosuites" - "github.com/gravitational/teleport/lib/kubernetestoken" + kubetoken "github.com/gravitational/teleport/lib/kube/token" ) // KubernetesSigner is a JWT signer that mimicks the Kubernetes one. The signer mock Kubernetes and @@ -87,7 +87,7 @@ func (s *KubernetesSigner) GetMarshaledJWKS() (string, error) { // This token has the Teleport cluster name in its audience as required by the Kubernetes JWKS join method. func (s *KubernetesSigner) SignServiceAccountJWT(pod, namespace, serviceAccount, clusterName string) (string, error) { now := s.clock.Now() - claims := kubernetestoken.ServiceAccountClaims{ + claims := kubetoken.ServiceAccountClaims{ Claims: jwt.Claims{ Subject: fmt.Sprintf("system:serviceaccount:%s:%s", namespace, serviceAccount), Audience: jwt.Audience{clusterName}, @@ -97,13 +97,13 @@ func (s *KubernetesSigner) SignServiceAccountJWT(pod, namespace, serviceAccount, // The Kubernetes JWKS join method rejects tokens valid more than 30 minutes. Expiry: jwt.NewNumericDate(now.Add(29 * time.Minute)), }, - Kubernetes: &kubernetestoken.KubernetesSubClaim{ + Kubernetes: &kubetoken.KubernetesSubClaim{ Namespace: namespace, - ServiceAccount: &kubernetestoken.ServiceAccountSubClaim{ + ServiceAccount: &kubetoken.ServiceAccountSubClaim{ Name: serviceAccount, UID: uuid.New().String(), }, - Pod: &kubernetestoken.PodSubClaim{ + Pod: &kubetoken.PodSubClaim{ Name: pod, UID: uuid.New().String(), }, diff --git a/integrations/operator/CONTRIBUTING.md b/integrations/operator/CONTRIBUTING.md index 0f19ed607bc2d..e90050c6e719c 100644 --- a/integrations/operator/CONTRIBUTING.md +++ b/integrations/operator/CONTRIBUTING.md @@ -17,12 +17,12 @@ other .proto files used to generate the CRDs have changed). #### Generate the new CRD -1. Add the type name to the `resources` list in `crdgen/main.go`. +1. Add the type name to the `resources` list in `crdgen/handlerequest.go`. 2. Add the proto file to the `PROTOS` list in `Makefile` if it is not already present. Also add it to the `PROTOS` list in `crdgen/Makefile`. 3. Run `make manifests` to generate the CRD. 4. Run `make crdgen-test`. This will should fail if your new CRD is generated. - Update the test snapshots with `make -C crdgen update-snapshots` + Update the test snapshots with `make -C crdgen update-snapshot` #### Create a "scheme" defining Go types to match the CRD @@ -40,13 +40,16 @@ Follow the same patterns of existing reconcilers in those packages. Use the generic TeleportResourceReconciler if possible, that way you only have to implement CRUD methods for your resource. -Write unit tests for your reconciler. Use the generic `testResourceCreation`, -`testResourceDeletionDrift`, and `testResourceUpdate` helpers to get baseline +Write unit tests for your reconciler. Use the generic `ResourceCreationTest`, +`ResourceDeletionDriftTest`, and `ResourceUpdateTest` helpers to get baseline coverage. +Update the `defaultTeleportServiceConfig` teleport role in +`controllers/resources/testlib/env.go` with any new required permissions. + #### Register your reconciler and scheme -In `main.go` and `controllers/resources/testlib/env.go` instantiate your +In `controllers/resources/setup.go` instantiate your controller and register it with the controller-runtime manager. Follow the pattern of existing resources which instantiate the reconciler and call the `SetupWithManager(mgr)` method. @@ -59,11 +62,10 @@ your resource version is added to the root `scheme` with a call like Add Kubernetes RBAC permissions to allow the operator to work with the resources on the Kubernetes side. -The cluster role spec is found in `../../examples/chart/teleport-cluster/templates/auth/clusterrole.yaml`. +The cluster role spec is found in `../../examples/chart/teleport-cluster/templates/auth/config.yaml`. -Add Teleport RBAC permissions for to allow the operator to work with the -resources on the Teleport side. -These should be added to the sidecar role in `sidecar/sidecar.go`. +Update the RBAC permissions in `hack/fixture-operator-role.yaml` to update +operator the role used for debugging. ### Debugging tips diff --git a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_accesslists.yaml b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_accesslists.yaml index 802e2a4f13a11..2c595617b69d3 100644 --- a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_accesslists.yaml +++ b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_accesslists.yaml @@ -153,6 +153,10 @@ spec: description: ineligible_status describes if this owner is eligible or not and if not, describes how they're lacking eligibility. x-kubernetes-int-or-string: true + membership_kind: + description: membership_kind describes the type of membership, + either `MEMBERSHIP_KIND_USER` or `MEMBERSHIP_KIND_LIST`. + x-kubernetes-int-or-string: true name: description: name is the username of the owner. type: string diff --git a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_oidcconnectors.yaml b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_oidcconnectors.yaml index f8a3bd100d52f..29a7b8e286599 100644 --- a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_oidcconnectors.yaml +++ b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_oidcconnectors.yaml @@ -65,7 +65,7 @@ spec: type: array client_id: description: ClientID is the id of the authentication client (Teleport - Auth server). + Auth Service). type: string client_redirect_settings: description: ClientRedirectSettings defines which client redirect @@ -116,6 +116,42 @@ spec: time period, they will be forced to re-authenticate. format: duration type: string + mfa: + description: MFASettings contains settings to enable SSO MFA checks + through this auth connector. + nullable: true + properties: + acr_values: + description: AcrValues are Authentication Context Class Reference + values. The meaning of the ACR value is context-specific and + varies for identity providers. Some identity providers support + MFA specific contexts, such Okta with its "phr" (phishing-resistant) + ACR. + type: string + client_id: + description: ClientID is the OIDC OAuth app client ID. + type: string + client_secret: + description: ClientSecret is the OIDC OAuth app client secret. + type: string + enabled: + description: Enabled specified whether this OIDC connector supports + MFA checks. Defaults to false. + type: boolean + max_age: + description: MaxAge is the amount of time in nanoseconds that + an IdP session is valid for. Defaults to 0 to always force re-authentication + for MFA checks. This should only be set to a non-zero value + if the IdP is setup to perform MFA checks on top of active user + sessions. + format: duration + type: string + prompt: + description: Prompt is an optional OIDC prompt. An empty string + omits prompt. If not specified, it defaults to select_account + for backwards compatibility. + type: string + type: object prompt: description: Prompt is an optional OIDC prompt. An empty string omits prompt. If not specified, it defaults to select_account for backwards diff --git a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_provisiontokens.yaml b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_provisiontokens.yaml index 4ec3953c6e232..e42dc48675faa 100644 --- a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_provisiontokens.yaml +++ b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_provisiontokens.yaml @@ -70,8 +70,8 @@ spec: type: array aws_role: description: AWSRole is used for the EC2 join method and is - the ARN of the AWS role that the auth server will assume in - order to call the ec2 API. + the ARN of the AWS role that the Auth Service will assume + in order to call the ec2 API. type: string type: object nullable: true @@ -102,6 +102,40 @@ spec: nullable: true type: array type: object + bitbucket: + description: Bitbucket allows the configuration of options specific + to the "bitbucket" join method. + nullable: true + properties: + allow: + description: Allow is a list of Rules, nodes using this token + must match one allow rule to use this token. + items: + properties: + branch_name: + type: string + deployment_environment_uuid: + type: string + repository_uuid: + type: string + workspace_uuid: + type: string + type: object + nullable: true + type: array + audience: + description: Audience is a Bitbucket-specified audience value + for this token. It is unique to each Bitbucket repository, and + must be set to the value as written in the Pipelines -> OpenID + Connect section of the repository settings. + type: string + identity_provider_url: + description: IdentityProviderURL is a Bitbucket-specified issuer + URL for incoming OIDC tokens. It is unique to each Bitbucket + repository, and must be set to the value as written in the Pipelines + -> OpenID Connect section of the repository settings. + type: string + type: object bot_name: description: BotName is the name of the bot this token grants access to, if any @@ -192,7 +226,7 @@ spec: against host. This value should be the hostname of the GHES instance, and should not include the scheme or a path. The instance must be accessible over HTTPS at this hostname and the certificate - must be trusted by the Auth Server. + must be trusted by the Auth Service. type: string enterprise_slug: description: EnterpriseSlug allows the slug of a GitHub Enterprise @@ -204,6 +238,12 @@ spec: if `enterprise_server_host` is specified. See https://docs.github.com/en/enterprise-cloud@latest/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#customizing-the-issuer-value-for-an-enterprise for more information about customized issuer values. type: string + static_jwks: + description: StaticJWKS disables fetching of the GHES signing + keys via the JWKS/OIDC endpoints, and allows them to be directly + specified. This allows joining from GitHub Actions in GHES instances + that are not reachable by the Teleport Auth Service. + type: string type: object gitlab: description: GitLab allows the configuration of options specific to @@ -377,6 +417,14 @@ spec: is set to match the cluster name, it does not need to be set here. type: string + hostname: + description: Hostname is the hostname of the Terraform Enterprise + instance expected to issue JWTs allowed by this token. This + may be unset for regular Terraform Cloud use, in which case + it will be assumed to be `app.terraform.io`. Otherwise, it must + both match the `iss` (issuer) field included in JWTs, and provide + standard JWKS endpoints. + type: string type: object tpm: description: TPM allows the configuration of options specific to the diff --git a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_roles.yaml b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_roles.yaml index 46f8d07612cdf..5d1c5ddfb9809 100644 --- a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_roles.yaml +++ b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_roles.yaml @@ -35,6 +35,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -249,7 +260,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -298,7 +308,7 @@ spec: type: string type: array description: Annotations is a collection of annotations to - be programmatically appended to pending access requests + be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, @@ -326,12 +336,41 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. format: duration type: string + reason: + description: Reason defines settings for the reason for the + access provided by the user. + nullable: true + properties: + mode: + description: Mode can be either "required" or "optional". + Empty string is treated as "optional". If a role has + the request reason mode set to "required", then reason + is required for all Access Requests requesting roles + or resources allowed by this role. It applies only to + users who have this role assigned. + type: string + type: object roles: description: Roles is the name of roles which will match the request rule. @@ -561,6 +600,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -775,7 +825,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -824,7 +873,7 @@ spec: type: string type: array description: Annotations is a collection of annotations to - be programmatically appended to pending access requests + be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, @@ -852,12 +901,41 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. format: duration type: string + reason: + description: Reason defines settings for the reason for the + access provided by the user. + nullable: true + properties: + mode: + description: Mode can be either "required" or "optional". + Empty string is treated as "optional". If a role has + the request reason mode set to "required", then reason + is required for all Access Requests requesting roles + or resources allowed by this role. It applies only to + users who have this role assigned. + type: string + type: object roles: description: Roles is the name of roles which will match the request rule. @@ -1133,9 +1211,12 @@ spec: created on a Windows desktop type: boolean create_host_user: - description: CreateHostUser allows users to be automatically created - on a host + description: 'Deprecated: use CreateHostUserMode instead.' type: boolean + create_host_user_default_shell: + description: CreateHostUserDefaultShell is used to configure the + default shell for newly provisioned host users. + type: string create_host_user_mode: description: CreateHostUserMode allows users to be automatically created on a host when not set to off. 0 is "unspecified"; 1 @@ -1228,9 +1309,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -1268,6 +1347,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: @@ -1363,6 +1462,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -1577,7 +1687,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -1626,7 +1735,7 @@ spec: type: string type: array description: Annotations is a collection of annotations to - be programmatically appended to pending access requests + be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, @@ -1654,12 +1763,41 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. format: duration type: string + reason: + description: Reason defines settings for the reason for the + access provided by the user. + nullable: true + properties: + mode: + description: Mode can be either "required" or "optional". + Empty string is treated as "optional". If a role has + the request reason mode set to "required", then reason + is required for all Access Requests requesting roles + or resources allowed by this role. It applies only to + users who have this role assigned. + type: string + type: object roles: description: Roles is the name of roles which will match the request rule. @@ -1889,6 +2027,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -2103,7 +2252,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -2152,7 +2300,7 @@ spec: type: string type: array description: Annotations is a collection of annotations to - be programmatically appended to pending access requests + be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, @@ -2180,12 +2328,41 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. format: duration type: string + reason: + description: Reason defines settings for the reason for the + access provided by the user. + nullable: true + properties: + mode: + description: Mode can be either "required" or "optional". + Empty string is treated as "optional". If a role has + the request reason mode set to "required", then reason + is required for all Access Requests requesting roles + or resources allowed by this role. It applies only to + users who have this role assigned. + type: string + type: object roles: description: Roles is the name of roles which will match the request rule. @@ -2461,9 +2638,12 @@ spec: created on a Windows desktop type: boolean create_host_user: - description: CreateHostUser allows users to be automatically created - on a host + description: 'Deprecated: use CreateHostUserMode instead.' type: boolean + create_host_user_default_shell: + description: CreateHostUserDefaultShell is used to configure the + default shell for newly provisioned host users. + type: string create_host_user_mode: description: CreateHostUserMode allows users to be automatically created on a host when not set to off. 0 is "unspecified"; 1 @@ -2556,9 +2736,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -2596,6 +2774,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: diff --git a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_rolesv6.yaml b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_rolesv6.yaml index 6fdf1b5acfb4b..f0af70fc7cf2f 100644 --- a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_rolesv6.yaml +++ b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_rolesv6.yaml @@ -38,6 +38,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -252,7 +263,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -301,7 +311,7 @@ spec: type: string type: array description: Annotations is a collection of annotations to - be programmatically appended to pending access requests + be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, @@ -329,12 +339,41 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. format: duration type: string + reason: + description: Reason defines settings for the reason for the + access provided by the user. + nullable: true + properties: + mode: + description: Mode can be either "required" or "optional". + Empty string is treated as "optional". If a role has + the request reason mode set to "required", then reason + is required for all Access Requests requesting roles + or resources allowed by this role. It applies only to + users who have this role assigned. + type: string + type: object roles: description: Roles is the name of roles which will match the request rule. @@ -564,6 +603,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -778,7 +828,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -827,7 +876,7 @@ spec: type: string type: array description: Annotations is a collection of annotations to - be programmatically appended to pending access requests + be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, @@ -855,12 +904,41 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. format: duration type: string + reason: + description: Reason defines settings for the reason for the + access provided by the user. + nullable: true + properties: + mode: + description: Mode can be either "required" or "optional". + Empty string is treated as "optional". If a role has + the request reason mode set to "required", then reason + is required for all Access Requests requesting roles + or resources allowed by this role. It applies only to + users who have this role assigned. + type: string + type: object roles: description: Roles is the name of roles which will match the request rule. @@ -1136,9 +1214,12 @@ spec: created on a Windows desktop type: boolean create_host_user: - description: CreateHostUser allows users to be automatically created - on a host + description: 'Deprecated: use CreateHostUserMode instead.' type: boolean + create_host_user_default_shell: + description: CreateHostUserDefaultShell is used to configure the + default shell for newly provisioned host users. + type: string create_host_user_mode: description: CreateHostUserMode allows users to be automatically created on a host when not set to off. 0 is "unspecified"; 1 @@ -1231,9 +1312,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -1271,6 +1350,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: diff --git a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_rolesv7.yaml b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_rolesv7.yaml index 4cb600cf64307..88056b0b54a53 100644 --- a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_rolesv7.yaml +++ b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_rolesv7.yaml @@ -38,6 +38,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -252,7 +263,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -301,7 +311,7 @@ spec: type: string type: array description: Annotations is a collection of annotations to - be programmatically appended to pending access requests + be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, @@ -329,12 +339,41 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. format: duration type: string + reason: + description: Reason defines settings for the reason for the + access provided by the user. + nullable: true + properties: + mode: + description: Mode can be either "required" or "optional". + Empty string is treated as "optional". If a role has + the request reason mode set to "required", then reason + is required for all Access Requests requesting roles + or resources allowed by this role. It applies only to + users who have this role assigned. + type: string + type: object roles: description: Roles is the name of roles which will match the request rule. @@ -564,6 +603,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -778,7 +828,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -827,7 +876,7 @@ spec: type: string type: array description: Annotations is a collection of annotations to - be programmatically appended to pending access requests + be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, @@ -855,12 +904,41 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. format: duration type: string + reason: + description: Reason defines settings for the reason for the + access provided by the user. + nullable: true + properties: + mode: + description: Mode can be either "required" or "optional". + Empty string is treated as "optional". If a role has + the request reason mode set to "required", then reason + is required for all Access Requests requesting roles + or resources allowed by this role. It applies only to + users who have this role assigned. + type: string + type: object roles: description: Roles is the name of roles which will match the request rule. @@ -1136,9 +1214,12 @@ spec: created on a Windows desktop type: boolean create_host_user: - description: CreateHostUser allows users to be automatically created - on a host + description: 'Deprecated: use CreateHostUserMode instead.' type: boolean + create_host_user_default_shell: + description: CreateHostUserDefaultShell is used to configure the + default shell for newly provisioned host users. + type: string create_host_user_mode: description: CreateHostUserMode allows users to be automatically created on a host when not set to off. 0 is "unspecified"; 1 @@ -1231,9 +1312,7 @@ spec: generation and usage type: boolean port_forwarding: - description: PortForwarding defines if the certificate will have - "permit-port-forwarding" in the certificate. PortForwarding - is "yes" if not set, that's why this is a pointer + description: 'Deprecated: Use SSHPortForwarding instead' type: boolean record_session: description: RecordDesktopSession indicates whether desktop access @@ -1271,6 +1350,26 @@ spec: via SCP or SFTP are allowed over an SSH session. It defaults to true unless explicitly set to false. type: boolean + ssh_port_forwarding: + description: SSHPortForwarding configures what types of SSH port + forwarding are allowed by a role. + nullable: true + properties: + local: + description: Allow local port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + remote: + description: Allow remote port forwarding. + nullable: true + properties: + enabled: + type: boolean + type: object + type: object type: object type: object status: diff --git a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_samlconnectors.yaml b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_samlconnectors.yaml index 1b53a4606956f..c6814333c7831 100644 --- a/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_samlconnectors.yaml +++ b/integrations/operator/crdgen/testdata/golden/resources.teleport.dev_samlconnectors.yaml @@ -115,9 +115,52 @@ spec: description: EntityDescriptorURL is a URL that supplies a configuration XML. type: string + force_authn: + description: ForceAuthn specified whether re-authentication should + be forced on login. UNSPECIFIED is treated as NO. + x-kubernetes-int-or-string: true issuer: description: Issuer is the identity provider issuer. type: string + mfa: + description: MFASettings contains settings to enable SSO MFA checks + through this auth connector. + nullable: true + properties: + cert: + description: Cert is the identity provider certificate PEM. IDP + signs `` responses using this certificate. + type: string + enabled: + description: Enabled specified whether this SAML connector supports + MFA checks. Defaults to false. + type: boolean + entity_descriptor: + description: EntityDescriptor is XML with descriptor. It can be + used to supply configuration parameters in one XML file rather + than supplying them in the individual elements. Usually set + from EntityDescriptorUrl. + type: string + entity_descriptor_url: + description: EntityDescriptorUrl is a URL that supplies a configuration + XML. + type: string + force_authn: + description: ForceAuthn specified whether re-authentication should + be forced for MFA checks. UNSPECIFIED is treated as YES to always + re-authentication for MFA checks. This should only be set to + NO if the IdP is setup to perform MFA checks on top of active + user sessions. + x-kubernetes-int-or-string: true + issuer: + description: Issuer is the identity provider issuer. Usually set + from EntityDescriptor. + type: string + sso: + description: SSO is the URL of the identity provider's SSO service. + Usually set from EntityDescriptor. + type: string + type: object provider: description: Provider is the external identity provider. type: string diff --git a/integrations/operator/crdgen/testdata/protofiles/teleport/accesslist/v1/accesslist.proto b/integrations/operator/crdgen/testdata/protofiles/teleport/accesslist/v1/accesslist.proto index b83034160a9e7..373c325027d39 100644 --- a/integrations/operator/crdgen/testdata/protofiles/teleport/accesslist/v1/accesslist.proto +++ b/integrations/operator/crdgen/testdata/protofiles/teleport/accesslist/v1/accesslist.proto @@ -85,6 +85,10 @@ message AccessListOwner { // ineligible_status describes if this owner is eligible or not // and if not, describes how they're lacking eligibility. IneligibleStatus ineligible_status = 3; + + // membership_kind describes the type of membership, either + // `MEMBERSHIP_KIND_USER` or `MEMBERSHIP_KIND_LIST`. + MembershipKind membership_kind = 4; } // AccessListAudit describes the audit configuration for an Access List. @@ -197,6 +201,21 @@ message MemberSpec { // ineligible_status describes if this member is eligible or not // and if not, describes how they're lacking eligibility. IneligibleStatus ineligible_status = 7; + + // membership_kind describes the type of membership, either + // `MEMBERSHIP_KIND_USER` or `MEMBERSHIP_KIND_LIST`. + MembershipKind membership_kind = 9; +} + +// MembershipKind represents the different kinds of list membership +enum MembershipKind { + // MEMBERSHIP_KIND_UNSPECIFIED represents list members that are of + // unknown membership kind, defaulting to being treated as type USER + MEMBERSHIP_KIND_UNSPECIFIED = 0; + // MEMBERSHIP_KIND_USER represents list members that are normal users + MEMBERSHIP_KIND_USER = 1; + // MEMBERSHIP_KIND_LIST represents list members that are nested Access Lists + MEMBERSHIP_KIND_LIST = 2; } // IneligibleStatus describes how the user is ineligible. @@ -268,6 +287,12 @@ message ReviewChanges { // AccessListStatus contains dynamic fields calculated during retrieval. message AccessListStatus { - // member_count is the number of members in the in the Access List. + // member_count is the number of members in the Access List. optional uint32 member_count = 1; + // member_list_count is the number of nested list members in the Access List. + optional uint32 member_list_count = 2; + // owner_of describes Access Lists where this Access List is an explicit owner. + repeated string owner_of = 3; + // member_of describes Access Lists where this Access List is an explicit member. + repeated string member_of = 4; } diff --git a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/authservice.proto b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/authservice.proto index 6cb986096e777..03b6f9ac35439 100644 --- a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/authservice.proto +++ b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/authservice.proto @@ -317,15 +317,11 @@ message RouteToWindowsDesktop { // RouteToApp contains parameters for application access certificate requests. message RouteToApp { + reserved 2; // SessionID, jsontag "session_id" + reserved "SessionID"; + // Name is the application name certificate is being requested for. string Name = 1 [(gogoproto.jsontag) = "name"]; - // SessionID is the ID of the application session. - // DEPRECATED: Automatically generated by server. - // TODO (Joerger): DELETE IN v17.0.0 - string SessionID = 2 [ - (gogoproto.jsontag) = "session_id", - deprecated = true - ]; // PublicAddr is the application public address. string PublicAddr = 3 [(gogoproto.jsontag) = "public_addr"]; // ClusterName is the cluster where the application resides. @@ -457,9 +453,17 @@ message PingResponse { // LoadAllCAs signals whether or not tsh should load all CAs when trying // to ssh into a node. bool LoadAllCAs = 8 [(gogoproto.jsontag) = "load_all_cas"]; + // SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. + types.SignatureAlgorithmSuite signature_algorithm_suite = 9; reserved 6; // LicenseWarnings, jsontag "license_warnings" reserved "LicenseWarnings"; + + // LicenseExpiry is the expiry date of the enterprise license, if applicable. + google.protobuf.Timestamp LicenseExpiry = 10 [ + (gogoproto.stdtime) = true, + (gogoproto.jsontag) = "licenseExpiry" + ]; } // ProductType is the type of product. @@ -577,6 +581,8 @@ message Features { // NOTE: this flag is used to signal that Access Monitoring is *enabled* on a cluster. // *Access* to the feature is gated on the `AccessMonitoring` entitlement. bool AccessMonitoringConfigured = 36; + // CloudAnonymizationKey is a hash of the Salesforce ID used to anonymize usage events + bytes CloudAnonymizationKey = 37 [(gogoproto.jsontag) = "cloud_anonymization_key,omitempty"]; } // EntitlementInfo is the state and limits of a particular entitlement @@ -1211,6 +1217,10 @@ message MFAAuthenticateChallenge { // communications, in case of streaming RPCs. It may also return empty // challenges for all other fields. MFARequired MFARequired = 4; + // SSO Challenge is an SSO MFA challenge. If set, the client can go to the + // IdP redirect URL to perform an MFA check in the IdP and obtain an MFA token. + // This token paired with the request id can then be used as MFA verification. + SSOChallenge SSOChallenge = 5; } // MFAAuthenticateResponse is a response to MFAAuthenticateChallenge using one @@ -1220,6 +1230,7 @@ message MFAAuthenticateResponse { // Removed: U2FResponse U2F = 1; TOTPResponse TOTP = 2; webauthn.CredentialAssertionResponse Webauthn = 3; + SSOResponse SSO = 4; } } @@ -1236,6 +1247,24 @@ message TOTPResponse { string Code = 1; } +// SSOChallenge contains SSO auth request details to perform an SSO MFA check. +message SSOChallenge { + // RequestId is the ID of an SSO auth request. + string request_id = 1; + // RedirectUrl is an IdP redirect URL to initate the SSO MFA flow. + string redirect_url = 2; + // Device is the SSO device corresponding to the challenge. + types.SSOMFADevice device = 3; +} + +// SSOResponse is a response to SSOChallenge. +message SSOResponse { + // RequestId is the ID of an SSO auth request. + string request_id = 1; + // Token is a secret token used to verify the user's SSO MFA session. + string token = 2; +} + // MFARegisterChallenge is a challenge for registering a new MFA device. message MFARegisterChallenge { // Request depends on the type of the MFA device being registered. @@ -1860,9 +1889,11 @@ message CreateAuthenticateChallengeRequest { // call [AuthService.IsMFARequired] in the leaf instead of setting this field. IsMFARequiredRequest MFARequiredCheck = 5 [(gogoproto.jsontag) = "mfa_required_check,omitempty"]; // ChallengeExtensions are extensions that will be apply to the issued MFA challenge. - // ChallengeExtensions only apply to webauthn challenges currently. Required, except - // for v15 clients and older. + // Required, except for v15 clients and older. teleport.mfa.v1.ChallengeExtensions ChallengeExtensions = 6 [(gogoproto.jsontag) = "challenge_extensions,omitempty"]; + // SSOClientRedirectURL should be supplied If the client supports SSO MFA checks. + // If unset, the server will only return non-SSO challenges. + string SSOClientRedirectURL = 7 [(gogoproto.jsontag) = "sso_client_redirect_url,omitempty"]; } // CreatePrivilegeTokenRequest defines a request to obtain a privilege token. @@ -2138,6 +2169,9 @@ message UpdateSessionTrackerRequest { message PresenceMFAChallengeRequest { // SessionID is unique identifier of the session you want to request presence for. string SessionID = 1 [(gogoproto.jsontag) = "session_id,omitempty"]; + // SSOClientRedirectURL should be supplied If the client supports SSO MFA checks. + // If unset, the server will only return non-SSO challenges. + string SSOClientRedirectURL = 2 [(gogoproto.jsontag) = "sso_client_redirect_url,omitempty"]; } // PresenceMFAChallengeSend is a presence challenge request or response. @@ -2464,6 +2498,10 @@ message InventoryHeartbeat { types.ServerV2 SSHServer = 1; // AppServer is a complete app server spec to be heartbeated. types.AppServerV3 AppServer = 2; + // DatabaseServer is a complete db server spec to be heartbeated. + types.DatabaseServerV3 DatabaseServer = 3; + // KubeServer is a complete kube server spec to be heartbeated. + types.KubernetesServerV3 KubernetesServer = 4; } // UpstreamInventoryGoodbye informs the upstream service that instance @@ -2801,10 +2839,6 @@ service AuthService { // ListAccessRequests gets access requests with pagination and sorting. rpc ListAccessRequests(ListAccessRequestsRequest) returns (ListAccessRequestsResponse); - // CreateAccessRequest creates a new access request. - // Deprecated: use CreateAccessRequestV2 instead. - // DELETE IN v15.0.0. - rpc CreateAccessRequest(types.AccessRequestV3) returns (google.protobuf.Empty); // CreateAccessRequestV2 creates a new access request. rpc CreateAccessRequestV2(types.AccessRequestV3) returns (types.AccessRequestV3); // DeleteAccessRequest deletes an access request. @@ -3012,10 +3046,6 @@ service AuthService { // GetRole retrieves a role described by the given request. rpc GetRole(GetRoleRequest) returns (types.RoleV6); - // GetRole retrieves all roles. - // - // DELETE IN 17.0 - rpc GetRoles(google.protobuf.Empty) returns (GetRolesResponse); // ListRoles is a paginated role getter. rpc ListRoles(ListRolesRequest) returns (ListRolesResponse); // CreateRole creates a new role. diff --git a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/event.proto b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/event.proto index 793ed8f43fd6d..7c0cd043eb13d 100644 --- a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/event.proto +++ b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/event.proto @@ -23,14 +23,17 @@ import "teleport/clusterconfig/v1/access_graph_settings.proto"; import "teleport/crownjewel/v1/crownjewel.proto"; import "teleport/dbobject/v1/dbobject.proto"; import "teleport/discoveryconfig/v1/discoveryconfig.proto"; +import "teleport/identitycenter/v1/identitycenter.proto"; import "teleport/kubewaitingcontainer/v1/kubewaitingcontainer.proto"; import "teleport/legacy/types/types.proto"; import "teleport/machineid/v1/bot_instance.proto"; import "teleport/machineid/v1/federation.proto"; import "teleport/notifications/v1/notifications.proto"; +import "teleport/provisioning/v1/provisioning.proto"; import "teleport/secreports/v1/secreports.proto"; import "teleport/userloginstate/v1/userloginstate.proto"; import "teleport/userprovisioning/v2/statichostuser.proto"; +import "teleport/usertasks/v1/user_tasks.proto"; option go_package = "github.com/gravitational/teleport/api/client/proto"; @@ -50,8 +53,10 @@ message Event { reserved 7; reserved 49; reserved 63; + reserved 68; reserved "ExternalCloudAudit"; reserved "StaticHostUser"; + reserved "AutoUpdateAgentPlan"; // Operation identifies operation Operation Type = 1; @@ -184,5 +189,22 @@ message Event { teleport.autoupdate.v1.AutoUpdateVersion AutoUpdateVersion = 65; // StaticHostUserV2 is a resource for static host users. teleport.userprovisioning.v2.StaticHostUser StaticHostUserV2 = 66; + // UserTask is a resource for user task. + teleport.usertasks.v1.UserTask UserTask = 67; + // DynamicWindowsDesktop is a resource for dynamic Windows desktop host. + types.DynamicWindowsDesktopV1 DynamicWindowsDesktop = 69; + // ProvisioningPrincipalState is a resource for tracking the provisioning of + // users and groups into downstream systems. + teleport.provisioning.v1.PrincipalState ProvisioningPrincipalState = 70; + // AutoUpdateVersion is a resource for controlling the autoupdate agent rollout. + teleport.autoupdate.v1.AutoUpdateAgentRollout AutoUpdateAgentRollout = 71; + // IdentityCenterAccount is a resource for tracking Identity Center accounts + teleport.identitycenter.v1.Account IdentityCenterAccount = 72; + // IdentityCenterPrincipalAssignment is a resource for tracking the AWS + // Permission Sets assigned to a Teleport user or AAccess List + teleport.identitycenter.v1.PrincipalAssignment IdentityCenterPrincipalAssignment = 73; + // IdentityCenterAccountlAssignment is a resource representing a potential + // Permission Set grant on a specific AWS account. + teleport.identitycenter.v1.AccountAssignment IdentityCenterAccountAssignment = 74; } } diff --git a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/joinservice.proto b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/joinservice.proto index 68b35f06df334..4448558693d58 100644 --- a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/joinservice.proto +++ b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/joinservice.proto @@ -21,7 +21,8 @@ import "teleport/legacy/types/types.proto"; option go_package = "github.com/gravitational/teleport/api/client/proto"; -// TODO(nklaassen): Document me. +// RegisterUsingIAMMethodRequest is a request for registration via the IAM join +// method. message RegisterUsingIAMMethodRequest { // RegisterUsingTokenRequest holds registration parameters common to all // join methods. @@ -172,4 +173,7 @@ service JoinService { // RegisterUsingTPMMethod allows registration of a new agent or Bot to the // cluster using a known TPM. rpc RegisterUsingTPMMethod(stream RegisterUsingTPMMethodRequest) returns (stream RegisterUsingTPMMethodResponse); + // RegisterUsingToken is used to register a new node to the cluster using one + // of the legacy join methods which do not yet have their own gRPC method. + rpc RegisterUsingToken(types.RegisterUsingTokenRequest) returns (Certs); } diff --git a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/proxyservice.proto b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/proxyservice.proto index 0cabcc6f2c8e8..30940ef7c932e 100644 --- a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/proxyservice.proto +++ b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/client/proto/proxyservice.proto @@ -24,6 +24,9 @@ option go_package = "github.com/gravitational/teleport/api/client/proto"; service ProxyService { // DialNode opens a bidrectional stream to the requested node. rpc DialNode(stream Frame) returns (stream Frame); + + // Ping checks if the peer is reachable and responsive. + rpc Ping(ProxyServicePingRequest) returns (ProxyServicePingResponse); } // Frame wraps different message types to be sent over a stream. @@ -63,3 +66,7 @@ message Data { // ConnectionEstablished signals to the client a connection to the node has been established. message ConnectionEstablished {} + +message ProxyServicePingRequest {} + +message ProxyServicePingResponse {} diff --git a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/events/events.proto b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/events/events.proto index 8e499bdae62d3..bd61c99381b62 100644 --- a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/events/events.proto +++ b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/events/events.proto @@ -20,6 +20,7 @@ import "gogoproto/gogo.proto"; import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; +import "teleport/accesslist/v1/accesslist.proto"; import "teleport/legacy/types/types.proto"; import "teleport/legacy/types/wrappers/wrappers.proto"; @@ -280,6 +281,10 @@ message AccessListMember { // MemberName is the name of the member. string MemberName = 4 [(gogoproto.jsontag) = "member_name,omitempty"]; + + // MembershipKind describes the kind of membership, either + // `MEMBERSHIP_KIND_USER` or `MEMBERSHIP_KIND_LIST`. + teleport.accesslist.v1.MembershipKind membership_kind = 5 [(gogoproto.jsontag) = "membership_kind,omitempty"]; } // AccessListReviewMembershipRequirementsChanged contains information for when membership requirements change as part of a review. @@ -1892,6 +1897,54 @@ message SFTP { string Error = 12 [(gogoproto.jsontag) = "error,omitempty"]; } +// SFTPSummary is emitted at the end of an SFTP transfer +message SFTPSummary { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // SessionMetadata is a common event session metadata + SessionMetadata Session = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ServerMetadata is a common server metadata + ServerMetadata Server = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // FileTransferStats contains statistics about transferred files + repeated FileTransferStat FileTransferStats = 6 [(gogoproto.jsontag) = "file_transfer_stats"]; +} + +// FileTransferStat is statistics about a transferred file +message FileTransferStat { + string Path = 1 [(gogoproto.jsontag) = "path"]; + uint64 BytesRead = 2 [(gogoproto.jsontag) = "bytes_read"]; + uint64 BytesWritten = 3 [(gogoproto.jsontag) = "bytes_written"]; +} + // Subsystem is emitted when a user requests a new subsystem. message Subsystem { // Metadata is a common event metadata @@ -1920,6 +1973,13 @@ message Subsystem { // Error contains error in case of unsucessfull attempt string Error = 5 [(gogoproto.jsontag) = "exitError"]; + + // ServerMetadata is a common server metadata + ServerMetadata Server = 6 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // ClientDisconnect is emitted when client is disconnected @@ -3041,6 +3101,10 @@ message DatabaseSessionStart { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + // PostgresPID is the Postgres backend PID that was created for a Postgres + // connection. This can be useful for backend process cancellation or + // termination and it is not a sensitive or secret value. + uint32 PostgresPID = 8 [(gogoproto.jsontag) = "postgres_pid,omitempty"]; } // DatabaseSessionQuery is emitted when a user executes a database query. @@ -3460,6 +3524,9 @@ message WindowsDesktopSessionStart { // AllowUserCreation indicates whether automatic local user creation // is allowed for this session. bool AllowUserCreation = 12 [(gogoproto.jsontag) = "allow_user_creation"]; + // NLA indicates whether Teleport performed Network Level Authentication (NLA) + // when initiating this session. + bool NLA = 13 [(gogoproto.jsontag) = "nla"]; } // DatabaseSessionEnd is emitted when a user ends the database session. @@ -4397,23 +4464,30 @@ message PluginDelete { // PluginMetadata contains information about plugin resources. message PluginMetadata { + reserved 2; + reserved "plugin"; // plugin_type is the plugin type of the plugin resource. // The value matches the types.PluginV1.Spec.Type field. string plugin_type = 1 [(gogoproto.jsontag) = "plugin_type"]; - // plugin is the resource without secrets. - types.PluginV1 plugin = 2 [(gogoproto.jsontag) = "plugin,omitempty"]; - // has_credentials indicates whether the plugin has credentials. bool has_credentials = 3 [(gogoproto.jsontag) = "has_credentials"]; // reuses_credentials indicates whether the plugin reuses credentials. bool reuses_credentials = 4 [(gogoproto.jsontag) = "reuses_credentials"]; + + // plugin_data is the plugin data of the plugin resource. + google.protobuf.Struct plugin_data = 5 [ + (gogoproto.jsontag) = "plugin_data,omitempty", + (gogoproto.casttype) = "Struct" + ]; } // OneOf is a union of one of audit events submitted to the auth service message OneOf { // Event is one of the audit events + reserved 185, 186, 187; + reserved "AutoUpdateAgentPlanCreate", "AutoUpdateAgentPlanUpdate", "AutoUpdateAgentPlanDelete"; oneof Event { events.UserLogin UserLogin = 1; events.UserCreate UserCreate = 2; @@ -4592,6 +4666,16 @@ message OneOf { events.AutoUpdateVersionCreate AutoUpdateVersionCreate = 176; events.AutoUpdateVersionUpdate AutoUpdateVersionUpdate = 177; events.AutoUpdateVersionDelete AutoUpdateVersionDelete = 178; + events.StaticHostUserCreate StaticHostUserCreate = 179; + events.StaticHostUserUpdate StaticHostUserUpdate = 180; + events.StaticHostUserDelete StaticHostUserDelete = 181; + events.CrownJewelCreate CrownJewelCreate = 182; + events.CrownJewelUpdate CrownJewelUpdate = 183; + events.CrownJewelDelete CrownJewelDelete = 184; + events.UserTaskCreate UserTaskCreate = 188; + events.UserTaskUpdate UserTaskUpdate = 189; + events.UserTaskDelete UserTaskDelete = 190; + events.SFTPSummary SFTPSummary = 191; } } @@ -5582,6 +5666,10 @@ message SessionRecordingAccess { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + // SessionType is type of the session. + string SessionType = 4 [(gogoproto.jsontag) = "session_type,omitempty"]; + // Format is the format the session recording was accessed. + string Format = 5 [(gogoproto.jsontag) = "format,omitempty"]; } // KubeClusterMetadata contains common kubernetes cluster information. @@ -6603,6 +6691,12 @@ message SPIFFESVIDIssued { string SerialNumber = 8 [(gogoproto.jsontag) = "serial_number"]; // Hint is the hint of the issued SVID string Hint = 9 [(gogoproto.jsontag) = "hint"]; + // JTI is the JTI of the issued SVID. + // Only present if the SVID is a JWT. + string JTI = 10 [(gogoproto.jsontag) = "jti,omitempty"]; + // Audiences is the list of audiences in the issued SVID. + // Only present if the SVID is a JWT. + repeated string Audiences = 11 [(gogoproto.jsontag) = "audiences,omitempty"]; } // AuthPreferenceUpdate is emitted when the auth preference is updated. @@ -6894,6 +6988,13 @@ message AutoUpdateConfigCreate { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // Status indicates whether the creation was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateConfigUpdate is emitted when an auto update config is updated. @@ -6925,6 +7026,13 @@ message AutoUpdateConfigUpdate { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateConfigDelete is emitted when an auto update config is deleted. @@ -6956,6 +7064,13 @@ message AutoUpdateConfigDelete { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // Status indicates whether the deletion was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateVersionCreate is emitted when an auto update version is created. @@ -6987,6 +7102,13 @@ message AutoUpdateVersionCreate { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // Status indicates whether the creation was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateVersionUpdate is emitted when an auto update version is updated. @@ -7018,6 +7140,13 @@ message AutoUpdateVersionUpdate { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateVersionDelete is emitted when an auto update version is deleted. @@ -7049,4 +7178,391 @@ message AutoUpdateVersionDelete { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // Status indicates whether the deletion was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// StaticHostUserCreate is emitted when a static host user is created. +message StaticHostUserCreate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the creation was successful. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// StaticHostUserUpdate is emitted when a static host user is updated. +message StaticHostUserUpdate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the update was successful. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // User is a common user event metadata + UserMetadata User = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// StaticHostUserDelete is emitted when a static host user is deleted. +message StaticHostUserDelete { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the deletion was successful. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// CrownJewelCreate is emitted when a Access Graph CrownJewel is created. +message CrownJewelCreate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the update was successful. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata. + ResourceMetadata resource = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // CrownJewelQuery is the query used to track the crown jewel. + string CrownJewelQuery = 6 [(gogoproto.jsontag) = "crown_jewel_query"]; +} + +// CrownJewelUpdate is emitted when a Access Graph CrownJewel is updated. +message CrownJewelUpdate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the update was successful. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata. + ResourceMetadata resource = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // CurrentCrownJewelQuery is the current query used to track the crown jewel. + string CurrentCrownJewelQuery = 6 [(gogoproto.jsontag) = "current_crown_jewel_query"]; + + // UpdatedCrownJewelQuery is the new query used to track the crown jewel. + string UpdatedCrownJewelQuery = 7 [(gogoproto.jsontag) = "updated_crown_jewel_query"]; +} + +// CrownJewelDelete is emitted when a Access Graph CrownJewel is deleted. +message CrownJewelDelete { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the update was successful. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata. + ResourceMetadata resource = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// UserTaskCreate is emitted when a user task is created. +message UserTaskCreate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the update was successful. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // UserTaskMetadata holds information about the user task. + UserTaskMetadata UserTask = 6 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// UserTaskUpdate is emitted when a user task is updated. +message UserTaskUpdate { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the update was successful. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata. + UserMetadata User = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection. + ConnectionMetadata Connection = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // UserTaskMetadata holds information about the user task. + UserTaskMetadata UserTask = 6 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // CurrentUserTaskState is the current UserTask State. + string CurrentUserTaskState = 7 [(gogoproto.jsontag) = "current_user_task_state"]; + + // UpdatedUserTaskState is the updated UserTask State. + string UpdatedUserTaskState = 8 [(gogoproto.jsontag) = "updated_user_task_state"]; +} + +// UserTaskMetadata contains key fields for the UserTask. +message UserTaskMetadata { + // TaskType is type of the task. + string TaskType = 1 [(gogoproto.jsontag) = "user_task_type"]; + // IssueType is type of the issue task. + string IssueType = 2 [(gogoproto.jsontag) = "user_task_issue_type"]; + // Integration is type of associated integration. + string Integration = 3 [(gogoproto.jsontag) = "user_task_integration"]; +} + +// UserTaskDelete is emitted when a user task is deleted. +message UserTaskDelete { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // Status indicates whether the update was successful. + Status Status = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // User is a common user event metadata + UserMetadata User = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } diff --git a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/types.proto b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/types.proto index 771b714a8e86b..7739ecad6c7a0 100644 --- a/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/types.proto +++ b/integrations/operator/crdgen/testdata/protofiles/teleport/legacy/types/types.proto @@ -504,6 +504,8 @@ message RDS { repeated string Subnets = 5 [(gogoproto.jsontag) = "subnets,omitempty"]; // VPCID is the VPC where the RDS is running. string VPCID = 6 [(gogoproto.jsontag) = "vpc_id,omitempty"]; + // SecurityGroups is a list of attached security groups for the RDS instance. + repeated string SecurityGroups = 7 [(gogoproto.jsontag) = "security_groups,omitempty"]; } // RDSProxy contains AWS RDS Proxy specific database metadata. @@ -686,10 +688,10 @@ message InstanceSpecV1 { // Hostname is the hostname this instance most recently advertised. string Hostname = 3 [(gogoproto.jsontag) = "hostname,omitempty"]; - // AuthID is the ID of the auth server that most recently observed this instance. + // AuthID is the ID of the Auth Service that most recently observed this instance. string AuthID = 4 [(gogoproto.jsontag) = "auth_id,omitempty"]; - // LastSeen is the last time an auth server reported observing this instance. + // LastSeen is the last time an Auth Service server reported observing this instance. google.protobuf.Timestamp LastSeen = 5 [ (gogoproto.stdtime) = true, (gogoproto.nullable) = false, @@ -713,10 +715,10 @@ message InstanceSpecV1 { // InstanceControlLogEntry represents an entry in a given instance's control log. The control log of // an instance is protected by CompareAndSwap semantics, allowing entries to function as a means of -// synchronization as well as recordkeeping. For example, an auth server intending to trigger an upgrade +// synchronization as well as recordkeeping. For example, an Auth Service instance intending to trigger an upgrade // for a given instance can check its control log for 'upgrade-attempt' entries. If no such entry exists, // it can attempt to write an 'upgrade-attempt' entry of its own. If that entry successfully writes without -// hitting a CompareFailed, the auth server knows that no other auth servers will make concurrent upgrade +// hitting a CompareFailed, the Auth Service instance knows that no other Auth Service instances will make concurrent upgrade // attempts while that entry persists. // // NOTE: Due to resource size and backend throughput limitations, care should be taken to minimize the @@ -783,7 +785,7 @@ message InstanceFilter { string NewerThanVersion = 7; } -// ServerV2 represents a Node, App, Database, Proxy or Auth server in a Teleport cluster. +// ServerV2 represents a Node, App, Database, Proxy or Auth Service instance in a Teleport cluster. message ServerV2 { option (gogoproto.goproto_stringer) = false; option (gogoproto.stringer) = false; @@ -945,6 +947,42 @@ message AppV3 { ]; } +// CORSPolicy defines the CORS policy for AppSpecV3 +message CORSPolicy { + // allowed_origins specifies which origins are allowed to access the app. + repeated string allowed_origins = 1 [(gogoproto.jsontag) = "allowed_origins,omitempty"]; + // allowed_methods specifies which methods are allowed when accessing the app. + repeated string allowed_methods = 2 [(gogoproto.jsontag) = "allowed_methods,omitempty"]; + // allowed_headers specifies which headers can be used when accessing the app. + repeated string allowed_headers = 3 [(gogoproto.jsontag) = "allowed_headers,omitempty"]; + // allow_credentials indicates whether credentials are allowed. + bool allow_credentials = 4 [(gogoproto.jsontag) = "allow_credentials,omitempty"]; + // max_age indicates how long (in seconds) the results of a preflight request can be cached. + uint32 max_age = 5 [(gogoproto.jsontag) = "max_age,omitempty"]; + // exposed_headers indicates which headers are made available to scripts via the browser. + repeated string exposed_headers = 6 [(gogoproto.jsontag) = "exposed_headers,omitempty"]; +} + +// IdentityCenterPermissionSet defines a permission set that is available on an +// IdentityCenter account app +message IdentityCenterPermissionSet { + // ARN is the fully-formed ARN of the Permission Set. + string ARN = 1 [(gogoproto.jsontag) = "arn,omitempty"]; + + // Name is the human-readable name of the Permission Set. + string Name = 2 [(gogoproto.jsontag) = "name,omitempty"]; +} + +// AppIdentityCenter encapsulates information about an AWS Identity Center +// account application. +message AppIdentityCenter { + // Account ID is the AWS-assigned ID of the account + string AccountID = 1 [(gogoproto.jsontag) = "account_id,omitempty"]; + + // PermissionSets lists the available permission sets on the given account + repeated IdentityCenterPermissionSet PermissionSets = 2 [(gogoproto.jsontag) = "permission_sets,omitempty"]; +} + // AppSpecV3 is the AppV3 resource spec. message AppSpecV3 { // URI is the web app endpoint. @@ -970,6 +1008,14 @@ message AppSpecV3 { // Only applicable to AWS App Access. // If present, the Application must use the Integration's credentials instead of ambient credentials to access Cloud APIs. string Integration = 9 [(gogoproto.jsontag) = "integration,omitempty"]; + // RequiredAppNames is a list of app names that are required for this app to function. Any app listed here will + // be part of the authentication redirect flow and authenticate along side this app. + repeated string RequiredAppNames = 10 [(gogoproto.jsontag) = "required_app_names,omitempty"]; + // CORSPolicy defines the Cross-Origin Resource Sharing settings for the app. + CORSPolicy CORS = 11 [(gogoproto.jsontag) = "cors,omitempty"]; + // IdentityCenter encasulates AWS identity-center specific information. Only + // valid for Identity Center account apps. + AppIdentityCenter IdentityCenter = 12 [(gogoproto.jsontag) = "identity_center,omitempty"]; } // AppServerOrSAMLIdPServiceProviderV1 holds either an AppServerV3 or a SAMLIdPServiceProviderV1 resource (never both). @@ -1230,7 +1276,7 @@ message TokenRule { // node is allowed to join from. repeated string AWSRegions = 2 [(gogoproto.jsontag) = "aws_regions,omitempty"]; // AWSRole is used for the EC2 join method and is the ARN of the AWS - // role that the auth server will assume in order to call the ec2 API. + // role that the Auth Service will assume in order to call the ec2 API. string AWSRole = 3 [(gogoproto.jsontag) = "aws_role,omitempty"]; // AWSARN is used for the IAM join method, the AWS identity of joining nodes // must match this ARN. Supports wildcards "*" and "?". @@ -1298,6 +1344,8 @@ message ProvisionTokenSpecV2 { ProvisionTokenSpecV2TPM TPM = 15 [(gogoproto.jsontag) = "tpm,omitempty"]; // TerraformCloud allows the configuration of options specific to the "terraform_cloud" join method. ProvisionTokenSpecV2TerraformCloud TerraformCloud = 16 [(gogoproto.jsontag) = "terraform_cloud,omitempty"]; + // Bitbucket allows the configuration of options specific to the "bitbucket" join method. + ProvisionTokenSpecV2Bitbucket Bitbucket = 17 [(gogoproto.jsontag) = "bitbucket,omitempty"]; } // ProvisionTokenSpecV2TPM contains the TPM-specific part of the @@ -1375,7 +1423,7 @@ message ProvisionTokenSpecV2GitHub { // // This value should be the hostname of the GHES instance, and should not // include the scheme or a path. The instance must be accessible over HTTPS - // at this hostname and the certificate must be trusted by the Auth Server. + // at this hostname and the certificate must be trusted by the Auth Service. string EnterpriseServerHost = 2 [(gogoproto.jsontag) = "enterprise_server_host,omitempty"]; // EnterpriseSlug allows the slug of a GitHub Enterprise organisation to be // included in the expected issuer of the OIDC tokens. This is for @@ -1388,6 +1436,11 @@ message ProvisionTokenSpecV2GitHub { // See https://docs.github.com/en/enterprise-cloud@latest/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect#customizing-the-issuer-value-for-an-enterprise // for more information about customized issuer values. string EnterpriseSlug = 3 [(gogoproto.jsontag) = "enterprise_slug,omitempty"]; + // StaticJWKS disables fetching of the GHES signing keys via the JWKS/OIDC + // endpoints, and allows them to be directly specified. This allows joining + // from GitHub Actions in GHES instances that are not reachable by the + // Teleport Auth Service. + string StaticJWKS = 4 [(gogoproto.jsontag) = "static_jwks,omitempty"]; } // ProvisionTokenSpecV2GitLab contains the GitLab-specific part of the @@ -1398,14 +1451,14 @@ message ProvisionTokenSpecV2GitLab { // `project_path:mygroup/my-project:ref_type:branch:ref:main` // project_path:GROUP/PROJECT:ref_type:TYPE:ref:BRANCH_NAME // - // This field supports simple "glob-style" matching: + // This field supports "glob-style" matching: // - Use '*' to match zero or more characters. // - Use '?' to match any single character. string Sub = 1 [(gogoproto.jsontag) = "sub,omitempty"]; // Ref allows access to be limited to jobs triggered by a specific git ref. // Ensure this is used in combination with ref_type. // - // This field supports simple "glob-style" matching: + // This field supports "glob-style" matching: // - Use '*' to match zero or more characters. // - Use '?' to match any single character. string Ref = 2 [(gogoproto.jsontag) = "ref,omitempty"]; @@ -1418,7 +1471,7 @@ message ProvisionTokenSpecV2GitLab { // Example: // `mygroup` // - // This field supports simple "glob-style" matching: + // This field supports "glob-style" matching: // - Use '*' to match zero or more characters. // - Use '?' to match any single character. string NamespacePath = 4 [(gogoproto.jsontag) = "namespace_path,omitempty"]; @@ -1426,7 +1479,7 @@ message ProvisionTokenSpecV2GitLab { // project. Example: // `mygroup/myproject` // - // This field supports simple "glob-style" matching: + // This field supports "glob-style" matching: // - Use '*' to match zero or more characters. // - Use '?' to match any single character. string ProjectPath = 5 [(gogoproto.jsontag) = "project_path,omitempty"]; @@ -1629,6 +1682,56 @@ message ProvisionTokenSpecV2TerraformCloud { // Terraform Cloud, this value should be `foo`. If the variable is set to // match the cluster name, it does not need to be set here. string Audience = 2 [(gogoproto.jsontag) = "audience,omitempty"]; + + // Hostname is the hostname of the Terraform Enterprise instance expected to + // issue JWTs allowed by this token. This may be unset for regular Terraform + // Cloud use, in which case it will be assumed to be `app.terraform.io`. + // Otherwise, it must both match the `iss` (issuer) field included in JWTs, + // and provide standard JWKS endpoints. + string Hostname = 3 [(gogoproto.jsontag) = "hostname,omitempty"]; +} + +message ProvisionTokenSpecV2Bitbucket { + // Rule is a set of properties the Bitbucket-issued token might have to be + // allowed to use this ProvisionToken. + message Rule { + // WorkspaceUUID is the UUID of the workspace for which this token was + // issued. Bitbucket UUIDs must begin and end with braces, e.g. `{...}`. + // This value may be found in the Pipelines -> OpenID Connect section of the + // repository settings. + string WorkspaceUUID = 1 [(gogoproto.jsontag) = "workspace_uuid,omitempty"]; + + // RepositoryUUID is the UUID of the repository for which this token was + // issued. Bitbucket UUIDs must begin and end with braces, e.g. `{...}`. + // This value may be found in the Pipelines -> OpenID Connect section of the + // repository settings. + string RepositoryUUID = 2 [(gogoproto.jsontag) = "repository_uuid,omitempty"]; + + // DeploymentEnvironmentUUID is the UUID of the deployment environment + // targeted by this pipelines run, if any. These values may be found in the + // "Pipelines -> OpenID Connect -> Deployment environments" section of the + // repository settings. + string DeploymentEnvironmentUUID = 3 [(gogoproto.jsontag) = "deployment_environment_uuid,omitempty"]; + + // BranchName is the name of the branch on which this pipeline executed. + string BranchName = 4 [(gogoproto.jsontag) = "branch_name,omitempty"]; + } + + // Allow is a list of Rules, nodes using this token must match one + // allow rule to use this token. + repeated Rule Allow = 1 [(gogoproto.jsontag) = "allow,omitempty"]; + + // Audience is a Bitbucket-specified audience value for this token. It is + // unique to each Bitbucket repository, and must be set to the value as + // written in the Pipelines -> OpenID Connect section of the repository + // settings. + string Audience = 2 [(gogoproto.jsontag) = "audience,omitempty"]; + + // IdentityProviderURL is a Bitbucket-specified issuer URL for incoming OIDC + // tokens. It is unique to each Bitbucket repository, and must be set to the + // value as written in the Pipelines -> OpenID Connect section of the + // repository settings. + string IdentityProviderURL = 3 [(gogoproto.jsontag) = "identity_provider_url,omitempty"]; } // StaticTokensV2 implements the StaticTokens interface. @@ -1694,7 +1797,7 @@ message ClusterNameSpecV2 { string ClusterName = 1 [(gogoproto.jsontag) = "cluster_name"]; // ClusterID is the unique cluster ID that is set once during the first - // auth server startup. + // Auth Service startup. string ClusterID = 2 [(gogoproto.jsontag) = "cluster_id"]; } @@ -1969,7 +2072,7 @@ message AuthPreferenceSpecV2 { // Type is the type of authentication. string Type = 1 [(gogoproto.jsontag) = "type"]; - // SecondFactor is the type of second factor. + // SecondFactor is the type of mult-factor. string SecondFactor = 2 [ (gogoproto.jsontag) = "second_factor,omitempty", (gogoproto.casttype) = "github.com/gravitational/teleport/api/constants.SecondFactorType" @@ -2058,29 +2161,40 @@ message AuthPreferenceSpecV2 { // Requires Teleport Enterprise. OktaOptions Okta = 17 [(gogoproto.jsontag) = "okta,omitempty"]; - // TODO(Joerger): DELETE IN 17.0.0 - // Deprecated, replaced by HardwareKey settings. - string PIVSlot = 18 [ - (gogoproto.jsontag) = "piv_slot,omitempty", - deprecated = true - ]; + reserved 18; // PIVSlot replaced by HardwareKey + reserved "PIVSlot"; // HardwareKey are the settings for hardware key support. HardwareKey HardwareKey = 19 [(gogoproto.jsontag) = "hardware_key,omitempty"]; // SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. - // The current default value is "legacy". This field is not yet fully supported. + // If unspecified, the current default value is "legacy". + // 1 is "legacy", 2 is "balanced-v1", 3 is "fips-v1", 4 is "hsm-v1". SignatureAlgorithmSuite signature_algorithm_suite = 20; + + // SecondFactors is a list of supported second factor types. + repeated SecondFactorType SecondFactors = 21 [(gogoproto.jsontag) = "second_factors,omitempty"]; +} + +// SecondFactorType is a type of second factor. +enum SecondFactorType { + SECOND_FACTOR_TYPE_UNSPECIFIED = 0; + // SECOND_FACTOR_TYPE_OTP is OTP second factor. + SECOND_FACTOR_TYPE_OTP = 1; + // SECOND_FACTOR_TYPE_WEBAUTHN is WebAuthn second factor. + SECOND_FACTOR_TYPE_WEBAUTHN = 2; + // SECOND_FACTOR_TYPE_SSO is SSO second factor. + SECOND_FACTOR_TYPE_SSO = 3; } // U2F defines settings for U2F device. // Deprecated: U2F is transparently converted to WebAuthn by Teleport. Prefer // using WebAuthn instead. message U2F { - // AppID returns the application ID for universal second factor. + // AppID returns the application ID for universal mult-factor. string AppID = 1 [(gogoproto.jsontag) = "app_id,omitempty"]; - // Facets returns the facets for universal second factor. + // Facets returns the facets for universal mult-factor. // Deprecated: Kept for backwards compatibility reasons, but Facets have no // effect since Teleport v10, when Webauthn replaced the U2F implementation. repeated string Facets = 2 [(gogoproto.jsontag) = "facets,omitempty"]; @@ -2099,7 +2213,7 @@ message Webauthn { // IMPORTANT: RPID must never change in the lifetime of the cluster, because // it's recorded in the registration data on the WebAuthn device. If the // RPID changes, all existing WebAuthn key registrations will become invalid - // and all users who use WebAuthn as the second factor will need to + // and all users who use WebAuthn as the multi-factor will need to // re-register. string RPID = 1 [(gogoproto.jsontag) = "rp_id,omitempty"]; // Allow list of device attestation CAs in PEM format. @@ -2292,7 +2406,7 @@ message UserTokenSecretsSpecV3 { ]; } -// AccessRequest represents an access request resource specification +// AccessRequest represents an Access Request resource specification message AccessRequestV3 { option (gogoproto.goproto_stringer) = false; option (gogoproto.stringer) = false; @@ -2332,7 +2446,7 @@ message AccessReviewThreshold { } // PromotedAccessList is a minimal access list representation used for -// promoting access requests to access lists. +// promoting Access Requests to access lists. message PromotedAccessList { // Name is the name of the access list. string Name = 1 [(gogoproto.jsontag) = "name"]; @@ -2340,7 +2454,7 @@ message PromotedAccessList { string Title = 2 [(gogoproto.jsontag) = "title"]; } -// AccessReview is a review to be applied to an access request. +// AccessReview is a review to be applied to an Access Request. message AccessReview { // Author is the teleport username of the review author. string Author = 1 [(gogoproto.jsontag) = "author"]; @@ -2437,7 +2551,7 @@ message AccessRequestSpecV3 { string User = 1 [(gogoproto.jsontag) = "user"]; // Roles is the name of the roles being requested. repeated string Roles = 2 [(gogoproto.jsontag) = "roles"]; - // State is the current state of this access request. + // State is the current state of this Access Request. RequestState State = 3 [(gogoproto.jsontag) = "state,omitempty"]; // Created encodes the time at which the request was registered with the auth // server. @@ -2472,10 +2586,10 @@ message AccessRequestSpecV3 { ]; // SystemAnnotations is a set of programmatically generated annotations attached - // to pending access requests by teleport. These annotations are generated by + // to pending Access Requests by teleport. These annotations are generated by // applying variable interpolation to the RoleConditions.Request.Annotations block // of a user's role(s). These annotations serve as a mechanism for administrators - // to pass extra information to plugins when they process pending access requests. + // to pass extra information to plugins when they process pending Access Requests. wrappers.LabelValues SystemAnnotations = 9 [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "system_annotations,omitempty", @@ -2518,12 +2632,12 @@ message AccessRequestSpecV3 { (gogoproto.nullable) = false ]; - // LoginHint is used as a hint for search-based access requests to select + // LoginHint is used as a hint for search-based Access Requests to select // roles based on the login the user is attempting. string LoginHint = 15 [(gogoproto.jsontag) = "login_hint,omitempty"]; // DryRun indicates that the request should not actually be created, the - // auth server should only validate the access request. + // Auth Service should only validate the Access Request. bool DryRun = 16 [(gogoproto.jsontag) = "dry_run,omitempty"]; // MaxDuration indicates how long the access should be granted for. @@ -2570,7 +2684,7 @@ enum AccessRequestScope { REVIEWED = 3; } -// AccessRequestFilter encodes filter params for access requests. +// AccessRequestFilter encodes filter params for Access Requests. message AccessRequestFilter { // ID specifies a request ID if set. string ID = 1 [(gogoproto.jsontag) = "id,omitempty"]; @@ -2586,7 +2700,7 @@ message AccessRequestFilter { repeated string SearchKeywords = 4 [(gogoproto.jsontag) = "search,omitempty"]; // Scope is an aditional filter to view requests based on needs review, reviewed, my requests AccessRequestScope Scope = 5 [(gogoproto.jsontag) = "scope,omitempty"]; - // Requester is the requester of the api call. This is set by the auth server + // Requester is the requester of the api call. This is set by the Auth Service // Use User for the requester of the request. string Requester = 6 [(gogoproto.jsontag) = "requester,omitempty"]; } @@ -2636,6 +2750,14 @@ message AccessCapabilitiesRequest { bool FilterRequestableRolesByResource = 6 [(gogoproto.jsontag) = "filter_requestable_roles_by_resource,omitempty"]; } +// RequestKubernetesResource is the Kubernetes resource identifier used +// in access request settings. +// Modeled after existing message KubernetesResource. +message RequestKubernetesResource { + // kind specifies the Kubernetes Resource type. + string kind = 1 [(gogoproto.jsontag) = "kind,omitempty"]; +} + // ResourceID is a unique identifier for a teleport resource. message ResourceID { // ClusterName is the name of the cluster the resource is in. @@ -2801,6 +2923,38 @@ enum CreateDatabaseUserMode { DB_USER_MODE_BEST_EFFORT_DROP = 3; } +// SSHLocalPortForwarding configures access controls for local SSH port forwarding. +message SSHLocalPortForwarding { + BoolValue Enabled = 1 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "enabled,omitempty", + (gogoproto.customtype) = "BoolOption" + ]; +} + +// SSHRemotePortForwarding configures access controls for remote SSH port forwarding. +message SSHRemotePortForwarding { + BoolValue Enabled = 1 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "enabled,omitempty", + (gogoproto.customtype) = "BoolOption" + ]; +} + +// SSHPortForwarding configures what types of SSH port forwarding are allowed by a role. +message SSHPortForwarding { + // Allow local port forwarding. + SSHLocalPortForwarding Local = 1 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "local,omitempty" + ]; + // Allow remote port forwarding. + SSHRemotePortForwarding Remote = 2 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "remote,omitempty" + ]; +} + // RoleOptions is a set of role options message RoleOptions { // ForwardAgent is SSH agent forwarding. @@ -2815,11 +2969,9 @@ message RoleOptions { (gogoproto.casttype) = "Duration" ]; - // PortForwarding defines if the certificate will have - // "permit-port-forwarding" - // in the certificate. PortForwarding is "yes" if not set, - // that's why this is a pointer + // Deprecated: Use SSHPortForwarding instead BoolValue PortForwarding = 3 [ + deprecated = true, (gogoproto.nullable) = true, (gogoproto.jsontag) = "port_forwarding,omitempty", (gogoproto.customtype) = "BoolOption" @@ -2911,7 +3063,7 @@ message RoleOptions { (gogoproto.customtype) = "BoolOption" ]; - // CreateHostUser allows users to be automatically created on a host + // Deprecated: use CreateHostUserMode instead. BoolValue CreateHostUser = 20 [ (gogoproto.nullable) = true, (gogoproto.jsontag) = "create_host_user,omitempty", @@ -2983,6 +3135,15 @@ message RoleOptions { (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; + + // CreateHostUserDefaultShell is used to configure the default shell for newly provisioned host users. + string CreateHostUserDefaultShell = 31 [(gogoproto.jsontag) = "create_host_user_default_shell,omitempty"]; + + // SSHPortForwarding configures what types of SSH port forwarding are allowed by a role. + SSHPortForwarding SSHPortForwarding = 32 [ + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "ssh_port_forwarding,omitempty" + ]; } message RecordSession { @@ -3204,6 +3365,20 @@ message RoleConditions { reserved "SAMLIdPServiceProviderLabels"; reserved 41; // removed saml_idp_service_provider_labels_expression in favor of using app_labels_expression. reserved "SAMLIdPServiceProviderLabelsExpression"; + + // AccountAssignments holds the list of account assignments affected by this + // condition. + repeated IdentityCenterAccountAssignment AccountAssignments = 42 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "account_assignments,omitempty" + ]; +} + +// IdentityCenterAccountAssignment captures an AWS Identity Center account +// assignment (acccount + permission set) pair. +message IdentityCenterAccountAssignment { + string PermissionSet = 1 [(gogoproto.jsontag) = "permission_set,omitempty"]; + string Account = 2 [(gogoproto.jsontag) = "account,omitempty"]; } // SPIFFERoleCondition sets out which SPIFFE identities this role is allowed or @@ -3262,7 +3437,6 @@ message DatabasePermission { // KubernetesResource is the Kubernetes resource identifier. message KubernetesResource { // Kind specifies the Kubernetes Resource type. - // At the moment only "pod" is supported. string Kind = 1 [(gogoproto.jsontag) = "kind,omitempty"]; // Namespace is the resource namespace. // It supports wildcards. @@ -3325,7 +3499,7 @@ message AccessRequestConditions { ]; // Annotations is a collection of annotations to be programmatically - // appended to pending access requests at the time of their creation. + // appended to pending Access Requests at the time of their creation. // These annotations serve as a mechanism to propagate extra information // to plugins. Since these annotations support variable interpolation // syntax, they also offer a mechanism for forwarding claims from an @@ -3361,6 +3535,31 @@ message AccessRequestConditions { (gogoproto.jsontag) = "max_duration,omitempty", (gogoproto.casttype) = "Duration" ]; + + // kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. + // Eg: Users can make request to either a resource kind "kube_cluster" or any of its + // subresources like "namespaces". This field can be defined such that it prevents a user + // from requesting "kube_cluster" and enforce requesting any of its subresources. + repeated RequestKubernetesResource kubernetes_resources = 8 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "kubernetes_resources,omitempty" + ]; + + // Reason defines settings for the reason for the access provided by the user. + AccessRequestConditionsReason Reason = 9 [(gogoproto.jsontag) = "reason,omitempty"]; +} + +// AccessRequestConditionsReason defines settings for the reason for the access provided by the +// user. +message AccessRequestConditionsReason { + // Mode can be either "required" or "optional". Empty string is treated as "optional". If a role + // has the request reason mode set to "required", then reason is required for all Access Requests + // requesting roles or resources allowed by this role. It applies only to users who have this + // role assigned. + string Mode = 1 [ + (gogoproto.jsontag) = "mode,omitempty", + (gogoproto.casttype) = "RequestReasonMode" + ]; } // AccessReviewConditions is a matcher for allow/deny restrictions on @@ -3386,7 +3585,7 @@ message AccessReviewConditions { repeated string PreviewAsRoles = 4 [(gogoproto.jsontag) = "preview_as_roles,omitempty"]; } -// AccessRequestAllowedPromotion describes an allowed promotion to an access list. +// AccessRequestAllowedPromotion describes an allowed promotion to an Access List. message AccessRequestAllowedPromotion { // associated access list string accessListName = 1; @@ -3492,6 +3691,9 @@ message UserStatusV2 { // perform any password-related activity since then. See RFD 0159 for // details. Do NOT use this value for authentication purposes! PasswordState password_state = 1 [(gogoproto.jsontag) = "password_state,omitempty"]; + // mfa_weakest_device reflects what the system knows about the user's weakest MFA device. + // Note that this is a "best effort" property, in that it can be UNSPECIFIED. + MFADeviceKind mfa_weakest_device = 2 [(gogoproto.jsontag) = "mfa_weakest_device,omitempty"]; } // PasswordState indicates what is known about existence of user's password. @@ -3504,6 +3706,18 @@ enum PasswordState { PASSWORD_STATE_SET = 2; } +// MFADeviceKind indicates what is known about existence of user's MFA device. +enum MFADeviceKind { + // Unable to tell whether the MFA device has been configured. + MFA_DEVICE_KIND_UNSPECIFIED = 0; + // MFA device is known to be not configured. + MFA_DEVICE_KIND_UNSET = 1; + // MFA device is known to be configured using TOTP as the weakest form of MFA. + MFA_DEVICE_KIND_TOTP = 2; + // MFA device is known to be configured using WebAuthn as the weakest form of MFA. + MFA_DEVICE_KIND_WEBAUTHN = 3; +} + // UserSpecV2 is a specification for V2 user message UserSpecV2 { // OIDCIdentities lists associated OpenID Connect identities @@ -3649,7 +3863,7 @@ message LocalAuthSecrets { repeated MFADevice MFA = 5 [(gogoproto.jsontag) = "mfa,omitempty"]; // Webauthn holds settings necessary for webauthn local auth. // May be null for legacy users or users that haven't yet used webauthn as - // their second factor. + // their multi-factor. WebauthnLocalAuth Webauthn = 6 [(gogoproto.jsontag) = "webauthn,omitempty"]; } @@ -3678,6 +3892,7 @@ message MFADevice { TOTPDevice totp = 8; U2FDevice u2f = 9; WebauthnDevice webauthn = 10; + SSOMFADevice sso = 11; } } @@ -3742,6 +3957,16 @@ message WebauthnDevice { google.protobuf.BoolValue credential_backed_up = 10; } +// SSOMFADevice contains details of an SSO MFA method. +message SSOMFADevice { + // connector_id is the ID of the SSO connector. + string connector_id = 1; + // connector_type is the type of the SSO connector. + string connector_type = 2; + // display_name is the display name of the SSO connector + string display_name = 3; +} + // WebauthnLocalAuth holds settings necessary for local webauthn use. message WebauthnLocalAuth { // UserID is the random user handle generated for the user. @@ -4454,7 +4679,7 @@ message OIDCConnectorSpecV3 { // IssuerURL is the endpoint of the provider, e.g. https://accounts.google.com. string IssuerURL = 1 [(gogoproto.jsontag) = "issuer_url"]; - // ClientID is the id of the authentication client (Teleport Auth server). + // ClientID is the id of the authentication client (Teleport Auth Service). string ClientID = 2 [(gogoproto.jsontag) = "client_id"]; // ClientSecret is used to authenticate the client. string ClientSecret = 3 [(gogoproto.jsontag) = "client_secret"]; @@ -4505,6 +4730,8 @@ message OIDCConnectorSpecV3 { // ClientRedirectSettings defines which client redirect URLs are allowed for // non-browser SSO logins other than the standard localhost ones. SSOClientRedirectSettings ClientRedirectSettings = 18 [(gogoproto.jsontag) = "client_redirect_settings,omitempty"]; + // MFASettings contains settings to enable SSO MFA checks through this auth connector. + OIDCConnectorMFASettings MFASettings = 19 [(gogoproto.jsontag) = "mfa,omitempty"]; } // MaxAge allows the max_age parameter to be nullable to preserve backwards @@ -4525,8 +4752,29 @@ message SSOClientRedirectSettings { repeated string insecure_allowed_cidr_ranges = 2; } +// OIDCConnectorMFASettings contains OIDC MFA settings. +message OIDCConnectorMFASettings { + // Enabled specified whether this OIDC connector supports MFA checks. Defaults to false. + bool enabled = 1; + // ClientID is the OIDC OAuth app client ID. + string client_id = 2; + // ClientSecret is the OIDC OAuth app client secret. + string client_secret = 3; + // AcrValues are Authentication Context Class Reference values. The meaning of the ACR + // value is context-specific and varies for identity providers. Some identity providers + // support MFA specific contexts, such Okta with its "phr" (phishing-resistant) ACR. + string acr_values = 4; + // Prompt is an optional OIDC prompt. An empty string omits prompt. + // If not specified, it defaults to select_account for backwards compatibility. + string prompt = 5; + // MaxAge is the amount of time in nanoseconds that an IdP session is valid for. Defaults to + // 0 to always force re-authentication for MFA checks. This should only be set to a non-zero + // value if the IdP is setup to perform MFA checks on top of active user sessions. + int64 max_age = 6 [(gogoproto.casttype) = "Duration"]; +} + // OIDCAuthRequest is a request to authenticate with OIDC -// provider, the state about request is managed by auth server +// provider, the state about request is managed by Auth Service message OIDCAuthRequest { // ConnectorID is ID of OIDC connector this request uses string ConnectorID = 1 [(gogoproto.jsontag) = "connector_id"]; @@ -4549,10 +4797,13 @@ message OIDCAuthRequest { string RedirectURL = 6 [(gogoproto.jsontag) = "redirect_url"]; // PublicKey is an optional public key, users want these keys to be signed by - // auth servers user CA in case of successful auth. + // the Auth Service's user CA in case of successful auth. // - // Soon to be deprecated after references are removed from teleport.e. - bytes PublicKey = 7 [(gogoproto.jsontag) = "public_key"]; + // Deprecated: prefer SshPublicKey and/or TlsPublicKey. + bytes PublicKey = 7 [ + (gogoproto.jsontag) = "public_key", + deprecated = true + ]; // CertTTL is the TTL of the certificate user wants to get int64 CertTTL = 8 [ @@ -4591,8 +4842,11 @@ message OIDCAuthRequest { // attestation_statement is an attestation statement for the given public key. // - // Soon to be deprecated after references are removed from teleport.e. - teleport.attestation.v1.AttestationStatement attestation_statement = 17 [(gogoproto.jsontag) = "attestation_statement,omitempty"]; + // Deprecated: prefer SshAttestationStatement and/or TlsAttestationStatement. + teleport.attestation.v1.AttestationStatement attestation_statement = 17 [ + (gogoproto.jsontag) = "attestation_statement,omitempty", + deprecated = true + ]; // ClientLoginIP specifies IP address of the client for login, it will be written to the user's certificates. string ClientLoginIP = 18 [(gogoproto.jsontag) = "client_login_ip,omitempty"]; @@ -4691,10 +4945,49 @@ message SAMLConnectorSpecV2 { SSOClientRedirectSettings ClientRedirectSettings = 15 [(gogoproto.jsontag) = "client_redirect_settings,omitempty"]; // SingleLogoutURL is the SAML Single log-out URL to initiate SAML SLO (single log-out). If this is not provided, SLO is disabled. string SingleLogoutURL = 16 [(gogoproto.jsontag) = "single_logout_url,omitempty"]; + // MFASettings contains settings to enable SSO MFA checks through this auth connector. + SAMLConnectorMFASettings MFASettings = 17 [(gogoproto.jsontag) = "mfa,omitempty"]; + // ForceAuthn specified whether re-authentication should be forced on login. UNSPECIFIED + // is treated as NO. + SAMLForceAuthn ForceAuthn = 18 [(gogoproto.jsontag) = "force_authn,omitempty"]; +} + +// SAMLConnectorMFASettings contains SAML MFA settings. +message SAMLConnectorMFASettings { + // Enabled specified whether this SAML connector supports MFA checks. Defaults to false. + bool enabled = 1; + // EntityDescriptor is XML with descriptor. It can be used to supply configuration + // parameters in one XML file rather than supplying them in the individual elements. + // Usually set from EntityDescriptorUrl. + string entity_descriptor = 2; + // EntityDescriptorUrl is a URL that supplies a configuration XML. + string entity_descriptor_url = 3; + // ForceAuthn specified whether re-authentication should be forced for MFA checks. UNSPECIFIED is + // treated as YES to always re-authentication for MFA checks. This should only be set to NO if the + // IdP is setup to perform MFA checks on top of active user sessions. + SAMLForceAuthn force_authn = 4; + // Issuer is the identity provider issuer. Usually set from EntityDescriptor. + string issuer = 5; + // SSO is the URL of the identity provider's SSO service. Usually set from EntityDescriptor. + string sso = 6; + // Cert is the identity provider certificate PEM. + // IDP signs `` responses using this certificate. + string cert = 7; +} + +// SAMLForceAuthn specified whether existing SAML sessions should be accepted or re-authentication +// should be forced. +enum SAMLForceAuthn { + // UNSPECIFIED is treated as the default value for the context; NO for login, YES for MFA checks. + FORCE_AUTHN_UNSPECIFIED = 0; + // YES re-authentication should be forced for existing SAML sessions.. + FORCE_AUTHN_YES = 1; + // NO re-authentication should not be forced for existing SAML sessions. + FORCE_AUTHN_NO = 2; } // SAMLAuthRequest is a request to authenticate with SAML -// provider, the state about request is managed by auth server. +// provider, the state about request is managed by the Auth Service message SAMLAuthRequest { // ID is a unique request ID. string ID = 1 [(gogoproto.jsontag) = "id"]; @@ -4712,11 +5005,14 @@ message SAMLAuthRequest { string RedirectURL = 5 [(gogoproto.jsontag) = "redirect_url"]; // PublicKey is an optional public key, users want these - // keys to be signed by auth servers user CA in case + // keys to be signed by Auth Service's user CA in case // of successful auth. // - // Soon to be deprecated after references are removed from teleport.e. - bytes PublicKey = 6 [(gogoproto.jsontag) = "public_key"]; + // Deprecated: prefer SshPublicKey and/or TlsPublicKey. + bytes PublicKey = 6 [ + (gogoproto.jsontag) = "public_key", + deprecated = true + ]; // CertTTL is the TTL of the certificate user wants to get. int64 CertTTL = 7 [ @@ -4752,7 +5048,7 @@ message SAMLAuthRequest { // attestation_statement is an attestation statement for the given public key. // - // Soon to be deprecated after references are removed from teleport.e. + // Deprecated: prefer SshAttestationStatement and/or TlsAttestationStatement. teleport.attestation.v1.AttestationStatement attestation_statement = 16 [(gogoproto.jsontag) = "attestation_statement,omitempty"]; // ClientLoginIP specifies IP address of the client for login, it will be written to the user's certificates. @@ -5235,7 +5531,7 @@ message LockTarget { string Login = 3 [(gogoproto.jsontag) = "login,omitempty"]; // Node specifies the UUID of a Teleport node. - // A matching node is also prevented from heartbeating to the auth server. + // A matching node is also prevented from heartbeating to the Auth Service. // DEPRECATED: use ServerID instead. string Node = 4 [ deprecated = true, @@ -5370,12 +5666,42 @@ message WindowsDesktopSpecV3 { Resolution ScreenSize = 5 [(gogoproto.jsontag) = "screen_size,omitempty"]; } +// DynamicWindowsDesktopV1 represents a dynamic windows host for desktop access. +message DynamicWindowsDesktopV1 { + // Header is the common resource header. + ResourceHeader Header = 1 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "", + (gogoproto.embed) = true + ]; + // Spec is the DynamicWindows host spec. + DynamicWindowsDesktopSpecV1 Spec = 2 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "spec" + ]; +} + +// DynamicWindowsDesktopSpecV1 is the dynamic windows host spec. +message DynamicWindowsDesktopSpecV1 { + // Addr is the address that this host can be reached at. + string Addr = 1 [(gogoproto.jsontag) = "addr"]; + // Domain is the ActiveDirectory domain that this host belongs to. + string Domain = 2 [(gogoproto.jsontag) = "domain"]; + // NonAD marks this desktop as a standalone host that is + // not joined to an Active Directory domain. + bool NonAD = 4 [(gogoproto.jsontag) = "non_ad"]; + // ScreenSize specifies the size of the screen to use for sessions + // on this host. In most cases this should be unspecified, in which + // case Teleport will fill the browser window. + Resolution ScreenSize = 5 [(gogoproto.jsontag) = "screen_size,omitempty"]; +} + message Resolution { uint32 Width = 1 [(gogoproto.jsontag) = "width,omitempty"]; uint32 Height = 2 [(gogoproto.jsontag) = "height,omitempty"]; } -// RegisterUsingTokenRequest is a request to register with the auth server using +// RegisterUsingTokenRequest is a request to register with the Auth Service using // an authentication token message RegisterUsingTokenRequest { // HostID is a unique host ID, usually a UUID @@ -5429,7 +5755,7 @@ message RegisterUsingTokenRequest { } // RecoveryCodes holds a user's recovery code information. Recovery codes allows users to regain -// access to their account by restoring their lost password or second factor. Once a recovery code +// access to their account by restoring their lost password or multi-factor. Once a recovery code // is successfully verified, the code is mark used (which invalidates it), and lets the user begin // the recovery flow. When a user successfully finishes the recovery flow, users will get a new set // of codes that will replace all the previous ones. @@ -6050,6 +6376,14 @@ message PluginSpecV1 { PluginEntraIDSettings entra_id = 13; // Settings for the SCIM plugin PluginSCIMSettings scim = 14; + // Settings for the Datadog Incident Management plugin + PluginDatadogAccessSettings datadog = 15; + // PluginAWSICSettings holds settings for AWSICSettings + PluginAWSICSettings aws_ic = 16; + // Settings for the Email Access Request plugin + PluginEmailSettings email = 17; + // Settings for the Microsoft Teams plugin + PluginMSTeamsSettings msteams = 18; } // generation contains a unique ID that should: @@ -6175,6 +6509,21 @@ message PluginOktaSettings { // Sync settings controls the user and access list sync settings for Okta. PluginOktaSyncSettings sync_settings = 4; + + // CredentialsInfo contains information about the Okta credentials. + PluginOktaCredentialsInfo credentials_info = 5; +} + +// PluginOktaCredentialsInfo contains information about the Okta credentials. +// This is used to determine if the plugin has configured the necessary credentials. +message PluginOktaCredentialsInfo { + option (gogoproto.equal) = true; + // HasSSMSToken is true if the plugin has configured SSMSToken. + bool has_ssm_token = 1; + // HasOauthCredentials is true if the plugin has configured OauthCredentials. + bool has_oauth_credentials = 2; + // HasSCIMToken is true if the plugin has configured SCIMToken. + bool has_scim_token = 3; } // Defines settings for syncing users and access lists from Okta. @@ -6217,6 +6566,16 @@ message PluginOktaSyncSettings { // ^app.*$ // ^.*service.*$ repeated string app_filters = 7; + + // AppName is the Okta-assigned unique name of the Okta App that Teleport uses + // as a gateway to interact with Okta for SAML login, SCIM provisioning and user + // sync. May be missing for old Okta integration installs. + string app_name = 8; + + // DisableSyncAppGroups disables syncing of app groups from Okta. + // This is useful when the app groups are not needed in Teleport. + // and integration with Okta is only used for user sync. + bool disable_sync_app_groups = 9; } // Defines a set of discord channel IDs @@ -6254,8 +6613,33 @@ message PluginEntraIDSyncSettings { // DefaultOwners are the default owners for all imported access lists. repeated string default_owners = 1; - // SSOConnectorID is the name of the Teleport SSO connector created and used by the Entra ID plugin + // SSOConnectorID is the name of the Teleport SSO connector created and used by the Entra ID plugin. string sso_connector_id = 2; + + // credentials_source specifies the source of the credentials used for authentication with Azure. + EntraIDCredentialsSource credentials_source = 3; + + // tenant_id refers to the Azure Directory that this plugin synchronizes with. + // This field is populated on a best-effort basis for legacy plugins but mandatory for plugins created after its introduction. + // For existing plugins, it is filled in using the Entra integration when utilized. + string tenant_id = 4; + + // entra_app_id refers to the Entra Application ID that supports the SSO for "sso_connector_id". + // This field is populated on a best-effort basis for legacy plugins but mandatory for plugins created after its introduction. + // For existing plugins, it is filled in using the entity descriptor url when utilized. + string entra_app_id = 5; +} + +// EntraIDCredentialsSource defines the credentials source for Entra ID. +enum EntraIDCredentialsSource { + // ENTRAID_CREDENTIALS_SOURCE_UNKNOWN is used when the credentials source is not specified. + // Due to legacy reasons, UNKNOWN is handled as OIDC. + ENTRAID_CREDENTIALS_SOURCE_UNKNOWN = 0; + // ENTRAID_CREDENTIALS_SOURCE_OIDC indicates that the plugin will authenticate with Azure/Entra ID using OIDC. + ENTRAID_CREDENTIALS_SOURCE_OIDC = 1; + // ENTRAID_CREDENTIALS_SOURCE_SYSTEM_CREDENTIALS means the plugin will rely on system-provided credentials + // for authentication with Azure Entra ID, especially for clusters with no internet access. + ENTRAID_CREDENTIALS_SOURCE_SYSTEM_CREDENTIALS = 2; } // AccessGraphSettings controls settings for syncing access graph specific data. @@ -6295,6 +6679,137 @@ message PluginSCIMSettings { string default_role = 2; } +// PluginDatadogAccessSettings defines the settings for a Datadog Incident Management plugin +message PluginDatadogAccessSettings { + option (gogoproto.equal) = true; + + // ApiEndpoint is the Datadog API endpoint. + string api_endpoint = 1; + // FallbackRecipient specifies the default recipient. + string fallback_recipient = 2; +} + +// PluginAWSICSettings holds the settings for an AWS Identity Center integration. +message PluginAWSICSettings { + option (gogoproto.equal) = true; + + // IntegrationName is the Teleport OIDC integration used to gain access to the + // AWS account + string integration_name = 1; + + // Region is the AWS region the target Identity Center instance is configured in + string region = 2; + + // InstanceARN is the arn of the Identity Center instance to manage + string arn = 3; + + // Provisioning holds settings for provisioing users and groups into AWS + AWSICProvisioningSpec provisioning_spec = 4; + + // AccessListDefaultOwners is a list of default owners for Access List created for + // user groups imported from AWS Idenity Center. + repeated string access_list_default_owners = 5; + + // SAMLIdPServiceProviderName is the name of a SAML service provider created + // for the Identity Center. + string saml_idp_service_provider_name = 6; +} + +// AWSICProvisioningSpec holds provisioning-specific Identity Center settings +message AWSICProvisioningSpec { + option (gogoproto.equal) = true; + + // BaseURL is the SCIM base URL + string base_url = 1; + + // BearerToken is used to authenticate with AWS when provisioning users and + // groups via SCIM. This is expected to be empty in serialized records, as the + // actual credential is stored separetely ain a PluginStaticCredentials + // service, and populated at runtime as necessary. + string bearer_token = 2; +} + +// PluginAWSICStatusV1 defines AWS Identity Center plugin sub-process status. +message PluginAWSICStatusV1 { + // GroupImportStatus is a status of Identity Center group and group members import. + AWSICGroupImportStatus group_import_status = 1; +} + +// AWSICGroupImportStatus defines Identity Center group and group members import status. +message AWSICGroupImportStatus { + // StatusCode is a status code of group and group members import operation. + AWSICGroupImportStatusCode status_code = 1; + // ErrorMessage contains error message for a group and group members import attempt + // that met with an error. + string error_message = 2; +} + +// AWSICGroupImportStatus defines Identity Center group and group members +// import status codes. +enum AWSICGroupImportStatusCode { + // UNSPECIFIED denotes that a status is unknown. + UNSPECIFIED = 0; + // DONE denotes that the group and group members import operation was + // completed. + DONE = 1; + // FAILED denotes that the group and group members import met with an error. + FAILED = 2; +} + +// PluginEmailSettings holds the settings for an Email Access Request plugin. +message PluginEmailSettings { + option (gogoproto.equal) = true; + + // Sender specifies the email sender. + string sender = 1; + // FallbackRecipient specifies the default recipient. + string fallback_recipient = 2; + + // Spec configures the mail service settings. + oneof spec { + // MailgunSpec configures Mailgun service settings. + MailgunSpec mailgun_spec = 3; + // SmtpSpec configures generic SMTP service settings. + SMTPSpec smtp_spec = 4; + } +} + +// MailgunSpec holds Mailgun-specific settings. +message MailgunSpec { + option (gogoproto.equal) = true; + + // Domain specifies the Mailgun sending domain. + string domain = 1; +} + +// SMTPSpec holds a generic SMTP service specific settings. +message SMTPSpec { + option (gogoproto.equal) = true; + + // Host specifies the SMTP service host name. + string host = 1; + // Port specifies the SMTP service port number. + int32 port = 2; + // StartTLSPolicy specifies the SMTP start TLS policy used to send emails over + // SMTP. + string start_tls_policy = 3; +} + +// PluginMSTeamsSettings defines the settings for a Microsoft Teams integration plugin +message PluginMSTeamsSettings { + option (gogoproto.equal) = true; + // AppId is the Microsoft application ID (uuid, for Azure bots must be underlying app id, not bot's id). + string app_id = 1; + // TenantId is the Microsoft tenant ID. + string tenant_id = 2; + // TeamsAppId is the Microsoft teams application ID. + string teams_app_id = 3; + // Region to be used by the Microsoft Graph API client. + string region = 4; + // DefaultRecipient is the default recipient to use if no access monitoring rules are specified. + string default_recipient = 5; +} + message PluginBootstrapCredentialsV1 { oneof credentials { PluginOAuth2AuthorizationCodeCredentials oauth2_authorization_code = 1; @@ -6331,6 +6846,8 @@ message PluginStatusV1 { PluginEntraIDStatusV1 entra_id = 5; // Okta holds status details for the Okta plugin PluginOktaStatusV1 okta = 7; + // AWSIC holds status details for the AWS Identity Center plugin. + PluginAWSICStatusV1 aws_ic = 8; } // last_raw_error variable stores the most recent raw error message received from an API or service. @@ -6569,6 +7086,8 @@ message PluginBearerTokenCredentials { // PluginStaticCredentialsRef is a reference to plugin static credentials by labels. message PluginStaticCredentialsRef { + option (gogoproto.equal) = true; + // Labels is the set of labels to use to match against a set of static credentials. map Labels = 1 [(gogoproto.jsontag) = "labels,omitempty"]; } @@ -6660,6 +7179,17 @@ message SAMLIdPServiceProviderSpecV1 { // The value can contain service provider specific redirect URL, static state token etc. // The value is only applied in the IdP initiated SSO flow. string RelayState = 6 [(gogoproto.jsontag) = "relay_state"]; + // LaunchURLs is used to configure custom landing URLs for service provider. It is useful in + // the following scenarios: + // 1. If a service provider does not support IdP initiated authentication, launch url can be + // configured to launch users directly into the service provider authentication endpoint. + // 2. If a service provider does support IdP initiated authentication, it can be useful if + // that service provider acts as a master authentication service provider for internal services. + // In such case, Teleport administrator can configure launch URL, that lets user pick a specific + // internal service URL from the Log In tile in the UI, which would take them to that particular + // service for authentication instead of directly launching to the master service provider. + // Each launch URL value must be an HTTPs endpoint. + repeated string LaunchURLs = 7 [(gogoproto.jsontag) = "launch_urls"]; } // SAMLAttributeMapping represents SAML service provider requested attribute @@ -6981,6 +7511,14 @@ message AWSOIDCIntegrationSpecV1 { (gogoproto.jsontag) = "issuer_s3_uri,omitempty", deprecated = true ]; + + // Audience is used to record a name of a plugin or a discover service in Teleport + // that depends on this integration. + // Audience value can be empty or configured with supported preset audience type. + // Preset audience may impose specific behavior on the integration CRUD API, + // such as preventing integration from update or deletion. Empty audience value + // should be treated as a default and backward-compatible behavior of the integration. + string audience = 3 [(gogoproto.jsontag) = "audience,omitempty"]; } // AzureOIDCIntegrationSpecV1 contains the spec properties for the Azure OIDC SubKind Integration. @@ -7382,6 +7920,12 @@ message OktaOptions { message AccessGraphSync { // AWS is a configuration for AWS Access Graph service poll service. repeated AccessGraphAWSSync AWS = 1 [(gogoproto.jsontag) = "aws,omitempty"]; + // PollInterval is the frequency at which to poll for AWS resources + google.protobuf.Duration PollInterval = 2 [ + (gogoproto.jsontag) = "poll_interval,omitempty", + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true + ]; } // AccessGraphAWSSync is a configuration for AWS Access Graph service poll service. diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 48049fce1daa8..7c255cad63724 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/integrations/terraform -go 1.23.3 +go 1.23.4 // Doc generation tooling require github.com/hashicorp/terraform-plugin-docs v0.0.0 // replaced @@ -22,22 +22,22 @@ require ( github.com/hashicorp/terraform-plugin-sdk/v2 v2.10.1 github.com/jonboulle/clockwork v0.4.0 github.com/sirupsen/logrus v1.9.3 - github.com/stretchr/testify v1.9.0 - google.golang.org/grpc v1.66.3 - google.golang.org/protobuf v1.35.1 + github.com/stretchr/testify v1.10.0 + google.golang.org/grpc v1.68.0 + google.golang.org/protobuf v1.35.2 ) require ( - cloud.google.com/go v0.115.1 // indirect - cloud.google.com/go/auth v0.9.4 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect - cloud.google.com/go/compute v1.28.1 // indirect + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.10.2 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect + cloud.google.com/go/compute v1.28.3 // indirect cloud.google.com/go/compute/metadata v0.5.2 // indirect - cloud.google.com/go/container v1.40.0 // indirect - cloud.google.com/go/iam v1.2.1 // indirect - cloud.google.com/go/kms v1.20.0 // indirect - cloud.google.com/go/longrunning v0.6.1 // indirect - cloud.google.com/go/resourcemanager v1.10.1 // indirect + cloud.google.com/go/container v1.41.0 // indirect + cloud.google.com/go/iam v1.2.2 // indirect + cloud.google.com/go/kms v1.20.1 // indirect + cloud.google.com/go/longrunning v0.6.2 // indirect + cloud.google.com/go/resourcemanager v1.10.2 // indirect connectrpc.com/connect v1.17.0 // indirect dario.cat/mergo v1.0.1 // indirect github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 // indirect @@ -65,7 +65,6 @@ require ( github.com/Masterminds/sprig/v3 v3.3.0 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect - github.com/Microsoft/hcsshim v0.11.5 // indirect github.com/ProtonMail/go-crypto v1.1.0-alpha.2 // indirect github.com/ThalesIgnite/crypto11 v1.2.5 // indirect github.com/agext/levenshtein v1.2.2 // indirect @@ -76,38 +75,38 @@ require ( github.com/armon/go-radix v1.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go v1.55.5 // indirect - github.com/aws/aws-sdk-go-v2 v1.32.3 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect - github.com/aws/aws-sdk-go-v2/config v1.28.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.42 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect - github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect + github.com/aws/aws-sdk-go-v2/config v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.47 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 // indirect - github.com/aws/aws-sdk-go-v2/service/athena v1.48.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ecs v1.49.0 // indirect - github.com/aws/aws-sdk-go-v2/service/eks v1.51.1 // indirect - github.com/aws/aws-sdk-go-v2/service/glue v1.101.0 // indirect - github.com/aws/aws-sdk-go-v2/service/iam v1.37.3 // indirect - github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 // indirect - github.com/aws/aws-sdk-go-v2/service/kms v1.37.3 // indirect - github.com/aws/aws-sdk-go-v2/service/organizations v1.34.3 // indirect - github.com/aws/aws-sdk-go-v2/service/rds v1.89.0 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 // indirect - github.com/aws/aws-sdk-go-v2/service/ssm v1.55.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.3 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect - github.com/aws/smithy-go v1.22.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 // indirect + github.com/aws/aws-sdk-go-v2/service/athena v1.49.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ec2 v1.195.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ecs v1.52.1 // indirect + github.com/aws/aws-sdk-go-v2/service/eks v1.53.0 // indirect + github.com/aws/aws-sdk-go-v2/service/glue v1.103.0 // indirect + github.com/aws/aws-sdk-go-v2/service/iam v1.38.2 // indirect + github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 // indirect + github.com/aws/aws-sdk-go-v2/service/kms v1.37.7 // indirect + github.com/aws/aws-sdk-go-v2/service/organizations v1.36.0 // indirect + github.com/aws/aws-sdk-go-v2/service/rds v1.92.0 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 // indirect + github.com/aws/aws-sdk-go-v2/service/ssm v1.56.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 // indirect + github.com/aws/smithy-go v1.22.1 // indirect github.com/beevik/etree v1.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect @@ -119,17 +118,18 @@ require ( github.com/chai2010/gettext-go v1.0.2 // indirect github.com/cloudflare/cfssl v1.6.4 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59 // indirect - github.com/containerd/containerd v1.7.18 // indirect - github.com/containerd/errdefs v0.1.0 // indirect + github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect + github.com/containerd/containerd v1.7.23 // indirect + github.com/containerd/errdefs v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect github.com/coreos/go-oidc v2.2.1+incompatible // indirect github.com/coreos/go-oidc/v3 v3.11.0 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf // indirect github.com/crewjam/httperr v0.2.0 // indirect github.com/crewjam/saml v0.4.14 // indirect - github.com/cyphar/filepath-securejoin v0.3.1 // indirect + github.com/cyphar/filepath-securejoin v0.3.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/di-wu/parser v0.3.0 // indirect github.com/di-wu/xsd-datetime v1.0.0 // indirect @@ -193,7 +193,7 @@ require ( github.com/google/safetext v0.0.0-20240104143208-7a7d9b3d812f // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect - github.com/googleapis/gax-go/v2 v2.13.0 // indirect + github.com/googleapis/gax-go/v2 v2.14.0 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/gosuri/uitable v0.0.4 // indirect @@ -202,7 +202,7 @@ require ( github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 // indirect github.com/hashicorp/cli v1.1.6 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect @@ -277,7 +277,7 @@ require ( github.com/onsi/ginkgo/v2 v2.19.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627 // indirect + github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible // indirect github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 // indirect github.com/pelletier/go-toml v1.9.5 // indirect github.com/peterbourgon/diskv v2.0.1+incompatible // indirect @@ -294,22 +294,22 @@ require ( github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.55.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect - github.com/quic-go/quic-go v0.48.1 // indirect + github.com/quic-go/quic-go v0.48.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.12.0 // indirect + github.com/rogpeppe/go-internal v1.13.1 // indirect github.com/rubenv/sql-migrate v1.7.0 // indirect github.com/russellhaering/gosaml2 v0.9.1 // indirect github.com/russellhaering/goxmldsig v1.4.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/schollz/progressbar/v3 v3.17.0 // indirect + github.com/schollz/progressbar/v3 v3.17.1 // indirect github.com/scim2/filter-parser/v2 v2.2.0 // indirect - github.com/shirou/gopsutil/v4 v4.24.10 // indirect + github.com/shirou/gopsutil/v4 v4.24.11 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sijms/go-ora/v2 v2.8.22 // indirect github.com/spf13/cast v1.7.0 // indirect github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spiffe/go-spiffe/v2 v2.3.0 // indirect + github.com/spiffe/go-spiffe/v2 v2.4.0 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/thales-e-security/pool v0.0.2 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect @@ -320,7 +320,7 @@ require ( github.com/vulcand/predicate v1.2.0 // indirect github.com/weppos/publicsuffix-go v0.30.3-0.20240510084413-5f1d03393b3d // indirect github.com/x448/float16 v0.8.4 // indirect - github.com/xanzy/go-gitlab v0.112.0 // indirect + github.com/xanzy/go-gitlab v0.114.0 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect @@ -336,41 +336,41 @@ require ( go.abhg.dev/goldmark/frontmatter v0.2.0 // indirect go.mongodb.org/mongo-driver v1.14.0 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 // indirect - go.opentelemetry.io/otel v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect - go.opentelemetry.io/otel/metric v1.30.0 // indirect - go.opentelemetry.io/otel/sdk v1.30.0 // indirect - go.opentelemetry.io/otel/trace v1.30.0 // indirect - go.opentelemetry.io/proto/otlp v1.3.1 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 // indirect + go.opentelemetry.io/otel v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 // indirect + go.opentelemetry.io/otel/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.32.0 // indirect + go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/proto/otlp v1.4.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/mock v0.4.0 // indirect - golang.org/x/crypto v0.28.0 // indirect - golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect - golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.30.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect - golang.org/x/time v0.6.0 // indirect - golang.org/x/tools v0.26.0 // indirect - google.golang.org/api v0.197.0 // indirect + golang.org/x/crypto v0.29.0 // indirect + golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f // indirect + golang.org/x/mod v0.22.0 // indirect + golang.org/x/net v0.31.0 // indirect + golang.org/x/oauth2 v0.24.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.26.0 // indirect + golang.org/x/text v0.20.0 // indirect + golang.org/x/time v0.8.0 // indirect + golang.org/x/tools v0.27.0 // indirect + google.golang.org/api v0.207.0 // indirect google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - helm.sh/helm/v3 v3.16.2 // indirect + helm.sh/helm/v3 v3.16.3 // indirect k8s.io/api v0.31.1 // indirect k8s.io/apiextensions-apiserver v0.31.1 // indirect k8s.io/apimachinery v0.31.1 // indirect @@ -384,7 +384,7 @@ require ( k8s.io/utils v0.0.0-20240921022957-49e7df575cb6 // indirect mvdan.cc/sh/v3 v3.7.0 // indirect oras.land/oras-go v1.2.5 // indirect - sigs.k8s.io/controller-runtime v0.19.1 // indirect + sigs.k8s.io/controller-runtime v0.19.3 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/kustomize/api v0.17.2 // indirect sigs.k8s.io/kustomize/kyaml v0.17.1 // indirect diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index c845eb8b042e7..1fcb3d41059a9 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -1,5 +1,5 @@ -cel.dev/expr v0.16.0 h1:yloc84fytn4zmJX2GU3TkXGsaieaV7dQ057Qs4sIG2Y= -cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.16.1 h1:NR0+oFYzR1CqLFhTAqg3ql59G9VfN8fKq1TCHJ6gq1g= +cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= @@ -39,8 +39,8 @@ cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRY 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.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= -cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -102,10 +102,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.9.4 h1:DxF7imbEbiFu9+zdKC6cKBko1e8XeJnipNqIbWZ+kDI= -cloud.google.com/go/auth v0.9.4/go.mod h1:SHia8n6//Ya940F1rLimhJCjjx7KE17t0ctFEci3HkA= -cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= -cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +cloud.google.com/go/auth v0.10.2 h1:oKF7rgBfSHdp/kuhXtqU/tNDr0mZqhYbEh+6SiqzkKo= +cloud.google.com/go/auth v0.10.2/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI= +cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk= +cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= @@ -160,8 +160,8 @@ cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudsqlconn v1.12.1 h1:crfkYy4TsYXx+n/wELlPthDYaAmDo2olHLv9DmRuJzY= -cloud.google.com/go/cloudsqlconn v1.12.1/go.mod h1:Y8x/9e+QsjJNkvOj9mdJ8/ixhE95Ab2H/vsyy0mXWNc= +cloud.google.com/go/cloudsqlconn v1.13.1 h1:yWoXgP3jeJiHMzpfLKtf7XrPlDRaX/sYFEkyyXUAuIg= +cloud.google.com/go/cloudsqlconn v1.13.1/go.mod h1:lP+AZa6H8aXN7oFFXybrD27X+37eeNqEMmZW/mIA9H8= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= @@ -183,8 +183,8 @@ cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63 cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o= -cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk= +cloud.google.com/go/compute v1.28.3 h1:+b9s7mbJYe7yQ0qA9o6GS7Tb1Ubygnv6jCLxM0JnbQA= +cloud.google.com/go/compute v1.28.3/go.mod h1:HFlsDurE5DpQZClAGf/cYh+gxssMhBxBovZDYkEn/Og= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= @@ -199,8 +199,8 @@ cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3 cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= -cloud.google.com/go/container v1.40.0 h1:JVoEg/4RvoGW37r2Eja/cTBc3X9c2loGWYq7QDsRDuI= -cloud.google.com/go/container v1.40.0/go.mod h1:wNI1mOUivm+ZkpHMbouutgbD4sQxyphMwK31X5cThY4= +cloud.google.com/go/container v1.41.0 h1:f20+lv3PBeQKgAL7X3VeuDzvF2iYao2AVBTsuTpPk68= +cloud.google.com/go/container v1.41.0/go.mod h1:YL6lDgCUi3frIWNIFU9qrmF7/6K1EYrtspmFTyyqJ+k= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= @@ -328,8 +328,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.2.1 h1:QFct02HRb7H12J/3utj0qf5tobFh9V4vR6h9eX5EBRU= -cloud.google.com/go/iam v1.2.1/go.mod h1:3VUIJDPpwT6p/amXRC5GY8fCCh70lxPygguVtI0Z4/g= +cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= +cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= @@ -349,8 +349,8 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4 cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.20.0 h1:uKUvjGqbBlI96xGE669hcVnEMw1Px/Mvfa62dhM5UrY= -cloud.google.com/go/kms v1.20.0/go.mod h1:/dMbFF1tLLFnQV44AoI2GlotbjowyUfgVwezxW291fM= +cloud.google.com/go/kms v1.20.1 h1:og29Wv59uf2FVaZlesaiDAqHFzHaoUyHI3HYp9VUHVg= +cloud.google.com/go/kms v1.20.1/go.mod h1:LywpNiVCvzYNJWS9JUcGJSVTNSwPwi0vBAotzDqn2nc= 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= @@ -364,8 +364,8 @@ cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeN 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.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.6.1 h1:lOLTFxYpr8hcRtcwWir5ITh1PAKUD/sG2lKrTSYjyMc= -cloud.google.com/go/longrunning v0.6.1/go.mod h1:nHISoOZpBcmlwbJmiVk5oDRz0qG/ZxPynEGs1iZ79s0= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= 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/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= @@ -389,8 +389,8 @@ cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhI cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.21.0 h1:EMc0tB+d3lUewT2NzKC/hr8cSR9WsUieVywzIHetGro= -cloud.google.com/go/monitoring v1.21.0/go.mod h1:tuJ+KNDdJbetSsbSGTqnaBvbauS5kr3Q/koy3Up6r+4= +cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= +cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= 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= @@ -477,8 +477,8 @@ cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7L cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= -cloud.google.com/go/resourcemanager v1.10.1 h1:fO/QoSJ1lepmTM9dCbSXYWgTIhecmQkpY0mM1X9OGN0= -cloud.google.com/go/resourcemanager v1.10.1/go.mod h1:A/ANV/Sv7y7fcjd4LSH7PJGTZcWRkO/69yN5UhYUmvE= +cloud.google.com/go/resourcemanager v1.10.2 h1:LpqZZGM0uJiu1YWM878AA8zZ/qOQ/Ngno60Q8RAraAI= +cloud.google.com/go/resourcemanager v1.10.2/go.mod h1:5f+4zTM/ZOTDm6MmPOp6BQAhR0fi8qFPnvVGSoWszcc= cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= @@ -539,8 +539,8 @@ cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+ cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.68.0 h1:54nL8lEUj5A6frSGnL9VPmHDYbV5UwVkK8fbdnZyDCs= -cloud.google.com/go/spanner v1.68.0/go.mod h1:X5T0XftydYp0K1adeJQDJtdWpbrOeJ7wHecM4tK6FiE= +cloud.google.com/go/spanner v1.72.0 h1:8hOxGVi0gaOWdxzDxyjYL4g/unjVUy2uje1T3okTgiQ= +cloud.google.com/go/spanner v1.72.0/go.mod h1:mw98ua5ggQXVWwp83yjwggqEmW9t8rjs9Po1ohcUGW4= 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= @@ -558,8 +558,8 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= -cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= +cloud.google.com/go/storage v1.47.0 h1:ajqgt30fnOMmLfWfu1PWcb+V9Dxz6n+9WKjdNg5R4HM= +cloud.google.com/go/storage v1.47.0/go.mod h1:Ks0vP374w0PW6jOUameJbapbQKXqkjGd/OJRp2fb9IQ= 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/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= @@ -674,8 +674,8 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0 h1:S087d github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/sql/armsql v1.2.0/go.mod h1:B4cEyXrWBmbfMDAPnpJ1di7MAt5DKP57jPEObAvZChg= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0 h1:UrGzkHueDwAWDdjQxC+QaXHd4tVCkISYE9j7fSSXF8k= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription v1.2.0/go.mod h1:qskvSQeW+cxEE2bcKYyKimB1/KiQ9xpJ99bcHY0BX6c= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1 h1:cf+OIKbkmMHBaC3u78AXomweqM0oxQSgBXRZf3WH4yM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1/go.mod h1:ap1dmS6vQKJxSMNiGJcq4QuUQkOynyD93gLw6MDF7ek= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0 h1:mlmW46Q0B79I+Aj4azKC6xDMFN9a9SyZWESlGWYXbFs= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.5.0/go.mod h1:PXe2h+LKcWTX9afWdZoHyODqR4fBa5boUM/8uJfZ0Jo= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= @@ -700,6 +700,10 @@ github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0 h1:oVLqHXhnYtUwM89y9T1 github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 h1:pB2F2JKCj1Znmp2rwxxt1J0Fg0wezTMgWYk5Mpbi1kg= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Kunde21/markdownfmt/v3 v3.1.0 h1:KiZu9LKs+wFFBQKhrZJrFZwtLnCCWJahL+S+E/3VnM0= github.com/Kunde21/markdownfmt/v3 v3.1.0/go.mod h1:tPXN1RTyOzJwhfHoon9wUr4HGYmWgVxSQN6VBJDkrVc= @@ -721,8 +725,8 @@ github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jB github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/Microsoft/hcsshim v0.11.5 h1:haEcLNpj9Ka1gd3B3tAEs9CpE0c+1IhoL59w/exYU38= -github.com/Microsoft/hcsshim v0.11.5/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ= +github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= @@ -780,88 +784,88 @@ github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3A github.com/aws/aws-sdk-go v1.25.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk= -github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA= -github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw= -github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM= -github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.13 h1:EiyBn76ZpKQJWRNhgxvgloj6Xmazck05+RS6j0gfy1Y= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.13/go.mod h1:gKf4BQBfUke2acRFz76+Tyqz4A9Me0aMEnDUZwEZ+R0= -github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.48 h1:LSD17tCR5kLNAeq0nBQNozVtydVIRbtVBvTPBdbEt9o= -github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.48/go.mod h1:zzc/IJrpU6yxsvP9rlMFRnGAQK5igXStFPyN7gqvkl8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 h1:ihPPdcCVSN0IvBByXwqVp28/l4VosBZ6sDulcvU2J7w= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35/go.mod h1:JkgEhs3SVF51Dj3m1Bj+yL8IznpxzkwlA3jLg3x7Kls= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ= +github.com/aws/aws-sdk-go-v2 v1.32.6 h1:7BokKRgRPuGmKkFMhEg/jSul+tB9VvXhcViILtfG8b4= +github.com/aws/aws-sdk-go-v2 v1.32.6/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= +github.com/aws/aws-sdk-go-v2/config v1.28.6 h1:D89IKtGrs/I3QXOLNTH93NJYtDhm8SYa9Q5CsPShmyo= +github.com/aws/aws-sdk-go-v2/config v1.28.6/go.mod h1:GDzxJ5wyyFSCoLkS+UhGB0dArhb9mI+Co4dHtoTxbko= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47 h1:48bA+3/fCdi2yAwVt+3COvmatZ6jUDNkDTIsqDiMUdw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.47/go.mod h1:+KdckOejLW3Ks3b0E3b5rHsr2f9yuORBum0WPnE5o5w= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.20 h1:bwHhhCScKRAYJtaWVT+jDpt74GybN2nxI6+InkRjqGM= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.20/go.mod h1:/RfYH8CUMQuq/3CIEVGHLkqkA9KtbBF5omt2Ae8xc0s= +github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.55 h1:L7VWZW9+2h9gnPNuHsnUU5WFcgx3i3y2utHOLG+FTaM= +github.com/aws/aws-sdk-go-v2/feature/dynamodbstreams/attributevalue v1.14.55/go.mod h1:mJ7tAfWUIVja+y4kVGXr/SucTEErhYx5nAZ39WV7W6o= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21 h1:AmoU1pziydclFT/xRV+xXE/Vb8fttJCLRPv8oAkprc0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.21/go.mod h1:AjUdLYe4Tgs6kpH4Bv7uMZo7pottoyHMn4eTcIcneaY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43 h1:iLdpkYZ4cXIQMO7ud+cqMWR1xK5ESbt1rvN77tRi1BY= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.43/go.mod h1:OgbsKPAswXDd5kxnR4vZov69p3oYjbvUyIRBAAV0y9o= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25 h1:s/fF4+yDQDoElYhfIVvSNyeCydfbuTKzhxSXDXCPasU= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.25/go.mod h1:IgPfDv5jqFIzQSNbUEMoitNooSMXjRSDkhXv8jiROvU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25 h1:ZntTCl5EsYnhN/IygQEUugpdwbhdkom9uHcbCftiGgA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.25/go.mod h1:DBdPrgeocww+CSl1C8cEV8PN1mHMBhuCDLpXezyvWkE= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw= -github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.33.3 h1:M6/YarR8ItjAoF0G77hAVLpXsTTdMNtliVZHkSIwNgU= -github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.33.3/go.mod h1:fnXN26jHqVTNn7mckGCuXsee3ALrLlAn5u9gPek09U8= -github.com/aws/aws-sdk-go-v2/service/athena v1.48.1 h1:qj1vutJplyyjoKOpU3OujWckGY93VCv7Lxuypwi7/S4= -github.com/aws/aws-sdk-go-v2/service/athena v1.48.1/go.mod h1:Zzq05nJPTEENpFUYW5CRs4cpH9eeX3lOi70444jPzsA= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.36.3 h1:pS5ka5Z026eG29K3cce+yxG39i5COQARcgheeK9NKQE= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.36.3/go.mod h1:MBT8rSGSZjJiV6X7rlrVGoIt+mCoaw0VbpdVtsrsJfk= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.3 h1:BjzvhVB6Nnx+Xqlnc5JWkQYuWClxUFcvLzZIqFO31lI= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.3/go.mod h1:/6lakUr7RXajwpensF1miKadiR+xTlHV7mma5axITxY= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0 h1:cA4hWo269CN5RY7Arqt8BfzXF0KIN8DSNo/KcqHKkWk= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.187.0/go.mod h1:ossaD9Z1ugYb6sq9QIqQLEOorCGcqUoxlhud9M9yE70= -github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.3 h1:53xnOuDLuRYfj26/wdOx749UrmYWpSHmJdWNKdTHFVg= -github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.3/go.mod h1:9HgSjQIDhQgZ1JCyZuX4/mri5hXi4Ez4WD6BT3x3cwg= -github.com/aws/aws-sdk-go-v2/service/ecs v1.49.0 h1:xhCV6zY5ZFzfyAUOiBXK6wh0HVQTBkvNwA/eiz89ZWY= -github.com/aws/aws-sdk-go-v2/service/ecs v1.49.0/go.mod h1:RXYd/Ts+sFnjDrVdAZsAfHVkYxQUxhC+l2zrSpSgCGc= -github.com/aws/aws-sdk-go-v2/service/eks v1.51.1 h1:OQjVHkANBbwE055NK49M/kelQbapsQOsSfUUWP1mi3w= -github.com/aws/aws-sdk-go-v2/service/eks v1.51.1/go.mod h1:9wMtzHTjYbK5MLzYBWSznUPsys/n9LapMwb6UhKOVPQ= -github.com/aws/aws-sdk-go-v2/service/glue v1.101.0 h1:UiKyNrUwlM2FfHk1D8TefZIPVf4ubM3Qr3vmdNKfxtE= -github.com/aws/aws-sdk-go-v2/service/glue v1.101.0/go.mod h1:TjtkCUyO8rZfxl0K6c3BF2L0K+ZbhiM7gClYk4wXyJ0= -github.com/aws/aws-sdk-go-v2/service/iam v1.37.3 h1:uuoXyOwX2ReYgHJW0W84cKDUrvQNQA2l9KhkXUgT+R4= -github.com/aws/aws-sdk-go-v2/service/iam v1.37.3/go.mod h1:RCrjvkN/ZpVAzW3ZmIlyflv7MUM45YlWx3v+6MaVX2w= -github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.3 h1:w9j4dHPGA+cDPtyoJcTZv/MOy3amQBsopzWgbqaAsYc= -github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.3/go.mod h1:tTHlog0zrTTBLQBI91uDoYT90C0AcHu6wEw7AiQFe6s= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.3 h1:wudRPcZMKytcywXERkR6PLqD8gPx754ZyIOo0iVg488= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.3/go.mod h1:yRo5Kj5+m/ScVIZpQOquQvDtSrDM1JLRCnvglBcdNmw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY= -github.com/aws/aws-sdk-go-v2/service/kms v1.37.3 h1:VpyBA6KP6JgzwokQps8ArQPGy9rFej8adwuuQGcduH8= -github.com/aws/aws-sdk-go-v2/service/kms v1.37.3/go.mod h1:TT/9V4PcmSPpd8LPUNJ8hBHJmpqcfhx6MrbWTkvyR+4= -github.com/aws/aws-sdk-go-v2/service/organizations v1.34.3 h1:Er5y2CAfS0ddI6+/7bq7mk/dQjhvqt6B5i24K5PnHRQ= -github.com/aws/aws-sdk-go-v2/service/organizations v1.34.3/go.mod h1:hrfV1T+dtQ8AGlImCftiCAYZCTvn2hNVEcA9gPXui8E= -github.com/aws/aws-sdk-go-v2/service/rds v1.89.0 h1:4x0WbBa+i/AS0AFlj7yvx3n+GuK3XR58J6t61pW6h8U= -github.com/aws/aws-sdk-go-v2/service/rds v1.89.0/go.mod h1:WB+SVZKu1IBpsy3GrpR2EBnqB6A05Bd0r4RDLRqMbdk= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U= -github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE= -github.com/aws/aws-sdk-go-v2/service/sns v1.33.3 h1:coZW/SqpINT0VWG8vRWWY9TWUof8TDdxublw2Xur0Zc= -github.com/aws/aws-sdk-go-v2/service/sns v1.33.3/go.mod h1:J/G2xuhwNBlDvEi0WR/bnBbac4KSgpkERna/IXEF52w= -github.com/aws/aws-sdk-go-v2/service/sqs v1.36.3 h1:H1bCg79Q4PDtxQH8Fn5kASQlbVv2WGP5o5IEFEBNOAs= -github.com/aws/aws-sdk-go-v2/service/sqs v1.36.3/go.mod h1:W6Uy6OWgxF9RZuHoikthB6f+A0oYXqnfWmFl5m7E2G4= -github.com/aws/aws-sdk-go-v2/service/ssm v1.55.3 h1:nbFGlCxyyFe2cgg8WNQQtzDRVczO4+1dL4hd3TDU6MM= -github.com/aws/aws-sdk-go-v2/service/ssm v1.55.3/go.mod h1:nzUlOBAMlQx9zKwtI10FOzJa2phU6bmFbXhD6LLbr/A= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI= -github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.3 h1:DZqGS0tUMx2DEn6qfeQjUWrvqA1/PSVtHk1v/j0A7bw= -github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.3/go.mod h1:f+sNnIMGVUxVuuXMj3aNJklzymKxBlJEXhJDCY+TUwc= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs= -github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25 h1:r67ps7oHCYnflpgDy2LZU0MAQtQbYIOqNNnqGO6xQkE= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.25/go.mod h1:GrGY+Q4fIokYLtjCVB/aFfCVL6hhGUFl8inD18fDalE= +github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.34.1 h1:8EwNbY+A/Q5myYggLJ7v9v9f00UuWoh9S04y5kre8UQ= +github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.34.1/go.mod h1:2mMP2R86zLPAUz0TpJdsKW8XawHgs9Nk97fYJomO3o8= +github.com/aws/aws-sdk-go-v2/service/athena v1.49.0 h1:D+iatX9gV6gCuNd6BnUkfwfZJw/cXlEk+LwwDdSMdtw= +github.com/aws/aws-sdk-go-v2/service/athena v1.49.0/go.mod h1:27ljwDsnZvfrZKsLzWD4WFjI4OZutEFIjvVtYfj9gHc= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.38.0 h1:isKhHsjpQR3CypQJ4G1g8QWx7zNpiC/xKw1zjgJYVno= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.38.0/go.mod h1:xDvUyIkwBwNtVZJdHEwAuhFly3mezwdEWkbJ5oNYwIw= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.8 h1:ntqHwZb+ZyVz0CFYUG0sQ02KMMJh+iXeV3bXoba+s4A= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.8/go.mod h1:Hcjb2SiUo9v1GhpXjRNW7hAwfzAPfrsgnlKpP5UYEPY= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.195.0 h1:F3pFi50sK30DZ4IkkNpHwTLGeal5c3nlKuvTgv7xec4= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.195.0/go.mod h1:00zqVNJFK6UASrTnuvjJHJuaqUdkVz5tW8Ip+VhzuNg= +github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.7 h1:n221X4mwD08KKGlfpcsD0WxIsCuVOH32RUDOHniC8/U= +github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect v1.27.7/go.mod h1:bkT6gKfhFH//cV+66Ut8tqWR2apIcZvsU4no8luLx3w= +github.com/aws/aws-sdk-go-v2/service/ecs v1.52.1 h1:85SGI/Db9I8PT2rvDLIRGxXdSzuyC4ZKDJwfzuv7WqQ= +github.com/aws/aws-sdk-go-v2/service/ecs v1.52.1/go.mod h1:Ghi1OWUv4+VMEULWiHsKH2gNA3KAcMoLWsvU0eRXvIA= +github.com/aws/aws-sdk-go-v2/service/eks v1.53.0 h1:ACTxnLwL6YNmuYbxtp/VR3HGL9SWXU6VZkXPjWST9ZQ= +github.com/aws/aws-sdk-go-v2/service/eks v1.53.0/go.mod h1:ZzOjZXGGUQxOq+T3xmfPLKCZe4OaB5vm1LdGaC8IPn4= +github.com/aws/aws-sdk-go-v2/service/glue v1.103.0 h1:aWkaWcO6AWKOZgnm45es3lL+jZ9tece2kfQ2Na4xoQs= +github.com/aws/aws-sdk-go-v2/service/glue v1.103.0/go.mod h1:ajiRue7mZ0vQjVHQkQG2KBaPHW8lL5GtvmjRTHWDaqk= +github.com/aws/aws-sdk-go-v2/service/iam v1.38.2 h1:8iFKuRj/FJipy/aDZ2lbq0DYuEHdrxp0qVsdi+ZEwnE= +github.com/aws/aws-sdk-go-v2/service/iam v1.38.2/go.mod h1:UBe4z0VZnbXGp6xaCW1ulE9pndjfpsnrU206rWZcR0Y= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.7 h1:y0SG6t2s4xrOwjulhbGQ72ovA2MSlrb2UyAz+pA6n8g= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.7/go.mod h1:cJpIii79T0fjc0awSqvU/1kltAjp8MCmMpkhbOUUiik= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6 h1:HCpPsWqmYQieU7SS6E9HXfdAMSud0pteVXieJmcpIRI= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.6/go.mod h1:ngUiVRCco++u+soRRVBIvBZxSMMvOVMXA4PJ36JLfSw= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.6 h1:nbmKXZzXPJn41CcD4HsHsGWqvKjLKz9kWu6XxvLmf1s= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.6/go.mod h1:SJhcisfKfAawsdNQoZMBEjg+vyN2lH6rO6fP+T94z5Y= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6 h1:50+XsN70RS7dwJ2CkVNXzj7U2L1HKP8nqTd3XWEXBN4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.6/go.mod h1:WqgLmwY7so32kG01zD8CPTJWVWM+TzJoOVHwTg4aPug= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6 h1:BbGDtTi0T1DYlmjBiCr/le3wzhA37O8QTC5/Ab8+EXk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.6/go.mod h1:hLMJt7Q8ePgViKupeymbqI0la+t9/iYFBjxQCFwuAwI= +github.com/aws/aws-sdk-go-v2/service/kms v1.37.7 h1:dZmNIRtPUvtvUIIDVNpvtnJQ8N8Iqm7SQAxf18htZYw= +github.com/aws/aws-sdk-go-v2/service/kms v1.37.7/go.mod h1:vj8PlfJH9mnGeIzd6uMLPi5VgiqzGG7AZoe1kf1uTXM= +github.com/aws/aws-sdk-go-v2/service/organizations v1.36.0 h1:CVHfN8ZVvWzDkAf/Qj+GO53dD5NWVyK16O8pYg/wp3k= +github.com/aws/aws-sdk-go-v2/service/organizations v1.36.0/go.mod h1:SVY+doFrL3KTvVMWzFLKvD7KYQ6GQfwNRPSQS7eA3cA= +github.com/aws/aws-sdk-go-v2/service/rds v1.92.0 h1:W0gUYAjO24u/M6tpR041wMHJWGzleOhxtCnNLImdrZs= +github.com/aws/aws-sdk-go-v2/service/rds v1.92.0/go.mod h1:ADD2uROOoEIXjbjDPEvDDZWnGmfKFYMddgKwG5RlBGw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0 h1:nyuzXooUNJexRT0Oy0UQY6AhOzxPxhtt4DcBIHyCnmw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.71.0/go.mod h1:sT/iQz8JK3u/5gZkT+Hmr7GzVZehUMkRZpOaAwYXeGY= +github.com/aws/aws-sdk-go-v2/service/sns v1.33.7 h1:N3o8mXK6/MP24BtD9sb51omEO9J9cgPM3Ughc293dZc= +github.com/aws/aws-sdk-go-v2/service/sns v1.33.7/go.mod h1:AAHZydTB8/V2zn3WNwjLXBK1RAcSEpDNmFfrmjvrJQg= +github.com/aws/aws-sdk-go-v2/service/sqs v1.37.2 h1:mFLfxLZB/TVQwNJAYox4WaxpIu+dFVIcExrmRmRCOhw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.37.2/go.mod h1:GnvfTdlvcpD+or3oslHPOn4Mu6KaCwlCp+0p0oqWnrM= +github.com/aws/aws-sdk-go-v2/service/ssm v1.56.1 h1:cfVjoEwOMOJOI6VoRQua0nI0KjZV9EAnR8bKaMeSppE= +github.com/aws/aws-sdk-go-v2/service/ssm v1.56.1/go.mod h1:fGHwAnTdNrLKhgl+UEeq9uEL4n3Ng4MJucA+7Xi3sC4= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7 h1:rLnYAfXQ3YAccocshIH5mzNNwZBkBo+bP6EhIxak6Hw= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.7/go.mod h1:ZHtuQJ6t9A/+YDuxOLnbryAmITtr8UysSny3qcyvJTc= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.7 h1:X+5QChV4btPAoTpQ/GAcEJ1tCrpO6Y8X4C5CG11WNWI= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.7/go.mod h1:LYMBcQuhPc6czFaQpYC9JAcEcMf1DNVie4YHg6iC240= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6 h1:JnhTZR3PiYDNKlXy50/pNeix9aGMo6lLpXwJ1mw8MD4= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.6/go.mod h1:URronUEGfXZN1VpdktPSD1EkAL9mfrV+2F4sjH38qOY= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2 h1:s4074ZO1Hk8qv65GqNXqDjmkf4HSQqJukaLuuW0TpDA= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.2/go.mod h1:mVggCnIWoM09jP71Wh+ea7+5gAp53q+49wDFs1SW5z8= github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0 h1:EJsHUYgFBV7/N1YtL73lsfZODAOU+CnNSZfEAlqqQaA= github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0/go.mod h1:AxKuXHc0zv2yYaeueUG7R3ONbcnQIuDj0bkdFmPVRzU= -github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= -github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= +github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/beevik/etree v1.4.1 h1:PmQJDDYahBGNKDcpdX8uPy1xRCwoCGVUiW669MEirVI= github.com/beevik/etree v1.4.1/go.mod h1:gPNJNaBGVZ9AwsidazFZyygnd+0pAU38N4D+WemwKNs= @@ -931,18 +935,20 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH 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/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59 h1:fLZ97KE86ELjEYJCEUVzmbhfzDxHHGwBrDVMd4XL6Bs= -github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= -github.com/containerd/containerd v1.7.18 h1:jqjZTQNfXGoEaZdW1WwPU0RqSn1Bm2Ay/KJPUuO8nao= -github.com/containerd/containerd v1.7.18/go.mod h1:IYEk9/IO6wAPUz2bCMVUbsfXjzw5UNP5fLz4PsUygQ4= +github.com/containerd/containerd v1.7.23 h1:H2CClyUkmpKAGlhQp95g2WXHfLYc7whAuvZGBNYOOwQ= +github.com/containerd/containerd v1.7.23/go.mod h1:7QUzfURqZWCZV7RLNEn1XjUCQLEf0bkaK4GjUaZehxw= github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= -github.com/containerd/errdefs v0.1.0 h1:m0wCRBiu1WJT/Fr+iOoQHMQS/eP5myQ8lCv4Dz5ZURM= -github.com/containerd/errdefs v0.1.0/go.mod h1:YgWiiHtLmSeBrvpw+UfPijzbLaB77mEG1WwJTDETIV0= +github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4= +github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= github.com/coreos/go-oidc/v3 v3.11.0 h1:Ia3MxdwpSw702YW0xgfmP1GVCMA9aEFWu12XUZ3/OtI= github.com/coreos/go-oidc/v3 v3.11.0/go.mod h1:gE3LgjOgFoHi9a4ce4/tJczr0Ai2/BoDhf0r5lltWI0= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= @@ -959,8 +965,8 @@ github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= github.com/crewjam/saml v0.4.14 h1:g9FBNx62osKusnFzs3QTN5L9CVA/Egfgm+stJShzw/c= github.com/crewjam/saml v0.4.14/go.mod h1:UVSZCf18jJkk6GpWNVqcyQJMD5HsRugBPf4I1nl2mME= -github.com/cyphar/filepath-securejoin v0.3.1 h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE= -github.com/cyphar/filepath-securejoin v0.3.1/go.mod h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc= +github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8= +github.com/cyphar/filepath-securejoin v0.3.4/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -1004,8 +1010,8 @@ github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/ github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/elastic/elastic-transport-go/v8 v8.6.0 h1:Y2S/FBjx1LlCv5m6pWAF2kDJAHoSjSRSJCApolgfthA= github.com/elastic/elastic-transport-go/v8 v8.6.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= -github.com/elastic/go-elasticsearch/v8 v8.15.0 h1:IZyJhe7t7WI3NEFdcHnf6IJXqpRf+8S8QWLtZYYyBYk= -github.com/elastic/go-elasticsearch/v8 v8.15.0/go.mod h1:HCON3zj4btpqs2N1jjsAy4a/fiAul+YBP00mBH4xik8= +github.com/elastic/go-elasticsearch/v8 v8.16.0 h1:f7bR+iBz8GTAVhwyFO3hm4ixsz2eMaEy0QroYnXV3jE= +github.com/elastic/go-elasticsearch/v8 v8.16.0/go.mod h1:lGMlgKIbYoRvay3xWBeKahAiJOgmFDsjZC39nmO3H64= github.com/elimity-com/scim v0.0.0-20240320110924-172bf2aee9c8 h1:0+BTyxIYgiVAry/P5s8R4dYuLkhB9Nhso8ogFWNr4IQ= github.com/elimity-com/scim v0.0.0-20240320110924-172bf2aee9c8/go.mod h1:JkjcmqbLW+khwt2fmBPJFBhx2zGZ8XobRZ+O0VhlwWo= github.com/emicklei/go-restful/v3 v3.11.3 h1:yagOQz/38xJmcNeZJtrUcKjkHRltIaIFXKWeG1SkWGE= @@ -1297,8 +1303,8 @@ github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqE 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/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= -github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= +github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= 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/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -1351,8 +1357,8 @@ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= 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.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0 h1:TmHmbvxPmaegwhDubVz0lICL0J5Ka2vwTzhoePEXsGE= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/cli v1.1.6 h1:CMOV+/LJfL1tXCOKrgAX0uRKnzjj/mpmqNXloRSy2K8= @@ -1622,6 +1628,8 @@ github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -1661,12 +1669,12 @@ github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQ github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= github.com/opensearch-project/opensearch-go/v2 v2.3.0 h1:nQIEMr+A92CkhHrZgUhcfsrZjibvB3APXf2a1VwCmMQ= github.com/opensearch-project/opensearch-go/v2 v2.3.0/go.mod h1:8LDr9FCgUTVoT+5ESjc2+iaZuldqE+23Iq0r1XeNue8= -github.com/parquet-go/parquet-go v0.23.0 h1:dyEU5oiHCtbASyItMCD2tXtT2nPmoPbKpqf0+nnGrmk= -github.com/parquet-go/parquet-go v0.23.0/go.mod h1:MnwbUcFHU6uBYMymKAlPPAw9yh3kE1wWl6Gl1uLdkNk= +github.com/parquet-go/parquet-go v0.24.0 h1:VrsifmLPDnas8zpoHmYiWDZ1YHzLmc7NmNwPGkI2JM4= +github.com/parquet-go/parquet-go v0.24.0/go.mod h1:OqBBRGBl7+llplCvDMql8dEKaDqjaFA/VAPw+OJiNiw= github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcMb0= github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= -github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627 h1:pSCLCl6joCFRnjpeojzOpEYs4q7Vditq8fySFG5ap3Y= -github.com/patrickmn/go-cache v0.0.0-20180815053127-5633e0862627/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible h1:IWzUvJ72xMjmrjR9q3H1PF+jwdN0uNQiR2t1BLNalyo= +github.com/patrickmn/go-cache v2.1.1-0.20191004192108-46f407853014+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 h1:2nosf3P75OZv2/ZO/9Px5ZgZ5gbKrzA3joN1QMfOGMQ= @@ -1741,8 +1749,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= -github.com/quic-go/quic-go v0.48.1 h1:y/8xmfWI9qmGTc+lBr4jKRUWLGSlSigv847ULJ4hYXA= -github.com/quic-go/quic-go v0.48.1/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= +github.com/quic-go/quic-go v0.48.2 h1:wsKXZPeGWpMpCGSWqOcqpW2wZYic/8T3aqiOID0/KWE= +github.com/quic-go/quic-go v0.48.2/go.mod h1:yBgs3rWBOADpga7F+jJsb6Ybg1LSYiQvwWlLX+/6HMs= 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.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= @@ -1752,8 +1760,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/rubenv/sql-migrate v1.7.0 h1:HtQq1xyTN2ISmQDggnh0c9U3JlP8apWh8YO2jzlXpTI= @@ -1767,22 +1775,20 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/schollz/progressbar/v3 v3.17.0 h1:Fv+vG6O6jnJwdjCelvfyYO7sF2jaUGQVmdH4CxcZdsQ= -github.com/schollz/progressbar/v3 v3.17.0/go.mod h1:5H4fLgifX+KeQCsEJnZTOepgZLe1jFF1lpPXb68IJTA= +github.com/schollz/progressbar/v3 v3.17.1 h1:bI1MTaoQO+v5kzklBjYNRQLoVpe0zbyRZNK6DFkVC5U= +github.com/schollz/progressbar/v3 v3.17.1/go.mod h1:RzqpnsPQNjUyIgdglUjRLgD7sVnxN1wpmBMV+UiEbL4= github.com/scim2/filter-parser/v2 v2.2.0 h1:QGadEcsmypxg8gYChRSM2j1edLyE/2j72j+hdmI4BJM= github.com/scim2/filter-parser/v2 v2.2.0/go.mod h1:jWnkDToqX/Y0ugz0P5VvpVEUKcWcyHHj+X+je9ce5JA= github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= -github.com/segmentio/encoding v0.4.0 h1:MEBYvRqiUB2nfR2criEXWqwdY6HJOUrCn5hboVOVmy8= -github.com/segmentio/encoding v0.4.0/go.mod h1:/d03Cd8PoaDeceuhUUUQWjU0KhWjrmYrWPgtJHYZSnI= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= -github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM= -github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= +github.com/shirou/gopsutil/v4 v4.24.11 h1:WaU9xqGFKvFfsUv94SXcUPD7rCkU0vr/asVdQOBZNj8= +github.com/shirou/gopsutil/v4 v4.24.11/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726 h1:xT+JlYxNGqyT+XcU8iUrN18JYed2TvG9yN5ULG2jATM= @@ -1811,8 +1817,8 @@ github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3k github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spiffe/go-spiffe/v2 v2.3.0 h1:g2jYNb/PDMB8I7mBGL2Zuq/Ur6hUhoroxGQFyD6tTj8= -github.com/spiffe/go-spiffe/v2 v2.3.0/go.mod h1:Oxsaio7DBgSNqhAO9i/9tLClaVlfRok7zvJnTV8ZyIY= +github.com/spiffe/go-spiffe/v2 v2.4.0 h1:j/FynG7hi2azrBG5cvjRcnQ4sux/VNj8FAVc99Fl66c= +github.com/spiffe/go-spiffe/v2 v2.4.0/go.mod h1:m5qJ1hGzjxjtrkGHZupoXHo/FDWwCB1MdSyBzfHugx0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1830,8 +1836,8 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F 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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/thales-e-security/pool v0.0.2 h1:RAPs4q2EbWsTit6tpzuvTFlgFRJ3S8Evf5gtvVDbmPg= github.com/thales-e-security/pool v0.0.2/go.mod h1:qtpMm2+thHtqhLzTwgDBj/OuNnMpupY8mv0Phz0gjhU= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -1854,8 +1860,8 @@ github.com/weppos/publicsuffix-go v0.30.3-0.20240510084413-5f1d03393b3d h1:q80YK github.com/weppos/publicsuffix-go v0.30.3-0.20240510084413-5f1d03393b3d/go.mod h1:vLdXKydr/OJssAXmjY0XBgLXUfivBMrNRIBljgtqCnw= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xanzy/go-gitlab v0.112.0 h1:6Z0cqEooCvBMfBIHw+CgO4AKGRV8na/9781xOb0+DKw= -github.com/xanzy/go-gitlab v0.112.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= +github.com/xanzy/go-gitlab v0.114.0 h1:0wQr/KBckwrZPfEMjRqpUz0HmsKKON9UhCYv9KDy19M= +github.com/xanzy/go-gitlab v0.114.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= @@ -1922,12 +1928,12 @@ github.com/zmap/zlint/v3 v3.6.0 h1:vTEaDRtYN0d/1Ax60T+ypvbLQUHwHxbvYRnUMVr35ug= github.com/zmap/zlint/v3 v3.6.0/go.mod h1:NVgiIWssgzp0bNl8P4Gz94NHV2ep/4Jyj9V69uTmZyg= go.abhg.dev/goldmark/frontmatter v0.2.0 h1:P8kPG0YkL12+aYk2yU3xHv4tcXzeVnN+gU0tJ5JnxRw= go.abhg.dev/goldmark/frontmatter v0.2.0/go.mod h1:XqrEkZuM57djk7zrlRUB02x8I5J0px76YjkOzhB4YlU= -go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0= -go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= -go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q= -go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= -go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= -go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= +go.etcd.io/etcd/api/v3 v3.5.17 h1:cQB8eb8bxwuxOilBpMJAEo8fAONyrdXTHUNcMd8yT1w= +go.etcd.io/etcd/api/v3 v3.5.17/go.mod h1:d1hvkRuXkts6PmaYk2Vrgqbv7H4ADfAKhyJqHNLJCB4= +go.etcd.io/etcd/client/pkg/v3 v3.5.17 h1:XxnDXAWq2pnxqx76ljWwiQ9jylbpC4rvkAeRVOUKKVw= +go.etcd.io/etcd/client/pkg/v3 v3.5.17/go.mod h1:4DqK1TKacp/86nJk4FLQqo6Mn2vvQFBmruW3pP14H/w= +go.etcd.io/etcd/client/v3 v3.5.17 h1:o48sINNeWz5+pjy/Z0+HKpj/xSnBkuVhVvXkjEXbqZY= +go.etcd.io/etcd/client/v3 v3.5.17/go.mod h1:j2d4eXTHWkT2ClBgnnEPm/Wuu7jsqku41v9DZ3OtjQo= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1941,33 +1947,33 @@ 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/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ= go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= -go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0 h1:MnAevUB0SFfKALzF5ApgrArdvHZduRT3/e59L/lNYKE= -go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.55.0/go.mod h1:MHPbT1EvQOZMGbKeuCovYWcyM9iaxcltRf7+GsU8ziE= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0 h1:hCq2hNMwsegUvPzI7sPOvtO9cqyy5GbWt/Ybp2xrx8Q= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.55.0/go.mod h1:LqaApwGx/oUmzsbqxkzuBvyoPpkxk3JQWnqfVrJ3wCA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0 h1:ZIg3ZT/aQ7AfKqdwp7ECpOK6vHqquXXuyTjIO8ZdmPs= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI= -go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= -go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0 h1:m0yTiGDLUvVYaTFbAvCkVYIYcvwKt3G7OLoN77NUs/8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.30.0/go.mod h1:wBQbT4UekBfegL2nx0Xk1vBcnzyBPsIVm9hRG4fYcr4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= -go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= -go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= -go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= -go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0 h1:G47XgH32CEM1I9kZ8xrVExSxivATGHNE0tdxuqlx9MQ= +go.opentelemetry.io/contrib/instrumentation/github.com/aws/aws-sdk-go-v2/otelaws v0.57.0/go.mod h1:aqXlYGrumc8b/n4z9eDHHoiLN4fq2DAO//wMnqdxPhg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0 h1:qtFISDHKolvIxzSs0gIaiPUPR0Cucb0F2coHC7ZLdps= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.57.0/go.mod h1:Y+Pop1Q6hCOnETWTW4NROK/q1hv50hM7yDaUTjG8lp8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT6POBP+gh8RUH19EOTnQIor5QE0uSRPtzCpSw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= +go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0 h1:9kV11HXBHZAvuPUZxmMWrH8hZn/6UnHX4K0mu36vNsU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.32.0/go.mod h1:JyA0FHXe22E1NeNiHmVp7kFHglnexDQ7uRWDiiJ1hKQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI= +go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/metric v1.29.0 h1:K2CfmJohnRgvZ9UAj2/FhIf/okdWcNdBwe1m8xFXiSY= go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= -go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= -go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= +go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= -go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0 h1:TA9WRvW6zMwP+Ssb6fLoUIuirti1gGbP28GcKG1jgeg= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= @@ -2003,8 +2009,8 @@ golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= 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= @@ -2020,8 +2026,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 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-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY= -golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= 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= @@ -2064,8 +2070,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= -golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2134,8 +2140,8 @@ golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -2165,8 +2171,8 @@ 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.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -2183,8 +2189,8 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -2284,8 +2290,8 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -2302,8 +2308,8 @@ golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU= +golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E= 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= @@ -2324,16 +2330,16 @@ golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-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.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= -golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= 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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2398,8 +2404,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= -golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= -golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/tools v0.27.0 h1:qEKojBykQkQ4EynWy4S8Weg69NumxKdn40Fce3uc/8o= +golang.org/x/tools v0.27.0/go.mod h1:sUi0ZgbwW9ZPAq26Ekut+weQPR5eIM6GQLQ1Yjm1H0Q= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2475,8 +2481,8 @@ google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/ google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.197.0 h1:x6CwqQLsFiA5JKAiGyGBjc2bNtHtLddhJCE2IKuhhcQ= -google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw= +google.golang.org/api v0.207.0 h1:Fvt6IGCYjf7YLcQ+GCegeAI2QSQCfIWhRkmrMPj3JRM= +google.golang.org/api v0.207.0/go.mod h1:I53S168Yr/PNDNMi5yPnDc0/LGRZO6o7PoEbl/HY3CM= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2620,12 +2626,12 @@ google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1 h1:BulPr26Jqjnd4eYDVe+YvyR7Yc2vJGkO5/0UxD0/jZU= -google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= -google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f h1:zDoHYmMzMacIdjNe+P2XiTmPsLawi/pCbSPfxt6lTfw= +google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f/go.mod h1:Q5m6g8b5KaFFzsQFIGdJkSJDGeJiybVenoYFMMa3ohI= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ= +google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697 h1:LWZqQOEjDyONlF1H6afSWpAL/znlREo2tHfLoe+8LMA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -2669,11 +2675,13 @@ google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5v google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= -google.golang.org/grpc v1.66.3 h1:TWlsh8Mv0QI/1sIbs1W36lqRclxrmF+eFJ4DbI0fuhA= -google.golang.org/grpc v1.66.3/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a h1:UIpYSuWdWHSzjwcAFRLjKcPXFZVVLXGEM23W+NWqipw= +google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a/go.mod h1:9i1T9n4ZinTUZGgzENMi8MDDgbGC5mqTS75JAv6xN3A= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -2692,8 +2700,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -2731,8 +2739,8 @@ gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.4.0 h1:ZazjZUfuVeZGLAmlKKuyv3IKP5orXcwtOwDQH6YVr6o= gotest.tools/v3 v3.4.0/go.mod h1:CtbdzLSsqVhDgMtKsx03ird5YTGB3ar27v0u/yKBW5g= -helm.sh/helm/v3 v3.16.2 h1:Y9v7ry+ubQmi+cb5zw1Llx8OKHU9Hk9NQ/+P+LGBe2o= -helm.sh/helm/v3 v3.16.2/go.mod h1:SyTXgKBjNqi2NPsHCW5dDAsHqvGIu0kdNYNH9gQaw70= +helm.sh/helm/v3 v3.16.3 h1:kb8bSxMeRJ+knsK/ovvlaVPfdis0X3/ZhYCSFRP+YmY= +helm.sh/helm/v3 v3.16.3/go.mod h1:zeVWGDR4JJgiRbT3AnNsjYaX8OTJlIE9zC+Q7F7iUSU= 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= @@ -2805,8 +2813,8 @@ 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/controller-runtime v0.19.1 h1:Son+Q40+Be3QWb+niBXAg2vFiYWolDjjRfO8hn/cxOk= -sigs.k8s.io/controller-runtime v0.19.1/go.mod h1:iRmWllt8IlaLjvTTDLhRBXIEtkCK6hwVBJJsYS9Ajf4= +sigs.k8s.io/controller-runtime v0.19.3 h1:XO2GvC9OPftRst6xWCpTgBZO04S2cbp0Qqkj8bX1sPw= +sigs.k8s.io/controller-runtime v0.19.3/go.mod h1:j4j87DqtsThvwTv5/Tc5NFRyyF/RF0ip4+62tbTSIUM= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/kustomize/kyaml v0.17.1 h1:TnxYQxFXzbmNG6gOINgGWQt09GghzgTP6mIurOgrLCQ= diff --git a/integrations/terraform/testlib/machineid_join_test.go b/integrations/terraform/testlib/machineid_join_test.go index 52299c3cf457e..63d751f75630b 100644 --- a/integrations/terraform/testlib/machineid_join_test.go +++ b/integrations/terraform/testlib/machineid_join_test.go @@ -35,7 +35,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/integrations/lib/testing/fakejoin" "github.com/gravitational/teleport/integrations/lib/testing/integration" - "github.com/gravitational/teleport/lib/kubernetestoken" + kubetoken "github.com/gravitational/teleport/lib/kube/token" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/integrations/terraform/provider" @@ -115,7 +115,7 @@ func TestTerraformJoin(t *testing.T) { tempDir := t.TempDir() jwtPath := filepath.Join(tempDir, "token") require.NoError(t, os.WriteFile(jwtPath, []byte(jwt), 0600)) - require.NoError(t, os.Setenv(kubernetestoken.EnvVarCustomKubernetesTokenPath, jwtPath)) + require.NoError(t, os.Setenv(kubetoken.EnvVarCustomKubernetesTokenPath, jwtPath)) // Test setup: craft a Terraform provider configuration terraformConfig := fmt.Sprintf(` diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index fa494f166421c..a3c2deb6d0d69 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -928,6 +928,11 @@ func GenSchemaAppV3(ctx context.Context) (github_com_hashicorp_terraform_plugin_ Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, + "assignment_name": { + Description: "AssignmentID is the ID of the Teelport Account Assignment resource that represents this permission being assigned on the enclosing Account.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, "name": { Description: "Name is the human-readable name of the Permission Set.", Optional: true, @@ -993,6 +998,22 @@ func GenSchemaAppV3(ctx context.Context) (github_com_hashicorp_terraform_plugin_ Description: "Rewrite is a list of rewriting rules to apply to requests and responses.", Optional: true, }, + "tcp_ports": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "end_port": { + Description: "EndPort describes the end of the range, inclusive. If set, it must be between 2 and 65535 and be greater than Port when describing a port range. When omitted or set to zero, it signifies that the port range defines a single port.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.Int64Type, + }, + "port": { + Description: "Port describes the start of the range. It must be between 1 and 65535.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.Int64Type, + }, + }), + Description: "TCPPorts is a list of ports and port ranges that an app agent can forward connections to. Only applicable to TCP App Access. If this field is not empty, URI is expected to contain no port number and start with the tcp protocol.", + Optional: true, + }, "uri": { Description: "URI is the web app endpoint.", Optional: true, @@ -10914,6 +10935,23 @@ func CopyAppV3FromTerraform(_ context.Context, tf github_com_hashicorp_terraform } } } + { + a, ok := tf.Attrs["assignment_name"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.IdentityCenter.PermissionSets.AssignmentID"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.IdentityCenter.PermissionSets.AssignmentID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.AssignmentID = t + } + } + } } obj.PermissionSets[k] = t } @@ -10926,6 +10964,69 @@ func CopyAppV3FromTerraform(_ context.Context, tf github_com_hashicorp_terraform } } } + { + a, ok := tf.Attrs["tcp_ports"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.TCPPorts"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.TCPPorts", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.TCPPorts = make([]*github_com_gravitational_teleport_api_types.PortRange, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.TCPPorts", "github_com_hashicorp_terraform_plugin_framework_types.Object"}) + } else { + var t *github_com_gravitational_teleport_api_types.PortRange + if !v.Null && !v.Unknown { + tf := v + t = &github_com_gravitational_teleport_api_types.PortRange{} + obj := t + { + a, ok := tf.Attrs["port"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.TCPPorts.Port"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Int64) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.TCPPorts.Port", "github.com/hashicorp/terraform-plugin-framework/types.Int64"}) + } else { + var t uint32 + if !v.Null && !v.Unknown { + t = uint32(v.Value) + } + obj.Port = t + } + } + } + { + a, ok := tf.Attrs["end_port"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.TCPPorts.EndPort"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Int64) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.TCPPorts.EndPort", "github.com/hashicorp/terraform-plugin-framework/types.Int64"}) + } else { + var t uint32 + if !v.Null && !v.Unknown { + t = uint32(v.Value) + } + obj.EndPort = t + } + } + } + } + obj.TCPPorts[k] = t + } + } + } + } + } + } } } } @@ -12280,6 +12381,28 @@ func CopyAppV3ToTerraform(ctx context.Context, obj *github_com_gravitational_tel tf.Attrs["name"] = v } } + { + t, ok := tf.AttrTypes["assignment_name"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.IdentityCenter.PermissionSets.AssignmentID"}) + } else { + v, ok := tf.Attrs["assignment_name"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"AppV3.Spec.IdentityCenter.PermissionSets.AssignmentID", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.IdentityCenter.PermissionSets.AssignmentID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.AssignmentID) == "" + } + v.Value = string(obj.AssignmentID) + v.Unknown = false + tf.Attrs["assignment_name"] = v + } + } } v.Unknown = false c.Elems[k] = v @@ -12299,6 +12422,108 @@ func CopyAppV3ToTerraform(ctx context.Context, obj *github_com_gravitational_tel } } } + { + a, ok := tf.AttrTypes["tcp_ports"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.TCPPorts"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.TCPPorts", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["tcp_ports"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.TCPPorts)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.TCPPorts)) + } + } + if obj.TCPPorts != nil { + o := o.ElemType.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if len(obj.TCPPorts) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.TCPPorts)) + } + for k, a := range obj.TCPPorts { + v, ok := tf.Attrs["tcp_ports"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + if a == nil { + v.Null = true + } else { + obj := a + tf := &v + { + t, ok := tf.AttrTypes["port"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.TCPPorts.Port"}) + } else { + v, ok := tf.Attrs["port"].(github_com_hashicorp_terraform_plugin_framework_types.Int64) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"AppV3.Spec.TCPPorts.Port", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.Int64) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.TCPPorts.Port", "github.com/hashicorp/terraform-plugin-framework/types.Int64"}) + } + v.Null = int64(obj.Port) == 0 + } + v.Value = int64(obj.Port) + v.Unknown = false + tf.Attrs["port"] = v + } + } + { + t, ok := tf.AttrTypes["end_port"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.TCPPorts.EndPort"}) + } else { + v, ok := tf.Attrs["end_port"].(github_com_hashicorp_terraform_plugin_framework_types.Int64) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"AppV3.Spec.TCPPorts.EndPort", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.Int64) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.TCPPorts.EndPort", "github.com/hashicorp/terraform-plugin-framework/types.Int64"}) + } + v.Null = int64(obj.EndPort) == 0 + } + v.Value = int64(obj.EndPort) + v.Unknown = false + tf.Attrs["end_port"] = v + } + } + } + v.Unknown = false + c.Elems[k] = v + } + if len(obj.TCPPorts) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["tcp_ports"] = c + } + } + } } v.Unknown = false tf.Attrs["spec"] = v diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index d9ac852bba65b..d078d25d87b92 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -108,6 +108,8 @@ type Config struct { AutoUpdateService services.AutoUpdateServiceGetter ProvisioningStates services.ProvisioningStates IdentityCenter services.IdentityCenter + PluginStaticCredentials services.PluginStaticCredentials + GitServers services.GitServers } func (c *Config) CheckAndSetDefaults() error { @@ -205,6 +207,8 @@ func NewCache(cfg Config) (*cache.Cache, error) { DynamicWindowsDesktops: cfg.DynamicWindowsDesktops, ProvisioningStates: cfg.ProvisioningStates, IdentityCenter: cfg.IdentityCenter, + PluginStaticCredentials: cfg.PluginStaticCredentials, + GitServers: cfg.GitServers, } return cache.New(cfg.Setup(cacheCfg)) diff --git a/lib/auth/auth.go b/lib/auth/auth.go index d90b0d8a41c75..7e1a31640cdaa 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -100,8 +100,8 @@ import ( "github.com/gravitational/teleport/lib/githubactions" "github.com/gravitational/teleport/lib/gitlab" "github.com/gravitational/teleport/lib/inventory" + kubetoken "github.com/gravitational/teleport/lib/kube/token" kubeutils "github.com/gravitational/teleport/lib/kube/utils" - "github.com/gravitational/teleport/lib/kubernetestoken" "github.com/gravitational/teleport/lib/limiter" "github.com/gravitational/teleport/lib/loginrule" "github.com/gravitational/teleport/lib/modules" @@ -618,10 +618,10 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { as.tpmValidator = tpm.Validate } if as.k8sTokenReviewValidator == nil { - as.k8sTokenReviewValidator = &kubernetestoken.TokenReviewValidator{} + as.k8sTokenReviewValidator = &kubetoken.TokenReviewValidator{} } if as.k8sJWKSValidator == nil { - as.k8sJWKSValidator = kubernetestoken.ValidateTokenWithJWKS + as.k8sJWKSValidator = kubetoken.ValidateTokenWithJWKS } if as.gcpIDTokenValidator == nil { @@ -2212,6 +2212,10 @@ type certRequest struct { appName string // appURI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. appURI string + // appTargetPort signifies that the cert should grant access to a specific port in a multi-port + // TCP app, as long as the port is defined in the app spec. Used only for routing, should not be + // used in other contexts (e.g., access requests). + appTargetPort int // awsRoleARN is the role ARN to generate certificate for. awsRoleARN string // azureIdentity is the Azure identity to generate certificate for. @@ -2460,6 +2464,8 @@ type AppTestCertRequest struct { TTL time.Duration // PublicAddr is the application public address. Used for routing. PublicAddr string + // TargetPort is the port to which connections to multi-port TCP apps should be routed to. + TargetPort int // ClusterName is the name of the cluster application resides in. Used for routing. ClusterName string // SessionID is the optional session ID to encode. Used for routing. @@ -2519,6 +2525,7 @@ func (a *Server) GenerateUserAppTestCert(req AppTestCertRequest) ([]byte, error) // Add in the application routing information. appSessionID: sessionID, appPublicAddr: req.PublicAddr, + appTargetPort: req.TargetPort, appClusterName: req.ClusterName, awsRoleARN: req.AWSRoleARN, azureIdentity: req.AzureIdentity, @@ -3296,6 +3303,7 @@ func generateCert(ctx context.Context, a *Server, req certRequest, caType types. RouteToApp: tlsca.RouteToApp{ SessionID: req.appSessionID, URI: req.appURI, + TargetPort: req.appTargetPort, PublicAddr: req.appPublicAddr, ClusterName: req.appClusterName, Name: req.appName, diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index eee369828bd60..1ff0dbb4594d2 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -85,17 +85,17 @@ func (a *ServerWithRoles) actionForResource(resource types.Resource, kind string if resource != nil { sctx.Resource = resource } - return trace.Wrap(a.actionWithContext(sctx, apidefaults.Namespace, kind, verbs...)) + return trace.Wrap(a.actionWithContext(sctx, kind, verbs...)) } // actionWithContext will determine if a user has access given a services.Context. This call respects where clauses. -func (a *ServerWithRoles) actionWithContext(ctx *services.Context, namespace, resource string, verbs ...string) error { +func (a *ServerWithRoles) actionWithContext(ctx *services.Context, resource string, verbs ...string) error { if len(verbs) == 0 { return trace.BadParameter("no verbs provided for authorization check on resource %q", resource) } var errs []error for _, verb := range verbs { - errs = append(errs, a.context.Checker.CheckAccessToRule(ctx, namespace, resource, verb)) + errs = append(errs, a.context.Checker.CheckAccessToRule(ctx, apidefaults.Namespace, resource, verb)) } if err := trace.NewAggregate(errs...); err != nil { return err @@ -103,28 +103,13 @@ func (a *ServerWithRoles) actionWithContext(ctx *services.Context, namespace, re return nil } -type actionConfig struct { - context authz.Context -} - -type actionOption func(*actionConfig) - -func (a *ServerWithRoles) withOptions(opts ...actionOption) actionConfig { - cfg := actionConfig{context: a.context} - for _, opt := range opts { - opt(&cfg) - } - return cfg -} - -// action will determine if a user has access to the given resource kind. This does not respect where clauses. -func (c actionConfig) action(namespace, resource string, verbs ...string) error { +func (a *ServerWithRoles) actionNamespace(namespace, resource string, verbs ...string) error { if len(verbs) == 0 { return trace.BadParameter("no verbs provided for authorization check on resource %q", resource) } var errs []error for _, verb := range verbs { - errs = append(errs, c.context.Checker.CheckAccessToRule(&services.Context{User: c.context.User}, namespace, resource, verb)) + errs = append(errs, a.context.Checker.CheckAccessToRule(&services.Context{User: a.context.User}, namespace, resource, verb)) } if err := trace.NewAggregate(errs...); err != nil { return err @@ -132,8 +117,8 @@ func (c actionConfig) action(namespace, resource string, verbs ...string) error return nil } -func (a *ServerWithRoles) action(namespace, resource string, verbs ...string) error { - return a.withOptions().action(namespace, resource, verbs...) +func (a *ServerWithRoles) action(resource string, verbs ...string) error { + return a.actionNamespace(apidefaults.Namespace, resource, verbs...) } // currentUserAction is a special checker that allows certain actions for users @@ -151,9 +136,9 @@ func (a *ServerWithRoles) currentUserAction(username string) error { // connectors. It first checks if you have access to the specific connector. // If not, it checks if the requester has the meta KindAuthConnector access // (which grants access to all connectors). -func (a *ServerWithRoles) authConnectorAction(namespace string, resource string, verb string) error { - if err := a.context.Checker.CheckAccessToRule(&services.Context{User: a.context.User}, namespace, resource, verb); err != nil { - if err := a.context.Checker.CheckAccessToRule(&services.Context{User: a.context.User}, namespace, types.KindAuthConnector, verb); err != nil { +func (a *ServerWithRoles) authConnectorAction(resource string, verb string) error { + if err := a.context.Checker.CheckAccessToRule(&services.Context{User: a.context.User}, apidefaults.Namespace, resource, verb); err != nil { + if err := a.context.Checker.CheckAccessToRule(&services.Context{User: a.context.User}, apidefaults.Namespace, types.KindAuthConnector, verb); err != nil { return trace.Wrap(err) } } @@ -162,14 +147,14 @@ func (a *ServerWithRoles) authConnectorAction(namespace string, resource string, // actionForListWithCondition extracts a restrictive filter condition to be // added to a list query after a simple resource check fails. -func (a *ServerWithRoles) actionForListWithCondition(namespace, resource, identifier string) (*types.WhereExpr, error) { - origErr := a.action(namespace, resource, types.VerbList) +func (a *ServerWithRoles) actionForListWithCondition(resource, identifier string) (*types.WhereExpr, error) { + origErr := a.action(resource, types.VerbList) if origErr == nil || !trace.IsAccessDenied(origErr) { return nil, trace.Wrap(origErr) } - cond, err := a.context.Checker.ExtractConditionForIdentifier(&services.Context{User: a.context.User}, namespace, resource, types.VerbList, identifier) + cond, err := a.context.Checker.ExtractConditionForIdentifier(&services.Context{User: a.context.User}, apidefaults.Namespace, resource, types.VerbList, identifier) if trace.IsAccessDenied(err) { - log.WithError(err).Infof("Access to %v %v in namespace %v denied to %v.", types.VerbList, resource, namespace, a.context.Checker) + log.WithError(err).Infof("Access to %v %v in namespace %v denied to %v.", types.VerbList, resource, apidefaults.Namespace, a.context.Checker) // Return the original AccessDenied to avoid leaking information. return nil, trace.Wrap(origErr) } @@ -178,9 +163,9 @@ func (a *ServerWithRoles) actionForListWithCondition(namespace, resource, identi // actionWithExtendedContext performs an additional RBAC check with extended // rule context after a simple resource check fails. -func (a *ServerWithRoles) actionWithExtendedContext(namespace, kind, verb string, extendContext func(*services.Context) error) error { +func (a *ServerWithRoles) actionWithExtendedContext(kind, verb string, extendContext func(*services.Context) error) error { ruleCtx := &services.Context{User: a.context.User} - origErr := a.context.Checker.CheckAccessToRule(ruleCtx, namespace, kind, verb) + origErr := a.context.Checker.CheckAccessToRule(ruleCtx, apidefaults.Namespace, kind, verb) if origErr == nil || !trace.IsAccessDenied(origErr) { return trace.Wrap(origErr) } @@ -189,13 +174,13 @@ func (a *ServerWithRoles) actionWithExtendedContext(namespace, kind, verb string // Return the original AccessDenied to avoid leaking information. return trace.Wrap(origErr) } - return trace.Wrap(a.context.Checker.CheckAccessToRule(ruleCtx, namespace, kind, verb)) + return trace.Wrap(a.context.Checker.CheckAccessToRule(ruleCtx, apidefaults.Namespace, kind, verb)) } // actionForKindSession is a special checker that grants access to session // recordings. It can allow access to a specific recording based on the // `where` section of the user's access rule for kind `session`. -func (a *ServerWithRoles) actionForKindSession(ctx context.Context, namespace string, sid session.ID) (types.SessionKind, error) { +func (a *ServerWithRoles) actionForKindSession(ctx context.Context, sid session.ID) (types.SessionKind, error) { sessionEnd, err := a.findSessionEndEvent(ctx, sid) extendContext := func(ctx *services.Context) error { @@ -218,7 +203,7 @@ func (a *ServerWithRoles) actionForKindSession(ctx context.Context, namespace st sessionKind = types.WindowsDesktopSessionKind } - return sessionKind, trace.Wrap(a.actionWithExtendedContext(namespace, types.KindSession, types.VerbRead, extendContext)) + return sessionKind, trace.Wrap(a.actionWithExtendedContext(types.KindSession, types.VerbRead, extendContext)) } // localServerAction returns an access denied error if the role is not one of the builtin server roles. @@ -570,7 +555,7 @@ func (a *ServerWithRoles) GenerateOpenSSHCert(ctx context.Context, req *proto.Op // CompareAndSwapCertAuthority updates existing cert authority if the existing cert authority // value matches the value stored in the backend. func (a *ServerWithRoles) CompareAndSwapCertAuthority(new, existing types.CertAuthority) error { - if err := a.action(apidefaults.Namespace, types.KindCertAuthority, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindCertAuthority, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.CompareAndSwapCertAuthority(new, existing) @@ -800,7 +785,7 @@ func (a *ServerWithRoles) RegisterInventoryControlStream(ics client.UpstreamInve } func (a *ServerWithRoles) GetInventoryStatus(ctx context.Context, req proto.InventoryStatusRequest) (proto.InventoryStatusSummary, error) { - if err := a.action(apidefaults.Namespace, types.KindInstance, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindInstance, types.VerbList, types.VerbRead); err != nil { return proto.InventoryStatusSummary{}, trace.Wrap(err) } @@ -833,22 +818,13 @@ func (a *ServerWithRoles) PingInventory(ctx context.Context, req proto.Inventory } func (a *ServerWithRoles) GetInstances(ctx context.Context, filter types.InstanceFilter) stream.Stream[types.Instance] { - if err := a.action(apidefaults.Namespace, types.KindInstance, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindInstance, types.VerbList, types.VerbRead); err != nil { return stream.Fail[types.Instance](trace.Wrap(err)) } return a.authServer.GetInstances(ctx, filter) } -// GetNodeStream returns a stream of nodes. -func (a *ServerWithRoles) GetNodeStream(ctx context.Context, namespace string) stream.Stream[types.Server] { - if err := a.action(namespace, types.KindNode, types.VerbList, types.VerbRead); err != nil { - return stream.Fail[types.Server](trace.Wrap(err)) - } - - return a.authServer.GetNodeStream(ctx, namespace) -} - func (a *ServerWithRoles) GetClusterAlerts(ctx context.Context, query types.GetClusterAlertsRequest) ([]types.ClusterAlert, error) { // unauthenticated clients can never check for alerts. we don't normally explicitly // check for this kind of thing, but since alerts use an unusual access-control @@ -877,7 +853,7 @@ func (a *ServerWithRoles) GetClusterAlerts(ctx context.Context, query types.GetC // with permissions to view all resources of kind 'cluster_alert' can opt into viewing all alerts // regardless of labels for management/debug purposes. var resourceLevelPermit bool - if query.WithUntargeted && a.action(apidefaults.Namespace, types.KindClusterAlert, types.VerbRead, types.VerbList) == nil { + if query.WithUntargeted && a.action(types.KindClusterAlert, types.VerbRead, types.VerbList) == nil { resourceLevelPermit = true } @@ -916,7 +892,7 @@ Outer: continue Verbs } - if a.action(apidefaults.Namespace, rv[0], rv[1]) == nil { + if a.action(rv[0], rv[1]) == nil { // user holds at least one of the resource:verb pairs specified by // the verb-permit label. filtered = append(filtered, alert) @@ -956,7 +932,7 @@ Outer: } func (a *ServerWithRoles) UpsertClusterAlert(ctx context.Context, alert types.ClusterAlert) error { - if err := a.action(apidefaults.Namespace, types.KindClusterAlert, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindClusterAlert, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -965,7 +941,7 @@ func (a *ServerWithRoles) UpsertClusterAlert(ctx context.Context, alert types.Cl func (a *ServerWithRoles) CreateAlertAck(ctx context.Context, ack types.AlertAcknowledgement) error { // we treat alert acks as an extension of the cluster alert resource rather than its own resource - if err := a.action(apidefaults.Namespace, types.KindClusterAlert, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindClusterAlert, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -974,7 +950,7 @@ func (a *ServerWithRoles) CreateAlertAck(ctx context.Context, ack types.AlertAck func (a *ServerWithRoles) GetAlertAcks(ctx context.Context) ([]types.AlertAcknowledgement, error) { // we treat alert acks as an extension of the cluster alert resource rather than its own resource. - if err := a.action(apidefaults.Namespace, types.KindClusterAlert, types.VerbRead, types.VerbList); err != nil { + if err := a.action(types.KindClusterAlert, types.VerbRead, types.VerbList); err != nil { return nil, trace.Wrap(err) } @@ -983,7 +959,7 @@ func (a *ServerWithRoles) GetAlertAcks(ctx context.Context) ([]types.AlertAcknow func (a *ServerWithRoles) ClearAlertAcks(ctx context.Context, req proto.ClearAlertAcksRequest) error { // we treat alert acks as an extension of the cluster alert resource rather than its own resource - if err := a.action(apidefaults.Namespace, types.KindClusterAlert, types.VerbDelete); err != nil { + if err := a.action(types.KindClusterAlert, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -991,7 +967,8 @@ func (a *ServerWithRoles) ClearAlertAcks(ctx context.Context, req proto.ClearAle } func (a *ServerWithRoles) UpsertNode(ctx context.Context, s types.Server) (*types.KeepAlive, error) { - if err := a.action(s.GetNamespace(), types.KindNode, types.VerbCreate, types.VerbUpdate); err != nil { + // Note: UpsertNode doesn't allow any namespaces but "default". + if err := a.action(types.KindNode, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } return a.authServer.UpsertNode(ctx, s) @@ -1016,7 +993,7 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep if !a.hasBuiltinRole(types.RoleNode) { return trace.AccessDenied("access denied") } - if err := a.action(apidefaults.Namespace, types.KindNode, types.VerbUpdate); err != nil { + if err := a.action(types.KindNode, types.VerbUpdate); err != nil { return trace.Wrap(err) } case constants.KeepAliveApp: @@ -1032,7 +1009,7 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep if !a.hasBuiltinRole(types.RoleApp) && !a.hasBuiltinRole(types.RoleOkta) { return trace.AccessDenied("access denied") } - if err := a.action(apidefaults.Namespace, types.KindAppServer, types.VerbUpdate); err != nil { + if err := a.action(types.KindAppServer, types.VerbUpdate); err != nil { return trace.Wrap(err) } case constants.KeepAliveDatabase: @@ -1045,7 +1022,7 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep if !a.hasBuiltinRole(types.RoleDatabase) { return trace.AccessDenied("access denied") } - if err := a.action(apidefaults.Namespace, types.KindDatabaseServer, types.VerbUpdate); err != nil { + if err := a.action(types.KindDatabaseServer, types.VerbUpdate); err != nil { return trace.Wrap(err) } case constants.KeepAliveWindowsDesktopService: @@ -1055,7 +1032,7 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep if !a.hasBuiltinRole(types.RoleWindowsDesktop) { return trace.AccessDenied("access denied") } - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktopService, types.VerbUpdate); err != nil { + if err := a.action(types.KindWindowsDesktopService, types.VerbUpdate); err != nil { return trace.Wrap(err) } case constants.KeepAliveKube: @@ -1069,7 +1046,7 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep if !a.hasBuiltinRole(types.RoleKube, types.RoleProxy) { return trace.AccessDenied("access denied") } - if err := a.action(apidefaults.Namespace, types.KindKubeServer, types.VerbUpdate); err != nil { + if err := a.action(types.KindKubeServer, types.VerbUpdate); err != nil { return trace.Wrap(err) } case constants.KeepAliveDatabaseService: @@ -1079,7 +1056,7 @@ func (a *ServerWithRoles) KeepAliveServer(ctx context.Context, handle types.Keep if !a.hasBuiltinRole(types.RoleDatabase) { return trace.AccessDenied("access denied") } - if err := a.action(apidefaults.Namespace, types.KindDatabaseService, types.VerbUpdate); err != nil { + if err := a.action(types.KindDatabaseService, types.VerbUpdate); err != nil { return trace.Wrap(err) } default: @@ -1197,12 +1174,12 @@ func (a *ServerWithRoles) hasWatchPermissionForKind(kind types.WatchKind) error return nil } - return trace.Wrap(a.action(apidefaults.Namespace, kind.Kind, verb)) + return trace.Wrap(a.action(kind.Kind, verb)) } // DeleteAllNodes deletes all nodes in a given namespace func (a *ServerWithRoles) DeleteAllNodes(ctx context.Context, namespace string) error { - if err := a.action(namespace, types.KindNode, types.VerbDelete); err != nil { + if err := a.actionNamespace(namespace, types.KindNode, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAllNodes(ctx, namespace) @@ -1210,7 +1187,7 @@ func (a *ServerWithRoles) DeleteAllNodes(ctx context.Context, namespace string) // DeleteNode deletes node in the namespace func (a *ServerWithRoles) DeleteNode(ctx context.Context, namespace, node string) error { - if err := a.action(namespace, types.KindNode, types.VerbDelete); err != nil { + if err := a.actionNamespace(namespace, types.KindNode, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteNode(ctx, namespace, node) @@ -1218,7 +1195,7 @@ func (a *ServerWithRoles) DeleteNode(ctx context.Context, namespace, node string // GetNode gets a node by name and namespace. func (a *ServerWithRoles) GetNode(ctx context.Context, namespace, name string) (types.Server, error) { - if err := a.action(namespace, types.KindNode, types.VerbRead); err != nil { + if err := a.actionNamespace(namespace, types.KindNode, types.VerbRead); err != nil { return nil, trace.Wrap(err) } node, err := a.authServer.GetNode(ctx, namespace, name) @@ -1352,7 +1329,7 @@ func (a *ServerWithRoles) ListUnifiedResources(ctx context.Context, req *proto.L actionVerbs = []string{types.VerbList} } - resourceAccess.kindAccessMap[kind] = a.action(apidefaults.Namespace, kind, actionVerbs...) + resourceAccess.kindAccessMap[kind] = a.action(kind, actionVerbs...) } // Before doing any listing, verify that the user is allowed to list @@ -1487,7 +1464,7 @@ func (a *ServerWithRoles) ListUnifiedResources(ctx context.Context, req *proto.L } func (a *ServerWithRoles) GetNodes(ctx context.Context, namespace string) ([]types.Server, error) { - if err := a.action(namespace, types.KindNode, types.VerbList); err != nil { + if err := a.actionNamespace(namespace, types.KindNode, types.VerbList); err != nil { return nil, trace.Wrap(err) } @@ -1689,13 +1666,14 @@ func (a *ServerWithRoles) ListResources(ctx context.Context, req proto.ListResou types.KindWindowsDesktop, types.KindWindowsDesktopService, types.KindUserGroup, - types.KindSAMLIdPServiceProvider: + types.KindSAMLIdPServiceProvider, + types.KindIdentityCenterAccount: default: return nil, trace.NotImplemented("resource type %s does not support pagination", req.ResourceType) } - if err := a.action(req.Namespace, req.ResourceType, actionVerbs...); err != nil { + if err := a.actionNamespace(req.Namespace, req.ResourceType, actionVerbs...); err != nil { return nil, trace.Wrap(err) } @@ -1898,7 +1876,7 @@ func (a *ServerWithRoles) listResourcesWithSort(ctx context.Context, req proto.L // Only add SAMLIdPServiceProviders to the list if the caller has an enterprise license. if modules.GetModules().BuildType() == modules.BuildEnterprise { // Only attempt to list SAMLIdPServiceProviders if the caller has the permission to. - if err := a.action(req.Namespace, types.KindSAMLIdPServiceProvider, types.VerbList); err == nil { + if err := a.action(types.KindSAMLIdPServiceProvider, types.VerbList); err == nil { var serviceProviders []types.SAMLIdPServiceProvider var startKey string for { @@ -2047,14 +2025,14 @@ func (a *ServerWithRoles) listResourcesWithSort(ctx context.Context, req proto.L } func (a *ServerWithRoles) UpsertAuthServer(ctx context.Context, s types.Server) error { - if err := a.action(apidefaults.Namespace, types.KindAuthServer, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindAuthServer, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.UpsertAuthServer(ctx, s) } func (a *ServerWithRoles) GetAuthServers() ([]types.Server, error) { - if err := a.action(apidefaults.Namespace, types.KindAuthServer, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindAuthServer, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetAuthServers() @@ -2062,7 +2040,7 @@ func (a *ServerWithRoles) GetAuthServers() ([]types.Server, error) { // DeleteAllAuthServers deletes all auth servers func (a *ServerWithRoles) DeleteAllAuthServers() error { - if err := a.action(apidefaults.Namespace, types.KindAuthServer, types.VerbDelete); err != nil { + if err := a.action(types.KindAuthServer, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAllAuthServers() @@ -2070,21 +2048,21 @@ func (a *ServerWithRoles) DeleteAllAuthServers() error { // DeleteAuthServer deletes auth server by name func (a *ServerWithRoles) DeleteAuthServer(name string) error { - if err := a.action(apidefaults.Namespace, types.KindAuthServer, types.VerbDelete); err != nil { + if err := a.action(types.KindAuthServer, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAuthServer(name) } func (a *ServerWithRoles) UpsertProxy(ctx context.Context, s types.Server) error { - if err := a.action(apidefaults.Namespace, types.KindProxy, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindProxy, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.UpsertProxy(ctx, s) } func (a *ServerWithRoles) GetProxies() ([]types.Server, error) { - if err := a.action(apidefaults.Namespace, types.KindProxy, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindProxy, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetProxies() @@ -2092,7 +2070,7 @@ func (a *ServerWithRoles) GetProxies() ([]types.Server, error) { // DeleteAllProxies deletes all proxies func (a *ServerWithRoles) DeleteAllProxies() error { - if err := a.action(apidefaults.Namespace, types.KindProxy, types.VerbDelete); err != nil { + if err := a.action(types.KindProxy, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAllProxies() @@ -2100,7 +2078,7 @@ func (a *ServerWithRoles) DeleteAllProxies() error { // DeleteProxy deletes proxy by name func (a *ServerWithRoles) DeleteProxy(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindProxy, types.VerbDelete); err != nil { + if err := a.action(types.KindProxy, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteProxy(ctx, name) @@ -2108,7 +2086,7 @@ func (a *ServerWithRoles) DeleteProxy(ctx context.Context, name string) error { // TODO(noah): DELETE IN 18.0.0 - all these methods are now gRPC. func (a *ServerWithRoles) UpsertReverseTunnel(ctx context.Context, r types.ReverseTunnel) error { - if err := a.action(apidefaults.Namespace, types.KindReverseTunnel, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindReverseTunnel, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.UpsertReverseTunnel(ctx, r) @@ -2116,7 +2094,7 @@ func (a *ServerWithRoles) UpsertReverseTunnel(ctx context.Context, r types.Rever // TODO(noah): DELETE IN 18.0.0 - all these methods are now gRPC. func (a *ServerWithRoles) GetReverseTunnels(ctx context.Context, opts ...services.MarshalOption) ([]types.ReverseTunnel, error) { - if err := a.action(apidefaults.Namespace, types.KindReverseTunnel, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindReverseTunnel, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetReverseTunnels(ctx) @@ -2124,14 +2102,14 @@ func (a *ServerWithRoles) GetReverseTunnels(ctx context.Context, opts ...service // TODO(noah): DELETE IN 18.0.0 - all these methods are now gRPC. func (a *ServerWithRoles) DeleteReverseTunnel(ctx context.Context, domainName string) error { - if err := a.action(apidefaults.Namespace, types.KindReverseTunnel, types.VerbDelete); err != nil { + if err := a.action(types.KindReverseTunnel, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteReverseTunnel(ctx, domainName) } func (a *ServerWithRoles) DeleteToken(ctx context.Context, token string) error { - if err := a.action(apidefaults.Namespace, types.KindToken, types.VerbDelete); err != nil { + if err := a.action(types.KindToken, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -2143,7 +2121,7 @@ func (a *ServerWithRoles) DeleteToken(ctx context.Context, token string) error { } func (a *ServerWithRoles) GetTokens(ctx context.Context) ([]types.ProvisionToken, error) { - if err := a.action(apidefaults.Namespace, types.KindToken, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindToken, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -2158,7 +2136,7 @@ func (a *ServerWithRoles) GetToken(ctx context.Context, token string) (types.Pro // The Proxy has permission to look up tokens by name in order to validate // attempts to use the node join script. if isProxy := a.hasBuiltinRole(types.RoleProxy); !isProxy { - if err := a.action(apidefaults.Namespace, types.KindToken, types.VerbRead); err != nil { + if err := a.action(types.KindToken, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -2227,7 +2205,7 @@ func emitTokenEvent(ctx context.Context, e apievents.Emitter, token types.Provis } func (a *ServerWithRoles) UpsertToken(ctx context.Context, token types.ProvisionToken) error { - if err := a.action(apidefaults.Namespace, types.KindToken, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindToken, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -2249,7 +2227,7 @@ func (a *ServerWithRoles) UpsertToken(ctx context.Context, token types.Provision } func (a *ServerWithRoles) CreateToken(ctx context.Context, token types.ProvisionToken) error { - if err := a.action(apidefaults.Namespace, types.KindToken, types.VerbCreate); err != nil { + if err := a.action(types.KindToken, types.VerbCreate); err != nil { return trace.Wrap(err) } @@ -2322,7 +2300,7 @@ func (a *ServerWithRoles) WebSessions() types.WebSessionInterface { // Get returns the web session specified with req. func (r *webSessionsWithRoles) Get(ctx context.Context, req types.GetWebSessionRequest) (types.WebSession, error) { - if err := r.c.action(apidefaults.Namespace, types.KindWebSession, types.VerbRead); err != nil { + if err := r.c.action(types.KindWebSession, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return r.ws.Get(ctx, req) @@ -2330,10 +2308,10 @@ func (r *webSessionsWithRoles) Get(ctx context.Context, req types.GetWebSessionR // List returns the list of all web sessions. func (r *webSessionsWithRoles) List(ctx context.Context) ([]types.WebSession, error) { - if err := r.c.action(apidefaults.Namespace, types.KindWebSession, types.VerbList); err != nil { + if err := r.c.action(types.KindWebSession, types.VerbList); err != nil { return nil, trace.Wrap(err) } - if err := r.c.action(apidefaults.Namespace, types.KindWebSession, types.VerbRead); err != nil { + if err := r.c.action(types.KindWebSession, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return r.ws.List(ctx) @@ -2360,10 +2338,10 @@ func (r *webSessionsWithRoles) Delete(ctx context.Context, req types.DeleteWebSe // DeleteAll removes all web sessions. func (r *webSessionsWithRoles) DeleteAll(ctx context.Context) error { - if err := r.c.action(apidefaults.Namespace, types.KindWebSession, types.VerbList); err != nil { + if err := r.c.action(types.KindWebSession, types.VerbList); err != nil { return trace.Wrap(err) } - if err := r.c.action(apidefaults.Namespace, types.KindWebSession, types.VerbDelete); err != nil { + if err := r.c.action(types.KindWebSession, types.VerbDelete); err != nil { return trace.Wrap(err) } return r.ws.DeleteAll(ctx) @@ -2389,7 +2367,7 @@ func (a *ServerWithRoles) WebTokens() types.WebTokenInterface { // Get returns the web token specified with req. func (r *webTokensWithRoles) Get(ctx context.Context, req types.GetWebTokenRequest) (types.WebToken, error) { if err := r.c.currentUserAction(req.User); err != nil { - if err := r.c.action(apidefaults.Namespace, types.KindWebToken, types.VerbRead); err != nil { + if err := r.c.action(types.KindWebToken, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -2398,7 +2376,7 @@ func (r *webTokensWithRoles) Get(ctx context.Context, req types.GetWebTokenReque // List returns the list of all web tokens. func (r *webTokensWithRoles) List(ctx context.Context) ([]types.WebToken, error) { - if err := r.c.action(apidefaults.Namespace, types.KindWebToken, types.VerbList); err != nil { + if err := r.c.action(types.KindWebToken, types.VerbList); err != nil { return nil, trace.Wrap(err) } return r.t.List(ctx) @@ -2414,7 +2392,7 @@ func (*webTokensWithRoles) Upsert(ctx context.Context, session types.WebToken) e // Delete removes the web token specified with req. func (r *webTokensWithRoles) Delete(ctx context.Context, req types.DeleteWebTokenRequest) error { if err := r.c.currentUserAction(req.User); err != nil { - if err := r.c.action(apidefaults.Namespace, types.KindWebToken, types.VerbDelete); err != nil { + if err := r.c.action(types.KindWebToken, types.VerbDelete); err != nil { return trace.Wrap(err) } } @@ -2423,10 +2401,10 @@ func (r *webTokensWithRoles) Delete(ctx context.Context, req types.DeleteWebToke // DeleteAll removes all web tokens. func (r *webTokensWithRoles) DeleteAll(ctx context.Context) error { - if err := r.c.action(apidefaults.Namespace, types.KindWebToken, types.VerbList); err != nil { + if err := r.c.action(types.KindWebToken, types.VerbList); err != nil { return trace.Wrap(err) } - if err := r.c.action(apidefaults.Namespace, types.KindWebToken, types.VerbDelete); err != nil { + if err := r.c.action(types.KindWebToken, types.VerbDelete); err != nil { return trace.Wrap(err) } return r.t.DeleteAll(ctx) @@ -2438,7 +2416,7 @@ type webTokensWithRoles struct { } type accessChecker interface { - action(namespace, resource string, verbs ...string) error + action(resource string, verbs ...string) error currentUserAction(user string) error canDeleteWebSession(username string) error } @@ -2478,7 +2456,7 @@ func (a *ServerWithRoles) ListAccessRequests(ctx context.Context, req *proto.Lis // and will be overwritten if set elsewhere req.Filter.Requester = a.context.User.GetName() - if err := a.action(apidefaults.Namespace, types.KindAccessRequest, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindAccessRequest, types.VerbList, types.VerbRead); err != nil { // Users are allowed to read + list their own access requests and // requests they are allowed to review, unless access was *explicitly* // denied. This means deny rules block the action but allow rules are @@ -2546,7 +2524,7 @@ func (a *ServerWithRoles) ListAccessRequests(ctx context.Context, req *proto.Lis } func (a *ServerWithRoles) CreateAccessRequestV2(ctx context.Context, req types.AccessRequest) (types.AccessRequest, error) { - if err := a.action(apidefaults.Namespace, types.KindAccessRequest, types.VerbCreate); err != nil { + if err := a.action(types.KindAccessRequest, types.VerbCreate); err != nil { // An exception is made to allow users to create *pending* access requests // for themselves unless the create verb was explicitly denied. if services.IsAccessExplicitlyDenied(err) || !req.GetState().IsPending() || a.currentUserAction(req.GetUser()) != nil { @@ -2581,7 +2559,7 @@ func (a *ServerWithRoles) CreateAccessRequestV2(ctx context.Context, req types.A } func (a *ServerWithRoles) SetAccessRequestState(ctx context.Context, params types.AccessRequestUpdate) error { - if err := a.action(apidefaults.Namespace, types.KindAccessRequest, types.VerbUpdate); err != nil { + if err := a.action(types.KindAccessRequest, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -2673,10 +2651,10 @@ func (a *ServerWithRoles) GetAccessCapabilities(ctx context.Context, req types.A // all users can check their own capabilities if a.currentUserAction(req.User) != nil { - if err := a.action(apidefaults.Namespace, types.KindUser, types.VerbRead); err != nil { + if err := a.action(types.KindUser, types.VerbRead); err != nil { return nil, trace.Wrap(err) } - if err := a.action(apidefaults.Namespace, types.KindRole, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindRole, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -2690,13 +2668,13 @@ func (a *ServerWithRoles) GetPluginData(ctx context.Context, filter types.Plugin case types.KindAccessRequest, types.KindAccessList: // for backwards compatibility, we allow list/read against kinds to also grant list/read for // access request related plugin data. - if a.action(apidefaults.Namespace, filter.Kind, types.VerbList) != nil { - if err := a.action(apidefaults.Namespace, types.KindAccessPluginData, types.VerbList); err != nil { + if a.action(filter.Kind, types.VerbList) != nil { + if err := a.action(types.KindAccessPluginData, types.VerbList); err != nil { return nil, trace.Wrap(err) } } - if a.action(apidefaults.Namespace, filter.Kind, types.VerbRead) != nil { - if err := a.action(apidefaults.Namespace, types.KindAccessPluginData, types.VerbRead); err != nil { + if a.action(filter.Kind, types.VerbRead) != nil { + if err := a.action(types.KindAccessPluginData, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -2712,8 +2690,8 @@ func (a *ServerWithRoles) UpdatePluginData(ctx context.Context, params types.Plu case types.KindAccessRequest, types.KindAccessList: // for backwards compatibility, we allow update against access requests to also grant update for // access request related plugin data. - if a.action(apidefaults.Namespace, params.Kind, types.VerbUpdate) != nil { - if err := a.action(apidefaults.Namespace, types.KindAccessPluginData, types.VerbUpdate); err != nil { + if a.action(params.Kind, types.VerbUpdate) != nil { + if err := a.action(types.KindAccessPluginData, types.VerbUpdate); err != nil { return trace.Wrap(err) } } @@ -2732,7 +2710,7 @@ func (a *ServerWithRoles) Ping(ctx context.Context) (proto.PingResponse, error) } func (a *ServerWithRoles) DeleteAccessRequest(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindAccessRequest, types.VerbDelete); err != nil { + if err := a.action(types.KindAccessRequest, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -3174,6 +3152,7 @@ func (a *ServerWithRoles) generateUserCerts(ctx context.Context, req proto.UserC DeviceExtensions: DeviceExtensions(a.context.Identity.GetIdentity().DeviceExtensions), AppName: req.RouteToApp.Name, AppURI: req.RouteToApp.URI, + AppTargetPort: int(req.RouteToApp.TargetPort), }) if err != nil { return nil, trace.Wrap(err) @@ -3218,6 +3197,7 @@ func (a *ServerWithRoles) generateUserCerts(ctx context.Context, req proto.UserC appName: req.RouteToApp.Name, appPublicAddr: req.RouteToApp.PublicAddr, appURI: req.RouteToApp.URI, + appTargetPort: int(req.RouteToApp.TargetPort), appClusterName: req.RouteToApp.ClusterName, awsRoleARN: req.RouteToApp.AWSRoleARN, azureIdentity: req.RouteToApp.AzureIdentity, @@ -3340,7 +3320,7 @@ func (a *ServerWithRoles) verifyUserDeviceForCertIssuance(usage proto.UserCertsR } func (a *ServerWithRoles) CreateResetPasswordToken(ctx context.Context, req authclient.CreateUserTokenRequest) (types.UserToken, error) { - if err := a.action(apidefaults.Namespace, types.KindUser, types.VerbUpdate); err != nil { + if err := a.action(types.KindUser, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } @@ -3445,7 +3425,7 @@ func hasOneNonPresetUser(users []types.User) bool { // backend's value does not match the expected value. // Captures the auth user who modified the user record. func (a *ServerWithRoles) CompareAndSwapUser(ctx context.Context, new, existing types.User) error { - if err := a.action(apidefaults.Namespace, types.KindUser, types.VerbUpdate); err != nil { + if err := a.action(types.KindUser, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -3467,10 +3447,10 @@ func (a *ServerWithRoles) CompareAndSwapUser(ctx context.Context, new, existing // UpsertOIDCConnector creates or updates an OIDC connector. func (a *ServerWithRoles) UpsertOIDCConnector(ctx context.Context, connector types.OIDCConnector) (types.OIDCConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbCreate); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbUpdate); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } if !modules.GetModules().Features().GetEntitlement(entitlements.OIDC).Enabled { @@ -3491,7 +3471,7 @@ func (a *ServerWithRoles) UpsertOIDCConnector(ctx context.Context, connector typ // UpdateOIDCConnector updates an existing OIDC connector. func (a *ServerWithRoles) UpdateOIDCConnector(ctx context.Context, connector types.OIDCConnector) (types.OIDCConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbUpdate); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } if !modules.GetModules().Features().GetEntitlement(entitlements.OIDC).Enabled { @@ -3511,7 +3491,7 @@ func (a *ServerWithRoles) UpdateOIDCConnector(ctx context.Context, connector typ // CreateOIDCConnector creates a new OIDC connector. func (a *ServerWithRoles) CreateOIDCConnector(ctx context.Context, connector types.OIDCConnector) (types.OIDCConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbCreate); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } if !modules.GetModules().Features().GetEntitlement(entitlements.OIDC).Enabled { @@ -3531,11 +3511,11 @@ func (a *ServerWithRoles) CreateOIDCConnector(ctx context.Context, connector typ } func (a *ServerWithRoles) GetOIDCConnector(ctx context.Context, id string, withSecrets bool) (types.OIDCConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbReadNoSecrets); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbReadNoSecrets); err != nil { return nil, trace.Wrap(err) } if withSecrets { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbRead); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -3543,14 +3523,14 @@ func (a *ServerWithRoles) GetOIDCConnector(ctx context.Context, id string, withS } func (a *ServerWithRoles) GetOIDCConnectors(ctx context.Context, withSecrets bool) ([]types.OIDCConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbList); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbList); err != nil { return nil, trace.Wrap(err) } - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbReadNoSecrets); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbReadNoSecrets); err != nil { return nil, trace.Wrap(err) } if withSecrets { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbRead); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -3565,7 +3545,7 @@ func (a *ServerWithRoles) CreateOIDCAuthRequest(ctx context.Context, req types.O return nil, trace.AccessDenied("OIDC is only available in Teleport Enterprise") } - if err := a.action(apidefaults.Namespace, types.KindOIDCRequest, types.VerbCreate); err != nil { + if err := a.action(types.KindOIDCRequest, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } @@ -3575,7 +3555,7 @@ func (a *ServerWithRoles) CreateOIDCAuthRequest(ctx context.Context, req types.O // require additional permissions for executing SSO test flow. if req.SSOTestFlow { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbCreate); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } } @@ -3596,7 +3576,7 @@ func (a *ServerWithRoles) CreateOIDCAuthRequest(ctx context.Context, req types.O // GetOIDCAuthRequest returns OIDC auth request if found. func (a *ServerWithRoles) GetOIDCAuthRequest(ctx context.Context, id string) (*types.OIDCAuthRequest, error) { - if err := a.action(apidefaults.Namespace, types.KindOIDCRequest, types.VerbRead); err != nil { + if err := a.action(types.KindOIDCRequest, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -3619,7 +3599,7 @@ func (a *ServerWithRoles) ValidateOIDCAuthCallback(ctx context.Context, q url.Va } func (a *ServerWithRoles) DeleteOIDCConnector(ctx context.Context, connectorID string) error { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindOIDC, types.VerbDelete); err != nil { + if err := a.authConnectorAction(types.KindOIDC, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -3636,11 +3616,11 @@ func (a *ServerWithRoles) UpsertSAMLConnector(ctx context.Context, connector typ return nil, trace.Wrap(ErrSAMLRequiresEnterprise) } - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbCreate); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbUpdate); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } @@ -3659,7 +3639,7 @@ func (a *ServerWithRoles) CreateSAMLConnector(ctx context.Context, connector typ return nil, trace.Wrap(ErrSAMLRequiresEnterprise) } - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbCreate); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } @@ -3677,7 +3657,7 @@ func (a *ServerWithRoles) UpdateSAMLConnector(ctx context.Context, connector typ return nil, trace.Wrap(ErrSAMLRequiresEnterprise) } - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbUpdate); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } @@ -3690,12 +3670,12 @@ func (a *ServerWithRoles) UpdateSAMLConnector(ctx context.Context, connector typ } func (a *ServerWithRoles) GetSAMLConnector(ctx context.Context, id string, withSecrets bool) (types.SAMLConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbReadNoSecrets); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbReadNoSecrets); err != nil { return nil, trace.Wrap(err) } if withSecrets { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbRead); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -3704,14 +3684,14 @@ func (a *ServerWithRoles) GetSAMLConnector(ctx context.Context, id string, withS } func (a *ServerWithRoles) GetSAMLConnectors(ctx context.Context, withSecrets bool) ([]types.SAMLConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbList); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbList); err != nil { return nil, trace.Wrap(err) } - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbReadNoSecrets); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbReadNoSecrets); err != nil { return nil, trace.Wrap(err) } if withSecrets { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbRead); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -3723,7 +3703,7 @@ func (a *ServerWithRoles) CreateSAMLAuthRequest(ctx context.Context, req types.S return nil, trace.Wrap(ErrSAMLRequiresEnterprise) } - if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbCreate); err != nil { + if err := a.action(types.KindSAMLRequest, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } @@ -3733,7 +3713,7 @@ func (a *ServerWithRoles) CreateSAMLAuthRequest(ctx context.Context, req types.S // require additional permissions for executing SSO test flow. if req.SSOTestFlow { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbCreate); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } } @@ -3775,7 +3755,7 @@ func (a *ServerWithRoles) ValidateSAMLResponse(ctx context.Context, samlResponse // GetSAMLAuthRequest returns SAML auth request if found. func (a *ServerWithRoles) GetSAMLAuthRequest(ctx context.Context, id string) (*types.SAMLAuthRequest, error) { - if err := a.action(apidefaults.Namespace, types.KindSAMLRequest, types.VerbRead); err != nil { + if err := a.action(types.KindSAMLRequest, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -3797,7 +3777,7 @@ func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind str return nil, trace.BadParameter("unsupported authKind %q", authKind) } - if err := a.action(apidefaults.Namespace, resource, types.VerbRead); err != nil { + if err := a.action(resource, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -3806,7 +3786,7 @@ func (a *ServerWithRoles) GetSSODiagnosticInfo(ctx context.Context, authKind str // DeleteSAMLConnector deletes a SAML connector by name. func (a *ServerWithRoles) DeleteSAMLConnector(ctx context.Context, connectorID string) error { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindSAML, types.VerbDelete); err != nil { + if err := a.authConnectorAction(types.KindSAML, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -3838,11 +3818,11 @@ func (a *ServerWithRoles) checkGithubConnector(connector types.GithubConnector) // UpsertGithubConnector creates or updates a Github connector. func (a *ServerWithRoles) UpsertGithubConnector(ctx context.Context, connector types.GithubConnector) (types.GithubConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbCreate); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbUpdate); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } @@ -3861,7 +3841,7 @@ func (a *ServerWithRoles) UpsertGithubConnector(ctx context.Context, connector t // CreateGithubConnector creates a new Github connector. func (a *ServerWithRoles) CreateGithubConnector(ctx context.Context, connector types.GithubConnector) (types.GithubConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbCreate); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } @@ -3880,7 +3860,7 @@ func (a *ServerWithRoles) CreateGithubConnector(ctx context.Context, connector t // UpdateGithubConnector updates an existing Github connector. func (a *ServerWithRoles) UpdateGithubConnector(ctx context.Context, connector types.GithubConnector) (types.GithubConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbUpdate); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } @@ -3897,11 +3877,11 @@ func (a *ServerWithRoles) UpdateGithubConnector(ctx context.Context, connector t } func (a *ServerWithRoles) GetGithubConnector(ctx context.Context, id string, withSecrets bool) (types.GithubConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbReadNoSecrets); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbReadNoSecrets); err != nil { return nil, trace.Wrap(err) } if withSecrets { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbRead); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -3909,14 +3889,14 @@ func (a *ServerWithRoles) GetGithubConnector(ctx context.Context, id string, wit } func (a *ServerWithRoles) GetGithubConnectors(ctx context.Context, withSecrets bool) ([]types.GithubConnector, error) { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbList); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbList); err != nil { return nil, trace.Wrap(err) } - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbReadNoSecrets); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbReadNoSecrets); err != nil { return nil, trace.Wrap(err) } if withSecrets { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbRead); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -3925,7 +3905,7 @@ func (a *ServerWithRoles) GetGithubConnectors(ctx context.Context, withSecrets b // DeleteGithubConnector deletes a Github connector by name. func (a *ServerWithRoles) DeleteGithubConnector(ctx context.Context, connectorID string) error { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbDelete); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -3937,7 +3917,7 @@ func (a *ServerWithRoles) DeleteGithubConnector(ctx context.Context, connectorID } func (a *ServerWithRoles) CreateGithubAuthRequest(ctx context.Context, req types.GithubAuthRequest) (*types.GithubAuthRequest, error) { - if err := a.action(apidefaults.Namespace, types.KindGithubRequest, types.VerbCreate); err != nil { + if err := a.action(types.KindGithubRequest, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } @@ -3947,7 +3927,7 @@ func (a *ServerWithRoles) CreateGithubAuthRequest(ctx context.Context, req types // require additional permissions for executing SSO test flow. if req.SSOTestFlow { - if err := a.authConnectorAction(apidefaults.Namespace, types.KindGithub, types.VerbCreate); err != nil { + if err := a.authConnectorAction(types.KindGithub, types.VerbCreate); err != nil { return nil, trace.Wrap(err) } } @@ -3968,7 +3948,7 @@ func (a *ServerWithRoles) CreateGithubAuthRequest(ctx context.Context, req types // GetGithubAuthRequest returns Github auth request if found. func (a *ServerWithRoles) GetGithubAuthRequest(ctx context.Context, stateToken string) (*types.GithubAuthRequest, error) { - if err := a.action(apidefaults.Namespace, types.KindGithubRequest, types.VerbRead); err != nil { + if err := a.action(types.KindGithubRequest, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -3993,7 +3973,7 @@ func (a *ServerWithRoles) ValidateGithubAuthCallback(ctx context.Context, q url. // EmitAuditEvent emits a single audit event func (a *ServerWithRoles) EmitAuditEvent(ctx context.Context, event apievents.AuditEvent) error { ctx = context.WithoutCancel(ctx) - if err := a.action(apidefaults.Namespace, types.KindEvent, types.VerbCreate); err != nil { + if err := a.action(types.KindEvent, types.VerbCreate); err != nil { return trace.Wrap(err) } role, ok := a.context.Identity.(authz.BuiltinRole) @@ -4015,7 +3995,7 @@ func (a *ServerWithRoles) EmitAuditEvent(ctx context.Context, event apievents.Au // CreateAuditStream creates audit event stream func (a *ServerWithRoles) CreateAuditStream(ctx context.Context, sid session.ID) (apievents.Stream, error) { - if err := a.action(apidefaults.Namespace, types.KindEvent, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindEvent, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } role, ok := a.context.Identity.(authz.BuiltinRole) @@ -4035,7 +4015,7 @@ func (a *ServerWithRoles) CreateAuditStream(ctx context.Context, sid session.ID) // ResumeAuditStream resumes the stream that has been created func (a *ServerWithRoles) ResumeAuditStream(ctx context.Context, sid session.ID, uploadID string) (apievents.Stream, error) { - if err := a.action(apidefaults.Namespace, types.KindEvent, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindEvent, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } role, ok := a.context.Identity.(authz.BuiltinRole) @@ -4121,7 +4101,7 @@ func (a *ServerWithRoles) findSessionEndEvent(ctx context.Context, sid session.I // GetNamespaces returns a list of namespaces func (a *ServerWithRoles) GetNamespaces() ([]types.Namespace, error) { - if err := a.action(apidefaults.Namespace, types.KindNamespace, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindNamespace, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetNamespaces() @@ -4129,7 +4109,7 @@ func (a *ServerWithRoles) GetNamespaces() ([]types.Namespace, error) { // GetNamespace returns namespace by name func (a *ServerWithRoles) GetNamespace(name string) (*types.Namespace, error) { - if err := a.action(apidefaults.Namespace, types.KindNamespace, types.VerbRead); err != nil { + if err := a.action(types.KindNamespace, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetNamespace(name) @@ -4137,7 +4117,7 @@ func (a *ServerWithRoles) GetNamespace(name string) (*types.Namespace, error) { // UpsertNamespace upserts namespace func (a *ServerWithRoles) UpsertNamespace(ns types.Namespace) error { - if err := a.action(apidefaults.Namespace, types.KindNamespace, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindNamespace, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.UpsertNamespace(ns) @@ -4145,7 +4125,7 @@ func (a *ServerWithRoles) UpsertNamespace(ns types.Namespace) error { // DeleteNamespace deletes namespace by name func (a *ServerWithRoles) DeleteNamespace(name string) error { - if err := a.action(apidefaults.Namespace, types.KindNamespace, types.VerbDelete); err != nil { + if err := a.action(types.KindNamespace, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteNamespace(name) @@ -4177,7 +4157,7 @@ func (a *ServerWithRoles) GetRoles(ctx context.Context) ([]types.Role, error) { // ListRoles is a paginated role getter. func (a *ServerWithRoles) ListRoles(ctx context.Context, req *proto.ListRolesRequest) (*proto.ListRolesResponse, error) { - authErr := a.action(apidefaults.Namespace, types.KindRole, types.VerbList, types.VerbRead) + authErr := a.action(types.KindRole, types.VerbList, types.VerbRead) if authErr == nil { rsp, err := a.authServer.ListRoles(ctx, req) return rsp, trace.Wrap(err) @@ -4366,7 +4346,7 @@ func (a *ServerWithRoles) GetRole(ctx context.Context, name string) (types.Role, return a.authServer.GetRole(ctx, name) } - authErr := a.action(apidefaults.Namespace, types.KindRole, types.VerbRead) + authErr := a.action(types.KindRole, types.VerbRead) if authErr == nil { return a.authServer.GetRole(ctx, name) } @@ -4415,7 +4395,7 @@ func (a *ServerWithRoles) DeleteRole(ctx context.Context, name string) error { // DeleteClusterName deletes cluster name func (a *ServerWithRoles) DeleteClusterName() error { - if err := a.action(apidefaults.Namespace, types.KindClusterName, types.VerbDelete); err != nil { + if err := a.action(types.KindClusterName, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteClusterName() @@ -4423,7 +4403,7 @@ func (a *ServerWithRoles) DeleteClusterName() error { // GetClusterName gets the name of the cluster. func (a *ServerWithRoles) GetClusterName(opts ...services.MarshalOption) (types.ClusterName, error) { - if err := a.action(apidefaults.Namespace, types.KindClusterName, types.VerbRead); err != nil { + if err := a.action(types.KindClusterName, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetClusterName() @@ -4431,7 +4411,7 @@ func (a *ServerWithRoles) GetClusterName(opts ...services.MarshalOption) (types. // SetClusterName sets the name of the cluster. SetClusterName can only be called once. func (a *ServerWithRoles) SetClusterName(c types.ClusterName) error { - if err := a.action(apidefaults.Namespace, types.KindClusterName, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindClusterName, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.SetClusterName(c) @@ -4439,7 +4419,7 @@ func (a *ServerWithRoles) SetClusterName(c types.ClusterName) error { // UpsertClusterName sets the name of the cluster. func (a *ServerWithRoles) UpsertClusterName(c types.ClusterName) error { - if err := a.action(apidefaults.Namespace, types.KindClusterName, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindClusterName, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.UpsertClusterName(c) @@ -4447,7 +4427,7 @@ func (a *ServerWithRoles) UpsertClusterName(c types.ClusterName) error { // GetAuthPreference gets cluster auth preference. func (a *ServerWithRoles) GetAuthPreference(ctx context.Context) (types.AuthPreference, error) { - if err := a.action(apidefaults.Namespace, types.KindClusterAuthPreference, types.VerbRead); err != nil { + if err := a.action(types.KindClusterAuthPreference, types.VerbRead); err != nil { return nil, trace.Wrap(err) } cfg, err := a.authServer.GetReadOnlyAuthPreference(ctx) @@ -4458,7 +4438,7 @@ func (a *ServerWithRoles) GetAuthPreference(ctx context.Context) (types.AuthPref } func (a *ServerWithRoles) GetUIConfig(ctx context.Context) (types.UIConfig, error) { - if err := a.action(apidefaults.Namespace, types.KindUIConfig, types.VerbRead); err != nil { + if err := a.action(types.KindUIConfig, types.VerbRead); err != nil { return nil, trace.Wrap(err) } cfg, err := a.authServer.GetUIConfig(ctx) @@ -4466,14 +4446,14 @@ func (a *ServerWithRoles) GetUIConfig(ctx context.Context) (types.UIConfig, erro } func (a *ServerWithRoles) SetUIConfig(ctx context.Context, uic types.UIConfig) error { - if err := a.action(apidefaults.Namespace, types.KindUIConfig, types.VerbUpdate, types.VerbCreate); err != nil { + if err := a.action(types.KindUIConfig, types.VerbUpdate, types.VerbCreate); err != nil { return trace.Wrap(err) } return trace.Wrap(a.authServer.SetUIConfig(ctx, uic)) } func (a *ServerWithRoles) DeleteUIConfig(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindUIConfig, types.VerbDelete); err != nil { + if err := a.action(types.KindUIConfig, types.VerbDelete); err != nil { return trace.Wrap(err) } return trace.Wrap(a.authServer.DeleteUIConfig(ctx)) @@ -4481,7 +4461,7 @@ func (a *ServerWithRoles) DeleteUIConfig(ctx context.Context) error { // GetInstaller retrieves an installer script resource func (a *ServerWithRoles) GetInstaller(ctx context.Context, name string) (types.Installer, error) { - if err := a.action(apidefaults.Namespace, types.KindInstaller, types.VerbRead); err != nil { + if err := a.action(types.KindInstaller, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetInstaller(ctx, name) @@ -4489,7 +4469,7 @@ func (a *ServerWithRoles) GetInstaller(ctx context.Context, name string) (types. // GetInstallers gets all the installer resources. func (a *ServerWithRoles) GetInstallers(ctx context.Context) ([]types.Installer, error) { - if err := a.action(apidefaults.Namespace, types.KindInstaller, types.VerbRead, types.VerbList); err != nil { + if err := a.action(types.KindInstaller, types.VerbRead, types.VerbList); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetInstallers(ctx) @@ -4497,7 +4477,7 @@ func (a *ServerWithRoles) GetInstallers(ctx context.Context) ([]types.Installer, // SetInstaller sets an Installer script resource func (a *ServerWithRoles) SetInstaller(ctx context.Context, inst types.Installer) error { - if err := a.action(apidefaults.Namespace, types.KindInstaller, types.VerbUpdate, types.VerbCreate); err != nil { + if err := a.action(types.KindInstaller, types.VerbUpdate, types.VerbCreate); err != nil { return trace.Wrap(err) } return trace.Wrap(a.authServer.SetInstaller(ctx, inst)) @@ -4505,7 +4485,7 @@ func (a *ServerWithRoles) SetInstaller(ctx context.Context, inst types.Installer // DeleteInstaller removes an installer script resource func (a *ServerWithRoles) DeleteInstaller(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindInstaller, types.VerbDelete); err != nil { + if err := a.action(types.KindInstaller, types.VerbDelete); err != nil { return trace.Wrap(err) } return trace.Wrap(a.authServer.DeleteInstaller(ctx, name)) @@ -4513,7 +4493,7 @@ func (a *ServerWithRoles) DeleteInstaller(ctx context.Context, name string) erro // DeleteAllInstallers removes all installer script resources func (a *ServerWithRoles) DeleteAllInstallers(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindInstaller, types.VerbDelete, types.VerbList); err != nil { + if err := a.action(types.KindInstaller, types.VerbDelete, types.VerbList); err != nil { return trace.Wrap(err) } return trace.Wrap(a.authServer.DeleteAllInstallers(ctx)) @@ -4527,7 +4507,7 @@ func (a *ServerWithRoles) SetAuthPreference(ctx context.Context, newAuthPref typ return trace.Wrap(err) } - if err := a.action(apidefaults.Namespace, types.KindClusterAuthPreference, verbsToReplaceResourceWithOrigin(storedAuthPref)...); err != nil { + if err := a.action(types.KindClusterAuthPreference, verbsToReplaceResourceWithOrigin(storedAuthPref)...); err != nil { return trace.Wrap(err) } @@ -4592,7 +4572,7 @@ func (a *ServerWithRoles) ResetAuthPreference(ctx context.Context) error { return trace.BadParameter("config-file configuration cannot be reset") } - if err := a.action(apidefaults.Namespace, types.KindClusterAuthPreference, types.VerbUpdate); err != nil { + if err := a.action(types.KindClusterAuthPreference, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -4634,8 +4614,8 @@ func (a *ServerWithRoles) ResetAuthPreference(ctx context.Context) error { // GetClusterAuditConfig gets cluster audit configuration. func (a *ServerWithRoles) GetClusterAuditConfig(ctx context.Context) (types.ClusterAuditConfig, error) { - if err := a.action(apidefaults.Namespace, types.KindClusterAuditConfig, types.VerbRead); err != nil { - if err2 := a.action(apidefaults.Namespace, types.KindClusterConfig, types.VerbRead); err2 != nil { + if err := a.action(types.KindClusterAuditConfig, types.VerbRead); err != nil { + if err2 := a.action(types.KindClusterConfig, types.VerbRead); err2 != nil { return nil, trace.Wrap(err) } } @@ -4644,8 +4624,8 @@ func (a *ServerWithRoles) GetClusterAuditConfig(ctx context.Context) (types.Clus // GetClusterNetworkingConfig gets cluster networking configuration. func (a *ServerWithRoles) GetClusterNetworkingConfig(ctx context.Context) (types.ClusterNetworkingConfig, error) { - if err := a.action(apidefaults.Namespace, types.KindClusterNetworkingConfig, types.VerbRead); err != nil { - if err2 := a.action(apidefaults.Namespace, types.KindClusterConfig, types.VerbRead); err2 != nil { + if err := a.action(types.KindClusterNetworkingConfig, types.VerbRead); err != nil { + if err2 := a.action(types.KindClusterConfig, types.VerbRead); err2 != nil { return nil, trace.Wrap(err) } } @@ -4663,8 +4643,8 @@ func (a *ServerWithRoles) SetClusterNetworkingConfig(ctx context.Context, newNet return trace.Wrap(err) } - if err := a.action(apidefaults.Namespace, types.KindClusterNetworkingConfig, verbsToReplaceResourceWithOrigin(storedNetConfig)...); err != nil { - if err2 := a.action(apidefaults.Namespace, types.KindClusterConfig, verbsToReplaceResourceWithOrigin(storedNetConfig)...); err2 != nil { + if err := a.action(types.KindClusterNetworkingConfig, verbsToReplaceResourceWithOrigin(storedNetConfig)...); err != nil { + if err2 := a.action(types.KindClusterConfig, verbsToReplaceResourceWithOrigin(storedNetConfig)...); err2 != nil { return trace.Wrap(err) } } @@ -4725,8 +4705,8 @@ func (a *ServerWithRoles) ResetClusterNetworkingConfig(ctx context.Context) erro return trace.BadParameter("config-file configuration cannot be reset") } - if err := a.action(apidefaults.Namespace, types.KindClusterNetworkingConfig, types.VerbUpdate); err != nil { - if err2 := a.action(apidefaults.Namespace, types.KindClusterConfig, types.VerbUpdate); err2 != nil { + if err := a.action(types.KindClusterNetworkingConfig, types.VerbUpdate); err != nil { + if err2 := a.action(types.KindClusterConfig, types.VerbUpdate); err2 != nil { return trace.Wrap(err) } } @@ -4770,8 +4750,8 @@ func (a *ServerWithRoles) ResetClusterNetworkingConfig(ctx context.Context) erro // GetSessionRecordingConfig gets session recording configuration. func (a *ServerWithRoles) GetSessionRecordingConfig(ctx context.Context) (types.SessionRecordingConfig, error) { - if err := a.action(apidefaults.Namespace, types.KindSessionRecordingConfig, types.VerbRead); err != nil { - if err2 := a.action(apidefaults.Namespace, types.KindClusterConfig, types.VerbRead); err2 != nil { + if err := a.action(types.KindSessionRecordingConfig, types.VerbRead); err != nil { + if err2 := a.action(types.KindClusterConfig, types.VerbRead); err2 != nil { return nil, trace.Wrap(err) } } @@ -4785,8 +4765,8 @@ func (a *ServerWithRoles) SetSessionRecordingConfig(ctx context.Context, newRecC return trace.Wrap(err) } - if err := a.action(apidefaults.Namespace, types.KindSessionRecordingConfig, verbsToReplaceResourceWithOrigin(storedRecConfig)...); err != nil { - if err2 := a.action(apidefaults.Namespace, types.KindClusterConfig, verbsToReplaceResourceWithOrigin(storedRecConfig)...); err2 != nil { + if err := a.action(types.KindSessionRecordingConfig, verbsToReplaceResourceWithOrigin(storedRecConfig)...); err != nil { + if err2 := a.action(types.KindClusterConfig, verbsToReplaceResourceWithOrigin(storedRecConfig)...); err2 != nil { return trace.Wrap(err) } } @@ -4831,8 +4811,8 @@ func (a *ServerWithRoles) ResetSessionRecordingConfig(ctx context.Context) error return trace.BadParameter("config-file configuration cannot be reset") } - if err := a.action(apidefaults.Namespace, types.KindSessionRecordingConfig, types.VerbUpdate); err != nil { - if err2 := a.action(apidefaults.Namespace, types.KindClusterConfig, types.VerbUpdate); err2 != nil { + if err := a.action(types.KindSessionRecordingConfig, types.VerbUpdate); err != nil { + if err2 := a.action(types.KindClusterConfig, types.VerbUpdate); err2 != nil { return trace.Wrap(err) } } @@ -4868,7 +4848,7 @@ func (a *ServerWithRoles) ResetSessionRecordingConfig(ctx context.Context) error // GetServerInfos returns a stream of ServerInfos. func (a *ServerWithRoles) GetServerInfos(ctx context.Context) stream.Stream[types.ServerInfo] { - if err := a.action(apidefaults.Namespace, types.KindServerInfo, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindServerInfo, types.VerbList, types.VerbRead); err != nil { return stream.Fail[types.ServerInfo](trace.Wrap(err)) } @@ -4877,7 +4857,7 @@ func (a *ServerWithRoles) GetServerInfos(ctx context.Context) stream.Stream[type // GetServerInfo returns a ServerInfo by name. func (a *ServerWithRoles) GetServerInfo(ctx context.Context, name string) (types.ServerInfo, error) { - if err := a.action(apidefaults.Namespace, types.KindServerInfo, types.VerbRead); err != nil { + if err := a.action(types.KindServerInfo, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -4887,7 +4867,7 @@ func (a *ServerWithRoles) GetServerInfo(ctx context.Context, name string) (types // UpsertServerInfo upserts a ServerInfo. func (a *ServerWithRoles) UpsertServerInfo(ctx context.Context, si types.ServerInfo) error { - if err := a.action(apidefaults.Namespace, types.KindServerInfo, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindServerInfo, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -4896,7 +4876,7 @@ func (a *ServerWithRoles) UpsertServerInfo(ctx context.Context, si types.ServerI // DeleteServerInfo deletes a ServerInfo by name. func (a *ServerWithRoles) DeleteServerInfo(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindServerInfo, types.VerbDelete); err != nil { + if err := a.action(types.KindServerInfo, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -4905,7 +4885,7 @@ func (a *ServerWithRoles) DeleteServerInfo(ctx context.Context, name string) err // DeleteAllServerInfos deletes all ServerInfos. func (a *ServerWithRoles) DeleteAllServerInfos(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindServerInfo, types.VerbDelete); err != nil { + if err := a.action(types.KindServerInfo, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -4913,7 +4893,7 @@ func (a *ServerWithRoles) DeleteAllServerInfos(ctx context.Context) error { } func (a *ServerWithRoles) GetTrustedClusters(ctx context.Context) ([]types.TrustedCluster, error) { - if err := a.action(apidefaults.Namespace, types.KindTrustedCluster, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindTrustedCluster, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -4921,7 +4901,7 @@ func (a *ServerWithRoles) GetTrustedClusters(ctx context.Context) ([]types.Trust } func (a *ServerWithRoles) GetTrustedCluster(ctx context.Context, name string) (types.TrustedCluster, error) { - if err := a.action(apidefaults.Namespace, types.KindTrustedCluster, types.VerbRead); err != nil { + if err := a.action(types.KindTrustedCluster, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -4935,7 +4915,7 @@ func (a *ServerWithRoles) UpsertTrustedCluster(ctx context.Context, tc types.Tru return nil, trace.NotImplemented("cloud tenants cannot be leaf clusters") } - if err := a.action(apidefaults.Namespace, types.KindTrustedCluster, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindTrustedCluster, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } @@ -4958,7 +4938,7 @@ func (a *ServerWithRoles) ValidateTrustedCluster(ctx context.Context, validateRe // DeleteTrustedCluster deletes a trusted cluster by name. func (a *ServerWithRoles) DeleteTrustedCluster(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindTrustedCluster, types.VerbDelete); err != nil { + if err := a.action(types.KindTrustedCluster, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -4970,42 +4950,42 @@ func (a *ServerWithRoles) DeleteTrustedCluster(ctx context.Context, name string) } func (a *ServerWithRoles) UpsertTunnelConnection(conn types.TunnelConnection) error { - if err := a.action(apidefaults.Namespace, types.KindTunnelConnection, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindTunnelConnection, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.UpsertTunnelConnection(conn) } func (a *ServerWithRoles) GetTunnelConnections(clusterName string, opts ...services.MarshalOption) ([]types.TunnelConnection, error) { - if err := a.action(apidefaults.Namespace, types.KindTunnelConnection, types.VerbList); err != nil { + if err := a.action(types.KindTunnelConnection, types.VerbList); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetTunnelConnections(clusterName, opts...) } func (a *ServerWithRoles) GetAllTunnelConnections(opts ...services.MarshalOption) ([]types.TunnelConnection, error) { - if err := a.action(apidefaults.Namespace, types.KindTunnelConnection, types.VerbList); err != nil { + if err := a.action(types.KindTunnelConnection, types.VerbList); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetAllTunnelConnections(opts...) } func (a *ServerWithRoles) DeleteTunnelConnection(clusterName string, connName string) error { - if err := a.action(apidefaults.Namespace, types.KindTunnelConnection, types.VerbDelete); err != nil { + if err := a.action(types.KindTunnelConnection, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteTunnelConnection(clusterName, connName) } func (a *ServerWithRoles) DeleteTunnelConnections(clusterName string) error { - if err := a.action(apidefaults.Namespace, types.KindTunnelConnection, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindTunnelConnection, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteTunnelConnections(clusterName) } func (a *ServerWithRoles) DeleteAllTunnelConnections() error { - if err := a.action(apidefaults.Namespace, types.KindTunnelConnection, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindTunnelConnection, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAllTunnelConnections() @@ -5013,7 +4993,7 @@ func (a *ServerWithRoles) DeleteAllTunnelConnections() error { // AcquireSemaphore acquires lease with requested resources from semaphore. func (a *ServerWithRoles) AcquireSemaphore(ctx context.Context, params types.AcquireSemaphoreRequest) (*types.SemaphoreLease, error) { - if err := a.action(apidefaults.Namespace, types.KindSemaphore, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindSemaphore, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } return a.authServer.AcquireSemaphore(ctx, params) @@ -5021,7 +5001,7 @@ func (a *ServerWithRoles) AcquireSemaphore(ctx context.Context, params types.Acq // KeepAliveSemaphoreLease updates semaphore lease. func (a *ServerWithRoles) KeepAliveSemaphoreLease(ctx context.Context, lease types.SemaphoreLease) error { - if err := a.action(apidefaults.Namespace, types.KindSemaphore, types.VerbUpdate); err != nil { + if err := a.action(types.KindSemaphore, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.KeepAliveSemaphoreLease(ctx, lease) @@ -5029,7 +5009,7 @@ func (a *ServerWithRoles) KeepAliveSemaphoreLease(ctx context.Context, lease typ // CancelSemaphoreLease cancels semaphore lease early. func (a *ServerWithRoles) CancelSemaphoreLease(ctx context.Context, lease types.SemaphoreLease) error { - if err := a.action(apidefaults.Namespace, types.KindSemaphore, types.VerbUpdate); err != nil { + if err := a.action(types.KindSemaphore, types.VerbUpdate); err != nil { return trace.Wrap(err) } return a.authServer.CancelSemaphoreLease(ctx, lease) @@ -5037,7 +5017,7 @@ func (a *ServerWithRoles) CancelSemaphoreLease(ctx context.Context, lease types. // GetSemaphores returns a list of all semaphores matching the supplied filter. func (a *ServerWithRoles) GetSemaphores(ctx context.Context, filter types.SemaphoreFilter) ([]types.Semaphore, error) { - if err := a.action(apidefaults.Namespace, types.KindSemaphore, types.VerbReadNoSecrets, types.VerbList); err != nil { + if err := a.action(types.KindSemaphore, types.VerbReadNoSecrets, types.VerbList); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetSemaphores(ctx, filter) @@ -5045,7 +5025,7 @@ func (a *ServerWithRoles) GetSemaphores(ctx context.Context, filter types.Semaph // DeleteSemaphore deletes a semaphore matching the supplied filter. func (a *ServerWithRoles) DeleteSemaphore(ctx context.Context, filter types.SemaphoreFilter) error { - if err := a.action(apidefaults.Namespace, types.KindSemaphore, types.VerbDelete); err != nil { + if err := a.action(types.KindSemaphore, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteSemaphore(ctx, filter) @@ -5100,7 +5080,7 @@ func extractOriginalClusterNameFromCSR(req authclient.KubeCSR) (string, error) { // GetDatabaseServers returns all registered database servers. func (a *ServerWithRoles) GetDatabaseServers(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.DatabaseServer, error) { - if err := a.action(namespace, types.KindDatabaseServer, types.VerbList, types.VerbRead); err != nil { + if err := a.actionNamespace(namespace, types.KindDatabaseServer, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } servers, err := a.authServer.GetDatabaseServers(ctx, namespace, opts...) @@ -5122,7 +5102,7 @@ func (a *ServerWithRoles) GetDatabaseServers(ctx context.Context, namespace stri // UpsertDatabaseServer creates or updates a new database proxy server. func (a *ServerWithRoles) UpsertDatabaseServer(ctx context.Context, server types.DatabaseServer) (*types.KeepAlive, error) { - if err := a.action(server.GetNamespace(), types.KindDatabaseServer, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.actionNamespace(server.GetNamespace(), types.KindDatabaseServer, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } return a.authServer.UpsertDatabaseServer(ctx, server) @@ -5130,7 +5110,7 @@ func (a *ServerWithRoles) UpsertDatabaseServer(ctx context.Context, server types // DeleteDatabaseServer removes the specified database proxy server. func (a *ServerWithRoles) DeleteDatabaseServer(ctx context.Context, namespace, hostID, name string) error { - if err := a.action(namespace, types.KindDatabaseServer, types.VerbDelete); err != nil { + if err := a.actionNamespace(namespace, types.KindDatabaseServer, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteDatabaseServer(ctx, namespace, hostID, name) @@ -5138,7 +5118,7 @@ func (a *ServerWithRoles) DeleteDatabaseServer(ctx context.Context, namespace, h // DeleteAllDatabaseServers removes all registered database proxy servers. func (a *ServerWithRoles) DeleteAllDatabaseServers(ctx context.Context, namespace string) error { - if err := a.action(namespace, types.KindDatabaseServer, types.VerbList, types.VerbDelete); err != nil { + if err := a.actionNamespace(namespace, types.KindDatabaseServer, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAllDatabaseServers(ctx, namespace) @@ -5146,7 +5126,7 @@ func (a *ServerWithRoles) DeleteAllDatabaseServers(ctx context.Context, namespac // UpsertDatabaseService creates or updates a new DatabaseService resource. func (a *ServerWithRoles) UpsertDatabaseService(ctx context.Context, service types.DatabaseService) (*types.KeepAlive, error) { - if err := a.action(service.GetNamespace(), types.KindDatabaseService, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.actionNamespace(service.GetNamespace(), types.KindDatabaseService, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } return a.authServer.UpsertDatabaseService(ctx, service) @@ -5154,7 +5134,7 @@ func (a *ServerWithRoles) UpsertDatabaseService(ctx context.Context, service typ // DeleteAllDatabaseServices removes all DatabaseService resources. func (a *ServerWithRoles) DeleteAllDatabaseServices(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindDatabaseService, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindDatabaseService, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAllDatabaseServices(ctx) @@ -5162,7 +5142,7 @@ func (a *ServerWithRoles) DeleteAllDatabaseServices(ctx context.Context) error { // DeleteDatabaseService removes a specific DatabaseService resource. func (a *ServerWithRoles) DeleteDatabaseService(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindDatabaseService, types.VerbDelete); err != nil { + if err := a.action(types.KindDatabaseService, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteDatabaseService(ctx, name) @@ -5209,7 +5189,7 @@ func (a *ServerWithRoles) GenerateDatabaseCert(ctx context.Context, req *proto.D func (a *ServerWithRoles) checkAccessToGenerateDatabaseCert(resourceKind string) error { const verb = types.VerbCreate // Check if the User can `create` Database Certificates - err := a.action(apidefaults.Namespace, resourceKind, verb) + err := a.action(resourceKind, verb) if err != nil { if !trace.IsAccessDenied(err) { return trace.Wrap(err) @@ -5270,7 +5250,7 @@ func (a *ServerWithRoles) checkAccessToApp(app types.Application) error { // GetApplicationServers returns all registered application servers. func (a *ServerWithRoles) GetApplicationServers(ctx context.Context, namespace string) ([]types.AppServer, error) { - if err := a.action(namespace, types.KindAppServer, types.VerbList, types.VerbRead); err != nil { + if err := a.actionNamespace(namespace, types.KindAppServer, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } servers, err := a.authServer.GetApplicationServers(ctx, namespace) @@ -5314,7 +5294,7 @@ func (a *ServerWithRoles) GetAppServersAndSAMLIdPServiceProviders(ctx context.Co // Only add SAMLIdPServiceProviders to the list if the caller has an enterprise license since this is an enteprise-only feature. if modules.GetModules().BuildType() == modules.BuildEnterprise { // Only attempt to list SAMLIdPServiceProviders if the caller has the permission to. - if err := a.action(namespace, types.KindSAMLIdPServiceProvider, types.VerbList); err == nil { + if err := a.action(types.KindSAMLIdPServiceProvider, types.VerbList); err == nil { serviceProviders, _, err := a.authServer.ListSAMLIdPServiceProviders(ctx, 0, "") if err != nil { return nil, trace.Wrap(err) @@ -5336,7 +5316,7 @@ func (a *ServerWithRoles) GetAppServersAndSAMLIdPServiceProviders(ctx context.Co // UpsertApplicationServer registers an application server. func (a *ServerWithRoles) UpsertApplicationServer(ctx context.Context, server types.AppServer) (*types.KeepAlive, error) { - if err := a.action(server.GetNamespace(), types.KindAppServer, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.actionNamespace(server.GetNamespace(), types.KindAppServer, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } return a.authServer.UpsertApplicationServer(ctx, server) @@ -5344,7 +5324,7 @@ func (a *ServerWithRoles) UpsertApplicationServer(ctx context.Context, server ty // DeleteApplicationServer deletes specified application server. func (a *ServerWithRoles) DeleteApplicationServer(ctx context.Context, namespace, hostID, name string) error { - if err := a.action(namespace, types.KindAppServer, types.VerbDelete); err != nil { + if err := a.actionNamespace(namespace, types.KindAppServer, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteApplicationServer(ctx, namespace, hostID, name) @@ -5352,7 +5332,7 @@ func (a *ServerWithRoles) DeleteApplicationServer(ctx context.Context, namespace // DeleteAllApplicationServers deletes all registered application servers. func (a *ServerWithRoles) DeleteAllApplicationServers(ctx context.Context, namespace string) error { - if err := a.action(namespace, types.KindAppServer, types.VerbList, types.VerbDelete); err != nil { + if err := a.actionNamespace(namespace, types.KindAppServer, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAllApplicationServers(ctx, namespace) @@ -5365,7 +5345,7 @@ func (a *ServerWithRoles) GetAppSession(ctx context.Context, req types.GetAppSes return nil, trace.Wrap(err) } - authErr := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbRead) + authErr := a.action(types.KindWebSession, types.VerbRead) if authErr == nil { return session, nil } @@ -5391,7 +5371,7 @@ func (a *ServerWithRoles) GetSnowflakeSession(ctx context.Context, req types.Get if !a.hasBuiltinRole(types.RoleDatabase) { // Users can only fetch their own web sessions. if err := a.currentUserAction(session.GetUser()); err != nil { - if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbRead); err != nil { + if err := a.action(types.KindWebSession, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -5402,7 +5382,7 @@ func (a *ServerWithRoles) GetSnowflakeSession(ctx context.Context, req types.Get // GetSAMLIdPSession gets a SAML IdP session. // TODO(Joerger): DELETE IN v18.0.0 func (a *ServerWithRoles) GetSAMLIdPSession(ctx context.Context, req types.GetSAMLIdPSessionRequest) (types.WebSession, error) { - if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbRead); err != nil { + if err := a.action(types.KindWebSession, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -5418,7 +5398,7 @@ func (a *ServerWithRoles) GetSAMLIdPSession(ctx context.Context, req types.GetSA // ListAppSessions gets a paginated list of application web sessions. func (a *ServerWithRoles) ListAppSessions(ctx context.Context, pageSize int, pageToken, user string) ([]types.WebSession, string, error) { - if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindWebSession, types.VerbList, types.VerbRead); err != nil { return nil, "", trace.Wrap(err) } @@ -5430,7 +5410,7 @@ func (a *ServerWithRoles) ListAppSessions(ctx context.Context, pageSize int, pag func (a *ServerWithRoles) GetSnowflakeSessions(ctx context.Context) ([]types.WebSession, error) { // Check if this a database service. if !a.hasBuiltinRole(types.RoleDatabase) { - if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindWebSession, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } } @@ -5445,7 +5425,7 @@ func (a *ServerWithRoles) GetSnowflakeSessions(ctx context.Context) ([]types.Web // ListSAMLIdPSessions gets a paginated list of SAML IdP sessions. // TODO(Joerger): DELETE IN v18.0.0 func (a *ServerWithRoles) ListSAMLIdPSessions(ctx context.Context, pageSize int, pageToken, user string) ([]types.WebSession, string, error) { - if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindWebSession, types.VerbList, types.VerbRead); err != nil { return nil, "", trace.Wrap(err) } @@ -5553,7 +5533,7 @@ func (a *ServerWithRoles) DeleteSAMLIdPSession(ctx context.Context, req types.De // DeleteAllSnowflakeSessions removes all Snowflake web sessions. func (a *ServerWithRoles) DeleteAllSnowflakeSessions(ctx context.Context) error { if !a.hasBuiltinRole(types.RoleDatabase) { - if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindWebSession, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } } @@ -5566,7 +5546,7 @@ func (a *ServerWithRoles) DeleteAllSnowflakeSessions(ctx context.Context) error // DeleteAllAppSessions removes all application web sessions. func (a *ServerWithRoles) DeleteAllAppSessions(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindWebSession, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -5593,7 +5573,7 @@ func (a *ServerWithRoles) DeleteUserAppSessions(ctx context.Context, req *proto. // DeleteAllSAMLIdPSessions removes all SAML IdP sessions. // TODO(Joerger): DELETE IN v18.0.0 func (a *ServerWithRoles) DeleteAllSAMLIdPSessions(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindWebSession, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -5622,7 +5602,7 @@ func (a *ServerWithRoles) DeleteUserSAMLIdPSessions(ctx context.Context, usernam // WebSessions from the provided `username`. func (a *ServerWithRoles) canDeleteWebSession(username string) error { if err := a.currentUserAction(username); err != nil { - if err := a.action(apidefaults.Namespace, types.KindWebSession, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindWebSession, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } } @@ -5632,7 +5612,7 @@ func (a *ServerWithRoles) canDeleteWebSession(username string) error { // GenerateAppToken creates a JWT token with application access. func (a *ServerWithRoles) GenerateAppToken(ctx context.Context, req types.GenerateAppTokenRequest) (string, error) { - if err := a.action(apidefaults.Namespace, types.KindJWT, types.VerbCreate); err != nil { + if err := a.action(types.KindJWT, types.VerbCreate); err != nil { return "", trace.Wrap(err) } @@ -5657,7 +5637,7 @@ func (a *ServerWithRoles) checkAccessToKubeCluster(cluster types.KubeCluster) er // GetKubernetesServers returns all registered kubernetes servers. func (a *ServerWithRoles) GetKubernetesServers(ctx context.Context) ([]types.KubeServer, error) { - if err := a.action(apidefaults.Namespace, types.KindKubeServer, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindKubeServer, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -5682,7 +5662,7 @@ func (a *ServerWithRoles) GetKubernetesServers(ctx context.Context) ([]types.Kub // UpsertKubernetesServer creates or updates a Server representing a teleport // kubernetes server. func (a *ServerWithRoles) UpsertKubernetesServer(ctx context.Context, s types.KubeServer) (*types.KeepAlive, error) { - if err := a.action(apidefaults.Namespace, types.KindKubeServer, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindKubeServer, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } return a.authServer.UpsertKubernetesServer(ctx, s) @@ -5690,7 +5670,7 @@ func (a *ServerWithRoles) UpsertKubernetesServer(ctx context.Context, s types.Ku // DeleteKubernetesServer deletes specified kubernetes server. func (a *ServerWithRoles) DeleteKubernetesServer(ctx context.Context, hostID, name string) error { - if err := a.action(apidefaults.Namespace, types.KindKubeServer, types.VerbDelete); err != nil { + if err := a.action(types.KindKubeServer, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteKubernetesServer(ctx, hostID, name) @@ -5698,7 +5678,7 @@ func (a *ServerWithRoles) DeleteKubernetesServer(ctx context.Context, hostID, na // DeleteAllKubernetesServers deletes all registered kubernetes servers. func (a *ServerWithRoles) DeleteAllKubernetesServers(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindKubeServer, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindKubeServer, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAllKubernetesServers(ctx) @@ -5706,7 +5686,7 @@ func (a *ServerWithRoles) DeleteAllKubernetesServers(ctx context.Context) error // GetNetworkRestrictions retrieves all the network restrictions (allow/deny lists). func (a *ServerWithRoles) GetNetworkRestrictions(ctx context.Context) (types.NetworkRestrictions, error) { - if err := a.action(apidefaults.Namespace, types.KindNetworkRestrictions, types.VerbRead); err != nil { + if err := a.action(types.KindNetworkRestrictions, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetNetworkRestrictions(ctx) @@ -5714,7 +5694,7 @@ func (a *ServerWithRoles) GetNetworkRestrictions(ctx context.Context) (types.Net // SetNetworkRestrictions updates the network restrictions. func (a *ServerWithRoles) SetNetworkRestrictions(ctx context.Context, nr types.NetworkRestrictions) error { - if err := a.action(apidefaults.Namespace, types.KindNetworkRestrictions, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindNetworkRestrictions, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -5728,7 +5708,7 @@ func (a *ServerWithRoles) SetNetworkRestrictions(ctx context.Context, nr types.N // DeleteNetworkRestrictions deletes the network restrictions. func (a *ServerWithRoles) DeleteNetworkRestrictions(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindNetworkRestrictions, types.VerbDelete); err != nil { + if err := a.action(types.KindNetworkRestrictions, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -5817,7 +5797,7 @@ func (a *ServerWithRoles) IsMFARequired(ctx context.Context, req *proto.IsMFAReq // SearchEvents allows searching audit events with pagination support. func (a *ServerWithRoles) SearchEvents(ctx context.Context, req events.SearchEventsRequest) (outEvents []apievents.AuditEvent, lastKey string, err error) { - if err := a.action(apidefaults.Namespace, types.KindEvent, types.VerbList); err != nil { + if err := a.action(types.KindEvent, types.VerbList); err != nil { return nil, "", trace.Wrap(err) } @@ -5832,7 +5812,7 @@ func (a *ServerWithRoles) SearchEvents(ctx context.Context, req events.SearchEve // ExportUnstructuredEvents exports events from a given event chunk returned by GetEventExportChunks. This API prioritizes // performance over ordering and filtering, and is intended for bulk export of events. func (a *ServerWithRoles) ExportUnstructuredEvents(ctx context.Context, req *auditlogpb.ExportUnstructuredEventsRequest) stream.Stream[*auditlogpb.ExportEventUnstructured] { - if err := a.action(apidefaults.Namespace, types.KindEvent, types.VerbList); err != nil { + if err := a.action(types.KindEvent, types.VerbList); err != nil { return stream.Fail[*auditlogpb.ExportEventUnstructured](trace.Wrap(err)) } @@ -5842,7 +5822,7 @@ func (a *ServerWithRoles) ExportUnstructuredEvents(ctx context.Context, req *aud // GetEventExportChunks returns a stream of event chunks that can be exported via ExportUnstructuredEvents. The returned // list isn't ordered and polling for new chunks requires re-consuming the entire stream from the beginning. func (a *ServerWithRoles) GetEventExportChunks(ctx context.Context, req *auditlogpb.GetEventExportChunksRequest) stream.Stream[*auditlogpb.EventExportChunk] { - if err := a.action(apidefaults.Namespace, types.KindEvent, types.VerbList); err != nil { + if err := a.action(types.KindEvent, types.VerbList); err != nil { return stream.Fail[*auditlogpb.EventExportChunk](trace.Wrap(err)) } @@ -5855,7 +5835,7 @@ func (a *ServerWithRoles) SearchSessionEvents(ctx context.Context, req events.Se return nil, "", trace.BadParameter("cond is an internal parameter, should not be set by client") } - cond, err := a.actionForListWithCondition(apidefaults.Namespace, types.KindSession, services.SessionIdentifier) + cond, err := a.actionForListWithCondition(types.KindSession, services.SessionIdentifier) if err != nil { return nil, "", trace.Wrap(err) } @@ -5872,7 +5852,7 @@ func (a *ServerWithRoles) SearchSessionEvents(ctx context.Context, req events.Se // GetLock gets a lock by name. func (a *ServerWithRoles) GetLock(ctx context.Context, name string) (types.Lock, error) { - if err := a.action(apidefaults.Namespace, types.KindLock, types.VerbRead); err != nil { + if err := a.action(types.KindLock, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetLock(ctx, name) @@ -5880,7 +5860,7 @@ func (a *ServerWithRoles) GetLock(ctx context.Context, name string) (types.Lock, // GetLocks gets all/in-force locks that match at least one of the targets when specified. func (a *ServerWithRoles) GetLocks(ctx context.Context, inForceOnly bool, targets ...types.LockTarget) ([]types.Lock, error) { - if err := a.action(apidefaults.Namespace, types.KindLock, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindLock, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } return a.authServer.GetLocks(ctx, inForceOnly, targets...) @@ -5888,7 +5868,7 @@ func (a *ServerWithRoles) GetLocks(ctx context.Context, inForceOnly bool, target // UpsertLock upserts a lock. func (a *ServerWithRoles) UpsertLock(ctx context.Context, lock types.Lock) error { - if err := a.action(apidefaults.Namespace, types.KindLock, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindLock, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -5922,7 +5902,7 @@ func (a *ServerWithRoles) UpsertLock(ctx context.Context, lock types.Lock) error // DeleteLock deletes a lock. func (a *ServerWithRoles) DeleteLock(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindLock, types.VerbDelete); err != nil { + if err := a.action(types.KindLock, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -5958,7 +5938,7 @@ func (a *ServerWithRoles) StreamSessionEvents(ctx context.Context, sessionID ses var sessionType types.SessionKind if !isTeleportServer { var err error - sessionType, err = a.actionForKindSession(ctx, apidefaults.Namespace, sessionID) + sessionType, err = a.actionForKindSession(ctx, sessionID) if err != nil { c, e := make(chan apievents.AuditEvent), make(chan error, 1) e <- trace.Wrap(err) @@ -5988,7 +5968,7 @@ func (a *ServerWithRoles) StreamSessionEvents(ctx context.Context, sessionID ses // CreateApp creates a new application resource. func (a *ServerWithRoles) CreateApp(ctx context.Context, app types.Application) error { - if err := a.action(apidefaults.Namespace, types.KindApp, types.VerbCreate); err != nil { + if err := a.action(types.KindApp, types.VerbCreate); err != nil { return trace.Wrap(err) } // Don't allow users create apps they wouldn't have access to (e.g. @@ -6001,7 +5981,7 @@ func (a *ServerWithRoles) CreateApp(ctx context.Context, app types.Application) // UpdateApp updates existing application resource. func (a *ServerWithRoles) UpdateApp(ctx context.Context, app types.Application) error { - if err := a.action(apidefaults.Namespace, types.KindApp, types.VerbUpdate); err != nil { + if err := a.action(types.KindApp, types.VerbUpdate); err != nil { return trace.Wrap(err) } // Don't allow users update apps they don't have access to (e.g. @@ -6021,7 +6001,7 @@ func (a *ServerWithRoles) UpdateApp(ctx context.Context, app types.Application) // GetApp returns specified application resource. func (a *ServerWithRoles) GetApp(ctx context.Context, name string) (types.Application, error) { - if err := a.action(apidefaults.Namespace, types.KindApp, types.VerbRead); err != nil { + if err := a.action(types.KindApp, types.VerbRead); err != nil { return nil, trace.Wrap(err) } app, err := a.authServer.GetApp(ctx, name) @@ -6036,7 +6016,7 @@ func (a *ServerWithRoles) GetApp(ctx context.Context, name string) (types.Applic // GetApps returns all application resources. func (a *ServerWithRoles) GetApps(ctx context.Context) (result []types.Application, err error) { - if err := a.action(apidefaults.Namespace, types.KindApp, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindApp, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } // Filter out apps user doesn't have access to. @@ -6054,7 +6034,7 @@ func (a *ServerWithRoles) GetApps(ctx context.Context) (result []types.Applicati // DeleteApp removes the specified application resource. func (a *ServerWithRoles) DeleteApp(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindApp, types.VerbDelete); err != nil { + if err := a.action(types.KindApp, types.VerbDelete); err != nil { return trace.Wrap(err) } // Make sure user has access to the application before deleting. @@ -6070,7 +6050,7 @@ func (a *ServerWithRoles) DeleteApp(ctx context.Context, name string) error { // DeleteAllApps removes all application resources. func (a *ServerWithRoles) DeleteAllApps(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindApp, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindApp, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } // Make sure to only delete apps user has access to. @@ -6090,7 +6070,7 @@ func (a *ServerWithRoles) DeleteAllApps(ctx context.Context) error { // CreateKubernetesCluster creates a new kubernetes cluster resource. func (a *ServerWithRoles) CreateKubernetesCluster(ctx context.Context, cluster types.KubeCluster) error { - if err := a.action(apidefaults.Namespace, types.KindKubernetesCluster, types.VerbCreate); err != nil { + if err := a.action(types.KindKubernetesCluster, types.VerbCreate); err != nil { return trace.Wrap(err) } // Don't allow users create clusters they wouldn't have access to (e.g. @@ -6107,7 +6087,7 @@ func (a *ServerWithRoles) CreateKubernetesCluster(ctx context.Context, cluster t // UpdateKubernetesCluster updates existing kubernetes cluster resource. func (a *ServerWithRoles) UpdateKubernetesCluster(ctx context.Context, cluster types.KubeCluster) error { - if err := a.action(apidefaults.Namespace, types.KindKubernetesCluster, types.VerbUpdate); err != nil { + if err := a.action(types.KindKubernetesCluster, types.VerbUpdate); err != nil { return trace.Wrap(err) } // Don't allow users update clusters they don't have access to (e.g. @@ -6131,7 +6111,7 @@ func (a *ServerWithRoles) UpdateKubernetesCluster(ctx context.Context, cluster t // GetKubernetesCluster returns specified kubernetes cluster resource. func (a *ServerWithRoles) GetKubernetesCluster(ctx context.Context, name string) (types.KubeCluster, error) { - if err := a.action(apidefaults.Namespace, types.KindKubernetesCluster, types.VerbRead); err != nil { + if err := a.action(types.KindKubernetesCluster, types.VerbRead); err != nil { return nil, trace.Wrap(err) } kubeCluster, err := a.authServer.GetKubernetesCluster(ctx, name) @@ -6146,7 +6126,7 @@ func (a *ServerWithRoles) GetKubernetesCluster(ctx context.Context, name string) // GetKubernetesClusters returns all kubernetes cluster resources. func (a *ServerWithRoles) GetKubernetesClusters(ctx context.Context) (result []types.KubeCluster, err error) { - if err := a.action(apidefaults.Namespace, types.KindKubernetesCluster, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindKubernetesCluster, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } // Filter out kube clusters user doesn't have access to. @@ -6164,7 +6144,7 @@ func (a *ServerWithRoles) GetKubernetesClusters(ctx context.Context) (result []t // DeleteKubernetesCluster removes the specified kubernetes cluster resource. func (a *ServerWithRoles) DeleteKubernetesCluster(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindKubernetesCluster, types.VerbDelete); err != nil { + if err := a.action(types.KindKubernetesCluster, types.VerbDelete); err != nil { return trace.Wrap(err) } // Make sure user has access to the kubernetes cluster before deleting. @@ -6180,7 +6160,7 @@ func (a *ServerWithRoles) DeleteKubernetesCluster(ctx context.Context, name stri // DeleteAllKubernetesClusters removes all kubernetes cluster resources. func (a *ServerWithRoles) DeleteAllKubernetesClusters(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindKubernetesCluster, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindKubernetesCluster, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } // Make sure to only delete kubernetes cluster user has access to. @@ -6228,7 +6208,7 @@ func (a *ServerWithRoles) checkAccessToDatabase(database types.Database) error { // CreateDatabase creates a new database resource. func (a *ServerWithRoles) CreateDatabase(ctx context.Context, database types.Database) error { - if err := a.action(apidefaults.Namespace, types.KindDatabase, types.VerbCreate); err != nil { + if err := a.action(types.KindDatabase, types.VerbCreate); err != nil { return trace.Wrap(err) } // Don't allow users create databases they wouldn't have access to (e.g. @@ -6245,7 +6225,7 @@ func (a *ServerWithRoles) CreateDatabase(ctx context.Context, database types.Dat // UpdateDatabase updates existing database resource. func (a *ServerWithRoles) UpdateDatabase(ctx context.Context, database types.Database) error { - if err := a.action(apidefaults.Namespace, types.KindDatabase, types.VerbUpdate); err != nil { + if err := a.action(types.KindDatabase, types.VerbUpdate); err != nil { return trace.Wrap(err) } // Don't allow users update databases they don't have access to (e.g. @@ -6269,7 +6249,7 @@ func (a *ServerWithRoles) UpdateDatabase(ctx context.Context, database types.Dat // GetDatabase returns specified database resource. func (a *ServerWithRoles) GetDatabase(ctx context.Context, name string) (types.Database, error) { - if err := a.action(apidefaults.Namespace, types.KindDatabase, types.VerbRead); err != nil { + if err := a.action(types.KindDatabase, types.VerbRead); err != nil { return nil, trace.Wrap(err) } database, err := a.authServer.GetDatabase(ctx, name) @@ -6284,7 +6264,7 @@ func (a *ServerWithRoles) GetDatabase(ctx context.Context, name string) (types.D // GetDatabases returns all database resources. func (a *ServerWithRoles) GetDatabases(ctx context.Context) (result []types.Database, err error) { - if err := a.action(apidefaults.Namespace, types.KindDatabase, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindDatabase, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } // Filter out databases user doesn't have access to. @@ -6302,7 +6282,7 @@ func (a *ServerWithRoles) GetDatabases(ctx context.Context) (result []types.Data // DeleteDatabase removes the specified database resource. func (a *ServerWithRoles) DeleteDatabase(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindDatabase, types.VerbDelete); err != nil { + if err := a.action(types.KindDatabase, types.VerbDelete); err != nil { return trace.Wrap(err) } // Make sure user has access to the database before deleting. @@ -6318,7 +6298,7 @@ func (a *ServerWithRoles) DeleteDatabase(ctx context.Context, name string) error // DeleteAllDatabases removes all database resources. func (a *ServerWithRoles) DeleteAllDatabases(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindDatabase, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindDatabase, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } // Make sure to only delete databases user has access to. @@ -6338,7 +6318,7 @@ func (a *ServerWithRoles) DeleteAllDatabases(ctx context.Context) error { // GetWindowsDesktopServices returns all registered windows desktop services. func (a *ServerWithRoles) GetWindowsDesktopServices(ctx context.Context) ([]types.WindowsDesktopService, error) { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktopService, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindWindowsDesktopService, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } services, err := a.authServer.GetWindowsDesktopServices(ctx) @@ -6350,7 +6330,7 @@ func (a *ServerWithRoles) GetWindowsDesktopServices(ctx context.Context) ([]type // GetWindowsDesktopService returns a registered windows desktop service by name. func (a *ServerWithRoles) GetWindowsDesktopService(ctx context.Context, name string) (types.WindowsDesktopService, error) { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktopService, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindWindowsDesktopService, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } service, err := a.authServer.GetWindowsDesktopService(ctx, name) @@ -6362,7 +6342,7 @@ func (a *ServerWithRoles) GetWindowsDesktopService(ctx context.Context, name str // UpsertWindowsDesktopService creates or updates a new windows desktop service. func (a *ServerWithRoles) UpsertWindowsDesktopService(ctx context.Context, s types.WindowsDesktopService) (*types.KeepAlive, error) { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktopService, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindWindowsDesktopService, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } return a.authServer.UpsertWindowsDesktopService(ctx, s) @@ -6370,7 +6350,7 @@ func (a *ServerWithRoles) UpsertWindowsDesktopService(ctx context.Context, s typ // DeleteWindowsDesktopService removes the specified windows desktop service. func (a *ServerWithRoles) DeleteWindowsDesktopService(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktopService, types.VerbDelete); err != nil { + if err := a.action(types.KindWindowsDesktopService, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteWindowsDesktopService(ctx, name) @@ -6378,7 +6358,7 @@ func (a *ServerWithRoles) DeleteWindowsDesktopService(ctx context.Context, name // DeleteAllWindowsDesktopServices removes all registered windows desktop services. func (a *ServerWithRoles) DeleteAllWindowsDesktopServices(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktopService, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindWindowsDesktopService, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } return a.authServer.DeleteAllWindowsDesktopServices(ctx) @@ -6386,7 +6366,7 @@ func (a *ServerWithRoles) DeleteAllWindowsDesktopServices(ctx context.Context) e // GetWindowsDesktops returns all registered windows desktop hosts. func (a *ServerWithRoles) GetWindowsDesktops(ctx context.Context, filter types.WindowsDesktopFilter) ([]types.WindowsDesktop, error) { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktop, types.VerbList, types.VerbRead); err != nil { + if err := a.action(types.KindWindowsDesktop, types.VerbList, types.VerbRead); err != nil { return nil, trace.Wrap(err) } hosts, err := a.authServer.GetWindowsDesktops(ctx, filter) @@ -6402,7 +6382,7 @@ func (a *ServerWithRoles) GetWindowsDesktops(ctx context.Context, filter types.W // CreateWindowsDesktop creates a new windows desktop host. func (a *ServerWithRoles) CreateWindowsDesktop(ctx context.Context, s types.WindowsDesktop) error { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktop, types.VerbCreate); err != nil { + if err := a.action(types.KindWindowsDesktop, types.VerbCreate); err != nil { return trace.Wrap(err) } return a.authServer.CreateWindowsDesktop(ctx, s) @@ -6410,7 +6390,7 @@ func (a *ServerWithRoles) CreateWindowsDesktop(ctx context.Context, s types.Wind // UpdateWindowsDesktop updates an existing windows desktop host. func (a *ServerWithRoles) UpdateWindowsDesktop(ctx context.Context, s types.WindowsDesktop) error { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktop, types.VerbUpdate); err != nil { + if err := a.action(types.KindWindowsDesktop, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -6436,7 +6416,7 @@ func (a *ServerWithRoles) UpdateWindowsDesktop(ctx context.Context, s types.Wind // UpsertWindowsDesktop updates a windows desktop resource, creating it if it doesn't exist. func (a *ServerWithRoles) UpsertWindowsDesktop(ctx context.Context, s types.WindowsDesktop) error { // Ensure caller has both Create and Update permissions. - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktop, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindWindowsDesktop, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -6468,7 +6448,7 @@ func (a *ServerWithRoles) UpsertWindowsDesktop(ctx context.Context, s types.Wind // Passing an empty host ID will not trigger "delete all" behavior. To delete // all desktops, use DeleteAllWindowsDesktops. func (a *ServerWithRoles) DeleteWindowsDesktop(ctx context.Context, hostID, name string) error { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktop, types.VerbDelete); err != nil { + if err := a.action(types.KindWindowsDesktop, types.VerbDelete); err != nil { return trace.Wrap(err) } desktop, err := a.authServer.GetWindowsDesktops(ctx, @@ -6488,7 +6468,7 @@ func (a *ServerWithRoles) DeleteWindowsDesktop(ctx context.Context, hostID, name // DeleteAllWindowsDesktops removes all registered windows desktop hosts. func (a *ServerWithRoles) DeleteAllWindowsDesktops(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindWindowsDesktop, types.VerbList, types.VerbDelete); err != nil { + if err := a.action(types.KindWindowsDesktop, types.VerbList, types.VerbDelete); err != nil { return trace.Wrap(err) } // Only delete the desktops the user has access to. @@ -6549,7 +6529,7 @@ func (a *ServerWithRoles) GetDesktopBootstrapScript(ctx context.Context) (*proto // GetConnectionDiagnostic returns the connection diagnostic with the matching name func (a *ServerWithRoles) GetConnectionDiagnostic(ctx context.Context, name string) (types.ConnectionDiagnostic, error) { - if err := a.action(apidefaults.Namespace, types.KindConnectionDiagnostic, types.VerbRead); err != nil { + if err := a.action(types.KindConnectionDiagnostic, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -6563,7 +6543,7 @@ func (a *ServerWithRoles) GetConnectionDiagnostic(ctx context.Context, name stri // CreateConnectionDiagnostic creates a new connection diagnostic. func (a *ServerWithRoles) CreateConnectionDiagnostic(ctx context.Context, connectionDiagnostic types.ConnectionDiagnostic) error { - if err := a.action(apidefaults.Namespace, types.KindConnectionDiagnostic, types.VerbCreate); err != nil { + if err := a.action(types.KindConnectionDiagnostic, types.VerbCreate); err != nil { return trace.Wrap(err) } @@ -6576,7 +6556,7 @@ func (a *ServerWithRoles) CreateConnectionDiagnostic(ctx context.Context, connec // UpdateConnectionDiagnostic updates a connection diagnostic. func (a *ServerWithRoles) UpdateConnectionDiagnostic(ctx context.Context, connectionDiagnostic types.ConnectionDiagnostic) error { - if err := a.action(apidefaults.Namespace, types.KindConnectionDiagnostic, types.VerbUpdate); err != nil { + if err := a.action(types.KindConnectionDiagnostic, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -6589,7 +6569,7 @@ func (a *ServerWithRoles) UpdateConnectionDiagnostic(ctx context.Context, connec // AppendDiagnosticTrace adds a new trace for the given ConnectionDiagnostic. func (a *ServerWithRoles) AppendDiagnosticTrace(ctx context.Context, name string, t *types.ConnectionDiagnosticTrace) (types.ConnectionDiagnostic, error) { - if err := a.action(apidefaults.Namespace, types.KindConnectionDiagnostic, types.VerbUpdate); err != nil { + if err := a.action(types.KindConnectionDiagnostic, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } @@ -6749,7 +6729,7 @@ func (a *ServerWithRoles) GetAccountRecoveryCodes(ctx context.Context, req *prot // certificate authorities. func (a *ServerWithRoles) GenerateCertAuthorityCRL(ctx context.Context, caType types.CertAuthType) ([]byte, error) { // Assume this is a user request, check if the user has permission to read CAs. - err := a.action(apidefaults.Namespace, types.KindCertAuthority, types.VerbReadNoSecrets) + err := a.action(types.KindCertAuthority, types.VerbReadNoSecrets) if err != nil { // An error means the user doesn't have permission to read CAs, or this // is an admin on the auth server or the windows desktop service. We @@ -6775,7 +6755,7 @@ func (a *ServerWithRoles) GenerateCertAuthorityCRL(ctx context.Context, caType t // SubmitUsageEvent submits an external usage event. func (a *ServerWithRoles) SubmitUsageEvent(ctx context.Context, req *proto.SubmitUsageEventRequest) error { - if err := a.action(apidefaults.Namespace, types.KindUsageEvent, types.VerbCreate); err != nil { + if err := a.action(types.KindUsageEvent, types.VerbCreate); err != nil { return trace.Wrap(err) } @@ -6788,7 +6768,7 @@ func (a *ServerWithRoles) SubmitUsageEvent(ctx context.Context, req *proto.Submi // GetLicense returns the license used to start the auth server func (a *ServerWithRoles) GetLicense(ctx context.Context) (string, error) { - if err := a.action(apidefaults.Namespace, types.KindLicense, types.VerbRead); err != nil { + if err := a.action(types.KindLicense, types.VerbRead); err != nil { return "", trace.Wrap(err) } return a.authServer.GetLicense(ctx) @@ -6798,7 +6778,7 @@ func (a *ServerWithRoles) GetLicense(ctx context.Context) (string, error) { func (a *ServerWithRoles) ListReleases(ctx context.Context) ([]*types.Release, error) { // on Cloud, any user is allowed to list releases if !modules.GetModules().Features().Cloud { - if err := a.action(apidefaults.Namespace, types.KindDownload, types.VerbList); err != nil { + if err := a.action(types.KindDownload, types.VerbList); err != nil { return nil, trace.Wrap(err) } } @@ -6817,7 +6797,7 @@ func (a *ServerWithRoles) checkAccessToSAMLIdPServiceProvider(sp types.SAMLIdPSe // ListSAMLIdPServiceProviders returns a paginated list of SAML IdP service provider resources. func (a *ServerWithRoles) ListSAMLIdPServiceProviders(ctx context.Context, pageSize int, nextToken string) ([]types.SAMLIdPServiceProvider, string, error) { - if err := a.action(apidefaults.Namespace, types.KindSAMLIdPServiceProvider, types.VerbList); err != nil { + if err := a.action(types.KindSAMLIdPServiceProvider, types.VerbList); err != nil { return nil, "", trace.Wrap(err) } @@ -6842,7 +6822,7 @@ func (a *ServerWithRoles) ListSAMLIdPServiceProviders(ctx context.Context, pageS // GetSAMLIdPServiceProvider returns the specified SAML IdP service provider resources. func (a *ServerWithRoles) GetSAMLIdPServiceProvider(ctx context.Context, name string) (types.SAMLIdPServiceProvider, error) { - if err := a.action(apidefaults.Namespace, types.KindSAMLIdPServiceProvider, types.VerbRead); err != nil { + if err := a.action(types.KindSAMLIdPServiceProvider, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -6884,7 +6864,7 @@ func (a *ServerWithRoles) CreateSAMLIdPServiceProvider(ctx context.Context, sp t } }() - if err = a.action(apidefaults.Namespace, types.KindSAMLIdPServiceProvider, types.VerbCreate); err != nil { + if err = a.action(types.KindSAMLIdPServiceProvider, types.VerbCreate); err != nil { return trace.Wrap(err) } @@ -6937,7 +6917,7 @@ func (a *ServerWithRoles) UpdateSAMLIdPServiceProvider(ctx context.Context, sp t } }() - if err := a.action(apidefaults.Namespace, types.KindSAMLIdPServiceProvider, types.VerbUpdate); err != nil { + if err := a.action(types.KindSAMLIdPServiceProvider, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -7003,7 +6983,7 @@ func (a *ServerWithRoles) DeleteSAMLIdPServiceProvider(ctx context.Context, name } }() - if err := a.action(apidefaults.Namespace, types.KindSAMLIdPServiceProvider, types.VerbDelete); err != nil { + if err := a.action(types.KindSAMLIdPServiceProvider, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -7051,7 +7031,7 @@ func (a *ServerWithRoles) DeleteAllSAMLIdPServiceProviders(ctx context.Context) } }() - if err := a.action(apidefaults.Namespace, types.KindSAMLIdPServiceProvider, types.VerbDelete); err != nil { + if err := a.action(types.KindSAMLIdPServiceProvider, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -7089,7 +7069,7 @@ func (a *ServerWithRoles) checkAccessToUserGroup(userGroup types.UserGroup) erro // ListUserGroups returns a paginated list of user group resources. func (a *ServerWithRoles) ListUserGroups(ctx context.Context, pageSize int, nextToken string) ([]types.UserGroup, string, error) { - if err := a.action(apidefaults.Namespace, types.KindUserGroup, types.VerbList); err != nil { + if err := a.action(types.KindUserGroup, types.VerbList); err != nil { return nil, "", trace.Wrap(err) } @@ -7135,7 +7115,7 @@ func (a *ServerWithRoles) ListUserGroups(ctx context.Context, pageSize int, next // GetUserGroup returns the specified user group resources. func (a *ServerWithRoles) GetUserGroup(ctx context.Context, name string) (types.UserGroup, error) { - if err := a.action(apidefaults.Namespace, types.KindUserGroup, types.VerbRead); err != nil { + if err := a.action(types.KindUserGroup, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -7153,7 +7133,7 @@ func (a *ServerWithRoles) GetUserGroup(ctx context.Context, name string) (types. // CreateUserGroup creates a new user group resource. func (a *ServerWithRoles) CreateUserGroup(ctx context.Context, userGroup types.UserGroup) error { - if err := a.action(apidefaults.Namespace, types.KindUserGroup, types.VerbCreate); err != nil { + if err := a.action(types.KindUserGroup, types.VerbCreate); err != nil { return trace.Wrap(err) } @@ -7170,7 +7150,7 @@ func (a *ServerWithRoles) CreateUserGroup(ctx context.Context, userGroup types.U // UpdateUserGroup updates an existing user group resource. func (a *ServerWithRoles) UpdateUserGroup(ctx context.Context, userGroup types.UserGroup) error { - if err := a.action(apidefaults.Namespace, types.KindUserGroup, types.VerbUpdate); err != nil { + if err := a.action(types.KindUserGroup, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -7192,7 +7172,7 @@ func (a *ServerWithRoles) UpdateUserGroup(ctx context.Context, userGroup types.U // DeleteUserGroup removes the specified user group resource. func (a *ServerWithRoles) DeleteUserGroup(ctx context.Context, name string) error { - if err := a.action(apidefaults.Namespace, types.KindUserGroup, types.VerbDelete); err != nil { + if err := a.action(types.KindUserGroup, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -7214,7 +7194,7 @@ func (a *ServerWithRoles) DeleteUserGroup(ctx context.Context, name string) erro // DeleteAllUserGroups removes all user groups. func (a *ServerWithRoles) DeleteAllUserGroups(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindUserGroup, types.VerbDelete); err != nil { + if err := a.action(types.KindUserGroup, types.VerbDelete); err != nil { return trace.Wrap(err) } @@ -7396,7 +7376,7 @@ func (a *ServerWithRoles) ExportUpgradeWindows(ctx context.Context, req proto.Ex // GetClusterMaintenanceConfig gets the current maintenance config singleton. func (a *ServerWithRoles) GetClusterMaintenanceConfig(ctx context.Context) (types.ClusterMaintenanceConfig, error) { - if err := a.action(apidefaults.Namespace, types.KindClusterMaintenanceConfig, types.VerbRead); err != nil { + if err := a.action(types.KindClusterMaintenanceConfig, types.VerbRead); err != nil { return nil, trace.Wrap(err) } @@ -7405,7 +7385,7 @@ func (a *ServerWithRoles) GetClusterMaintenanceConfig(ctx context.Context) (type // UpdateClusterMaintenanceConfig updates the current maintenance config singleton. func (a *ServerWithRoles) UpdateClusterMaintenanceConfig(ctx context.Context, cmc types.ClusterMaintenanceConfig) error { - if err := a.action(apidefaults.Namespace, types.KindClusterMaintenanceConfig, types.VerbCreate, types.VerbUpdate); err != nil { + if err := a.action(types.KindClusterMaintenanceConfig, types.VerbCreate, types.VerbUpdate); err != nil { return trace.Wrap(err) } @@ -7419,7 +7399,7 @@ func (a *ServerWithRoles) UpdateClusterMaintenanceConfig(ctx context.Context, cm } func (a *ServerWithRoles) DeleteClusterMaintenanceConfig(ctx context.Context) error { - if err := a.action(apidefaults.Namespace, types.KindClusterMaintenanceConfig, types.VerbDelete); err != nil { + if err := a.action(types.KindClusterMaintenanceConfig, types.VerbDelete); err != nil { return trace.Wrap(err) } if modules.GetModules().Features().Cloud { diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index 48a32faf0a987..f7b12fcae29b8 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -49,12 +49,15 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" trustpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/trust/v1" userpreferencesv1 "github.com/gravitational/teleport/api/gen/proto/go/userpreferences/v1" "github.com/gravitational/teleport/api/metadata" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" + apicommon "github.com/gravitational/teleport/api/types/common" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/types/installers" wanpb "github.com/gravitational/teleport/api/types/webauthn" @@ -1078,6 +1081,7 @@ func TestGenerateUserCertsWithMFAVerification(t *testing.T) { }) } } + func TestGenerateUserCertsWithRoleRequest(t *testing.T) { ctx := context.Background() srv := newTestTLSServer(t) @@ -5113,6 +5117,19 @@ func TestListUnifiedResources_WithLogins(t *testing.T) { return srv.Auth().UnifiedResourceCache.IsInitialized() }, 5*time.Second, 200*time.Millisecond, "unified resource watcher never initialized") + // create user and client + logins := []string{"llama", "fish"} + user, _, err := CreateUserAndRole(srv.Auth(), "user", nil /*mutated with role mutator*/, nil, + WithRoleMutator( + func(role types.Role) { + role.SetLogins(types.Allow, logins) + role.SetWindowsLogins(types.Allow, logins) + role.SetWindowsDesktopLabels(types.Allow, types.Labels{types.Wildcard: []string{types.Wildcard}}) + role.SetAWSRoleARNs(types.Allow, logins) + }), + ) + require.NoError(t, err) + for i := 0; i < 5; i++ { name := uuid.New().String() node, err := types.NewServerWithLabels( @@ -5170,32 +5187,18 @@ func TestListUnifiedResources_WithLogins(t *testing.T) { require.NoError(t, err) } - // create user and client - logins := []string{"llama", "fish"} - user, role, err := CreateUserAndRole(srv.Auth(), "user", logins, nil) - require.NoError(t, err) - role.SetWindowsDesktopLabels(types.Allow, types.Labels{types.Wildcard: []string{types.Wildcard}}) - role.SetWindowsLogins(types.Allow, logins) - role.SetAppLabels(types.Allow, types.Labels{types.Wildcard: []string{types.Wildcard}}) - role.SetAWSRoleARNs(types.Allow, logins) - _, err = srv.Auth().UpdateRole(ctx, role) - require.NoError(t, err) - clt, err := srv.NewClient(TestUser(user.GetName())) require.NoError(t, err) - var results []*proto.PaginatedResource + resultsC := make(chan []*proto.PaginatedResource, 1) // Immediately listing resources can be problematic, given that not all were // necessarily replicated in the unified resources cache. To cover this // scenario, perform multiple attempts (if necessary) to read the complete // list of resources. require.EventuallyWithT(t, func(t *assert.CollectT) { - // Reset the resources list to avoid having items from previous - // iterations. - results = nil - var start string + var results []*proto.PaginatedResource for { resp, err := clt.ListUnifiedResources(ctx, &proto.ListUnifiedResourcesRequest{ Limit: 5, @@ -5216,13 +5219,21 @@ func TestListUnifiedResources_WithLogins(t *testing.T) { // Note: this number should be updated in case we add more resources to // the setup loop. - assert.Len(t, results, 20) - }, 10*time.Second, 100*time.Millisecond, "unable to list all resources, expected 20 but got %d", len(results)) + if !assert.Len(t, results, 20) { + return + } + resultsC <- results + }, 10*time.Second, 100*time.Millisecond, "unable to list all resources") + results := <-resultsC // Check that only server, desktop, and app server resources contain the expected logins - for _, resource := range results { + expectPrincipals := func(resource *proto.PaginatedResource) bool { isAWSConsoleApp := resource.GetAppServer() != nil && resource.GetAppServer().GetApp().IsAWSConsole() - if resource.GetNode() != nil || resource.GetWindowsDesktop() != nil || isAWSConsoleApp { + return resource.GetNode() != nil || resource.GetWindowsDesktop() != nil || isAWSConsoleApp + } + + for _, resource := range results { + if expectPrincipals(resource) { require.Empty(t, cmp.Diff(resource.Logins, logins, cmpopts.SortSlices(func(a, b string) bool { return strings.Compare(a, b) < 0 })), "mismatch on expected logins list for resource %T", resource.Resource) @@ -5690,7 +5701,8 @@ func TestListUnifiedResources_MixedAccess(t *testing.T) { Limit: 20, SortBy: types.SortBy{IsDesc: true, Field: types.ResourceMetadataName}, }) - require.True(t, trace.IsAccessDenied(err)) + + require.True(t, trace.IsAccessDenied(err), "Expected Access Denied, got %v", err) require.Nil(t, resp) // Validate that an error is returned when a subset of kinds are requested. @@ -5765,6 +5777,57 @@ func TestListUnifiedResources_WithPredicate(t *testing.T) { require.Error(t, err) } +func TestUnifiedResources_IdentityCenter(t *testing.T) { + ctx := context.Background() + srv := newTestTLSServer(t, withCacheEnabled(true)) + + require.Eventually(t, func() bool { + return srv.Auth().UnifiedResourceCache.IsInitialized() + }, 5*time.Second, 200*time.Millisecond, "unified resource watcher never initialized") + + _, err := srv.Auth().CreateIdentityCenterAccount(ctx, services.IdentityCenterAccount{ + Account: &identitycenterv1.Account{ + Kind: types.KindIdentityCenterAccount, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "test_acct", + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }, + Spec: &identitycenterv1.AccountSpec{ + Id: "11111111", + Arn: "some:arn", + Name: "Test Account", + }, + }, + }) + require.NoError(t, err) + + t.Run("access denied", func(t *testing.T) { + // Asserts that, with no RBAC or matchers in place, acces to IC Accounts + // is denied by default + + userNoAccess, _, err := CreateUserAndRole(srv.Auth(), "test", nil, nil) + require.NoError(t, err) + + identity := TestUser(userNoAccess.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + defer clt.Close() + + _, err = clt.ListResources(ctx, proto.ListResourcesRequest{ + ResourceType: types.KindIdentityCenterAccount, + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }) + require.True(t, trace.IsAccessDenied(err)) + }) + + // TODO(tcsc): Add other tests one RBAC implemented +} + func BenchmarkListUnifiedResourcesFilter(b *testing.B) { const nodeCount = 150_000 const roleCount = 32 diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index d2e206fd8dd51..2a9d3095b4137 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -1242,6 +1242,9 @@ type Cache interface { // ListAccountAssignments fetches a paginated list of IdentityCenter Account Assignments ListAccountAssignments(context.Context, int, *pagination.PageRequestToken) ([]services.IdentityCenterAccountAssignment, pagination.NextPageToken, error) + + // GetPluginStaticCredentialsByLabels will get a list of plugin static credentials resource by matching labels. + GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) } type NodeWrapper struct { diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index 5376d6161baa3..4217b12a5991e 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -35,6 +35,7 @@ import ( "github.com/gravitational/teleport/api/client/databaseobject" "github.com/gravitational/teleport/api/client/dynamicwindows" "github.com/gravitational/teleport/api/client/externalauditstorage" + "github.com/gravitational/teleport/api/client/gitserver" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/client/secreport" "github.com/gravitational/teleport/api/client/usertask" @@ -43,7 +44,6 @@ import ( clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" dbobjectimportrulev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobjectimportrule/v1" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" - gitserverv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" integrationv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" @@ -1892,6 +1892,9 @@ type ClientI interface { // ProvisioningServiceClient returns provisioning service client. ProvisioningServiceClient() provisioningv1.ProvisioningServiceClient + // IntegrationsClient returns integrations client. + IntegrationsClient() integrationv1.IntegrationServiceClient + // GitServerClient returns git server client. - GitServerClient() gitserverv1.GitServerServiceClient + GitServerClient() *gitserver.Client } diff --git a/lib/auth/bot_test.go b/lib/auth/bot_test.go index 5ff53115b5374..ae4ddb14136b9 100644 --- a/lib/auth/bot_test.go +++ b/lib/auth/bot_test.go @@ -62,7 +62,8 @@ import ( libevents "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/events/eventstest" "github.com/gravitational/teleport/lib/fixtures" - "github.com/gravitational/teleport/lib/kubernetestoken" + "github.com/gravitational/teleport/lib/kube/token" + kubetoken "github.com/gravitational/teleport/lib/kube/token" "github.com/gravitational/teleport/lib/reversetunnelclient" "github.com/gravitational/teleport/lib/tbot/identity" "github.com/gravitational/teleport/lib/tlsca" @@ -764,9 +765,9 @@ func TestRegisterBot_BotInstanceRejoin(t *testing.T) { k8sReadFileFunc := func(name string) ([]byte, error) { return []byte(k8sTokenName), nil } - a.k8sJWKSValidator = func(_ time.Time, _ []byte, _ string, token string) (*kubernetestoken.ValidationResult, error) { + a.k8sJWKSValidator = func(_ time.Time, _ []byte, _ string, token string) (*token.ValidationResult, error) { if token == k8sTokenName { - return &kubernetestoken.ValidationResult{Username: "system:serviceaccount:static-jwks:matching"}, nil + return &kubetoken.ValidationResult{Username: "system:serviceaccount:static-jwks:matching"}, nil } return nil, errMockInvalidToken @@ -919,9 +920,9 @@ func TestRegisterBotWithInvalidInstanceID(t *testing.T) { botName := "bot" k8sTokenName := "jwks-matching-service-account" - a.k8sJWKSValidator = func(_ time.Time, _ []byte, _ string, token string) (*kubernetestoken.ValidationResult, error) { + a.k8sJWKSValidator = func(_ time.Time, _ []byte, _ string, token string) (*token.ValidationResult, error) { if token == k8sTokenName { - return &kubernetestoken.ValidationResult{Username: "system:serviceaccount:static-jwks:matching"}, nil + return &kubetoken.ValidationResult{Username: "system:serviceaccount:static-jwks:matching"}, nil } return nil, errMockInvalidToken diff --git a/lib/auth/grpcserver_test.go b/lib/auth/grpcserver_test.go index 2890b255f7114..ed8e61bd00a85 100644 --- a/lib/auth/grpcserver_test.go +++ b/lib/auth/grpcserver_test.go @@ -1719,6 +1719,47 @@ func TestGenerateUserCerts_singleUseCerts(t *testing.T) { }, }, }, + { + desc: "TCP app with target port", + opts: generateUserSingleUseCertsTestOpts{ + initReq: &proto.UserCertsRequest{ + TLSPublicKey: tlsPub, + Username: user.GetName(), + // This expiry is longer than allowed, should be + // automatically adjusted. + Expires: clock.Now().Add(2 * teleport.UserSingleUseCertTTL), + Usage: proto.UserCertsRequest_App, + RouteToApp: proto.RouteToApp{ + Name: "app-a", + TargetPort: 1337, + }, + }, + mfaRequiredHandler: func(t *testing.T, required proto.MFARequired) { + require.Equal(t, proto.MFARequired_MFA_REQUIRED_YES, required) + }, + authnHandler: registered.webAuthHandler, + verifyErr: require.NoError, + verifyCert: func(t *testing.T, c *proto.Certs) { + crt := c.TLS + require.NotEmpty(t, crt) + + cert, err := tlsca.ParseCertificatePEM(crt) + require.NoError(t, err) + require.Equal(t, cert.NotAfter, clock.Now().Add(teleport.UserSingleUseCertTTL)) + + identity, err := tlsca.FromSubject(cert.Subject, cert.NotAfter) + require.NoError(t, err) + require.Equal(t, webDevID, identity.MFAVerified) + require.Equal(t, userCertExpires, identity.PreviousIdentityExpires) + require.True(t, net.ParseIP(identity.LoginIP).IsLoopback()) + require.Equal(t, []string{teleport.UsageAppsOnly}, identity.Usage) + require.Equal(t, "app-a", identity.RouteToApp.Name) + require.Equal(t, 1337, identity.RouteToApp.TargetPort) + // session ID should be set to a random ID, corresponding to an app session. + require.NotZero(t, identity.RouteToApp.SessionID) + }, + }, + }, { desc: "db with ttl limit disabled", opts: generateUserSingleUseCertsTestOpts{ diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index dd1b2fcf7e414..71804b4ca0049 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -370,6 +370,8 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { WebToken: svces.WebTokens(), WindowsDesktops: svces.WindowsDesktops, DynamicWindowsDesktops: svces.DynamicWindowsDesktops, + PluginStaticCredentials: svces.PluginStaticCredentials, + GitServers: svces.GitServers, }) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/auth/init.go b/lib/auth/init.go index 0b14c88dffb8a..10987111ba6e1 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -26,6 +26,7 @@ import ( "errors" "fmt" "log/slog" + "os" "slices" "strings" "sync" @@ -786,14 +787,15 @@ func initializeAuthPreference(ctx context.Context, asrv *Server, newAuthPref typ } if !shouldReplace { - if err := modules.ValidateResource(storedAuthPref); err != nil { + if os.Getenv(teleport.EnvVarAllowNoSecondFactor) != "true" { + err := modules.ValidateResource(storedAuthPref) if errors.Is(err, modules.ErrCannotDisableSecondFactor) { return trace.Wrap(err, secondFactorUpgradeInstructions) } - - return trace.Wrap(err) + if err != nil { + return trace.Wrap(err) + } } - return nil } diff --git a/lib/auth/integration/credentials/credentials.go b/lib/auth/integration/credentials/credentials.go new file mode 100644 index 0000000000000..2c16a39568395 --- /dev/null +++ b/lib/auth/integration/credentials/credentials.go @@ -0,0 +1,107 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package credentials + +import ( + "context" + "maps" + + "github.com/google/uuid" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" +) + +// Package credentials defines constants and provides helper functions for +// integration credentials. + +const ( + // LabelStaticCredentialsIntegration is the label used to store the + // UUID ref in the static credentials. + LabelStaticCredentialsIntegration = types.TeleportInternalLabelPrefix + types.KindIntegration + // LabelStaticCredentialsPurpose is the label used to store the purpose of + // the static credentials. + LabelStaticCredentialsPurpose = "purpose" + + // PurposeGitHubSSHCA is the label value that indicates the static + // credentials contains the GitHub SSH CA. + PurposeGitHubSSHCA = "github-sshca" + // PurposeGitHubOAuth is the label value that indicates the static + // credentials contains the GitHub OAuth ID and secret. + PurposeGitHubOAuth = "github-oauth" +) + +// NewRef creates a new PluginStaticCredentialsRef that is saved along with the +// integration resource in the backend. The actual credentials are saved as +// PlugStaticCredentials and can only be retrieved by the ref. +func NewRef() *types.PluginStaticCredentialsRef { + return NewRefWithUUID(uuid.NewString()) +} + +// NewRefWithUUID creates a PluginStaticCredentialsRef with provided UUID. +func NewRefWithUUID(uuid string) *types.PluginStaticCredentialsRef { + return &types.PluginStaticCredentialsRef{ + Labels: map[string]string{ + LabelStaticCredentialsIntegration: uuid, + }, + } +} + +// CopyRefLabels copies the labels from the Ref to the actual credentials so the +// credentials can be retrieved using the same labels. +func CopyRefLabels(cred types.PluginStaticCredentials, ref *types.PluginStaticCredentialsRef) { + labels := cred.GetStaticLabels() + if labels == nil { + labels = make(map[string]string) + } + maps.Copy(labels, ref.Labels) + + cred.SetStaticLabels(labels) +} + +// ByLabelsGetter defines an interface to retrieve credentials by labels. +type ByLabelsGetter interface { + // GetPluginStaticCredentialsByLabels will get a list of plugin static credentials resource by matching labels. + GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) +} + +// GetByPurpose retrieves a credentials based on the provided purpose. +func GetByPurpose(ctx context.Context, ref *types.PluginStaticCredentialsRef, purpose string, getter ByLabelsGetter) (types.PluginStaticCredentials, error) { + if ref == nil { + return nil, trace.BadParameter("missing credentials ref") + } + labels := ref.Labels + if len(labels) == 0 { + return nil, trace.BadParameter("missing labels from credentials ref") + } + labels[LabelStaticCredentialsPurpose] = purpose + + creds, err := getter.GetPluginStaticCredentialsByLabels(ctx, labels) + if err != nil { + return nil, trace.Wrap(err) + } + switch len(creds) { + case 0: + return nil, trace.NotFound("%v credentials not found", purpose) + case 1: + return creds[0], nil + default: + return nil, trace.CompareFailed("expecting one plugin static credentials but got %v", len(creds)) + } +} diff --git a/lib/auth/integration/credentials/credentials_test.go b/lib/auth/integration/credentials/credentials_test.go new file mode 100644 index 0000000000000..03cc55c345d6e --- /dev/null +++ b/lib/auth/integration/credentials/credentials_test.go @@ -0,0 +1,139 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package credentials + +import ( + "context" + "fmt" + "maps" + "testing" + + "github.com/google/uuid" + "github.com/gravitational/trace" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" +) + +type mockByLabelsGetter struct { + mock.Mock +} + +func (m *mockByLabelsGetter) GetPluginStaticCredentialsByLabels(_ context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) { + args := m.Called(labels) + creds, ok := args.Get(0).([]types.PluginStaticCredentials) + if ok { + return creds, args.Error(1) + } + return nil, args.Error(1) +} + +func mustMakeCred(t *testing.T, labels map[string]string) types.PluginStaticCredentials { + t.Helper() + cred, err := types.NewPluginStaticCredentials( + types.Metadata{ + Name: uuid.NewString(), + Labels: labels, + }, + types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_APIToken{ + APIToken: "token", + }, + }, + ) + require.NoError(t, err) + return cred +} + +func TestGetByPurpose(t *testing.T) { + ref := NewRef() + purpose := "test-found" + labels := map[string]string{LabelStaticCredentialsPurpose: purpose} + maps.Copy(labels, ref.Labels) + cred := mustMakeCred(t, labels) + + tests := []struct { + name string + ref *types.PluginStaticCredentialsRef + setupMock func(m *mockByLabelsGetter) + wantError func(error) bool + wantCred types.PluginStaticCredentials + }{ + { + name: "nil ref", + ref: nil, + wantError: trace.IsBadParameter, + }, + { + name: "success", + ref: ref, + setupMock: func(m *mockByLabelsGetter) { + m.On("GetPluginStaticCredentialsByLabels", labels). + Return([]types.PluginStaticCredentials{cred}, nil) + }, + wantCred: cred, + }, + { + name: "no creds found", + ref: ref, + setupMock: func(m *mockByLabelsGetter) { + m.On("GetPluginStaticCredentialsByLabels", labels). + Return([]types.PluginStaticCredentials{}, nil) + }, + wantError: trace.IsNotFound, + }, + { + name: "too mandy creds found", + ref: ref, + setupMock: func(m *mockByLabelsGetter) { + m.On("GetPluginStaticCredentialsByLabels", labels). + Return([]types.PluginStaticCredentials{cred, mustMakeCred(t, labels)}, nil) + }, + wantError: trace.IsCompareFailed, + }, + { + name: "backend issue", + ref: ref, + setupMock: func(m *mockByLabelsGetter) { + m.On("GetPluginStaticCredentialsByLabels", labels). + Return(nil, trace.ConnectionProblem(fmt.Errorf("backend"), "problem")) + }, + wantError: trace.IsConnectionProblem, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + m := &mockByLabelsGetter{} + if test.setupMock != nil { + test.setupMock(m) + } + + cred, err := GetByPurpose(context.Background(), test.ref, purpose, m) + if test.wantError != nil { + require.True(t, test.wantError(err)) + return + } + + require.NoError(t, err) + require.Equal(t, test.wantCred, cred) + }) + } +} diff --git a/lib/auth/integration/integrationv1/credentials.go b/lib/auth/integration/integrationv1/credentials.go index 7ea4935461b42..4d6cb888d2012 100644 --- a/lib/auth/integration/integrationv1/credentials.go +++ b/lib/auth/integration/integrationv1/credentials.go @@ -20,47 +20,42 @@ package integrationv1 import ( "context" - "maps" "github.com/google/uuid" "github.com/gravitational/trace" + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth/integration/credentials" "github.com/gravitational/teleport/lib/cryptosuites" ) -const ( - // labelStaticCredentialsIntegration is the label used to store the - // UUID ref in the static credentials. - labelStaticCredentialsIntegration = types.TeleportInternalLabelPrefix + types.KindIntegration - // labelStaticCredentialsPurpose is the label used to store the purpose of - // the static credentials. - labelStaticCredentialsPurpose = "purpose" - - // purposeGitHubSSHCA is the label value that indicates the static - // credentials contains the GitHub SSH CA. - purposeGitHubSSHCA = "github-sshca" - // purposeGitHubOAuth is the label value that indicates the static - // credentials contains the GitHub OAuth ID and secret. - purposeGitHubOAuth = "github-oauth" -) - -func newStaticCredentialsRef(uuid string) *types.PluginStaticCredentialsRef { - return &types.PluginStaticCredentialsRef{ - Labels: map[string]string{ - labelStaticCredentialsIntegration: uuid, - }, +// ExportIntegrationCertAuthorities exports cert authorities for an integration. +func (s *Service) ExportIntegrationCertAuthorities(ctx context.Context, in *integrationpb.ExportIntegrationCertAuthoritiesRequest) (*integrationpb.ExportIntegrationCertAuthoritiesResponse, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) } -} - -func copyRefLabels(cred types.PluginStaticCredentials, ref *types.PluginStaticCredentialsRef) { - labels := cred.GetStaticLabels() - if labels == nil { - labels = make(map[string]string) + if err := authCtx.CheckAccessToKind(types.KindIntegration, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + ig, err := s.cache.GetIntegration(ctx, in.Integration) + if err != nil { + return nil, trace.Wrap(err) } - maps.Copy(labels, ref.Labels) - cred.SetStaticLabels(labels) + // Currently only public keys are exported. + switch ig.GetSubKind() { + case types.IntegrationSubKindGitHub: + caKeySet, err := s.getGitHubCertAuthorities(ctx, ig) + if err != nil { + return nil, trace.Wrap(err) + } + caKeySetWithoutSecerts := caKeySet.WithoutSecrets() + return &integrationpb.ExportIntegrationCertAuthoritiesResponse{CertAuthorities: &caKeySetWithoutSecerts}, nil + default: + return nil, trace.BadParameter("unsupported for integration subkind %v", ig.GetSubKind()) + } } func buildGitHubOAuthCredentials(ig types.Integration) (*types.PluginStaticCredentialsV1, error) { @@ -73,7 +68,7 @@ func buildGitHubOAuthCredentials(ig types.Integration) (*types.PluginStaticCrede Metadata: types.Metadata{ Name: uuid.NewString(), Labels: map[string]string{ - labelStaticCredentialsPurpose: purposeGitHubOAuth, + credentials.LabelStaticCredentialsPurpose: credentials.PurposeGitHubOAuth, }, }, }, @@ -98,7 +93,7 @@ func (s *Service) newGitHubSSHCA(ctx context.Context) (*types.PluginStaticCreden Metadata: types.Metadata{ Name: uuid.NewString(), Labels: map[string]string{ - labelStaticCredentialsPurpose: purposeGitHubSSHCA, + credentials.LabelStaticCredentialsPurpose: credentials.PurposeGitHubSSHCA, }, }, }, @@ -132,11 +127,11 @@ func (s *Service) createGitHubCredentials(ctx context.Context, ig types.Integrat } func (s *Service) createStaticCredentials(ctx context.Context, ig types.Integration, creds ...types.PluginStaticCredentials) error { - ref := newStaticCredentialsRef(uuid.NewString()) + ref := credentials.NewRef() for _, cred := range creds { s.logger.DebugContext(ctx, "Creating static credentials", "integration", ig.GetName(), "labels", cred.GetStaticLabels()) - copyRefLabels(cred, ref) + credentials.CopyRefLabels(cred, ref) if err := s.backend.CreatePluginStaticCredentials(ctx, cred); err != nil { return trace.Wrap(err) } @@ -185,7 +180,7 @@ func (s *Service) updateStaticCredentials(ctx context.Context, ig types.Integrat s.logger.DebugContext(ctx, "Updating static credentials", "integration", ig.GetName(), "labels", cred.GetStaticLabels()) // Use same labels to find existing credentials. - copyRefLabels(cred, ref) + credentials.CopyRefLabels(cred, ref) oldCreds, err := s.backend.GetPluginStaticCredentialsByLabels(ctx, cred.GetStaticLabels()) if err != nil { return trace.Wrap(err) @@ -226,3 +221,29 @@ func (s *Service) removeStaticCredentials(ctx context.Context, ig types.Integrat } return trace.NewAggregate(errors...) } + +func (s *Service) getStaticCredentialsWithPurpose(ctx context.Context, ig types.Integration, purpose string) (types.PluginStaticCredentials, error) { + if ig.GetCredentials() == nil { + return nil, trace.BadParameter("missing credentials") + } + + return credentials.GetByPurpose(ctx, ig.GetCredentials().GetStaticCredentialsRef(), purpose, s.cache) +} + +func (s *Service) getGitHubCertAuthorities(ctx context.Context, ig types.Integration) (*types.CAKeySet, error) { + if ig.GetSubKind() != types.IntegrationSubKindGitHub { + return nil, trace.BadParameter("integration is not a GitHub integration") + } + creds, err := s.getStaticCredentialsWithPurpose(ctx, ig, credentials.PurposeGitHubSSHCA) + if err != nil { + return nil, trace.Wrap(err) + } + + cas := creds.GetSSHCertAuthorities() + if len(cas) == 0 { + return nil, trace.BadParameter("missing SSH cert authorities from plugin static credentials") + } + return &types.CAKeySet{ + SSH: cas, + }, nil +} diff --git a/lib/auth/integration/integrationv1/credentials_test.go b/lib/auth/integration/integrationv1/credentials_test.go new file mode 100644 index 0000000000000..6e44eafe0a6cb --- /dev/null +++ b/lib/auth/integration/integrationv1/credentials_test.go @@ -0,0 +1,125 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package integrationv1 + +import ( + "context" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" +) + +func TestExportIntegrationCertAuthorities(t *testing.T) { + t.Parallel() + + ca := newCertAuthority(t, types.HostCA, "test-cluster") + ctx, localClient, resourceSvc := initSvc(t, ca, ca.GetClusterName(), "127.0.0.1") + + githubIntegration, err := newGitHubIntegration("github-my-org", "id", "secret") + require.NoError(t, err) + + oidcIntegration, err := types.NewIntegrationAWSOIDC( + types.Metadata{Name: "aws-oidc"}, + &types.AWSOIDCIntegrationSpecV1{ + RoleARN: "arn:aws:iam::123456789012:role/OpsTeam", + }, + ) + require.NoError(t, err) + + adminCtx := authz.ContextWithUser(ctx, authz.BuiltinRole{ + Role: types.RoleAdmin, + Username: string(types.RoleAdmin), + }) + + _, err = resourceSvc.CreateIntegration(adminCtx, &integrationpb.CreateIntegrationRequest{Integration: githubIntegration}) + require.NoError(t, err) + _, err = resourceSvc.CreateIntegration(adminCtx, &integrationpb.CreateIntegrationRequest{Integration: oidcIntegration}) + require.NoError(t, err) + + tests := []struct { + name string + integration string + identity context.Context + check func(*testing.T, *integrationpb.ExportIntegrationCertAuthoritiesResponse, error) + }{ + { + name: "success", + integration: githubIntegration.GetName(), + identity: adminCtx, + check: func(t *testing.T, resp *integrationpb.ExportIntegrationCertAuthoritiesResponse, err error) { + t.Helper() + require.NoError(t, err) + require.NotNil(t, resp) + require.NotNil(t, resp.CertAuthorities) + require.Len(t, resp.CertAuthorities.SSH, 1) + require.NotNil(t, resp.CertAuthorities.SSH[0]) + assert.NotEmpty(t, resp.CertAuthorities.SSH[0].PublicKey) + assert.Empty(t, resp.CertAuthorities.SSH[0].PrivateKey) + }, + }, + { + name: "not found", + integration: "not-found", + identity: adminCtx, + check: func(t *testing.T, resp *integrationpb.ExportIntegrationCertAuthoritiesResponse, err error) { + t.Helper() + require.Nil(t, resp) + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }, + }, + { + name: "not allowed", + integration: githubIntegration.GetName(), + identity: authorizerForDummyUser(t, ctx, types.RoleSpecV6{}, localClient), + check: func(t *testing.T, resp *integrationpb.ExportIntegrationCertAuthoritiesResponse, err error) { + t.Helper() + require.Nil(t, resp) + require.Error(t, err) + require.True(t, trace.IsAccessDenied(err)) + }, + }, + { + name: "not supported", + integration: oidcIntegration.GetName(), + identity: adminCtx, + check: func(t *testing.T, resp *integrationpb.ExportIntegrationCertAuthoritiesResponse, err error) { + t.Helper() + require.Nil(t, resp) + require.Error(t, err) + require.True(t, trace.IsBadParameter(err)) + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + resp, err := resourceSvc.ExportIntegrationCertAuthorities(test.identity, &integrationpb.ExportIntegrationCertAuthoritiesRequest{ + Integration: test.integration, + }) + test.check(t, resp, err) + }) + } +} diff --git a/lib/auth/integration/integrationv1/github.go b/lib/auth/integration/integrationv1/github.go new file mode 100644 index 0000000000000..4283132b2d543 --- /dev/null +++ b/lib/auth/integration/integrationv1/github.go @@ -0,0 +1,103 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package integrationv1 + +import ( + "context" + "crypto/rand" + "time" + + "github.com/gravitational/trace" + "golang.org/x/crypto/ssh" + + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" +) + +// GenerateGitHubUserCert signs a SSH certificate for GitHub integration. +func (s *Service) GenerateGitHubUserCert(ctx context.Context, in *integrationpb.GenerateGitHubUserCertRequest) (*integrationpb.GenerateGitHubUserCertResponse, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if !authz.HasBuiltinRole(*authCtx, string(types.RoleProxy)) { + return nil, trace.AccessDenied("GenerateGitHubUserCert is only available to proxy services") + } + + cert, err := s.prepareGitHubCert(in) + if err != nil { + return nil, trace.Wrap(err) + } + caSigner, err := s.getGitHubSigner(ctx, in.Integration) + if err != nil { + return nil, trace.Wrap(err) + } + if err := cert.SignCert(rand.Reader, caSigner); err != nil { + return nil, trace.Wrap(err) + } + return &integrationpb.GenerateGitHubUserCertResponse{ + AuthorizedKey: ssh.MarshalAuthorizedKey(cert), + }, nil +} + +func (s *Service) prepareGitHubCert(in *integrationpb.GenerateGitHubUserCertRequest) (*ssh.Certificate, error) { + if in.UserId == "" { + return nil, trace.BadParameter("missing UserId for GenerateGitHubUserCert") + } + if in.KeyId == "" { + return nil, trace.BadParameter("missing KeyId for GenerateGitHubUserCert") + } + key, _, _, _, err := ssh.ParseAuthorizedKey(in.PublicKey) + if err != nil { + return nil, trace.Wrap(err) + } + // Sign with user ID set in id@github.com extension. + // https://docs.github.com/en/enterprise-cloud@latest/organizations/managing-git-access-to-your-organizations-repositories/about-ssh-certificate-authorities + now := s.clock.Now() + cert := &ssh.Certificate{ + Key: key, + CertType: ssh.UserCert, + KeyId: in.KeyId, + ValidAfter: uint64(now.Add(-time.Minute).Unix()), + ValidBefore: uint64(now.Add(in.Ttl.AsDuration()).Unix()), + Permissions: ssh.Permissions{ + Extensions: map[string]string{ + "id@github.com": in.UserId, + }, + }, + } + return cert, nil +} + +func (s *Service) getGitHubSigner(ctx context.Context, integration string) (ssh.Signer, error) { + ig, err := s.cache.GetIntegration(ctx, integration) + if err != nil { + return nil, trace.Wrap(err) + } + caKeySet, err := s.getGitHubCertAuthorities(ctx, ig) + if err != nil { + return nil, trace.Wrap(err) + } + caSigner, err := s.keyStoreManager.GetSSHSignerFromKeySet(ctx, *caKeySet) + if err != nil { + return nil, trace.Wrap(err) + } + return caSigner, nil +} diff --git a/lib/auth/integration/integrationv1/github_test.go b/lib/auth/integration/integrationv1/github_test.go new file mode 100644 index 0000000000000..44fccf55ccb4a --- /dev/null +++ b/lib/auth/integration/integrationv1/github_test.go @@ -0,0 +1,82 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package integrationv1 + +import ( + "testing" + "time" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/crypto/ssh" + "google.golang.org/protobuf/types/known/durationpb" + + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/cryptosuites" +) + +func TestGenerateGitHubUserCert(t *testing.T) { + t.Parallel() + + ca := newCertAuthority(t, types.HostCA, "test-cluster") + ctx, _, resourceSvc := initSvc(t, ca, ca.GetClusterName(), "127.0.0.1.nip.io") + + githubIntegration, err := newGitHubIntegration("github-my-org", "id", "secret") + require.NoError(t, err) + + adminCtx := authz.ContextWithUser(ctx, authz.BuiltinRole{ + Role: types.RoleAdmin, + Username: string(types.RoleAdmin), + }) + _, err = resourceSvc.CreateIntegration(adminCtx, &integrationpb.CreateIntegrationRequest{Integration: githubIntegration}) + require.NoError(t, err) + + key, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.Ed25519) + require.NoError(t, err) + + req := &integrationpb.GenerateGitHubUserCertRequest{ + Integration: "github-my-org", + PublicKey: key.MarshalSSHPublicKey(), + UserId: "1122334455", + KeyId: "alice", + Ttl: durationpb.New(time.Minute), + } + + // Admin users cannot generate certs. + _, err = resourceSvc.GenerateGitHubUserCert(adminCtx, req) + require.True(t, trace.IsAccessDenied(err)) + + // Call as Proxy. + proxyCtx := authz.ContextWithUser(ctx, authz.BuiltinRole{ + Role: types.RoleProxy, + Username: string(types.RoleProxy), + }) + resp, err := resourceSvc.GenerateGitHubUserCert(proxyCtx, req) + require.NoError(t, err) + authorizedKey, _, _, _, err := ssh.ParseAuthorizedKey(resp.AuthorizedKey) + require.NoError(t, err) + sshCert, ok := authorizedKey.(*ssh.Certificate) + require.True(t, ok) + + assert.Equal(t, "alice", sshCert.KeyId) + assert.Equal(t, map[string]string{"id@github.com": "1122334455"}, sshCert.Permissions.Extensions) +} diff --git a/lib/auth/integration/integrationv1/service.go b/lib/auth/integration/integrationv1/service.go index 1587ed1135950..2bb00fe4543b1 100644 --- a/lib/auth/integration/integrationv1/service.go +++ b/lib/auth/integration/integrationv1/service.go @@ -53,6 +53,9 @@ type Cache interface { // IntegrationsGetter defines methods to access Integration resources. services.IntegrationsGetter + + // GetPluginStaticCredentialsByLabels will get a list of plugin static credentials resource by matching labels. + GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) } // KeyStoreManager defines methods to get signers using the server's keystore. diff --git a/lib/auth/integration/integrationv1/service_test.go b/lib/auth/integration/integrationv1/service_test.go index 6bf73b4897157..a8cfc66e4e45e 100644 --- a/lib/auth/integration/integrationv1/service_test.go +++ b/lib/auth/integration/integrationv1/service_test.go @@ -30,6 +30,7 @@ import ( integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/externalauditstorage" + "github.com/gravitational/teleport/lib/auth/integration/credentials" "github.com/gravitational/teleport/lib/auth/keystore" "github.com/gravitational/teleport/lib/auth/testauthority" "github.com/gravitational/teleport/lib/authz" @@ -63,32 +64,6 @@ func TestIntegrationCRUD(t *testing.T) { return ig } - newGitHubIntegration := func(name, id, secret string) (*types.IntegrationV1, error) { - ig, err := types.NewIntegrationGitHub( - types.Metadata{ - Name: name, - }, - &types.GitHubIntegrationSpecV1{ - Organization: "my-org", - }, - ) - if err != nil { - return nil, trace.Wrap(err) - } - - if secret != "" { - ig.SetCredentials(&types.PluginCredentialsV1{ - Credentials: &types.PluginCredentialsV1_IdSecret{ - IdSecret: &types.PluginIdSecretCredential{ - Id: id, - Secret: secret, - }, - }, - }) - } - return ig, nil - } - tt := []struct { Name string Role types.RoleSpecV6 @@ -446,7 +421,7 @@ func TestIntegrationCRUD(t *testing.T) { refUUID := uuid.NewString() ig.SetCredentials(&types.PluginCredentialsV1{ Credentials: &types.PluginCredentialsV1_StaticCredentialsRef{ - StaticCredentialsRef: newStaticCredentialsRef(refUUID), + StaticCredentialsRef: credentials.NewRefWithUUID(refUUID), }, }) @@ -459,8 +434,8 @@ func TestIntegrationCRUD(t *testing.T) { Metadata: types.Metadata{ Name: igName, Labels: map[string]string{ - labelStaticCredentialsIntegration: refUUID, - labelStaticCredentialsPurpose: "test", + credentials.LabelStaticCredentialsIntegration: refUUID, + credentials.LabelStaticCredentialsPurpose: "test", }, }, }, @@ -652,7 +627,8 @@ func initSvc(t *testing.T, ca types.CertAuthority, clusterName string, proxyPubl PublicAddrs: []string{proxyPublicAddr}, }}, }, - IntegrationsService: *cacheResourceService, + IntegrationsService: *cacheResourceService, + PluginStaticCredentialsService: localCredService, } resourceSvc, err := NewService(&ServiceConfig{ @@ -689,6 +665,7 @@ type mockCache struct { returnErr error local.IntegrationsService + *local.PluginStaticCredentialsService } func (m *mockCache) GetProxies() ([]types.Server, error) { @@ -769,6 +746,32 @@ func newPlugin(t *testing.T, integrationName string) *types.PluginV1 { } } +func newGitHubIntegration(name, id, secret string) (*types.IntegrationV1, error) { + ig, err := types.NewIntegrationGitHub( + types.Metadata{ + Name: name, + }, + &types.GitHubIntegrationSpecV1{ + Organization: "my-org", + }, + ) + if err != nil { + return nil, trace.Wrap(err) + } + + if secret != "" { + ig.SetCredentials(&types.PluginCredentialsV1{ + Credentials: &types.PluginCredentialsV1_IdSecret{ + IdSecret: &types.PluginIdSecretCredential{ + Id: id, + Secret: secret, + }, + }, + }) + } + return ig, nil +} + func mustFindGitHubCredentials(t *testing.T, localClient Backend, igName, wantId, wantSecret string) { t.Helper() diff --git a/lib/auth/join/join.go b/lib/auth/join/join.go index 15deb2bb5da7b..b00c4b6bf2a7d 100644 --- a/lib/auth/join/join.go +++ b/lib/auth/join/join.go @@ -50,7 +50,7 @@ import ( "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/githubactions" "github.com/gravitational/teleport/lib/gitlab" - "github.com/gravitational/teleport/lib/kubernetestoken" + kubetoken "github.com/gravitational/teleport/lib/kube/token" "github.com/gravitational/teleport/lib/spacelift" "github.com/gravitational/teleport/lib/terraformcloud" "github.com/gravitational/teleport/lib/tlsca" @@ -238,7 +238,7 @@ func Register(ctx context.Context, params RegisterParams) (result *RegisterResul return nil, trace.Wrap(err) } case types.JoinMethodKubernetes: - params.IDToken, err = kubernetestoken.GetIDToken(os.Getenv, params.KubernetesReadFileFunc) + params.IDToken, err = kubetoken.GetIDToken(os.Getenv, params.KubernetesReadFileFunc) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/join_kubernetes.go b/lib/auth/join_kubernetes.go index bcf9eeea05b56..d5bbc6586d831 100644 --- a/lib/auth/join_kubernetes.go +++ b/lib/auth/join_kubernetes.go @@ -27,16 +27,16 @@ import ( "github.com/sirupsen/logrus" "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/lib/kubernetestoken" + kubetoken "github.com/gravitational/teleport/lib/kube/token" ) type k8sTokenReviewValidator interface { - Validate(ctx context.Context, token, clusterName string) (*kubernetestoken.ValidationResult, error) + Validate(ctx context.Context, token, clusterName string) (*kubetoken.ValidationResult, error) } -type k8sJWKSValidator func(now time.Time, jwksData []byte, clusterName string, token string) (*kubernetestoken.ValidationResult, error) +type k8sJWKSValidator func(now time.Time, jwksData []byte, clusterName string, token string) (*kubetoken.ValidationResult, error) -func (a *Server) checkKubernetesJoinRequest(ctx context.Context, req *types.RegisterUsingTokenRequest) (*kubernetestoken.ValidationResult, error) { +func (a *Server) checkKubernetesJoinRequest(ctx context.Context, req *types.RegisterUsingTokenRequest) (*kubetoken.ValidationResult, error) { if req.IDToken == "" { return nil, trace.BadParameter("IDToken not provided for Kubernetes join request") } @@ -58,7 +58,7 @@ func (a *Server) checkKubernetesJoinRequest(ctx context.Context, req *types.Regi } // Switch to join method subtype token validation. - var result *kubernetestoken.ValidationResult + var result *kubetoken.ValidationResult switch token.Spec.Kubernetes.Type { case types.KubernetesJoinTypeStaticJWKS: result, err = a.k8sJWKSValidator( @@ -90,10 +90,10 @@ func (a *Server) checkKubernetesJoinRequest(ctx context.Context, req *types.Regi return result, trace.Wrap(checkKubernetesAllowRules(token, result)) } -func checkKubernetesAllowRules(pt *types.ProvisionTokenV2, got *kubernetestoken.ValidationResult) error { +func checkKubernetesAllowRules(pt *types.ProvisionTokenV2, got *kubetoken.ValidationResult) error { // If a single rule passes, accept the token for _, rule := range pt.Spec.Kubernetes.Allow { - wantUsername := fmt.Sprintf("%s:%s", kubernetestoken.ServiceAccountNamePrefix, rule.ServiceAccount) + wantUsername := fmt.Sprintf("%s:%s", kubetoken.ServiceAccountNamePrefix, rule.ServiceAccount) if wantUsername != got.Username { continue } diff --git a/lib/auth/join_kubernetes_test.go b/lib/auth/join_kubernetes_test.go index 3af845ba5467f..00090d70a124d 100644 --- a/lib/auth/join_kubernetes_test.go +++ b/lib/auth/join_kubernetes_test.go @@ -28,14 +28,14 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/auth/testauthority" - "github.com/gravitational/teleport/lib/kubernetestoken" + kubetoken "github.com/gravitational/teleport/lib/kube/token" ) type mockK8STokenReviewValidator struct { - tokens map[string]*kubernetestoken.ValidationResult + tokens map[string]*kubetoken.ValidationResult } -func (m *mockK8STokenReviewValidator) Validate(_ context.Context, token, _ string) (*kubernetestoken.ValidationResult, error) { +func (m *mockK8STokenReviewValidator) Validate(_ context.Context, token, _ string) (*kubetoken.ValidationResult, error) { result, ok := m.tokens[token] if !ok { return nil, errMockInvalidToken @@ -48,14 +48,14 @@ func TestAuth_RegisterUsingToken_Kubernetes(t *testing.T) { // Test setup // Creating an auth server with mock Kubernetes token validator - tokenReviewTokens := map[string]*kubernetestoken.ValidationResult{ + tokenReviewTokens := map[string]*kubetoken.ValidationResult{ "matching-implicit-in-cluster": {Username: "system:serviceaccount:namespace1:service-account1"}, // "matching-explicit-in-cluster" intentionally matches the second allow // rule of explicitInCluster to ensure all rules are processed. "matching-explicit-in-cluster": {Username: "system:serviceaccount:namespace2:service-account2"}, "user-token": {Username: "namespace1:service-account1"}, } - jwksTokens := map[string]*kubernetestoken.ValidationResult{ + jwksTokens := map[string]*kubetoken.ValidationResult{ "jwks-matching-service-account": {Username: "system:serviceaccount:static-jwks:matching"}, "jwks-mismatched-service-account": {Username: "system:serviceaccount:static-jwks:mismatched"}, } @@ -63,7 +63,7 @@ func TestAuth_RegisterUsingToken_Kubernetes(t *testing.T) { ctx := context.Background() p, err := newTestPack(ctx, t.TempDir(), func(server *Server) error { server.k8sTokenReviewValidator = &mockK8STokenReviewValidator{tokens: tokenReviewTokens} - server.k8sJWKSValidator = func(_ time.Time, _ []byte, _ string, token string) (*kubernetestoken.ValidationResult, error) { + server.k8sJWKSValidator = func(_ time.Time, _ []byte, _ string, token string) (*kubetoken.ValidationResult, error) { result, ok := jwksTokens[token] if !ok { return nil, errMockInvalidToken diff --git a/lib/auth/sessions.go b/lib/auth/sessions.go index bc569b6de9eac..9947279aad248 100644 --- a/lib/auth/sessions.go +++ b/lib/auth/sessions.go @@ -415,6 +415,8 @@ type NewAppSessionRequest struct { AppName string // AppURI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. AppURI string + // AppTargetPort signifies that the session is made to a specific port of a multi-port TCP app. + AppTargetPort int // Identity is the identity of the user. Identity tlsca.Identity // ClientAddr is a client (user's) address. @@ -565,6 +567,7 @@ func (a *Server) CreateAppSessionFromReq(ctx context.Context, req NewAppSessionR usage: []string{teleport.UsageAppsOnly}, appPublicAddr: req.PublicAddr, appClusterName: req.ClusterName, + appTargetPort: req.AppTargetPort, awsRoleARN: req.AWSRoleARN, azureIdentity: req.AzureIdentity, gcpServiceAccount: req.GCPServiceAccount, @@ -636,6 +639,7 @@ func (a *Server) CreateAppSessionFromReq(ctx context.Context, req NewAppSessionR AppURI: req.AppURI, AppPublicAddr: req.PublicAddr, AppName: req.AppName, + AppTargetPort: uint32(req.AppTargetPort), }, }) if err != nil { diff --git a/lib/auth/transport_credentials_test.go b/lib/auth/transport_credentials_test.go index 602eed0ddb2dd..c0a4519d51dcb 100644 --- a/lib/auth/transport_credentials_test.go +++ b/lib/auth/transport_credentials_test.go @@ -24,6 +24,7 @@ import ( "crypto/x509" "io" "net" + "slices" "testing" "time" @@ -286,7 +287,17 @@ func TestTransportCredentials_ServerHandshake(t *testing.T) { require.NoError(t, err) t.Cleanup(func() { require.NoError(t, conn.Close()) }) - clientConn := tls.Client(conn, test.clientTLSConf) + // this would be done by the grpc TransportCredential in the grpc + // client, but we're going to fake it with just a tls.Client, so we + // have to add the http2 next proto ourselves (enforced by grpc-go + // starting from v1.67, and required by the http2 spec when speaking + // http2 in TLS) + clientTLSConf := test.clientTLSConf + if !slices.Contains(clientTLSConf.NextProtos, "h2") { + clientTLSConf = clientTLSConf.Clone() + clientTLSConf.NextProtos = append(clientTLSConf.NextProtos, "h2") + } + clientConn := tls.Client(conn, clientTLSConf) ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() diff --git a/lib/auth/usertasks/usertasksv1/service.go b/lib/auth/usertasks/usertasksv1/service.go index c20d745d05a9b..5a1e388150dd2 100644 --- a/lib/auth/usertasks/usertasksv1/service.go +++ b/lib/auth/usertasks/usertasksv1/service.go @@ -160,7 +160,7 @@ func (s *Service) emitCreateAuditEvent(ctx context.Context, req *usertasksv1.Use func userTaskToUserTaskStateEvent(ut *usertasksv1.UserTask) *usagereporter.UserTaskStateEvent { ret := &usagereporter.UserTaskStateEvent{ TaskType: ut.GetSpec().GetTaskType(), - IssueType: ut.GetSpec().GetTaskType(), + IssueType: ut.GetSpec().GetIssueType(), State: ut.GetSpec().GetState(), } if ut.GetSpec().GetTaskType() == usertasks.TaskTypeDiscoverEC2 { diff --git a/lib/auth/version.go b/lib/auth/version.go index b601898060030..85c52f63e99c8 100644 --- a/lib/auth/version.go +++ b/lib/auth/version.go @@ -27,11 +27,6 @@ import ( ) const ( - // majorVersionConstraint is the major version constraint when previous major version must be - // present in the storage, if not - we must refuse to start. - // TODO(vapopov): DELETE IN 18.0.0 - majorVersionConstraint = 18 - // skipVersionUpgradeCheckEnv is environment variable key for disabling the check // major version upgrade check. skipVersionUpgradeCheckEnv = "TELEPORT_UNSTABLE_SKIP_VERSION_UPGRADE_CHECK" @@ -54,7 +49,7 @@ func validateAndUpdateTeleportVersion( // When this is not the first start, we have to ensure that previous versions, // introduced before this check, were also verified. Therefore, not having a version // in the database means the last known version is = majorVersionConstraint && !firstTimeStart { + if !firstTimeStart { return trace.BadParameter("Unsupported upgrade path detected: to %v. "+ "Teleport supports direct upgrades to the next major version only.\n "+ "For instance, if you have version 15.x.x, you must upgrade to version 16.x.x first. "+ diff --git a/lib/automaticupgrades/maintenance/mock.go b/lib/automaticupgrades/maintenance/mock.go index f46b990ee7930..f705bcee71f8b 100644 --- a/lib/automaticupgrades/maintenance/mock.go +++ b/lib/automaticupgrades/maintenance/mock.go @@ -29,6 +29,7 @@ import ( type StaticTrigger struct { name string canStart bool + err error } // Name returns the StaticTrigger name. @@ -38,7 +39,7 @@ func (m StaticTrigger) Name() string { // CanStart returns the statically defined maintenance approval result. func (m StaticTrigger) CanStart(_ context.Context, _ client.Object) (bool, error) { - return m.canStart, nil + return m.canStart, m.err } // Default returns the default behavior if the trigger fails. This cannot diff --git a/lib/automaticupgrades/maintenance/proxy.go b/lib/automaticupgrades/maintenance/proxy.go new file mode 100644 index 0000000000000..ceb2495e5c17a --- /dev/null +++ b/lib/automaticupgrades/maintenance/proxy.go @@ -0,0 +1,85 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package maintenance + +import ( + "context" + + "github.com/gravitational/trace" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/gravitational/teleport/api/client/webclient" + "github.com/gravitational/teleport/lib/automaticupgrades/cache" + "github.com/gravitational/teleport/lib/automaticupgrades/constants" +) + +type proxyMaintenanceClient struct { + client *webclient.ReusableClient +} + +// Get does the HTTPS call to the Teleport Proxy sevrice to check if the update should happen now. +// If the proxy response does not contain the auto_update.agent_version field, +// this means the proxy does not support autoupdates. In this case we return trace.NotImplementedErr. +func (b *proxyMaintenanceClient) Get(ctx context.Context) (bool, error) { + resp, err := b.client.Find() + if err != nil { + return false, trace.Wrap(err) + } + // We check if a version is advertised to know if the proxy implements RFD-184 or not. + if resp.AutoUpdate.AgentVersion == "" { + return false, trace.NotImplemented("proxy does not seem to implement RFD-184") + } + return resp.AutoUpdate.AgentAutoUpdate, nil +} + +// ProxyMaintenanceTrigger checks if the maintenance should be triggered from the Teleport Proxy service /find endpoint, +// as specified in the RFD-184: https://github.com/gravitational/teleport/blob/master/rfd/0184-agent-auto-updates.md +// The Trigger returns trace.NotImplementedErr when running against a proxy that does not seem to +// expose automatic update instructions over the /find endpoint (proxy too old). +type ProxyMaintenanceTrigger struct { + name string + cachedGetter func(context.Context) (bool, error) +} + +// Name implements maintenance.Trigger returns the trigger name for logging +// and debugging purposes. +func (g ProxyMaintenanceTrigger) Name() string { + return g.name +} + +// Default implements maintenance.Trigger and returns what to do if the trigger can't be evaluated. +// ProxyMaintenanceTrigger should fail open, so the function returns true. +func (g ProxyMaintenanceTrigger) Default() bool { + return false +} + +// CanStart implements maintenance.Trigger. +func (g ProxyMaintenanceTrigger) CanStart(ctx context.Context, _ client.Object) (bool, error) { + result, err := g.cachedGetter(ctx) + return result, trace.Wrap(err) +} + +// NewProxyMaintenanceTrigger builds and return a Trigger checking a public HTTP endpoint. +func NewProxyMaintenanceTrigger(name string, clt *webclient.ReusableClient) Trigger { + maintenanceClient := &proxyMaintenanceClient{ + client: clt, + } + + return ProxyMaintenanceTrigger{name, cache.NewTimedMemoize[bool](maintenanceClient.Get, constants.CacheDuration).Get} +} diff --git a/lib/automaticupgrades/maintenance/trigger.go b/lib/automaticupgrades/maintenance/trigger.go index 53e12b26cdd4a..5d9449d7ad864 100644 --- a/lib/automaticupgrades/maintenance/trigger.go +++ b/lib/automaticupgrades/maintenance/trigger.go @@ -20,7 +20,9 @@ package maintenance import ( "context" + "strings" + "github.com/gravitational/trace" "sigs.k8s.io/controller-runtime/pkg/client" ctrllog "sigs.k8s.io/controller-runtime/pkg/log" ) @@ -51,7 +53,10 @@ func (t Triggers) CanStart(ctx context.Context, object client.Object) bool { start, err := trigger.CanStart(ctx, object) if err != nil { start = trigger.Default() - log.Error(err, "trigger failed to evaluate, using its default value", "trigger", trigger.Name(), "defaultValue", start) + log.Error( + err, "trigger failed to evaluate, using its default value", "trigger", trigger.Name(), "defaultValue", + start, + ) } else { log.Info("trigger evaluated", "trigger", trigger.Name(), "result", start) } @@ -62,3 +67,48 @@ func (t Triggers) CanStart(ctx context.Context, object client.Object) bool { } return false } + +// FailoverTrigger wraps multiple Triggers and tries them sequentially. +// Any error is considered fatal, except for the trace.NotImplementedErr +// which indicates the trigger is not supported yet and we should +// failover to the next trigger. +type FailoverTrigger []Trigger + +// Name implements Trigger +func (f FailoverTrigger) Name() string { + names := make([]string, len(f)) + for i, t := range f { + names[i] = t.Name() + } + + return strings.Join(names, ", failover ") +} + +// CanStart implements Trigger +// Triggers are evaluated sequentially, the result of the first trigger not returning +// trace.NotImplementedErr is used. +func (f FailoverTrigger) CanStart(ctx context.Context, object client.Object) (bool, error) { + for _, trigger := range f { + canStart, err := trigger.CanStart(ctx, object) + switch { + case err == nil: + return canStart, nil + case trace.IsNotImplemented(err): + continue + default: + return false, trace.Wrap(err) + } + } + return false, trace.NotFound("every trigger returned NotImplemented") +} + +// Default implements Trigger. +// The default is the logical OR of every Trigger.Default. +func (f FailoverTrigger) Default() bool { + for _, trigger := range f { + if trigger.Default() { + return true + } + } + return false +} diff --git a/lib/automaticupgrades/maintenance/trigger_test.go b/lib/automaticupgrades/maintenance/trigger_test.go new file mode 100644 index 0000000000000..435b73f0f9bc4 --- /dev/null +++ b/lib/automaticupgrades/maintenance/trigger_test.go @@ -0,0 +1,169 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package maintenance + +import ( + "context" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" +) + +// checkTraceError is a test helper that converts trace.IsXXXError into a require.ErrorAssertionFunc +func checkTraceError(check func(error) bool) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, i ...interface{}) { + require.True(t, check(err), i...) + } +} + +func TestFailoverTrigger_CanStart(t *testing.T) { + t.Parallel() + + // Test setup + ctx := context.Background() + tests := []struct { + name string + triggers []Trigger + expectResult bool + expectErr require.ErrorAssertionFunc + }{ + { + name: "nil", + triggers: nil, + expectResult: false, + expectErr: checkTraceError(trace.IsNotFound), + }, + { + name: "empty", + triggers: []Trigger{}, + expectResult: false, + expectErr: checkTraceError(trace.IsNotFound), + }, + { + name: "first trigger success firing", + triggers: []Trigger{ + StaticTrigger{canStart: true}, + StaticTrigger{canStart: false}, + }, + expectResult: true, + expectErr: require.NoError, + }, + { + name: "first trigger success not firing", + triggers: []Trigger{ + StaticTrigger{canStart: false}, + StaticTrigger{canStart: true}, + }, + expectResult: false, + expectErr: require.NoError, + }, + { + name: "first trigger failure", + triggers: []Trigger{ + StaticTrigger{err: trace.LimitExceeded("got rate-limited")}, + StaticTrigger{canStart: true}, + }, + expectResult: false, + expectErr: checkTraceError(trace.IsLimitExceeded), + }, + { + name: "first trigger skipped, second getter success", + triggers: []Trigger{ + StaticTrigger{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticTrigger{canStart: true}, + }, + expectResult: true, + expectErr: require.NoError, + }, + { + name: "first trigger skipped, second getter failure", + triggers: []Trigger{ + StaticTrigger{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticTrigger{err: trace.LimitExceeded("got rate-limited")}, + }, + expectResult: false, + expectErr: checkTraceError(trace.IsLimitExceeded), + }, + { + name: "first trigger skipped, second getter skipped", + triggers: []Trigger{ + StaticTrigger{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticTrigger{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + }, + expectResult: false, + expectErr: checkTraceError(trace.IsNotFound), + }, + } + for _, tt := range tests { + t.Run( + tt.name, func(t *testing.T) { + // Test execution + trigger := FailoverTrigger(tt.triggers) + result, err := trigger.CanStart(ctx, nil) + require.Equal(t, tt.expectResult, result) + tt.expectErr(t, err) + }, + ) + } +} + +func TestFailoverTrigger_Name(t *testing.T) { + tests := []struct { + name string + triggers []Trigger + expectResult string + }{ + { + name: "nil", + triggers: nil, + expectResult: "", + }, + { + name: "empty", + triggers: []Trigger{}, + expectResult: "", + }, + { + name: "one trigger", + triggers: []Trigger{ + StaticTrigger{name: "proxy"}, + }, + expectResult: "proxy", + }, + { + name: "two triggers", + triggers: []Trigger{ + StaticTrigger{name: "proxy"}, + StaticTrigger{name: "version-server"}, + }, + expectResult: "proxy, failover version-server", + }, + } + for _, tt := range tests { + t.Run( + tt.name, func(t *testing.T) { + // Test execution + trigger := FailoverTrigger(tt.triggers) + result := trigger.Name() + require.Equal(t, tt.expectResult, result) + }, + ) + } +} diff --git a/lib/automaticupgrades/version/proxy.go b/lib/automaticupgrades/version/proxy.go new file mode 100644 index 0000000000000..db55123dd529e --- /dev/null +++ b/lib/automaticupgrades/version/proxy.go @@ -0,0 +1,75 @@ +/* + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package version + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/client/webclient" + "github.com/gravitational/teleport/lib/automaticupgrades/cache" + "github.com/gravitational/teleport/lib/automaticupgrades/constants" +) + +type proxyVersionClient struct { + client *webclient.ReusableClient +} + +func (b *proxyVersionClient) Get(ctx context.Context) (string, error) { + resp, err := b.client.Find() + if err != nil { + return "", trace.Wrap(err) + } + // We check if a version is advertised to know if the proxy implements RFD-184 or not. + if resp.AutoUpdate.AgentVersion == "" { + return "", trace.NotImplemented("proxy does not seem to implement RFD-184") + } + return resp.AutoUpdate.AgentVersion, nil +} + +// ProxyVersionGetter gets the target version from the Teleport Proxy Service /find endpoint, as +// specified in the RFD-184: https://github.com/gravitational/teleport/blob/master/rfd/0184-agent-auto-updates.md +// The Getter returns trace.NotImplementedErr when running against a proxy that does not seem to +// expose automatic update instructions over the /find endpoint (proxy too old). +type ProxyVersionGetter struct { + name string + cachedGetter func(context.Context) (string, error) +} + +// Name implements Getter +func (g ProxyVersionGetter) Name() string { + return g.name +} + +// GetVersion implements Getter +func (g ProxyVersionGetter) GetVersion(ctx context.Context) (string, error) { + result, err := g.cachedGetter(ctx) + return result, trace.Wrap(err) +} + +// NewProxyVersionGetter creates a ProxyVersionGetter from a webclient. +// The answer is cached for a minute. +func NewProxyVersionGetter(name string, clt *webclient.ReusableClient) Getter { + versionClient := &proxyVersionClient{ + client: clt, + } + + return ProxyVersionGetter{name, cache.NewTimedMemoize[string](versionClient.Get, constants.CacheDuration).Get} +} diff --git a/lib/automaticupgrades/version/versionget.go b/lib/automaticupgrades/version/versionget.go index f1e7723a9a320..e2a1a893e5270 100644 --- a/lib/automaticupgrades/version/versionget.go +++ b/lib/automaticupgrades/version/versionget.go @@ -1,6 +1,6 @@ /* * Teleport - * Copyright (C) 2023 Gravitational, Inc. + * Copyright (C) 2024 Gravitational, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -36,13 +36,42 @@ type Getter interface { GetVersion(context.Context) (string, error) } +// FailoverGetter wraps multiple Getters and tries them sequentially. +// Any error is considered fatal, except for the trace.NotImplementedErr +// which indicates the version getter is not supported yet and we should +// failover to the next version getter. +type FailoverGetter []Getter + +// GetVersion implements Getter +// Getters are evaluated sequentially, the result of the first getter not returning +// trace.NotImplementedErr is used. +func (f FailoverGetter) GetVersion(ctx context.Context) (string, error) { + for _, getter := range f { + version, err := getter.GetVersion(ctx) + switch { + case err == nil: + return version, nil + case trace.IsNotImplemented(err): + continue + default: + return "", trace.Wrap(err) + } + } + return "", trace.NotFound("every versionGetter returned NotImplemented") +} + // ValidVersionChange receives the current version and the candidate next version // and evaluates if the version transition is valid. func ValidVersionChange(ctx context.Context, current, next string) bool { log := ctrllog.FromContext(ctx).V(1) // Cannot upgrade to a non-valid version if !semver.IsValid(next) { - log.Error(trace.BadParameter("next version is not following semver"), "version change is invalid", "nextVersion", next) + log.Error( + trace.BadParameter("next version is not following semver"), + "version change is invalid", + "current_version", current, + "next_version", next, + ) return false } switch semver.Compare(next, current) { diff --git a/lib/automaticupgrades/version/versionget_test.go b/lib/automaticupgrades/version/versionget_test.go index 80c2ec767b8fb..78f4940db229a 100644 --- a/lib/automaticupgrades/version/versionget_test.go +++ b/lib/automaticupgrades/version/versionget_test.go @@ -22,6 +22,7 @@ import ( "context" "testing" + "github.com/gravitational/trace" "github.com/stretchr/testify/require" ) @@ -66,8 +67,99 @@ func TestValidVersionChange(t *testing.T) { }, } for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - require.Equal(t, tt.want, ValidVersionChange(ctx, tt.current, tt.next)) - }) + t.Run( + tt.name, func(t *testing.T) { + require.Equal(t, tt.want, ValidVersionChange(ctx, tt.current, tt.next)) + }, + ) + } +} + +// checkTraceError is a test helper that converts trace.IsXXXError into a require.ErrorAssertionFunc +func checkTraceError(check func(error) bool) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, i ...interface{}) { + require.True(t, check(err), i...) + } +} + +func TestFailoverGetter_GetVersion(t *testing.T) { + t.Parallel() + + // Test setup + ctx := context.Background() + tests := []struct { + name string + getters []Getter + expectResult string + expectErr require.ErrorAssertionFunc + }{ + { + name: "nil", + getters: nil, + expectResult: "", + expectErr: checkTraceError(trace.IsNotFound), + }, + { + name: "empty", + getters: []Getter{}, + expectResult: "", + expectErr: checkTraceError(trace.IsNotFound), + }, + { + name: "first getter success", + getters: []Getter{ + StaticGetter{version: semverMid}, + StaticGetter{version: semverHigh}, + }, + expectResult: semverMid, + expectErr: require.NoError, + }, + { + name: "first getter failure", + getters: []Getter{ + StaticGetter{err: trace.LimitExceeded("got rate-limited")}, + StaticGetter{version: semverHigh}, + }, + expectResult: "", + expectErr: checkTraceError(trace.IsLimitExceeded), + }, + { + name: "first getter skipped, second getter success", + getters: []Getter{ + StaticGetter{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticGetter{version: semverHigh}, + }, + expectResult: semverHigh, + expectErr: require.NoError, + }, + { + name: "first getter skipped, second getter failure", + getters: []Getter{ + StaticGetter{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticGetter{err: trace.LimitExceeded("got rate-limited")}, + }, + expectResult: "", + expectErr: checkTraceError(trace.IsLimitExceeded), + }, + { + name: "first getter skipped, second getter skipped", + getters: []Getter{ + StaticGetter{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + StaticGetter{err: trace.NotImplemented("proxy does not seem to implement RFD-184")}, + }, + expectResult: "", + expectErr: checkTraceError(trace.IsNotFound), + }, + } + for _, tt := range tests { + t.Run( + tt.name, func(t *testing.T) { + // Test execution + getter := FailoverGetter(tt.getters) + result, err := getter.GetVersion(ctx) + require.Equal(t, tt.expectResult, result) + tt.expectErr(t, err) + }, + ) } } diff --git a/lib/autoupdate/agent/config.go b/lib/autoupdate/agent/config.go index a13b475f59720..2fcc3b5404d0f 100644 --- a/lib/autoupdate/agent/config.go +++ b/lib/autoupdate/agent/config.go @@ -19,7 +19,9 @@ package agent import ( + "encoding/json" "errors" + "fmt" "io/fs" "os" "strings" @@ -67,12 +69,87 @@ type UpdateSpec struct { // UpdateStatus describes the status field in update.yaml. type UpdateStatus struct { - // ActiveVersion is the currently active Teleport version. - ActiveVersion string `yaml:"active_version"` - // BackupVersion is the last working version of Teleport. - BackupVersion string `yaml:"backup_version"` - // SkipVersion is the last reverted version of Teleport. - SkipVersion string `yaml:"skip_version,omitempty"` + // Active is the currently active revision of Teleport. + Active Revision `yaml:"active"` + // Backup is the last working revision of Teleport. + Backup *Revision `yaml:"backup,omitempty"` + // Skip is the skipped revision of Teleport. + // Skipped revisions are not applied because they + // are known to crash. + Skip *Revision `yaml:"skip,omitempty"` +} + +// Revision is a version and edition of Teleport. +type Revision struct { + // Version is the version of Teleport. + Version string `yaml:"version" json:"version"` + // Flags describe the edition of Teleport. + Flags InstallFlags `yaml:"flags,flow,omitempty" json:"flags,omitempty"` +} + +// NewRevision create a Revision. +// If version is not set, no flags are returned. +// This ensures that all Revisions without versions are zero-valued. +func NewRevision(version string, flags InstallFlags) Revision { + if version != "" { + return Revision{ + Version: version, + Flags: flags, + } + } + return Revision{} +} + +// NewRevisionFromDir translates a directory path containing Teleport into a Revision. +func NewRevisionFromDir(dir string) (Revision, error) { + parts := strings.Split(dir, "_") + var out Revision + if len(parts) == 0 { + return out, trace.Errorf("dir name empty") + } + out.Version = parts[0] + if out.Version == "" { + return out, trace.Errorf("version missing in dir %s", dir) + } + switch flags := parts[1:]; len(flags) { + case 2: + if flags[1] != FlagFIPS.DirFlag() { + break + } + out.Flags |= FlagFIPS + fallthrough + case 1: + if flags[0] != FlagEnterprise.DirFlag() { + break + } + out.Flags |= FlagEnterprise + fallthrough + case 0: + return out, nil + } + return out, trace.Errorf("invalid flag in %s", dir) +} + +// Dir returns the directory path name of a Revision. +func (r Revision) Dir() string { + // Do not change the order of these statements. + // Otherwise, installed versions will no longer match update.yaml. + var suffix string + if r.Flags&(FlagEnterprise|FlagFIPS) != 0 { + suffix += "_" + FlagEnterprise.DirFlag() + } + if r.Flags&FlagFIPS != 0 { + suffix += "_" + FlagFIPS.DirFlag() + } + return r.Version + suffix +} + +// String returns a human-readable description of a Teleport revision. +func (r Revision) String() string { + if flags := r.Flags.Strings(); len(flags) > 0 { + return fmt.Sprintf("%s+%s", r.Version, strings.Join(flags, "+")) + } + return r.Version } // readConfig reads UpdateConfig from a file. @@ -85,18 +162,18 @@ func readConfig(path string) (*UpdateConfig, error) { }, nil } if err != nil { - return nil, trace.Errorf("failed to open: %w", err) + return nil, trace.Wrap(err, "failed to open") } defer f.Close() var cfg UpdateConfig if err := yaml.NewDecoder(f).Decode(&cfg); err != nil { - return nil, trace.Errorf("failed to parse: %w", err) + return nil, trace.Wrap(err, "failed to parse") } if k := cfg.Kind; k != updateConfigKind { - return nil, trace.Errorf("invalid kind %q", k) + return nil, trace.Errorf("invalid kind %s", k) } if v := cfg.Version; v != updateConfigVersion { - return nil, trace.Errorf("invalid version %q", v) + return nil, trace.Errorf("invalid version %s", v) } return &cfg, nil } @@ -155,10 +232,8 @@ type Status struct { // FindResp summarizes the auto-update status response from cluster. type FindResp struct { - // Version of Teleport to install - TargetVersion string `yaml:"target_version"` - // Flags describing the edition of Teleport - Flags InstallFlags `yaml:"flags"` + // Target revision of Teleport to install + Target Revision `yaml:"target"` // InWindow is true when the install should happen now. InWindow bool `yaml:"in_window"` // Jitter duration before an automated install @@ -175,10 +250,23 @@ const ( FlagFIPS ) -func (i InstallFlags) MarshalYAML() (any, error) { - return i.Strings(), nil +// NewInstallFlagsFromStrings returns InstallFlags given a slice of human-readable strings. +func NewInstallFlagsFromStrings(s []string) InstallFlags { + var out InstallFlags + for _, f := range s { + for _, flag := range []InstallFlags{ + FlagEnterprise, + FlagFIPS, + } { + if f == flag.String() { + out |= flag + } + } + } + return out } +// Strings converts InstallFlags to a slice of human-readable strings. func (i InstallFlags) Strings() []string { var out []string for _, flag := range []InstallFlags{ @@ -192,6 +280,7 @@ func (i InstallFlags) Strings() []string { return out } +// String returns the string representation of a single InstallFlag flag, or "Unknown". func (i InstallFlags) String() string { switch i { case 0: @@ -203,3 +292,36 @@ func (i InstallFlags) String() string { } return "Unknown" } + +// DirFlag returns the directory path representation of a single InstallFlag flag, or "unknown". +func (i InstallFlags) DirFlag() string { + switch i { + case 0: + return "" + case FlagEnterprise: + return "ent" + case FlagFIPS: + return "fips" + } + return "unknown" +} + +func (i InstallFlags) MarshalYAML() (any, error) { + return i.Strings(), nil +} + +func (i InstallFlags) MarshalJSON() ([]byte, error) { + return json.Marshal(i.Strings()) +} + +func (i *InstallFlags) UnmarshalYAML(n *yaml.Node) error { + var s []string + if err := n.Decode(&s); err != nil { + return trace.Wrap(err) + } + if i == nil { + return trace.BadParameter("nil install flags while parsing YAML") + } + *i = NewInstallFlagsFromStrings(s) + return nil +} diff --git a/lib/autoupdate/agent/config_test.go b/lib/autoupdate/agent/config_test.go new file mode 100644 index 0000000000000..0f3ce770ec7af --- /dev/null +++ b/lib/autoupdate/agent/config_test.go @@ -0,0 +1,195 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package agent + +import ( + "testing" + + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v3" +) + +func TestNewRevisionFromDir(t *testing.T) { + t.Parallel() + + for _, tt := range []struct { + name string + dir string + rev Revision + errMatch string + }{ + { + name: "version", + dir: "1.2.3", + rev: Revision{ + Version: "1.2.3", + }, + }, + { + name: "full", + dir: "1.2.3_ent_fips", + rev: Revision{ + Version: "1.2.3", + Flags: FlagEnterprise | FlagFIPS, + }, + }, + { + name: "ent", + dir: "1.2.3_ent", + rev: Revision{ + Version: "1.2.3", + Flags: FlagEnterprise, + }, + }, + { + name: "empty", + errMatch: "missing", + }, + { + name: "trailing", + dir: "1.2.3_", + errMatch: "invalid", + }, + { + name: "more trailing", + dir: "1.2.3___", + errMatch: "invalid", + }, + { + name: "no version", + dir: "_fips", + errMatch: "missing", + }, + { + name: "fips no ent", + dir: "1.2.3_fips", + errMatch: "invalid", + }, + { + name: "unknown start fips", + dir: "1.2.3_test_fips", + errMatch: "invalid", + }, + { + name: "unknown start ent", + dir: "1.2.3_test_ent", + errMatch: "invalid", + }, + { + name: "unknown end fips", + dir: "1.2.3_fips_test", + errMatch: "invalid", + }, + { + name: "unknown end ent", + dir: "1.2.3_ent_test", + errMatch: "invalid", + }, + { + name: "bad order", + dir: "1.2.3_fips_ent", + errMatch: "invalid", + }, + { + name: "underscore", + dir: "_", + errMatch: "missing", + }, + } { + t.Run(tt.name, func(t *testing.T) { + rev, err := NewRevisionFromDir(tt.dir) + if tt.errMatch != "" { + require.ErrorContains(t, err, tt.errMatch) + return + } + require.NoError(t, err) + require.Equal(t, tt.rev, rev) + require.Equal(t, tt.dir, rev.Dir()) + }) + } +} + +func TestInstallFlagsYAML(t *testing.T) { + t.Parallel() + + for _, tt := range []struct { + name string + yaml string + flags InstallFlags + skipYAML bool + }{ + { + name: "both", + yaml: `["Enterprise", "FIPS"]`, + flags: FlagEnterprise | FlagFIPS, + }, + { + name: "order", + yaml: `["FIPS", "Enterprise"]`, + flags: FlagEnterprise | FlagFIPS, + skipYAML: true, + }, + { + name: "extra", + yaml: `["FIPS", "Enterprise", "bad"]`, + flags: FlagEnterprise | FlagFIPS, + skipYAML: true, + }, + { + name: "enterprise", + yaml: `["Enterprise"]`, + flags: FlagEnterprise, + }, + { + name: "fips", + yaml: `["FIPS"]`, + flags: FlagFIPS, + }, + { + name: "empty", + yaml: `[]`, + }, + { + name: "nil", + skipYAML: true, + }, + } { + t.Run(tt.name, func(t *testing.T) { + var flags InstallFlags + err := yaml.Unmarshal([]byte(tt.yaml), &flags) + require.NoError(t, err) + require.Equal(t, tt.flags, flags) + + // verify test YAML + var v any + err = yaml.Unmarshal([]byte(tt.yaml), &v) + require.NoError(t, err) + res, err := yaml.Marshal(v) + require.NoError(t, err) + + // compare verified YAML to flag output + out, err := yaml.Marshal(flags) + require.NoError(t, err) + + if !tt.skipYAML { + require.Equal(t, string(res), string(out)) + } + }) + } +} diff --git a/lib/autoupdate/agent/installer.go b/lib/autoupdate/agent/installer.go index 84c41bd54f235..00d2174c31061 100644 --- a/lib/autoupdate/agent/installer.go +++ b/lib/autoupdate/agent/installer.go @@ -59,12 +59,8 @@ const ( const ( // serviceDir contains the relative path to the Teleport SystemD service dir. serviceDir = "lib/systemd/system" - // serviceName contains the name of the Teleport SystemD service file. + // serviceName contains the upstream name of the Teleport SystemD service file. serviceName = "teleport.service" - // updateServiceName contains the name of the Teleport Update Systemd service - updateServiceName = "teleport-update.service" - // updateTimerName contains the name of the Teleport Update Systemd timer - updateTimerName = "teleport-update.timer" ) // LocalInstaller manages the creation and removal of installations @@ -74,12 +70,12 @@ type LocalInstaller struct { InstallDir string // LinkBinDir contains symlinks to the linked installation's binaries. LinkBinDir string - // LinkServiceDir contains a copy of the linked installation's systemd service. - LinkServiceDir string + // CopyServiceFile contains a copy of the linked installation's systemd service. + CopyServiceFile string // SystemBinDir contains binaries for the system (packaged) install of Teleport. SystemBinDir string - // SystemServiceDir contains the systemd service file for the system (packaged) install of Teleport. - SystemServiceDir string + // SystemServiceFile contains the systemd service file for the system (packaged) install of Teleport. + SystemServiceFile string // HTTP is an HTTP client for downloading Teleport. HTTP *http.Client // Log contains a logger. @@ -88,27 +84,29 @@ type LocalInstaller struct { ReservedFreeTmpDisk uint64 // ReservedFreeInstallDisk is the amount of disk that must remain free in the install directory. ReservedFreeInstallDisk uint64 + // TransformService transforms the systemd service during copying. + TransformService func([]byte) []byte } // Remove a Teleport version directory from InstallDir. // This function is idempotent. // See Installer interface for additional specs. -func (li *LocalInstaller) Remove(ctx context.Context, version string) error { +func (li *LocalInstaller) Remove(ctx context.Context, rev Revision) error { // os.RemoveAll is dangerous because it can remove an entire directory tree. // We must validate the version to ensure that we remove only a single path // element under the InstallDir, and not InstallDir or its parents. - // versionDir performs these validations. - versionDir, err := li.versionDir(version) + // revisionDir performs these validations. + versionDir, err := li.revisionDir(rev) if err != nil { return trace.Wrap(err) } linked, err := li.isLinked(filepath.Join(versionDir, "bin")) if err != nil && !errors.Is(err, os.ErrNotExist) { - return trace.Errorf("failed to determine if linked: %w", err) + return trace.Wrap(err, "failed to determine if linked") } if linked { - return trace.Errorf("refusing to remove: %w", ErrLinked) + return trace.Wrap(ErrLinked, "refusing to remove") } // invalidate checksum first, to protect against partially-removed @@ -126,15 +124,15 @@ func (li *LocalInstaller) Remove(ctx context.Context, version string) error { // Install a Teleport version directory in InstallDir. // This function is idempotent. // See Installer interface for additional specs. -func (li *LocalInstaller) Install(ctx context.Context, version, template string, flags InstallFlags) (err error) { - versionDir, err := li.versionDir(version) +func (li *LocalInstaller) Install(ctx context.Context, rev Revision, template string) (err error) { + versionDir, err := li.revisionDir(rev) if err != nil { return trace.Wrap(err) } sumPath := filepath.Join(versionDir, checksumType) // generate download URI from template - uri, err := makeURL(template, version, flags) + uri, err := makeURL(template, rev) if err != nil { return trace.Wrap(err) } @@ -144,21 +142,21 @@ func (li *LocalInstaller) Install(ctx context.Context, version, template string, checksumURI := uri + "." + checksumType newSum, err := li.getChecksum(ctx, checksumURI) if err != nil { - return trace.Errorf("failed to download checksum from %s: %w", checksumURI, err) + return trace.Wrap(err, "failed to download checksum from %s", checksumURI) } oldSum, err := readChecksum(sumPath) if err == nil { if bytes.Equal(oldSum, newSum) { - li.Log.InfoContext(ctx, "Version already present.", "version", version) + li.Log.InfoContext(ctx, "Version already present.", "version", rev) return nil } - li.Log.WarnContext(ctx, "Removing version that does not match checksum.", "version", version) - if err := li.Remove(ctx, version); err != nil { + li.Log.WarnContext(ctx, "Removing version that does not match checksum.", "version", rev) + if err := li.Remove(ctx, rev); err != nil { return trace.Wrap(err) } } else if !errors.Is(err, os.ErrNotExist) { - li.Log.WarnContext(ctx, "Removing version with unreadable checksum.", "version", version, "error", err) - if err := li.Remove(ctx, version); err != nil { + li.Log.WarnContext(ctx, "Removing version with unreadable checksum.", "version", rev, "error", err) + if err := li.Remove(ctx, rev); err != nil { return trace.Wrap(err) } } @@ -166,11 +164,11 @@ func (li *LocalInstaller) Install(ctx context.Context, version, template string, // Verify that we have enough free temp space, then download tgz freeTmp, err := utils.FreeDiskWithReserve(os.TempDir(), li.ReservedFreeTmpDisk) if err != nil { - return trace.Errorf("failed to calculate free disk: %w", err) + return trace.Wrap(err, "failed to calculate free disk") } f, err := os.CreateTemp("", "teleport-update-") if err != nil { - return trace.Errorf("failed to create temporary file: %w", err) + return trace.Wrap(err, "failed to create temporary file") } defer func() { _ = f.Close() // data never read after close @@ -180,11 +178,11 @@ func (li *LocalInstaller) Install(ctx context.Context, version, template string, }() pathSum, err := li.download(ctx, f, int64(freeTmp), uri) if err != nil { - return trace.Errorf("failed to download teleport: %w", err) + return trace.Wrap(err, "failed to download teleport") } // Seek to the start of the tgz file after writing if _, err := f.Seek(0, io.SeekStart); err != nil { - return trace.Errorf("failed seek to start of download: %w", err) + return trace.Wrap(err, "failed seek to start of download") } // If interrupted, close the file immediately to stop extracting. @@ -200,11 +198,11 @@ func (li *LocalInstaller) Install(ctx context.Context, version, template string, // Get uncompressed size of the tgz n, err := uncompressedSize(f) if err != nil { - return trace.Errorf("failed to determine uncompressed size: %w", err) + return trace.Wrap(err, "failed to determine uncompressed size") } // Seek to start of tgz after reading size if _, err := f.Seek(0, io.SeekStart); err != nil { - return trace.Errorf("failed seek to start: %w", err) + return trace.Wrap(err, "failed seek to start") } // If there's an error after we start extracting, delete the version dir. @@ -217,19 +215,19 @@ func (li *LocalInstaller) Install(ctx context.Context, version, template string, }() // Extract tgz into version directory. - if err := li.extract(ctx, versionDir, f, n, flags); err != nil { - return trace.Errorf("failed to extract teleport: %w", err) + if err := li.extract(ctx, versionDir, f, n, rev.Flags); err != nil { + return trace.Wrap(err, "failed to extract teleport") } // Write the checksum last. This marks the version directory as valid. err = renameio.WriteFile(sumPath, []byte(hex.EncodeToString(newSum)), configFileMode) if err != nil { - return trace.Errorf("failed to write checksum: %w", err) + return trace.Wrap(err, "failed to write checksum") } return nil } // makeURL to download the Teleport tgz. -func makeURL(uriTmpl, version string, flags InstallFlags) (string, error) { +func makeURL(uriTmpl string, rev Revision) (string, error) { tmpl, err := template.New("uri").Parse(uriTmpl) if err != nil { return "", trace.Wrap(err) @@ -240,10 +238,10 @@ func makeURL(uriTmpl, version string, flags InstallFlags) (string, error) { FIPS, Enterprise bool }{ OS: runtime.GOOS, - Version: version, + Version: rev.Version, Arch: runtime.GOARCH, - FIPS: flags&FlagFIPS != 0, - Enterprise: flags&(FlagEnterprise|FlagFIPS) != 0, + FIPS: rev.Flags&FlagFIPS != 0, + Enterprise: rev.Flags&(FlagEnterprise|FlagFIPS) != 0, } err = tmpl.Execute(&uriBuf, params) if err != nil { @@ -309,6 +307,7 @@ func (li *LocalInstaller) download(ctx context.Context, w io.Writer, max int64, if err != nil { return nil, trace.Wrap(err) } + startTime := time.Now() resp, err := li.HTTP.Do(req) if err != nil { return nil, trace.Wrap(err) @@ -332,13 +331,23 @@ func (li *LocalInstaller) download(ctx context.Context, w io.Writer, max int64, } // Calculate checksum concurrently with download. shaReader := sha256.New() - n, err := io.CopyN(w, io.TeeReader(resp.Body, shaReader), size) + tee := io.TeeReader(resp.Body, shaReader) + tee = io.TeeReader(tee, &progressLogger{ + ctx: ctx, + log: li.Log, + level: slog.LevelInfo, + name: path.Base(resp.Request.URL.Path), + max: int(resp.ContentLength), + lines: 5, + }) + n, err := io.CopyN(w, tee, size) if err != nil { return nil, trace.Wrap(err) } if resp.ContentLength >= 0 && n != resp.ContentLength { return nil, trace.Errorf("mismatch in Teleport download size") } + li.Log.InfoContext(ctx, "Download complete.", "duration", time.Since(startTime), "size", n) return shaReader.Sum(nil), nil } @@ -348,15 +357,15 @@ func (li *LocalInstaller) extract(ctx context.Context, dstDir string, src io.Rea } free, err := utils.FreeDiskWithReserve(dstDir, li.ReservedFreeInstallDisk) if err != nil { - return trace.Errorf("failed to calculate free disk in %q: %w", dstDir, err) + return trace.Wrap(err, "failed to calculate free disk in %s", dstDir) } // Bail if there's not enough free disk space at the target if d := int64(free) - max; d < 0 { - return trace.Errorf("%q needs %d additional bytes of disk space for decompression", dstDir, -d) + return trace.Errorf("%s needs %d additional bytes of disk space for decompression", dstDir, -d) } zr, err := gzip.NewReader(src) if err != nil { - return trace.Errorf("requires gzip-compressed body: %v", err) + return trace.Wrap(err, "requires gzip-compressed body") } li.Log.InfoContext(ctx, "Extracting Teleport tarball.", "path", dstDir, "size", max) @@ -403,7 +412,7 @@ func uncompressedSize(f io.Reader) (int64, error) { } // List installed versions of Teleport. -func (li *LocalInstaller) List(ctx context.Context) (versions []string, err error) { +func (li *LocalInstaller) List(ctx context.Context) (revs []Revision, err error) { entries, err := os.ReadDir(li.InstallDir) if err != nil { return nil, trace.Wrap(err) @@ -412,23 +421,27 @@ func (li *LocalInstaller) List(ctx context.Context) (versions []string, err erro if !entry.IsDir() { continue } - versions = append(versions, entry.Name()) + rev, err := NewRevisionFromDir(entry.Name()) + if err != nil { + return nil, trace.Wrap(err) + } + revs = append(revs, rev) } - return versions, nil + return revs, nil } -// Link the specified version into the system LinkBinDir and LinkServiceDir. +// Link the specified version into the system LinkBinDir and CopyServiceFile. // The revert function restores the previous linking. // See Installer interface for additional specs. -func (li *LocalInstaller) Link(ctx context.Context, version string) (revert func(context.Context) bool, err error) { +func (li *LocalInstaller) Link(ctx context.Context, rev Revision) (revert func(context.Context) bool, err error) { revert = func(context.Context) bool { return true } - versionDir, err := li.versionDir(version) + versionDir, err := li.revisionDir(rev) if err != nil { return revert, trace.Wrap(err) } revert, err = li.forceLinks(ctx, filepath.Join(versionDir, "bin"), - filepath.Join(versionDir, serviceDir), + filepath.Join(versionDir, serviceDir, serviceName), ) if err != nil { return revert, trace.Wrap(err) @@ -436,25 +449,25 @@ func (li *LocalInstaller) Link(ctx context.Context, version string) (revert func return revert, nil } -// LinkSystem links the system (package) version into LinkBinDir and LinkServiceDir. +// LinkSystem links the system (package) version into LinkBinDir and CopyServiceFile. // The revert function restores the previous linking. // See Installer interface for additional specs. func (li *LocalInstaller) LinkSystem(ctx context.Context) (revert func(context.Context) bool, err error) { - revert, err = li.forceLinks(ctx, li.SystemBinDir, li.SystemServiceDir) + revert, err = li.forceLinks(ctx, li.SystemBinDir, li.SystemServiceFile) return revert, trace.Wrap(err) } // TryLink links the specified version, but only in the case that // no installation of Teleport is already linked or partially linked. // See Installer interface for additional specs. -func (li *LocalInstaller) TryLink(ctx context.Context, version string) error { - versionDir, err := li.versionDir(version) +func (li *LocalInstaller) TryLink(ctx context.Context, revision Revision) error { + versionDir, err := li.revisionDir(revision) if err != nil { return trace.Wrap(err) } return trace.Wrap(li.tryLinks(ctx, filepath.Join(versionDir, "bin"), - filepath.Join(versionDir, serviceDir), + filepath.Join(versionDir, serviceDir, serviceName), )) } @@ -462,26 +475,26 @@ func (li *LocalInstaller) TryLink(ctx context.Context, version string) error { // no installation of Teleport is already linked or partially linked. // See Installer interface for additional specs. func (li *LocalInstaller) TryLinkSystem(ctx context.Context) error { - return trace.Wrap(li.tryLinks(ctx, li.SystemBinDir, li.SystemServiceDir)) + return trace.Wrap(li.tryLinks(ctx, li.SystemBinDir, li.SystemServiceFile)) } -// Unlink unlinks a version from LinkBinDir and LinkServiceDir. +// Unlink unlinks a version from LinkBinDir and CopyServiceFile. // See Installer interface for additional specs. -func (li *LocalInstaller) Unlink(ctx context.Context, version string) error { - versionDir, err := li.versionDir(version) +func (li *LocalInstaller) Unlink(ctx context.Context, rev Revision) error { + versionDir, err := li.revisionDir(rev) if err != nil { return trace.Wrap(err) } return trace.Wrap(li.removeLinks(ctx, filepath.Join(versionDir, "bin"), - filepath.Join(versionDir, serviceDir), + filepath.Join(versionDir, serviceDir, serviceName), )) } -// UnlinkSystem unlinks the system (package) version from LinkBinDir and LinkServiceDir. +// UnlinkSystem unlinks the system (package) version from LinkBinDir and CopyServiceFile. // See Installer interface for additional specs. func (li *LocalInstaller) UnlinkSystem(ctx context.Context) error { - return trace.Wrap(li.removeLinks(ctx, li.SystemBinDir, li.SystemServiceDir)) + return trace.Wrap(li.removeLinks(ctx, li.SystemBinDir, li.SystemServiceFile)) } // symlink from oldname to newname @@ -501,7 +514,7 @@ type smallFile struct { // forceLinks will revert any overridden links or files if it hits an error. // If successful, forceLinks may also be reverted after it returns by calling revert. // The revert function returns true if reverting succeeds. -func (li *LocalInstaller) forceLinks(ctx context.Context, binDir, svcDir string) (revert func(context.Context) bool, err error) { +func (li *LocalInstaller) forceLinks(ctx context.Context, binDir, svcPath string) (revert func(context.Context) bool, err error) { // setup revert function var ( revertLinks []symlink @@ -544,7 +557,7 @@ func (li *LocalInstaller) forceLinks(ctx context.Context, binDir, svcDir string) if err != nil { return revert, trace.Wrap(err) } - err = os.MkdirAll(li.LinkServiceDir, systemDirMode) + err = os.MkdirAll(filepath.Dir(li.CopyServiceFile), systemDirMode) if err != nil { return revert, trace.Wrap(err) } @@ -553,7 +566,7 @@ func (li *LocalInstaller) forceLinks(ctx context.Context, binDir, svcDir string) entries, err := os.ReadDir(binDir) if err != nil { - return revert, trace.Errorf("failed to find Teleport binary directory: %w", err) + return revert, trace.Wrap(err, "failed to find Teleport binary directory") } var linked int for _, entry := range entries { @@ -564,7 +577,7 @@ func (li *LocalInstaller) forceLinks(ctx context.Context, binDir, svcDir string) newname := filepath.Join(li.LinkBinDir, entry.Name()) orig, err := forceLink(oldname, newname) if err != nil && !errors.Is(err, os.ErrExist) { - return revert, trace.Errorf("failed to create symlink for %s: %w", filepath.Base(oldname), err) + return revert, trace.Wrap(err, "failed to create symlink for %s", filepath.Base(oldname)) } if orig != "" { revertLinks = append(revertLinks, symlink{ @@ -580,11 +593,9 @@ func (li *LocalInstaller) forceLinks(ctx context.Context, binDir, svcDir string) // create systemd service file - src := filepath.Join(svcDir, serviceName) - dst := filepath.Join(li.LinkServiceDir, serviceName) - orig, err := forceCopy(dst, src, maxServiceFileSize) + orig, err := li.forceCopyService(li.CopyServiceFile, svcPath, maxServiceFileSize) if err != nil && !errors.Is(err, os.ErrExist) { - return revert, trace.Errorf("failed to write file %s: %w", serviceName, err) + return revert, trace.Wrap(err, "failed to copy service") } if orig != nil { revertFiles = append(revertFiles, *orig) @@ -592,6 +603,17 @@ func (li *LocalInstaller) forceLinks(ctx context.Context, binDir, svcDir string) return revert, nil } +// forceCopyService uses forceCopy to copy a systemd service file from src to dst. +// The contents of both src and dst must be smaller than n. +// See forceCopy for more details. +func (li *LocalInstaller) forceCopyService(dst, src string, n int64) (orig *smallFile, err error) { + srcData, err := readFileN(src, n) + if err != nil { + return nil, trace.Wrap(err) + } + return forceCopy(dst, li.TransformService(srcData), n) +} + // forceLink attempts to create a symlink, atomically replacing an existing link if already present. // If a non-symlink file or directory exists in newname already, forceLink errors. // If the link is already present with the desired oldname, forceLink returns os.ErrExist. @@ -633,16 +655,12 @@ func isExecutable(path string) (bool, error) { fi.Mode()&0111 == 0111, nil } -// forceCopy atomically copies a file from src to dst, replacing an existing file at dst if needed. -// Both src and dst must be smaller than n. +// forceCopy atomically copies a file from srcData to dst, replacing an existing file at dst if needed. +// The contents of dst must be smaller than n. // forceCopy returns the original file path, mode, and contents as orig. -// If an irregular file, too large file, or directory exists in path already, forceCopy errors. +// If an irregular file, too large file, or directory exists in dst already, forceCopy errors. // If the file is already present with the desired contents, forceCopy returns os.ErrExist. -func forceCopy(dst, src string, n int64) (orig *smallFile, err error) { - srcData, err := readFileN(src, n) - if err != nil { - return nil, trace.Wrap(err) - } +func forceCopy(dst string, srcData []byte, n int64) (orig *smallFile, err error) { fi, err := os.Lstat(dst) if err != nil && !errors.Is(err, os.ErrNotExist) { return nil, trace.Wrap(err) @@ -681,11 +699,11 @@ func readFileN(name string, n int64) ([]byte, error) { return data, trace.Wrap(err) } -func (li *LocalInstaller) removeLinks(ctx context.Context, binDir, svcDir string) error { +func (li *LocalInstaller) removeLinks(ctx context.Context, binDir, svcPath string) error { removeService := false entries, err := os.ReadDir(binDir) if err != nil { - return trace.Errorf("failed to find Teleport binary directory: %w", err) + return trace.Wrap(err, "failed to find Teleport binary directory") } for _, entry := range entries { if entry.IsDir() { @@ -701,7 +719,7 @@ func (li *LocalInstaller) removeLinks(ctx context.Context, binDir, svcDir string continue } if err != nil { - return trace.Errorf("error reading link for %s: %w", filepath.Base(newname), err) + return trace.Wrap(err, "error reading link for %s", filepath.Base(newname)) } if v != oldname { li.Log.DebugContext(ctx, "Skipping link to different binary.", "oldname", oldname, "newname", newname) @@ -720,26 +738,24 @@ func (li *LocalInstaller) removeLinks(ctx context.Context, binDir, svcDir string li.Log.DebugContext(ctx, "Teleport binary not unlinked. Skipping removal of teleport.service.") return nil } - src := filepath.Join(svcDir, serviceName) - srcBytes, err := readFileN(src, maxServiceFileSize) + srcBytes, err := readFileN(svcPath, maxServiceFileSize) if err != nil { return trace.Wrap(err) } - dst := filepath.Join(li.LinkServiceDir, serviceName) - dstBytes, err := readFileN(dst, maxServiceFileSize) + dstBytes, err := readFileN(li.CopyServiceFile, maxServiceFileSize) if errors.Is(err, os.ErrNotExist) { - li.Log.DebugContext(ctx, "Service not present.", "path", dst) + li.Log.DebugContext(ctx, "Service not present.", "path", li.CopyServiceFile) return nil } if err != nil { return trace.Wrap(err) } - if !bytes.Equal(srcBytes, dstBytes) { + if !bytes.Equal(li.TransformService(srcBytes), dstBytes) { li.Log.WarnContext(ctx, "Removed teleport binary link, but skipping removal of custom teleport.service: the service file does not match the reference file for this version. The file might have been manually edited.") return nil } - if err := os.Remove(dst); err != nil { - return trace.Errorf("error removing copy of %s: %w", filepath.Base(dst), err) + if err := os.Remove(li.CopyServiceFile); err != nil { + return trace.Wrap(err, "error removing copy of %s", filepath.Base(li.CopyServiceFile)) } return nil } @@ -748,13 +764,13 @@ func (li *LocalInstaller) removeLinks(ctx context.Context, binDir, svcDir string // Existing links that point to files outside binDir or svcDir, as well as existing non-link files, will error. // tryLinks will not attempt to create any links if linking could result in an error. // However, concurrent changes to links may result in an error with partially-complete linking. -func (li *LocalInstaller) tryLinks(ctx context.Context, binDir, svcDir string) error { +func (li *LocalInstaller) tryLinks(ctx context.Context, binDir, svcPath string) error { // ensure target directories exist before trying to create links err := os.MkdirAll(li.LinkBinDir, systemDirMode) if err != nil { return trace.Wrap(err) } - err = os.MkdirAll(li.LinkServiceDir, systemDirMode) + err = os.MkdirAll(filepath.Dir(li.CopyServiceFile), systemDirMode) if err != nil { return trace.Wrap(err) } @@ -765,7 +781,7 @@ func (li *LocalInstaller) tryLinks(ctx context.Context, binDir, svcDir string) e var linked int entries, err := os.ReadDir(binDir) if err != nil { - return trace.Errorf("failed to find Teleport binary directory: %w", err) + return trace.Wrap(err, "failed to find Teleport binary directory") } for _, entry := range entries { if entry.IsDir() { @@ -775,7 +791,7 @@ func (li *LocalInstaller) tryLinks(ctx context.Context, binDir, svcDir string) e newname := filepath.Join(li.LinkBinDir, entry.Name()) ok, err := needsLink(oldname, newname) if err != nil { - return trace.Errorf("error evaluating link for %s: %w", filepath.Base(oldname), err) + return trace.Wrap(err, "error evaluating link for %s", filepath.Base(oldname)) } if ok { links = append(links, symlink{oldname, newname}) @@ -790,16 +806,14 @@ func (li *LocalInstaller) tryLinks(ctx context.Context, binDir, svcDir string) e // link binaries that are missing links for _, link := range links { if err := os.Symlink(link.oldname, link.newname); err != nil { - return trace.Errorf("failed to create symlink for %s: %w", filepath.Base(link.oldname), err) + return trace.Wrap(err, "failed to create symlink for %s", filepath.Base(link.oldname)) } } // if any binaries are linked from binDir, always link the service from svcDir - src := filepath.Join(svcDir, serviceName) - dst := filepath.Join(li.LinkServiceDir, serviceName) - _, err = forceCopy(dst, src, maxServiceFileSize) + _, err = li.forceCopyService(li.CopyServiceFile, svcPath, maxServiceFileSize) if err != nil && !errors.Is(err, os.ErrExist) { - return trace.Errorf("error writing %s: %w", serviceName, err) + return trace.Wrap(err, "failed to copy service") } return nil @@ -829,20 +843,20 @@ func needsLink(oldname, newname string) (ok bool, err error) { return false, trace.Wrap(err) } if orig != oldname { - return false, trace.Errorf("refusing to replace link at %s: %w", newname, ErrLinked) + return false, trace.Wrap(ErrLinked, "refusing to replace link at %s", newname) } return false, nil } -// versionDir returns the storage directory for a Teleport version. -// versionDir will fail if the version cannot be used to construct the directory name. +// revisionDir returns the storage directory for a Teleport revision. +// revisionDir will fail if the revision cannot be used to construct the directory name. // For example, it ensures that ".." cannot be provided to return a system directory. -func (li *LocalInstaller) versionDir(version string) (string, error) { +func (li *LocalInstaller) revisionDir(rev Revision) (string, error) { installDir, err := filepath.Abs(li.InstallDir) if err != nil { return "", trace.Wrap(err) } - versionDir := filepath.Join(installDir, version) + versionDir := filepath.Join(installDir, rev.Dir()) if filepath.Dir(versionDir) != filepath.Clean(installDir) { return "", trace.Errorf("refusing to link directory outside of version directory") } diff --git a/lib/autoupdate/agent/installer_test.go b/lib/autoupdate/agent/installer_test.go index 9b9c9b268490e..576e2ddacc9af 100644 --- a/lib/autoupdate/agent/installer_test.go +++ b/lib/autoupdate/agent/installer_test.go @@ -124,7 +124,7 @@ func TestLocalInstaller_Install(t *testing.T) { ReservedFreeInstallDisk: tt.reservedInstall, } ctx := context.Background() - err := installer.Install(ctx, version, server.URL+"/{{.OS}}/{{.Arch}}/{{.Version}}", tt.flags) + err := installer.Install(ctx, NewRevision(version, tt.flags), server.URL+"/{{.OS}}/{{.Arch}}/{{.Version}}") if tt.errMatch != "" { require.Error(t, err) assert.Contains(t, err.Error(), tt.errMatch) @@ -204,8 +204,9 @@ func TestLocalInstaller_Link(t *testing.T) { existingLinks []string existingFiles []string - resultPaths []string - errMatch string + resultLinks []string + resultServices []string + errMatch string }{ { name: "present with new links", @@ -226,10 +227,12 @@ func TestLocalInstaller_Link(t *testing.T) { }, installFileMode: os.ModePerm, - resultPaths: []string{ + resultLinks: []string{ "bin/teleport", "bin/tsh", "bin/tbot", + }, + resultServices: []string{ "lib/systemd/system/teleport.service", }, }, @@ -281,10 +284,12 @@ func TestLocalInstaller_Link(t *testing.T) { "lib/systemd/system/teleport.service", }, - resultPaths: []string{ + resultLinks: []string{ "bin/teleport", "bin/tsh", "bin/tbot", + }, + resultServices: []string{ "lib/systemd/system/teleport.service", }, }, @@ -392,13 +397,16 @@ func TestLocalInstaller_Link(t *testing.T) { } installer := &LocalInstaller{ - InstallDir: versionsDir, - LinkBinDir: filepath.Join(linkDir, "bin"), - LinkServiceDir: filepath.Join(linkDir, serviceDir), - Log: slog.Default(), + InstallDir: versionsDir, + LinkBinDir: filepath.Join(linkDir, "bin"), + CopyServiceFile: filepath.Join(linkDir, serviceDir, serviceName), + Log: slog.Default(), + TransformService: func(b []byte) []byte { + return []byte("[transform]" + string(b)) + }, } ctx := context.Background() - revert, err := installer.Link(ctx, version) + revert, err := installer.Link(ctx, NewRevision(version, 0)) if tt.errMatch != "" { require.Error(t, err) assert.Contains(t, err.Error(), tt.errMatch) @@ -423,11 +431,16 @@ func TestLocalInstaller_Link(t *testing.T) { require.NoError(t, err) // verify links - for _, link := range tt.resultPaths { + for _, link := range tt.resultLinks { v, err := os.ReadFile(filepath.Join(linkDir, link)) require.NoError(t, err) require.Equal(t, filepath.Base(link), string(v)) } + for _, svc := range tt.resultServices { + v, err := os.ReadFile(filepath.Join(linkDir, svc)) + require.NoError(t, err) + require.Equal(t, "[transform]"+filepath.Base(svc), string(v)) + } // verify manual revert ok := revert(ctx) @@ -459,8 +472,9 @@ func TestLocalInstaller_TryLink(t *testing.T) { existingLinks []string existingFiles []string - resultPaths []string - errMatch string + resultLinks []string + resultServices []string + errMatch string }{ { name: "present with new links", @@ -481,10 +495,12 @@ func TestLocalInstaller_TryLink(t *testing.T) { }, installFileMode: os.ModePerm, - resultPaths: []string{ + resultLinks: []string{ "bin/teleport", "bin/tsh", "bin/tbot", + }, + resultServices: []string{ "lib/systemd/system/teleport.service", }, }, @@ -634,13 +650,16 @@ func TestLocalInstaller_TryLink(t *testing.T) { } installer := &LocalInstaller{ - InstallDir: versionsDir, - LinkBinDir: filepath.Join(linkDir, "bin"), - LinkServiceDir: filepath.Join(linkDir, serviceDir), - Log: slog.Default(), + InstallDir: versionsDir, + LinkBinDir: filepath.Join(linkDir, "bin"), + CopyServiceFile: filepath.Join(linkDir, serviceDir, serviceName), + Log: slog.Default(), + TransformService: func(b []byte) []byte { + return []byte("[transform]" + string(b)) + }, } ctx := context.Background() - err = installer.TryLink(ctx, version) + err = installer.TryLink(ctx, NewRevision(version, 0)) if tt.errMatch != "" { require.Error(t, err) assert.Contains(t, err.Error(), tt.errMatch) @@ -661,11 +680,17 @@ func TestLocalInstaller_TryLink(t *testing.T) { require.NoError(t, err) // verify links - for _, link := range tt.resultPaths { + for _, link := range tt.resultLinks { v, err := os.ReadFile(filepath.Join(linkDir, link)) require.NoError(t, err) require.Equal(t, filepath.Base(link), string(v)) } + for _, svc := range tt.resultServices { + v, err := os.ReadFile(filepath.Join(linkDir, svc)) + require.NoError(t, err) + require.Equal(t, "[transform]"+filepath.Base(svc), string(v)) + } + }) } } @@ -773,18 +798,21 @@ func TestLocalInstaller_Remove(t *testing.T) { linkDir := t.TempDir() installer := &LocalInstaller{ - InstallDir: versionsDir, - LinkBinDir: filepath.Join(linkDir, "bin"), - LinkServiceDir: filepath.Join(linkDir, serviceDir), - Log: slog.Default(), + InstallDir: versionsDir, + LinkBinDir: filepath.Join(linkDir, "bin"), + CopyServiceFile: filepath.Join(linkDir, serviceDir, serviceName), + Log: slog.Default(), + TransformService: func(b []byte) []byte { + return []byte("[transform]" + string(b)) + }, } ctx := context.Background() if tt.linkedVersion != "" { - _, err = installer.Link(ctx, tt.linkedVersion) + _, err = installer.Link(ctx, NewRevision(tt.linkedVersion, 0)) require.NoError(t, err) } - err = installer.Remove(ctx, tt.removeVersion) + err = installer.Remove(ctx, NewRevision(tt.removeVersion, 0)) if tt.errMatch != "" { require.Error(t, err) assert.Contains(t, err.Error(), tt.errMatch) @@ -821,7 +849,7 @@ func TestLocalInstaller_Unlink(t *testing.T) { {oldname: "bin/teleport", newname: "bin/teleport"}, {oldname: "bin/tsh", newname: "bin/tsh"}, }, - svcCopy: []byte("orig"), + svcCopy: []byte("[transform]orig"), }, { name: "different services", @@ -861,7 +889,7 @@ func TestLocalInstaller_Unlink(t *testing.T) { links: []symlink{ {oldname: "bin/tsh", newname: "bin/tsh"}, }, - svcCopy: []byte("orig"), + svcCopy: []byte("[transform]orig"), remaining: []string{servicePath}, }, { @@ -871,7 +899,7 @@ func TestLocalInstaller_Unlink(t *testing.T) { links: []symlink{ {oldname: "bin/teleport", newname: "bin/teleport"}, }, - svcCopy: []byte("orig"), + svcCopy: []byte("[transform]orig"), }, { name: "wrong teleport link", @@ -881,7 +909,7 @@ func TestLocalInstaller_Unlink(t *testing.T) { {oldname: "other", newname: "bin/teleport"}, {oldname: "bin/tsh", newname: "bin/tsh"}, }, - svcCopy: []byte("orig"), + svcCopy: []byte("[transform]orig"), remaining: []string{servicePath, "bin/teleport"}, }, { @@ -892,7 +920,7 @@ func TestLocalInstaller_Unlink(t *testing.T) { {oldname: "bin/teleport", newname: "bin/teleport"}, {oldname: "wrong", newname: "bin/tsh"}, }, - svcCopy: []byte("orig"), + svcCopy: []byte("[transform]orig"), remaining: []string{"bin/tsh"}, }, } @@ -944,13 +972,16 @@ func TestLocalInstaller_Unlink(t *testing.T) { } installer := &LocalInstaller{ - InstallDir: versionsDir, - LinkBinDir: filepath.Join(linkDir, "bin"), - LinkServiceDir: filepath.Join(linkDir, serviceDir), - Log: slog.Default(), + InstallDir: versionsDir, + LinkBinDir: filepath.Join(linkDir, "bin"), + CopyServiceFile: filepath.Join(linkDir, serviceDir, serviceName), + Log: slog.Default(), + TransformService: func(b []byte) []byte { + return []byte("[transform]" + string(b)) + }, } ctx := context.Background() - err = installer.Unlink(ctx, version) + err = installer.Unlink(ctx, NewRevision(version, 0)) if tt.errMatch != "" { require.Error(t, err) assert.Contains(t, err.Error(), tt.errMatch) @@ -993,7 +1024,10 @@ func TestLocalInstaller_List(t *testing.T) { Log: slog.Default(), } ctx := context.Background() - versions, err := installer.List(ctx) + revisions, err := installer.List(ctx) require.NoError(t, err) - require.Equal(t, []string{"v1", "v2"}, versions) + require.Equal(t, []Revision{ + NewRevision("v1", 0), + NewRevision("v2", 0), + }, revisions) } diff --git a/lib/autoupdate/agent/logger.go b/lib/autoupdate/agent/logger.go new file mode 100644 index 0000000000000..bd50ee50859a4 --- /dev/null +++ b/lib/autoupdate/agent/logger.go @@ -0,0 +1,108 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package agent + +import ( + "bytes" + "context" + "fmt" + "log/slog" + + "github.com/gravitational/trace" +) + +// progressLogger logs progress of any data written as it approaches max. +// max(lines, call_count(Write)) lines are written for each multiple of max. +// progressLogger uses the variability of chunk size as a proxy for speed, and avoids +// logging extraneous lines that do not improve UX for waiting humans. +type progressLogger struct { + ctx context.Context + log *slog.Logger + level slog.Level + name string + max int + lines int + + l int + n int +} + +func (w *progressLogger) Write(p []byte) (n int, err error) { + w.n += len(p) + if w.n >= w.max*(w.l+1)/w.lines { + w.log.Log(w.ctx, w.level, "Downloading", + "file", w.name, + "progress", fmt.Sprintf("%d%%", w.n*100/w.max), + ) + w.l++ + } + return len(p), nil +} + +// lineLogger logs each line written to it. +type lineLogger struct { + ctx context.Context + log *slog.Logger + level slog.Level + prefix string + + last bytes.Buffer +} + +func (w *lineLogger) out(s string) { + w.log.Log(w.ctx, w.level, w.prefix+s) //nolint:sloglint // msg cannot be constant +} + +func (w *lineLogger) Write(p []byte) (n int, err error) { + lines := bytes.Split(p, []byte("\n")) + // Finish writing line + if len(lines) > 0 { + n, err = w.last.Write(lines[0]) + lines = lines[1:] + } + // Quit if no newline + if len(lines) == 0 || err != nil { + return n, trace.Wrap(err) + } + + // Newline found, log line + w.out(w.last.String()) + n += 1 + w.last.Reset() + + // Log lines that are already newline-terminated + for _, line := range lines[:len(lines)-1] { + w.out(string(line)) + n += len(line) + 1 + } + + // Store remaining line non-newline-terminated line. + n2, err := w.last.Write(lines[len(lines)-1]) + n += n2 + return n, trace.Wrap(err) +} + +// Flush logs any trailing bytes that were never terminated with a newline. +func (w *lineLogger) Flush() { + if w.last.Len() == 0 { + return + } + w.out(w.last.String()) + w.last.Reset() +} diff --git a/lib/autoupdate/agent/logger_test.go b/lib/autoupdate/agent/logger_test.go new file mode 100644 index 0000000000000..2a8430ef8cf44 --- /dev/null +++ b/lib/autoupdate/agent/logger_test.go @@ -0,0 +1,186 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package agent + +import ( + "bytes" + "context" + "fmt" + "io" + "log/slog" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestLineLogger(t *testing.T) { + t.Parallel() + + out := &bytes.Buffer{} + ll := lineLogger{ + ctx: context.Background(), + log: slog.New(slog.NewTextHandler(out, + &slog.HandlerOptions{ReplaceAttr: msgOnly}, + )), + } + + for _, e := range []struct { + v string + n int + }{ + {v: "", n: 0}, + {v: "a", n: 1}, + {v: "b\n", n: 2}, + {v: "c\nd", n: 3}, + {v: "e\nf\ng", n: 5}, + {v: "h", n: 1}, + {v: "", n: 0}, + {v: "\n", n: 1}, + {v: "i\n", n: 2}, + {v: "j", n: 1}, + } { + n, err := ll.Write([]byte(e.v)) + require.NoError(t, err) + require.Equal(t, e.n, n) + } + require.Equal(t, "msg=ab\nmsg=c\nmsg=de\nmsg=f\nmsg=gh\nmsg=i\n", out.String()) + ll.Flush() + require.Equal(t, "msg=ab\nmsg=c\nmsg=de\nmsg=f\nmsg=gh\nmsg=i\nmsg=j\n", out.String()) +} + +func msgOnly(_ []string, a slog.Attr) slog.Attr { + switch a.Key { + case "time", "level": + return slog.Attr{} + } + return slog.Attr{Key: a.Key, Value: a.Value} +} + +func TestProgressLogger(t *testing.T) { + t.Parallel() + + type write struct { + n int + out string + } + for _, tt := range []struct { + name string + max, lines int + writes []write + }{ + { + name: "even", + max: 100, + lines: 5, + writes: []write{ + {n: 10}, + {n: 10, out: "20%"}, + {n: 10}, + {n: 10, out: "40%"}, + {n: 10}, + {n: 10, out: "60%"}, + {n: 10}, + {n: 10, out: "80%"}, + {n: 10}, + {n: 10, out: "100%"}, + {n: 10}, + {n: 10, out: "120%"}, + }, + }, + { + name: "fast", + max: 100, + lines: 5, + writes: []write{ + {n: 100, out: "100%"}, + {n: 100, out: "200%"}, + }, + }, + { + name: "over fast", + max: 100, + lines: 5, + writes: []write{ + {n: 200, out: "200%"}, + }, + }, + { + name: "slow down when uneven", + max: 100, + lines: 5, + writes: []write{ + {n: 50, out: "50%"}, + {n: 10, out: "60%"}, + {n: 10, out: "70%"}, + {n: 10, out: "80%"}, + {n: 10}, + {n: 10, out: "100%"}, + {n: 10}, + {n: 10, out: "120%"}, + }, + }, + { + name: "slow down when very uneven", + max: 100, + lines: 5, + writes: []write{ + {n: 50, out: "50%"}, + {n: 1, out: "51%"}, + {n: 1}, + {n: 20, out: "72%"}, + {n: 10, out: "82%"}, + {n: 10}, + {n: 10, out: "102%"}, + }, + }, + { + name: "close", + max: 1000, + lines: 5, + writes: []write{ + {n: 999, out: "99%"}, + {n: 1, out: "100%"}, + }, + }, + } { + t.Run(tt.name, func(t *testing.T) { + out := &bytes.Buffer{} + ll := progressLogger{ + ctx: context.Background(), + log: slog.New(slog.NewTextHandler(out, + &slog.HandlerOptions{ReplaceAttr: msgOnly}, + )), + name: "test", + max: tt.max, + lines: tt.lines, + } + for _, e := range tt.writes { + n, err := ll.Write(make([]byte, e.n)) + require.NoError(t, err) + require.Equal(t, e.n, n) + v, err := io.ReadAll(out) + require.NoError(t, err) + if len(v) > 0 { + e.out = fmt.Sprintf(`msg=Downloading file=test progress=%s`+"\n", e.out) + } + require.Equal(t, e.out, string(v)) + } + }) + } +} diff --git a/lib/autoupdate/agent/process.go b/lib/autoupdate/agent/process.go index 77455b24eb1dd..1117b76a4fc0e 100644 --- a/lib/autoupdate/agent/process.go +++ b/lib/autoupdate/agent/process.go @@ -34,9 +34,9 @@ import ( ) const ( - // crashMonitorInterval is the polling interval for determining restart times from LastRestartPath. + // crashMonitorInterval is the polling interval for determining restart times from PIDFile. crashMonitorInterval = 2 * time.Second - // minRunningIntervalsBeforeStable is the number of consecutive intervals with the same running PID detect + // minRunningIntervalsBeforeStable is the number of consecutive intervals with the same running PID detected // before the service is determined stable. minRunningIntervalsBeforeStable = 6 // maxCrashesBeforeFailure is the number of total crashes detected before the service is marked as crash-looping. @@ -298,14 +298,14 @@ func (s SystemdService) IsEnabled(ctx context.Context) (bool, error) { code := s.systemctl(ctx, slog.LevelDebug, "is-enabled", "--quiet", s.ServiceName) switch { case code < 0: - return false, trace.Errorf("unable to determine if systemd service %q is enabled", s.ServiceName) + return false, trace.Errorf("unable to determine if systemd service %s is enabled", s.ServiceName) case code == 0: return true, nil } code = s.systemctl(ctx, slog.LevelDebug, "is-active", "--quiet", s.ServiceName) switch { case code < 0: - return false, trace.Errorf("unable to determine if systemd service %q is active", s.ServiceName) + return false, trace.Errorf("unable to determine if systemd service %s is active", s.ServiceName) case code == 0: return true, nil } @@ -377,55 +377,3 @@ func (c *localExec) Run(ctx context.Context, name string, args ...string) (int, } return code, trace.Wrap(err) } - -// lineLogger logs each line written to it. -type lineLogger struct { - ctx context.Context - log *slog.Logger - level slog.Level - prefix string - - last bytes.Buffer -} - -func (w *lineLogger) out(s string) { - w.log.Log(w.ctx, w.level, w.prefix+s) //nolint:sloglint // msg cannot be constant -} - -func (w *lineLogger) Write(p []byte) (n int, err error) { - lines := bytes.Split(p, []byte("\n")) - // Finish writing line - if len(lines) > 0 { - n, err = w.last.Write(lines[0]) - lines = lines[1:] - } - // Quit if no newline - if len(lines) == 0 || err != nil { - return n, trace.Wrap(err) - } - - // Newline found, log line - w.out(w.last.String()) - n += 1 - w.last.Reset() - - // Log lines that are already newline-terminated - for _, line := range lines[:len(lines)-1] { - w.out(string(line)) - n += len(line) + 1 - } - - // Store remaining line non-newline-terminated line. - n2, err := w.last.Write(lines[len(lines)-1]) - n += n2 - return n, trace.Wrap(err) -} - -// Flush logs any trailing bytes that were never terminated with a newline. -func (w *lineLogger) Flush() { - if w.last.Len() == 0 { - return - } - w.out(w.last.String()) - w.last.Reset() -} diff --git a/lib/autoupdate/agent/process_test.go b/lib/autoupdate/agent/process_test.go index c558a7539831a..e3d3d00ff085b 100644 --- a/lib/autoupdate/agent/process_test.go +++ b/lib/autoupdate/agent/process_test.go @@ -19,7 +19,6 @@ package agent import ( - "bytes" "context" "errors" "fmt" @@ -32,49 +31,6 @@ import ( "github.com/stretchr/testify/require" ) -func TestLineLogger(t *testing.T) { - t.Parallel() - - out := &bytes.Buffer{} - ll := lineLogger{ - ctx: context.Background(), - log: slog.New(slog.NewTextHandler(out, - &slog.HandlerOptions{ReplaceAttr: msgOnly}, - )), - } - - for _, e := range []struct { - v string - n int - }{ - {v: "", n: 0}, - {v: "a", n: 1}, - {v: "b\n", n: 2}, - {v: "c\nd", n: 3}, - {v: "e\nf\ng", n: 5}, - {v: "h", n: 1}, - {v: "", n: 0}, - {v: "\n", n: 1}, - {v: "i\n", n: 2}, - {v: "j", n: 1}, - } { - n, err := ll.Write([]byte(e.v)) - require.NoError(t, err) - require.Equal(t, e.n, n) - } - require.Equal(t, "msg=ab\nmsg=c\nmsg=de\nmsg=f\nmsg=gh\nmsg=i\n", out.String()) - ll.Flush() - require.Equal(t, "msg=ab\nmsg=c\nmsg=de\nmsg=f\nmsg=gh\nmsg=i\nmsg=j\n", out.String()) -} - -func msgOnly(_ []string, a slog.Attr) slog.Attr { - switch a.Key { - case "time", "level": - return slog.Attr{} - } - return slog.Attr{Key: a.Key, Value: a.Value} -} - func TestWaitForStablePID(t *testing.T) { t.Parallel() diff --git a/lib/autoupdate/agent/setup.go b/lib/autoupdate/agent/setup.go index a8bf12a0afe0a..b51e378208715 100644 --- a/lib/autoupdate/agent/setup.go +++ b/lib/autoupdate/agent/setup.go @@ -19,28 +19,45 @@ package agent import ( + "bytes" "context" "errors" "io/fs" "log/slog" "os" "path/filepath" + "regexp" "text/template" "github.com/google/renameio/v2" "github.com/gravitational/trace" + + "github.com/gravitational/teleport/lib/defaults" +) + +// Base paths for constructing namespaced directories. +const ( + teleportOptDir = "/opt/teleport" + versionsDirName = "versions" + systemdAdminDir = "/etc/systemd/system" + systemdPIDFile = "/run/teleport.pid" + defaultNamespace = "default" + systemNamespace = "system" + lockFileName = "update.lock" ) const ( updateServiceTemplate = `# teleport-update +# DO NOT EDIT THIS FILE [Unit] Description=Teleport auto-update service [Service] Type=oneshot -ExecStart={{.LinkDir}}/bin/teleport-update update +ExecStart={{.UpdaterCommand}} ` updateTimerTemplate = `# teleport-update +# DO NOT EDIT THIS FILE [Unit] Description=Teleport auto-update timer unit @@ -50,71 +67,183 @@ OnUnitActiveSec=5m RandomizedDelaySec=1m [Install] -WantedBy=teleport.service +WantedBy={{.TeleportService}} ` ) +// Namespace represents a namespace within various system paths for a isolated installation of Teleport. +type Namespace struct { + log *slog.Logger + // name of namespace + name string + // dataDir for Teleport + dataDir string + // linkDir for Teleport binaries (ns: /opt/teleport/myns/bin) + linkDir string + // versionsDir for Teleport versions (ns: /opt/teleport/myns/versions) + versionsDir string + // serviceFile for the Teleport systemd service (ns: /etc/systemd/system/teleport_myns.service) + serviceFile string + // configFile for Teleport config (ns: /opt/teleport/myns/etc/teleport.yaml) + configFile string + // pidFile for Teleport (ns: /run/teleport_myns.pid) + pidFile string + // updaterLockFile for locking the updater (ns: /opt/teleport/myns/update.lock) + updaterLockFile string + // updaterConfigFile for configuring updates (ns: /opt/teleport/myns/update.yaml) + updaterConfigFile string + // updaterBinFile for the updater when linked (linkDir + name) + updaterBinFile string + // updaterServiceFile is the systemd service path for the updater + updaterServiceFile string + // updaterTimerFile is the systemd timer path for the updater + updaterTimerFile string +} + +var alphanum = regexp.MustCompile("^[a-zA-Z0-9-]*$") + +// NewNamespace validates and returns a Namespace. +// Namespaces must be alphanumeric + `-`. +func NewNamespace(log *slog.Logger, name, dataDir, linkDir string) (*Namespace, error) { + if name == defaultNamespace || + name == systemNamespace { + return nil, trace.Errorf("namespace %s is reserved", name) + } + if !alphanum.MatchString(name) { + return nil, trace.Errorf("invalid namespace name %s, must be alphanumeric", name) + } + if name == "" { + if dataDir == "" { + dataDir = defaults.DataDir + } + if linkDir == "" { + linkDir = DefaultLinkDir + } + return &Namespace{ + log: log, + name: name, + dataDir: dataDir, + linkDir: linkDir, + versionsDir: filepath.Join(namespaceDir(name), versionsDirName), + serviceFile: filepath.Join("/", serviceDir, serviceName), + configFile: defaults.ConfigFilePath, + pidFile: systemdPIDFile, + updaterLockFile: filepath.Join(namespaceDir(name), lockFileName), + updaterConfigFile: filepath.Join(namespaceDir(name), updateConfigName), + updaterBinFile: filepath.Join(linkDir, BinaryName), + updaterServiceFile: filepath.Join(systemdAdminDir, BinaryName+".service"), + updaterTimerFile: filepath.Join(systemdAdminDir, BinaryName+".timer"), + }, nil + } + + prefix := "teleport_" + name + if dataDir == "" { + dataDir = filepath.Join(filepath.Dir(defaults.DataDir), prefix) + } + if linkDir == "" { + linkDir = filepath.Join(namespaceDir(name), "bin") + } + return &Namespace{ + log: log, + name: name, + dataDir: dataDir, + linkDir: linkDir, + versionsDir: filepath.Join(namespaceDir(name), versionsDirName), + serviceFile: filepath.Join(systemdAdminDir, prefix+".service"), + configFile: filepath.Join(filepath.Dir(defaults.ConfigFilePath), prefix+".yaml"), + pidFile: filepath.Join(filepath.Dir(systemdPIDFile), prefix+".pid"), + updaterLockFile: filepath.Join(namespaceDir(name), lockFileName), + updaterConfigFile: filepath.Join(namespaceDir(name), updateConfigName), + updaterBinFile: filepath.Join(linkDir, BinaryName), + updaterServiceFile: filepath.Join(systemdAdminDir, BinaryName+"_"+name+".service"), + updaterTimerFile: filepath.Join(systemdAdminDir, BinaryName+"_"+name+".timer"), + }, nil +} + +func namespaceDir(name string) string { + if name == "" { + name = defaultNamespace + } + return filepath.Join(teleportOptDir, name) +} + +// Init create the initial directory structure and returns the lockfile for a Namespace. +func (ns *Namespace) Init() (lockFile string, err error) { + if err := os.MkdirAll(ns.versionsDir, systemDirMode); err != nil { + return "", trace.Wrap(err) + } + return ns.updaterLockFile, nil +} + // Setup installs service and timer files for the teleport-update binary. // Afterwords, Setup reloads systemd and enables the timer with --now. -func Setup(ctx context.Context, log *slog.Logger, linkDir, dataDir string) error { - err := writeConfigFiles(linkDir, dataDir) +func (ns *Namespace) Setup(ctx context.Context) error { + err := ns.writeConfigFiles() if err != nil { - return trace.Errorf("failed to write teleport-update systemd config files: %w", err) + return trace.Wrap(err, "failed to write teleport-update systemd config files") } svc := &SystemdService{ - ServiceName: "teleport-update.timer", - Log: log, + ServiceName: filepath.Base(ns.updaterTimerFile), + Log: ns.log, } if err := svc.Sync(ctx); err != nil { - return trace.Errorf("failed to sync systemd config: %w", err) + return trace.Wrap(err, "failed to sync systemd config") } if err := svc.Enable(ctx, true); err != nil { - return trace.Errorf("failed to enable teleport-update systemd timer: %w", err) + return trace.Wrap(err, "failed to enable teleport-update systemd timer") } return nil } // Teardown removes all traces of the auto-updater, including its configuration. -func Teardown(ctx context.Context, log *slog.Logger, linkDir, dataDir string) error { +func (ns *Namespace) Teardown(ctx context.Context) error { svc := &SystemdService{ - ServiceName: "teleport-update.timer", - Log: log, + ServiceName: filepath.Base(ns.updaterTimerFile), + Log: ns.log, } if err := svc.Disable(ctx); err != nil { - return trace.Errorf("failed to disable teleport-update systemd timer: %w", err) + return trace.Wrap(err, "failed to disable teleport-update systemd timer") } - servicePath := filepath.Join(linkDir, serviceDir, updateServiceName) - if err := os.Remove(servicePath); err != nil && !errors.Is(err, fs.ErrNotExist) { - return trace.Errorf("failed to remove teleport-update systemd service: %w", err) + if err := os.Remove(ns.updaterServiceFile); err != nil && !errors.Is(err, fs.ErrNotExist) { + return trace.Wrap(err, "failed to remove teleport-update systemd service") } - timerPath := filepath.Join(linkDir, serviceDir, updateTimerName) - if err := os.Remove(timerPath); err != nil && !errors.Is(err, fs.ErrNotExist) { - return trace.Errorf("failed to remove teleport-update systemd timer: %w", err) + if err := os.Remove(ns.updaterTimerFile); err != nil && !errors.Is(err, fs.ErrNotExist) { + return trace.Wrap(err, "failed to remove teleport-update systemd timer") } if err := svc.Sync(ctx); err != nil { - return trace.Errorf("failed to sync systemd config: %w", err) + return trace.Wrap(err, "failed to sync systemd config") } - if err := os.RemoveAll(filepath.Join(dataDir, VersionsDirName)); err != nil { - return trace.Errorf("failed to remove versions directory: %w", err) + if err := os.RemoveAll(ns.versionsDir); err != nil { + return trace.Wrap(err, "failed to remove versions directory") } return nil } -func writeConfigFiles(linkDir, dataDir string) error { - servicePath := filepath.Join(linkDir, serviceDir, updateServiceName) - err := writeTemplate(servicePath, updateServiceTemplate, linkDir, dataDir) +func (ns *Namespace) writeConfigFiles() error { + var args string + if ns.name != "" { + args = " --install-suffix=" + ns.name + } + err := writeTemplate( + ns.updaterServiceFile, updateServiceTemplate, + struct{ UpdaterCommand string }{ + ns.updaterBinFile + args + " update", + }, + ) if err != nil { return trace.Wrap(err) } - timerPath := filepath.Join(linkDir, serviceDir, updateTimerName) - err = writeTemplate(timerPath, updateTimerTemplate, linkDir, dataDir) + err = writeTemplate( + ns.updaterTimerFile, updateTimerTemplate, + struct{ TeleportService string }{filepath.Base(ns.serviceFile)}, + ) if err != nil { return trace.Wrap(err) } return nil } -func writeTemplate(path, t, linkDir, dataDir string) error { +func writeTemplate(path, t string, values any) error { dir, file := filepath.Split(path) if err := os.MkdirAll(dir, systemDirMode); err != nil { return trace.Wrap(err) @@ -133,12 +262,42 @@ func writeTemplate(path, t, linkDir, dataDir string) error { if err != nil { return trace.Wrap(err) } - err = tmpl.Execute(f, struct { - LinkDir string - DataDir string - }{linkDir, dataDir}) + err = tmpl.Execute(f, values) if err != nil { return trace.Wrap(err) } return trace.Wrap(f.CloseAtomicallyReplace()) } + +// replaceTeleportService replaces the default paths in the Teleport service config with namespaced paths. +func (ns *Namespace) replaceTeleportService(cfg []byte) []byte { + for _, rep := range []struct { + old, new string + }{ + { + old: "/usr/local/bin/", + new: ns.linkDir + "/", + }, + { + old: "/etc/teleport.yaml", + new: ns.configFile, + }, + { + old: "/run/teleport.pid", + new: ns.pidFile, + }, + } { + cfg = bytes.ReplaceAll(cfg, []byte(rep.old), []byte(rep.new)) + } + return cfg +} + +func (ns *Namespace) LogWarning(ctx context.Context) { + ns.log.WarnContext(ctx, "Custom install suffix specified. Teleport data_dir must be configured in the config file.", + "data_dir", ns.dataDir, + "path", ns.linkDir, + "config", ns.configFile, + "service", filepath.Base(ns.serviceFile), + "pid", ns.pidFile, + ) +} diff --git a/lib/autoupdate/agent/setup_test.go b/lib/autoupdate/agent/setup_test.go index 16cbdb5374fb6..8892acb85e06c 100644 --- a/lib/autoupdate/agent/setup_test.go +++ b/lib/autoupdate/agent/setup_test.go @@ -20,46 +20,172 @@ package agent import ( "bytes" + "log/slog" "os" "path/filepath" "testing" "github.com/stretchr/testify/require" - libdefaults "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/utils/golden" ) -func TestWriteConfigFiles(t *testing.T) { - t.Parallel() - linkDir := t.TempDir() - dataDir := t.TempDir() - err := writeConfigFiles(linkDir, dataDir) - require.NoError(t, err) +func TestNewNamespace(t *testing.T) { + for _, p := range []struct { + name string + namespace string + linkDir string + dataDir string + errMatch string + ns *Namespace + }{ + { + name: "no namespace", + ns: &Namespace{ + dataDir: "/var/lib/teleport", + linkDir: "/usr/local/bin", + versionsDir: "/opt/teleport/default/versions", + serviceFile: "/lib/systemd/system/teleport.service", + configFile: "/etc/teleport.yaml", + pidFile: "/run/teleport.pid", + updaterLockFile: "/opt/teleport/default/update.lock", + updaterConfigFile: "/opt/teleport/default/update.yaml", + updaterBinFile: "/usr/local/bin/teleport-update", + updaterServiceFile: "/etc/systemd/system/teleport-update.service", + updaterTimerFile: "/etc/systemd/system/teleport-update.timer", + }, + }, + { + name: "no namespace with dirs", + linkDir: "/link", + dataDir: "/data", + ns: &Namespace{ + dataDir: "/data", + linkDir: "/link", + versionsDir: "/opt/teleport/default/versions", + serviceFile: "/lib/systemd/system/teleport.service", + configFile: "/etc/teleport.yaml", + pidFile: "/run/teleport.pid", + updaterLockFile: "/opt/teleport/default/update.lock", + updaterConfigFile: "/opt/teleport/default/update.yaml", + updaterBinFile: "/link/teleport-update", + updaterServiceFile: "/etc/systemd/system/teleport-update.service", + updaterTimerFile: "/etc/systemd/system/teleport-update.timer", + }, + }, + { + name: "test namespace", + namespace: "test", + ns: &Namespace{ + name: "test", + dataDir: "/var/lib/teleport_test", + linkDir: "/opt/teleport/test/bin", + versionsDir: "/opt/teleport/test/versions", + serviceFile: "/etc/systemd/system/teleport_test.service", + configFile: "/etc/teleport_test.yaml", + pidFile: "/run/teleport_test.pid", + updaterLockFile: "/opt/teleport/test/update.lock", + updaterConfigFile: "/opt/teleport/test/update.yaml", + updaterBinFile: "/opt/teleport/test/bin/teleport-update", + updaterServiceFile: "/etc/systemd/system/teleport-update_test.service", + updaterTimerFile: "/etc/systemd/system/teleport-update_test.timer", + }, + }, + { + name: "test namespace with dirs", + namespace: "test", + linkDir: "/link", + dataDir: "/data", + ns: &Namespace{ + name: "test", + dataDir: "/data", + linkDir: "/link", + versionsDir: "/opt/teleport/test/versions", + serviceFile: "/etc/systemd/system/teleport_test.service", + configFile: "/etc/teleport_test.yaml", + pidFile: "/run/teleport_test.pid", + updaterLockFile: "/opt/teleport/test/update.lock", + updaterConfigFile: "/opt/teleport/test/update.yaml", + updaterBinFile: "/link/teleport-update", + updaterServiceFile: "/etc/systemd/system/teleport-update_test.service", + updaterTimerFile: "/etc/systemd/system/teleport-update_test.timer", + }, + }, + { + name: "reserved default", + namespace: defaultNamespace, + errMatch: "reserved", + }, + { + name: "reserved system", + namespace: systemNamespace, + errMatch: "reserved", + }, + } { + t.Run(p.name, func(t *testing.T) { + log := slog.Default() + ns, err := NewNamespace(log, p.namespace, p.dataDir, p.linkDir) + if p.errMatch != "" { + require.Error(t, err) + require.Contains(t, err.Error(), p.errMatch) + return + } + require.NoError(t, err) + ns.log = nil + require.Equal(t, p.ns, ns) + }) + } +} - for _, p := range []string{ - filepath.Join(linkDir, serviceDir, updateServiceName), - filepath.Join(linkDir, serviceDir, updateTimerName), +func TestWriteConfigFiles(t *testing.T) { + for _, p := range []struct { + name string + namespace string + }{ + { + name: "no namespace", + }, + { + name: "test namespace", + namespace: "test", + }, } { - t.Run(filepath.Base(p), func(t *testing.T) { - data, err := os.ReadFile(p) + t.Run(p.name, func(t *testing.T) { + log := slog.Default() + linkDir := t.TempDir() + ns, err := NewNamespace(log, p.namespace, "", linkDir) + require.NoError(t, err) + ns.updaterServiceFile = filepath.Join(linkDir, serviceDir, filepath.Base(ns.updaterServiceFile)) + ns.updaterTimerFile = filepath.Join(linkDir, serviceDir, filepath.Base(ns.updaterTimerFile)) + err = ns.writeConfigFiles() + require.NoError(t, err) + + data, err := os.ReadFile(ns.updaterServiceFile) + require.NoError(t, err) + data = replaceValues(data, map[string]string{ + DefaultLinkDir: linkDir, + }) + if golden.ShouldSet() { + golden.SetNamed(t, "service", data) + } + require.Equal(t, string(golden.GetNamed(t, "service")), string(data)) + + data, err = os.ReadFile(ns.updaterTimerFile) require.NoError(t, err) data = replaceValues(data, map[string]string{ - DefaultLinkDir: linkDir, - libdefaults.DataDir: dataDir, + DefaultLinkDir: linkDir, }) if golden.ShouldSet() { - golden.Set(t, data) + golden.SetNamed(t, "timer", data) } - require.Equal(t, string(golden.Get(t)), string(data)) + require.Equal(t, string(golden.GetNamed(t, "timer")), string(data)) }) } } func replaceValues(data []byte, m map[string]string) []byte { for k, v := range m { - data = bytes.ReplaceAll(data, []byte(v), - []byte(k)) + data = bytes.ReplaceAll(data, []byte(v), []byte(k)) } return data } diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Disable/already_disabled.golden b/lib/autoupdate/agent/testdata/TestUpdater_Disable/already_disabled.golden index b05a76e619cdc..7c30a0f7fa0c8 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Disable/already_disabled.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Disable/already_disabled.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Disable/enabled.golden b/lib/autoupdate/agent/testdata/TestUpdater_Disable/enabled.golden index b05a76e619cdc..7c30a0f7fa0c8 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Disable/enabled.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Disable/enabled.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/FIPS_and_Enterprise_flags.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/FIPS_and_Enterprise_flags.golden index 9c2b8ef209bbd..a14c9c32bcb12 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/FIPS_and_Enterprise_flags.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/FIPS_and_Enterprise_flags.golden @@ -5,5 +5,6 @@ spec: enabled: false pinned: false status: - active_version: 16.3.0 - backup_version: "" + active: + version: 16.3.0 + flags: [Enterprise, FIPS] diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/backup_version_kept_for_validation.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/backup_version_kept_for_validation.golden index 715d8d3aae94d..28eb97f2534e0 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/backup_version_kept_for_validation.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/backup_version_kept_for_validation.golden @@ -5,5 +5,7 @@ spec: enabled: false pinned: false status: - active_version: 16.3.0 - backup_version: backup-version + active: + version: 16.3.0 + backup: + version: backup-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/backup_version_removed_on_install.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/backup_version_removed_on_install.golden index ec6bf5a101df8..0b6105717e924 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/backup_version_removed_on_install.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/backup_version_removed_on_install.golden @@ -5,5 +5,7 @@ spec: enabled: false pinned: false status: - active_version: 16.3.0 - backup_version: old-version + active: + version: 16.3.0 + backup: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/config_does_not_exist.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/config_does_not_exist.golden index 9c2b8ef209bbd..cfd3745bbd833 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/config_does_not_exist.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/config_does_not_exist.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: 16.3.0 - backup_version: "" + active: + version: 16.3.0 diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/config_from_file.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/config_from_file.golden index d63e09b2fa155..66e2695c2fd3a 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/config_from_file.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/config_from_file.golden @@ -7,5 +7,7 @@ spec: enabled: true pinned: false status: - active_version: 16.3.0 - backup_version: old-version + active: + version: 16.3.0 + backup: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/config_from_user.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/config_from_user.golden index 52b33b0111955..801e0b280f29c 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/config_from_user.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/config_from_user.golden @@ -7,5 +7,7 @@ spec: enabled: true pinned: false status: - active_version: new-version - backup_version: old-version + active: + version: new-version + backup: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/defaults.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/defaults.golden index ec6bf5a101df8..0b6105717e924 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/defaults.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/defaults.golden @@ -5,5 +5,7 @@ spec: enabled: false pinned: false status: - active_version: 16.3.0 - backup_version: old-version + active: + version: 16.3.0 + backup: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/insecure_URL.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/insecure_URL.golden index 4de09b7eeb217..61d99f3d18e5f 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/insecure_URL.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/insecure_URL.golden @@ -6,5 +6,5 @@ spec: enabled: false pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/install_error.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/install_error.golden index b05a76e619cdc..7c30a0f7fa0c8 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/install_error.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/install_error.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/invalid_metadata.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/invalid_metadata.golden index 91cb5de367475..4f1323d0e41f4 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/invalid_metadata.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/invalid_metadata.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/no_need_to_reload.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/no_need_to_reload.golden index 9c2b8ef209bbd..cfd3745bbd833 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/no_need_to_reload.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/no_need_to_reload.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: 16.3.0 - backup_version: "" + active: + version: 16.3.0 diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/no_systemd.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/no_systemd.golden index 9c2b8ef209bbd..cfd3745bbd833 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/no_systemd.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/no_systemd.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: 16.3.0 - backup_version: "" + active: + version: 16.3.0 diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/override_skip.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/override_skip.golden index ec6bf5a101df8..0b6105717e924 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/override_skip.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/override_skip.golden @@ -5,5 +5,7 @@ spec: enabled: false pinned: false status: - active_version: 16.3.0 - backup_version: old-version + active: + version: 16.3.0 + backup: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Install/version_already_installed.golden b/lib/autoupdate/agent/testdata/TestUpdater_Install/version_already_installed.golden index 9c2b8ef209bbd..cfd3745bbd833 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Install/version_already_installed.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Install/version_already_installed.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: 16.3.0 - backup_version: "" + active: + version: 16.3.0 diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Unpin/not_pinned.golden b/lib/autoupdate/agent/testdata/TestUpdater_Unpin/not_pinned.golden index b05a76e619cdc..7c30a0f7fa0c8 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Unpin/not_pinned.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Unpin/not_pinned.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Unpin/pinned.golden b/lib/autoupdate/agent/testdata/TestUpdater_Unpin/pinned.golden index b05a76e619cdc..7c30a0f7fa0c8 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Unpin/pinned.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Unpin/pinned.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/FIPS_and_Enterprise_flags.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/FIPS_and_Enterprise_flags.golden index 0f0663cdaffc8..171b474129666 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/FIPS_and_Enterprise_flags.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/FIPS_and_Enterprise_flags.golden @@ -6,5 +6,9 @@ spec: enabled: true pinned: false status: - active_version: 16.3.0 - backup_version: old-version + active: + version: 16.3.0 + flags: [Enterprise, FIPS] + backup: + version: old-version + flags: [Enterprise, FIPS] diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/backup_version_kept_when_no_change.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/backup_version_kept_when_no_change.golden index c56612e230890..1a55f77e33fb8 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/backup_version_kept_when_no_change.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/backup_version_kept_when_no_change.golden @@ -6,5 +6,7 @@ spec: enabled: true pinned: false status: - active_version: 16.3.0 - backup_version: backup-version + active: + version: 16.3.0 + backup: + version: backup-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/backup_version_removed_on_install.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/backup_version_removed_on_install.golden index 0f0663cdaffc8..e5ccf529d19b9 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/backup_version_removed_on_install.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/backup_version_removed_on_install.golden @@ -6,5 +6,7 @@ spec: enabled: true pinned: false status: - active_version: 16.3.0 - backup_version: old-version + active: + version: 16.3.0 + backup: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/insecure_URL.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/insecure_URL.golden index 1078bb7378840..899b48118505e 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/insecure_URL.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/insecure_URL.golden @@ -6,5 +6,5 @@ spec: enabled: true pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/install_error.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/install_error.golden index 85c50cbb4b1e0..0323d25821cb2 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/install_error.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/install_error.golden @@ -5,5 +5,5 @@ spec: enabled: true pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/invalid_metadata.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/invalid_metadata.golden index 99be1fccf2fd7..37cfc7fc89d10 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/invalid_metadata.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/invalid_metadata.golden @@ -5,5 +5,5 @@ spec: enabled: false pinned: false status: - active_version: "" - backup_version: "" + active: + version: "" diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/pinned_version.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/pinned_version.golden index ec80fb388511c..dfc451f108d8c 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/pinned_version.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/pinned_version.golden @@ -6,5 +6,7 @@ spec: enabled: true pinned: true status: - active_version: old-version - backup_version: backup-version + active: + version: old-version + backup: + version: backup-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/reload_fails.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/reload_fails.golden index 8451c7aae551b..7efb7d9e3cf1f 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/reload_fails.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/reload_fails.golden @@ -6,6 +6,9 @@ spec: enabled: true pinned: false status: - active_version: old-version - backup_version: backup-version - skip_version: 16.3.0 + active: + version: old-version + backup: + version: backup-version + skip: + version: 16.3.0 diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/setup_fails.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/setup_fails.golden index 8451c7aae551b..7efb7d9e3cf1f 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/setup_fails.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/setup_fails.golden @@ -6,6 +6,9 @@ spec: enabled: true pinned: false status: - active_version: old-version - backup_version: backup-version - skip_version: 16.3.0 + active: + version: old-version + backup: + version: backup-version + skip: + version: 16.3.0 diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/skip_version.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/skip_version.golden index 8451c7aae551b..7efb7d9e3cf1f 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/skip_version.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/skip_version.golden @@ -6,6 +6,9 @@ spec: enabled: true pinned: false status: - active_version: old-version - backup_version: backup-version - skip_version: 16.3.0 + active: + version: old-version + backup: + version: backup-version + skip: + version: 16.3.0 diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_disabled_during_window.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_disabled_during_window.golden index 41bab44393b8d..b797b2509f748 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_disabled_during_window.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_disabled_during_window.golden @@ -7,5 +7,5 @@ spec: enabled: false pinned: false status: - active_version: old-version - backup_version: "" + active: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_disabled_outside_of_window.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_disabled_outside_of_window.golden index 41bab44393b8d..b797b2509f748 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_disabled_outside_of_window.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_disabled_outside_of_window.golden @@ -7,5 +7,5 @@ spec: enabled: false pinned: false status: - active_version: old-version - backup_version: "" + active: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_during_window.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_during_window.golden index d63e09b2fa155..66e2695c2fd3a 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_during_window.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_during_window.golden @@ -7,5 +7,7 @@ spec: enabled: true pinned: false status: - active_version: 16.3.0 - backup_version: old-version + active: + version: 16.3.0 + backup: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_now.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_now.golden new file mode 100644 index 0000000000000..66e2695c2fd3a --- /dev/null +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_now.golden @@ -0,0 +1,13 @@ +version: v1 +kind: update_config +spec: + proxy: localhost + group: group + url_template: https://example.com + enabled: true + pinned: false +status: + active: + version: 16.3.0 + backup: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_outside_of_window.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_outside_of_window.golden index 3d0ead7bbfe4d..05b6b150d9796 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_outside_of_window.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/updates_enabled_outside_of_window.golden @@ -7,5 +7,5 @@ spec: enabled: true pinned: false status: - active_version: old-version - backup_version: "" + active: + version: old-version diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/version_already_installed_in_window.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/version_already_installed_in_window.golden index 09cfd0264e561..b1e895fb2c2e4 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/version_already_installed_in_window.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/version_already_installed_in_window.golden @@ -6,5 +6,5 @@ spec: enabled: true pinned: false status: - active_version: 16.3.0 - backup_version: "" + active: + version: 16.3.0 diff --git a/lib/autoupdate/agent/testdata/TestUpdater_Update/version_already_installed_outside_of_window.golden b/lib/autoupdate/agent/testdata/TestUpdater_Update/version_already_installed_outside_of_window.golden index 09cfd0264e561..b1e895fb2c2e4 100644 --- a/lib/autoupdate/agent/testdata/TestUpdater_Update/version_already_installed_outside_of_window.golden +++ b/lib/autoupdate/agent/testdata/TestUpdater_Update/version_already_installed_outside_of_window.golden @@ -6,5 +6,5 @@ spec: enabled: true pinned: false status: - active_version: 16.3.0 - backup_version: "" + active: + version: 16.3.0 diff --git a/lib/autoupdate/agent/testdata/TestWriteConfigFiles/teleport-update.service.golden b/lib/autoupdate/agent/testdata/TestWriteConfigFiles/no_namespace/service.golden similarity index 85% rename from lib/autoupdate/agent/testdata/TestWriteConfigFiles/teleport-update.service.golden rename to lib/autoupdate/agent/testdata/TestWriteConfigFiles/no_namespace/service.golden index 185b4f07a1aa9..6f9c2affce999 100644 --- a/lib/autoupdate/agent/testdata/TestWriteConfigFiles/teleport-update.service.golden +++ b/lib/autoupdate/agent/testdata/TestWriteConfigFiles/no_namespace/service.golden @@ -1,4 +1,5 @@ # teleport-update +# DO NOT EDIT THIS FILE [Unit] Description=Teleport auto-update service diff --git a/lib/autoupdate/agent/testdata/TestWriteConfigFiles/teleport-update.timer.golden b/lib/autoupdate/agent/testdata/TestWriteConfigFiles/no_namespace/timer.golden similarity index 87% rename from lib/autoupdate/agent/testdata/TestWriteConfigFiles/teleport-update.timer.golden rename to lib/autoupdate/agent/testdata/TestWriteConfigFiles/no_namespace/timer.golden index acca095d9825f..d14a43d679e53 100644 --- a/lib/autoupdate/agent/testdata/TestWriteConfigFiles/teleport-update.timer.golden +++ b/lib/autoupdate/agent/testdata/TestWriteConfigFiles/no_namespace/timer.golden @@ -1,4 +1,5 @@ # teleport-update +# DO NOT EDIT THIS FILE [Unit] Description=Teleport auto-update timer unit diff --git a/lib/autoupdate/agent/testdata/TestWriteConfigFiles/test_namespace/service.golden b/lib/autoupdate/agent/testdata/TestWriteConfigFiles/test_namespace/service.golden new file mode 100644 index 0000000000000..030c99fd644e4 --- /dev/null +++ b/lib/autoupdate/agent/testdata/TestWriteConfigFiles/test_namespace/service.golden @@ -0,0 +1,8 @@ +# teleport-update +# DO NOT EDIT THIS FILE +[Unit] +Description=Teleport auto-update service + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/teleport-update --install-suffix=test update diff --git a/lib/autoupdate/agent/testdata/TestWriteConfigFiles/test_namespace/timer.golden b/lib/autoupdate/agent/testdata/TestWriteConfigFiles/test_namespace/timer.golden new file mode 100644 index 0000000000000..f57a3c08055bc --- /dev/null +++ b/lib/autoupdate/agent/testdata/TestWriteConfigFiles/test_namespace/timer.golden @@ -0,0 +1,12 @@ +# teleport-update +# DO NOT EDIT THIS FILE +[Unit] +Description=Teleport auto-update timer unit + +[Timer] +OnActiveSec=1m +OnUnitActiveSec=5m +RandomizedDelaySec=1m + +[Install] +WantedBy=teleport_test.service diff --git a/lib/autoupdate/agent/updater.go b/lib/autoupdate/agent/updater.go index 9c79a49d85967..b77d33dac7b9b 100644 --- a/lib/autoupdate/agent/updater.go +++ b/lib/autoupdate/agent/updater.go @@ -43,16 +43,14 @@ import ( const ( // DefaultLinkDir is the default location where Teleport is linked. - DefaultLinkDir = "/usr/local" - // DefaultSystemDir is the location where packaged Teleport binaries and services are installed. - DefaultSystemDir = "/usr/local/teleport-system" - // VersionsDirName specifies the name of the subdirectory inside the Teleport data dir for storing Teleport versions. - VersionsDirName = "versions" + DefaultLinkDir = "/usr/local/bin" // BinaryName specifies the name of the updater binary. BinaryName = "teleport-update" ) const ( + // defaultSystemDir is the location where packaged Teleport binaries and services are installed. + defaultSystemDir = "/opt/teleport/system" // cdnURITemplate is the default template for the Teleport tgz download. cdnURITemplate = "https://cdn.teleport.dev/teleport{{if .Enterprise}}-ent{{end}}-v{{.Version}}-{{.OS}}-{{.Arch}}{{if .FIPS}}-fips{{end}}-bin.tar.gz" // reservedFreeDisk is the minimum required free space left on disk during downloads. @@ -63,17 +61,17 @@ const ( // Log keys const ( - targetVersionKey = "target_version" - activeVersionKey = "active_version" - backupVersionKey = "backup_version" - errorKey = "error" + targetKey = "target_version" + activeKey = "active_version" + backupKey = "backup_version" + errorKey = "error" ) // NewLocalUpdater returns a new Updater that auto-updates local // installations of the Teleport agent. // The AutoUpdater uses an HTTP client with sane defaults for downloads, and // will not fill disk to within 10 MB of available capacity. -func NewLocalUpdater(cfg LocalUpdaterConfig) (*Updater, error) { +func NewLocalUpdater(cfg LocalUpdaterConfig, ns *Namespace) (*Updater, error) { certPool, err := x509.SystemCertPool() if err != nil { return nil, trace.Wrap(err) @@ -93,50 +91,40 @@ func NewLocalUpdater(cfg LocalUpdaterConfig) (*Updater, error) { if cfg.Log == nil { cfg.Log = slog.Default() } - if cfg.LinkDir == "" { - cfg.LinkDir = DefaultLinkDir - } if cfg.SystemDir == "" { - cfg.SystemDir = DefaultSystemDir - } - if cfg.DataDir == "" { - cfg.DataDir = libdefaults.DataDir - } - installDir := filepath.Join(cfg.DataDir, VersionsDirName) - if err := os.MkdirAll(installDir, systemDirMode); err != nil { - return nil, trace.Errorf("failed to create install directory: %w", err) + cfg.SystemDir = defaultSystemDir } return &Updater{ Log: cfg.Log, Pool: certPool, InsecureSkipVerify: cfg.InsecureSkipVerify, - ConfigPath: filepath.Join(installDir, updateConfigName), + ConfigPath: ns.updaterConfigFile, Installer: &LocalInstaller{ - InstallDir: installDir, - LinkBinDir: filepath.Join(cfg.LinkDir, "bin"), - // For backwards-compatibility with symlinks created by package-based installs, we always - // link into /lib/systemd/system, even though, e.g., /usr/local/lib/systemd/system would work. - LinkServiceDir: filepath.Join("/", serviceDir), + InstallDir: ns.versionsDir, + LinkBinDir: ns.linkDir, + CopyServiceFile: ns.serviceFile, SystemBinDir: filepath.Join(cfg.SystemDir, "bin"), - SystemServiceDir: filepath.Join(cfg.SystemDir, serviceDir), + SystemServiceFile: filepath.Join(cfg.SystemDir, serviceDir, serviceName), HTTP: client, Log: cfg.Log, ReservedFreeTmpDisk: reservedFreeDisk, ReservedFreeInstallDisk: reservedFreeDisk, + TransformService: ns.replaceTeleportService, }, Process: &SystemdService{ - ServiceName: "teleport.service", - PIDPath: "/run/teleport.pid", + ServiceName: filepath.Base(ns.serviceFile), + PIDPath: ns.pidFile, Log: cfg.Log, }, Setup: func(ctx context.Context) error { - name := filepath.Join(cfg.LinkDir, "bin", BinaryName) + name := ns.updaterBinFile if cfg.SelfSetup && runtime.GOOS == constants.LinuxOS { name = "/proc/self/exe" } cmd := exec.CommandContext(ctx, name, - "--data-dir", cfg.DataDir, - "--link-dir", cfg.LinkDir, + "--data-dir", ns.dataDir, + "--link-dir", ns.linkDir, + "--install-suffix", ns.name, "setup") cmd.Stderr = os.Stderr cmd.Stdout = os.Stdout @@ -148,12 +136,8 @@ func NewLocalUpdater(cfg LocalUpdaterConfig) (*Updater, error) { } return trace.Wrap(err) }, - Revert: func(ctx context.Context) error { - return trace.Wrap(Setup(ctx, cfg.Log, cfg.LinkDir, cfg.DataDir)) - }, - Teardown: func(ctx context.Context) error { - return trace.Wrap(Teardown(ctx, cfg.Log, cfg.LinkDir, cfg.DataDir)) - }, + Revert: ns.Setup, + Teardown: ns.Teardown, }, nil } @@ -167,11 +151,7 @@ type LocalUpdaterConfig struct { // DownloadTimeout is a timeout for file download requests. // Defaults to no timeout. DownloadTimeout time.Duration - // DataDir for Teleport (usually /var/lib/teleport). - DataDir string - // LinkDir for installing Teleport (usually /usr/local). - LinkDir string - // SystemDir for package-installed Teleport installations (usually /usr/local/teleport-system). + // SystemDir for package-installed Teleport installations (usually /opt/teleport/system). SystemDir string // SelfSetup mode for using the current version of the teleport-update to setup the update service. SelfSetup bool @@ -201,37 +181,37 @@ type Updater struct { // Installer provides an API for installing Teleport agents. type Installer interface { - // Install the Teleport agent at version from the download template. + // Install the Teleport agent at revision from the download template. // Install must be idempotent. - Install(ctx context.Context, version, template string, flags InstallFlags) error - // Link the Teleport agent at the specified version of Teleport into the linking locations. + Install(ctx context.Context, rev Revision, template string) error + // Link the Teleport agent at the specified revision of Teleport into the linking locations. // The revert function must restore the previous linking, returning false on any failure. // Link must be idempotent. Link's revert function must be idempotent. - Link(ctx context.Context, version string) (revert func(context.Context) bool, err error) + Link(ctx context.Context, rev Revision) (revert func(context.Context) bool, err error) // LinkSystem links the system installation of Teleport into the linking locations. // The revert function must restore the previous linking, returning false on any failure. // LinkSystem must be idempotent. LinkSystem's revert function must be idempotent. LinkSystem(ctx context.Context) (revert func(context.Context) bool, err error) - // TryLink links the specified version of Teleport into the linking locations. + // TryLink links the specified revision of Teleport into the linking locations. // Unlike Link, TryLink will fail if existing links to other locations are present. // TryLink must be idempotent. - TryLink(ctx context.Context, version string) error + TryLink(ctx context.Context, rev Revision) error // TryLinkSystem links the system (package) installation of Teleport into the linking locations. // Unlike LinkSystem, TryLinkSystem will fail if existing links to other locations are present. // TryLinkSystem must be idempotent. TryLinkSystem(ctx context.Context) error - // Unlink unlinks the specified version of Teleport from the linking locations. + // Unlink unlinks the specified revision of Teleport from the linking locations. // Unlink must be idempotent. - Unlink(ctx context.Context, version string) error + Unlink(ctx context.Context, rev Revision) error // UnlinkSystem unlinks the system (package) installation of Teleport from the linking locations. // UnlinkSystem must be idempotent. UnlinkSystem(ctx context.Context) error - // List the installed versions of Teleport. - List(ctx context.Context) (versions []string, err error) - // Remove the Teleport agent at version. + // List the installed revisions of Teleport. + List(ctx context.Context) (revisions []Revision, err error) + // Remove the Teleport agent at revision. // Must return ErrLinked if unable to remove due to being linked. // Remove must be idempotent. - Remove(ctx context.Context, version string) error + Remove(ctx context.Context, rev Revision) error } var ( @@ -283,6 +263,18 @@ type OverrideConfig struct { ForceFlags InstallFlags } +func deref[T any](ptr *T) T { + if ptr != nil { + return *ptr + } + var t T + return t +} + +func toPtr[T any](t T) *T { + return &t +} + // Install attempts an initial installation of Teleport. // If the initial installation succeeds, the override configuration is persisted. // Otherwise, the configuration is not changed. @@ -291,14 +283,14 @@ func (u *Updater) Install(ctx context.Context, override OverrideConfig) error { // Read configuration from update.yaml and override any new values passed as flags. cfg, err := readConfig(u.ConfigPath) if err != nil { - return trace.Errorf("failed to read %s: %w", updateConfigName, err) + return trace.Wrap(err, "failed to read %s", updateConfigName) } if err := validateConfigSpec(&cfg.Spec, override); err != nil { return trace.Wrap(err) } - activeVersion := cfg.Status.ActiveVersion - skipVersion := cfg.Status.SkipVersion + active := cfg.Status.Active + skip := deref(cfg.Status.Skip) // Lookup target version from the proxy. @@ -306,34 +298,35 @@ func (u *Updater) Install(ctx context.Context, override OverrideConfig) error { if err != nil { return trace.Wrap(err) } - targetVersion := resp.TargetVersion - flags := resp.Flags - flags |= override.ForceFlags + targetVersion := resp.Target.Version + targetFlags := resp.Target.Flags + targetFlags |= override.ForceFlags if override.ForceVersion != "" { targetVersion = override.ForceVersion } + target := NewRevision(targetVersion, targetFlags) - switch targetVersion { + switch target.Version { case "": return trace.Errorf("agent version not available from Teleport cluster") - case skipVersion: - u.Log.WarnContext(ctx, "Target version was previously marked as broken. Retrying update.", targetVersionKey, targetVersion, activeVersionKey, activeVersion) + case skip.Version: + u.Log.WarnContext(ctx, "Target version was previously marked as broken. Retrying update.", targetKey, target, activeKey, active) default: - u.Log.InfoContext(ctx, "Initiating installation.", targetVersionKey, targetVersion, activeVersionKey, activeVersion) + u.Log.InfoContext(ctx, "Initiating installation.", targetKey, target, activeKey, active) } - if err := u.update(ctx, cfg, targetVersion, flags); err != nil { + if err := u.update(ctx, cfg, target); err != nil { return trace.Wrap(err) } - if targetVersion == cfg.Status.SkipVersion { - cfg.Status.SkipVersion = "" + if target.Version == skip.Version { + cfg.Status.Skip = nil } // Only write the configuration file if the initial update succeeds. // Note: skip_version is never set on failed enable, only failed update. if err := writeConfig(u.ConfigPath, cfg); err != nil { - return trace.Errorf("failed to write %s: %w", updateConfigName, err) + return trace.Wrap(err, "failed to write %s", updateConfigName) } u.Log.InfoContext(ctx, "Configuration updated.") return nil @@ -345,13 +338,13 @@ func (u *Updater) Install(ctx context.Context, override OverrideConfig) error { func (u *Updater) Remove(ctx context.Context) error { cfg, err := readConfig(u.ConfigPath) if err != nil { - return trace.Errorf("failed to read %s: %w", updateConfigName, err) + return trace.Wrap(err, "failed to read %s", updateConfigName) } if err := validateConfigSpec(&cfg.Spec, OverrideConfig{}); err != nil { return trace.Wrap(err) } - activeVersion := cfg.Status.ActiveVersion - if activeVersion == "" { + active := cfg.Status.Active + if active.Version == "" { u.Log.InfoContext(ctx, "No installation of Teleport managed by the updater. Removing updater configuration.") if err := u.Teardown(ctx); err != nil { return trace.Wrap(err) @@ -370,10 +363,10 @@ func (u *Updater) Remove(ctx context.Context) error { if ok { return trace.Errorf("refusing to remove active installation of Teleport, please disable Teleport first") } - if err := u.Installer.Unlink(ctx, activeVersion); err != nil { + if err := u.Installer.Unlink(ctx, active); err != nil { return trace.Wrap(err) } - u.Log.InfoContext(ctx, "Teleport uninstalled.", "version", activeVersion) + u.Log.InfoContext(ctx, "Teleport uninstalled.", "version", active) if err := u.Teardown(ctx); err != nil { return trace.Wrap(err) } @@ -381,7 +374,7 @@ func (u *Updater) Remove(ctx context.Context) error { return nil } if err != nil { - return trace.Errorf("failed to link: %w", err) + return trace.Wrap(err, "failed to link") } u.Log.InfoContext(ctx, "Updater-managed installation of Teleport detected. Restoring packaged version of Teleport before removing.") @@ -411,7 +404,7 @@ func (u *Updater) Remove(ctx context.Context) error { if ok := revertConfig(ctx); ok { u.Log.WarnContext(ctx, "Teleport updater encountered a configuration error and successfully reverted the installation.") } - return trace.Errorf("failed to validate configuration for system package version of Teleport: %w", err) + return trace.Wrap(err, "failed to validate configuration for system package version of Teleport") } // Restart Teleport. @@ -434,9 +427,9 @@ func (u *Updater) Remove(ctx context.Context) error { u.Log.WarnContext(ctx, "Teleport updater detected an error with the new installation and successfully reverted it.") } } - return trace.Errorf("failed to start system package version of Teleport: %w", err) + return trace.Wrap(err, "failed to start system package version of Teleport") } - u.Log.InfoContext(ctx, "Auto-updating Teleport removed and replaced by Teleport packaged.", "version", activeVersion) + u.Log.InfoContext(ctx, "Auto-updating Teleport removed and replaced by Teleport packaged.", "version", active) if err := u.Teardown(ctx); err != nil { return trace.Wrap(err) } @@ -450,7 +443,7 @@ func (u *Updater) Status(ctx context.Context) (Status, error) { // Read configuration from update.yaml. cfg, err := readConfig(u.ConfigPath) if err != nil { - return out, trace.Errorf("failed to read %s: %w", updateConfigName, err) + return out, trace.Wrap(err, "failed to read %s", updateConfigName) } if err := validateConfigSpec(&cfg.Spec, OverrideConfig{}); err != nil { return out, trace.Wrap(err) @@ -472,7 +465,7 @@ func (u *Updater) Status(ctx context.Context) (Status, error) { func (u *Updater) Disable(ctx context.Context) error { cfg, err := readConfig(u.ConfigPath) if err != nil { - return trace.Errorf("failed to read %s: %w", updateConfigName, err) + return trace.Wrap(err, "failed to read %s", updateConfigName) } if !cfg.Spec.Enabled { u.Log.InfoContext(ctx, "Automatic updates already disabled.") @@ -480,7 +473,7 @@ func (u *Updater) Disable(ctx context.Context) error { } cfg.Spec.Enabled = false if err := writeConfig(u.ConfigPath, cfg); err != nil { - return trace.Errorf("failed to write %s: %w", updateConfigName, err) + return trace.Wrap(err, "failed to write %s", updateConfigName) } return nil } @@ -490,15 +483,15 @@ func (u *Updater) Disable(ctx context.Context) error { func (u *Updater) Unpin(ctx context.Context) error { cfg, err := readConfig(u.ConfigPath) if err != nil { - return trace.Errorf("failed to read %s: %w", updateConfigName, err) + return trace.Wrap(err, "failed to read %s", updateConfigName) } if !cfg.Spec.Pinned { - u.Log.InfoContext(ctx, "Current version not pinned.", activeVersionKey, cfg.Status.ActiveVersion) + u.Log.InfoContext(ctx, "Current version not pinned.", activeKey, cfg.Status.Active) return nil } cfg.Spec.Pinned = false if err := writeConfig(u.ConfigPath, cfg); err != nil { - return trace.Errorf("failed to write %s: %w", updateConfigName, err) + return trace.Wrap(err, "failed to write %s", updateConfigName) } return nil } @@ -508,19 +501,19 @@ func (u *Updater) Unpin(ctx context.Context) error { // Otherwise, the auto-updates configuration is not changed. // Unlike Enable, Update will not validate or repair the current version. // This function is idempotent. -func (u *Updater) Update(ctx context.Context) error { +func (u *Updater) Update(ctx context.Context, now bool) error { // Read configuration from update.yaml and override any new values passed as flags. cfg, err := readConfig(u.ConfigPath) if err != nil { - return trace.Errorf("failed to read %s: %w", updateConfigName, err) + return trace.Wrap(err, "failed to read %s", updateConfigName) } if err := validateConfigSpec(&cfg.Spec, OverrideConfig{}); err != nil { return trace.Wrap(err) } - activeVersion := cfg.Status.ActiveVersion - skipVersion := cfg.Status.SkipVersion + active := cfg.Status.Active + skip := deref(cfg.Status.Skip) if !cfg.Spec.Enabled { - u.Log.InfoContext(ctx, "Automatic updates disabled.", activeVersionKey, activeVersion) + u.Log.InfoContext(ctx, "Automatic updates disabled.", activeKey, active) return nil } @@ -528,51 +521,62 @@ func (u *Updater) Update(ctx context.Context) error { if err != nil { return trace.Wrap(err) } - targetVersion := resp.TargetVersion + target := resp.Target if cfg.Spec.Pinned { - switch targetVersion { - case activeVersion: - u.Log.InfoContext(ctx, "Teleport is up-to-date. Installation is pinned to prevent future updates.", activeVersionKey, activeVersion) + switch target { + case active: + u.Log.InfoContext(ctx, "Teleport is up-to-date. Installation is pinned to prevent future updates.", activeKey, active) default: - u.Log.InfoContext(ctx, "Teleport version is pinned. Skipping update.", targetVersionKey, targetVersion, activeVersionKey, activeVersion) + u.Log.InfoContext(ctx, "Teleport version is pinned. Skipping update.", targetKey, target, activeKey, active) } return nil } - if !resp.InWindow { - switch targetVersion { - case "": + // If a version fails and is marked skip, we ignore any edition changes as well. + // If a cluster is broadcasting a version that failed to start, changing ent/fips is unlikely to fix the issue. + + if !resp.InWindow && !now { + switch { + case target.Version == "": u.Log.WarnContext(ctx, "Cannot determine target agent version. Waiting for both version and update window.") - case activeVersion: - u.Log.InfoContext(ctx, "Teleport is up-to-date. Update window is not active.", activeVersionKey, activeVersion) - case skipVersion: - u.Log.InfoContext(ctx, "Update available, but the new version is marked as broken. Update window is not active.", targetVersionKey, targetVersion, activeVersionKey, activeVersion) + case target == active: + u.Log.InfoContext(ctx, "Teleport is up-to-date. Update window is not active.", activeKey, active) + case target.Version == skip.Version: + u.Log.InfoContext(ctx, "Update available, but the new version is marked as broken. Update window is not active.", targetKey, target, activeKey, active) default: - u.Log.InfoContext(ctx, "Update available, but update window is not active.", targetVersionKey, targetVersion, activeVersionKey, activeVersion) + u.Log.InfoContext(ctx, "Update available, but update window is not active.", targetKey, target, activeKey, active) } return nil } - switch targetVersion { - case "": - u.Log.ErrorContext(ctx, "Update window is active, but target version is not available.", activeVersionKey, activeVersion) + switch { + case target.Version == "": + if resp.InWindow { + u.Log.ErrorContext(ctx, "Update window is active, but target version is not available.", activeKey, active) + } return trace.Errorf("target version missing") - case activeVersion: - u.Log.InfoContext(ctx, "Teleport is up-to-date. Update window is active, but no action is needed.", activeVersionKey, activeVersion) + case target == active: + if resp.InWindow { + u.Log.InfoContext(ctx, "Teleport is up-to-date. Update window is active, but no action is needed.", activeKey, active) + } else { + u.Log.InfoContext(ctx, "Teleport is up-to-date. No action is needed.", activeKey, active) + } return nil - case skipVersion: - u.Log.InfoContext(ctx, "Update available, but the new version is marked as broken. Skipping update during the update window.", targetVersionKey, targetVersion, activeVersionKey, activeVersion) + case target.Version == skip.Version: + u.Log.InfoContext(ctx, "Update available, but the new version is marked as broken. Skipping update.", targetKey, target, activeKey, active) return nil default: - u.Log.InfoContext(ctx, "Update available. Initiating update.", targetVersionKey, targetVersion, activeVersionKey, activeVersion) + u.Log.InfoContext(ctx, "Update available. Initiating update.", targetKey, target, activeKey, active) + } + if !now { + time.Sleep(resp.Jitter) } - time.Sleep(resp.Jitter) - updateErr := u.update(ctx, cfg, targetVersion, resp.Flags) + updateErr := u.update(ctx, cfg, target) writeErr := writeConfig(u.ConfigPath, cfg) if writeErr != nil { - writeErr = trace.Errorf("failed to write %s: %w", updateConfigName, writeErr) + writeErr = trace.Wrap(writeErr, "failed to write %s", updateConfigName) } else { u.Log.InfoContext(ctx, "Configuration updated.") } @@ -585,7 +589,7 @@ func (u *Updater) find(ctx context.Context, cfg *UpdateConfig) (FindResp, error) } addr, err := libutils.ParseAddr(cfg.Spec.Proxy) if err != nil { - return FindResp{}, trace.Errorf("failed to parse proxy server address: %w", err) + return FindResp{}, trace.Wrap(err, "failed to parse proxy server address") } resp, err := webclient.Find(&webclient.Config{ Context: ctx, @@ -596,7 +600,7 @@ func (u *Updater) find(ctx context.Context, cfg *UpdateConfig) (FindResp, error) Pool: u.Pool, }) if err != nil { - return FindResp{}, trace.Errorf("failed to request version from proxy: %w", err) + return FindResp{}, trace.Wrap(err, "failed to request version from proxy") } var flags InstallFlags switch resp.Edition { @@ -611,27 +615,26 @@ func (u *Updater) find(ctx context.Context, cfg *UpdateConfig) (FindResp, error) } jitterSec := resp.AutoUpdate.AgentUpdateJitterSeconds return FindResp{ - TargetVersion: resp.AutoUpdate.AgentVersion, - Flags: flags, - InWindow: resp.AutoUpdate.AgentAutoUpdate, - Jitter: time.Duration(jitterSec) * time.Second, + Target: NewRevision(resp.AutoUpdate.AgentVersion, flags), + InWindow: resp.AutoUpdate.AgentAutoUpdate, + Jitter: time.Duration(jitterSec) * time.Second, }, nil } -func (u *Updater) update(ctx context.Context, cfg *UpdateConfig, targetVersion string, flags InstallFlags) error { - activeVersion := cfg.Status.ActiveVersion - backupVersion := cfg.Status.BackupVersion - switch backupVersion { - case "", targetVersion, activeVersion: +func (u *Updater) update(ctx context.Context, cfg *UpdateConfig, target Revision) error { + active := cfg.Status.Active + backup := deref(cfg.Status.Backup) + switch backup { + case Revision{}, target, active: default: - if targetVersion == activeVersion { + if target == active { // Keep backup version if we are only verifying active version break } - err := u.Installer.Remove(ctx, backupVersion) + err := u.Installer.Remove(ctx, backup) if err != nil { // this could happen if it was already removed due to a failed installation - u.Log.WarnContext(ctx, "Failed to remove backup version of Teleport before new install.", errorKey, err, backupVersionKey, backupVersion) + u.Log.WarnContext(ctx, "Failed to remove backup version of Teleport before new install.", errorKey, err, backupKey, backup) } } @@ -641,9 +644,9 @@ func (u *Updater) update(ctx context.Context, cfg *UpdateConfig, targetVersion s if template == "" { template = cdnURITemplate } - err := u.Installer.Install(ctx, targetVersion, template, flags) + err := u.Installer.Install(ctx, target, template) if err != nil { - return trace.Errorf("failed to install: %w", err) + return trace.Wrap(err, "failed to install") } // If the target version has fewer binaries, this will leave old binaries linked. @@ -651,16 +654,18 @@ func (u *Updater) update(ctx context.Context, cfg *UpdateConfig, targetVersion s // Cleanup logic at the end of this function will ensure that they are removed // eventually. - revert, err := u.Installer.Link(ctx, targetVersion) + revert, err := u.Installer.Link(ctx, target) if err != nil { - return trace.Errorf("failed to link: %w", err) + return trace.Wrap(err, "failed to link") } // If we fail to revert after this point, the next update/enable will // fix the link to restore the active version. revertConfig := func(ctx context.Context) bool { - cfg.Status.SkipVersion = targetVersion + if target.Version != "" { + cfg.Status.Skip = toPtr(target) + } if ok := revert(ctx); !ok { u.Log.ErrorContext(ctx, "Failed to revert Teleport symlinks. Installation likely broken.") return false @@ -685,13 +690,13 @@ func (u *Updater) update(ctx context.Context, cfg *UpdateConfig, targetVersion s if ok := revertConfig(ctx); ok { u.Log.WarnContext(ctx, "Teleport updater encountered a configuration error and successfully reverted the installation.") } - return trace.Errorf("failed to validate configuration for new version %q of Teleport: %w", targetVersion, err) + return trace.Wrap(err, "failed to validate configuration for new version %s of Teleport", target) } // Restart Teleport if necessary. - if cfg.Status.ActiveVersion != targetVersion { - u.Log.InfoContext(ctx, "Target version successfully installed.", targetVersionKey, targetVersion) + if cfg.Status.Active != target { + u.Log.InfoContext(ctx, "Target version successfully installed.", targetKey, target) err = u.Process.Reload(ctx) if errors.Is(err, context.Canceled) { return trace.Errorf("reload canceled") @@ -709,37 +714,37 @@ func (u *Updater) update(ctx context.Context, cfg *UpdateConfig, targetVersion s u.Log.WarnContext(ctx, "Teleport updater detected an error with the new installation and successfully reverted it.") } } - return trace.Errorf("failed to start new version %q of Teleport: %w", targetVersion, err) + return trace.Wrap(err, "failed to start new version %s of Teleport", target) + } + if r := cfg.Status.Active; r.Version != "" { + cfg.Status.Backup = toPtr(r) } - cfg.Status.BackupVersion = cfg.Status.ActiveVersion - cfg.Status.ActiveVersion = targetVersion + cfg.Status.Active = target } else { - u.Log.InfoContext(ctx, "Target version successfully validated.", targetVersionKey, targetVersion) + u.Log.InfoContext(ctx, "Target version successfully validated.", targetKey, target) } - if v := cfg.Status.BackupVersion; v != "" { - u.Log.InfoContext(ctx, "Backup version set.", backupVersionKey, v) + if r := deref(cfg.Status.Backup); r.Version != "" { + u.Log.InfoContext(ctx, "Backup version set.", backupKey, r) } - return trace.Wrap(u.cleanup(ctx, []string{ - targetVersion, - activeVersion, - backupVersion, + return trace.Wrap(u.cleanup(ctx, []Revision{ + target, active, backup, })) } // cleanup orphan installations -func (u *Updater) cleanup(ctx context.Context, keep []string) error { - versions, err := u.Installer.List(ctx) +func (u *Updater) cleanup(ctx context.Context, keep []Revision) error { + revs, err := u.Installer.List(ctx) if err != nil { u.Log.ErrorContext(ctx, "Failed to read installed versions.", errorKey, err) return nil } - if len(versions) < 3 { + if len(revs) < 3 { return nil } - u.Log.WarnContext(ctx, "More than two versions of Teleport are installed. Removing unused versions.", "count", len(versions)) - for _, v := range versions { - if v == "" || slices.Contains(keep, v) { + u.Log.WarnContext(ctx, "More than two versions of Teleport are installed. Removing unused versions.", "count", len(revs)) + for _, v := range revs { + if v.Version == "" || slices.Contains(keep, v) { continue } err := u.Installer.Remove(ctx, v) @@ -763,33 +768,33 @@ func (u *Updater) cleanup(ctx context.Context, keep []string) error { func (u *Updater) LinkPackage(ctx context.Context) error { cfg, err := readConfig(u.ConfigPath) if err != nil { - return trace.Errorf("failed to read %s: %w", updateConfigName, err) + return trace.Wrap(err, "failed to read %s", updateConfigName) } if err := validateConfigSpec(&cfg.Spec, OverrideConfig{}); err != nil { return trace.Wrap(err) } - activeVersion := cfg.Status.ActiveVersion + active := cfg.Status.Active if cfg.Spec.Enabled { - u.Log.InfoContext(ctx, "Automatic updates is enabled. Skipping system package link.", activeVersionKey, activeVersion) + u.Log.InfoContext(ctx, "Automatic updates is enabled. Skipping system package link.", activeKey, active) return nil } if cfg.Spec.Pinned { - u.Log.InfoContext(ctx, "Automatic update version is pinned. Skipping system package link.", activeVersionKey, activeVersion) + u.Log.InfoContext(ctx, "Automatic update version is pinned. Skipping system package link.", activeKey, active) return nil } // If an active version is set, but auto-updates is disabled, try to link the system installation in case the config is stale. // If any links are present, this will return ErrLinked and not create any system links. // This state is important to log as a warning, if err := u.Installer.TryLinkSystem(ctx); errors.Is(err, ErrLinked) { - u.Log.WarnContext(ctx, "Automatic updates is disabled, but a non-package version of Teleport is linked.", activeVersionKey, activeVersion) + u.Log.WarnContext(ctx, "Automatic updates is disabled, but a non-package version of Teleport is linked.", activeKey, active) return nil } else if err != nil { - return trace.Errorf("failed to link system package installation: %w", err) + return trace.Wrap(err, "failed to link system package installation") } if err := u.Process.Sync(ctx); errors.Is(err, ErrNotSupported) { u.Log.WarnContext(ctx, "Systemd is not installed. Skipping sync.") } else if err != nil { - return trace.Errorf("failed to sync systemd configuration: %w", err) + return trace.Wrap(err, "failed to sync systemd configuration") } u.Log.InfoContext(ctx, "Successfully linked system package installation.") return nil @@ -799,12 +804,12 @@ func (u *Updater) LinkPackage(ctx context.Context) error { // This function is idempotent. func (u *Updater) UnlinkPackage(ctx context.Context) error { if err := u.Installer.UnlinkSystem(ctx); err != nil { - return trace.Errorf("failed to unlink system package installation: %w", err) + return trace.Wrap(err, "failed to unlink system package installation") } if err := u.Process.Sync(ctx); errors.Is(err, ErrNotSupported) { u.Log.WarnContext(ctx, "Systemd is not installed. Skipping sync.") } else if err != nil { - return trace.Errorf("failed to sync systemd configuration: %w", err) + return trace.Wrap(err, "failed to sync systemd configuration") } u.Log.InfoContext(ctx, "Successfully unlinked system package installation.") return nil diff --git a/lib/autoupdate/agent/updater_test.go b/lib/autoupdate/agent/updater_test.go index fb384cf737ca9..c52117ea44985 100644 --- a/lib/autoupdate/agent/updater_test.go +++ b/lib/autoupdate/agent/updater_test.go @@ -84,12 +84,14 @@ func TestUpdater_Disable(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { dir := t.TempDir() - cfgPath := filepath.Join(dir, VersionsDirName, "update.yaml") + cfgPath := filepath.Join(dir, updateConfigName) + ns := &Namespace{ + updaterConfigFile: cfgPath, + } updater, err := NewLocalUpdater(LocalUpdaterConfig{ InsecureSkipVerify: true, - DataDir: dir, - }) + }, ns) require.NoError(t, err) // Create config file only if provided in test case @@ -170,12 +172,14 @@ func TestUpdater_Unpin(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { dir := t.TempDir() - cfgPath := filepath.Join(dir, VersionsDirName, "update.yaml") + cfgPath := filepath.Join(dir, updateConfigName) + ns := &Namespace{ + updaterConfigFile: cfgPath, + } updater, err := NewLocalUpdater(LocalUpdaterConfig{ InsecureSkipVerify: true, - DataDir: dir, - }) + }, ns) require.NoError(t, err) // Create config file only if provided in test case @@ -219,14 +223,15 @@ func TestUpdater_Update(t *testing.T) { cfg *UpdateConfig // nil -> file not present flags InstallFlags inWindow bool + now bool installErr error setupErr error reloadErr error - removedVersions []string - installedVersion string + removedRevisions []Revision + installedRevision Revision installedTemplate string - linkedVersion string + linkedRevision Revision requestGroup string reloadCalls int revertCalls int @@ -244,15 +249,39 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "old-version", + Active: NewRevision("old-version", 0), }, }, inWindow: true, - removedVersions: []string{"unknown-version"}, - installedVersion: "16.3.0", + removedRevisions: []Revision{NewRevision("unknown-version", 0)}, + installedRevision: NewRevision("16.3.0", 0), installedTemplate: "https://example.com", - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), + requestGroup: "group", + reloadCalls: 1, + setupCalls: 1, + }, + { + name: "updates enabled now", + cfg: &UpdateConfig{ + Version: updateConfigVersion, + Kind: updateConfigKind, + Spec: UpdateSpec{ + Group: "group", + URLTemplate: "https://example.com", + Enabled: true, + }, + Status: UpdateStatus{ + Active: NewRevision("old-version", 0), + }, + }, + now: true, + + removedRevisions: []Revision{NewRevision("unknown-version", 0)}, + installedRevision: NewRevision("16.3.0", 0), + installedTemplate: "https://example.com", + linkedRevision: NewRevision("16.3.0", 0), requestGroup: "group", reloadCalls: 1, setupCalls: 1, @@ -268,7 +297,7 @@ func TestUpdater_Update(t *testing.T) { Enabled: false, }, Status: UpdateStatus{ - ActiveVersion: "old-version", + Active: NewRevision("old-version", 0), }, }, inWindow: true, @@ -284,7 +313,7 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "old-version", + Active: NewRevision("old-version", 0), }, }, requestGroup: "group", @@ -300,7 +329,7 @@ func TestUpdater_Update(t *testing.T) { Enabled: false, }, Status: UpdateStatus{ - ActiveVersion: "old-version", + Active: NewRevision("old-version", 0), }, }, }, @@ -330,7 +359,7 @@ func TestUpdater_Update(t *testing.T) { inWindow: true, installErr: errors.New("install error"), - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, errMatch: "install error", }, @@ -344,7 +373,7 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "16.3.0", + Active: NewRevision("16.3.0", 0), }, }, inWindow: true, @@ -359,7 +388,7 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "16.3.0", + Active: NewRevision("16.3.0", 0), }, }, }, @@ -373,18 +402,21 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "old-version", - BackupVersion: "backup-version", + Active: NewRevision("old-version", 0), + Backup: toPtr(NewRevision("backup-version", 0)), }, }, inWindow: true, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: "https://example.com", - linkedVersion: "16.3.0", - removedVersions: []string{"backup-version", "unknown-version"}, - reloadCalls: 1, - setupCalls: 1, + linkedRevision: NewRevision("16.3.0", 0), + removedRevisions: []Revision{ + NewRevision("backup-version", 0), + NewRevision("unknown-version", 0), + }, + reloadCalls: 1, + setupCalls: 1, }, { name: "backup version kept when no change", @@ -396,8 +428,8 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "16.3.0", - BackupVersion: "backup-version", + Active: NewRevision("16.3.0", 0), + Backup: toPtr(NewRevision("backup-version", 0)), }, }, inWindow: true, @@ -415,19 +447,22 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "old-version", - BackupVersion: "backup-version", + Active: NewRevision("old-version", FlagEnterprise|FlagFIPS), + Backup: toPtr(NewRevision("backup-version", FlagEnterprise|FlagFIPS)), }, }, inWindow: true, flags: FlagEnterprise | FlagFIPS, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", FlagEnterprise|FlagFIPS), installedTemplate: "https://example.com", - linkedVersion: "16.3.0", - removedVersions: []string{"backup-version", "unknown-version"}, - reloadCalls: 1, - setupCalls: 1, + linkedRevision: NewRevision("16.3.0", FlagEnterprise|FlagFIPS), + removedRevisions: []Revision{ + NewRevision("backup-version", FlagEnterprise|FlagFIPS), + NewRevision("unknown-version", 0), + }, + reloadCalls: 1, + setupCalls: 1, }, { name: "invalid metadata", @@ -444,21 +479,23 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "old-version", - BackupVersion: "backup-version", + Active: NewRevision("old-version", 0), + Backup: toPtr(NewRevision("backup-version", 0)), }, }, inWindow: true, setupErr: errors.New("setup error"), - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: "https://example.com", - linkedVersion: "16.3.0", - removedVersions: []string{"backup-version"}, - reloadCalls: 0, - revertCalls: 1, - setupCalls: 1, - errMatch: "setup error", + linkedRevision: NewRevision("16.3.0", 0), + removedRevisions: []Revision{ + NewRevision("backup-version", 0), + }, + reloadCalls: 0, + revertCalls: 1, + setupCalls: 1, + errMatch: "setup error", }, { name: "reload fails", @@ -470,21 +507,23 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "old-version", - BackupVersion: "backup-version", + Active: NewRevision("old-version", 0), + Backup: toPtr(NewRevision("backup-version", 0)), }, }, inWindow: true, reloadErr: errors.New("reload error"), - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: "https://example.com", - linkedVersion: "16.3.0", - removedVersions: []string{"backup-version"}, - reloadCalls: 2, - revertCalls: 1, - setupCalls: 1, - errMatch: "reload error", + linkedRevision: NewRevision("16.3.0", 0), + removedRevisions: []Revision{ + NewRevision("backup-version", 0), + }, + reloadCalls: 2, + revertCalls: 1, + setupCalls: 1, + errMatch: "reload error", }, { name: "skip version", @@ -496,9 +535,9 @@ func TestUpdater_Update(t *testing.T) { Enabled: true, }, Status: UpdateStatus{ - ActiveVersion: "old-version", - BackupVersion: "backup-version", - SkipVersion: "16.3.0", + Active: NewRevision("old-version", 0), + Backup: toPtr(NewRevision("backup-version", 0)), + Skip: toPtr(NewRevision("16.3.0", 0)), }, }, inWindow: true, @@ -514,8 +553,8 @@ func TestUpdater_Update(t *testing.T) { Pinned: true, }, Status: UpdateStatus{ - ActiveVersion: "old-version", - BackupVersion: "backup-version", + Active: NewRevision("old-version", 0), + Backup: toPtr(NewRevision("backup-version", 0)), }, }, inWindow: true, @@ -543,12 +582,14 @@ func TestUpdater_Update(t *testing.T) { t.Cleanup(server.Close) dir := t.TempDir() - cfgPath := filepath.Join(dir, VersionsDirName, "update.yaml") + cfgPath := filepath.Join(dir, updateConfigName) + ns := &Namespace{ + updaterConfigFile: cfgPath, + } updater, err := NewLocalUpdater(LocalUpdaterConfig{ InsecureSkipVerify: true, - DataDir: dir, - }) + }, ns) require.NoError(t, err) // Create config file only if provided in test case @@ -561,39 +602,37 @@ func TestUpdater_Update(t *testing.T) { } var ( - installedVersion string + installedRevision Revision installedTemplate string - linkedVersion string - removedVersions []string - installedFlags InstallFlags + linkedRevision Revision + removedRevisions []Revision revertFuncCalls int setupCalls int revertSetupCalls int reloadCalls int ) updater.Installer = &testInstaller{ - FuncInstall: func(_ context.Context, version, template string, flags InstallFlags) error { - installedVersion = version + FuncInstall: func(_ context.Context, rev Revision, template string) error { + installedRevision = rev installedTemplate = template - installedFlags = flags return tt.installErr }, - FuncLink: func(_ context.Context, version string) (revert func(context.Context) bool, err error) { - linkedVersion = version + FuncLink: func(_ context.Context, rev Revision) (revert func(context.Context) bool, err error) { + linkedRevision = rev return func(_ context.Context) bool { revertFuncCalls++ return true }, nil }, - FuncList: func(_ context.Context) (versions []string, err error) { - return slices.Compact([]string{ - installedVersion, - tt.cfg.Status.ActiveVersion, - "unknown-version", + FuncList: func(_ context.Context) (revs []Revision, err error) { + return slices.Compact([]Revision{ + installedRevision, + tt.cfg.Status.Active, + NewRevision("unknown-version", 0), }), nil }, - FuncRemove: func(_ context.Context, version string) error { - removedVersions = append(removedVersions, version) + FuncRemove: func(_ context.Context, rev Revision) error { + removedRevisions = append(removedRevisions, rev) return nil }, } @@ -613,18 +652,18 @@ func TestUpdater_Update(t *testing.T) { } ctx := context.Background() - err = updater.Update(ctx) + err = updater.Update(ctx, tt.now) if tt.errMatch != "" { require.Error(t, err) assert.Contains(t, err.Error(), tt.errMatch) } else { require.NoError(t, err) } - require.Equal(t, tt.installedVersion, installedVersion) + require.Equal(t, tt.installedRevision, installedRevision) require.Equal(t, tt.installedTemplate, installedTemplate) - require.Equal(t, tt.linkedVersion, linkedVersion) - require.Equal(t, tt.removedVersions, removedVersions) - require.Equal(t, tt.flags, installedFlags) + require.Equal(t, tt.linkedRevision, linkedRevision) + require.Equal(t, tt.removedRevisions, removedRevisions) + require.Equal(t, tt.flags, installedRevision.Flags) require.Equal(t, tt.requestGroup, requestedGroup) require.Equal(t, tt.reloadCalls, reloadCalls) require.Equal(t, tt.revertCalls, revertSetupCalls) @@ -759,12 +798,14 @@ func TestUpdater_LinkPackage(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { dir := t.TempDir() - cfgPath := filepath.Join(dir, VersionsDirName, "update.yaml") + cfgPath := filepath.Join(dir, updateConfigName) + ns := &Namespace{ + updaterConfigFile: cfgPath, + } updater, err := NewLocalUpdater(LocalUpdaterConfig{ InsecureSkipVerify: true, - DataDir: dir, - }) + }, ns) require.NoError(t, err) // Create config file only if provided in test case @@ -827,14 +868,7 @@ func TestUpdater_Remove(t *testing.T) { errMatch string }{ { - name: "no config", - cfg: &UpdateConfig{ - Version: updateConfigVersion, - Kind: updateConfigKind, - Status: UpdateStatus{ - ActiveVersion: "", - }, - }, + name: "no config", teardownCalls: 1, }, { @@ -851,7 +885,7 @@ func TestUpdater_Remove(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: version, + Active: NewRevision(version, 0), }, }, linkSystemErr: ErrNoBinaries, @@ -865,7 +899,7 @@ func TestUpdater_Remove(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: version, + Active: NewRevision(version, 0), }, }, linkSystemErr: ErrNoBinaries, @@ -879,7 +913,7 @@ func TestUpdater_Remove(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: version, + Active: NewRevision(version, 0), }, }, linkSystemErr: ErrNoBinaries, @@ -894,7 +928,7 @@ func TestUpdater_Remove(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: version, + Active: NewRevision(version, 0), }, }, linkSystemCalls: 1, @@ -908,7 +942,7 @@ func TestUpdater_Remove(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: version, + Active: NewRevision(version, 0), }, }, linkSystemCalls: 1, @@ -924,7 +958,7 @@ func TestUpdater_Remove(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: version, + Active: NewRevision(version, 0), }, }, linkSystemCalls: 1, @@ -939,7 +973,7 @@ func TestUpdater_Remove(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: version, + Active: NewRevision(version, 0), }, }, linkSystemCalls: 1, @@ -954,7 +988,7 @@ func TestUpdater_Remove(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: version, + Active: NewRevision(version, 0), }, }, linkSystemCalls: 1, @@ -969,12 +1003,14 @@ func TestUpdater_Remove(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { dir := t.TempDir() - cfgPath := filepath.Join(dir, VersionsDirName, "update.yaml") + cfgPath := filepath.Join(dir, updateConfigName) + ns := &Namespace{ + updaterConfigFile: cfgPath, + } updater, err := NewLocalUpdater(LocalUpdaterConfig{ InsecureSkipVerify: true, - DataDir: dir, - }) + }, ns) require.NoError(t, err) // Create config file only if provided in test case @@ -1001,8 +1037,8 @@ func TestUpdater_Remove(t *testing.T) { return true }, tt.linkSystemErr }, - FuncUnlink: func(_ context.Context, version string) error { - unlinkedVersion = version + FuncUnlink: func(_ context.Context, rev Revision) error { + unlinkedVersion = rev.Version return nil }, } @@ -1054,10 +1090,10 @@ func TestUpdater_Install(t *testing.T) { setupErr error reloadErr error - removedVersion string - installedVersion string + removedRevision Revision + installedRevision Revision installedTemplate string - linkedVersion string + linkedRevision Revision requestGroup string reloadCalls int revertCalls int @@ -1075,13 +1111,13 @@ func TestUpdater_Install(t *testing.T) { URLTemplate: "https://example.com", }, Status: UpdateStatus{ - ActiveVersion: "old-version", + Active: NewRevision("old-version", 0), }, }, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: "https://example.com", - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), requestGroup: "group", reloadCalls: 1, setupCalls: 1, @@ -1096,7 +1132,7 @@ func TestUpdater_Install(t *testing.T) { URLTemplate: "https://example.com/old", }, Status: UpdateStatus{ - ActiveVersion: "old-version", + Active: NewRevision("old-version", 0), }, }, userCfg: OverrideConfig{ @@ -1108,9 +1144,9 @@ func TestUpdater_Install(t *testing.T) { ForceVersion: "new-version", }, - installedVersion: "new-version", + installedRevision: NewRevision("new-version", 0), installedTemplate: "https://example.com/new", - linkedVersion: "new-version", + linkedRevision: NewRevision("new-version", 0), requestGroup: "new-group", reloadCalls: 1, setupCalls: 1, @@ -1121,13 +1157,13 @@ func TestUpdater_Install(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: "old-version", + Active: NewRevision("old-version", 0), }, }, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), reloadCalls: 1, setupCalls: 1, }, @@ -1137,14 +1173,14 @@ func TestUpdater_Install(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: "old-version", - SkipVersion: "16.3.0", + Active: NewRevision("old-version", 0), + Skip: toPtr(NewRevision("16.3.0", 0)), }, }, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), reloadCalls: 1, setupCalls: 1, }, @@ -1168,8 +1204,7 @@ func TestUpdater_Install(t *testing.T) { }, installErr: errors.New("install error"), - installedVersion: "16.3.0", - linkedVersion: "", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, errMatch: "install error", }, @@ -1179,13 +1214,13 @@ func TestUpdater_Install(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: "16.3.0", + Active: NewRevision("16.3.0", 0), }, }, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), reloadCalls: 0, setupCalls: 1, }, @@ -1195,15 +1230,15 @@ func TestUpdater_Install(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: "old-version", - BackupVersion: "backup-version", + Active: NewRevision("old-version", 0), + Backup: toPtr(NewRevision("backup-version", 0)), }, }, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", - removedVersion: "backup-version", + linkedRevision: NewRevision("16.3.0", 0), + removedRevision: NewRevision("backup-version", 0), reloadCalls: 1, setupCalls: 1, }, @@ -1213,33 +1248,32 @@ func TestUpdater_Install(t *testing.T) { Version: updateConfigVersion, Kind: updateConfigKind, Status: UpdateStatus{ - ActiveVersion: "16.3.0", - BackupVersion: "backup-version", + Active: NewRevision("16.3.0", 0), + Backup: toPtr(NewRevision("backup-version", 0)), }, }, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", - removedVersion: "", + linkedRevision: NewRevision("16.3.0", 0), reloadCalls: 0, setupCalls: 1, }, { name: "config does not exist", - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), reloadCalls: 1, setupCalls: 1, }, { name: "FIPS and Enterprise flags", flags: FlagEnterprise | FlagFIPS, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", FlagEnterprise|FlagFIPS), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", FlagEnterprise|FlagFIPS), reloadCalls: 1, setupCalls: 1, }, @@ -1252,9 +1286,9 @@ func TestUpdater_Install(t *testing.T) { name: "setup fails", setupErr: errors.New("setup error"), - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), reloadCalls: 0, revertCalls: 1, setupCalls: 1, @@ -1264,9 +1298,9 @@ func TestUpdater_Install(t *testing.T) { name: "reload fails", reloadErr: errors.New("reload error"), - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), reloadCalls: 2, revertCalls: 1, setupCalls: 1, @@ -1277,9 +1311,9 @@ func TestUpdater_Install(t *testing.T) { reloadErr: ErrNotSupported, setupErr: ErrNotSupported, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), reloadCalls: 1, setupCalls: 1, }, @@ -1287,9 +1321,9 @@ func TestUpdater_Install(t *testing.T) { name: "no need to reload", reloadErr: ErrNotNeeded, - installedVersion: "16.3.0", + installedRevision: NewRevision("16.3.0", 0), installedTemplate: cdnURITemplate, - linkedVersion: "16.3.0", + linkedRevision: NewRevision("16.3.0", 0), reloadCalls: 1, setupCalls: 1, }, @@ -1298,12 +1332,14 @@ func TestUpdater_Install(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { dir := t.TempDir() - cfgPath := filepath.Join(dir, VersionsDirName, "update.yaml") + cfgPath := filepath.Join(dir, updateConfigName) + ns := &Namespace{ + updaterConfigFile: cfgPath, + } updater, err := NewLocalUpdater(LocalUpdaterConfig{ InsecureSkipVerify: true, - DataDir: dir, - }) + }, ns) require.NoError(t, err) // Create config file only if provided in test case @@ -1336,35 +1372,33 @@ func TestUpdater_Install(t *testing.T) { } var ( - installedVersion string + installedRevision Revision installedTemplate string - linkedVersion string - removedVersion string - installedFlags InstallFlags + linkedRevision Revision + removedRevision Revision revertFuncCalls int reloadCalls int setupCalls int revertSetupCalls int ) updater.Installer = &testInstaller{ - FuncInstall: func(_ context.Context, version, template string, flags InstallFlags) error { - installedVersion = version + FuncInstall: func(_ context.Context, rev Revision, template string) error { + installedRevision = rev installedTemplate = template - installedFlags = flags return tt.installErr }, - FuncLink: func(_ context.Context, version string) (revert func(context.Context) bool, err error) { - linkedVersion = version + FuncLink: func(_ context.Context, rev Revision) (revert func(context.Context) bool, err error) { + linkedRevision = rev return func(_ context.Context) bool { revertFuncCalls++ return true }, nil }, - FuncList: func(_ context.Context) (versions []string, err error) { - return []string{}, nil + FuncList: func(_ context.Context) (revs []Revision, err error) { + return []Revision{}, nil }, - FuncRemove: func(_ context.Context, version string) error { - removedVersion = version + FuncRemove: func(_ context.Context, rev Revision) error { + removedRevision = rev return nil }, } @@ -1391,11 +1425,11 @@ func TestUpdater_Install(t *testing.T) { } else { require.NoError(t, err) } - require.Equal(t, tt.installedVersion, installedVersion) + require.Equal(t, tt.installedRevision, installedRevision) require.Equal(t, tt.installedTemplate, installedTemplate) - require.Equal(t, tt.linkedVersion, linkedVersion) - require.Equal(t, tt.removedVersion, removedVersion) - require.Equal(t, tt.flags, installedFlags) + require.Equal(t, tt.linkedRevision, linkedRevision) + require.Equal(t, tt.removedRevision, removedRevision) + require.Equal(t, tt.flags, installedRevision.Flags) require.Equal(t, tt.requestGroup, requestedGroup) require.Equal(t, tt.reloadCalls, reloadCalls) require.Equal(t, tt.revertCalls, revertSetupCalls) @@ -1427,50 +1461,50 @@ func blankTestAddr(s []byte) []byte { } type testInstaller struct { - FuncInstall func(ctx context.Context, version, template string, flags InstallFlags) error - FuncRemove func(ctx context.Context, version string) error - FuncLink func(ctx context.Context, version string) (revert func(context.Context) bool, err error) + FuncInstall func(ctx context.Context, rev Revision, template string) error + FuncRemove func(ctx context.Context, rev Revision) error + FuncLink func(ctx context.Context, rev Revision) (revert func(context.Context) bool, err error) FuncLinkSystem func(ctx context.Context) (revert func(context.Context) bool, err error) - FuncTryLink func(ctx context.Context, version string) error + FuncTryLink func(ctx context.Context, rev Revision) error FuncTryLinkSystem func(ctx context.Context) error - FuncUnlink func(ctx context.Context, version string) error + FuncUnlink func(ctx context.Context, rev Revision) error FuncUnlinkSystem func(ctx context.Context) error - FuncList func(ctx context.Context) (versions []string, err error) + FuncList func(ctx context.Context) (revs []Revision, err error) } -func (ti *testInstaller) Install(ctx context.Context, version, template string, flags InstallFlags) error { - return ti.FuncInstall(ctx, version, template, flags) +func (ti *testInstaller) Install(ctx context.Context, rev Revision, template string) error { + return ti.FuncInstall(ctx, rev, template) } -func (ti *testInstaller) Remove(ctx context.Context, version string) error { - return ti.FuncRemove(ctx, version) +func (ti *testInstaller) Remove(ctx context.Context, rev Revision) error { + return ti.FuncRemove(ctx, rev) } -func (ti *testInstaller) Link(ctx context.Context, version string) (revert func(context.Context) bool, err error) { - return ti.FuncLink(ctx, version) +func (ti *testInstaller) Link(ctx context.Context, rev Revision) (revert func(context.Context) bool, err error) { + return ti.FuncLink(ctx, rev) } func (ti *testInstaller) LinkSystem(ctx context.Context) (revert func(context.Context) bool, err error) { return ti.FuncLinkSystem(ctx) } -func (ti *testInstaller) TryLink(ctx context.Context, version string) error { - return ti.FuncTryLink(ctx, version) +func (ti *testInstaller) TryLink(ctx context.Context, rev Revision) error { + return ti.FuncTryLink(ctx, rev) } func (ti *testInstaller) TryLinkSystem(ctx context.Context) error { return ti.FuncTryLinkSystem(ctx) } -func (ti *testInstaller) Unlink(ctx context.Context, version string) error { - return ti.FuncUnlink(ctx, version) +func (ti *testInstaller) Unlink(ctx context.Context, rev Revision) error { + return ti.FuncUnlink(ctx, rev) } func (ti *testInstaller) UnlinkSystem(ctx context.Context) error { return ti.FuncUnlinkSystem(ctx) } -func (ti *testInstaller) List(ctx context.Context) (versions []string, err error) { +func (ti *testInstaller) List(ctx context.Context) (revs []Revision, err error) { return ti.FuncList(ctx) } diff --git a/lib/cache/cache.go b/lib/cache/cache.go index d0e8408e07d0b..fcb2a3bf7da5f 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -103,6 +103,7 @@ var highVolumeResources = map[string]struct{}{ types.KindWindowsDesktopService: {}, types.KindKubeServer: {}, types.KindDatabaseObject: {}, + types.KindGitServer: {}, } func isHighVolumeResource(kind string) bool { @@ -198,6 +199,8 @@ func ForAuth(cfg Config) Config { {Kind: types.KindIdentityCenterAccount}, {Kind: types.KindIdentityCenterPrincipalAssignment}, {Kind: types.KindIdentityCenterAccountAssignment}, + {Kind: types.KindPluginStaticCredentials}, + {Kind: types.KindGitServer}, } cfg.QueueSize = defaults.AuthQueueSize // We don't want to enable partial health for auth cache because auth uses an event stream @@ -255,6 +258,7 @@ func ForProxy(cfg Config) Config { {Kind: types.KindAutoUpdateVersion}, {Kind: types.KindAutoUpdateAgentRollout}, {Kind: types.KindUserTask}, + {Kind: types.KindGitServer}, } cfg.QueueSize = defaults.ProxyQueueSize return cfg @@ -550,6 +554,8 @@ type Cache struct { staticHostUsersCache *local.StaticHostUserService provisioningStatesCache *local.ProvisioningStateService identityCenterCache *local.IdentityCenterService + pluginStaticCredentialsCache *local.PluginStaticCredentialsService + gitServersCache *local.GitServerService // closed indicates that the cache has been closed closed atomic.Bool @@ -784,6 +790,10 @@ type Config struct { // IdentityCenter is the upstream Identity Center service that we're caching IdentityCenter services.IdentityCenter + // PluginStaticCredentials is the plugin static credentials services + PluginStaticCredentials services.PluginStaticCredentials + // GitServers is the Git server service. + GitServers services.GitServerGetter } // CheckAndSetDefaults checks parameters and sets default values @@ -1023,6 +1033,18 @@ func New(config Config) (*Cache, error) { return nil, trace.Wrap(err) } + pluginStaticCredentialsCache, err := local.NewPluginStaticCredentialsService(config.Backend) + if err != nil { + cancel() + return nil, trace.Wrap(err) + } + + gitServersCache, err := local.NewGitServerService(config.Backend) + if err != nil { + cancel() + return nil, trace.Wrap(err) + } + cs := &Cache{ ctx: ctx, cancel: cancel, @@ -1070,6 +1092,8 @@ func New(config Config) (*Cache, error) { staticHostUsersCache: staticHostUserCache, provisioningStatesCache: provisioningStatesCache, identityCenterCache: identityCenterCache, + pluginStaticCredentialsCache: pluginStaticCredentialsCache, + gitServersCache: gitServersCache, Logger: log.WithFields(log.Fields{ teleport.ComponentKey: config.Component, }), diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 2bfb56ae2916e..af4b4d195bce4 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -141,17 +141,20 @@ type testPack struct { autoUpdateService services.AutoUpdateService provisioningStates services.ProvisioningStates identityCenter services.IdentityCenter + pluginStaticCredentials *local.PluginStaticCredentialsService + gitServers services.GitServers } // testFuncs are functions to support testing an object in a cache. type testFuncs[T types.Resource] struct { - newResource func(string) (T, error) - create func(context.Context, T) error - list func(context.Context) ([]T, error) - cacheGet func(context.Context, string) (T, error) - cacheList func(context.Context) ([]T, error) - update func(context.Context, T) error - deleteAll func(context.Context) error + newResource func(string) (T, error) + create func(context.Context, T) error + list func(context.Context) ([]T, error) + cacheGet func(context.Context, string) (T, error) + cacheList func(context.Context) ([]T, error) + update func(context.Context, T) error + deleteAll func(context.Context) error + changeResource func(T) } // testFuncs153 are functions to support testing an RFD153-style resource in a cache. @@ -402,6 +405,16 @@ func newPackWithoutCache(dir string, opts ...packOption) (*testPack, error) { return nil, trace.Wrap(err) } + p.pluginStaticCredentials, err = local.NewPluginStaticCredentialsService(p.backend) + if err != nil { + return nil, trace.Wrap(err) + } + + p.gitServers, err = local.NewGitServerService(p.backend) + if err != nil { + return nil, trace.Wrap(err) + } + return p, nil } @@ -455,6 +468,8 @@ func newPack(dir string, setupConfig func(c Config) Config, opts ...packOption) AutoUpdateService: p.autoUpdateService, ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, + PluginStaticCredentials: p.pluginStaticCredentials, + GitServers: p.gitServers, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -868,7 +883,9 @@ func TestCompletenessInit(t *testing.T) { ProvisioningStates: p.provisioningStates, MaxRetryPeriod: 200 * time.Millisecond, IdentityCenter: p.identityCenter, + PluginStaticCredentials: p.pluginStaticCredentials, EventsC: p.eventsC, + GitServers: p.gitServers, })) require.NoError(t, err) @@ -951,8 +968,10 @@ func TestCompletenessReset(t *testing.T) { AutoUpdateService: p.autoUpdateService, ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, + PluginStaticCredentials: p.pluginStaticCredentials, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, + GitServers: p.gitServers, })) require.NoError(t, err) @@ -1161,9 +1180,11 @@ func TestListResources_NodesTTLVariant(t *testing.T) { AutoUpdateService: p.autoUpdateService, ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, + PluginStaticCredentials: p.pluginStaticCredentials, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, neverOK: true, // ensure reads are never healthy + GitServers: p.gitServers, })) require.NoError(t, err) @@ -1256,8 +1277,10 @@ func initStrategy(t *testing.T) { AutoUpdateService: p.autoUpdateService, ProvisioningStates: p.provisioningStates, IdentityCenter: p.identityCenter, + PluginStaticCredentials: p.pluginStaticCredentials, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, + GitServers: p.gitServers, })) require.NoError(t, err) @@ -2926,10 +2949,20 @@ func TestStaticHostUsers(t *testing.T) { func testResources[T types.Resource](t *testing.T, p *testPack, funcs testFuncs[T]) { ctx := context.Background() + if funcs.changeResource == nil { + funcs.changeResource = func(t T) { + if t.Expiry().IsZero() { + t.SetExpiry(time.Now().Add(30 * time.Minute)) + } else { + t.SetExpiry(t.Expiry().Add(30 * time.Minute)) + } + } + } + // Create a resource. r, err := funcs.newResource("test-sp") require.NoError(t, err) - r.SetExpiry(time.Now().Add(30 * time.Minute)) + funcs.changeResource(r) err = funcs.create(ctx, r) require.NoError(t, err) @@ -2963,7 +2996,7 @@ func testResources[T types.Resource](t *testing.T, p *testPack, funcs testFuncs[ // update is optional as not every resource implements it if funcs.update != nil { // Update the resource and upsert it into the backend again. - r.SetExpiry(r.Expiry().Add(30 * time.Minute)) + funcs.changeResource(r) err = funcs.update(ctx, r) require.NoError(t, err) } @@ -3521,6 +3554,8 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { types.KindIdentityCenterAccount: types.Resource153ToLegacy(newIdentityCenterAccount("some_account")), types.KindIdentityCenterAccountAssignment: types.Resource153ToLegacy(newIdentityCenterAccountAssignment("some_account_assignment")), types.KindIdentityCenterPrincipalAssignment: types.Resource153ToLegacy(newIdentityCenterPrincipalAssignment("some_principal_assignment")), + types.KindPluginStaticCredentials: &types.PluginStaticCredentialsV1{}, + types.KindGitServer: &types.ServerV2{}, } for name, cfg := range cases { diff --git a/lib/cache/collections.go b/lib/cache/collections.go index c6aa7c73898a3..2635a0d71ea04 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -176,6 +176,8 @@ type cacheCollections struct { identityCenterAccounts collectionReader[identityCenterAccountGetter] identityCenterPrincipalAssignments collectionReader[identityCenterPrincipalAssignmentGetter] identityCenterAccountAssignments collectionReader[identityCenterAccountAssignmentGetter] + pluginStaticCredentials collectionReader[pluginStaticCredentialsGetter] + gitServers collectionReader[services.GitServerGetter] } // setupCollections returns a registry of collections. @@ -784,6 +786,33 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e } collections.byKind[resourceKind] = collections.identityCenterAccountAssignments + case types.KindPluginStaticCredentials: + if c.PluginStaticCredentials == nil { + return nil, trace.BadParameter("missing parameter PluginStaticCredentials") + } + collections.pluginStaticCredentials = &genericCollection[ + types.PluginStaticCredentials, + pluginStaticCredentialsGetter, + pluginStaticCredentialsExecutor, + ]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.pluginStaticCredentials + + case types.KindGitServer: + if c.GitServers == nil { + return nil, trace.BadParameter("missing parameter GitServers") + } + collections.gitServers = &genericCollection[ + types.Server, + services.GitServerGetter, + gitServerExecutor, + ]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.gitServers default: return nil, trace.BadParameter("resource %q is not supported", watch.Kind) } diff --git a/lib/cache/git_server.go b/lib/cache/git_server.go new file mode 100644 index 0000000000000..849a160757eee --- /dev/null +++ b/lib/cache/git_server.go @@ -0,0 +1,95 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package cache + +import ( + "context" + + "github.com/gravitational/trace" + + apidefaults "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/services" +) + +func (c *Cache) GetGitServer(ctx context.Context, name string) (types.Server, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetGitServer") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.gitServers) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + return rg.reader.GetGitServer(ctx, name) +} + +func (c *Cache) ListGitServers(ctx context.Context, pageSize int, pageToken string) ([]types.Server, string, error) { + ctx, span := c.Tracer.Start(ctx, "cache/ListGitServers") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.gitServers) + if err != nil { + return nil, "", trace.Wrap(err) + } + defer rg.Release() + return rg.reader.ListGitServers(ctx, pageSize, pageToken) +} + +type gitServerExecutor struct{} + +func (gitServerExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) (all []types.Server, err error) { + var page []types.Server + var nextToken string + for { + page, nextToken, err = cache.GitServers.ListGitServers(ctx, apidefaults.DefaultChunkSize, nextToken) + if err != nil { + return nil, trace.Wrap(err) + } + all = append(all, page...) + if nextToken == "" { + break + } + } + return all, nil +} + +func (gitServerExecutor) upsert(ctx context.Context, cache *Cache, resource types.Server) error { + _, err := cache.gitServersCache.UpsertGitServer(ctx, resource) + return trace.Wrap(err) +} + +func (gitServerExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.gitServersCache.DeleteAllGitServers(ctx) +} + +func (gitServerExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.gitServersCache.DeleteGitServer(ctx, resource.GetName()) +} + +func (gitServerExecutor) isSingleton() bool { return false } + +func (gitServerExecutor) getReader(cache *Cache, cacheOK bool) services.GitServerGetter { + if cacheOK { + return cache.gitServersCache + } + return cache.Config.GitServers +} + +var _ executor[types.Server, services.GitServerGetter] = gitServerExecutor{} diff --git a/lib/cache/git_server_test.go b/lib/cache/git_server_test.go new file mode 100644 index 0000000000000..35ce40941a53b --- /dev/null +++ b/lib/cache/git_server_test.go @@ -0,0 +1,65 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package cache + +import ( + "context" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" +) + +func TestGitServers(t *testing.T) { + t.Parallel() + + p, err := newPack(t.TempDir(), ForAuth) + require.NoError(t, err) + t.Cleanup(p.Close) + + testResources(t, p, testFuncs[types.Server]{ + newResource: func(name string) (types.Server, error) { + return types.NewGitHubServer( + types.GitHubServerMetadata{ + Integration: name, + Organization: name, + }) + }, + create: func(ctx context.Context, server types.Server) error { + _, err := p.gitServers.CreateGitServer(ctx, server) + return trace.Wrap(err) + }, + list: func(ctx context.Context) ([]types.Server, error) { + servers, _, err := p.gitServers.ListGitServers(ctx, 0, "") + return servers, trace.Wrap(err) + }, + update: func(ctx context.Context, server types.Server) error { + _, err := p.gitServers.UpdateGitServer(ctx, server) + return trace.Wrap(err) + }, + deleteAll: p.gitServers.DeleteAllGitServers, + cacheList: func(ctx context.Context) ([]types.Server, error) { + servers, _, err := p.cache.ListGitServers(ctx, 0, "") + return servers, trace.Wrap(err) + }, + cacheGet: p.cache.GetGitServer, + }) +} diff --git a/lib/cache/plugin_static_credentials.go b/lib/cache/plugin_static_credentials.go new file mode 100644 index 0000000000000..a756eb419ce35 --- /dev/null +++ b/lib/cache/plugin_static_credentials.go @@ -0,0 +1,84 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cache + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" +) + +func (c *Cache) GetPluginStaticCredentials(ctx context.Context, name string) (types.PluginStaticCredentials, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetPluginStaticCredentials") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.pluginStaticCredentials) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + return rg.reader.GetPluginStaticCredentials(ctx, name) +} + +func (c *Cache) GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetPluginStaticCredentialsByLabels") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.pluginStaticCredentials) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + return rg.reader.GetPluginStaticCredentialsByLabels(ctx, labels) +} + +type pluginStaticCredentialsGetter interface { + GetPluginStaticCredentials(ctx context.Context, name string) (types.PluginStaticCredentials, error) + GetPluginStaticCredentialsByLabels(ctx context.Context, labels map[string]string) ([]types.PluginStaticCredentials, error) +} + +var _ executor[types.PluginStaticCredentials, pluginStaticCredentialsGetter] = pluginStaticCredentialsExecutor{} + +type pluginStaticCredentialsExecutor struct{} + +func (pluginStaticCredentialsExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]types.PluginStaticCredentials, error) { + return cache.PluginStaticCredentials.GetAllPluginStaticCredentials(ctx) +} + +func (pluginStaticCredentialsExecutor) upsert(ctx context.Context, cache *Cache, resource types.PluginStaticCredentials) error { + _, err := cache.pluginStaticCredentialsCache.UpsertPluginStaticCredentials(ctx, resource) + return trace.Wrap(err) +} + +func (pluginStaticCredentialsExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.pluginStaticCredentialsCache.DeleteAllPluginStaticCredentials(ctx) +} + +func (pluginStaticCredentialsExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.pluginStaticCredentialsCache.DeletePluginStaticCredentials(ctx, resource.GetName()) +} + +func (pluginStaticCredentialsExecutor) isSingleton() bool { return false } + +func (pluginStaticCredentialsExecutor) getReader(cache *Cache, cacheOK bool) pluginStaticCredentialsGetter { + if cacheOK { + return cache.pluginStaticCredentialsCache + } + return cache.Config.PluginStaticCredentials +} diff --git a/lib/cache/plugin_static_credentials_test.go b/lib/cache/plugin_static_credentials_test.go new file mode 100644 index 0000000000000..c7b05119d092d --- /dev/null +++ b/lib/cache/plugin_static_credentials_test.go @@ -0,0 +1,104 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cache + +import ( + "context" + "testing" + "time" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" +) + +func TestPluginStaticCredentials(t *testing.T) { + t.Parallel() + + p, err := newPack(t.TempDir(), ForAuth) + require.NoError(t, err) + t.Cleanup(p.Close) + + makeLabels := func(name string) map[string]string { + return map[string]string{ + "resource-label": "label-for-" + name, + } + } + + cacheGets := []struct { + name string + fn func(context.Context, string) (types.PluginStaticCredentials, error) + }{ + { + name: "GetPluginStaticCredentials", + fn: p.cache.GetPluginStaticCredentials, + }, + { + name: "GetPluginStaticCredentialsByLabels", + fn: func(ctx context.Context, name string) (types.PluginStaticCredentials, error) { + creds, err := p.cache.GetPluginStaticCredentialsByLabels(ctx, makeLabels(name)) + if err != nil { + return nil, trace.Wrap(err) + } + if len(creds) != 1 { + return nil, trace.CompareFailed("expecting one creds for this test but got %v", len(creds)) + } + return creds[0], nil + }, + }, + } + + for _, cacheGet := range cacheGets { + t.Run(cacheGet.name, func(t *testing.T) { + // Empty backend before the test. + err := p.pluginStaticCredentials.DeleteAllPluginStaticCredentials(context.Background()) + require.NoError(t, err) + + testResources(t, p, testFuncs[types.PluginStaticCredentials]{ + newResource: func(name string) (types.PluginStaticCredentials, error) { + return types.NewPluginStaticCredentials( + types.Metadata{ + Name: name, + Labels: makeLabels(name), + }, + types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_APIToken{ + APIToken: "some-token", + }, + }) + }, + create: p.pluginStaticCredentials.CreatePluginStaticCredentials, + list: p.pluginStaticCredentials.GetAllPluginStaticCredentials, + update: func(ctx context.Context, cred types.PluginStaticCredentials) error { + _, err := p.pluginStaticCredentials.UpdatePluginStaticCredentials(ctx, cred) + return err + }, + deleteAll: p.pluginStaticCredentials.DeleteAllPluginStaticCredentials, + cacheList: p.cache.pluginStaticCredentialsCache.GetAllPluginStaticCredentials, + cacheGet: cacheGet.fn, + changeResource: func(cred types.PluginStaticCredentials) { + // types.PluginStaticCredentials does not support Expires. Let's + // use labels. + labels := cred.GetStaticLabels() + labels["now"] = time.Now().String() + cred.SetStaticLabels(labels) + }, + }) + }) + } +} diff --git a/lib/client/ca_export.go b/lib/client/ca_export.go index d8f648819e4b8..6a1aefddb058d 100644 --- a/lib/client/ca_export.go +++ b/lib/client/ca_export.go @@ -22,12 +22,15 @@ import ( "context" "encoding/pem" "errors" + "fmt" + "log/slog" "strings" "time" "github.com/gravitational/trace" apidefaults "github.com/gravitational/teleport/api/defaults" + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/auth/authclient" @@ -49,6 +52,23 @@ type ExportAuthoritiesRequest struct { AuthType string ExportAuthorityFingerprint string UseCompatVersion bool + Integration string +} + +func (r *ExportAuthoritiesRequest) shouldExportIntegration(ctx context.Context) (bool, error) { + switch r.AuthType { + case "github": + if r.Integration == "" { + return false, trace.BadParameter("integration name must be provided for %q CAs", r.AuthType) + } + return true, nil + default: + if r.Integration != "" { + r.Integration = "" + slog.DebugContext(ctx, "Integration name is ignored for non-integration CAs") + } + return false, nil + } } // ExportAuthorities returns the list of authorities in OpenSSH compatible formats as a string. @@ -76,12 +96,22 @@ type ExportAuthoritiesRequest struct { // > @cert-authority *.cluster-a ssh-rsa AAA... type=host // URL encoding is used to pass the CA type and allowed logins into the comment field. func ExportAuthorities(ctx context.Context, client authclient.ClientI, req ExportAuthoritiesRequest) (string, error) { + if isIntegration, err := req.shouldExportIntegration(ctx); err != nil { + return "", trace.Wrap(err) + } else if isIntegration { + return exportAuthForIntegration(ctx, client, req) + } return exportAuth(ctx, client, req, false /* exportSecrets */) } // ExportAuthoritiesSecrets exports the Authority Certificate secrets (private keys). // See ExportAuthorities for more information. func ExportAuthoritiesSecrets(ctx context.Context, client authclient.ClientI, req ExportAuthoritiesRequest) (string, error) { + if isIntegration, err := req.shouldExportIntegration(ctx); err != nil { + return "", trace.Wrap(err) + } else if isIntegration { + return "", trace.NotImplemented("export with secrets is not supported for %q CAs", req.AuthType) + } return exportAuth(ctx, client, req, true /* exportSecrets */) } @@ -344,3 +374,49 @@ func hostCAFormat(ca types.CertAuthority, keyBytes []byte, client authclient.Cli }, }) } + +func exportAuthForIntegration(ctx context.Context, client authclient.ClientI, req ExportAuthoritiesRequest) (string, error) { + switch req.AuthType { + case "github": + keySet, err := fetchIntegrationCAKeySet(ctx, client, req.Integration) + if err != nil { + return "", trace.Wrap(err) + } + ret, err := exportGitHubCAs(keySet, req) + if err != nil { + return "", trace.Wrap(err) + } + return ret, nil + + default: + return "", trace.BadParameter("unknown integration CA type %q", req.AuthType) + } +} + +func fetchIntegrationCAKeySet(ctx context.Context, client authclient.ClientI, integration string) (*types.CAKeySet, error) { + resp, err := client.IntegrationsClient().ExportIntegrationCertAuthorities(ctx, &integrationpb.ExportIntegrationCertAuthoritiesRequest{ + Integration: integration, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp.CertAuthorities, nil +} + +func exportGitHubCAs(keySet *types.CAKeySet, req ExportAuthoritiesRequest) (string, error) { + ret := strings.Builder{} + for _, key := range keySet.SSH { + if req.ExportAuthorityFingerprint != "" { + if fingerprint, err := sshutils.AuthorizedKeyFingerprint(key.PublicKey); err != nil { + return "", trace.Wrap(err) + } else if !sshutils.EqualFingerprints(req.ExportAuthorityFingerprint, fingerprint) { + continue + } + } + + // GitHub only needs the keys like "ssh-rsa xxx" so print them without + // cert-authority for easier copy-and-paste. + ret.WriteString(fmt.Sprintf("%s integration=%s\n", strings.TrimSpace(string(key.PublicKey)), req.Integration)) + } + return ret.String(), nil +} diff --git a/lib/client/ca_export_test.go b/lib/client/ca_export_test.go index 32082427ee523..cf7ff693716fe 100644 --- a/lib/client/ca_export_test.go +++ b/lib/client/ca_export_test.go @@ -26,18 +26,22 @@ import ( "testing" "github.com/stretchr/testify/require" + "google.golang.org/grpc" "github.com/gravitational/teleport/api/client/proto" + integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/fixtures" ) type mockAuthClient struct { authclient.ClientI - server *auth.Server + server *auth.Server + integrationsClient mockIntegrationsClient } func (m *mockAuthClient) GetDomainName(ctx context.Context) (string, error) { @@ -57,6 +61,21 @@ func (m *mockAuthClient) PerformMFACeremony(ctx context.Context, challengeReques return nil, &mfa.ErrMFANotRequired } +func (m *mockAuthClient) IntegrationsClient() integrationpb.IntegrationServiceClient { + return &m.integrationsClient +} + +type mockIntegrationsClient struct { + integrationpb.IntegrationServiceClient + caKeySet *types.CAKeySet +} + +func (m *mockIntegrationsClient) ExportIntegrationCertAuthorities(ctx context.Context, in *integrationpb.ExportIntegrationCertAuthoritiesRequest, opts ...grpc.CallOption) (*integrationpb.ExportIntegrationCertAuthoritiesResponse, error) { + return &integrationpb.ExportIntegrationCertAuthoritiesResponse{ + CertAuthorities: m.caKeySet, + }, nil +} + func TestExportAuthorities(t *testing.T) { ctx := context.Background() const localClusterName = "localcluster" @@ -100,6 +119,10 @@ func TestExportAuthorities(t *testing.T) { require.NotNil(t, privKey, "x509.ParsePKCS8PrivateKey returned a nil key") } + validateGitHubCAFunc := func(t *testing.T, s string) { + require.Contains(t, s, fixtures.SSHCAPublicKey) + } + for _, exportSecrets := range []bool{false, true} { for _, tt := range []struct { name string @@ -247,10 +270,33 @@ func TestExportAuthorities(t *testing.T) { assertNoSecrets: validateTLSCertificateDERFunc, assertSecrets: validateRSAPrivateKeyDERFunc, }, + { + name: "github missing integration", + req: ExportAuthoritiesRequest{ + AuthType: "github", + }, + errorCheck: require.Error, + }, + { + name: "github", + req: ExportAuthoritiesRequest{ + AuthType: "github", + Integration: "my-github", + }, + errorCheck: require.NoError, + assertNoSecrets: validateGitHubCAFunc, + }, } { t.Run(fmt.Sprintf("%s_exportSecrets_%v", tt.name, exportSecrets), func(t *testing.T) { mockedClient := &mockAuthClient{ server: testAuth.AuthServer, + integrationsClient: mockIntegrationsClient{ + caKeySet: &types.CAKeySet{ + SSH: []*types.SSHKeyPair{{ + PublicKey: []byte(fixtures.SSHCAPublicKey), + }}, + }, + }, } var ( err error @@ -264,6 +310,10 @@ func TestExportAuthorities(t *testing.T) { checkFunc = tt.assertSecrets } + if checkFunc == nil { + t.Skip("assert func not provided") + } + exported, err = exportFunc(ctx, mockedClient, tt.req) tt.errorCheck(t, err) diff --git a/lib/cloud/clients.go b/lib/cloud/clients.go index 328ee76bcee0e..3cce15285593a 100644 --- a/lib/cloud/clients.go +++ b/lib/cloud/clients.go @@ -60,8 +60,6 @@ import ( "github.com/aws/aws-sdk-go/service/s3/s3iface" "github.com/aws/aws-sdk-go/service/secretsmanager" "github.com/aws/aws-sdk-go/service/secretsmanager/secretsmanageriface" - "github.com/aws/aws-sdk-go/service/ssm" - "github.com/aws/aws-sdk-go/service/ssm/ssmiface" "github.com/aws/aws-sdk-go/service/sts" "github.com/aws/aws-sdk-go/service/sts/stsiface" "github.com/gravitational/trace" @@ -133,8 +131,6 @@ type AWSClients interface { GetAWSIAMClient(ctx context.Context, region string, opts ...AWSOptionsFn) (iamiface.IAMAPI, error) // GetAWSSTSClient returns AWS STS client for the specified region. GetAWSSTSClient(ctx context.Context, region string, opts ...AWSOptionsFn) (stsiface.STSAPI, error) - // GetAWSSSMClient returns AWS SSM client for the specified region. - GetAWSSSMClient(ctx context.Context, region string, opts ...AWSOptionsFn) (ssmiface.SSMAPI, error) // GetAWSEKSClient returns AWS EKS client for the specified region. GetAWSEKSClient(ctx context.Context, region string, opts ...AWSOptionsFn) (eksiface.EKSAPI, error) // GetAWSKMSClient returns AWS KMS client for the specified region. @@ -592,15 +588,6 @@ func (c *cloudClients) GetAWSSTSClient(ctx context.Context, region string, opts return sts.New(session), nil } -// GetAWSSSMClient returns AWS SSM client for the specified region. -func (c *cloudClients) GetAWSSSMClient(ctx context.Context, region string, opts ...AWSOptionsFn) (ssmiface.SSMAPI, error) { - session, err := c.GetAWSSession(ctx, region, opts...) - if err != nil { - return nil, trace.Wrap(err) - } - return ssm.New(session), nil -} - // GetAWSEKSClient returns AWS EKS client for the specified region. func (c *cloudClients) GetAWSEKSClient(ctx context.Context, region string, opts ...AWSOptionsFn) (eksiface.EKSAPI, error) { session, err := c.GetAWSSession(ctx, region, opts...) @@ -1021,7 +1008,6 @@ type TestCloudClients struct { GCPGKE gcp.GKEClient GCPProjects gcp.ProjectsClient GCPInstances gcp.InstancesClient - SSM ssmiface.SSMAPI InstanceMetadata imds.Client EKS eksiface.EKSAPI KMS kmsiface.KMSAPI @@ -1191,15 +1177,6 @@ func (c *TestCloudClients) GetAWSKMSClient(ctx context.Context, region string, o return c.KMS, nil } -// GetAWSSSMClient returns an AWS SSM client -func (c *TestCloudClients) GetAWSSSMClient(ctx context.Context, region string, opts ...AWSOptionsFn) (ssmiface.SSMAPI, error) { - _, err := c.GetAWSSession(ctx, region, opts...) - if err != nil { - return nil, trace.Wrap(err) - } - return c.SSM, nil -} - // GetGCPIAMClient returns GCP IAM client. func (c *TestCloudClients) GetGCPIAMClient(ctx context.Context) (*gcpcredentials.IamCredentialsClient, error) { return gcpcredentials.NewIamCredentialsClient(ctx, diff --git a/lib/config/configuration.go b/lib/config/configuration.go index bde7978107c7d..54dc6a2c82820 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -2066,6 +2066,17 @@ func applyAppsConfig(fc *FileConfig, cfg *servicecfg.Config) error { ExternalID: application.AWS.ExternalID, } } + + if len(application.TCPPorts) != 0 { + app.TCPPorts = make([]servicecfg.PortRange, 0, len(application.TCPPorts)) + for _, portRange := range application.TCPPorts { + app.TCPPorts = append(app.TCPPorts, servicecfg.PortRange{ + Port: portRange.Port, + EndPort: portRange.EndPort, + }) + } + } + if err := app.CheckAndSetDefaults(); err != nil { return trace.Wrap(err) } diff --git a/lib/config/configuration_test.go b/lib/config/configuration_test.go index 64348a9fe0d03..cfb147bb945ee 100644 --- a/lib/config/configuration_test.go +++ b/lib/config/configuration_test.go @@ -2386,8 +2386,8 @@ func TestWindowsDesktopService(t *testing.T) { func TestApps(t *testing.T) { tests := []struct { inConfigString string - inComment string - outError bool + name string + outErr require.ErrorAssertionFunc }{ { inConfigString: ` @@ -2402,8 +2402,8 @@ app_service: - labels: '*': '*' `, - inComment: "config is valid", - outError: false, + name: "app and wildcard resources", + outErr: require.NoError, }, { inConfigString: ` @@ -2414,8 +2414,8 @@ app_service: public_addr: "foo.example.com" uri: "http://127.0.0.1:8080" `, - inComment: "config is missing name", - outError: true, + name: "config is missing name", + outErr: require.Error, }, { inConfigString: ` @@ -2426,8 +2426,8 @@ app_service: name: foo uri: "http://127.0.0.1:8080" `, - inComment: "config is valid", - outError: false, + name: "app", + outErr: require.NoError, }, { inConfigString: ` @@ -2438,8 +2438,8 @@ app_service: name: foo public_addr: "foo.example.com" `, - inComment: "config is missing internal address", - outError: true, + name: "config is missing internal address", + outErr: require.Error, }, { inConfigString: ` @@ -2456,19 +2456,62 @@ app_service: aws: assume_role_arn: "arn:aws:iam::123456789012:role/AppAccess" `, - inComment: "assume_role_arn is not supported", - outError: true, + name: "assume_role_arn is not supported", + outErr: require.Error, + }, + { + inConfigString: ` +app_service: + enabled: true + apps: + - name: foo + uri: "tcp://127.0.0.1" + tcp_ports: + - port: 1234 + - port: 30000 + end_port: 30768 +`, + name: "TCP app with ports", + outErr: require.NoError, + }, + { + inConfigString: ` +app_service: + enabled: true + apps: + - name: foo + uri: "tcp://127.0.0.1" + tcp_ports: + - end_port: 30000 +`, + name: "TCP app with only end port", + outErr: require.Error, + }, + { + inConfigString: ` +app_service: + enabled: true + apps: + - name: foo + uri: "tcp://127.0.0.1" + tcp_ports: + - port: 78787 +`, + name: "TCP app with port bigger than 65535", + outErr: require.Error, }, } for _, tt := range tests { - clf := CommandLineFlags{ - ConfigString: base64.StdEncoding.EncodeToString([]byte(tt.inConfigString)), - } - cfg := servicecfg.MakeDefaultConfig() + t.Run(tt.name, func(t *testing.T) { + clf := CommandLineFlags{ + ConfigString: base64.StdEncoding.EncodeToString([]byte(tt.inConfigString)), + } + cfg := servicecfg.MakeDefaultConfig() - err := Configure(&clf, cfg, false) - require.Equal(t, err != nil, tt.outError, tt.inComment) + err := Configure(&clf, cfg, false) + tt.outErr(t, err) + }) } } diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index a6f1ca1e7e88a..a4bc53787ce9f 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -2036,6 +2036,12 @@ type App struct { // CORS defines the Cross-Origin Resource Sharing configuration for the app, // controlling how resources are shared across different origins. CORS *CORS `yaml:"cors,omitempty"` + + // TCPPorts is a list of ports and port ranges that an app agent can forward connections to. + // Only applicable to TCP App Access. + // If this field is not empty, URI is expected to contain no port number and start with the tcp + // protocol. + TCPPorts []PortRange `yaml:"tcp_ports,omitempty"` } // CORS represents the configuration for Cross-Origin Resource Sharing (CORS) @@ -2082,6 +2088,18 @@ type AppAWS struct { ExternalID string `yaml:"external_id,omitempty"` } +// PortRange describes a port range for TCP apps. The range starts with Port and ends with EndPort. +// PortRange can be used to describe a single port in which case the Port field is the port and the +// EndPort field is 0. +type PortRange struct { + // Port describes the start of the range. It must be between 1 and 65535. + Port int `yaml:"port"` + // EndPort describes the end of the range, inclusive. When describing a port range, it must be + // greater than Port and less than or equal to 65535. When describing a single port, it must be + // set to 0. + EndPort int `yaml:"end_port,omitempty"` +} + // Proxy is a `proxy_service` section of the config file: type Proxy struct { // Service is a generic service configuration section diff --git a/lib/events/api.go b/lib/events/api.go index 20b72ddd2e5f9..f186dc8646e89 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -838,6 +838,11 @@ const ( AutoUpdateVersionUpdateEvent = "auto_update_version.update" // AutoUpdateVersionDeleteEvent is emitted when a AutoUpdateVersion resource is deleted. AutoUpdateVersionDeleteEvent = "auto_update_version.delete" + + // ContactCreateEvent is emitted when a Contact resource is created. + ContactCreateEvent = "contact.create" + // ContactDeleteEvent is emitted when a Contact resource is deleted. + ContactDeleteEvent = "contact.delete" ) // Add an entry to eventsMap in lib/events/events_test.go when you add diff --git a/lib/events/codes.go b/lib/events/codes.go index fa8c284fe925b..6a9cd1aa85db4 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -669,6 +669,11 @@ const ( // AutoUpdateVersionDeleteCode is the auto update version delete event code. AutoUpdateVersionDeleteCode = "AUV003I" + // ContactCreateCode is the auto update version create event code. + ContactCreateCode = "TCTC001I" + // ContactDeleteCode is the auto update version delete event code. + ContactDeleteCode = "TCTC002I" + // UnknownCode is used when an event of unknown type is encountered. UnknownCode = apievents.UnknownCode ) diff --git a/lib/events/dynamic.go b/lib/events/dynamic.go index 476528255e5ba..ca1c79987739f 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -462,6 +462,11 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { e = &events.AutoUpdateVersionUpdate{} case AutoUpdateVersionDeleteEvent: e = &events.AutoUpdateVersionDelete{} + + case ContactCreateEvent: + e = &events.ContactCreate{} + case ContactDeleteEvent: + e = &events.ContactDelete{} default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", eventType) unknown := &events.Unknown{} diff --git a/lib/events/events_test.go b/lib/events/events_test.go index d304a65ddd4bc..5c1a69d4d9f99 100644 --- a/lib/events/events_test.go +++ b/lib/events/events_test.go @@ -242,6 +242,8 @@ var eventsMap = map[string]apievents.AuditEvent{ AutoUpdateVersionCreateEvent: &apievents.AutoUpdateVersionCreate{}, AutoUpdateVersionUpdateEvent: &apievents.AutoUpdateVersionUpdate{}, AutoUpdateVersionDeleteEvent: &apievents.AutoUpdateVersionDelete{}, + ContactCreateEvent: &apievents.ContactCreate{}, + ContactDeleteEvent: &apievents.ContactDelete{}, } // TestJSON tests JSON marshal events diff --git a/lib/inventory/controller.go b/lib/inventory/controller.go index 8ee5c4cc40e0d..63873c03fc852 100644 --- a/lib/inventory/controller.go +++ b/lib/inventory/controller.go @@ -104,7 +104,7 @@ const ( instanceHeartbeatOk testEvent = "instance-heartbeat-ok" instanceHeartbeatErr testEvent = "instance-heartbeat-err" - timeReconciliationOk testEvent = "time-reconciliation-ok" + pongOk testEvent = "pong-ok" instanceCompareFailed testEvent = "instance-compare-failed" @@ -284,13 +284,11 @@ func (c *Controller) RegisterControlStream(stream client.UpstreamInventoryContro c.store.Insert(handle) // Increment the concurrent connection counter that we use to calculate the - // variable instance heartbeat duration. It's done here synchronously rather - // than in handleControlStream for the sake of tests. + // variable instance heartbeat duration. To make the behavior more easily + // testable, we increment it here and we decrement it before closing the + // stream in handleControlStream. c.instanceHBVariableDuration.Inc() - go func() { - defer c.instanceHBVariableDuration.Dec() - c.handleControlStream(handle) - }() + go c.handleControlStream(handle) } // GetControlStream gets a control stream for the given server ID if one exists (if multiple control streams @@ -400,6 +398,7 @@ func (c *Controller) handleControlStream(handle *upstreamHandle) { } } + c.instanceHBVariableDuration.Dec() for _, service := range handle.hello.Services { c.serviceCounter.decrement(service) } @@ -518,7 +517,6 @@ func (c *Controller) handleControlStream(handle *upstreamHandle) { handle.CloseWithError(err) return } - c.testEvent(timeReconciliationOk) case now := <-dbKeepAliveDelay.Elapsed(): dbKeepAliveDelay.Advance(now) @@ -632,6 +630,7 @@ func (c *Controller) handlePong(handle *upstreamHandle, msg proto.UpstreamInvent pending.rspC <- pong delete(handle.pings, msg.ID) + c.testEvent(pongOk) } func (c *Controller) handlePingRequest(handle *upstreamHandle, req pingRequest) error { diff --git a/lib/inventory/controller_test.go b/lib/inventory/controller_test.go index b89a8bdbae7dd..9ec509f725293 100644 --- a/lib/inventory/controller_test.go +++ b/lib/inventory/controller_test.go @@ -190,6 +190,27 @@ func TestSSHServerBasics(t *testing.T) { // set up fake in-memory control stream upstream, downstream := client.InventoryControlStreamPipe(client.ICSPipePeerAddr(peerAddr)) + t.Cleanup(func() { + controller.Close() + downstream.Close() + upstream.Close() + }) + + // launch goroutine to respond to ping requests + go func() { + for { + select { + case msg := <-downstream.Recv(): + downstream.Send(ctx, proto.UpstreamInventoryPong{ + ID: msg.(proto.DownstreamInventoryPing).ID, + }) + case <-downstream.Done(): + return + case <-ctx.Done(): + return + } + } + }() controller.RegisterControlStream(upstream, proto.UpstreamInventoryHello{ ServerID: serverID, @@ -256,18 +277,6 @@ func TestSSHServerBasics(t *testing.T) { deny(sshKeepAliveErr, handlerClose), ) - // launch goroutine to respond to a single ping - go func() { - select { - case msg := <-downstream.Recv(): - downstream.Send(ctx, proto.UpstreamInventoryPong{ - ID: msg.(proto.DownstreamInventoryPing).ID, - }) - case <-downstream.Done(): - case <-ctx.Done(): - } - }() - // limit time of ping call pingCtx, cancel := context.WithTimeout(ctx, time.Second*10) defer cancel() @@ -357,6 +366,27 @@ func TestAppServerBasics(t *testing.T) { // set up fake in-memory control stream upstream, downstream := client.InventoryControlStreamPipe() + t.Cleanup(func() { + controller.Close() + upstream.Close() + downstream.Close() + }) + + // launch goroutine to respond to ping requests + go func() { + for { + select { + case msg := <-downstream.Recv(): + downstream.Send(ctx, proto.UpstreamInventoryPong{ + ID: msg.(proto.DownstreamInventoryPing).ID, + }) + case <-downstream.Done(): + return + case <-ctx.Done(): + return + } + } + }() controller.RegisterControlStream(upstream, proto.UpstreamInventoryHello{ ServerID: serverID, @@ -443,18 +473,6 @@ func TestAppServerBasics(t *testing.T) { deny(appKeepAliveErr, handlerClose), ) - // launch goroutine to respond to a single ping - go func() { - select { - case msg := <-downstream.Recv(): - downstream.Send(ctx, proto.UpstreamInventoryPong{ - ID: msg.(proto.DownstreamInventoryPing).ID, - }) - case <-downstream.Done(): - case <-ctx.Done(): - } - }() - // limit time of ping call pingCtx, cancel := context.WithTimeout(ctx, time.Second*10) defer cancel() @@ -575,6 +593,27 @@ func TestDatabaseServerBasics(t *testing.T) { // set up fake in-memory control stream upstream, downstream := client.InventoryControlStreamPipe() + t.Cleanup(func() { + controller.Close() + upstream.Close() + downstream.Close() + }) + + // launch goroutine to respond to ping requests + go func() { + for { + select { + case msg := <-downstream.Recv(): + downstream.Send(ctx, proto.UpstreamInventoryPong{ + ID: msg.(proto.DownstreamInventoryPing).ID, + }) + case <-downstream.Done(): + return + case <-ctx.Done(): + return + } + } + }() controller.RegisterControlStream(upstream, proto.UpstreamInventoryHello{ ServerID: serverID, @@ -662,18 +701,6 @@ func TestDatabaseServerBasics(t *testing.T) { deny(dbKeepAliveErr, handlerClose), ) - // launch goroutine to respond to a single ping - go func() { - select { - case msg := <-downstream.Recv(): - downstream.Send(ctx, proto.UpstreamInventoryPong{ - ID: msg.(proto.DownstreamInventoryPing).ID, - }) - case <-downstream.Done(): - case <-ctx.Done(): - } - }() - // limit time of ping call pingCtx, cancel := context.WithTimeout(ctx, time.Second*10) defer cancel() @@ -1189,6 +1216,21 @@ func TestKubernetesServerBasics(t *testing.T) { // set up fake in-memory control stream upstream, downstream := client.InventoryControlStreamPipe() + // launch goroutine to respond to ping requests + go func() { + for { + select { + case msg := <-downstream.Recv(): + downstream.Send(ctx, proto.UpstreamInventoryPong{ + ID: msg.(proto.DownstreamInventoryPing).ID, + }) + case <-downstream.Done(): + return + case <-ctx.Done(): + return + } + } + }() controller.RegisterControlStream(upstream, proto.UpstreamInventoryHello{ ServerID: serverID, @@ -1277,18 +1319,6 @@ func TestKubernetesServerBasics(t *testing.T) { deny(kubeKeepAliveErr, handlerClose), ) - // launch goroutine to respond to a single ping - go func() { - select { - case msg := <-downstream.Recv(): - downstream.Send(ctx, proto.UpstreamInventoryPong{ - ID: msg.(proto.DownstreamInventoryPing).ID, - }) - case <-downstream.Done(): - case <-ctx.Done(): - } - }() - // limit time of ping call pingCtx, cancel := context.WithTimeout(ctx, time.Second*10) defer cancel() @@ -1473,12 +1503,6 @@ func TestTimeReconciliation(t *testing.T) { cancel() }) - controller.RegisterControlStream(upstream, proto.UpstreamInventoryHello{ - ServerID: serverID, - Version: teleport.Version, - Services: []types.SystemRole{types.RoleNode}, - }) - // Launch goroutine to respond to clock request. go func() { for { @@ -1488,7 +1512,6 @@ func TestTimeReconciliation(t *testing.T) { ID: msg.(proto.DownstreamInventoryPing).ID, SystemClock: clock.Now().Add(-time.Minute).UTC(), }) - return case <-downstream.Done(): return case <-ctx.Done(): @@ -1497,12 +1520,16 @@ func TestTimeReconciliation(t *testing.T) { } }() + controller.RegisterControlStream(upstream, proto.UpstreamInventoryHello{ + ServerID: serverID, + Version: teleport.Version, + Services: []types.SystemRole{types.RoleNode}, + }) + _, ok := controller.GetControlStream(serverID) require.True(t, ok) - awaitEvents(t, events, - expect(timeReconciliationOk), - ) + awaitEvents(t, events, expect(pongOk)) awaitEvents(t, events, expect(instanceHeartbeatOk), deny(instanceHeartbeatErr, instanceCompareFailed, handlerClose), @@ -1510,6 +1537,8 @@ func TestTimeReconciliation(t *testing.T) { auth.mu.Lock() m := auth.lastInstance.GetLastMeasurement() auth.mu.Unlock() + + require.NotNil(t, m) require.InDelta(t, time.Minute, m.ControllerSystemClock.Sub(m.SystemClock)-m.RequestDuration/2, float64(time.Second)) } diff --git a/lib/inventory/inventory.go b/lib/inventory/inventory.go index 6f2f07df8533e..c96bcf4675ed9 100644 --- a/lib/inventory/inventory.go +++ b/lib/inventory/inventory.go @@ -404,9 +404,6 @@ type UpstreamHandle interface { Ping(ctx context.Context, id uint64) (d time.Duration, err error) - // SystemClock makes ping request to fetch the system clock of the node. - SystemClock(ctx context.Context, id uint64) (time.Time, time.Duration, error) - // HasService is a helper for checking if a given service is associated with this // stream. HasService(types.SystemRole) bool @@ -673,27 +670,6 @@ func (h *upstreamHandle) Ping(ctx context.Context, id uint64) (d time.Duration, } } -// SystemClock makes ping request to fetch the system clock of the downstream. -func (h *upstreamHandle) SystemClock(ctx context.Context, id uint64) (time.Time, time.Duration, error) { - rspC := make(chan pingResponse, 1) - select { - case h.pingC <- pingRequest{rspC: rspC, id: id}: - case <-h.Done(): - return time.Time{}, 0, trace.Errorf("failed to send downstream ping (stream closed)") - case <-ctx.Done(): - return time.Time{}, 0, trace.Errorf("failed to send downstream ping: %v", ctx.Err()) - } - - select { - case rsp := <-rspC: - return rsp.systemClock, rsp.reqDuration, rsp.err - case <-h.Done(): - return time.Time{}, 0, trace.Errorf("failed to recv upstream pong (stream closed)") - case <-ctx.Done(): - return time.Time{}, 0, trace.Errorf("failed to recv upstream ping: %v", ctx.Err()) - } -} - func (h *upstreamHandle) Hello() proto.UpstreamInventoryHello { return h.hello } diff --git a/lib/kube/proxy/forwarder.go b/lib/kube/proxy/forwarder.go index 1cfd6351fddce..fcf571661dcdc 100644 --- a/lib/kube/proxy/forwarder.go +++ b/lib/kube/proxy/forwarder.go @@ -25,6 +25,7 @@ import ( "errors" "fmt" "io" + "log/slog" "maps" "net" "net/http" @@ -2348,9 +2349,11 @@ func (s *clusterSession) monitorConn(conn net.Conn, err error, hostID string) (n Context: s.connCtx, TeleportUser: s.User.GetName(), ServerID: s.parent.cfg.HostID, - Entry: s.parent.log, - Emitter: s.parent.cfg.AuthClient, - EmitterContext: s.parent.ctx, + // TODO(tross) update this to use the child logger + // once Forwarder is converted to use a slog.Logger + Logger: slog.Default(), + Emitter: s.parent.cfg.AuthClient, + EmitterContext: s.parent.ctx, }) if err != nil { tc.CloseWithCause(err) diff --git a/lib/kubernetestoken/token_source.go b/lib/kube/token/source.go similarity index 98% rename from lib/kubernetestoken/token_source.go rename to lib/kube/token/source.go index 55a506937cc89..8a10c442088fa 100644 --- a/lib/kubernetestoken/token_source.go +++ b/lib/kube/token/source.go @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package kubernetestoken +package token import ( "strings" diff --git a/lib/kubernetestoken/token_source_test.go b/lib/kube/token/source_test.go similarity index 99% rename from lib/kubernetestoken/token_source_test.go rename to lib/kube/token/source_test.go index 4089017378278..9d3e5fd5a4092 100644 --- a/lib/kubernetestoken/token_source_test.go +++ b/lib/kube/token/source_test.go @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package kubernetestoken +package token import ( "io/fs" diff --git a/lib/kubernetestoken/token_validator.go b/lib/kube/token/validator.go similarity index 78% rename from lib/kubernetestoken/token_validator.go rename to lib/kube/token/validator.go index 3d04392f2eeae..056b5ee1def0d 100644 --- a/lib/kubernetestoken/token_validator.go +++ b/lib/kube/token/validator.go @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package kubernetestoken +package token import ( "context" @@ -37,6 +37,7 @@ import ( "k8s.io/client-go/rest" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils" ) const ( @@ -46,8 +47,6 @@ const ( // Kubernetes should support bound tokens on 1.20 and 1.21, // but we can have an apiserver running 1.21 and kubelets running 1.19. kubernetesBoundTokenSupportVersion = "1.22.0" - // kubernetesAudience is the Kubernetes default audience put on SA tokens if we don't specify one. - kubernetesAudience = "https://kubernetes.default.svc" ) type ValidationResult struct { @@ -85,35 +84,65 @@ func (c *ValidationResult) JoinAuditAttributes() (map[string]interface{}, error) // Kubernetes TokenRequest API endpoint. type TokenReviewValidator struct { mu sync.Mutex - // client is protected by mu and should only be accessed via the getClient - // method. + // client and clusterAudiences are protected by mu and should only be + // accessed via the getClient method. client kubernetes.Interface + // clusterAudiences contains the default Kubernetes cluster audiences. + // This field is populated when getting the Kube client and returned by + // getClient. + // A nil value indicates that the cluster doesn't support audiences. + clusterAudiences []string } -// getClient allows the lazy initialisation of the Kubernetes client -func (v *TokenReviewValidator) getClient() (kubernetes.Interface, error) { +// getClient allows the lazy initialisation of the Kubernetes client and clusterAudiences +func (v *TokenReviewValidator) getClient(_ context.Context) (kubernetes.Interface, []string, error) { v.mu.Lock() defer v.mu.Unlock() if v.client != nil { - return v.client, nil + return v.client, v.clusterAudiences, nil } config, err := rest.InClusterConfig() if err != nil { - return nil, trace.WrapWithMessage(err, "failed to initialize in-cluster Kubernetes config") + return nil, nil, trace.WrapWithMessage(err, "failed to initialize in-cluster Kubernetes config") } client, err := kubernetes.NewForConfig(config) if err != nil { - return nil, trace.WrapWithMessage(err, "failed to initialize in-cluster Kubernetes client") + return nil, nil, trace.WrapWithMessage(err, "failed to initialize in-cluster Kubernetes client") + } + + // We extract the audiences from our own token. This allows us to detect the default Kubernetes audiences. + audiences, err := unsafeGetTokenAudiences(config.BearerToken) + if err != nil { + return nil, nil, trace.Wrap(err, "doing a self-review") } v.client = client - return client, nil + v.clusterAudiences = audiences + return client, audiences, nil +} + +// unsafeGetTokenAudiences extracts the audience from the mounted token. +// THIS FUNCTION DOES NOT VALIDATE THE TOKEN SIGNATURE. +// Bound tokens always have audiences and the list will not be empty. +// Legacy tokens don't have audiences, the result will be an empty list and no error. +func unsafeGetTokenAudiences(token string) ([]string, error) { + jwt, err := josejwt.ParseSigned(token) + if err != nil { + return nil, trace.Wrap(err) + } + claims := &ServiceAccountClaims{} + err = jwt.UnsafeClaimsWithoutVerification(claims) + if err != nil { + return nil, trace.Wrap(err) + } + + return claims.Audience, nil } // Validate uses the Kubernetes TokenReview API to validate a token and return its UserInfo func (v *TokenReviewValidator) Validate(ctx context.Context, token, clusterName string) (*ValidationResult, error) { - client, err := v.getClient() + client, audiences, err := v.getClient(ctx) if err != nil { return nil, trace.Wrap(err) } @@ -121,13 +150,23 @@ func (v *TokenReviewValidator) Validate(ctx context.Context, token, clusterName review := &v1.TokenReview{ Spec: v1.TokenReviewSpec{ Token: token, - // In-cluster used to only allow tokens with the kubernetes audience - // But people kept confusing it with JWKS and set the cluster name - // as the audience/. To avoid his common footgun we now allow tokens - // whose audience is the teleport cluster name. - Audiences: []string{kubernetesAudience, clusterName}, }, } + + // In-cluster used to only allow tokens with the kubernetes audience but people + // kept confusing it with the JWKS kube join method and set the cluster name + // as the audience. To avoid his common footgun we now allow tokens whose + // audience is the teleport cluster name. + // + // We do this only if the Kubernetes cluster supports audiences. + // Earlier Kube versions don't have audience + // support, in this case, we just do a regular token review. + if len(audiences) > 0 { + // We deduplicate because the Teleport cluster name could be one of the default audiences + // And I really don't want to discover if sending the same audience multiple times is valid for Kubernetes. + review.Spec.Audiences = utils.Deduplicate(append([]string{clusterName}, audiences...)) + } + options := metav1.CreateOptions{} reviewResult, err := client.AuthenticationV1().TokenReviews().Create(ctx, review, options) diff --git a/lib/kubernetestoken/token_validator_test.go b/lib/kube/token/validator_test.go similarity index 67% rename from lib/kubernetestoken/token_validator_test.go rename to lib/kube/token/validator_test.go index 23433f62602ef..49054df1e47ee 100644 --- a/lib/kubernetestoken/token_validator_test.go +++ b/lib/kube/token/validator_test.go @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package kubernetestoken +package token import ( "context" @@ -41,7 +41,9 @@ import ( "github.com/gravitational/teleport/lib/cryptosuites" ) -const testClusterName = "teleport.example.com" +const ( + testClusterName = "teleport.example.com" +) var userGroups = []string{"system:serviceaccounts", "system:serviceaccounts:namespace", "system:authenticated"} @@ -58,7 +60,7 @@ var legacyTokenKubernetesVersion = version.Info{ } // tokenReviewMock creates a testing.ReactionFunc validating the tokenReview request and answering it -func tokenReviewMock(t *testing.T, reviewResult *v1.TokenReview) func(ctest.Action) (bool, runtime.Object, error) { +func tokenReviewMock(t *testing.T, reviewResult *v1.TokenReview, expectedAudiences []string) func(ctest.Action) (bool, runtime.Object, error) { return func(action ctest.Action) (bool, runtime.Object, error) { createAction, ok := action.(ctest.CreateAction) require.True(t, ok) @@ -67,7 +69,7 @@ func tokenReviewMock(t *testing.T, reviewResult *v1.TokenReview) func(ctest.Acti require.True(t, ok) require.Equal(t, reviewResult.Spec.Token, reviewRequest.Spec.Token) - require.ElementsMatch(t, reviewRequest.Spec.Audiences, []string{kubernetesAudience, testClusterName}) + require.ElementsMatch(t, expectedAudiences, reviewRequest.Spec.Audiences) return true, reviewResult, nil } } @@ -93,13 +95,82 @@ func (c *fakeClientSet) Discovery() discovery.DiscoveryInterface { return &c.discovery } +const ( + // The tokens below are test data to validate that we can extract audiences properly from tokens coming from + // different Kubernetes clusters versions. + // Those tokens are only test data and don't provide access to anything. The Kube clusters who generated them + // are long gone. + // If your scanner brought you here, please save everyone's time and DO NOT REPORT accidentally committed tokens. + + // this token has no audience + testDataLegacyToken = "eyJhbGciOiJSUzI1NiIsImtpZCI6IkRVdTJXUGNPLUthZjk2c3ZJcXhFWlBsRHUyUUx5cWxrUm1qT0s2VG9XQTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InRlc3RzYS10b2tlbi1namZxYiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ0ZXN0c2EiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwYWY0YTc4Zi04ZjEwLTQ2ODUtYWMyOS1jYWUwODY1OWJjYWUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDp0ZXN0c2EifQ.Y683lBdmc5e0wvL3BPXj4hVkYXiu7M4bn2w1tvqIdrXdat3Fnqlv5Qgih3RS1VRETXDOMp3_CA8Jv7Nqe_PSIrBPvLStRYvvRByWDWY3PvYDfFxeARKj0E_AQnFkXQxEN21eXkJi3k0i93uhGGNvUr5bNpk7buMbD2UKt-y8N7sQmTIQ6nPdjaC3YHn32-MHpAquqwbTqXhETPrvk9RjSzE4jszcd_P1Gi7BdZoHPErnCc5XaEVBJnHiWsZCsJDL00nAaAS_Ru8TsIdX_z1pyp91sigxfvFrGwhns3oXq54rrhpBuloPwmDW0gWDAV-qjje5MPFuaiov431ocKrOsg\n" + // audience is defaultKubeAudiences + testDataBoundTokenKubeAudiences = "eyJhbGciOiJSUzI1NiIsImtpZCI6InY2VnNnUmdpVS1DNlZWaUVjLV9Wb1dCR2dpZVEtblV0RDFXQjVfY3JOckEifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiLCJrM3MiXSwiZXhwIjoxNzY0OTQ3Mzc3LCJpYXQiOjE3MzM0MTEzNzcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiMjE4Y2I0ZGQtMzQyNS00Yzc0LThiODktNTRiNzIzNGRiMDE4Iiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwibm9kZSI6eyJuYW1lIjoiazNkLWszcy1kZWZhdWx0LXNlcnZlci0wIiwidWlkIjoiZWMwMTUzZGUtMThiOC00OTk3LTg4ZGQtNjFiYzVmZTkzYThiIn0sInBvZCI6eyJuYW1lIjoiaHVnby10ZXN0LXBvZCIsInVpZCI6ImIxNjliZTdkLWNkYTItNGNhNy04ODVmLWMxNzJiMzZhNjUzNyJ9LCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoiZGVmYXVsdCIsInVpZCI6IjQxMzgxNWFiLWNjZjctNDI4YS1iNjA4LTllNGUyYmU1OTc2ZiJ9LCJ3YXJuYWZ0ZXIiOjE3MzM0MTQ5ODR9LCJuYmYiOjE3MzM0MTEzNzcsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.Cs3mekFZzEOk1Gj_w0seURuYC92aY5Xy9WdNz5LtyL0L0eKNnzTV5MNWHgAas--t8ABcvHtcbdS1-XSemqyDfn_GcNJXeZa88bX1PKyG-XdDuqfn40DRxrBXR_sim_2WUGJM2oNh6C6irHzUOQFU0Wmx4oWY3pZ_BSFUlDi3xKnPv-TFWroBVmtc_wLAbCBl5gZF1KngAgMlbdX0szBEwzewkeoFhDTh3OoNWRaRpJL7_YeZsBkKPGY107fFMDXIKmZtd6qyU8-yp3Wwn_1qwucfllNmru8_bncqN18RuDOoQyFej4R93NwntyfzGy1wQexR363QFd7veSgtBS7nJQ" + // audience is customKubeAudiences + testDataBoundTokenCustomAudiences = "eyJhbGciOiJSUzI1NiIsImtpZCI6InY2VnNnUmdpVS1DNlZWaUVjLV9Wb1dCR2dpZVEtblV0RDFXQjVfY3JOckEifQ.eyJhdWQiOlsidGVsZXBvcnQuZXhhbXBsZS5jb20iXSwiZXhwIjoxNzMzNDE2MDEyLCJpYXQiOjE3MzM0MTI0MDUsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiZDE5Yjk2ZjctMTgyYy00ODVjLThkYWYtNzdkMTRhYzA4NmNlIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJkZWZhdWx0Iiwibm9kZSI6eyJuYW1lIjoiazNkLWszcy1kZWZhdWx0LXNlcnZlci0wIiwidWlkIjoiZWMwMTUzZGUtMThiOC00OTk3LTg4ZGQtNjFiYzVmZTkzYThiIn0sInBvZCI6eyJuYW1lIjoiaHVnby10ZXN0LXBvZCIsInVpZCI6Ijc1ZTIwMmFjLTAwZWMtNDVmZC05ZGViLTgwM2JkODA0YjMxNSJ9LCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoiZGVmYXVsdCIsInVpZCI6IjQxMzgxNWFiLWNjZjctNDI4YS1iNjA4LTllNGUyYmU1OTc2ZiJ9fSwibmJmIjoxNzMzNDEyNDA1LCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpkZWZhdWx0In0.QwhCSQzDrXBNjZU6X642FC_fzglaT80ldCFTXQEwR6IdPvPntjbSAZq8yN6arngctgM6wEh3buc7kq0awmytgF2hbeSRN6PEeRbVvKaAClnCPTzlJYnDq4FOYezqSBZ7jVCW3cNxeU0QCNwj5w8Xy1uxCJu24iWov-ElyxqiCkpa9FjiquOu4kHq9OErXe5ZmXmTDOILnQBzsZnbg-sBKTX-mNAHro8DwQCfFtPmW27iySaScIegqwZNHXbZJDWZYDB2uj3xuHzX75amgPWpfqUq4JaNkf-xlldaH3SdZa5hlL9zvV9e9Dwgqlnergq6EpEZNHmCPb9birQFn46n_w" +) + +var ( + defaultKubeAudiences = []string{"https://kubernetes.default.svc.cluster.local", "k3s"} + customKubeAudiences = []string{testClusterName} +) + +func TestGetTokenAudiences(t *testing.T) { + tests := []struct { + name string + token string + expectedAudiences []string + expectErr require.ErrorAssertionFunc + }{ + { + name: "legacy token with no audience", + token: testDataLegacyToken, + expectedAudiences: nil, + expectErr: require.NoError, + }, + { + name: "modern bound token with default kube audience", + token: testDataBoundTokenKubeAudiences, + expectedAudiences: defaultKubeAudiences, + expectErr: require.NoError, + }, + { + name: "modern bound token with custom audience", + token: testDataBoundTokenCustomAudiences, + expectedAudiences: customKubeAudiences, + expectErr: require.NoError, + }, + { + name: "broken token", + token: "asdfghjkl", + expectedAudiences: nil, + expectErr: require.Error, + }, + { + name: "no token", + token: "", + expectedAudiences: nil, + expectErr: require.Error, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := unsafeGetTokenAudiences(tt.token) + tt.expectErr(t, err) + assert.Equal(t, tt.expectedAudiences, result) + }) + } +} + func TestIDTokenValidator_Validate(t *testing.T) { tests := []struct { - token string - review *v1.TokenReview - kubeVersion *version.Info - wantResult *ValidationResult - expectedError error + token string + review *v1.TokenReview + kubeVersion *version.Info + wantResult *ValidationResult + clusterAudiences []string + expectedAudiences []string + expectedError error }{ { token: "valid", @@ -127,6 +198,39 @@ func TestIDTokenValidator_Validate(t *testing.T) { }, kubeVersion: &boundTokenKubernetesVersion, expectedError: nil, + // As the cluster doesn't have default audiences, we should not set + // the cluster name in the tokenReview request audiences. + expectedAudiences: nil, + }, + { + token: "valid-with-cluster-audiences", + review: &v1.TokenReview{ + Spec: v1.TokenReviewSpec{ + Token: "valid-with-cluster-audiences", + }, + Status: v1.TokenReviewStatus{ + Authenticated: true, + User: v1.UserInfo{ + Username: "system:serviceaccount:namespace:my-service-account", + UID: "sa-uuid", + Groups: userGroups, + Extra: map[string]v1.ExtraValue{ + "authentication.kubernetes.io/pod-name": {"podA"}, + "authentication.kubernetes.io/pod-uid": {"podA-uuid"}, + }, + }, + }, + }, + wantResult: &ValidationResult{ + Type: types.KubernetesJoinTypeInCluster, + Username: "system:serviceaccount:namespace:my-service-account", + // Raw will be filled in during test run to value of review + }, + kubeVersion: &boundTokenKubernetesVersion, + expectedError: nil, + clusterAudiences: defaultKubeAudiences, + // We check that the cluster name got added to the default kube cluster audiences + expectedAudiences: append([]string{testClusterName}, defaultKubeAudiences...), }, { token: "valid-not-bound", @@ -237,9 +341,10 @@ func TestIDTokenValidator_Validate(t *testing.T) { } client := newFakeClientset(tt.kubeVersion) - client.AddReactor("create", "tokenreviews", tokenReviewMock(t, tt.review)) + client.AddReactor("create", "tokenreviews", tokenReviewMock(t, tt.review, tt.expectedAudiences)) v := TokenReviewValidator{ - client: client, + client: client, + clusterAudiences: tt.clusterAudiences, } result, err := v.Validate(context.Background(), tt.token, testClusterName) if tt.expectedError != nil { diff --git a/lib/modules/modules.go b/lib/modules/modules.go index 0812cf4ef06df..abc6b41fef043 100644 --- a/lib/modules/modules.go +++ b/lib/modules/modules.go @@ -25,6 +25,7 @@ import ( "crypto" "errors" "fmt" + "os" "runtime" "sync" "time" @@ -332,7 +333,10 @@ var ErrCannotDisableSecondFactor = errors.New("cannot disable multi-factor authe // ValidateResource performs additional resource checks. func ValidateResource(res types.Resource) error { - if GetModules().Features().Cloud || !IsInsecureTestMode() { + // todo(tross): DELETE WHEN ABLE TO [remove env var, leave insecure test mode] + if GetModules().Features().Cloud || + (os.Getenv(teleport.EnvVarAllowNoSecondFactor) != "yes" && !IsInsecureTestMode()) { + switch r := res.(type) { case types.AuthPreference: if !r.IsSecondFactorEnforced() { diff --git a/lib/multiplexer/test/ping.pb.go b/lib/multiplexer/test/ping.pb.go index d8db99f0134a2..356319b133a8e 100644 --- a/lib/multiplexer/test/ping.pb.go +++ b/lib/multiplexer/test/ping.pb.go @@ -17,7 +17,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.35.1 +// protoc-gen-go v1.35.2 // protoc (unknown) // source: teleport/lib/multiplexer/test/ping.proto diff --git a/lib/service/db.go b/lib/service/db.go index 80258e66582e1..3bb3938b9321b 100644 --- a/lib/service/db.go +++ b/lib/service/db.go @@ -137,7 +137,7 @@ func (process *TeleportProcess) initDatabaseService() (retErr error) { ServerID: process.Config.HostUUID, Emitter: asyncEmitter, EmitterContext: process.ExitContext(), - Logger: process.log, + Logger: process.logger, }) if err != nil { return trace.Wrap(err) diff --git a/lib/service/service.go b/lib/service/service.go index 9d1eff7f53c69..97fbd4a03e370 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2552,6 +2552,8 @@ func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config cfg.AutoUpdateService = services.AutoUpdateService cfg.ProvisioningStates = services.ProvisioningStates cfg.IdentityCenter = services.IdentityCenter + cfg.PluginStaticCredentials = services.PluginStaticCredentials + cfg.GitServers = services.GitServers return accesspoint.NewCache(cfg) } @@ -2598,6 +2600,7 @@ func (process *TeleportProcess) newAccessCacheForClient(cfg accesspoint.Config, cfg.WindowsDesktops = client cfg.DynamicWindowsDesktops = client.DynamicDesktopClient() cfg.AutoUpdateService = client + cfg.GitServers = client.GitServerClient() return accesspoint.NewCache(cfg) } @@ -2964,7 +2967,7 @@ func (process *TeleportProcess) initSSH() error { LockEnforcer: lockWatcher, Emitter: &events.StreamerAndEmitter{Emitter: asyncEmitter, Streamer: conn.Client}, Component: teleport.ComponentNode, - Logger: process.log.WithField(teleport.ComponentKey, teleport.Component(teleport.ComponentNode, process.id)).WithField(teleport.ComponentKey, "sessionctrl"), + Logger: process.logger.With(teleport.ComponentKey, teleport.Component(teleport.ComponentNode, process.id, "sessionctrl")), TracerProvider: process.TracingProvider, ServerID: serverID, }) @@ -4465,7 +4468,7 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { LockEnforcer: lockWatcher, Emitter: asyncEmitter, Component: teleport.ComponentProxy, - Logger: process.log.WithField(teleport.ComponentKey, "sessionctrl"), + Logger: process.logger.With(teleport.ComponentKey, "sessionctrl"), TracerProvider: process.TracingProvider, ServerID: serverID, }) @@ -4558,7 +4561,7 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { ServerID: cfg.HostUUID, Emitter: asyncEmitter, EmitterContext: process.GracefulExitContext(), - Logger: process.log, + Logger: process.logger, }) if err != nil { return trace.Wrap(err) @@ -4606,7 +4609,6 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { webConfig := web.Config{ Proxy: tsrv, AuthServers: cfg.AuthServerAddresses()[0], - DomainName: cfg.Hostname, ProxyClient: conn.Client, ProxySSHAddr: proxySSHAddr, ProxyWebAddr: cfg.Proxy.WebAddr, @@ -4922,7 +4924,7 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { ServerID: serverID, Emitter: asyncEmitter, EmitterContext: process.ExitContext(), - Logger: process.log, + Logger: process.logger, }) if err != nil { return trace.Wrap(err) @@ -5140,7 +5142,7 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { ServerID: process.Config.HostUUID, Emitter: asyncEmitter, EmitterContext: process.ExitContext(), - Logger: process.log, + Logger: process.logger, }) if err != nil { return trace.Wrap(err) @@ -5964,6 +5966,7 @@ func (process *TeleportProcess) initApps() { Cloud: app.Cloud, RequiredAppNames: app.RequiredAppNames, CORS: makeApplicationCORS(app.CORS), + TCPPorts: makeApplicationTCPPorts(app.TCPPorts), }) if err != nil { return trace.Wrap(err) @@ -6021,7 +6024,7 @@ func (process *TeleportProcess) initApps() { ServerID: process.Config.HostUUID, Emitter: asyncEmitter, EmitterContext: process.ExitContext(), - Logger: process.log, + Logger: process.logger, MonitorCloseChannel: process.Config.Apps.MonitorCloseChannel, }) if err != nil { @@ -6784,6 +6787,18 @@ func makeApplicationCORS(c *servicecfg.CORS) *types.CORSPolicy { } } +// makeApplicationTCPPorts converts a slice of [servicecfg.PortRange] to a slice of [types.PortRange]. +func makeApplicationTCPPorts(servicePorts []servicecfg.PortRange) []*types.PortRange { + ports := make([]*types.PortRange, 0, len(servicePorts)) + for _, portRange := range servicePorts { + ports = append(ports, &types.PortRange{ + Port: uint32(portRange.Port), + EndPort: uint32(portRange.EndPort), + }) + } + return ports +} + func (process *TeleportProcess) newExternalAuditStorageConfigurator() (*externalauditstorage.Configurator, error) { watcher, err := local.NewClusterExternalAuditWatcher(process.GracefulExitContext(), local.ClusterExternalAuditStorageWatcherConfig{ Backend: process.backend, diff --git a/lib/service/service_test.go b/lib/service/service_test.go index 0ff48c3055395..e0b421ff93780 100644 --- a/lib/service/service_test.go +++ b/lib/service/service_test.go @@ -103,7 +103,7 @@ func TestAdditionalExpectedRoles(t *testing.T) { name: "everything enabled", cfg: func() *servicecfg.Config { cfg := servicecfg.MakeDefaultConfig() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Auth.StorageConfig.Params["path"] = t.TempDir() cfg.DiagnosticAddr = utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"} @@ -134,7 +134,7 @@ func TestAdditionalExpectedRoles(t *testing.T) { name: "everything enabled with additional roles", cfg: func() *servicecfg.Config { cfg := servicecfg.MakeDefaultConfig() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Auth.StorageConfig.Params["path"] = t.TempDir() cfg.DiagnosticAddr = utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"} @@ -194,7 +194,7 @@ func TestDynamicClientReuse(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.Clock = fakeClock - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Auth.Enabled = true cfg.Auth.ListenAddr = utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"} @@ -276,7 +276,7 @@ func TestMonitor(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.Clock = fakeClock var err error - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.DiagnosticAddr = utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"} cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Auth.Enabled = true @@ -787,7 +787,7 @@ func TestDesktopAccessFIPS(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Clock = clockwork.NewFakeClock() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.Auth.Enabled = false cfg.Proxy.Enabled = false cfg.SSH.Enabled = false @@ -912,7 +912,7 @@ func TestSetupProxyTLSConfig(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.CircuitBreakerConfig = breaker.NoopBreakerConfig() cfg.Proxy.ACME.Enabled = tc.acmeEnabled - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.Proxy.PublicAddrs = utils.MustParseAddrList("localhost") process := TeleportProcess{ Config: cfg, @@ -937,7 +937,7 @@ func TestTeleportProcess_reconnectToAuth(t *testing.T) { cfg := servicecfg.MakeDefaultConfig() cfg.SetAuthServerAddress(utils.NetAddr{AddrNetwork: "tcp", Addr: "127.0.0.1:0"}) cfg.Clock = clockwork.NewRealClock() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.Auth.Enabled = false cfg.Proxy.Enabled = false cfg.SSH.Enabled = true @@ -1005,7 +1005,7 @@ func TestTeleportProcessAuthVersionCheck(t *testing.T) { authCfg := servicecfg.MakeDefaultConfig() authCfg.SetAuthServerAddress(listenAddr) - authCfg.DataDir = t.TempDir() + authCfg.DataDir = makeTempDir(t) authCfg.Auth.Enabled = true authCfg.Auth.StaticTokens = staticTokens authCfg.Auth.StorageConfig.Type = lite.GetName() @@ -1027,7 +1027,7 @@ func TestTeleportProcessAuthVersionCheck(t *testing.T) { authListenAddr := authProc.Config.AuthServerAddresses()[0] nodeCfg := servicecfg.MakeDefaultConfig() nodeCfg.SetAuthServerAddress(authListenAddr) - nodeCfg.DataDir = t.TempDir() + nodeCfg.DataDir = makeTempDir(t) nodeCfg.SetToken(token) nodeCfg.Auth.Enabled = false nodeCfg.Proxy.Enabled = false @@ -1614,11 +1614,7 @@ func TestDebugServiceStartSocket(t *testing.T) { t.Parallel() fakeClock := clockwork.NewFakeClock() - var err error - dataDir, err := os.MkdirTemp("", "*") - require.NoError(t, err) - t.Cleanup(func() { os.RemoveAll(dataDir) }) - + dataDir := makeTempDir(t) cfg := servicecfg.MakeDefaultConfig() cfg.DebugService.Enabled = true cfg.Clock = fakeClock @@ -1741,7 +1737,7 @@ func TestInstanceMetadata(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { cfg := newCfg() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.Auth.StorageConfig.Params["path"] = t.TempDir() cfg.InstanceMetadataClient = tc.imClient @@ -1802,7 +1798,7 @@ func TestInitDatabaseService(t *testing.T) { t.Parallel() cfg := servicecfg.MakeDefaultConfig() - cfg.DataDir = t.TempDir() + cfg.DataDir = makeTempDir(t) cfg.DebugService = servicecfg.DebugConfig{ Enabled: false, } @@ -1858,7 +1854,7 @@ func TestAgentRolloutController(t *testing.T) { // Test setup: create a Teleport Auth config fakeClock := clockwork.NewFakeClock() - dataDir := t.TempDir() + dataDir := makeTempDir(t) cfg := servicecfg.MakeDefaultConfig() cfg.Clock = fakeClock @@ -1920,3 +1916,14 @@ func TestAgentRolloutController(t *testing.T) { return rollout.Spec.GetTargetVersion() == version.Spec.GetAgents().GetTargetVersion() }, time.Second, 10*time.Millisecond) } + +// makeTempDir makes a temp dir with a shorter name than t.TempDir() in order to +// avoid https://github.com/golang/go/issues/62614. +func makeTempDir(t *testing.T) string { + t.Helper() + + tempDir, err := os.MkdirTemp("", "teleport-test-") + require.NoError(t, err, "os.MkdirTemp() failed") + t.Cleanup(func() { os.RemoveAll(tempDir) }) + return tempDir +} diff --git a/lib/service/servicecfg/app.go b/lib/service/servicecfg/app.go index 069fc379aab5e..3b0b78df7f6cd 100644 --- a/lib/service/servicecfg/app.go +++ b/lib/service/servicecfg/app.go @@ -30,6 +30,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation" "github.com/gravitational/teleport/api/types" + netutils "github.com/gravitational/teleport/api/utils/net" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/srv/app/common" ) @@ -95,6 +96,12 @@ type App struct { // CORS defines the Cross-Origin Resource Sharing configuration for the app, // controlling how resources are shared across different origins. CORS *CORS + + // TCPPorts is a list of ports and port ranges that an app agent can forward connections to. + // Only applicable to TCP App Access. + // If this field is not empty, URI is expected to contain no port number and start with the tcp + // protocol. + TCPPorts []PortRange } // CORS represents the configuration for Cross-Origin Resource Sharing (CORS) @@ -125,6 +132,18 @@ type CORS struct { MaxAge uint `yaml:"max_age"` } +// PortRange describes a port range for TCP apps. The range starts with Port and ends with EndPort. +// PortRange can be used to describe a single port in which case the Port field is the port and the +// EndPort field is 0. +type PortRange struct { + // Port describes the start of the range. It must be between 1 and 65535. + Port int + // EndPort describes the end of the range, inclusive. When describing a port range, it must be + // greater than Port and less than or equal to 65535. When describing a single port, it must be + // set to 0. + EndPort int +} + // CheckAndSetDefaults validates an application. func (a *App) CheckAndSetDefaults() error { if a.Name == "" { @@ -173,6 +192,43 @@ func (a *App) CheckAndSetDefaults() error { } } } + + if len(a.TCPPorts) != 0 { + if err := a.checkPorts(); err != nil { + return trace.Wrap(err) + } + } + + return nil +} + +func (a *App) checkPorts() error { + // Parsing the URI here does not break compatibility. The URI is parsed only if Ports are present. + // This means that old apps that do have invalid URIs but don't use Ports can continue existing. + uri, err := url.Parse(a.URI) + if err != nil { + return trace.BadParameter("invalid app URI format: %v", err) + } + + // The scheme of URI is not validated to be "tcp" on purpose. This way in the future we can add + // multi-port support to web apps without throwing hard errors when a cluster with a multi-port + // web app gets downgraded to a version which supports multi-port only for TCP apps. + // + // For now, we simply ignore the Ports field set on non-TCP apps. + if uri.Scheme != "tcp" { + return nil + } + + if uri.Port() != "" { + return trace.BadParameter("app URI %q must not include a port number when the app spec defines a list of ports", a.URI) + } + + for _, portRange := range a.TCPPorts { + if err := netutils.ValidatePortRange(portRange.Port, portRange.EndPort); err != nil { + return trace.Wrap(err, "validating a port range of a TCP app") + } + } + return nil } diff --git a/lib/service/servicecfg/config_test.go b/lib/service/servicecfg/config_test.go index 25dfe71342f63..e9a6be2df4056 100644 --- a/lib/service/servicecfg/config_test.go +++ b/lib/service/servicecfg/config_test.go @@ -184,6 +184,102 @@ func TestCheckApp(t *testing.T) { } } +func TestCheckAppTCPPorts(t *testing.T) { + tests := []struct { + name string + tcpPorts []PortRange + uri string + check require.ErrorAssertionFunc + }{ + { + name: "valid ranges and single ports", + tcpPorts: []PortRange{ + PortRange{Port: 22, EndPort: 25}, + PortRange{Port: 26}, + PortRange{Port: 65535}, + }, + check: hasNoErr, + }, + { + name: "valid overlapping ranges", + tcpPorts: []PortRange{ + PortRange{Port: 100, EndPort: 200}, + PortRange{Port: 150, EndPort: 175}, + PortRange{Port: 111}, + PortRange{Port: 150, EndPort: 210}, + PortRange{Port: 1, EndPort: 65535}, + }, + check: hasNoErr, + }, + { + // Ports are validated only for TCP apps to allow for some forwards compatibility. + // If HTTP apps support port ranges in the future, old versions of Teleport shouldn't hard + // fail to make downgrades easier. + name: "valid non-TCP app with invalid ports ignored", + uri: "http://localhost:8000", + tcpPorts: []PortRange{ + PortRange{Port: 0}, + PortRange{Port: 10, EndPort: 2}, + }, + check: hasNoErr, + }, + // Test cases for invalid ports. + { + name: "port smaller than 1", + tcpPorts: []PortRange{ + PortRange{Port: 0}, + }, + check: hasErrTypeBadParameter, + }, + { + name: "end port smaller than 2", + tcpPorts: []PortRange{ + PortRange{Port: 5, EndPort: 1}, + }, + check: hasErrTypeBadParameterAndContains("end port must be between 6 and 65535"), + }, + { + name: "end port smaller than port", + tcpPorts: []PortRange{ + PortRange{Port: 10, EndPort: 5}, + }, + check: hasErrTypeBadParameterAndContains("end port must be between 11 and 65535"), + }, + { + name: "uri specifies port", + uri: "tcp://localhost:1234", + tcpPorts: []PortRange{ + PortRange{Port: 1000, EndPort: 1500}, + }, + check: hasErrTypeBadParameterAndContains("must not include a port number"), + }, + { + name: "invalid uri", + uri: "%", + tcpPorts: []PortRange{ + PortRange{Port: 1000, EndPort: 1500}, + }, + check: hasErrAndContains("invalid URL escape"), + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + app := App{ + Name: "foo", + URI: "tcp://localhost", + TCPPorts: tc.tcpPorts, + } + if tc.uri != "" { + app.URI = tc.uri + } + + err := app.CheckAndSetDefaults() + tc.check(t, err) + }) + } +} + // TestDatabaseStaticLabels ensures the static labels are set. func TestDatabaseStaticLabels(t *testing.T) { db := Database{ @@ -596,3 +692,24 @@ func TestSetLogLevel(t *testing.T) { }) } } + +func hasNoErr(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.NoError(t, err, msgAndArgs...) +} + +func hasErrTypeBadParameter(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.True(t, trace.IsBadParameter(err), "expected bad parameter error, got %+v", err) +} + +func hasErrTypeBadParameterAndContains(msg string) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.True(t, trace.IsBadParameter(err), "err should be trace.BadParameter") + require.ErrorContains(t, err, msg, msgAndArgs...) + } +} + +func hasErrAndContains(msg string) require.ErrorAssertionFunc { + return func(t require.TestingT, err error, msgAndArgs ...interface{}) { + require.ErrorContains(t, err, msg, msgAndArgs...) + } +} diff --git a/lib/services/access_request.go b/lib/services/access_request.go index 4ac9fe9aea31d..1e3ef0c8fb9de 100644 --- a/lib/services/access_request.go +++ b/lib/services/access_request.go @@ -121,7 +121,7 @@ func ValidateAccessRequestClusterNames(cg ClusterGetter, ar types.AccessRequest) } if len(invalidClusters) > 0 { return trace.NotFound("access request contains invalid or unknown cluster names: %v", - strings.Join(invalidClusters, ", ")) + strings.Join(apiutils.Deduplicate(invalidClusters), ", ")) } return nil } diff --git a/lib/services/identitycenter.go b/lib/services/identitycenter.go index d3053b544e005..538f8a84f91ea 100644 --- a/lib/services/identitycenter.go +++ b/lib/services/identitycenter.go @@ -19,10 +19,11 @@ package services import ( "context" - "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/emptypb" identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" + "github.com/gravitational/teleport/api/types" + apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/lib/utils/pagination" ) @@ -49,12 +50,17 @@ type IdentityCenterAccount struct { } // CloneResource creates a deep copy of the underlying account resource -func (a IdentityCenterAccount) CloneResource() IdentityCenterAccount { +func (a IdentityCenterAccount) CloneResource() types.ClonableResource153 { return IdentityCenterAccount{ - Account: proto.Clone(a.Account).(*identitycenterv1.Account), + Account: apiutils.CloneProtoMsg(a.Account), } } +// GetDisplayName returns a human-readable name for the account for UI display. +func (a IdentityCenterAccount) GetDisplayName() string { + return a.Account.GetSpec().GetName() +} + // IdentityCenterAccountID is a strongly-typed Identity Center account ID. type IdentityCenterAccountID string @@ -179,9 +185,9 @@ type IdentityCenterAccountAssignment struct { } // CloneResource creates a deep copy of the underlying account resource -func (a IdentityCenterAccountAssignment) CloneResource() IdentityCenterAccountAssignment { +func (a IdentityCenterAccountAssignment) CloneResource() types.ClonableResource153 { return IdentityCenterAccountAssignment{ - AccountAssignment: proto.Clone(a.AccountAssignment).(*identitycenterv1.AccountAssignment), + AccountAssignment: apiutils.CloneProtoMsg(a.AccountAssignment), } } diff --git a/lib/services/identitycenter_test.go b/lib/services/identitycenter_test.go index 5cbc87493feed..98de511413325 100644 --- a/lib/services/identitycenter_test.go +++ b/lib/services/identitycenter_test.go @@ -48,7 +48,7 @@ func TestIdentityCenterAccountClone(t *testing.T) { } // WHEN I clone the resource - dst := src.CloneResource() + dst := src.CloneResource().(IdentityCenterAccount) // EXPECT that the resulting clone compares equally require.Equal(t, src, dst) @@ -82,7 +82,7 @@ func TestIdentityCenterAccountAssignmentClone(t *testing.T) { } // WHEN I clone the resource - dst := src.CloneResource() + dst := src.CloneResource().(IdentityCenterAccountAssignment) // EXPECT that the resulting clone compares equally require.Equal(t, src, dst) diff --git a/lib/services/local/databaseservice.go b/lib/services/local/databaseservice.go index ad7f064e35b68..255f777eba679 100644 --- a/lib/services/local/databaseservice.go +++ b/lib/services/local/databaseservice.go @@ -44,6 +44,10 @@ func (s *DatabaseServicesService) UpsertDatabaseService(ctx context.Context, ser if err := services.CheckAndSetDefaults(service); err != nil { return nil, trace.Wrap(err) } + if err := types.ValidateNamespaceDefault(service.GetNamespace()); err != nil { + return nil, trace.Wrap(err) + } + rev := service.GetRevision() value, err := services.MarshalDatabaseService(service) if err != nil { diff --git a/lib/services/local/events.go b/lib/services/local/events.go index 2f1c9854da9cd..d0522bf7bd5f2 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -248,6 +248,10 @@ func (e *EventsService) NewWatcher(ctx context.Context, watch types.Watch) (type parser = newIdentityCenterPrincipalAssignmentParser() case types.KindIdentityCenterAccountAssignment: parser = newIdentityCenterAccountAssignmentParser() + case types.KindPluginStaticCredentials: + parser = newPluginStaticCredentialsParser() + case types.KindGitServer: + parser = newGitServerParser() default: if watch.AllowPartialSuccess { continue diff --git a/lib/services/local/git_server.go b/lib/services/local/git_server.go index 2d7d7c58b3263..857bc19447ab3 100644 --- a/lib/services/local/git_server.go +++ b/lib/services/local/git_server.go @@ -23,6 +23,7 @@ import ( "github.com/gravitational/trace" + apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/defaults" @@ -128,3 +129,44 @@ func (s *GitServerService) ListGitServers(ctx context.Context, pageSize int, pag } return items, next, nil } + +func newGitServerParser() *gitServerParser { + return &gitServerParser{ + baseParser: newBaseParser(backend.NewKey(gitServerPrefix)), + } +} + +type gitServerParser struct { + baseParser +} + +func (p *gitServerParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + components := event.Item.Key.Components() + if len(components) < 2 { + return nil, trace.NotFound("failed parsing %s", event.Item.Key) + } + + return &types.ResourceHeader{ + Kind: types.KindGitServer, + Version: types.V2, + Metadata: types.Metadata{ + Name: components[1], + Namespace: apidefaults.Namespace, + }, + }, nil + case types.OpPut: + resource, err := services.UnmarshalServer(event.Item.Value, + types.KindGitServer, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision), + ) + if err != nil { + return nil, trace.Wrap(err) + } + return resource, nil + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} diff --git a/lib/services/local/plugin_static_credentials.go b/lib/services/local/plugin_static_credentials.go index 47fdac4db13ca..409612a0f17bf 100644 --- a/lib/services/local/plugin_static_credentials.go +++ b/lib/services/local/plugin_static_credentials.go @@ -23,6 +23,7 @@ import ( "github.com/gravitational/trace" + apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/services" @@ -94,4 +95,62 @@ func (p *PluginStaticCredentialsService) DeletePluginStaticCredentials(ctx conte return trace.Wrap(p.svc.DeleteResource(ctx, name)) } +// GetAllPluginStaticCredentials will get all plugin static credentials. Cache +// use only. +func (p *PluginStaticCredentialsService) GetAllPluginStaticCredentials(ctx context.Context) ([]types.PluginStaticCredentials, error) { + creds, err := p.svc.GetResources(ctx) + return creds, trace.Wrap(err) +} + +// DeleteAllPluginStaticCredentials will remove all plugin static credentials. +// Cache use only. +func (p *PluginStaticCredentialsService) DeleteAllPluginStaticCredentials(ctx context.Context) error { + return trace.Wrap(p.svc.DeleteAllResources(ctx)) +} + +// UpsertPluginStaticCredentials will upsert a plugin static credentials. Cache +// use only. +func (p *PluginStaticCredentialsService) UpsertPluginStaticCredentials(ctx context.Context, item types.PluginStaticCredentials) (types.PluginStaticCredentials, error) { + cred, err := p.svc.UpsertResource(ctx, item) + return cred, trace.Wrap(err) +} + var _ services.PluginStaticCredentials = (*PluginStaticCredentialsService)(nil) + +type pluginStaticCredentialsParser struct { + baseParser +} + +func newPluginStaticCredentialsParser() *pluginStaticCredentialsParser { + return &pluginStaticCredentialsParser{ + baseParser: newBaseParser(backend.NewKey(pluginStaticCredentialsPrefix)), + } +} + +func (p *pluginStaticCredentialsParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + parts := event.Item.Key.Components() + if len(parts) != 2 { + return nil, trace.BadParameter("malformed key for %s event: %s", types.KindPluginStaticCredentials, event.Item.Key) + } + + return &types.ResourceHeader{ + Kind: types.KindPluginStaticCredentials, + Version: types.V1, + Metadata: types.Metadata{ + Name: parts[1], + Namespace: apidefaults.Namespace, + Description: parts[0], + }, + }, nil + + case types.OpPut: + return services.UnmarshalPluginStaticCredentials( + event.Item.Value, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision)) + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} diff --git a/lib/services/local/plugin_static_credentials_test.go b/lib/services/local/plugin_static_credentials_test.go index 389332eb347f1..9f0c9887ab633 100644 --- a/lib/services/local/plugin_static_credentials_test.go +++ b/lib/services/local/plugin_static_credentials_test.go @@ -88,6 +88,11 @@ func TestPluginStaticCredentialsCRUD(t *testing.T) { cmpopts.IgnoreFields(types.Metadata{}, "Revision"), )) + // Fetch all. + all, err := service.GetAllPluginStaticCredentials(ctx) + require.NoError(t, err) + require.Len(t, all, 2) + // Try to fetch a static credential that doesn't exist. _, err = service.GetPluginStaticCredentials(ctx, "doesnotexist") require.True(t, trace.IsNotFound(err)) @@ -132,4 +137,17 @@ func TestPluginStaticCredentialsCRUD(t *testing.T) { // Try to delete a static credential that doesn't exist. err = service.DeletePluginStaticCredentials(ctx, "doesnotexist") require.True(t, trace.IsNotFound(err)) + + // Upsert. + _, err = service.UpsertPluginStaticCredentials(ctx, cred1) + require.NoError(t, err) + _, err = service.GetPluginStaticCredentials(ctx, cred1.GetName()) + require.NoError(t, err) + + // Delete all. + err = service.DeleteAllPluginStaticCredentials(ctx) + require.NoError(t, err) + all, err = service.GetAllPluginStaticCredentials(ctx) + require.NoError(t, err) + require.Empty(t, all) } diff --git a/lib/services/local/presence.go b/lib/services/local/presence.go index aacc78c40f78c..19b391029cd03 100644 --- a/lib/services/local/presence.go +++ b/lib/services/local/presence.go @@ -32,6 +32,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" "github.com/gravitational/teleport/api/internalutils/stream" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/retryutils" @@ -344,10 +345,10 @@ func (s *PresenceService) UpsertNode(ctx context.Context, server types.Server) ( if server.GetNamespace() == "" { server.SetNamespace(apidefaults.Namespace) } - - if n := server.GetNamespace(); n != apidefaults.Namespace { - return nil, trace.BadParameter("cannot place node in namespace %q, custom namespaces are deprecated", n) + if err := types.ValidateNamespaceDefault(server.GetNamespace()); err != nil { + return nil, trace.Wrap(err) } + rev := server.GetRevision() value, err := services.MarshalServer(server) if err != nil { @@ -376,10 +377,10 @@ func (s *PresenceService) UpdateNode(ctx context.Context, server types.Server) ( if server.GetNamespace() == "" { server.SetNamespace(apidefaults.Namespace) } - - if n := server.GetNamespace(); n != apidefaults.Namespace { - return nil, trace.BadParameter("cannot place node in namespace %q, custom namespaces are deprecated", n) + if err := types.ValidateNamespaceDefault(server.GetNamespace()); err != nil { + return nil, trace.Wrap(err) } + rev := server.GetRevision() value, err := services.MarshalServer(server) if err != nil { @@ -1002,6 +1003,10 @@ func (s *PresenceService) UpsertDatabaseServer(ctx context.Context, server types if err := services.CheckAndSetDefaults(server); err != nil { return nil, trace.Wrap(err) } + if err := types.ValidateNamespaceDefault(server.GetNamespace()); err != nil { + return nil, trace.Wrap(err) + } + rev := server.GetRevision() value, err := services.MarshalDatabaseServer(server) if err != nil { @@ -1095,6 +1100,10 @@ func (s *PresenceService) UpsertApplicationServer(ctx context.Context, server ty if err := services.CheckAndSetDefaults(server); err != nil { return nil, trace.Wrap(err) } + if err := types.ValidateNamespaceDefault(server.GetNamespace()); err != nil { + return nil, trace.Wrap(err) + } + rev := server.GetRevision() value, err := services.MarshalAppServer(server) if err != nil { @@ -1373,6 +1382,9 @@ func (s *PresenceService) listResources(ctx context.Context, req proto.ListResou case types.KindUserGroup: keyPrefix = []string{userGroupPrefix} unmarshalItemFunc = backendItemToUserGroup + case types.KindIdentityCenterAccount: + keyPrefix = []string{awsResourcePrefix, awsAccountPrefix} + unmarshalItemFunc = backendItemToIdentityCenterAccount default: return nil, trace.NotImplemented("%s not implemented at ListResources", req.ResourceType) } @@ -1761,6 +1773,21 @@ func backendItemToUserGroup(item backend.Item) (types.ResourceWithLabels, error) ) } +func backendItemToIdentityCenterAccount(item backend.Item) (types.ResourceWithLabels, error) { + assignment, err := services.UnmarshalProtoResource[*identitycenterv1.Account]( + item.Value, + services.WithExpires(item.Expires), + services.WithRevision(item.Revision), + ) + if err != nil { + return nil, trace.Wrap(err) + } + resource := types.Resource153ToUnifiedResource( + services.IdentityCenterAccount{Account: assignment}, + ) + return resource.(types.ResourceWithLabels), nil +} + const ( reverseTunnelsPrefix = "reverseTunnels" tunnelConnectionsPrefix = "tunnelConnections" diff --git a/lib/services/matchers.go b/lib/services/matchers.go index 19d543ef022c4..b66255feb906d 100644 --- a/lib/services/matchers.go +++ b/lib/services/matchers.go @@ -157,7 +157,9 @@ func MatchResourceByFilters(resource types.ResourceWithLabels, filter MatchResou types.KindDatabaseService, types.KindKubernetesCluster, types.KindWindowsDesktop, types.KindWindowsDesktopService, - types.KindUserGroup: + types.KindUserGroup, + types.KindIdentityCenterAccount, + types.KindGitServer: specResource = resource case types.KindKubeServer: if seenMap != nil { diff --git a/lib/services/matchers_test.go b/lib/services/matchers_test.go index 68c52858ddebb..7238c099d605d 100644 --- a/lib/services/matchers_test.go +++ b/lib/services/matchers_test.go @@ -499,7 +499,7 @@ func TestMatchResourceByFilters(t *testing.T) { { name: "kube cluster", resource: func() types.ResourceWithLabels { - cluster, err := types.NewKubernetesClusterV3FromLegacyCluster("_", &types.KubernetesCluster{ + cluster, err := types.NewKubernetesClusterV3FromLegacyCluster("", &types.KubernetesCluster{ Name: "foo", }) require.NoError(t, err) diff --git a/lib/services/plugin_static_credentials.go b/lib/services/plugin_static_credentials.go index cdb32551ef857..7759df5f933c6 100644 --- a/lib/services/plugin_static_credentials.go +++ b/lib/services/plugin_static_credentials.go @@ -44,6 +44,9 @@ type PluginStaticCredentials interface { // DeletePluginStaticCredentials will delete a plugin static credentials resource. DeletePluginStaticCredentials(ctx context.Context, name string) error + + // GetAllPluginStaticCredentials will get all plugin static credentials. + GetAllPluginStaticCredentials(ctx context.Context) ([]types.PluginStaticCredentials, error) } // MarshalPluginStaticCredentials marshals PluginStaticCredentials resource to JSON. diff --git a/lib/services/plugin_static_credentials_test.go b/lib/services/plugin_static_credentials_test.go index f488d53fcc7a0..792c5cbfec878 100644 --- a/lib/services/plugin_static_credentials_test.go +++ b/lib/services/plugin_static_credentials_test.go @@ -20,6 +20,7 @@ package services import ( "testing" + "time" "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" @@ -45,4 +46,24 @@ func TestMarshalPluginStaticCredentialsRoundTrip(t *testing.T) { unmarshaled, err := UnmarshalPluginStaticCredentials(payload) require.NoError(t, err) require.Empty(t, cmp.Diff(creds, unmarshaled)) + + // TODO(greedy52) PluginStaticCredentials uses protojson for marshaling + // and unmarshaling. Unfortunately Expires (*time.Time) is not supported + // and becomes zero after the marshaling. Unlikely Expires will ever be + // needed for PluginStaticCredentials in production but this can cause + // unexpected issues in other places (like resource.SetExpiry in cache + // tests). + t.Run("with expires", func(t *testing.T) { + t.Skip("PluginStaticCredentials does not marshal Expires") + now := time.Now() + + creds.SetExpiry(now) + payload, err := MarshalPluginStaticCredentials(creds) + require.NoError(t, err) + + unmarshaled, err := UnmarshalPluginStaticCredentials(payload) + require.NoError(t, err) + require.Empty(t, cmp.Diff(creds, unmarshaled)) + require.Equal(t, now, unmarshaled.Expiry()) + }) } diff --git a/lib/services/presets.go b/lib/services/presets.go index 2601730179647..6af90e02110c4 100644 --- a/lib/services/presets.go +++ b/lib/services/presets.go @@ -183,6 +183,7 @@ func NewPresetEditorRole() types.Role { types.NewRule(types.KindStaticHostUser, RW()), types.NewRule(types.KindUserTask, RW()), types.NewRule(types.KindIdentityCenter, RW()), + types.NewRule(types.KindContact, RW()), }, }, }, diff --git a/lib/services/role_test.go b/lib/services/role_test.go index fa3a3a2e3adfd..b76e9c9956f77 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -2478,7 +2478,11 @@ func TestCheckRuleAccess(t *testing.T) { } for j, check := range tc.checks { comment := fmt.Sprintf("test case %v '%v', check %v", i, tc.name, j) - result := set.CheckAccessToRule(&check.context, check.namespace, check.rule, check.verb) + + // At least one scenario exercises "default" vs "system" namespaces. + namespace := check.namespace + + result := set.CheckAccessToRule(&check.context, namespace, check.rule, check.verb) if check.hasAccess { require.NoError(t, result, comment) } else { @@ -2495,7 +2499,6 @@ func TestDefaultImplicitRules(t *testing.T) { type check struct { hasAccess bool verb string - namespace string rule string context testContext } @@ -2508,44 +2511,44 @@ func TestDefaultImplicitRules(t *testing.T) { name: "KindIdentityCenter with NewPresetAccessRole", role: NewPresetAccessRole(), checks: []check{ - {rule: types.KindIdentityCenter, verb: types.VerbRead, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindIdentityCenter, verb: types.VerbList, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindIdentityCenter, verb: types.VerbCreate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindIdentityCenter, verb: types.VerbUpdate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindIdentityCenter, verb: types.VerbDelete, namespace: apidefaults.Namespace, hasAccess: false}, + {rule: types.KindIdentityCenter, verb: types.VerbRead, hasAccess: true}, + {rule: types.KindIdentityCenter, verb: types.VerbList, hasAccess: true}, + {rule: types.KindIdentityCenter, verb: types.VerbCreate, hasAccess: false}, + {rule: types.KindIdentityCenter, verb: types.VerbUpdate, hasAccess: false}, + {rule: types.KindIdentityCenter, verb: types.VerbDelete, hasAccess: false}, }, }, { name: "KindIdentityCenter with a custom role that does not explicitly target read and list verbs for KindIdentityCenterAccount", role: newRole(func(r *types.RoleV6) {}), checks: []check{ - {rule: types.KindIdentityCenter, verb: types.VerbRead, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindIdentityCenter, verb: types.VerbList, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindIdentityCenter, verb: types.VerbCreate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindIdentityCenter, verb: types.VerbUpdate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindIdentityCenter, verb: types.VerbDelete, namespace: apidefaults.Namespace, hasAccess: false}, + {rule: types.KindIdentityCenter, verb: types.VerbRead, hasAccess: true}, + {rule: types.KindIdentityCenter, verb: types.VerbList, hasAccess: true}, + {rule: types.KindIdentityCenter, verb: types.VerbCreate, hasAccess: false}, + {rule: types.KindIdentityCenter, verb: types.VerbUpdate, hasAccess: false}, + {rule: types.KindIdentityCenter, verb: types.VerbDelete, hasAccess: false}, }, }, { name: "KindSAMLIdPServiceProvider with NewPresetAccessRole", role: NewPresetAccessRole(), checks: []check{ - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbRead, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbList, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbCreate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbUpdate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbDelete, namespace: apidefaults.Namespace, hasAccess: false}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbRead, hasAccess: true}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbList, hasAccess: true}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbCreate, hasAccess: false}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbUpdate, hasAccess: false}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbDelete, hasAccess: false}, }, }, { name: "KindSAMLIdPServiceProvider with a custom role that does not explicitly target read and list verbs for KindSAMLIdPServiceProvider", role: newRole(func(r *types.RoleV6) {}), checks: []check{ - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbRead, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbList, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbCreate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbUpdate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbDelete, namespace: apidefaults.Namespace, hasAccess: false}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbRead, hasAccess: true}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbList, hasAccess: true}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbCreate, hasAccess: false}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbUpdate, hasAccess: false}, + {rule: types.KindSAMLIdPServiceProvider, verb: types.VerbDelete, hasAccess: false}, }, }, { @@ -2555,24 +2558,23 @@ func TestDefaultImplicitRules(t *testing.T) { r.Spec.Deny = types.RoleConditions{} }), checks: []check{ - {rule: types.KindGitServer, verb: types.VerbRead, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindGitServer, verb: types.VerbList, namespace: apidefaults.Namespace, hasAccess: true}, - {rule: types.KindGitServer, verb: types.VerbCreate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindGitServer, verb: types.VerbUpdate, namespace: apidefaults.Namespace, hasAccess: false}, - {rule: types.KindGitServer, verb: types.VerbDelete, namespace: apidefaults.Namespace, hasAccess: false}, + {rule: types.KindGitServer, verb: types.VerbRead, hasAccess: true}, + {rule: types.KindGitServer, verb: types.VerbList, hasAccess: true}, + {rule: types.KindGitServer, verb: types.VerbCreate, hasAccess: false}, + {rule: types.KindGitServer, verb: types.VerbUpdate, hasAccess: false}, + {rule: types.KindGitServer, verb: types.VerbDelete, hasAccess: false}, }, }, } for _, tc := range testCases { roleSet := NewRoleSet(tc.role) for _, check := range tc.checks { - result := roleSet.CheckAccessToRule(&check.context, check.namespace, check.rule, check.verb) + result := roleSet.CheckAccessToRule(&check.context, apidefaults.Namespace, check.rule, check.verb) if check.hasAccess { require.NoError(t, result) } else { require.True(t, trace.IsAccessDenied(result)) } - } } } @@ -2749,10 +2751,9 @@ func TestGuessIfAccessIsPossible(t *testing.T) { require.NoError(t, err) type checkAccessParams struct { - ctx Context - namespace string - resource string - verbs []string + ctx Context + resource string + verbs []string } tests := []struct { @@ -2770,9 +2771,8 @@ func TestGuessIfAccessIsPossible(t *testing.T) { name: "global session list/read allowed", roles: RoleSet{readAllSessions}, params: &checkAccessParams{ - namespace: apidefaults.Namespace, - resource: types.KindSession, - verbs: []string{types.VerbList, types.VerbRead}, + resource: types.KindSession, + verbs: []string{types.VerbList, types.VerbRead}, }, wantRuleAccess: true, wantGuessAccess: true, @@ -2781,9 +2781,8 @@ func TestGuessIfAccessIsPossible(t *testing.T) { name: "own session list/read allowed", roles: RoleSet{ownSessions}, // allowed despite "where" clause in allow rules params: &checkAccessParams{ - namespace: apidefaults.Namespace, - resource: types.KindSession, - verbs: []string{types.VerbList, types.VerbRead}, + resource: types.KindSession, + verbs: []string{types.VerbList, types.VerbRead}, }, wantRuleAccess: false, // where condition needs specific resource wantGuessAccess: true, @@ -2792,9 +2791,8 @@ func TestGuessIfAccessIsPossible(t *testing.T) { name: "session list/read denied", roles: RoleSet{allowSSHSessions, denySSHSessions}, // none mention "session" params: &checkAccessParams{ - namespace: apidefaults.Namespace, - resource: types.KindSession, - verbs: []string{types.VerbList, types.VerbRead}, + resource: types.KindSession, + verbs: []string{types.VerbList, types.VerbRead}, }, }, { @@ -2804,18 +2802,16 @@ func TestGuessIfAccessIsPossible(t *testing.T) { allowSSHSessions, denySSHSessions, // none mention "session" }, params: &checkAccessParams{ - namespace: apidefaults.Namespace, - resource: types.KindSession, - verbs: []string{types.VerbUpdate, types.VerbDelete}, + resource: types.KindSession, + verbs: []string{types.VerbUpdate, types.VerbDelete}, }, }, { name: "global SSH session list/read allowed", roles: RoleSet{allowSSHSessions}, params: &checkAccessParams{ - namespace: apidefaults.Namespace, - resource: types.KindSSHSession, - verbs: []string{types.VerbList, types.VerbRead}, + resource: types.KindSSHSession, + verbs: []string{types.VerbList, types.VerbRead}, }, wantRuleAccess: true, wantGuessAccess: true, @@ -2824,9 +2820,8 @@ func TestGuessIfAccessIsPossible(t *testing.T) { name: "own SSH session list/read allowed", roles: RoleSet{ownSSHSessions}, // allowed despite "where" clause in deny rules params: &checkAccessParams{ - namespace: apidefaults.Namespace, - resource: types.KindSSHSession, - verbs: []string{types.VerbList, types.VerbRead}, + resource: types.KindSSHSession, + verbs: []string{types.VerbList, types.VerbRead}, }, wantRuleAccess: false, // where condition needs specific resource wantGuessAccess: true, @@ -2838,9 +2833,8 @@ func TestGuessIfAccessIsPossible(t *testing.T) { denySSHSessions, // unconditional deny, takes precedence }, params: &checkAccessParams{ - namespace: apidefaults.Namespace, - resource: types.KindSSHSession, - verbs: []string{types.VerbCreate, types.VerbList, types.VerbRead, types.VerbUpdate, types.VerbDelete}, + resource: types.KindSSHSession, + verbs: []string{types.VerbCreate, types.VerbList, types.VerbRead, types.VerbUpdate, types.VerbDelete}, }, }, { @@ -2851,9 +2845,8 @@ func TestGuessIfAccessIsPossible(t *testing.T) { ownSSHSessions, }, params: &checkAccessParams{ - namespace: apidefaults.Namespace, - resource: types.KindSSHSession, - verbs: []string{types.VerbCreate, types.VerbList, types.VerbRead, types.VerbUpdate, types.VerbDelete}, + resource: types.KindSSHSession, + verbs: []string{types.VerbCreate, types.VerbList, types.VerbRead, types.VerbUpdate, types.VerbDelete}, }, }, } @@ -2861,12 +2854,12 @@ func TestGuessIfAccessIsPossible(t *testing.T) { t.Run(test.name, func(t *testing.T) { params := test.params for _, verb := range params.verbs { - err := test.roles.CheckAccessToRule(¶ms.ctx, params.namespace, params.resource, verb) + err := test.roles.CheckAccessToRule(¶ms.ctx, apidefaults.Namespace, params.resource, verb) if gotAccess, wantAccess := err == nil, test.wantRuleAccess; gotAccess != wantAccess { t.Errorf("CheckAccessToRule(verb=%q) returned err = %v=q, wantAccess = %v", verb, err, wantAccess) } - err = test.roles.GuessIfAccessIsPossible(¶ms.ctx, params.namespace, params.resource, verb) + err = test.roles.GuessIfAccessIsPossible(¶ms.ctx, apidefaults.Namespace, params.resource, verb) if gotAccess, wantAccess := err == nil, test.wantGuessAccess; gotAccess != wantAccess { t.Errorf("GuessIfAccessIsPossible(verb=%q) returned err = %q, wantAccess = %v", verb, err, wantAccess) } diff --git a/lib/services/unified_resource.go b/lib/services/unified_resource.go index 7c06471b9d3a6..37e081b431945 100644 --- a/lib/services/unified_resource.go +++ b/lib/services/unified_resource.go @@ -20,6 +20,7 @@ package services import ( "context" + "maps" "strings" "sync" "time" @@ -37,6 +38,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/pagination" ) // UnifiedResourceKinds is a list of all kinds that are stored in the unified resource cache. @@ -47,6 +49,8 @@ var UnifiedResourceKinds []string = []string{ types.KindAppServer, types.KindWindowsDesktop, types.KindSAMLIdPServiceProvider, + types.KindIdentityCenterAccount, + types.KindGitServer, } // UnifiedResourceCacheConfig is used to configure a UnifiedResourceCache @@ -352,6 +356,8 @@ type ResourceGetter interface { WindowsDesktopGetter KubernetesServerGetter SAMLIdpServiceProviderGetter + IdentityCenterAccountGetter + GitServerGetter } // newWatcher starts and returns a new resource watcher for unified resources. @@ -383,8 +389,11 @@ func makeResourceSortKey(resource types.Resource) resourceSortKey { // the container type. switch r := resource.(type) { case types.Server: - name = r.GetHostname() + "/" + r.GetName() - kind = types.KindNode + switch r.GetKind() { + case types.KindNode, types.KindGitServer: + name = r.GetHostname() + "/" + r.GetName() + kind = r.GetKind() + } case types.AppServer: app := r.GetApp() if app != nil { @@ -455,6 +464,16 @@ func (c *UnifiedResourceCache) getResourcesAndUpdateCurrent(ctx context.Context) return trace.Wrap(err) } + newICAccounts, err := c.getIdentityCenterAccounts(ctx) + if err != nil { + return trace.Wrap(err) + } + + newGitServers, err := c.getGitServers(ctx) + if err != nil { + return trace.Wrap(err) + } + c.rw.Lock() defer c.rw.Unlock() // empty the trees @@ -470,6 +489,8 @@ func (c *UnifiedResourceCache) getResourcesAndUpdateCurrent(ctx context.Context) putResources[types.KubeServer](c, newKubes) putResources[types.SAMLIdPServiceProvider](c, newSAMLApps) putResources[types.WindowsDesktop](c, newDesktops) + putResources[resource](c, newICAccounts) + putResources[types.Server](c, newGitServers) c.stale = false c.defineCollectorAsInitialized() return nil @@ -581,6 +602,43 @@ func (c *UnifiedResourceCache) getSAMLApps(ctx context.Context) ([]types.SAMLIdP return newSAMLApps, nil } +func (c *UnifiedResourceCache) getIdentityCenterAccounts(ctx context.Context) ([]resource, error) { + var accounts []resource + var pageRequest pagination.PageRequestToken + for { + resultsPage, nextPage, err := c.ListIdentityCenterAccounts(ctx, apidefaults.DefaultChunkSize, &pageRequest) + if err != nil { + return nil, trace.Wrap(err, "getting AWS Identity Center accounts for resource watcher") + } + for _, a := range resultsPage { + accounts = append(accounts, types.Resource153ToUnifiedResource(a)) + } + + if nextPage == pagination.EndOfList { + break + } + pageRequest.Update(nextPage) + } + return accounts, nil +} + +func (c *UnifiedResourceCache) getGitServers(ctx context.Context) (all []types.Server, err error) { + var page []types.Server + nextToken := "" + for { + page, nextToken, err = c.ListGitServers(ctx, apidefaults.DefaultChunkSize, nextToken) + if err != nil { + return nil, trace.Wrap(err, "getting Git servers for unified resource watcher") + } + + all = append(all, page...) + if nextToken == "" { + break + } + } + return all, nil +} + // read applies the supplied closure to either the primary tree or the ttl-based fallback tree depending on // wether or not the cache is currently healthy. locking is handled internally and the passed-in tree should // not be accessed after the closure completes. @@ -670,7 +728,30 @@ func (c *UnifiedResourceCache) processEventsAndUpdateCurrent(ctx context.Context case types.OpDelete: c.deleteLocked(event.Resource) case types.OpPut: - c.putLocked(event.Resource.(resource)) + switch r := event.Resource.(type) { + case resource: + c.putLocked(r) + + case types.Resource153Unwrapper: + // Raw RFD-153 style resources generally have very few methods + // defined on them by design. One way to add complex behavior to + // these resources is to wrap them inside another type that implements + // any methods or interfaces they need. Resources arriving here + // via the cache protocol will have those wrappers stripped away, + // so we unfortunately need to unwrap and re-wrap these values + // to restore them to a useful state. + switch unwrapped := r.Unwrap().(type) { + case IdentityCenterAccount: + c.putLocked(types.Resource153ToUnifiedResource(unwrapped)) + + default: + c.log.Warnf("unsupported Resource153 type %T.", unwrapped) + } + + default: + c.log.Warnf("unsupported Resource type %T.", r) + } + default: c.log.Warnf("unsupported event type %s.", event.Type) continue @@ -879,6 +960,26 @@ func MakePaginatedResource(ctx context.Context, requestType string, r types.Reso RequiresRequest: requiresRequest, } } + case types.KindIdentityCenterAccount: + var err error + protoResource, err = makePaginatedIdentityCenterAccount(resourceKind, resource, requiresRequest) + if err != nil { + return nil, trace.Wrap(err) + } + + case types.KindGitServer: + server, ok := resource.(*types.ServerV2) + if !ok { + return nil, trace.BadParameter("%s has invalid type %T", resourceKind, resource) + } + + protoResource = &proto.PaginatedResource{ + Resource: &proto.PaginatedResource_GitServer{ + GitServer: server, + }, + RequiresRequest: requiresRequest, + } + default: return nil, trace.NotImplemented("resource type %s doesn't support pagination", resource.GetKind()) } @@ -886,6 +987,64 @@ func MakePaginatedResource(ctx context.Context, requestType string, r types.Reso return protoResource, nil } +// makePaginatedIdentityCenterAccount returns a representation of the supplied +// Identity Center account as an App. +func makePaginatedIdentityCenterAccount(resourceKind string, resource types.ResourceWithLabels, requiresRequest bool) (*proto.PaginatedResource, error) { + unwrapper, ok := resource.(types.Resource153Unwrapper) + if !ok { + return nil, trace.BadParameter("%s has invalid type %T", resourceKind, resource) + } + acct, ok := unwrapper.Unwrap().(IdentityCenterAccount) + if !ok { + return nil, trace.BadParameter("%s has invalid inner type %T", resourceKind, resource) + } + srcPSs := acct.GetSpec().GetPermissionSetInfo() + pss := make([]*types.IdentityCenterPermissionSet, len(srcPSs)) + for i, ps := range acct.GetSpec().GetPermissionSetInfo() { + pss[i] = &types.IdentityCenterPermissionSet{ + ARN: ps.Arn, + Name: ps.Name, + AssignmentID: ps.AssignmentId, + } + } + + protoResource := &proto.PaginatedResource{ + Resource: &proto.PaginatedResource_AppServer{ + AppServer: &types.AppServerV3{ + Kind: types.KindAppServer, + Version: types.V3, + Metadata: resource.GetMetadata(), + Spec: types.AppServerSpecV3{ + App: &types.AppV3{ + Kind: types.KindApp, + SubKind: types.KindIdentityCenterAccount, + Version: types.V3, + Metadata: types.Metadata{ + Name: acct.Spec.Name, + Description: acct.Spec.Description, + Labels: maps.Clone(acct.Metadata.Labels), + }, + Spec: types.AppSpecV3{ + URI: acct.Spec.StartUrl, + PublicAddr: acct.Spec.StartUrl, + AWS: &types.AppAWS{ + ExternalID: acct.Spec.Id, + }, + IdentityCenter: &types.AppIdentityCenter{ + AccountID: acct.Spec.Id, + PermissionSets: pss, + }, + }, + }, + }, + }, + }, + RequiresRequest: requiresRequest, + } + + return protoResource, nil +} + // MakePaginatedResources converts a list of resources into a list of paginated proto representations. func MakePaginatedResources(ctx context.Context, requestType string, resources []types.ResourceWithLabels, requestableMap map[string]struct{}) ([]*proto.PaginatedResource, error) { paginatedResources := make([]*proto.PaginatedResource, 0, len(resources)) diff --git a/lib/services/unified_resource_test.go b/lib/services/unified_resource_test.go index 6e27cd2f45a71..344a134e13911 100644 --- a/lib/services/unified_resource_test.go +++ b/lib/services/unified_resource_test.go @@ -35,41 +35,60 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/defaults" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" apimetadata "github.com/gravitational/teleport/api/metadata" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/common" "github.com/gravitational/teleport/api/types/header" "github.com/gravitational/teleport/lib/backend/memory" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/services/local" ) -func TestUnifiedResourceWatcher(t *testing.T) { - t.Parallel() +type client struct { + services.Presence + services.WindowsDesktops + services.SAMLIdPServiceProviders + services.GitServers + services.IdentityCenterAccounts + types.Events +} - ctx := context.Background() +func newClient(t *testing.T) *client { + t.Helper() bk, err := memory.New(memory.Config{}) require.NoError(t, err) - type client struct { - services.Presence - services.WindowsDesktops - services.SAMLIdPServiceProviders - types.Events - } - samlService, err := local.NewSAMLIdPServiceProviderService(bk) require.NoError(t, err) + gitService, err := local.NewGitServerService(bk) + require.NoError(t, err) + icService, err := local.NewIdentityCenterService(local.IdentityCenterServiceConfig{ + Backend: bk, + }) + require.NoError(t, err) - clt := &client{ + return &client{ Presence: local.NewPresenceService(bk), WindowsDesktops: local.NewWindowsDesktopService(bk), SAMLIdPServiceProviders: samlService, Events: local.NewEventsService(bk), + GitServers: gitService, + IdentityCenterAccounts: icService, } +} + +func TestUnifiedResourceWatcher(t *testing.T) { + t.Parallel() + + ctx := context.Background() + clt := newClient(t) + // Add node to the backend. node := newNodeServer(t, "node1", "hostname1", "127.0.0.1:22", false /*tunnel*/) - _, err = clt.UpsertNode(ctx, node) + _, err := clt.UpsertNode(ctx, node) require.NoError(t, err) db, err := types.NewDatabaseV3(types.Metadata{ @@ -89,6 +108,10 @@ func TestUnifiedResourceWatcher(t *testing.T) { require.NoError(t, err) _, err = clt.UpsertDatabaseServer(ctx, dbServer) require.NoError(t, err) + gitServer := newGitServer(t, "my-org") + require.NoError(t, err) + _, err = clt.CreateGitServer(ctx, gitServer) + require.NoError(t, err) w, err := services.NewUnifiedResourceCache(ctx, services.UnifiedResourceCacheConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ @@ -98,10 +121,10 @@ func TestUnifiedResourceWatcher(t *testing.T) { ResourceGetter: clt, }) require.NoError(t, err) - // node and db expected initially + // node, db, and git_server expected initially res, err := w.GetUnifiedResources(ctx) require.NoError(t, err) - require.Len(t, res, 2) + require.Len(t, res, 3) assert.Eventually(t, func() bool { return w.IsInitialized() @@ -142,8 +165,17 @@ func TestUnifiedResourceWatcher(t *testing.T) { err = clt.UpsertWindowsDesktop(ctx, win) require.NoError(t, err) + // add another git server + gitServer2 := newGitServer(t, "my-org-2") + _, err = clt.UpsertGitServer(ctx, gitServer2) + require.NoError(t, err) + + icAcct := newIdentityCenterAccount(t, ctx, clt) + // we expect each of the resources above to exist - expectedRes := []types.ResourceWithLabels{node, app, samlapp, dbServer, win} + expectedRes := []types.ResourceWithLabels{node, app, samlapp, dbServer, win, + gitServer, gitServer2, + types.Resource153ToUnifiedResource(icAcct)} assert.Eventually(t, func() bool { res, err = w.GetUnifiedResources(ctx) return len(res) == len(expectedRes) @@ -156,6 +188,19 @@ func TestUnifiedResourceWatcher(t *testing.T) { cmpopts.IgnoreFields(header.Metadata{}, "Revision"), // Ignore order. cmpopts.SortSlices(func(a, b types.ResourceWithLabels) bool { return a.GetName() < b.GetName() }), + + // Allow comparison of the wrapped resource inside a resource153ToLegacyAdapter + cmp.Transformer("Unwrap", + func(t types.Resource153Unwrapper) types.Resource153 { + return t.Unwrap() + }), + + // Ignore unexported values in RFD153-style resources + cmpopts.IgnoreUnexported( + headerv1.Metadata{}, + identitycenterv1.Account{}, + identitycenterv1.AccountSpec{}, + identitycenterv1.PermissionSetInfo{}), )) // // Update and remove some resources. @@ -166,7 +211,10 @@ func TestUnifiedResourceWatcher(t *testing.T) { require.NoError(t, err) // this should include the updated node, and shouldn't have any apps included - expectedRes = []types.ResourceWithLabels{nodeUpdated, samlapp, dbServer, win} + expectedRes = []types.ResourceWithLabels{nodeUpdated, samlapp, dbServer, win, + gitServer, gitServer2, + types.Resource153ToUnifiedResource(icAcct)} + assert.Eventually(t, func() bool { res, err = w.GetUnifiedResources(ctx) require.NoError(t, err) @@ -182,6 +230,20 @@ func TestUnifiedResourceWatcher(t *testing.T) { cmpopts.EquateEmpty(), cmpopts.IgnoreFields(types.Metadata{}, "Revision"), cmpopts.IgnoreFields(header.Metadata{}, "Revision"), + + // Allow comparison of the wrapped values inside a Resource153ToLegacyAdapter + cmp.Transformer("Unwrap", + func(t types.Resource153Unwrapper) types.Resource153 { + return t.Unwrap() + }), + + // Ignore unexported values in RFD153-style resources + cmpopts.IgnoreUnexported( + headerv1.Metadata{}, + identitycenterv1.Account{}, + identitycenterv1.AccountSpec{}, + identitycenterv1.PermissionSetInfo{}), + // Ignore order. cmpopts.SortSlices(func(a, b types.ResourceWithLabels) bool { return a.GetName() < b.GetName() }), )) @@ -191,26 +253,7 @@ func TestUnifiedResourceWatcher_PreventDuplicates(t *testing.T) { t.Parallel() ctx := context.Background() - - bk, err := memory.New(memory.Config{}) - require.NoError(t, err) - - type client struct { - services.Presence - services.WindowsDesktops - services.SAMLIdPServiceProviders - types.Events - } - - samlService, err := local.NewSAMLIdPServiceProviderService(bk) - require.NoError(t, err) - - clt := &client{ - Presence: local.NewPresenceService(bk), - WindowsDesktops: local.NewWindowsDesktopService(bk), - SAMLIdPServiceProviders: samlService, - Events: local.NewEventsService(bk), - } + clt := newClient(t) w, err := services.NewUnifiedResourceCache(ctx, services.UnifiedResourceCacheConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: teleport.ComponentUnifiedResource, @@ -247,26 +290,7 @@ func TestUnifiedResourceWatcher_DeleteEvent(t *testing.T) { t.Parallel() ctx := context.Background() - - bk, err := memory.New(memory.Config{}) - require.NoError(t, err) - - type client struct { - services.Presence - services.WindowsDesktops - services.SAMLIdPServiceProviders - types.Events - } - - samlService, err := local.NewSAMLIdPServiceProviderService(bk) - require.NoError(t, err) - - clt := &client{ - Presence: local.NewPresenceService(bk), - WindowsDesktops: local.NewWindowsDesktopService(bk), - SAMLIdPServiceProviders: samlService, - Events: local.NewEventsService(bk), - } + clt := newClient(t) w, err := services.NewUnifiedResourceCache(ctx, services.UnifiedResourceCacheConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: teleport.ComponentUnifiedResource, @@ -360,9 +384,17 @@ func TestUnifiedResourceWatcher_DeleteEvent(t *testing.T) { require.NoError(t, err) _, err = clt.UpsertKubernetesServer(ctx, kubeServer) require.NoError(t, err) + + icAcct := newIdentityCenterAccount(t, ctx, clt) + + // add git server + gitServer := newGitServer(t, "my-org") + _, err = clt.CreateGitServer(ctx, gitServer) + require.NoError(t, err) + assert.Eventually(t, func() bool { res, _ := w.GetUnifiedResources(ctx) - return len(res) == 6 + return len(res) == 8 }, 5*time.Second, 10*time.Millisecond, "Timed out waiting for unified resources to be added") // delete everything @@ -378,6 +410,10 @@ func TestUnifiedResourceWatcher_DeleteEvent(t *testing.T) { require.NoError(t, err) err = clt.DeleteKubernetesServer(ctx, kubeServer.Spec.HostID, kubeServer.GetName()) require.NoError(t, err) + err = clt.DeleteIdentityCenterAccount(ctx, services.IdentityCenterAccountID(icAcct.GetMetadata().GetName())) + require.NoError(t, err) + err = clt.DeleteGitServer(ctx, gitServer.GetName()) + require.NoError(t, err) assert.Eventually(t, func() bool { res, _ := w.GetUnifiedResources(ctx) @@ -430,6 +466,16 @@ func newTestEntityDescriptor(entityID string) string { return fmt.Sprintf(testEntityDescriptor, entityID) } +func newGitServer(t *testing.T, githubOrg string) types.Server { + t.Helper() + gitServer, err := types.NewGitHubServer(types.GitHubServerMetadata{ + Organization: githubOrg, + Integration: githubOrg, + }) + require.NoError(t, err) + return gitServer +} + // A test entity descriptor from https://sptest.iamshowcase.com/testsp_metadata.xml. const testEntityDescriptor = ` @@ -440,3 +486,39 @@ const testEntityDescriptor = ` ` + +func newIdentityCenterAccount(t *testing.T, ctx context.Context, svc services.IdentityCenterAccounts) services.IdentityCenterAccount { + t.Helper() + + accountID := t.Name() + + icAcct, err := svc.CreateIdentityCenterAccount(ctx, services.IdentityCenterAccount{ + Account: &identitycenterv1.Account{ + Kind: types.KindIdentityCenterAccount, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: t.Name(), + Labels: map[string]string{ + types.OriginLabel: common.OriginIntegrationAWSOIDC, + }, + }, + Spec: &identitycenterv1.AccountSpec{ + Id: accountID, + Arn: "arn:aws:sso:::account/" + accountID, + Name: "Test AWS Account", + Description: "Used for testing", + PermissionSetInfo: []*identitycenterv1.PermissionSetInfo{ + { + Name: "Alpha", + Arn: "arn:aws:sso:::permissionSet/ssoins-1234567890/ps-alpha", + }, + { + Name: "Beta", + Arn: "arn:aws:sso:::permissionSet/ssoins-1234567890/ps-beta", + }, + }, + }, + }}) + require.NoError(t, err, "creating Identity Center Account") + return icAcct +} diff --git a/lib/services/useracl.go b/lib/services/useracl.go index 5ec6fe73f1ce8..d1511651f8adc 100644 --- a/lib/services/useracl.go +++ b/lib/services/useracl.go @@ -116,6 +116,8 @@ type UserACL struct { AccessGraphSettings ResourceAccess `json:"accessGraphSettings"` // ReviewRequests defines the ability to review requests ReviewRequests bool `json:"reviewRequests"` + // Contact defines the ability to manage contacts + Contact ResourceAccess `json:"contact"` } func hasAccess(roleSet RoleSet, ctx *Context, kind string, verbs ...string) bool { @@ -216,6 +218,8 @@ func NewUserACL(user types.User, userRoles RoleSet, features proto.Features, des securityReports = newAccess(userRoles, ctx, types.KindSecurityReport) } + contact := newAccess(userRoles, ctx, types.KindContact) + return UserACL{ AccessRequests: requestAccess, AppServers: appServerAccess, @@ -257,5 +261,6 @@ func NewUserACL(user types.User, userRoles RoleSet, features proto.Features, des AccessMonitoringRule: accessMonitoringRules, CrownJewel: crownJewelAccess, AccessGraphSettings: accessGraphSettings, + Contact: contact, } } diff --git a/lib/services/useracl_test.go b/lib/services/useracl_test.go index 4bcb6a75763da..9eb19e199007e 100644 --- a/lib/services/useracl_test.go +++ b/lib/services/useracl_test.go @@ -51,6 +51,10 @@ func TestNewUserACL(t *testing.T) { Resources: []string{types.KindIntegration}, Verbs: append(RW(), types.VerbUse), }, + { + Resources: []string{types.KindContact}, + Verbs: RW(), + }, }) // not setting the rule, or explicitly denying, both denies Access @@ -104,6 +108,7 @@ func TestNewUserACL(t *testing.T) { require.True(t, userContext.DesktopSessionRecording) require.Empty(t, cmp.Diff(userContext.License, denied)) require.Empty(t, cmp.Diff(userContext.Download, denied)) + require.Empty(t, cmp.Diff(userContext.Contact, allowedRW)) // test enabling of the 'Use' verb require.Empty(t, cmp.Diff(userContext.Integrations, ResourceAccess{true, true, true, true, true, true})) diff --git a/lib/srv/app/common/audit.go b/lib/srv/app/common/audit.go index 2c745be2b3495..74b140fd83615 100644 --- a/lib/srv/app/common/audit.go +++ b/lib/srv/app/common/audit.go @@ -119,6 +119,7 @@ func (a *audit) OnSessionStart(ctx context.Context, serverID string, identity *t AppURI: app.GetURI(), AppPublicAddr: app.GetPublicAddr(), AppName: app.GetName(), + AppTargetPort: uint32(identity.RouteToApp.TargetPort), }, } return trace.Wrap(a.EmitEvent(ctx, event)) @@ -146,6 +147,7 @@ func (a *audit) OnSessionEnd(ctx context.Context, serverID string, identity *tls AppURI: app.GetURI(), AppPublicAddr: app.GetPublicAddr(), AppName: app.GetName(), + AppTargetPort: uint32(identity.RouteToApp.TargetPort), }, } return trace.Wrap(a.EmitEvent(ctx, event)) @@ -170,6 +172,7 @@ func (a *audit) OnSessionChunk(ctx context.Context, serverID, chunkID string, id AppURI: app.GetURI(), AppPublicAddr: app.GetPublicAddr(), AppName: app.GetName(), + // Session chunks are not created for TCP apps, so there's no need to pass TargetPort here. }, SessionChunkID: chunkID, } diff --git a/lib/srv/app/tcpserver.go b/lib/srv/app/tcpserver.go index 4604f55013b3f..7055c33c09406 100644 --- a/lib/srv/app/tcpserver.go +++ b/lib/srv/app/tcpserver.go @@ -22,12 +22,15 @@ import ( "context" "log/slog" "net" + "slices" + "strconv" "github.com/gravitational/trace" apidefaults "github.com/gravitational/teleport/api/defaults" apitypes "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" + netutils "github.com/gravitational/teleport/api/utils/net" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/srv/app/common" "github.com/gravitational/teleport/lib/tlsca" @@ -42,17 +45,22 @@ type tcpServer struct { // handleConnection handles connection from a TCP application. func (s *tcpServer) handleConnection(ctx context.Context, clientConn net.Conn, identity *tlsca.Identity, app apitypes.Application) error { - addr, err := utils.ParseAddr(app.GetURI()) + uriAddr, err := utils.ParseAddr(app.GetURI()) if err != nil { return trace.Wrap(err) } - if addr.AddrNetwork != "tcp" { - return trace.BadParameter(`unexpected app %q address network, expected "tcp": %+v`, app.GetName(), addr) + if uriAddr.AddrNetwork != "tcp" { + return trace.BadParameter(`unexpected app %q address network, expected "tcp": %+v`, app.GetName(), uriAddr) } + dialer := net.Dialer{ Timeout: apidefaults.DefaultIOTimeout, } - serverConn, err := dialer.DialContext(ctx, addr.AddrNetwork, addr.String()) + dialTarget, err := pickDialTarget(app, uriAddr, identity.RouteToApp.TargetPort) + if err != nil { + return trace.Wrap(err) + } + serverConn, err := dialer.DialContext(ctx, uriAddr.AddrNetwork, dialTarget) if err != nil { return trace.Wrap(err) } @@ -81,3 +89,65 @@ func (s *tcpServer) handleConnection(ctx context.Context, clientConn net.Conn, i } return nil } + +// pickDialTarget returns the address to dial based on the type of the app (single-port vs +// multi-port) and targetPort included in the cert. +// +// For single-port apps it returns the address from the URI field. For multi-port apps, it checks if +// targetPort is included in TCP port ranges from the app spec. +func pickDialTarget(app apitypes.Application, uriAddr *utils.NetAddr, targetPort int) (string, error) { + switch { + // Regular TCP app with port in URI in app spec. + case len(app.GetTCPPorts()) < 1: + if err := ensureZeroTargetPortOrEqualToPortFromURI(uriAddr, targetPort); err != nil { + return "", trace.Wrap(err, "comparing target port against port from URI of app %q", app.GetName()) + } + + return uriAddr.String(), nil + // Multi-port TCP app but target port was not provided. + case targetPort == 0: + // If the client didn't supply a target port, use the first port found in TCP ports. This is to + // provide backwards compatibility. + // + // In theory, this behavior could be removed in the future if we guarantee that all clients + // always send a target port when connecting to multi-port apps, but no such effort was + // undertaken so far. + firstPort := int(app.GetTCPPorts()[0].Port) + return net.JoinHostPort(uriAddr.Host(), strconv.Itoa(firstPort)), nil + // Multi-port TCP app with target port specified in cert. + default: + isTargetPortInTCPPorts := slices.ContainsFunc(app.GetTCPPorts(), func(portRange *apitypes.PortRange) bool { + return netutils.IsPortInRange(int(portRange.Port), int(portRange.EndPort), targetPort) + }) + + if !isTargetPortInTCPPorts { + // This is not treated as an access denied error since there's no RBAC on TCP ports. + return "", trace.BadParameter("port %d is not in TCP ports of app %q", targetPort, app.GetName()) + } + + return net.JoinHostPort(uriAddr.Host(), strconv.Itoa(targetPort)), nil + } +} + +// ensureZeroTargetPortOrEqualToPortFromURI handles an esoteric edge case where a connection to a +// single-port TCP app was made with a cert that includes TargetPort meant for multi-port apps. +// +// This can happen when the cert was generated before the app spec was changed in a way that +// transitioned the app from multi-port to single-port. It can also happen due to a programmer error +// where TargetPort is provided despite the app being single-port. +func ensureZeroTargetPortOrEqualToPortFromURI(uriAddr *utils.NetAddr, targetPort int) error { + if targetPort == 0 { + return nil + } + + uriPort := uriAddr.Port(0) + if uriPort == 0 { + return trace.Errorf("missing or invalid port number in URI %q", uriAddr.String()) + } + + if targetPort != uriPort { + return trace.BadParameter("attempt to connect to a TCP app with a multi-port cert where the target port from the cert does not match the port from the app URI target_port=%d uri_port=%d", targetPort, uriPort) + } + + return nil +} diff --git a/lib/srv/app/transport.go b/lib/srv/app/transport.go index d019af70dbe9f..262ce70626825 100644 --- a/lib/srv/app/transport.go +++ b/lib/srv/app/transport.go @@ -21,12 +21,15 @@ package app import ( "context" "crypto/tls" + "io" "log/slog" "net" "net/http" "net/url" "path" "slices" + "strings" + "time" "github.com/gravitational/trace" @@ -97,6 +100,12 @@ func newTransport(ctx context.Context, c *transportConfig) (*transport, error) { if err != nil { return nil, trace.Wrap(err) } + + // Add a timeout to control how long it takes to (start) getting a response + // from the target server. This allows Teleport to show the user a helpful + // error message when the target service is slow in responding. + tr.ResponseHeaderTimeout = requestTimeout + tr.TLSClientConfig, err = configureTLS(c) if err != nil { return nil, trace.Wrap(err) @@ -143,15 +152,35 @@ func (t *transport) RoundTrip(r *http.Request) (*http.Response, error) { return nil, trace.Wrap(err) } - // Forward the request to the target application and emit an audit event. + // Forward the request to the target application. + // + // If a network error occurred when connecting to the target application, + // log and return a helpful error message to the user and Teleport + // administrator. resp, err := t.tr.RoundTrip(r) + if message, ok := utils.CanExplainNetworkError(err); ok { + if t.log.Enabled(r.Context(), slog.LevelDebug) { + t.log.DebugContext(r.Context(), "application request failed with a network error", + "raw_error", err, "human_error", strings.Join(strings.Fields(message), " ")) + } + + code := trace.ErrorToCode(err) + return &http.Response{ + StatusCode: code, + Status: http.StatusText(code), + Proto: r.Proto, + ProtoMajor: r.ProtoMajor, + ProtoMinor: r.ProtoMinor, + Body: io.NopCloser(strings.NewReader(charWrap(message))), + TLS: r.TLS, + }, nil + } if err != nil { return nil, trace.Wrap(err) } - status := uint32(resp.StatusCode) // Emit the event to the audit log. - if err := sessCtx.Audit.OnRequest(t.closeContext, sessCtx, r, status, nil /*aws endpoint*/); err != nil { + if err := sessCtx.Audit.OnRequest(t.closeContext, sessCtx, r, uint32(resp.StatusCode), nil /*aws endpoint*/); err != nil { return nil, trace.Wrap(err) } @@ -293,3 +322,30 @@ func host(addr string) string { } return host } + +// charWrap wraps a line to about 80 characters to make it easier to read. +func charWrap(message string) string { + var sb strings.Builder + for _, line := range strings.Split(message, "\n") { + var n int + for _, word := range strings.Fields(line) { + sb.WriteString(word) + sb.WriteString(" ") + + n += len(word) + 1 + if n > 80 { + sb.WriteString("\n") + n = 0 + } + } + sb.WriteString("\n") + } + return sb.String() +} + +const ( + // requestTimeout is the timeout to receive a response from the upstream + // server. Start it out large (not to break things) and slowly decrease it + // over time. + requestTimeout = 5 * time.Minute +) diff --git a/lib/srv/authhandlers.go b/lib/srv/authhandlers.go index d80f5704acfe4..0947c6a975709 100644 --- a/lib/srv/authhandlers.go +++ b/lib/srv/authhandlers.go @@ -22,6 +22,7 @@ import ( "context" "encoding/json" "fmt" + "log/slog" "net" "strconv" "time" @@ -30,7 +31,6 @@ import ( "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/prometheus/client_golang/prometheus" - log "github.com/sirupsen/logrus" "golang.org/x/crypto/ssh" "github.com/gravitational/teleport" @@ -123,7 +123,7 @@ func (c *AuthHandlerConfig) CheckAndSetDefaults() error { type AuthHandlers struct { loginChecker - log *log.Entry + log *slog.Logger c *AuthHandlerConfig } @@ -140,7 +140,7 @@ func NewAuthHandlers(config *AuthHandlerConfig) (*AuthHandlers, error) { ah := &AuthHandlers{ c: config, - log: log.WithField(teleport.ComponentKey, config.Component), + log: slog.With(teleport.ComponentKey, config.Component), } ah.loginChecker = &ahLoginChecker{ log: ah.log, @@ -284,10 +284,10 @@ func (h *AuthHandlers) CheckPortForward(addr string, ctx *ServerContext) error { Error: systemErrorMessage, }, }); err != nil { - h.log.WithError(err).Warn("Failed to emit port forward deny audit event.") + h.log.WarnContext(h.c.Server.Context(), "Failed to emit port forward deny audit event", "error", err) } - h.log.Warnf("Port forwarding request denied: %v.", systemErrorMessage) + h.log.WarnContext(h.c.Server.Context(), "Port forwarding request denied", "error", systemErrorMessage) return trace.AccessDenied(userErrorMessage) } @@ -303,28 +303,38 @@ func (h *AuthHandlers) UserKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s fingerprint := fmt.Sprintf("%v %v", key.Type(), sshutils.Fingerprint(key)) // create a new logging entry with info specific to this login attempt - log := h.log.WithField(teleport.ComponentFields, log.Fields{ - "local": conn.LocalAddr(), - "remote": conn.RemoteAddr(), - "user": conn.User(), - "fingerprint": fingerprint, - }) - - cid := fmt.Sprintf("conn(%v->%v, user=%v)", conn.RemoteAddr(), conn.LocalAddr(), conn.User()) - log.Debugf("%v auth attempt", cid) + log := h.log.With( + "local_addr", conn.LocalAddr(), + "remote_addr", conn.RemoteAddr(), + "user", conn.User(), + "fingerprint", fingerprint, + ) cert, ok := key.(*ssh.Certificate) - log.Debugf("%v auth attempt with key %v, %#v", cid, fingerprint, cert) if !ok { - log.Debugf("auth attempt, unsupported key type") + log.DebugContext(ctx, "rejecting auth attempt, unsupported key type") return nil, trace.BadParameter("unsupported key type: %v", fingerprint) } + + log.DebugContext(ctx, "processing auth attempt with key", + slog.Group("cert", + "serial", cert.Serial, + "type", cert.CertType, + "key_id", cert.KeyId, + "valid_principals", cert.ValidPrincipals, + "valid_after", cert.ValidAfter, + "valid_before", cert.ValidBefore, + "permissions", cert.Permissions, + "reserved", cert.Reserved, + ), + ) + if len(cert.ValidPrincipals) == 0 { - log.Debugf("need a valid principal for key") + log.DebugContext(ctx, "rejecting auth attempt without valid principals") return nil, trace.BadParameter("need a valid principal for key %v", fingerprint) } if len(cert.KeyId) == 0 { - log.Debugf("need a valid key ID for key") + log.DebugContext(ctx, "rejecting auth attempt without valid key ID") return nil, trace.BadParameter("need a valid key for key %v", fingerprint) } teleportUser := cert.KeyId @@ -380,7 +390,7 @@ func (h *AuthHandlers) UserKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s message, err, ); err != nil { - h.log.WithError(err).Warn("Failed to append Trace to ConnectionDiagnostic.") + h.log.WarnContext(ctx, "Failed to append Trace to ConnectionDiagnostic", "error", err) } if err := h.c.Emitter.EmitAuditEvent(h.c.Server.Context(), &apievents.AuthAttempt{ @@ -402,7 +412,7 @@ func (h *AuthHandlers) UserKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s Error: err.Error(), }, }); err != nil { - h.log.WithError(err).Warn("Failed to emit failed login audit event.") + h.log.WarnContext(ctx, "Failed to emit failed login audit event", "error", err) } auditdMsg := auditd.Message{ @@ -412,7 +422,7 @@ func (h *AuthHandlers) UserKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s } if err := auditd.SendEvent(auditd.AuditUserErr, auditd.Failed, auditdMsg); err != nil { - log.Warnf("Failed to send an event to auditd: %v", err) + log.WarnContext(ctx, "Failed to send an event to auditd", "error", err) } } @@ -433,7 +443,7 @@ func (h *AuthHandlers) UserKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s recordFailedLogin(err) return nil, trace.Wrap(err) } - log.Debugf("Successfully authenticated") + log.DebugContext(ctx, "Successfully authenticated") clusterName, err := h.c.AccessPoint.GetClusterName() if err != nil { @@ -452,7 +462,7 @@ func (h *AuthHandlers) UserKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s case ssh.HostCert: permissions.Extensions[utils.ExtIntCertType] = utils.ExtIntCertTypeHost default: - log.Warnf("Unexpected cert type: %v", cert.CertType) + log.WarnContext(ctx, "Received unexpected cert type", "cert_type", cert.CertType) } if h.isProxy() { @@ -464,7 +474,7 @@ func (h *AuthHandlers) UserKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s // client's certificate ca, err := h.authorityForCert(types.UserCA, cert.SignatureKey) if err != nil { - log.Errorf("Permission denied: %v", err) + log.ErrorContext(ctx, "Permission denied", "error", err) recordFailedLogin(err) return nil, trace.Wrap(err) } @@ -483,7 +493,7 @@ func (h *AuthHandlers) UserKeyAuth(conn ssh.ConnMetadata, key ssh.PublicKey) (*s err = h.canLoginWithRBAC(cert, ca, clusterName.GetClusterName(), h.c.Server.GetInfo(), teleportUser, conn.User()) } if err != nil { - log.Errorf("Permission denied: %v", err) + log.ErrorContext(ctx, "Permission denied", "error", err) recordFailedLogin(err) return nil, trace.Wrap(err) } @@ -572,7 +582,7 @@ func (h *AuthHandlers) hostKeyCallback(hostname string, remote net.Addr, key ssh // If strict host key checking is not enabled, log that Teleport trusted an // insecure key, but allow the request to go through. - h.log.Warnf("Insecure configuration! Strict host key checking disabled, allowing login without checking host key of type %v.", key.Type()) + h.log.WarnContext(ctx, "Insecure configuration! Strict host key checking disabled, allowing login without checking host key", "key_type", key.Type()) return nil } @@ -591,7 +601,7 @@ func (h *AuthHandlers) IsUserAuthority(cert ssh.PublicKey) bool { // Teleport CA. func (h *AuthHandlers) IsHostAuthority(cert ssh.PublicKey, address string) bool { if _, err := h.authorityForCert(types.HostCA, cert); err != nil { - h.log.Debugf("Unable to find SSH host CA: %v.", err) + h.log.DebugContext(h.c.Server.Context(), "Unable to find SSH host CA", "error", err) return false } return true @@ -607,7 +617,7 @@ type loginChecker interface { } type ahLoginChecker struct { - log *log.Entry + log *slog.Logger c *AuthHandlerConfig } @@ -618,7 +628,7 @@ func (a *ahLoginChecker) canLoginWithRBAC(cert *ssh.Certificate, ca types.CertAu // Use the server's shutdown context. ctx := a.c.Server.Context() - a.log.Debugf("Checking permissions for (%v,%v) to login to node with RBAC checks.", teleportUser, osUser) + a.log.DebugContext(ctx, "Checking permissions for (%v,%v) to login to node with RBAC checks.", teleportUser, osUser) // get roles assigned to this user accessInfo, err := fetchAccessInfo(cert, ca, teleportUser, clusterName) @@ -694,9 +704,9 @@ func fetchAccessInfo(cert *ssh.Certificate, ca types.CertAuthority, teleportUser // Certificate Authority and returns it. func (h *AuthHandlers) authorityForCert(caType types.CertAuthType, key ssh.PublicKey) (types.CertAuthority, error) { // get all certificate authorities for given type - cas, err := h.c.AccessPoint.GetCertAuthorities(context.TODO(), caType, false) + cas, err := h.c.AccessPoint.GetCertAuthorities(h.c.Server.Context(), caType, false) if err != nil { - h.log.Warnf("%v", trace.DebugReport(err)) + h.log.WarnContext(h.c.Server.Context(), "failed retrieving cert authority", "error", err) return nil, trace.Wrap(err) } @@ -705,7 +715,7 @@ func (h *AuthHandlers) authorityForCert(caType types.CertAuthType, key ssh.Publi for i := range cas { checkers, err := sshutils.GetCheckers(cas[i]) if err != nil { - h.log.Warnf("%v", err) + h.log.WarnContext(h.c.Server.Context(), "unable to get cert checker for ca", "ca", cas[i].GetName(), "error", err) return nil, trace.Wrap(err) } for _, checker := range checkers { diff --git a/lib/srv/ctx.go b/lib/srv/ctx.go index 802851d6c7b68..342566dee7a54 100644 --- a/lib/srv/ctx.go +++ b/lib/srv/ctx.go @@ -22,6 +22,7 @@ import ( "context" "fmt" "io" + "log/slog" "net" "os" "strconv" @@ -490,9 +491,11 @@ func NewServerContext(ctx context.Context, parent *sshutils.ConnectionContext, s TeleportUser: child.Identity.TeleportUser, Login: child.Identity.Login, ServerID: child.srv.ID(), - Entry: child.Entry, - Emitter: child.srv, - EmitterContext: ctx, + // TODO(tross) update this to use the child logger + // once ServerContext is converted to use a slog.Logger + Logger: slog.Default(), + Emitter: child.srv, + EmitterContext: ctx, } for _, opt := range monitorOpts { opt(&monitorConfig) diff --git a/lib/srv/db/access_test.go b/lib/srv/db/access_test.go index 37848ea294c8e..0adc9a8b28796 100644 --- a/lib/srv/db/access_test.go +++ b/lib/srv/db/access_test.go @@ -33,7 +33,6 @@ import ( "testing" "time" - gspanner "cloud.google.com/go/spanner" "github.com/ClickHouse/ch-go" cqlclient "github.com/datastax/go-cassandra-native-protocol/client" elastic "github.com/elastic/go-elasticsearch/v8" @@ -81,6 +80,7 @@ import ( "github.com/gravitational/teleport/lib/srv/db/clickhouse" "github.com/gravitational/teleport/lib/srv/db/cloud" "github.com/gravitational/teleport/lib/srv/db/common" + dbconnect "github.com/gravitational/teleport/lib/srv/db/common/connect" "github.com/gravitational/teleport/lib/srv/db/dynamodb" "github.com/gravitational/teleport/lib/srv/db/elasticsearch" "github.com/gravitational/teleport/lib/srv/db/mongodb" @@ -2145,7 +2145,7 @@ func (c *testContext) dynamodbClient(ctx context.Context, teleportUser, dbServic return db, proxy, nil } -func (c *testContext) spannerClient(ctx context.Context, teleportUser, dbService, dbUser, dbName string) (*gspanner.Client, *alpnproxy.LocalProxy, error) { +func (c *testContext) spannerClient(ctx context.Context, teleportUser, dbService, dbUser, dbName string) (*spanner.SpannerTestClient, *alpnproxy.LocalProxy, error) { route := tlsca.RouteToDatabase{ ServiceName: dbService, Protocol: defaults.ProtocolSpanner, @@ -2158,7 +2158,7 @@ func (c *testContext) spannerClient(ctx context.Context, teleportUser, dbService return nil, nil, trace.Wrap(err) } - db, err := spanner.MakeTestClient(ctx, common.TestClientConfig{ + clt, err := spanner.MakeTestClient(ctx, common.TestClientConfig{ AuthClient: c.authClient, AuthServer: c.authServer, Address: proxy.GetAddr(), @@ -2170,7 +2170,7 @@ func (c *testContext) spannerClient(ctx context.Context, teleportUser, dbService return nil, nil, trace.Wrap(err) } - return db, proxy, nil + return clt, proxy, nil } type roleOptFn func(types.Role) @@ -2257,7 +2257,7 @@ func (c *testContext) Close() error { func init() { // Override database agents shuffle behavior to ensure they're always // tried in the same order during tests. Used for HA tests. - SetShuffleFunc(ShuffleSort) + SetShuffleFunc(dbconnect.ShuffleSort) } func setupTestContext(ctx context.Context, t testing.TB, withDatabases ...withDatabaseOption) *testContext { @@ -2389,7 +2389,7 @@ func setupTestContext(ctx context.Context, t testing.TB, withDatabases ...withDa ServerID: testCtx.hostID, Emitter: testCtx.emitter, EmitterContext: ctx, - Logger: utils.NewLoggerForTests(), + Logger: utils.NewSlogLoggerForTests(), }) require.NoError(t, err) @@ -2542,7 +2542,7 @@ func (c *testContext) setupDatabaseServer(ctx context.Context, t testing.TB, p a ServerID: p.HostID, Emitter: c.emitter, EmitterContext: context.Background(), - Logger: utils.NewLoggerForTests(), + Logger: utils.NewSlogLoggerForTests(), }) require.NoError(t, err) diff --git a/lib/srv/db/common/connect/connect.go b/lib/srv/db/common/connect/connect.go new file mode 100644 index 0000000000000..ee8252f78c392 --- /dev/null +++ b/lib/srv/db/common/connect/connect.go @@ -0,0 +1,352 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package connect + +import ( + "context" + "crypto/tls" + "crypto/x509" + "fmt" + "log/slog" + "math/rand/v2" + "net" + "sort" + "strings" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/client/proto" + apidefaults "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/lib/cryptosuites" + "github.com/gravitational/teleport/lib/reversetunnelclient" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" +) + +// DatabaseServersGetter is an interface for retrieving information about +// database proxy servers within a specific namespace. +type DatabaseServersGetter interface { + // GetDatabaseServers returns all registered database proxy servers. + GetDatabaseServers(ctx context.Context, namespace string, opts ...services.MarshalOption) ([]types.DatabaseServer, error) +} + +// GetDatabaseServersParams contains the parameters required to retrieve +// database servers from a specific cluster. +type GetDatabaseServersParams struct { + Logger *slog.Logger + // ClusterName is the cluster name to which the database belongs. + ClusterName string + // DatabaseServersGetter used to fetch the list of database servers. + DatabaseServersGetter DatabaseServersGetter + // Identity contains the identity information. + Identity tlsca.Identity +} + +// GetDatabaseServers returns a list of database servers in a cluster that match +// the routing information from the provided identity. +func GetDatabaseServers(ctx context.Context, params GetDatabaseServersParams) ([]types.DatabaseServer, error) { + servers, err := params.DatabaseServersGetter.GetDatabaseServers(ctx, apidefaults.Namespace) + if err != nil { + return nil, trace.Wrap(err) + } + + params.Logger.DebugContext(ctx, "Available database servers.", "cluster", params.ClusterName, "servers", servers) + + // Find out which database servers proxy the database a user is + // connecting to using routing information from identity. + var result []types.DatabaseServer + for _, server := range servers { + if server.GetDatabase().GetName() == params.Identity.RouteToDatabase.ServiceName { + result = append(result, server) + } + } + + if len(result) != 0 { + return result, nil + } + + return nil, trace.NotFound("database %q not found among registered databases in cluster %q", + params.Identity.RouteToDatabase.ServiceName, + params.Identity.RouteToCluster) +} + +// DatabaseCertificateSigner defines an interface for signing database +// Certificate Signing Requests (CSRs). +type DatabaseCertificateSigner interface { + // SignDatabaseCSR generates a client certificate used by proxy when talking + // to a remote database service. + SignDatabaseCSR(ctx context.Context, req *proto.DatabaseCSRRequest) (*proto.DatabaseCSRResponse, error) +} + +// AuthPreferenceGetter is an interface for retrieving the current configured +// cluster auth preference. +type AuthPreferenceGetter interface { + // GetAuthPreference returns the current cluster auth preference. + GetAuthPreference(context.Context) (types.AuthPreference, error) +} + +// ServerTLSConfigParams contains the parameters required to configure +// a TLS connection to a database server. +type ServerTLSConfigParams struct { + // CertSigner is the interface used to sign certificate signing requests + // for establishing a secure TLS connection. + CertSigner DatabaseCertificateSigner + // AuthPreference provides the authentication preference configuration + // used to determine cryptographic settings for certificate generation. + AuthPreference AuthPreferenceGetter + // Server represents the database server for which the TLS configuration + // is being generated. + Server types.DatabaseServer + // Identity contains the identity information. + Identity tlsca.Identity +} + +// GetServerTLSConfig returns TLS config used for establishing connection +// to a remote database server over reverse tunnel. +func GetServerTLSConfig(ctx context.Context, params ServerTLSConfigParams) (*tls.Config, error) { + privateKey, err := cryptosuites.GenerateKey(ctx, + cryptosuites.GetCurrentSuiteFromAuthPreference(params.AuthPreference), + cryptosuites.ProxyToDatabaseAgent) + if err != nil { + return nil, trace.Wrap(err) + } + + subject, err := params.Identity.Subject() + if err != nil { + return nil, trace.Wrap(err) + } + + csr, err := tlsca.GenerateCertificateRequestPEM(subject, privateKey) + if err != nil { + return nil, trace.Wrap(err) + } + + response, err := params.CertSigner.SignDatabaseCSR(ctx, &proto.DatabaseCSRRequest{ + CSR: csr, + ClusterName: params.Identity.RouteToCluster, + }) + if err != nil { + return nil, trace.Wrap(err) + } + + cert, err := keys.TLSCertificateForSigner(privateKey, response.Cert) + if err != nil { + return nil, trace.Wrap(err) + } + + pool := x509.NewCertPool() + for _, caCert := range response.CACerts { + ok := pool.AppendCertsFromPEM(caCert) + if !ok { + return nil, trace.BadParameter("failed to append CA certificate") + } + } + + return &tls.Config{ + ServerName: params.Server.GetHostname(), + Certificates: []tls.Certificate{cert}, + RootCAs: pool, + }, nil +} + +// ShuffleFunc defines a function that shuffles a list of database servers. +type ShuffleFunc func([]types.DatabaseServer) []types.DatabaseServer + +// ShuffleSort is a ShuffleFunc that sorts database servers by name and host ID. +// Used to provide predictable behavior in tests. +func ShuffleSort(servers []types.DatabaseServer) []types.DatabaseServer { + sort.Sort(types.DatabaseServers(servers)) + return servers +} + +// ShuffleRandom is a ShuffleFunc that randomizes the order of database servers. +// Used to provide load balancing behavior when proxying to multiple agents. +func ShuffleRandom(servers []types.DatabaseServer) []types.DatabaseServer { + rand.Shuffle(len(servers), func(i, j int) { + servers[i], servers[j] = servers[j], servers[i] + }) + return servers +} + +type Dialer interface { + // Dial dials any address within the site network, in terminating + // mode it uses local instance of forwarding server to terminate + // and record the connection. + Dial(params reversetunnelclient.DialParams) (conn net.Conn, err error) +} + +// ConnectParams contains parameters for connecting to the database server. +type ConnectParams struct { + Logger *slog.Logger + // Identity contains the identity information. + Identity tlsca.Identity + // Servers is the list of database servers that can handle the connection. + Servers []types.DatabaseServer + // ShuffleFunc is a function used to shuffle the list of database servers. + ShuffleFunc ShuffleFunc + // Cluster is the cluster name to which the database belongs. + ClusterName string + // Cluster represents the cluster to which the database belongs. + Dialer Dialer + // CertSigner is used to sign certificates for authenticating with the + // database. + CertSigner DatabaseCertificateSigner + // AuthPreference provides the authentication preferences for the cluster. + AuthPreference AuthPreferenceGetter + // ClientSrcAddr is the source address of the client making the connection. + ClientSrcAddr net.Addr + // ClientDstAddr is the destination address of the client making the + // connection. + ClientDstAddr net.Addr +} + +func (p *ConnectParams) CheckAndSetDefaults() error { + if p.Logger != nil { + p.Logger = slog.Default() + } + + if p.Identity.RouteToDatabase.Empty() { + return trace.BadParameter("Identity must have RouteToDatabase information") + } + + if p.ShuffleFunc == nil { + p.ShuffleFunc = ShuffleRandom + } + + if p.ClusterName == "" { + return trace.BadParameter("missing ClusterName parameter") + } + + if p.Dialer == nil { + return trace.BadParameter("missing Dialer parameter") + } + + if p.CertSigner == nil { + return trace.BadParameter("missing CertSigner parameter") + } + + if p.AuthPreference == nil { + return trace.BadParameter("missing AuthPreference parameter") + } + + if p.ClientSrcAddr == nil { + return trace.BadParameter("missing ClientSrcAddr parameter") + } + + if p.ClientDstAddr == nil { + return trace.BadParameter("missing ClientDstAddr parameter") + } + + return nil +} + +// ConnectStats contains statistics about the connection attempts. +type ConnectStats interface { + // GetAttemptedServers retrieves the number of database servers that were + // attempted to connect to. + GetAttemptedServers() int + // GetDialAttempts retrieves the number of times a dial to a server was + // attempted. + GetDialAttempts() int + // GetDialFailures retrieves the number of times a dial to a server failed. + GetDialFailures() int +} + +// Stats implements [ConnectStats]. +type Stats struct { + attemptedServers int + dialAttempts int + dialFailures int +} + +// GetAttemptedServers implements [ConnectStats]. +func (s Stats) GetAttemptedServers() int { + return s.attemptedServers +} + +// GetDialAttempts implements [ConnectStats]. +func (s Stats) GetDialAttempts() int { + return s.dialAttempts +} + +// GetDialFailures implements ConnectStats. +func (s Stats) GetDialFailures() int { + return s.dialFailures +} + +// Connect connects to the database server running on a remote cluster +// over reverse tunnel and upgrades this end of the connection to TLS so +// the identity can be passed over it. +func Connect(ctx context.Context, params ConnectParams) (net.Conn, ConnectStats, error) { + stats := Stats{} + if err := params.CheckAndSetDefaults(); err != nil { + return nil, stats, trace.Wrap(err) + } + + // There may be multiple database servers proxying the same database. If + // we get a connection problem error trying to dial one of them, likely + // the database server is down so try the next one. + for _, server := range params.ShuffleFunc(params.Servers) { + stats.attemptedServers++ + params.Logger.DebugContext(ctx, "Dialing to database service.", "server", server) + tlsConfig, err := GetServerTLSConfig(ctx, ServerTLSConfigParams{ + AuthPreference: params.AuthPreference, + CertSigner: params.CertSigner, + Identity: params.Identity, + Server: server, + }) + if err != nil { + return nil, stats, trace.Wrap(err) + } + + stats.dialAttempts++ + serviceConn, err := params.Dialer.Dial(reversetunnelclient.DialParams{ + From: params.ClientSrcAddr, + To: &utils.NetAddr{AddrNetwork: "tcp", Addr: reversetunnelclient.LocalNode}, + OriginalClientDstAddr: params.ClientDstAddr, + ServerID: fmt.Sprintf("%v.%v", server.GetHostID(), params.ClusterName), + ConnType: types.DatabaseTunnel, + ProxyIDs: server.GetProxyIDs(), + }) + if err != nil { + stats.dialFailures++ + // If an agent is down, we'll retry on the next one (if available). + if isReverseTunnelDownError(err) { + params.Logger.WarnContext(ctx, "Failed to dial database service.", "server", server, "error", err) + continue + } + return nil, stats, trace.Wrap(err) + } + // Upgrade the connection so the client identity can be passed to the + // remote server during TLS handshake. On the remote side, the connection + // received from the reverse tunnel will be handled by tls.Server. + serviceConn = tls.Client(serviceConn, tlsConfig) + return serviceConn, stats, nil + } + + return nil, stats, trace.BadParameter("failed to connect to any of the database servers") +} + +// isReverseTunnelDownError returns true if the provided error indicates that +// the reverse tunnel connection is down e.g. because the agent is down. +func isReverseTunnelDownError(err error) bool { + return trace.IsConnectionProblem(err) || + strings.Contains(err.Error(), reversetunnelclient.NoDatabaseTunnel) +} diff --git a/lib/srv/db/common/connect/connect_test.go b/lib/srv/db/common/connect/connect_test.go new file mode 100644 index 0000000000000..e1b6fa60afd37 --- /dev/null +++ b/lib/srv/db/common/connect/connect_test.go @@ -0,0 +1,308 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package connect + +import ( + "context" + "crypto/tls" + "net" + "net/netip" + "strings" + "testing" + "time" + + "github.com/google/uuid" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/reversetunnelclient" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" +) + +func TestGetDatabaseServers(t *testing.T) { + for name, tc := range map[string]struct { + identity tlsca.Identity + getter *databaseServersMock + expectErrorFunc require.ErrorAssertionFunc + expectedServersLen int + }{ + "match": { + identity: identityWithDatabase("matched-db", "root", "alice", nil), + getter: newDatabaseServersWithServers("no-match", "matched-db", "another-db"), + expectErrorFunc: require.NoError, + expectedServersLen: 1, + }, + "no match": { + identity: identityWithDatabase("no-match", "root", "alice", nil), + getter: newDatabaseServersWithServers("first", "second", "third"), + expectErrorFunc: func(tt require.TestingT, err error, i ...interface{}) { + require.Error(t, err) + require.True(t, trace.IsNotFound(err), "expected trace.NotFound error but got %T", err) + }, + }, + "get server error": { + identity: identityWithDatabase("no-match", "root", "alice", nil), + getter: newDatabaseServersWithErr(trace.Errorf("failure")), + expectErrorFunc: require.Error, + }, + } { + t.Run(name, func(t *testing.T) { + servers, err := GetDatabaseServers(context.Background(), GetDatabaseServersParams{ + Logger: utils.NewSlogLoggerForTests(), + ClusterName: "root", + DatabaseServersGetter: tc.getter, + Identity: tc.identity, + }) + tc.expectErrorFunc(t, err) + require.Len(t, servers, tc.expectedServersLen) + }) + } +} + +func TestGetServerTLSConfig(t *testing.T) { + clusterName := "root" + authServer, err := auth.NewTestAuthServer(auth.TestAuthServerConfig{ + Clock: clockwork.NewFakeClockAt(time.Now()), + ClusterName: clusterName, + AuthPreferenceSpec: &types.AuthPreferenceSpecV2{ + SignatureAlgorithmSuite: types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_BALANCED_V1, + }, + Dir: t.TempDir(), + }) + require.NoError(t, err) + t.Cleanup(func() { require.NoError(t, authServer.Close()) }) + + user, role, err := auth.CreateUserAndRole(authServer.AuthServer, "alice", []string{"db-access"}, nil) + require.NoError(t, err) + + for name, tc := range map[string]struct { + server types.DatabaseServer + identity tlsca.Identity + expectErrorFunc require.ErrorAssertionFunc + expectTLSConfigFunc require.ValueAssertionFunc + }{ + "generates the config": { + server: databaseServerWithName("db", "server1"), + identity: identityWithDatabase("db", clusterName, user.GetName(), []string{role.GetName()}), + expectErrorFunc: require.NoError, + expectTLSConfigFunc: func(tt require.TestingT, tlsConfigI interface{}, _ ...interface{}) { + require.IsType(t, &tls.Config{}, tlsConfigI) + tlsConfig, _ := tlsConfigI.(*tls.Config) + require.Len(t, tlsConfig.Certificates, 1) + + ca, err := tlsca.FromTLSCertificate(tlsConfig.Certificates[0]) + require.NoError(t, err, "failed to extract CA from TLS certificate") + + identity, err := tlsca.FromSubject(ca.Cert.Subject, ca.Cert.NotAfter) + require.NoError(t, err, "failed to convert certificate subject into tlsca.Identity") + require.Equal(t, clusterName, identity.TeleportCluster) + require.ElementsMatch(t, []string{teleport.UsageDatabaseOnly}, identity.Usage) + }, + }, + "failed to generate config due to missing information on identity": { + server: databaseServerWithName("db", "server1"), + identity: tlsca.Identity{}, + expectErrorFunc: require.Error, + expectTLSConfigFunc: require.Nil, + }, + } { + t.Run(name, func(t *testing.T) { + tlsConfig, err := GetServerTLSConfig(context.Background(), ServerTLSConfigParams{ + CertSigner: authServer.AuthServer, + AuthPreference: authServer.AuthServer, + Server: tc.server, + Identity: tc.identity, + }) + tc.expectErrorFunc(t, err) + tc.expectTLSConfigFunc(t, tlsConfig) + }) + } +} + +func TestConnect(t *testing.T) { + clusterName := "root" + authServer, err := auth.NewTestAuthServer(auth.TestAuthServerConfig{ + Clock: clockwork.NewFakeClockAt(time.Now()), + ClusterName: clusterName, + AuthPreferenceSpec: &types.AuthPreferenceSpecV2{ + SignatureAlgorithmSuite: types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_BALANCED_V1, + }, + Dir: t.TempDir(), + }) + require.NoError(t, err) + t.Cleanup(func() { require.NoError(t, authServer.Close()) }) + + user, role, err := auth.CreateUserAndRole(authServer.AuthServer, "alice", []string{"db-access"}, nil) + require.NoError(t, err) + + for name, tc := range map[string]struct { + identity tlsca.Identity + dialer *dialerMock + expectErrFunc require.ErrorAssertionFunc + expectedStats ConnectStats + }{ + "connects": { + identity: identityWithDatabase("db", clusterName, user.GetName(), []string{role.GetName()}), + dialer: newDialerMock(t, authServer.AuthServer, "db", []string{"server-1", "server-2"}, nil), + expectErrFunc: require.NoError, + expectedStats: Stats{attemptedServers: 1, dialAttempts: 1}, + }, + "connects but with dial failures": { + identity: identityWithDatabase("db", clusterName, user.GetName(), []string{role.GetName()}), + // Given the shuffle function, the "server-1" will be attempted first (cause the initial failure). + dialer: newDialerMock(t, authServer.AuthServer, "db", []string{"server-2"}, []string{"server-1"}), + expectErrFunc: require.NoError, + expectedStats: Stats{attemptedServers: 2, dialAttempts: 2, dialFailures: 1}, + }, + "fails to connect": { + identity: identityWithDatabase("db", clusterName, user.GetName(), []string{role.GetName()}), + dialer: newDialerMock(t, authServer.AuthServer, "db", nil, []string{"server-1"}), + expectErrFunc: require.Error, + expectedStats: Stats{attemptedServers: 1, dialAttempts: 1, dialFailures: 1}, + }, + "no servers": { + identity: identityWithDatabase("db", clusterName, user.GetName(), []string{role.GetName()}), + dialer: newDialerMock(t, authServer.AuthServer, "db", nil, nil), + expectErrFunc: require.Error, + expectedStats: Stats{}, + }, + } { + t.Run(name, func(t *testing.T) { + conn, stats, err := Connect(context.Background(), ConnectParams{ + Logger: utils.NewSlogLoggerForTests(), + Identity: tc.identity, + Servers: tc.dialer.getServers(), + ShuffleFunc: ShuffleSort, + ClusterName: clusterName, + Dialer: tc.dialer, + CertSigner: authServer.AuthServer, + AuthPreference: authServer.AuthServer, + ClientSrcAddr: net.TCPAddrFromAddrPort(netip.MustParseAddrPort("0.0.0.0:3000")), + ClientDstAddr: net.TCPAddrFromAddrPort(netip.MustParseAddrPort("0.0.0.0:3000")), + }) + tc.expectErrFunc(t, err) + require.Equal(t, tc.expectedStats, stats) + if conn != nil { + conn.Close() + } + }) + } +} + +func identityWithDatabase(name, clusterName, user string, roles []string) tlsca.Identity { + return tlsca.Identity{ + RouteToCluster: clusterName, + TeleportCluster: clusterName, + Username: user, + Groups: roles, + RouteToDatabase: tlsca.RouteToDatabase{ + ServiceName: name, + Protocol: defaults.ProtocolPostgres, + Username: "postgres", + Database: "postgres", + }, + } +} + +type databaseServersMock struct { + servers []types.DatabaseServer + err error +} + +func databaseServerWithName(name, hostId string) types.DatabaseServer { + return &types.DatabaseServerV3{ + Spec: types.DatabaseServerSpecV3{ + Database: &types.DatabaseV3{ + Metadata: types.Metadata{ + Name: name, + }, + }, + HostID: hostId, + Hostname: name, + }, + } +} + +func newDatabaseServersWithServers(dbNames ...string) *databaseServersMock { + var servers []types.DatabaseServer + for _, name := range dbNames { + servers = append(servers, databaseServerWithName(name, uuid.New().String())) + } + + return &databaseServersMock{servers: servers} +} + +func newDatabaseServersWithErr(err error) *databaseServersMock { + return &databaseServersMock{err: err} +} + +func (d *databaseServersMock) GetDatabaseServers(_ context.Context, _ string, _ ...services.MarshalOption) ([]types.DatabaseServer, error) { + return d.servers, d.err +} + +func newDialerMock(t *testing.T, authServer *auth.Server, dbName string, availableServers []string, unavailableServers []string) *dialerMock { + m := &dialerMock{serverConfig: make(map[string]*tls.Config)} + for _, host := range availableServers { + serverIdentity, err := auth.NewServerIdentity(authServer, host, types.RoleDatabase) + require.NoError(t, err) + tlsConfig, err := serverIdentity.TLSConfig(nil) + require.NoError(t, err) + + m.serverConfig[host] = tlsConfig + m.servers = append(m.servers, databaseServerWithName(dbName, host)) + } + + for _, host := range unavailableServers { + m.servers = append(m.servers, databaseServerWithName(dbName, host)) + } + + return m +} + +type dialerMock struct { + servers []types.DatabaseServer + serverConfig map[string]*tls.Config +} + +func (m *dialerMock) Dial(params reversetunnelclient.DialParams) (conn net.Conn, err error) { + hostID, _, _ := strings.Cut(params.ServerID, ".") + tlsConfig, ok := m.serverConfig[hostID] + if !ok { + return nil, trace.ConnectionProblem(nil, reversetunnelclient.NoDatabaseTunnel) + } + + // Start a fake database server that only performs the TLS handshake. + clt, srv := net.Pipe() + go func() { + defer srv.Close() + conn := tls.Server(srv, tlsConfig) + _ = conn.Handshake() + }() + + return clt, nil +} + +func (m *dialerMock) getServers() []types.DatabaseServer { + return m.servers +} diff --git a/lib/srv/db/proxyserver.go b/lib/srv/db/proxyserver.go index 3a2bacd8610e1..885ab194c048b 100644 --- a/lib/srv/db/proxyserver.go +++ b/lib/srv/db/proxyserver.go @@ -21,16 +21,12 @@ package db import ( "context" "crypto/tls" - "crypto/x509" "errors" - "fmt" "io" "log/slog" "math/rand/v2" "net" - "sort" "strconv" - "strings" "sync" "time" @@ -38,27 +34,23 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/client/proto" - apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" apiutils "github.com/gravitational/teleport/api/utils" - "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/authz" - "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/limiter" "github.com/gravitational/teleport/lib/observability/metrics" "github.com/gravitational/teleport/lib/reversetunnelclient" "github.com/gravitational/teleport/lib/srv/db/common" + "github.com/gravitational/teleport/lib/srv/db/common/connect" "github.com/gravitational/teleport/lib/srv/db/common/enterprise" "github.com/gravitational/teleport/lib/srv/db/dbutils" "github.com/gravitational/teleport/lib/srv/db/mysql" "github.com/gravitational/teleport/lib/srv/db/postgres" "github.com/gravitational/teleport/lib/srv/db/sqlserver" "github.com/gravitational/teleport/lib/srv/ingress" - "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" ) @@ -105,41 +97,22 @@ type ProxyServerConfig struct { MySQLServerVersion string } -// ShuffleFunc defines a function that shuffles a list of database servers. -type ShuffleFunc func([]types.DatabaseServer) []types.DatabaseServer - -// ShuffleRandom is a ShuffleFunc that randomizes the order of database servers. -// Used to provide load balancing behavior when proxying to multiple agents. -func ShuffleRandom(servers []types.DatabaseServer) []types.DatabaseServer { - rand.Shuffle(len(servers), func(i, j int) { - servers[i], servers[j] = servers[j], servers[i] - }) - return servers -} - -// ShuffleSort is a ShuffleFunc that sorts database servers by name and host ID. -// Used to provide predictable behavior in tests. -func ShuffleSort(servers []types.DatabaseServer) []types.DatabaseServer { - sort.Sort(types.DatabaseServers(servers)) - return servers -} - var ( // mu protects the shuffleFunc global access. mu sync.RWMutex // shuffleFunc provides shuffle behavior for multiple database agents. - shuffleFunc ShuffleFunc = ShuffleRandom + shuffleFunc connect.ShuffleFunc = connect.ShuffleRandom ) // SetShuffleFunc sets the shuffle behavior when proxying to multiple agents. -func SetShuffleFunc(fn ShuffleFunc) { +func SetShuffleFunc(fn connect.ShuffleFunc) { mu.Lock() defer mu.Unlock() shuffleFunc = fn } // getShuffleFunc returns the configured function used to shuffle agents. -func getShuffleFunc() ShuffleFunc { +func getShuffleFunc() connect.ShuffleFunc { mu.RLock() defer mu.RUnlock() return shuffleFunc @@ -451,59 +424,38 @@ func (s *ProxyServer) Connect(ctx context.Context, proxyCtx *common.ProxyContext } else { labels = getLabelsFromDB(nil) } - labels["available_db_servers"] = strconv.Itoa(len(proxyCtx.Servers)) - defer observeLatency(connectionSetupTime.With(labels))() - var attemptedServers int + var ( + serviceConn net.Conn + stats connect.ConnectStats + err error + ) + defer func() { - dialAttemptedServers.With(labels).Observe(float64(attemptedServers)) + dialAttemptedServers.With(labels).Observe(float64(stats.GetAttemptedServers())) + dialAttempts.With(labels).Add(float64(stats.GetDialAttempts())) + dialFailures.With(labels).Add(float64(stats.GetDialFailures())) }() - // There may be multiple database servers proxying the same database. If - // we get a connection problem error trying to dial one of them, likely - // the database server is down so try the next one. - for _, server := range getShuffleFunc()(proxyCtx.Servers) { - attemptedServers++ - s.log.DebugContext(ctx, "Dialing to database service.", "server", server) - tlsConfig, err := s.getConfigForServer(ctx, proxyCtx.Identity, server) - if err != nil { - return nil, trace.Wrap(err) - } - - dialAttempts.With(labels).Inc() - serviceConn, err := proxyCtx.Cluster.Dial(reversetunnelclient.DialParams{ - From: clientSrcAddr, - To: &utils.NetAddr{AddrNetwork: "tcp", Addr: reversetunnelclient.LocalNode}, - OriginalClientDstAddr: clientDstAddr, - ServerID: fmt.Sprintf("%v.%v", server.GetHostID(), proxyCtx.Cluster.GetName()), - ConnType: types.DatabaseTunnel, - ProxyIDs: server.GetProxyIDs(), - }) - if err != nil { - dialFailures.With(labels).Inc() - // If an agent is down, we'll retry on the next one (if available). - if isReverseTunnelDownError(err) { - s.log.WarnContext(ctx, "Failed to dial database service.", "server", server, "error", err) - continue - } - return nil, trace.Wrap(err) - } - // Upgrade the connection so the client identity can be passed to the - // remote server during TLS handshake. On the remote side, the connection - // received from the reverse tunnel will be handled by tls.Server. - serviceConn = tls.Client(serviceConn, tlsConfig) - return serviceConn, nil + serviceConn, stats, err = connect.Connect(ctx, connect.ConnectParams{ + Logger: s.log, + Identity: proxyCtx.Identity, + Servers: proxyCtx.Servers, + ShuffleFunc: getShuffleFunc(), + ClusterName: proxyCtx.Cluster.GetName(), + Dialer: proxyCtx.Cluster, + CertSigner: s.cfg.AuthClient, + AuthPreference: s.cfg.AccessPoint, + ClientSrcAddr: clientSrcAddr, + ClientDstAddr: clientDstAddr, + }) + if err != nil { + return nil, trace.Wrap(err) } - return nil, trace.BadParameter("failed to connect to any of the database servers") -} -// isReverseTunnelDownError returns true if the provided error indicates that -// the reverse tunnel connection is down e.g. because the agent is down. -func isReverseTunnelDownError(err error) bool { - return trace.IsConnectionProblem(err) || - strings.Contains(err.Error(), reversetunnelclient.NoDatabaseTunnel) + return serviceConn, nil } // Proxy starts proxying all traffic received from database client between @@ -567,94 +519,28 @@ func (s *ProxyServer) Authorize(ctx context.Context, tlsConn utils.TLSConn, para if params.ClientIP != "" { identity.LoginIP = params.ClientIP } - cluster, servers, err := s.getDatabaseServers(ctx, identity) - if err != nil { - return nil, trace.Wrap(err) - } - return &common.ProxyContext{ - Identity: identity, - Cluster: cluster, - Servers: servers, - AuthContext: authContext, - }, nil -} - -// getDatabaseServers finds database servers that proxy the database instance -// encoded in the provided identity. -func (s *ProxyServer) getDatabaseServers(ctx context.Context, identity tlsca.Identity) (reversetunnelclient.RemoteSite, []types.DatabaseServer, error) { cluster, err := s.cfg.Tunnel.GetSite(identity.RouteToCluster) - if err != nil { - return nil, nil, trace.Wrap(err) - } - accessPoint, err := cluster.CachingAccessPoint() - if err != nil { - return nil, nil, trace.Wrap(err) - } - servers, err := accessPoint.GetDatabaseServers(ctx, apidefaults.Namespace) - if err != nil { - return nil, nil, trace.Wrap(err) - } - s.log.DebugContext(ctx, "Available database servers.", "cluster", cluster.GetName(), "servers", servers) - // Find out which database servers proxy the database a user is - // connecting to using routing information from identity. - var result []types.DatabaseServer - for _, server := range servers { - if server.GetDatabase().GetName() == identity.RouteToDatabase.ServiceName { - result = append(result, server) - } - } - if len(result) != 0 { - return cluster, result, nil - } - return nil, nil, trace.NotFound("database %q not found among registered databases in cluster %q", - identity.RouteToDatabase.ServiceName, - identity.RouteToCluster) -} - -// getConfigForServer returns TLS config used for establishing connection -// to a remote database server over reverse tunnel. -func (s *ProxyServer) getConfigForServer(ctx context.Context, identity tlsca.Identity, server types.DatabaseServer) (*tls.Config, error) { - defer observeLatency(tlsConfigTime.With(getLabelsFromDB(server.GetDatabase())))() - - privateKey, err := cryptosuites.GenerateKey(ctx, - cryptosuites.GetCurrentSuiteFromAuthPreference(s.cfg.AccessPoint), - cryptosuites.ProxyToDatabaseAgent) - if err != nil { - return nil, trace.Wrap(err) - } - subject, err := identity.Subject() if err != nil { return nil, trace.Wrap(err) } - csr, err := tlsca.GenerateCertificateRequestPEM(subject, privateKey) + accessPoint, err := cluster.CachingAccessPoint() if err != nil { return nil, trace.Wrap(err) } - - response, err := s.cfg.AuthClient.SignDatabaseCSR(ctx, &proto.DatabaseCSRRequest{ - CSR: csr, - ClusterName: identity.RouteToCluster, + servers, err := connect.GetDatabaseServers(ctx, connect.GetDatabaseServersParams{ + Logger: s.log, + ClusterName: cluster.GetName(), + DatabaseServersGetter: accessPoint, + Identity: identity, }) if err != nil { return nil, trace.Wrap(err) } - - cert, err := keys.TLSCertificateForSigner(privateKey, response.Cert) - if err != nil { - return nil, trace.Wrap(err) - } - pool := x509.NewCertPool() - for _, caCert := range response.CACerts { - ok := pool.AppendCertsFromPEM(caCert) - if !ok { - return nil, trace.BadParameter("failed to append CA certificate") - } - } - - return &tls.Config{ - ServerName: server.GetHostname(), - Certificates: []tls.Certificate{cert}, - RootCAs: pool, + return &common.ProxyContext{ + Identity: identity, + Cluster: cluster, + Servers: servers, + AuthContext: authContext, }, nil } diff --git a/lib/srv/db/spanner/test.go b/lib/srv/db/spanner/test.go index 4a7b5378766cd..5dcef45959735 100644 --- a/lib/srv/db/spanner/test.go +++ b/lib/srv/db/spanner/test.go @@ -33,6 +33,7 @@ import ( "github.com/sirupsen/logrus" "google.golang.org/api/option" "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" @@ -47,11 +48,35 @@ import ( "github.com/gravitational/teleport/lib/tlsca" ) -func MakeTestClient(ctx context.Context, config common.TestClientConfig) (*spanner.Client, error) { +// SpannerTestClient wraps a [spanner.Client] and provides direct access to the +// underlying [grpc.ClientConn] of the client. +type SpannerTestClient struct { + ClientConn *grpc.ClientConn + *spanner.Client +} + +// WaitForConnectionState waits until the spanner client's underlying gRPC +// connection transitions into the given state or the context expires. +func (c *SpannerTestClient) WaitForConnectionState(ctx context.Context, wantState connectivity.State) error { + for { + s := c.ClientConn.GetState() + if s == wantState { + return nil + } + if s == connectivity.Shutdown { + return trace.Errorf("spanner test client connection has shutdown") + } + if !c.ClientConn.WaitForStateChange(ctx, s) { + return ctx.Err() + } + } +} + +func MakeTestClient(ctx context.Context, config common.TestClientConfig) (*SpannerTestClient, error) { return makeTestClient(ctx, config, false) } -func makeTestClient(ctx context.Context, config common.TestClientConfig, useTLS bool) (*spanner.Client, error) { +func makeTestClient(ctx context.Context, config common.TestClientConfig, useTLS bool) (*SpannerTestClient, error) { databaseID, err := getDatabaseID(ctx, config.RouteToDatabase, config.AuthServer) if err != nil { return nil, trace.Wrap(err) @@ -68,25 +93,29 @@ func makeTestClient(ctx context.Context, config common.TestClientConfig, useTLS transportOpt = grpc.WithTransportCredentials(insecure.NewCredentials()) } + cc, err := grpc.NewClient(config.Address, transportOpt) + if err != nil { + return nil, trace.Wrap(err) + } + opts := []option.ClientOption{ - // dial with custom transport security - option.WithGRPCDialOption(transportOpt), - // create 1 connection - option.WithGRPCConnectionPool(1), - // connect to the Teleport endpoint - option.WithEndpoint(config.Address), + option.WithGRPCConn(cc), // client should not bring any GCP credentials option.WithoutAuthentication(), } clientCfg := spanner.ClientConfig{ - SessionPoolConfig: spanner.DefaultSessionPoolConfig, + DisableNativeMetrics: true, + SessionPoolConfig: spanner.DefaultSessionPoolConfig, } clt, err := spanner.NewClientWithConfig(ctx, databaseID, clientCfg, opts...) if err != nil { return nil, trace.Wrap(err) } - return clt, nil + return &SpannerTestClient{ + ClientConn: cc, + Client: clt, + }, nil } func getDatabaseID(ctx context.Context, route tlsca.RouteToDatabase, getter services.DatabaseServersGetter) (string, error) { diff --git a/lib/srv/db/spanner_test.go b/lib/srv/db/spanner_test.go index ca78f856b89e6..4af7fbdb46cb8 100644 --- a/lib/srv/db/spanner_test.go +++ b/lib/srv/db/spanner_test.go @@ -28,6 +28,7 @@ import ( gspanner "cloud.google.com/go/spanner" "github.com/stretchr/testify/require" + "google.golang.org/grpc/connectivity" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/events" @@ -234,7 +235,15 @@ func TestAuditSpanner(t *testing.T) { _ = localProxy.Close() }) - require.NoError(t, err) + require.NoError(t, clt.WaitForConnectionState(ctx, connectivity.Ready)) + reconnectingCh := make(chan bool) + go func() { + // we should observe the connection leave the "ready" state after + // it gets an access denied error. + ctx, cancel := context.WithTimeout(ctx, time.Second*10) + defer cancel() + reconnectingCh <- clt.ClientConn.WaitForStateChange(ctx, connectivity.Ready) + }() row, err := pingSpanner(ctx, clt, 42) require.Error(t, err) @@ -246,6 +255,7 @@ func TestAuditSpanner(t *testing.T) { require.True(t, ok) require.Equal(t, "googlesql", dbStart1.DatabaseName) + require.True(t, <-reconnectingCh, "timed out waiting for the spanner client to reconnect") row, err = pingSpanner(ctx, clt, 42) require.Error(t, err) require.ErrorContains(t, err, "access to db denied") @@ -308,7 +318,7 @@ func TestAuditSpanner(t *testing.T) { }) } -func pingSpanner(ctx context.Context, clt *gspanner.Client, want int64) (*gspanner.Row, error) { +func pingSpanner(ctx context.Context, clt *spanner.SpannerTestClient, want int64) (*gspanner.Row, error) { query := gspanner.NewStatement(fmt.Sprintf("SELECT %d", want)) rowIter := clt.Single().Query(ctx, query) defer rowIter.Stop() diff --git a/lib/srv/desktop/rdp/rdpclient/Cargo.toml b/lib/srv/desktop/rdp/rdpclient/Cargo.toml index 82eb2ecd38670..72a6dbb2dd02f 100644 --- a/lib/srv/desktop/rdp/rdpclient/Cargo.toml +++ b/lib/srv/desktop/rdp/rdpclient/Cargo.toml @@ -38,11 +38,11 @@ tokio-boring = { git = "https://github.com/gravitational/boring", rev="99897308a utf16string = "0.2.0" uuid = { version = "1.11.0", features = ["v4"] } url = "2.5.0" -picky = { version = "7.0.0-rc.9", default-features = false } +picky = { version = "7.0.0-rc.11", default-features = false } picky-asn1-der = "0.5.0" picky-asn1-x509 = "0.13.0" reqwest = { version = "0.12", default-features = false } -rustls = { version = "0.23.18", default-features = false, features = ["ring"] } +rustls = { version = "0.23.18", default-features = false, features = ["aws-lc-rs"] } [build-dependencies] cbindgen = "0.27.0" diff --git a/lib/srv/desktop/rdp/rdpclient/src/client.rs b/lib/srv/desktop/rdp/rdpclient/src/client.rs index d98c800a356e1..6ee16f0b16624 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/client.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/client.rs @@ -64,7 +64,7 @@ use std::error::Error; use std::fmt::{Debug, Display, Formatter}; use std::io::{Error as IoError, ErrorKind as IoErrorKind}; use std::net::ToSocketAddrs; -use std::sync::{Arc, Mutex, MutexGuard, Once}; +use std::sync::{Arc, Mutex, MutexGuard}; use std::time::Duration; use tokio::io::{split, ReadHalf, WriteHalf}; use tokio::net::TcpStream as TokioTcpStream; @@ -81,8 +81,6 @@ use url::Url; const RDP_CONNECT_TIMEOUT: Duration = Duration::from_secs(5); -static START: Once = Once::new(); - /// The "Microsoft::Windows::RDS::DisplayControl" DVC is opened /// by the server. Until it does so, we withhold the latest screen /// resize, and only send it once we're notified that the DVC is open. @@ -127,12 +125,6 @@ impl Client { /// Initializes the RDP connection with the given [`ConnectParams`]. async fn connect(cgo_handle: CgoHandle, params: ConnectParams) -> ClientResult { - START.call_once(|| { - // we register provider explicitly to avoid panics when both ring and aws_lc - // features of rustls are enabled, which happens often in dependencies like tokio-tls - // and reqwest - let _ = rustls::crypto::ring::default_provider().install_default(); - }); let server_addr = params.addr.clone(); let server_socket_addr = server_addr .to_socket_addrs()? diff --git a/lib/srv/desktop/windows_server.go b/lib/srv/desktop/windows_server.go index 7196425b79bff..9d42bdcf74333 100644 --- a/lib/srv/desktop/windows_server.go +++ b/lib/srv/desktop/windows_server.go @@ -1000,7 +1000,7 @@ func (s *WindowsService) connectRDP(ctx context.Context, log *slog.Logger, tdpCo Clock: s.cfg.Clock, ClientIdleTimeout: authCtx.Checker.AdjustClientIdleTimeout(netConfig.GetClientIdleTimeout()), DisconnectExpiredCert: authCtx.GetDisconnectCertExpiry(authPref), - Entry: logrus.NewEntry(logrus.StandardLogger()), + Logger: s.cfg.Logger, Emitter: s.cfg.Emitter, EmitterContext: s.closeCtx, LockWatcher: s.cfg.LockWatcher, diff --git a/lib/srv/discovery/discovery.go b/lib/srv/discovery/discovery.go index 2f8c4d097b845..3138ccc052f52 100644 --- a/lib/srv/discovery/discovery.go +++ b/lib/srv/discovery/discovery.go @@ -30,12 +30,11 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3" - awsv2 "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/ec2" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" + "github.com/aws/aws-sdk-go-v2/service/ssm" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" "github.com/aws/aws-sdk-go/aws/session" - "github.com/aws/aws-sdk-go/service/ssm" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/sirupsen/logrus" @@ -116,6 +115,8 @@ type Config struct { CloudClients cloud.Clients // GetEC2Client gets an AWS EC2 client for the given region. GetEC2Client server.EC2ClientGetter + // GetSSMClient gets an AWS SSM client for the given region. + GetSSMClient func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (server.SSMClient, error) // IntegrationOnlyCredentials discards any Matcher that don't have an Integration. // When true, ambient credentials (used by the Cloud SDKs) are not used. IntegrationOnlyCredentials bool @@ -221,32 +222,22 @@ kubernetes matchers are present.`) } if c.GetEC2Client == nil { c.GetEC2Client = func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (ec2.DescribeInstancesAPIClient, error) { - opts = append(opts, config.WithAWSIntegrationCredentialProvider(func(ctx context.Context, region, integrationName string) (awsv2.CredentialsProvider, error) { - integration, err := c.AccessPoint.GetIntegration(ctx, integrationName) - if err != nil { - return nil, trace.Wrap(err) - } - if integration.GetAWSOIDCIntegrationSpec() == nil { - return nil, trace.BadParameter("integration does not have aws oidc spec fields %q", integrationName) - } - token, err := c.AccessPoint.GenerateAWSOIDCToken(ctx, integrationName) - if err != nil { - return nil, trace.Wrap(err) - } - cred, err := awsoidc.NewAWSCredentialsProvider(ctx, &awsoidc.AWSClientRequest{ - Token: token, - RoleARN: integration.GetAWSOIDCIntegrationSpec().RoleARN, - Region: region, - }) - return cred, trace.Wrap(err) - })) - cfg, err := config.GetAWSConfig(ctx, region, opts...) + cfg, err := c.getAWSConfig(ctx, region, opts...) if err != nil { return nil, trace.Wrap(err) } return ec2.NewFromConfig(cfg), nil } } + if c.GetSSMClient == nil { + c.GetSSMClient = func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (server.SSMClient, error) { + cfg, err := c.getAWSConfig(ctx, region, opts...) + if err != nil { + return nil, trace.Wrap(err) + } + return ssm.NewFromConfig(cfg), nil + } + } if c.KubernetesClient == nil && len(c.Matchers.Kubernetes) > 0 { cfg, err := rest.InClusterConfig() if err != nil { @@ -302,6 +293,30 @@ kubernetes matchers are present.`) return nil } +func (c *Config) getAWSConfig(ctx context.Context, region string, opts ...config.AWSOptionsFn) (aws.Config, error) { + opts = append(opts, config.WithAWSIntegrationCredentialProvider(func(ctx context.Context, region, integrationName string) (aws.CredentialsProvider, error) { + integration, err := c.AccessPoint.GetIntegration(ctx, integrationName) + if err != nil { + return nil, trace.Wrap(err) + } + if integration.GetAWSOIDCIntegrationSpec() == nil { + return nil, trace.BadParameter("integration does not have aws oidc spec fields %q", integrationName) + } + token, err := c.AccessPoint.GenerateAWSOIDCToken(ctx, integrationName) + if err != nil { + return nil, trace.Wrap(err) + } + cred, err := awsoidc.NewAWSCredentialsProvider(ctx, &awsoidc.AWSClientRequest{ + Token: token, + RoleARN: integration.GetAWSOIDCIntegrationSpec().RoleARN, + Region: region, + }) + return cred, trace.Wrap(err) + })) + cfg, err := config.GetAWSConfig(ctx, region, opts...) + return cfg, trace.Wrap(err) +} + // Server is a discovery server, used to discover cloud resources for // inclusion in Teleport type Server struct { @@ -863,7 +878,7 @@ func genEC2InstancesLogStr(instances []server.EC2Instance) string { func genAzureInstancesLogStr(instances []*armcompute.VirtualMachine) string { return genInstancesLogStr(instances, func(i *armcompute.VirtualMachine) string { - return aws.StringValue(i.Name) + return aws.ToString(i.Name) }) } @@ -1019,9 +1034,9 @@ func (s *Server) heartbeatEICEInstance(instances *server.EC2Instances) { func (s *Server) handleEC2RemoteInstallation(instances *server.EC2Instances) error { // TODO(gavin): support assume_role_arn for ec2. - ec2Client, err := s.CloudClients.GetAWSSSMClient(s.ctx, + ssmClient, err := s.GetSSMClient(s.ctx, instances.Region, - cloud.WithCredentialsMaybeIntegration(instances.Integration), + config.WithCredentialsMaybeIntegration(instances.Integration), ) if err != nil { return trace.Wrap(err) @@ -1031,7 +1046,7 @@ func (s *Server) handleEC2RemoteInstallation(instances *server.EC2Instances) err req := server.SSMRunRequest{ DocumentName: instances.DocumentName, - SSM: ec2Client, + SSM: ssmClient, Instances: instances.Instances, Params: instances.Parameters, Region: instances.Region, @@ -1070,8 +1085,8 @@ func (s *Server) handleEC2RemoteInstallation(instances *server.EC2Instances) err } func (s *Server) logHandleInstancesErr(err error) { - var aErr awserr.Error - if errors.As(err, &aErr) && aErr.Code() == ssm.ErrCodeInvalidInstanceId { + var instanceIDErr *ssmtypes.InvalidInstanceId + if errors.As(err, &instanceIDErr) { const errorMessage = "SSM SendCommand failed with ErrCodeInvalidInstanceId. " + "Make sure that the instances have AmazonSSMManagedInstanceCore policy assigned. " + "Also check that SSM agent is running and registered with the SSM endpoint on that instance and try restarting or reinstalling it in case of issues. " + @@ -1210,7 +1225,7 @@ outer: for _, node := range nodes { var vmID string if inst.Properties != nil { - vmID = aws.StringValue(inst.Properties.VMID) + vmID = aws.ToString(inst.Properties.VMID) } match := types.MatchLabels(node, map[string]string{ types.SubscriptionIDLabel: instances.SubscriptionID, diff --git a/lib/srv/discovery/discovery_test.go b/lib/srv/discovery/discovery_test.go index 8c9c08b0aff95..7f569caee654b 100644 --- a/lib/srv/discovery/discovery_test.go +++ b/lib/srv/discovery/discovery_test.go @@ -39,15 +39,14 @@ import ( awsv2 "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/ec2" ec2types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + "github.com/aws/aws-sdk-go-v2/service/ssm" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/service/eks" "github.com/aws/aws-sdk-go/service/eks/eksiface" "github.com/aws/aws-sdk-go/service/rds" "github.com/aws/aws-sdk-go/service/redshift" - "github.com/aws/aws-sdk-go/service/ssm" - "github.com/aws/aws-sdk-go/service/ssm/ssmiface" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/google/uuid" @@ -98,26 +97,19 @@ func TestMain(m *testing.M) { } type mockSSMClient struct { - ssmiface.SSMAPI + server.SSMClient commandOutput *ssm.SendCommandOutput invokeOutput *ssm.GetCommandInvocationOutput } -func (sm *mockSSMClient) SendCommandWithContext(_ context.Context, input *ssm.SendCommandInput, _ ...request.Option) (*ssm.SendCommandOutput, error) { +func (sm *mockSSMClient) SendCommand(_ context.Context, input *ssm.SendCommandInput, _ ...func(*ssm.Options)) (*ssm.SendCommandOutput, error) { return sm.commandOutput, nil } -func (sm *mockSSMClient) GetCommandInvocationWithContext(_ context.Context, input *ssm.GetCommandInvocationInput, _ ...request.Option) (*ssm.GetCommandInvocationOutput, error) { +func (sm *mockSSMClient) GetCommandInvocation(_ context.Context, input *ssm.GetCommandInvocationInput, _ ...func(*ssm.Options)) (*ssm.GetCommandInvocationOutput, error) { return sm.invokeOutput, nil } -func (sm *mockSSMClient) WaitUntilCommandExecutedWithContext(aws.Context, *ssm.GetCommandInvocationInput, ...request.WaiterOption) error { - if aws.StringValue(sm.commandOutput.Command.Status) == ssm.CommandStatusFailed { - return awserr.New(request.WaiterResourceNotReadyErrorCode, "err", nil) - } - return nil -} - type mockEmitter struct { eventHandler func(*testing.T, events.AuditEvent, *Server) server *Server @@ -325,13 +317,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{ @@ -347,7 +339,7 @@ func TestDiscoveryServer(t *testing.T) { InstanceID: "instance-id-1", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), }, ae) }, }, @@ -383,13 +375,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, staticMatchers: defaultStaticMatcher, @@ -424,13 +416,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{}, @@ -443,13 +435,13 @@ func TestDiscoveryServer(t *testing.T) { foundEC2Instances: genEC2Instances(58), ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{}, @@ -473,13 +465,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{ @@ -495,7 +487,7 @@ func TestDiscoveryServer(t *testing.T) { InstanceID: "instance-id-1", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), }, ae) }, }, @@ -520,13 +512,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, emitter: &mockEmitter{ @@ -542,7 +534,7 @@ func TestDiscoveryServer(t *testing.T) { InstanceID: "instance-id-1", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), }, ae) }, }, @@ -582,13 +574,13 @@ func TestDiscoveryServer(t *testing.T) { }, ssm: &mockSSMClient{ commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), + Command: &ssmtypes.Command{ + CommandId: awsv2.String("command-id-1"), }, }, invokeOutput: &ssm.GetCommandInvocationOutput{ - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, ssmRunError: trace.BadParameter("ssm run failed"), @@ -605,7 +597,7 @@ func TestDiscoveryServer(t *testing.T) { InstanceID: "instance-id-1", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), }, ae) }, }, @@ -640,9 +632,6 @@ func TestDiscoveryServer(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Parallel() - testCloudClients := &cloud.TestCloudClients{ - SSM: tc.ssm, - } ec2Client := &mockEC2Client{output: &ec2.DescribeInstancesOutput{ Reservations: []ec2types.Reservation{ { @@ -691,10 +680,12 @@ func TestDiscoveryServer(t *testing.T) { } server, err := New(authz.ContextWithUser(context.Background(), identity.I), &Config{ - CloudClients: testCloudClients, GetEC2Client: func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (ec2.DescribeInstancesAPIClient, error) { return ec2Client, nil }, + GetSSMClient: func(ctx context.Context, region string, opts ...config.AWSOptionsFn) (server.SSMClient, error) { + return tc.ssm, nil + }, ClusterFeatures: func() proto.Features { return proto.Features{} }, KubernetesClient: fake.NewSimpleClientset(), AccessPoint: getDiscoveryAccessPoint(tlsServer.Auth(), authClient), diff --git a/lib/srv/heartbeat.go b/lib/srv/heartbeat.go index 639f6581e1e31..82ea1eafacca2 100644 --- a/lib/srv/heartbeat.go +++ b/lib/srv/heartbeat.go @@ -21,11 +21,11 @@ package srv import ( "context" "fmt" + "log/slog" "time" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - log "github.com/sirupsen/logrus" "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/types" @@ -155,14 +155,17 @@ func NewHeartbeat(cfg HeartbeatConfig) (*Heartbeat, error) { cancelCtx: ctx, cancel: cancel, HeartbeatConfig: cfg, - Entry: log.WithFields(log.Fields{ - teleport.ComponentKey: teleport.Component(cfg.Component, "beat"), - }), - checkTicker: cfg.Clock.NewTicker(cfg.CheckPeriod), - announceC: make(chan struct{}, 1), - sendC: make(chan struct{}, 1), + logger: slog.With(teleport.ComponentKey, teleport.Component(cfg.Component, "beat")), + checkTicker: cfg.Clock.NewTicker(cfg.CheckPeriod), + announceC: make(chan struct{}, 1), + sendC: make(chan struct{}, 1), } - h.Debugf("Starting %v heartbeat with announce period: %v, keep-alive period %v, poll period: %v", cfg.Mode, cfg.KeepAlivePeriod, cfg.AnnouncePeriod, cfg.CheckPeriod) + h.logger.DebugContext(ctx, "Starting heartbeat with announce period", + "mode", cfg.Mode, + "keep_alive_period", cfg.KeepAlivePeriod, + "announce_period", cfg.AnnouncePeriod, + "check_period", cfg.CheckPeriod, + ) return h, nil } @@ -249,7 +252,7 @@ type Heartbeat struct { HeartbeatConfig cancelCtx context.Context cancel context.CancelFunc - *log.Entry + logger *slog.Logger state KeepAliveState current types.Resource keepAlive *types.KeepAlive @@ -280,15 +283,15 @@ func (h *Heartbeat) Run() error { for { err := h.fetchAndAnnounce() if err != nil { - h.Warningf("Heartbeat failed %v.", err) + h.logger.WarnContext(h.Context, "Heartbeat failed", "error", err) } h.OnHeartbeat(err) select { case <-h.checkTicker.Chan(): case <-h.sendC: - h.Debugf("Asked check out of cycle") + h.logger.DebugContext(h.Context, "Asked check out of cycle") case <-h.cancelCtx.Done(): - h.Debugf("Heartbeat exited.") + h.logger.DebugContext(h.Context, "Heartbeat exited") return nil } } @@ -324,7 +327,7 @@ func (h *Heartbeat) reset(state KeepAliveState) { h.keepAlive = nil if h.keepAliver != nil { if err := h.keepAliver.Close(); err != nil { - h.Warningf("Failed to close keep aliver: %v", err) + h.logger.WarnContext(h.Context, "Failed to close keep aliver", "error", err) } h.keepAliver = nil } @@ -590,7 +593,7 @@ func (h *Heartbeat) announce() error { case <-h.cancelCtx.Done(): return nil case <-timeout.C: - h.Warningf("Blocked on keep alive send, going to reset.") + h.logger.WarnContext(h.Context, "Blocked on keep alive send, going to reset.") h.reset(HeartbeatStateInit) return trace.ConnectionProblem(nil, "timeout sending keep alive") case h.keepAliver.KeepAlives() <- keepAlive: @@ -599,7 +602,7 @@ func (h *Heartbeat) announce() error { h.setState(HeartbeatStateKeepAliveWait) return nil case <-h.keepAliver.Done(): - h.Warningf("Keep alive has failed: %v.", h.keepAliver.Error()) + h.logger.WarnContext(h.Context, "Keep alive has failed", "error", h.keepAliver.Error()) err := h.keepAliver.Error() h.reset(HeartbeatStateInit) return trace.ConnectionProblem(err, "keep alive channel closed") diff --git a/lib/srv/heartbeatv2.go b/lib/srv/heartbeatv2.go index 7a95020e7a31d..299c1b274e09c 100644 --- a/lib/srv/heartbeatv2.go +++ b/lib/srv/heartbeatv2.go @@ -21,10 +21,10 @@ package srv import ( "context" "errors" + "log/slog" "time" "github.com/gravitational/trace" - log "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -559,12 +559,12 @@ func (h *sshServerHeartbeatV2) FallbackAnnounce(ctx context.Context) (ok bool) { } server, err := h.getServer(ctx) if err != nil { - log.Warnf("Failed to perform fallback heartbeat for ssh server: %v", err) + slog.WarnContext(ctx, "Failed to perform fallback heartbeat for ssh server", "error", err) return false } if _, err := h.announcer.UpsertNode(ctx, server); err != nil { - log.Warnf("Failed to perform fallback heartbeat for ssh server: %v", err) + slog.WarnContext(ctx, "Failed to perform fallback heartbeat for ssh server", "error", err) return false } @@ -575,12 +575,12 @@ func (h *sshServerHeartbeatV2) FallbackAnnounce(ctx context.Context) (ok bool) { func (h *sshServerHeartbeatV2) Announce(ctx context.Context, sender inventory.DownstreamSender) (ok bool) { server, err := h.getServer(ctx) if err != nil { - log.Warnf("Failed to perform inventory heartbeat for ssh server: %v", err) + slog.WarnContext(ctx, "Failed to perform inventory heartbeat for ssh server", "error", err) return false } if err := sender.Send(ctx, proto.InventoryHeartbeat{SSHServer: apiutils.CloneProtoMsg(server)}); err != nil { - log.Warnf("Failed to perform inventory heartbeat for ssh server: %v", err) + slog.WarnContext(ctx, "Failed to perform inventory heartbeat for ssh server", "error", err) return false } h.prev = server @@ -617,13 +617,13 @@ func (h *appServerHeartbeatV2) FallbackAnnounce(ctx context.Context) (ok bool) { } server, err := h.getServer(ctx) if err != nil { - log.Warnf("Failed to perform fallback heartbeat for app server: %v", err) + slog.WarnContext(ctx, "Failed to perform fallback heartbeat for app server", "error", err) return false } if _, err := h.announcer.UpsertApplicationServer(ctx, server); err != nil { if !errors.Is(err, context.Canceled) && status.Code(err) != codes.Canceled { - log.Warnf("Failed to perform fallback heartbeat for app server: %v", err) + slog.WarnContext(ctx, "Failed to perform fallback heartbeat for app server", "error", err) } return false } @@ -645,13 +645,13 @@ func (h *appServerHeartbeatV2) Announce(ctx context.Context, sender inventory.Do server, err := h.getServer(ctx) if err != nil { - log.Warnf("Failed to perform inventory heartbeat for app server: %v", err) + slog.WarnContext(ctx, "Failed to perform inventory heartbeat for app server", "error", err) return false } if err := sender.Send(ctx, proto.InventoryHeartbeat{AppServer: apiutils.CloneProtoMsg(server)}); err != nil { if !errors.Is(err, context.Canceled) && status.Code(err) != codes.Canceled { - log.Warnf("Failed to perform inventory heartbeat for app server: %v", err) + slog.WarnContext(ctx, "Failed to perform inventory heartbeat for app server", "error", err) } return false } @@ -690,12 +690,12 @@ func (h *dbServerHeartbeatV2) FallbackAnnounce(ctx context.Context) (ok bool) { } server, err := h.getServer(ctx) if err != nil { - log.Warnf("Failed to perform fallback heartbeat for database server: %v", err) + slog.WarnContext(ctx, "Failed to perform fallback heartbeat for database server", "error", err) return false } if _, err := h.announcer.UpsertDatabaseServer(ctx, server); err != nil { if !errors.Is(err, context.Canceled) && status.Code(err) != codes.Canceled { - log.Warnf("Failed to perform fallback heartbeat for database server: %v", err) + slog.WarnContext(ctx, "Failed to perform fallback heartbeat for database server", "error", err) } return false } @@ -717,12 +717,12 @@ func (h *dbServerHeartbeatV2) Announce(ctx context.Context, sender inventory.Dow server, err := h.getServer(ctx) if err != nil { - log.Warnf("Failed to perform inventory heartbeat for database server: %v", err) + slog.WarnContext(ctx, "Failed to perform inventory heartbeat for database server", "error", err) return false } if err := sender.Send(ctx, proto.InventoryHeartbeat{DatabaseServer: apiutils.CloneProtoMsg(server)}); err != nil { if !errors.Is(err, context.Canceled) && status.Code(err) != codes.Canceled { - log.Warnf("Failed to perform inventory heartbeat for database server: %v", err) + slog.WarnContext(ctx, "Failed to perform inventory heartbeat for database server", "error", err) } return false } @@ -761,13 +761,13 @@ func (h *kubeServerHeartbeatV2) FallbackAnnounce(ctx context.Context) (ok bool) } server, err := h.getServer(ctx) if err != nil { - log.Warnf("Failed to perform fallback heartbeat for kubernetes server: %v", err) + slog.WarnContext(ctx, "Failed to perform fallback heartbeat for kubernetes server", "error", err) return false } if _, err := h.announcer.UpsertKubernetesServer(ctx, apiutils.CloneProtoMsg(server)); err != nil { if !errors.Is(err, context.Canceled) && status.Code(err) != codes.Canceled { - log.Warnf("Failed to perform fallback heartbeat for kubernetes server: %v", err) + slog.WarnContext(ctx, "Failed to perform fallback heartbeat for kubernetes server", "error", err) } return false } @@ -789,12 +789,12 @@ func (h *kubeServerHeartbeatV2) Announce(ctx context.Context, sender inventory.D server, err := h.getServer(ctx) if err != nil { - log.Warnf("Failed to perform inventory heartbeat for kubernetes server: %v", err) + slog.WarnContext(ctx, "Failed to perform inventory heartbeat for kubernetes server", "error", err) return false } if err := sender.Send(ctx, proto.InventoryHeartbeat{KubernetesServer: apiutils.CloneProtoMsg(server)}); err != nil { if !errors.Is(err, context.Canceled) && status.Code(err) != codes.Canceled { - log.Warnf("Failed to perform inventory heartbeat for kubernetes server: %v", err) + slog.WarnContext(ctx, "Failed to perform inventory heartbeat for kubernetes server", "error", err) } return false } diff --git a/lib/srv/keepalive.go b/lib/srv/keepalive.go index 18d3418041f33..1f11bc1847248 100644 --- a/lib/srv/keepalive.go +++ b/lib/srv/keepalive.go @@ -20,10 +20,9 @@ package srv import ( "context" + "log/slog" "time" - "github.com/sirupsen/logrus" - "github.com/gravitational/teleport" "github.com/gravitational/teleport/lib/defaults" ) @@ -59,10 +58,8 @@ type KeepAliveParams struct { func StartKeepAliveLoop(p KeepAliveParams) { var missedCount int64 - log := logrus.WithFields(logrus.Fields{ - teleport.ComponentKey: teleport.ComponentKeepAlive, - }) - log.Debugf("Starting keep-alive loop with interval %v and max count %v.", p.Interval, p.MaxCount) + log := slog.With(teleport.ComponentKey, teleport.ComponentKeepAlive) + log.DebugContext(p.CloseContext, "Starting keep-alive loop", "interval", p.Interval, "max_count", p.MaxCount) tickerCh := time.NewTicker(p.Interval) defer tickerCh.Stop() @@ -89,7 +86,7 @@ func StartKeepAliveLoop(p KeepAliveParams) { // and notify the server to disconnect and cleanup. missedCount = missedCount + 1 if missedCount > p.MaxCount { - log.Infof("Missed %v keep-alive messages, closing connection.", missedCount) + log.InfoContext(p.CloseContext, "Missed too keep-alive messages, closing connection", "missed_count", missedCount) p.CloseCancel() return } diff --git a/lib/srv/monitor.go b/lib/srv/monitor.go index 183aeba78b7e8..8381c6e8bde4a 100644 --- a/lib/srv/monitor.go +++ b/lib/srv/monitor.go @@ -22,13 +22,13 @@ import ( "context" "fmt" "io" + "log/slog" "net" "sync" "time" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - log "github.com/sirupsen/logrus" "golang.org/x/crypto/ssh" "github.com/gravitational/teleport" @@ -75,8 +75,8 @@ type ConnectionMonitorConfig struct { Emitter apievents.Emitter // EmitterContext is long-lived context suitable to be used with Emitter EmitterContext context.Context - // Logger is a logging entry. - Logger log.FieldLogger + // Logger emits log messages. + Logger *slog.Logger // MonitorCloseChannel will be signaled when the monitor closes a connection. // Used only for testing. Optional. MonitorCloseChannel chan struct{} @@ -191,7 +191,7 @@ func (c *ConnectionMonitor) MonitorConn(ctx context.Context, authzCtx *authz.Con TeleportUser: identity.Username, Emitter: c.cfg.Emitter, EmitterContext: c.cfg.EmitterContext, - Entry: c.cfg.Logger, + Logger: c.cfg.Logger, IdleTimeoutMessage: netConfig.GetClientIdleTimeoutMessage(), MonitorCloseChannel: c.cfg.MonitorCloseChannel, }); err != nil { @@ -234,8 +234,8 @@ type MonitorConfig struct { Emitter apievents.Emitter // EmitterContext is long-lived context suitable to be used with Emitter. Typically, a server exit context will be used here. EmitterContext context.Context - // Entry is a logging entry - Entry log.FieldLogger + // Logger emits log messages. + Logger *slog.Logger // IdleTimeoutMessage is sent to the client when the idle timeout expires. IdleTimeoutMessage string // MessageWriter wraps a channel to send text messages to the client. Use @@ -260,8 +260,8 @@ func (m *MonitorConfig) CheckAndSetDefaults() error { if m.Conn == nil { return trace.BadParameter("missing parameter Conn") } - if m.Entry == nil { - return trace.BadParameter("missing parameter Entry") + if m.Logger == nil { + return trace.BadParameter("missing parameter Logger") } if m.Tracker == nil { return trace.BadParameter("missing parameter Tracker") @@ -321,7 +321,7 @@ func (w *Monitor) start(lockWatch types.Watcher) { lockWatchDoneC := lockWatch.Done() defer func() { if err := lockWatch.Close(); err != nil { - w.Entry.WithError(err).Warn("Failed to close lock watcher subscription.") + w.Logger.WarnContext(w.Context, "Failed to close lock watcher subscription", "error", err) } }() @@ -366,14 +366,14 @@ func (w *Monitor) start(lockWatch types.Watcher) { msg = reason } if _, err := w.MessageWriter.WriteString(msg); err != nil { - w.Entry.WithError(err).Warn("Failed to send idle timeout message.") + w.Logger.WarnContext(w.Context, "Failed to send idle timeout message", "error", err) } } w.disconnectClient(reason) return } next := w.ClientIdleTimeout - since - w.Entry.Debugf("Client activity detected %v ago; next check in %v", since, next) + w.Logger.DebugContext(w.Context, "Client activity detected", "last_active", since, "next_check", next) idleTime = w.Clock.After(next) // Lock in force. @@ -383,7 +383,7 @@ func (w *Monitor) start(lockWatch types.Watcher) { case types.OpPut: lock, ok := lockEvent.Resource.(types.Lock) if !ok { - w.Entry.Warnf("Skipping unexpected lock event resource type %T.", lockEvent.Resource) + w.Logger.WarnContext(w.Context, "Skipping unexpected lock event resource type", "resource_kind", lockEvent.Resource.GetKind()) } else { lockErr = services.LockInForceAccessDenied(lock) } @@ -394,7 +394,7 @@ func (w *Monitor) start(lockWatch types.Watcher) { lockErr = services.StrictLockingModeAccessDenied } default: - w.Entry.Warnf("Skipping unexpected lock event type %q.", lockEvent.Type) + w.Logger.WarnContext(w.Context, "Skipping unexpected lock event type", "event_type", lockEvent.Type) } if lockErr != nil { w.handleLockInForce(lockErr) @@ -402,7 +402,7 @@ func (w *Monitor) start(lockWatch types.Watcher) { } case <-lockWatchDoneC: - w.Entry.WithError(lockWatch.Error()).Warn("Lock watcher subscription was closed.") + w.Logger.WarnContext(w.Context, "Lock watcher subscription was closed", "error", lockWatch.Error()) if w.DisconnectExpiredCert.IsZero() && w.ClientIdleTimeout == 0 { return } @@ -425,21 +425,21 @@ type withCauseCloser interface { } func (w *Monitor) disconnectClient(reason string) { - w.Entry.Debugf("Disconnecting client: %v", reason) + w.Logger.DebugContext(w.Context, "Disconnecting client", "reason", reason) if connWithCauseCloser, ok := w.Conn.(withCauseCloser); ok { if err := connWithCauseCloser.CloseWithCause(trace.AccessDenied(reason)); err != nil { - w.Entry.WithError(err).Error("Failed to close connection.") + w.Logger.ErrorContext(w.Context, "Failed to close connection", "error", err) } } else { if err := w.Conn.Close(); err != nil { - w.Entry.WithError(err).Error("Failed to close connection.") + w.Logger.ErrorContext(w.Context, "Failed to close connection", "error", err) } } // emit audit event after client has been disconnected. if err := w.emitDisconnectEvent(reason); err != nil { - w.Entry.WithError(err).Warn("Failed to emit audit event.") + w.Logger.WarnContext(w.Context, "Failed to emit audit event", "error", err) } } @@ -470,7 +470,7 @@ func (w *Monitor) handleLockInForce(lockErr error) { reason := lockErr.Error() if w.MessageWriter != nil { if _, err := w.MessageWriter.WriteString(reason); err != nil { - w.Entry.WithError(err).Warn("Failed to send lock-in-force message.") + w.Logger.WarnContext(w.Context, "Failed to send lock-in-force message", "error", err) } } w.disconnectClient(reason) diff --git a/lib/srv/monitor_test.go b/lib/srv/monitor_test.go index ad95adefef345..db39dbef2c3d3 100644 --- a/lib/srv/monitor_test.go +++ b/lib/srv/monitor_test.go @@ -28,7 +28,6 @@ import ( "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/constants" @@ -39,6 +38,7 @@ import ( "github.com/gravitational/teleport/lib/events/eventstest" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" ) func newTestMonitor(ctx context.Context, t *testing.T, asrv *auth.TestAuthServer, mut ...func(*MonitorConfig)) (*mockTrackingConn, *eventstest.ChannelEmitter, MonitorConfig) { @@ -54,7 +54,7 @@ func newTestMonitor(ctx context.Context, t *testing.T, asrv *auth.TestAuthServer EmitterContext: context.Background(), Clock: asrv.Clock(), Tracker: &mockActivityTracker{asrv.Clock()}, - Entry: logrus.StandardLogger(), + Logger: utils.NewSlogLoggerForTests(), LockWatcher: asrv.LockWatcher, LockTargets: []types.LockTarget{{User: "test-user"}}, LockingMode: constants.LockingModeBestEffort, @@ -86,7 +86,7 @@ func TestConnectionMonitorLockInForce(t *testing.T) { Emitter: emitter, EmitterContext: ctx, Clock: asrv.Clock(), - Logger: logrus.StandardLogger(), + Logger: utils.NewSlogLoggerForTests(), LockWatcher: asrv.LockWatcher, ServerID: "test", }) diff --git a/lib/srv/server/azure_installer.go b/lib/srv/server/azure_installer.go index a724288ad1585..4d7e17e9c6c5c 100644 --- a/lib/srv/server/azure_installer.go +++ b/lib/srv/server/azure_installer.go @@ -25,7 +25,6 @@ import ( "net/url" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3" - "github.com/aws/aws-sdk-go/aws" "github.com/gravitational/trace" "golang.org/x/sync/errgroup" @@ -70,7 +69,7 @@ func (ai *AzureInstaller) Run(ctx context.Context, req AzureRunRequest) error { runRequest := azure.RunCommandRequest{ Region: req.Region, ResourceGroup: req.ResourceGroup, - VMName: aws.StringValue(inst.Name), + VMName: azure.StringVal(inst.Name), Parameters: req.Params, Script: script, } diff --git a/lib/srv/server/azure_watcher.go b/lib/srv/server/azure_watcher.go index 4339bfc713713..645658e8f77fe 100644 --- a/lib/srv/server/azure_watcher.go +++ b/lib/srv/server/azure_watcher.go @@ -24,7 +24,6 @@ import ( "time" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v3" - "github.com/aws/aws-sdk-go/aws" "github.com/gravitational/trace" usageeventsv1 "github.com/gravitational/teleport/api/gen/proto/go/usageevents/v1" @@ -66,7 +65,7 @@ func (instances *AzureInstances) MakeEvents() map[string]*usageeventsv1.Resource } events := make(map[string]*usageeventsv1.ResourceCreateEvent, len(instances.Instances)) for _, inst := range instances.Instances { - events[azureEventPrefix+aws.StringValue(inst.ID)] = &usageeventsv1.ResourceCreateEvent{ + events[azureEventPrefix+azure.StringVal(inst.ID)] = &usageeventsv1.ResourceCreateEvent{ ResourceType: resourceType, ResourceOrigin: types.OriginCloud, CloudProvider: types.CloudAzure, @@ -177,13 +176,13 @@ func (f *azureInstanceFetcher) GetInstances(ctx context.Context, _ bool) ([]Inst } for _, vm := range vms { - location := aws.StringValue(vm.Location) + location := azure.StringVal(vm.Location) if _, ok := instancesByRegion[location]; !ok && !allowAllRegions { continue } vmTags := make(map[string]string, len(vm.Tags)) for key, value := range vm.Tags { - vmTags[key] = aws.StringValue(value) + vmTags[key] = azure.StringVal(value) } if match, _, _ := services.MatchLabels(f.Labels, vmTags); !match { continue diff --git a/lib/srv/server/ssm_install.go b/lib/srv/server/ssm_install.go index 3c23f672884a3..51943f4400058 100644 --- a/lib/srv/server/ssm_install.go +++ b/lib/srv/server/ssm_install.go @@ -26,12 +26,11 @@ import ( "maps" "slices" "strings" + "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/ssm" - "github.com/aws/aws-sdk-go/service/ssm/ssmiface" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/ssm" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" "github.com/gravitational/trace" "golang.org/x/sync/errgroup" @@ -42,6 +41,23 @@ import ( libevents "github.com/gravitational/teleport/lib/events" ) +// waiterTimedOutErrorMessage is the error message returned by the AWS SDK command +// executed waiter when it times out. +const waiterTimedOutErrorMessage = "exceeded max wait time for CommandExecuted waiter" + +// SSMClient is the subset of the AWS SSM API required for EC2 discovery. +type SSMClient interface { + ssm.DescribeInstanceInformationAPIClient + ssm.GetCommandInvocationAPIClient + ssm.ListCommandInvocationsAPIClient + // SendCommand runs commands on one or more managed nodes. + SendCommand(ctx context.Context, params *ssm.SendCommandInput, optFns ...func(*ssm.Options)) (*ssm.SendCommandOutput, error) +} + +type commandWaiter interface { + Wait(ctx context.Context, params *ssm.GetCommandInvocationInput, maxWaitDur time.Duration, optFns ...func(*ssm.CommandExecutedWaiterOptions)) error +} + // SSMInstallerConfig represents configuration for an SSM install // script executor. type SSMInstallerConfig struct { @@ -50,6 +66,9 @@ type SSMInstallerConfig struct { // Logger is used to log messages. // Optional. A logger is created if one not supplied. Logger *slog.Logger + // getWaiter replaces the default command waiter for a given SSM client. + // Used in tests. + getWaiter func(SSMClient) commandWaiter } // SSMInstallationResult contains the result of trying to install teleport @@ -84,7 +103,7 @@ type SSMRunRequest struct { // DocumentName is the name of the SSM document to run. DocumentName string // SSM is an SSM API client. - SSM ssmiface.SSMAPI + SSM SSMClient // Instances is the list of instances that will have the SSM // document executed on them. Instances []EC2Instance @@ -124,6 +143,12 @@ func (c *SSMInstallerConfig) checkAndSetDefaults() error { c.Logger = slog.Default().With(teleport.ComponentKey, "ssminstaller") } + if c.getWaiter == nil { + c.getWaiter = func(s SSMClient) commandWaiter { + return ssm.NewCommandExecutedWaiter(s) + } + } + return nil } @@ -144,9 +169,9 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { instances[inst.InstanceID] = inst.InstanceName } - params := make(map[string][]*string) + params := make(map[string][]string) for k, v := range req.Params { - params[k] = []*string{aws.String(v)} + params[k] = []string{v} } validInstances := instances @@ -175,9 +200,9 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { } validInstanceIDs := instanceIDsFrom(validInstances) - output, err := req.SSM.SendCommandWithContext(ctx, &ssm.SendCommandInput{ + output, err := req.SSM.SendCommand(ctx, &ssm.SendCommandInput{ DocumentName: aws.String(req.DocumentName), - InstanceIds: aws.StringSlice(validInstanceIDs), + InstanceIds: validInstanceIDs, Parameters: params, }) if err != nil { @@ -194,9 +219,9 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { // As a best effort, we try to call ssm.SendCommand again but this time without the "sshdConfigPath" param // We must not remove the Param "sshdConfigPath" beforehand because customers might be using custom SSM Documents for ec2 auto discovery. delete(params, ParamSSHDConfigPath) - output, err = req.SSM.SendCommandWithContext(ctx, &ssm.SendCommandInput{ + output, err = req.SSM.SendCommand(ctx, &ssm.SendCommandInput{ DocumentName: aws.String(req.DocumentName), - InstanceIds: aws.StringSlice(validInstanceIDs), + InstanceIds: validInstanceIDs, Parameters: params, }) if err != nil { @@ -296,20 +321,20 @@ func (si *SSMInstaller) describeSSMAgentState(ctx context.Context, req SSMRunReq } instanceIDs := instanceIDsFrom(allInstances) - ssmInstancesInfo, err := req.SSM.DescribeInstanceInformationWithContext(ctx, &ssm.DescribeInstanceInformationInput{ - Filters: []*ssm.InstanceInformationStringFilter{ - {Key: aws.String(ssm.InstanceInformationFilterKeyInstanceIds), Values: aws.StringSlice(instanceIDs)}, + ssmInstancesInfo, err := req.SSM.DescribeInstanceInformation(ctx, &ssm.DescribeInstanceInformationInput{ + Filters: []ssmtypes.InstanceInformationStringFilter{ + {Key: aws.String(string(ssmtypes.InstanceInformationFilterKeyInstanceIds)), Values: instanceIDs}, }, - MaxResults: aws.Int64(awsEC2APIChunkSize), + MaxResults: aws.Int32(awsEC2APIChunkSize), }) if err != nil { return nil, trace.Wrap(awslib.ConvertRequestFailureError(err)) } - instanceStateByInstanceID := make(map[string]*ssm.InstanceInformation, len(ssmInstancesInfo.InstanceInformationList)) + instanceStateByInstanceID := make(map[string]ssmtypes.InstanceInformation, len(ssmInstancesInfo.InstanceInformationList)) for _, instanceState := range ssmInstancesInfo.InstanceInformationList { // instanceState.InstanceId always has the InstanceID value according to AWS Docs. - instanceStateByInstanceID[aws.StringValue(instanceState.InstanceId)] = instanceState + instanceStateByInstanceID[aws.ToString(instanceState.InstanceId)] = instanceState } for instanceID, instanceName := range allInstances { @@ -319,12 +344,12 @@ func (si *SSMInstaller) describeSSMAgentState(ctx context.Context, req SSMRunReq continue } - if aws.StringValue(instanceState.PingStatus) == ssm.PingStatusConnectionLost { + if instanceState.PingStatus == ssmtypes.PingStatusConnectionLost { ret.connectionLost[instanceID] = instanceName continue } - if aws.StringValue(instanceState.PlatformType) != ssm.PlatformTypeLinux { + if instanceState.PlatformType != ssmtypes.PlatformTypeLinux { ret.unsupportedOS[instanceID] = instanceName continue } @@ -336,23 +361,22 @@ func (si *SSMInstaller) describeSSMAgentState(ctx context.Context, req SSMRunReq } // skipAWSWaitErr is used to ignore the error returned from -// WaitUntilCommandExecutedWithContext if it is a resource not ready -// code as this can represent one of several different errors which +// Wait if it times out, as this can represent one of several different errors which // are handled by checking the command invocation after calling this // to get more information about the error. func skipAWSWaitErr(err error) error { - var aErr awserr.Error - if errors.As(err, &aErr) && aErr.Code() == request.WaiterResourceNotReadyErrorCode { + if err != nil && err.Error() == waiterTimedOutErrorMessage { return nil } return trace.Wrap(err) } func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, commandID, instanceID *string, instanceName string) error { - err := req.SSM.WaitUntilCommandExecutedWithContext(ctx, &ssm.GetCommandInvocationInput{ + err := si.getWaiter(req.SSM).Wait(ctx, &ssm.GetCommandInvocationInput{ CommandId: commandID, InstanceId: instanceID, - }) + // 100 seconds to match v1 sdk waiter default. + }, 100*time.Second) if err := skipAWSWaitErr(err); err != nil { return trace.Wrap(err) @@ -378,7 +402,7 @@ func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, com for i, step := range invocationSteps { stepResultEvent, err := si.getCommandStepStatusEvent(ctx, step, req, commandID, instanceID) if err != nil { - var invalidPluginNameErr *ssm.InvalidPluginName + var invalidPluginNameErr *ssmtypes.InvalidPluginName if errors.As(err, &invalidPluginNameErr) { // If using a custom SSM Document and the client does not have access to ssm:ListCommandInvocations // the list of invocationSteps (ie plugin name) might be wrong. @@ -422,10 +446,10 @@ func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, com func (si *SSMInstaller) getInvocationSteps(ctx context.Context, req SSMRunRequest, commandID, instanceID *string) ([]string, error) { // ssm:ListCommandInvocations is used to list the actual steps because users might be using a custom SSM Document. - listCommandInvocationResp, err := req.SSM.ListCommandInvocationsWithContext(ctx, &ssm.ListCommandInvocationsInput{ + listCommandInvocationResp, err := req.SSM.ListCommandInvocations(ctx, &ssm.ListCommandInvocationsInput{ CommandId: commandID, InstanceId: instanceID, - Details: aws.Bool(true), + Details: true, }) if err != nil { return nil, trace.Wrap(awslib.ConvertRequestFailureError(err)) @@ -436,8 +460,8 @@ func (si *SSMInstaller) getInvocationSteps(ctx context.Context, req SSMRunReques if len(listCommandInvocationResp.CommandInvocations) == 0 { si.Logger.WarnContext(ctx, "No command invocation was found.", - "command_id", aws.StringValue(commandID), - "instance_id", aws.StringValue(instanceID), + "command_id", aws.ToString(commandID), + "instance_id", aws.ToString(instanceID), ) return nil, trace.BadParameter("no command invocation was found") } @@ -445,7 +469,7 @@ func (si *SSMInstaller) getInvocationSteps(ctx context.Context, req SSMRunReques documentSteps := make([]string, 0, len(commandInvocation.CommandPlugins)) for _, step := range commandInvocation.CommandPlugins { - documentSteps = append(documentSteps, aws.StringValue(step.Name)) + documentSteps = append(documentSteps, aws.ToString(step.Name)) } return documentSteps, nil } @@ -458,16 +482,16 @@ func (si *SSMInstaller) getCommandStepStatusEvent(ctx context.Context, step stri if step != "" { getCommandInvocationReq.PluginName = aws.String(step) } - stepResult, err := req.SSM.GetCommandInvocationWithContext(ctx, getCommandInvocationReq) + stepResult, err := req.SSM.GetCommandInvocation(ctx, getCommandInvocationReq) if err != nil { return nil, trace.Wrap(err) } - status := aws.StringValue(stepResult.Status) - exitCode := aws.Int64Value(stepResult.ResponseCode) + status := stepResult.Status + exitCode := int64(stepResult.ResponseCode) eventCode := libevents.SSMRunSuccessCode - if status != ssm.CommandStatusSuccess { + if status != ssmtypes.CommandInvocationStatusSuccess { eventCode = libevents.SSMRunFailCode if exitCode == 0 { exitCode = -1 @@ -479,7 +503,7 @@ func (si *SSMInstaller) getCommandStepStatusEvent(ctx context.Context, step stri // Example: // https://eu-west-2.console.aws.amazon.com/systems-manager/run-command/3cb11aaa-11aa-1111-aaaa-2188108225de/i-0775091aa11111111 invocationURL := fmt.Sprintf("https://%s.console.aws.amazon.com/systems-manager/run-command/%s/%s", - req.Region, aws.StringValue(commandID), aws.StringValue(instanceID), + req.Region, aws.ToString(commandID), aws.ToString(instanceID), ) return &apievents.SSMRun{ @@ -487,14 +511,14 @@ func (si *SSMInstaller) getCommandStepStatusEvent(ctx context.Context, step stri Type: libevents.SSMRunEvent, Code: eventCode, }, - CommandID: aws.StringValue(commandID), - InstanceID: aws.StringValue(instanceID), + CommandID: aws.ToString(commandID), + InstanceID: aws.ToString(instanceID), AccountID: req.AccountID, Region: req.Region, ExitCode: exitCode, - Status: status, - StandardOutput: aws.StringValue(stepResult.StandardOutputContent), - StandardError: aws.StringValue(stepResult.StandardErrorContent), + Status: string(status), + StandardOutput: aws.ToString(stepResult.StandardOutputContent), + StandardError: aws.ToString(stepResult.StandardErrorContent), InvocationURL: invocationURL, }, nil } diff --git a/lib/srv/server/ssm_install_test.go b/lib/srv/server/ssm_install_test.go index c56b286258527..102bcbf5a4475 100644 --- a/lib/srv/server/ssm_install_test.go +++ b/lib/srv/server/ssm_install_test.go @@ -21,15 +21,13 @@ package server import ( "context" "fmt" - "net/http" "testing" + "time" - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/awserr" - "github.com/aws/aws-sdk-go/aws/request" - "github.com/aws/aws-sdk-go/service/ssm" - "github.com/aws/aws-sdk-go/service/ssm/ssmiface" - "github.com/google/uuid" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/ssm" + ssmtypes "github.com/aws/aws-sdk-go-v2/service/ssm/types" + "github.com/gravitational/trace" "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types/events" @@ -37,7 +35,7 @@ import ( ) type mockSSMClient struct { - ssmiface.SSMAPI + SSMClient commandOutput *ssm.SendCommandOutput commandInvokeOutput map[string]*ssm.GetCommandInvocationOutput describeOutput *ssm.DescribeInstanceInformationOutput @@ -46,37 +44,37 @@ type mockSSMClient struct { const docWithoutSSHDConfigPathParam = "ssmdocument-without-sshdConfigPath-param" -func (sm *mockSSMClient) SendCommandWithContext(_ context.Context, input *ssm.SendCommandInput, _ ...request.Option) (*ssm.SendCommandOutput, error) { - if _, hasExtraParam := input.Parameters["sshdConfigPath"]; hasExtraParam && aws.StringValue(input.DocumentName) == docWithoutSSHDConfigPathParam { +func (sm *mockSSMClient) SendCommand(_ context.Context, input *ssm.SendCommandInput, _ ...func(*ssm.Options)) (*ssm.SendCommandOutput, error) { + if _, hasExtraParam := input.Parameters["sshdConfigPath"]; hasExtraParam && aws.ToString(input.DocumentName) == docWithoutSSHDConfigPathParam { return nil, fmt.Errorf("InvalidParameters: document %s does not support parameters", docWithoutSSHDConfigPathParam) } return sm.commandOutput, nil } -func (sm *mockSSMClient) GetCommandInvocationWithContext(_ context.Context, input *ssm.GetCommandInvocationInput, _ ...request.Option) (*ssm.GetCommandInvocationOutput, error) { - if stepResult, found := sm.commandInvokeOutput[aws.StringValue(input.PluginName)]; found { +func (sm *mockSSMClient) GetCommandInvocation(_ context.Context, input *ssm.GetCommandInvocationInput, _ ...func(*ssm.Options)) (*ssm.GetCommandInvocationOutput, error) { + if stepResult, found := sm.commandInvokeOutput[aws.ToString(input.PluginName)]; found { return stepResult, nil } - return nil, &ssm.InvalidPluginName{} + return nil, &ssmtypes.InvalidPluginName{} } -func (sm *mockSSMClient) DescribeInstanceInformationWithContext(_ context.Context, input *ssm.DescribeInstanceInformationInput, _ ...request.Option) (*ssm.DescribeInstanceInformationOutput, error) { +func (sm *mockSSMClient) DescribeInstanceInformation(_ context.Context, input *ssm.DescribeInstanceInformationInput, _ ...func(*ssm.Options)) (*ssm.DescribeInstanceInformationOutput, error) { if sm.describeOutput == nil { - return nil, awserr.NewRequestFailure(awserr.New("AccessDeniedException", "message", nil), http.StatusBadRequest, uuid.NewString()) + return nil, trace.AccessDenied("") } return sm.describeOutput, nil } -func (sm *mockSSMClient) ListCommandInvocationsWithContext(aws.Context, *ssm.ListCommandInvocationsInput, ...request.Option) (*ssm.ListCommandInvocationsOutput, error) { +func (sm *mockSSMClient) ListCommandInvocations(_ context.Context, input *ssm.ListCommandInvocationsInput, _ ...func(*ssm.Options)) (*ssm.ListCommandInvocationsOutput, error) { if sm.listCommandInvocations == nil { - return nil, awserr.NewRequestFailure(awserr.New("AccessDeniedException", "message", nil), http.StatusBadRequest, uuid.NewString()) + return nil, trace.AccessDenied("") } return sm.listCommandInvocations, nil } -func (sm *mockSSMClient) WaitUntilCommandExecutedWithContext(aws.Context, *ssm.GetCommandInvocationInput, ...request.WaiterOption) error { - if aws.StringValue(sm.commandOutput.Command.Status) == ssm.CommandStatusFailed { - return awserr.New(request.WaiterResourceNotReadyErrorCode, "err", nil) +func (sm *mockSSMClient) Wait(ctx context.Context, params *ssm.GetCommandInvocationInput, maxWaitDur time.Duration, optFns ...func(*ssm.CommandExecutedWaiterOptions)) error { + if sm.commandOutput.Command.Status == ssmtypes.CommandStatusFailed { + return trace.Errorf(waiterTimedOutErrorMessage) } return nil } @@ -94,6 +92,7 @@ func TestSSMInstaller(t *testing.T) { document := "ssmdocument" for _, tc := range []struct { + client *mockSSMClient req SSMRunRequest expectedInstallations []*SSMInstallationResult name string @@ -108,25 +107,25 @@ func TestSSMInstaller(t *testing.T) { Params: map[string]string{"token": "abcdefg"}, IntegrationName: "aws-integration", DiscoveryConfig: "dc001", - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, - "runShellScript": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + }, + "runShellScript": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ IntegrationName: "aws-integration", @@ -141,7 +140,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, IssueType: "ec2-ssm-script-failure", @@ -157,25 +156,25 @@ func TestSSMInstaller(t *testing.T) { }, DocumentName: docWithoutSSHDConfigPathParam, Params: map[string]string{"sshdConfigPath": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, - "runShellScript": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + }, + "runShellScript": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ SSMRunEvent: &events.SSMRun{ @@ -188,7 +187,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, IssueType: "ec2-ssm-script-failure", @@ -204,23 +203,23 @@ func TestSSMInstaller(t *testing.T) { }, IntegrationName: "aws-1", Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusFailed), - ResponseCode: aws.Int64(1), - StandardErrorContent: aws.String("timeout error"), - StandardOutputContent: aws.String(""), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusFailed, + ResponseCode: 1, + StandardErrorContent: aws.String("timeout error"), + StandardOutputContent: aws.String(""), }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ IntegrationName: "aws-1", @@ -234,7 +233,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 1, - Status: ssm.CommandStatusFailed, + Status: string(ssmtypes.CommandInvocationStatusFailed), StandardOutput: "", StandardError: "timeout error", InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", @@ -250,30 +249,30 @@ func TestSSMInstaller(t *testing.T) { Instances: []EC2Instance{ {InstanceID: "instance-id-1"}, }, - Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Params: map[string]string{"token": "abcdefg"}, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - StandardErrorContent: aws.String("no error"), - StandardOutputContent: aws.String(""), - }, - "runShellScript": { - Status: aws.String(ssm.CommandStatusFailed), - ResponseCode: aws.Int64(1), - StandardErrorContent: aws.String("timeout error"), - StandardOutputContent: aws.String(""), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + StandardErrorContent: aws.String("no error"), + StandardOutputContent: aws.String(""), + }, + "runShellScript": { + Status: ssmtypes.CommandInvocationStatusFailed, + ResponseCode: 1, + StandardErrorContent: aws.String("timeout error"), + StandardOutputContent: aws.String(""), }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ SSMRunEvent: &events.SSMRun{ @@ -286,7 +285,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 1, - Status: ssm.CommandStatusFailed, + Status: string(ssmtypes.CommandInvocationStatusFailed), StandardOutput: "", StandardError: "timeout error", InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", @@ -306,44 +305,44 @@ func TestSSMInstaller(t *testing.T) { }, DocumentName: document, Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), + }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContent": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + }, + "runShellScript": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContent": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + }, + describeOutput: &ssm.DescribeInstanceInformationOutput{ + InstanceInformationList: []ssmtypes.InstanceInformation{ + { + InstanceId: aws.String("instance-id-1"), + PingStatus: ssmtypes.PingStatusOnline, + PlatformType: ssmtypes.PlatformTypeLinux, }, - "runShellScript": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), + { + InstanceId: aws.String("instance-id-2"), + PingStatus: ssmtypes.PingStatusConnectionLost, + PlatformType: ssmtypes.PlatformTypeLinux, }, - }, - describeOutput: &ssm.DescribeInstanceInformationOutput{ - InstanceInformationList: []*ssm.InstanceInformation{ - { - InstanceId: aws.String("instance-id-1"), - PingStatus: aws.String("Online"), - PlatformType: aws.String("Linux"), - }, - { - InstanceId: aws.String("instance-id-2"), - PingStatus: aws.String("ConnectionLost"), - PlatformType: aws.String("Linux"), - }, - { - InstanceId: aws.String("instance-id-3"), - PingStatus: aws.String("Online"), - PlatformType: aws.String("Windows"), - }, + { + InstanceId: aws.String("instance-id-3"), + PingStatus: ssmtypes.PingStatusOnline, + PlatformType: ssmtypes.PlatformTypeWindows, }, }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{ { @@ -357,7 +356,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, IssueType: "ec2-ssm-script-failure", @@ -421,34 +420,34 @@ func TestSSMInstaller(t *testing.T) { }, DocumentName: document, Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "downloadContentCustom": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, - "runShellScriptCustom": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - StandardOutputContent: aws.String("custom output"), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "downloadContentCustom": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, - listCommandInvocations: &ssm.ListCommandInvocationsOutput{ - CommandInvocations: []*ssm.CommandInvocation{{ - CommandPlugins: []*ssm.CommandPlugin{ - {Name: aws.String("downloadContentCustom")}, - {Name: aws.String("runShellScriptCustom")}, - }, - }}, + "runShellScriptCustom": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, + StandardOutputContent: aws.String("custom output"), }, }, - Region: "eu-central-1", - AccountID: "account-id", + listCommandInvocations: &ssm.ListCommandInvocationsOutput{ + CommandInvocations: []ssmtypes.CommandInvocation{{ + CommandPlugins: []ssmtypes.CommandPlugin{ + {Name: aws.String("downloadContentCustom")}, + {Name: aws.String("runShellScriptCustom")}, + }, + }}, + }, }, expectedInstallations: []*SSMInstallationResult{{ SSMRunEvent: &events.SSMRun{ @@ -461,7 +460,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), StandardOutput: "custom output", InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, @@ -477,21 +476,21 @@ func TestSSMInstaller(t *testing.T) { }, DocumentName: document, Params: map[string]string{"token": "abcdefg"}, - SSM: &mockSSMClient{ - commandOutput: &ssm.SendCommandOutput{ - Command: &ssm.Command{ - CommandId: aws.String("command-id-1"), - }, + Region: "eu-central-1", + AccountID: "account-id", + }, + client: &mockSSMClient{ + commandOutput: &ssm.SendCommandOutput{ + Command: &ssmtypes.Command{ + CommandId: aws.String("command-id-1"), }, - commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ - "": { - Status: aws.String(ssm.CommandStatusSuccess), - ResponseCode: aws.Int64(0), - }, + }, + commandInvokeOutput: map[string]*ssm.GetCommandInvocationOutput{ + "": { + Status: ssmtypes.CommandInvocationStatusSuccess, + ResponseCode: 0, }, }, - Region: "eu-central-1", - AccountID: "account-id", }, expectedInstallations: []*SSMInstallationResult{{ SSMRunEvent: &events.SSMRun{ @@ -504,7 +503,7 @@ func TestSSMInstaller(t *testing.T) { AccountID: "account-id", Region: "eu-central-1", ExitCode: 0, - Status: ssm.CommandStatusSuccess, + Status: string(ssmtypes.CommandInvocationStatusSuccess), InvocationURL: "https://eu-central-1.console.aws.amazon.com/systems-manager/run-command/command-id-1/instance-id-1", }, IssueType: "ec2-ssm-script-failure", @@ -516,9 +515,11 @@ func TestSSMInstaller(t *testing.T) { } { t.Run(tc.name, func(t *testing.T) { ctx := context.Background() + tc.req.SSM = tc.client installationResultsCollector := &mockInstallationResults{} inst, err := NewSSMInstaller(SSMInstallerConfig{ ReportSSMInstallationResultFunc: installationResultsCollector.ReportInstallationResult, + getWaiter: func(s SSMClient) commandWaiter { return tc.client }, }) require.NoError(t, err) diff --git a/lib/srv/session_control.go b/lib/srv/session_control.go index bd340e53279cc..748aa111062eb 100644 --- a/lib/srv/session_control.go +++ b/lib/srv/session_control.go @@ -21,12 +21,12 @@ package srv import ( "context" "io" + "log/slog" "strings" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/prometheus/client_golang/prometheus" - "github.com/sirupsen/logrus" oteltrace "go.opentelemetry.io/otel/trace" "golang.org/x/crypto/ssh" @@ -75,7 +75,7 @@ type SessionControllerConfig struct { // have different flows Component string // Logger is used to emit log entries - Logger *logrus.Entry + Logger *slog.Logger // TracerProvider creates a tracer so that spans may be emitted TracerProvider oteltrace.TracerProvider // ServerID is the UUID of the server @@ -114,7 +114,7 @@ func (c *SessionControllerConfig) CheckAndSetDefaults() error { } if c.Logger == nil { - c.Logger = logrus.WithField(teleport.ComponentKey, "SessionCtrl") + c.Logger = slog.With(teleport.ComponentKey, "SessionCtrl") } if c.Clock == nil { @@ -342,6 +342,6 @@ func (s *SessionController) emitRejection(ctx context.Context, userMetadata apie Reason: reason, Maximum: max, }); err != nil { - s.cfg.Logger.WithError(err).Warn("Failed to emit session reject event.") + s.cfg.Logger.WarnContext(ctx, "Failed to emit session reject event", "error", err) } } diff --git a/lib/srv/termmanager.go b/lib/srv/termmanager.go index 3c47011672f7f..ddb0d1f3bbc88 100644 --- a/lib/srv/termmanager.go +++ b/lib/srv/termmanager.go @@ -19,12 +19,12 @@ package srv import ( + "context" "errors" "io" + "log/slog" "sync" "sync/atomic" - - log "github.com/sirupsen/logrus" ) // maxHistoryBytes is the maximum bytes that are retained as history and broadcasted to new clients. @@ -107,7 +107,7 @@ func (g *TermManager) writeToClients(p []byte) { _, err := w.Write(p) if err != nil { if !errors.Is(err, io.EOF) { - log.Warnf("Failed to write to remote terminal: %v", err) + slog.WarnContext(context.Background(), "Failed to write to remote terminal", "error", err) } toDelete = append( toDelete, struct { @@ -244,7 +244,7 @@ func (g *TermManager) AddReader(name string, r io.Reader) { n, err := r.Read(buf) if err != nil { if !errors.Is(err, io.EOF) { - log.Warnf("Failed to read from remote terminal: %v", err) + slog.WarnContext(context.Background(), "Failed to read from remote terminal", "error", err) } // Let term manager decide how to handle broken party readers. if g.OnReadError != nil { diff --git a/lib/srv/usermgmt.go b/lib/srv/usermgmt.go index c73e1db41390e..9415c7148096c 100644 --- a/lib/srv/usermgmt.go +++ b/lib/srv/usermgmt.go @@ -485,6 +485,8 @@ func (u *HostUserManagement) UpsertUser(name string, ui services.HostUsersInfo) return closer, nil } +const userLeaseDuration = time.Second * 20 + func (u *HostUserManagement) doWithUserLock(f func(types.SemaphoreLease) error) error { lock, err := services.AcquireSemaphoreWithRetry(u.ctx, services.AcquireSemaphoreWithRetryConfig{ @@ -493,7 +495,7 @@ func (u *HostUserManagement) doWithUserLock(f func(types.SemaphoreLease) error) SemaphoreKind: types.SemaphoreKindHostUserModification, SemaphoreName: "host_user_modification", MaxLeases: 1, - Expires: time.Now().Add(time.Second * 20), + Expires: time.Now().Add(userLeaseDuration), }, Retry: retryutils.LinearConfig{ Step: time.Second * 5, @@ -556,26 +558,35 @@ func (u *HostUserManagement) DeleteAllUsers() error { return trace.Wrap(err) } var errs []error - for _, name := range users { - lt, err := u.storage.GetHostUserInteractionTime(u.ctx, name) - if err != nil { - u.log.DebugContext(u.ctx, "Failed to find user login time", "host_username", name, "error", err) - continue - } - u.doWithUserLock(func(l types.SemaphoreLease) error { + u.doWithUserLock(func(l types.SemaphoreLease) error { + for _, name := range users { + if time.Until(l.Expires) < userLeaseDuration/2 { + l.Expires = time.Now().Add(userLeaseDuration / 2) + if err := u.storage.KeepAliveSemaphoreLease(u.ctx, l); err != nil { + u.log.DebugContext(u.ctx, "Failed to keep alive host user lease", "error", err) + } + } + + lt, err := u.storage.GetHostUserInteractionTime(u.ctx, name) + if err != nil { + u.log.DebugContext(u.ctx, "Failed to find user login time", "host_username", name, "error", err) + continue + } + if time.Since(lt) < u.userGrace { // small grace period in order to avoid deleting users // in-between them starting their SSH session and // entering the shell - return nil + continue } - errs = append(errs, u.DeleteUser(name, teleportGroup.Gid)) - l.Expires = time.Now().Add(time.Second * 10) - u.storage.KeepAliveSemaphoreLease(u.ctx, l) - return nil - }) - } + if err := u.DeleteUser(name, teleportGroup.Gid); err != nil { + errs = append(errs, err) + } + } + + return nil + }) return trace.NewAggregate(errs...) } diff --git a/lib/sshutils/fingerprint.go b/lib/sshutils/fingerprint.go index bae36ae07857e..010dc6bb7b783 100644 --- a/lib/sshutils/fingerprint.go +++ b/lib/sshutils/fingerprint.go @@ -19,6 +19,8 @@ package sshutils import ( + "strings" + "github.com/gravitational/trace" "golang.org/x/crypto/ssh" ) @@ -47,3 +49,18 @@ func PrivateKeyFingerprint(keyBytes []byte) (string, error) { } return Fingerprint(signer.PublicKey()), nil } + +// fingerprintPrefix is the fingerprint prefix added by ssh.FingerprintSHA256. +const fingerprintPrefix = "SHA256:" + +func maybeAddPrefix(fingerprint string) string { + if !strings.HasPrefix(fingerprint, fingerprintPrefix) { + return fingerprintPrefix + fingerprint + } + return fingerprint +} + +// EqualFingerprints checks if two finger prints are equal. +func EqualFingerprints(a, b string) bool { + return strings.EqualFold(maybeAddPrefix(a), maybeAddPrefix(b)) +} diff --git a/lib/sshutils/fingerprint_test.go b/lib/sshutils/fingerprint_test.go new file mode 100644 index 0000000000000..a17878236008a --- /dev/null +++ b/lib/sshutils/fingerprint_test.go @@ -0,0 +1,64 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package sshutils + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEqualFingerprints(t *testing.T) { + tests := []struct { + name string + a string + b string + check require.BoolAssertionFunc + }{ + { + name: "equal", + a: "SHA256:fingerprint", + b: "SHA256:fingerprint", + check: require.True, + }, + { + name: "not equal", + a: "SHA256:fingerprint", + b: "SHA256:fingerprint2", + check: require.False, + }, + { + name: "equal without prefix", + a: "SHA256:fingerprint", + b: "fingerprint", + check: require.True, + }, + { + name: "equal fold", + a: "FINGERPRINT", + b: "SHA256:fingerprint", + check: require.True, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + test.check(t, EqualFingerprints(test.a, test.b)) + }) + } +} diff --git a/lib/teleterm/teleterm_test.go b/lib/teleterm/teleterm_test.go index 854273d71c683..bf7b2f6a2e548 100644 --- a/lib/teleterm/teleterm_test.go +++ b/lib/teleterm/teleterm_test.go @@ -27,6 +27,7 @@ import ( "net" "os" "path/filepath" + "slices" "testing" "time" @@ -226,5 +227,13 @@ func createValidClientTLSConfig(t *testing.T, certsDir string) *tls.Config { tlsConfig, err := createClientTLSConfig(clientCert, serverCertPath) require.NoError(t, err) + // this would be done by the grpc TransportCredential in the grpc client, + // but we're going to fake it with just a tls.Client, so we have to add the + // http2 next proto ourselves (enforced by grpc-go starting from v1.67, and + // required by the http2 spec when speaking http2 in TLS) + if !slices.Contains(tlsConfig.NextProtos, "h2") { + tlsConfig.NextProtos = append(tlsConfig.NextProtos, "h2") + } + return tlsConfig } diff --git a/lib/tlsca/ca.go b/lib/tlsca/ca.go index 1a7fc1de24188..1ad08b5d1d64e 100644 --- a/lib/tlsca/ca.go +++ b/lib/tlsca/ca.go @@ -231,7 +231,14 @@ type RouteToApp struct { GCPServiceAccount string // URI is the URI of the app. This is the internal endpoint where the application is running and isn't user-facing. + // Used merely for audit events and mirrors the URI from the app spec. Not used as a source of + // truth when routing connections. URI string + + // TargetPort is the port to which connections should be routed to. Used only for multi-port TCP + // apps. It is appended to the hostname from the URI in the app spec, since the URI from + // RouteToApp is not used as the source of truth for routing. + TargetPort int } // RouteToDatabase contains routing information for databases. @@ -309,6 +316,7 @@ func (id *Identity) GetEventIdentity() events.Identity { AzureIdentity: id.RouteToApp.AzureIdentity, GCPServiceAccount: id.RouteToApp.GCPServiceAccount, URI: id.RouteToApp.URI, + TargetPort: uint32(id.RouteToApp.TargetPort), } } var routeToDatabase *events.RouteToDatabase @@ -462,6 +470,10 @@ var ( // Its value is either local or sso. UserTypeASN1ExtensionOID = asn1.ObjectIdentifier{1, 3, 9999, 1, 20} + // AppTargetPortASN1ExtensionOID is an extension ID used to encode the application + // target port into a certificate. + AppTargetPortASN1ExtensionOID = asn1.ObjectIdentifier{1, 3, 9999, 1, 21} + // DatabaseServiceNameASN1ExtensionOID is an extension ID used when encoding/decoding // database service name into certificates. DatabaseServiceNameASN1ExtensionOID = asn1.ObjectIdentifier{1, 3, 9999, 2, 1} @@ -630,6 +642,15 @@ func (id *Identity) Subject() (pkix.Name, error) { Value: id.RouteToApp.PublicAddr, }) } + if id.RouteToApp.TargetPort != 0 { + subject.ExtraNames = append(subject.ExtraNames, + pkix.AttributeTypeAndValue{ + Type: AppTargetPortASN1ExtensionOID, + // asn1 doesn't seem to handle uint16, hence the string. + Value: strconv.Itoa(id.RouteToApp.TargetPort), + }, + ) + } if id.RouteToApp.ClusterName != "" { subject.ExtraNames = append(subject.ExtraNames, pkix.AttributeTypeAndValue{ @@ -947,6 +968,16 @@ func FromSubject(subject pkix.Name, expires time.Time) (*Identity, error) { if ok { id.RouteToApp.PublicAddr = val } + case attr.Type.Equal(AppTargetPortASN1ExtensionOID): + // Similar to GenerationASN1ExtensionOID, it has to be cast to a string first and then parsed. + val, ok := attr.Value.(string) + if ok { + targetPort, err := strconv.ParseUint(val, 10, 16) + if err != nil { + return nil, trace.Wrap(err, "parsing target port") + } + id.RouteToApp.TargetPort = int(targetPort) + } case attr.Type.Equal(AppClusterNameASN1ExtensionOID): val, ok := attr.Value.(string) if ok { diff --git a/lib/utils/errors.go b/lib/utils/errors.go index ed557b2168b76..14e56b188c418 100644 --- a/lib/utils/errors.go +++ b/lib/utils/errors.go @@ -19,6 +19,7 @@ package utils import ( + "context" "errors" "io" "net" @@ -86,6 +87,71 @@ func IsUntrustedCertErr(err error) bool { strings.Contains(errMsg, "certificate is not trusted") } +// CanExplainNetworkError returns a simple to understand error message that can +// be used to debug common network and/or protocol errors. +func CanExplainNetworkError(err error) (string, bool) { + var derr *net.DNSError + + switch { + // Connection refused errors can be reproduced by attempting to connect to a + // host:port that no process is listening on. The raw error typically looks + // like the following: + // + // dial tcp 127.0.0.1:8000: connect: connection refused + case errors.Is(err, syscall.ECONNREFUSED): + return `Connection Refused + +Teleport was unable to connect to the requested host, possibly because the server is not running. Ensure the server is running and listening on the correct port. + +Use "nc -vz HOST PORT" to help debug this issue.`, true + // Host unreachable errors can be reproduced by running + // "ip route add unreachable HOST" to update the routing table to make + // the host unreachable. Packets will be discarded and an ICMP message + // will be returned. The raw error typically looks like the following: + // + // dial tcp 10.10.10.10:8000: connect: no route to host + case errors.Is(err, syscall.EHOSTUNREACH): + return `No Route to Host + +Teleport could not connect to the requested host, likely because there is no valid network path to reach it. Check the network routing table to ensure a valid path to the host exists. + +Use "ping HOST" and "ip route get HOST" to help debug this issue.`, true + // Connection reset errors can be reproduced by creating a HTTP server that + // accepts requests but closes the connection before writing a response. The + // raw error typically looks like the following: + // + // read tcp 127.0.0.1:49764->127.0.0.1:8000: read: connection reset by peer + case errors.Is(err, syscall.ECONNRESET): + return `Connection Reset by Peer + +Teleport could not complete the request because the server abruptly closed the connection before the response was received. To resolve this issue, ensure the server (or load balancer) does not have a timeout terminating the connection early and verify that the server is not crash looping. + +Use protocol-specific tools (e.g., curl, psql) to help debug this issue.`, true + // Slow responses can be reprodued by creating a HTTP server that does a + // time.Sleep before responding. The raw error typically looks like the following: + // + // context deadline exceeded + case errors.Is(err, context.DeadlineExceeded): + return `Context Deadline Exceeded + +Teleport did not receive a response within the timeout period, likely due to the system being overloaded, network congestion, or a firewall blocking traffic. To resolve this issue, connect to the host directly and ensure it is responding promptly. + +Use protocol-specific tools (e.g., curl, psql) to assist in debugging this issue.`, true + // No such host errors can be reproduced by attempting to resolve a invalid + // domain name. The raw error typically looks like the following: + // + // dial tcp: lookup qweqweqwe.com: no such host + case errors.As(err, &derr) && derr.IsNotFound: + return `No Such Host + +Teleport was unable to resolve the provided domain name, likely because the domain does not exist. To resolve this issue, verify the domain is correct and ensure the DNS resolver is properly resolving it. + +Use "dig +short HOST" to help debug this issue.`, true + } + + return "", false +} + const ( // SelfSignedCertsMsg is a helper message to point users towards helpful documentation. SelfSignedCertsMsg = "Your proxy certificate is not trusted or expired. " + diff --git a/lib/utils/tls.go b/lib/utils/tls.go index ca096a523b0a0..64ac7f579e652 100644 --- a/lib/utils/tls.go +++ b/lib/utils/tls.go @@ -148,17 +148,10 @@ type TLSConn interface { // cipherSuiteMapping is the mapping between Teleport formatted cipher // suites strings and uint16 IDs. var cipherSuiteMapping = map[string]uint16{ - "tls-rsa-with-aes-128-cbc-sha": tls.TLS_RSA_WITH_AES_128_CBC_SHA, - "tls-rsa-with-aes-256-cbc-sha": tls.TLS_RSA_WITH_AES_256_CBC_SHA, - "tls-rsa-with-aes-128-cbc-sha256": tls.TLS_RSA_WITH_AES_128_CBC_SHA256, - "tls-rsa-with-aes-128-gcm-sha256": tls.TLS_RSA_WITH_AES_128_GCM_SHA256, - "tls-rsa-with-aes-256-gcm-sha384": tls.TLS_RSA_WITH_AES_256_GCM_SHA384, "tls-ecdhe-ecdsa-with-aes-128-cbc-sha": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, "tls-ecdhe-ecdsa-with-aes-256-cbc-sha": tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, "tls-ecdhe-rsa-with-aes-128-cbc-sha": tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, "tls-ecdhe-rsa-with-aes-256-cbc-sha": tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, - "tls-ecdhe-ecdsa-with-aes-128-cbc-sha256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, - "tls-ecdhe-rsa-with-aes-128-cbc-sha256": tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, "tls-ecdhe-rsa-with-aes-128-gcm-sha256": tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, "tls-ecdhe-ecdsa-with-aes-128-gcm-sha256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, "tls-ecdhe-rsa-with-aes-256-gcm-sha384": tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, diff --git a/lib/utils/tls_test.go b/lib/utils/tls_test.go new file mode 100644 index 0000000000000..84ecbfdc4760b --- /dev/null +++ b/lib/utils/tls_test.go @@ -0,0 +1,39 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package utils + +import ( + "crypto/tls" + "testing" +) + +func TestCipherSuites(t *testing.T) { + for _, defaultSuiteID := range DefaultCipherSuites() { + for _, insecureSuite := range tls.InsecureCipherSuites() { + if defaultSuiteID == insecureSuite.ID { + t.Errorf("Default cipher suite %s is considered insecure by crypto/tls", insecureSuite.Name) + } + } + } + for teleportSuiteName, teleportSuiteID := range cipherSuiteMapping { + for _, insecureSuite := range tls.InsecureCipherSuites() { + if teleportSuiteID == insecureSuite.ID { + t.Errorf("Configurable cipher suite %s is considered insecure by crypto/tls", teleportSuiteName) + } + } + } +} diff --git a/lib/utils/utils_test.go b/lib/utils/utils_test.go index cf636c4a65f8a..94f0b92e6d3c7 100644 --- a/lib/utils/utils_test.go +++ b/lib/utils/utils_test.go @@ -270,6 +270,16 @@ func TestIsValidHostname(t *testing.T) { hostname: "some-host-1.example.com", assert: require.True, }, + { + name: "only lower case works", + hostname: "only-lower-case-works", + assert: require.True, + }, + { + name: "mixed upper case fails", + hostname: "mixed-UPPER-CASE-fails", + assert: require.False, + }, { name: "one component", hostname: "example", diff --git a/lib/vnet/app_resolver.go b/lib/vnet/app_resolver.go index 01ca4defaa76b..d2fd0b3bc9d9a 100644 --- a/lib/vnet/app_resolver.go +++ b/lib/vnet/app_resolver.go @@ -26,6 +26,7 @@ import ( "log/slog" "net" "strings" + "sync" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" @@ -94,7 +95,7 @@ type DialOptions struct { type TCPAppResolver struct { appProvider AppProvider clusterConfigCache *ClusterConfigCache - slog *slog.Logger + log *slog.Logger clock clockwork.Clock } @@ -109,7 +110,7 @@ type TCPAppResolver struct { func NewTCPAppResolver(appProvider AppProvider, opts ...tcpAppResolverOption) (*TCPAppResolver, error) { r := &TCPAppResolver{ appProvider: appProvider, - slog: slog.With(teleport.ComponentKey, "VNet.AppResolver"), + log: log.With(teleport.ComponentKey, "VNet.AppResolver"), } for _, opt := range opts { opt(r) @@ -159,7 +160,7 @@ func (r *TCPAppResolver) ResolveTCPHandler(ctx context.Context, fqdn string) (*T // the error but don't return it so that DNS resolution will be forwarded upstream instead of // failing, to avoid breaking e.g. web app access (we don't know if this is a web or TCP app yet // because we can't log in). - slog.ErrorContext(ctx, "Failed to get teleport client.", "error", err) + r.log.ErrorContext(ctx, "Failed to get teleport client.", "error", err) continue } @@ -168,8 +169,7 @@ func (r *TCPAppResolver) ResolveTCPHandler(ctx context.Context, fqdn string) (*T leafClusterName = clusterClient.ClusterName() } - slog := r.slog.With("profile", profileName, "fqdn", fqdn, "leaf_cluster", leafClusterName) - return r.resolveTCPHandlerForCluster(ctx, slog, clusterClient, profileName, leafClusterName, fqdn) + return r.resolveTCPHandlerForCluster(ctx, clusterClient, profileName, leafClusterName, fqdn) } // fqdn did not match any profile, forward the request upstream. return nil, ErrNoTCPHandler @@ -180,7 +180,7 @@ var errNoMatch = errors.New("cluster does not match queried FQDN") func (r *TCPAppResolver) clusterClientForAppFQDN(ctx context.Context, profileName, fqdn string) (ClusterClient, error) { rootClient, err := r.appProvider.GetCachedClient(ctx, profileName, "") if err != nil { - r.slog.ErrorContext(ctx, "Failed to get root cluster client, apps in this cluster will not be resolved.", "profile", profileName, "error", err) + r.log.ErrorContext(ctx, "Failed to get root cluster client, apps in this cluster will not be resolved.", "profile", profileName, "error", err) return nil, errNoMatch } @@ -192,7 +192,7 @@ func (r *TCPAppResolver) clusterClientForAppFQDN(ctx context.Context, profileNam leafClusters, err := getLeafClusters(ctx, rootClient) if err != nil { // Good chance we're here because the user is not logged in to the profile. - r.slog.ErrorContext(ctx, "Failed to list leaf clusters, apps in this cluster will not be resolved.", "profile", profileName, "error", err) + r.log.ErrorContext(ctx, "Failed to list leaf clusters, apps in this cluster will not be resolved.", "profile", profileName, "error", err) return nil, errNoMatch } @@ -201,13 +201,13 @@ func (r *TCPAppResolver) clusterClientForAppFQDN(ctx context.Context, profileNam for _, leafClusterName := range allClusters { clusterClient, err := r.appProvider.GetCachedClient(ctx, profileName, leafClusterName) if err != nil { - r.slog.ErrorContext(ctx, "Failed to get cluster client, apps in this cluster will not be resolved.", "profile", profileName, "leaf_cluster", leafClusterName, "error", err) + r.log.ErrorContext(ctx, "Failed to get cluster client, apps in this cluster will not be resolved.", "profile", profileName, "leaf_cluster", leafClusterName, "error", err) continue } clusterConfig, err := r.clusterConfigCache.GetClusterConfig(ctx, clusterClient) if err != nil { - r.slog.ErrorContext(ctx, "Failed to get VnetConfig, apps in the cluster will not be resolved.", "profile", profileName, "leaf_cluster", leafClusterName, "error", err) + r.log.ErrorContext(ctx, "Failed to get VnetConfig, apps in the cluster will not be resolved.", "profile", profileName, "leaf_cluster", leafClusterName, "error", err) continue } for _, zone := range clusterConfig.DNSZones { @@ -242,10 +242,10 @@ func getLeafClusters(ctx context.Context, rootClient ClusterClient) ([]string, e // query. func (r *TCPAppResolver) resolveTCPHandlerForCluster( ctx context.Context, - slog *slog.Logger, clusterClient ClusterClient, profileName, leafClusterName, fqdn string, ) (*TCPHandlerSpec, error) { + log := r.log.With("profile", profileName, "leaf_cluster", leafClusterName, "fqdn", fqdn) // An app public_addr could technically be full-qualified or not, match either way. expr := fmt.Sprintf(`(resource.spec.public_addr == "%s" || resource.spec.public_addr == "%s") && hasPrefix(resource.spec.uri, "tcp://")`, strings.TrimSuffix(fqdn, "."), fqdn) @@ -257,7 +257,7 @@ func (r *TCPAppResolver) resolveTCPHandlerForCluster( if err != nil { // Don't return an unexpected error so we can try to find the app in different clusters or forward the // request upstream. - slog.InfoContext(ctx, "Failed to list application servers.", "error", err) + log.InfoContext(ctx, "Failed to list application servers.", "error", err) return nil, ErrNoTCPHandler } if len(resp.Resources) == 0 { @@ -282,9 +282,15 @@ func (r *TCPAppResolver) resolveTCPHandlerForCluster( } type tcpAppHandler struct { - profileName string - leafClusterName string - lp *alpnproxy.LocalProxy + log *slog.Logger + appProvider AppProvider + clock clockwork.Clock + profileName string + leafClusterName string + app types.Application + portToLocalProxy map[uint16]*alpnproxy.LocalProxy + // mu guards access to portToLocalProxy. + mu sync.Mutex } func (r *TCPAppResolver) newTCPAppHandler( @@ -293,38 +299,73 @@ func (r *TCPAppResolver) newTCPAppHandler( leafClusterName string, app types.Application, ) (*tcpAppHandler, error) { - dialOpts, err := r.appProvider.GetDialOptions(ctx, profileName) + return &tcpAppHandler{ + appProvider: r.appProvider, + clock: r.clock, + profileName: profileName, + leafClusterName: leafClusterName, + app: app, + portToLocalProxy: make(map[uint16]*alpnproxy.LocalProxy), + log: r.log.With(teleport.ComponentKey, "VNet.AppHandler", + "profile", profileName, "leaf_cluster", leafClusterName, "fqdn", app.GetPublicAddr()), + }, nil +} + +// getOrInitializeLocalProxy returns a separate local proxy for each port for multi-port apps. For +// single-port apps, it returns the same local proxy no matter the port. +func (h *tcpAppHandler) getOrInitializeLocalProxy(ctx context.Context, localPort uint16) (*alpnproxy.LocalProxy, error) { + h.mu.Lock() + defer h.mu.Unlock() + + // Connections to single-port apps need to go through a local proxy that has a cert with TargetPort + // set to 0. This ensures that the old behavior is kept for such apps, where the client can dial + // the public address of an app on any port and be routed to the port from the URI. + // + // https://github.com/gravitational/teleport/blob/master/rfd/0182-multi-port-tcp-app-access.md#vnet-with-single-port-apps + if len(h.app.GetTCPPorts()) == 0 { + localPort = 0 + } + // TODO(ravicious): For multi-port apps, check if localPort is valid and surface the error in UI. + // https://github.com/gravitational/teleport/blob/master/rfd/0182-multi-port-tcp-app-access.md#incorrect-port + + lp, ok := h.portToLocalProxy[localPort] + if ok { + return lp, nil + } + + dialOpts, err := h.appProvider.GetDialOptions(ctx, h.profileName) if err != nil { - return nil, trace.Wrap(err, "getting dial options for profile %q", profileName) + return nil, trace.Wrap(err, "getting dial options for profile %q", h.profileName) } - clusterClient, err := r.appProvider.GetCachedClient(ctx, profileName, leafClusterName) + clusterClient, err := h.appProvider.GetCachedClient(ctx, h.profileName, h.leafClusterName) if err != nil { return nil, trace.Wrap(err) } routeToApp := proto.RouteToApp{ - Name: app.GetName(), - PublicAddr: app.GetPublicAddr(), + Name: h.app.GetName(), + PublicAddr: h.app.GetPublicAddr(), // ClusterName must not be set to "" when targeting an app from a root cluster. Otherwise the // connection routed through a local proxy will just get lost somewhere in the cluster (with no // clear error being reported) and hang forever. ClusterName: clusterClient.ClusterName(), - URI: app.GetURI(), + URI: h.app.GetURI(), + TargetPort: uint32(localPort), } appCertIssuer := &appCertIssuer{ - appProvider: r.appProvider, - profileName: profileName, - leafClusterName: leafClusterName, + appProvider: h.appProvider, + profileName: h.profileName, + leafClusterName: h.leafClusterName, routeToApp: routeToApp, } - certChecker := client.NewCertChecker(appCertIssuer, r.clock) + certChecker := client.NewCertChecker(appCertIssuer, h.clock) middleware := &localProxyMiddleware{ certChecker: certChecker, - appProvider: r.appProvider, + appProvider: h.appProvider, routeToApp: routeToApp, - profileName: profileName, - leafClusterName: leafClusterName, + profileName: h.profileName, + leafClusterName: h.leafClusterName, } localProxyConfig := alpnproxy.LocalProxyConfig{ @@ -336,25 +377,28 @@ func (r *TCPAppResolver) newTCPAppHandler( ALPNConnUpgradeRequired: dialOpts.ALPNConnUpgradeRequired, Middleware: middleware, InsecureSkipVerify: dialOpts.InsecureSkipVerify, - Clock: r.clock, + Clock: h.clock, } - lp, err := alpnproxy.NewLocalProxy(localProxyConfig) + h.log.DebugContext(ctx, "Creating local proxy", "target_port", localPort) + newLP, err := alpnproxy.NewLocalProxy(localProxyConfig) if err != nil { return nil, trace.Wrap(err, "creating local proxy") } - return &tcpAppHandler{ - profileName: profileName, - leafClusterName: leafClusterName, - lp: lp, - }, nil + h.portToLocalProxy[localPort] = newLP + + return newLP, nil } // HandleTCPConnector handles an incoming TCP connection from VNet by passing it to the local alpn proxy, // which is set up with middleware to automatically handler certificate renewal and re-logins. -func (h *tcpAppHandler) HandleTCPConnector(ctx context.Context, connector func() (net.Conn, error)) error { - return trace.Wrap(h.lp.HandleTCPConnector(ctx, connector), "handling TCP connector") +func (h *tcpAppHandler) HandleTCPConnector(ctx context.Context, localPort uint16, connector func() (net.Conn, error)) error { + lp, err := h.getOrInitializeLocalProxy(ctx, localPort) + if err != nil { + return trace.Wrap(err) + } + return trace.Wrap(lp.HandleTCPConnector(ctx, connector), "handling TCP connector") } // appCertIssuer implements [client.CertIssuer]. diff --git a/lib/vnet/vnet.go b/lib/vnet/vnet.go index 66f07a92ff6cf..fb5b6710ac220 100644 --- a/lib/vnet/vnet.go +++ b/lib/vnet/vnet.go @@ -117,7 +117,7 @@ type TCPHandlerSpec struct { // [connector] to complete the TCP handshake and get the TCP conn. This is so that clients will see that the // TCP connection was refused, instead of seeing a successful TCP dial that is immediately closed. type TCPHandler interface { - HandleTCPConnector(ctx context.Context, connector func() (net.Conn, error)) error + HandleTCPConnector(ctx context.Context, localPort uint16, connector func() (net.Conn, error)) error } // UDPHandler defines the behavior for handling UDP connections from VNet. @@ -423,7 +423,7 @@ func (ns *NetworkStack) handleTCP(req *tcp.ForwarderRequest) { return conn, nil } - if err := handler.HandleTCPConnector(ctx, connector); err != nil { + if err := handler.HandleTCPConnector(ctx, id.LocalPort, connector); err != nil { if errors.Is(err, context.Canceled) { slog.DebugContext(ctx, "TCP connection handler returned early due to canceled context.") } else { diff --git a/lib/vnet/vnet_test.go b/lib/vnet/vnet_test.go index 34416e1e64cc3..96259bbb51e26 100644 --- a/lib/vnet/vnet_test.go +++ b/lib/vnet/vnet_test.go @@ -18,6 +18,7 @@ package vnet import ( "bytes" + "cmp" "context" "crypto/ed25519" "crypto/rand" @@ -52,6 +53,7 @@ import ( headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" "github.com/gravitational/teleport/api/gen/proto/go/teleport/vnet/v1" "github.com/gravitational/teleport/api/types" + apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/utils" ) @@ -210,7 +212,7 @@ func (p *testPack) lookupHost(ctx context.Context, host string) ([]string, error return resolver.LookupHost(ctx, host) } -func (p *testPack) dialHost(ctx context.Context, host string) (net.Conn, error) { +func (p *testPack) dialHost(ctx context.Context, host string, port int) (net.Conn, error) { addrs, err := p.lookupHost(ctx, host) if err != nil { return nil, trace.Wrap(err) @@ -219,7 +221,7 @@ func (p *testPack) dialHost(ctx context.Context, host string) (net.Conn, error) for _, addr := range addrs { netIP := net.ParseIP(addr) ip := tcpip.AddrFromSlice(netIP) - conn, err := p.dialIPPort(ctx, ip, 123) + conn, err := p.dialIPPort(ctx, ip, uint16(port)) if err != nil { allErrs = append(allErrs, trace.Wrap(err, "dialing %s", addr)) continue @@ -235,8 +237,14 @@ func (n noUpstreamNameservers) UpstreamNameservers(ctx context.Context) ([]strin return nil, nil } +type appSpec struct { + // publicAddr is used both as the name of the app and its public address in the final spec. + publicAddr string + tcpPorts []*types.PortRange +} + type testClusterSpec struct { - apps []string + apps []appSpec cidrRange string customDNSZones []string leafClusters map[string]testClusterSpec @@ -247,14 +255,18 @@ type echoAppProvider struct { dialOpts DialOptions reissueAppCert func() tls.Certificate onNewConnectionCallCount atomic.Uint32 + // requestedRouteToApps indexed by public address. + requestedRouteToApps map[string][]proto.RouteToApp + requestedRouteToAppsMu sync.RWMutex } // newEchoAppProvider returns an app provider with the list of named apps in each profile and leaf cluster. func newEchoAppProvider(clusterSpecs map[string]testClusterSpec, dialOpts DialOptions, reissueAppCert func() tls.Certificate) *echoAppProvider { return &echoAppProvider{ - clusters: clusterSpecs, - dialOpts: dialOpts, - reissueAppCert: reissueAppCert, + clusters: clusterSpecs, + dialOpts: dialOpts, + reissueAppCert: reissueAppCert, + requestedRouteToApps: make(map[string][]proto.RouteToApp), } } @@ -292,9 +304,25 @@ func (p *echoAppProvider) GetCachedClient(ctx context.Context, profileName, leaf } func (p *echoAppProvider) ReissueAppCert(ctx context.Context, profileName, leafClusterName string, routeToApp proto.RouteToApp) (tls.Certificate, error) { + p.requestedRouteToAppsMu.Lock() + defer p.requestedRouteToAppsMu.Unlock() + + p.requestedRouteToApps[routeToApp.PublicAddr] = append(p.requestedRouteToApps[routeToApp.PublicAddr], routeToApp) + return p.reissueAppCert(), nil } +func (p *echoAppProvider) AreAllRequestedRouteToAppsForPort(publicAddr string, port int) bool { + p.requestedRouteToAppsMu.RLock() + defer p.requestedRouteToAppsMu.RUnlock() + + routes := p.requestedRouteToApps[publicAddr] + + return apiutils.All(routes, func(route proto.RouteToApp) bool { + return route.TargetPort == uint32(port) + }) +} + func (p *echoAppProvider) GetDialOptions(ctx context.Context, profileName string) (*DialOptions, error) { return &p.dialOpts, nil } @@ -379,25 +407,31 @@ func (c *fakeAuthClient) GetResources(ctx context.Context, req *proto.ListResour resp := &proto.ListResourcesResponse{} for _, app := range c.clusterSpec.apps { // Poor-man's predicate expression filter. - if !strings.Contains(req.PredicateExpression, app) { + if !strings.Contains(req.PredicateExpression, app.publicAddr) { continue } + spec := &types.AppV3{ + Metadata: types.Metadata{ + Name: app.publicAddr, + }, + Spec: types.AppSpecV3{ + PublicAddr: app.publicAddr, + }, + } + + if len(app.tcpPorts) != 0 { + spec.SetTCPPorts(app.tcpPorts) + } + resp.Resources = append(resp.Resources, &proto.PaginatedResource{ Resource: &proto.PaginatedResource_AppServer{ AppServer: &types.AppServerV3{ Kind: types.KindAppServer, Metadata: types.Metadata{ - Name: app, + Name: app.publicAddr, }, Spec: types.AppServerSpecV3{ - App: &types.AppV3{ - Metadata: types.Metadata{ - Name: app, - }, - Spec: types.AppSpecV3{ - PublicAddr: app, - }, - }, + App: spec, }, }, }, @@ -456,12 +490,23 @@ func TestDialFakeApp(t *testing.T) { appProvider := newEchoAppProvider(map[string]testClusterSpec{ "root1.example.com": { - apps: []string{ - "echo1.root1.example.com", - "echo2.root1.example.com", - "echo.myzone.example.com", - "echo.nested.myzone.example.com", - "not.in.a.custom.zone", + apps: []appSpec{ + appSpec{publicAddr: "echo1.root1.example.com"}, + appSpec{publicAddr: "echo2.root1.example.com"}, + appSpec{publicAddr: "echo.myzone.example.com"}, + appSpec{publicAddr: "echo.nested.myzone.example.com"}, + appSpec{publicAddr: "not.in.a.custom.zone"}, + appSpec{ + publicAddr: "multi-port.root1.example.com", + tcpPorts: []*types.PortRange{ + &types.PortRange{ + Port: 1337, + }, + &types.PortRange{ + Port: 4242, + }, + }, + }, }, customDNSZones: []string{ "myzone.example.com", @@ -469,18 +514,38 @@ func TestDialFakeApp(t *testing.T) { cidrRange: "192.168.2.0/24", leafClusters: map[string]testClusterSpec{ "leaf1.example.com": { - apps: []string{"echo1.leaf1.example.com"}, + apps: []appSpec{ + appSpec{publicAddr: "echo1.leaf1.example.com"}, + appSpec{ + publicAddr: "multi-port.leaf1.example.com", + tcpPorts: []*types.PortRange{ + &types.PortRange{ + Port: 1337, + }, + &types.PortRange{ + Port: 4242, + }, + }, + }, + }, }, "leaf2.example.com": { - apps: []string{"echo1.leaf2.example.com"}, + apps: []appSpec{ + appSpec{publicAddr: "echo1.leaf2.example.com"}, + }, }, }, }, "root2.example.com": { - apps: []string{"echo1.root2.example.com", "echo2.root2.example.com"}, + apps: []appSpec{ + appSpec{publicAddr: "echo1.root2.example.com"}, + appSpec{publicAddr: "echo2.root2.example.com"}, + }, leafClusters: map[string]testClusterSpec{ "leaf3.example.com": { - apps: []string{"echo1.leaf3.example.com"}, + apps: []appSpec{ + appSpec{publicAddr: "echo1.leaf3.example.com"}, + }, }, }, }, @@ -493,6 +558,7 @@ func TestDialFakeApp(t *testing.T) { validTestCases := []struct { app string + port int expectCIDR string }{ { @@ -531,6 +597,16 @@ func TestDialFakeApp(t *testing.T) { app: "echo1.leaf3.example.com", expectCIDR: defaultIPv4CIDRRange, }, + { + app: "multi-port.root1.example.com", + port: 1337, + expectCIDR: "192.168.2.0/24", + }, + { + app: "multi-port.leaf1.example.com", + port: 1337, + expectCIDR: defaultIPv4CIDRRange, + }, } t.Run("valid", func(t *testing.T) { @@ -550,7 +626,8 @@ func TestDialFakeApp(t *testing.T) { _, expectNet, err := net.ParseCIDR(tc.expectCIDR) require.NoError(t, err) - conn, err := p.dialHost(ctx, tc.app) + const defaultPort = 80 + conn, err := p.dialHost(ctx, tc.app, cmp.Or(tc.port, defaultPort)) require.NoError(t, err) t.Cleanup(func() { assert.NoError(t, conn.Close()) }) @@ -565,6 +642,14 @@ func TestDialFakeApp(t *testing.T) { require.True(t, expectNet.Contains(remoteIPSuffix), "expected CIDR range %s does not include remote IP %s", expectNet, remoteIPSuffix) testEchoConnection(t, conn) + + // For multi-port apps, certs should have RouteToApp.TargetPort set to the specified + // cert. + // + // Single-port apps are going to be dialed on defaultPort in tests, but certs for them + // need to have RouteToApp.TargetPort set to 0. + require.True(t, appProvider.AreAllRequestedRouteToAppsForPort(tc.app, tc.port), + "not all requested certs had RouteToApp.TargetPort set to %d", tc.port) }) } }) @@ -627,7 +712,9 @@ func TestOnNewConnection(t *testing.T) { appProvider := newEchoAppProvider(map[string]testClusterSpec{ "root1.example.com": { - apps: []string{"echo1"}, + apps: []appSpec{ + appSpec{publicAddr: "echo1"}, + }, cidrRange: "192.168.2.0/24", leafClusters: map[string]testClusterSpec{}, }, @@ -650,7 +737,7 @@ func TestOnNewConnection(t *testing.T) { require.Equal(t, uint32(0), appProvider.onNewConnectionCallCount.Load()) // Establish a connection to a valid app and verify that OnNewConnection was called. - conn, err := p.dialHost(ctx, validAppName) + conn, err := p.dialHost(ctx, validAppName, 80 /* bogus port */) require.NoError(t, err) t.Cleanup(func() { require.NoError(t, conn.Close()) }) require.Equal(t, uint32(1), appProvider.onNewConnectionCallCount.Load()) diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index fb8794c1272e6..9bbfadd29877f 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -151,13 +151,12 @@ type Handler struct { sync.Mutex httprouter.Router - cfg Config - auth *sessionCache - sessionStreamPollPeriod time.Duration - clock clockwork.Clock - limiter *limiter.RateLimiter - highLimiter *limiter.RateLimiter - healthCheckAppServer healthCheckAppServerFunc + cfg Config + auth *sessionCache + clock clockwork.Clock + limiter *limiter.RateLimiter + highLimiter *limiter.RateLimiter + healthCheckAppServer healthCheckAppServerFunc // sshPort specifies the SSH proxy port extracted // from configuration sshPort string @@ -175,32 +174,19 @@ type Handler struct { // tracer is used to create spans. tracer oteltrace.Tracer - // wsIODeadline is used to set a deadline for receiving a message from - // an authenticated websocket so unauthenticated sockets dont get left - // open. - wsIODeadline time.Duration - // findEndpointCache is used to cache the find endpoint answer. As this endpoint is unprotected and has high // rate-limits, each call must cause minimal work. The cached answer can be modulated after, for example if the // caller specified its Automatic Updates UUID or group. findEndpointCache *utils.FnCache + + // clusterMaintenanceConfig is used to cache the cluster maintenance config from the AUth Service. + clusterMaintenanceConfigCache *utils.FnCache } // HandlerOption is a functional argument - an option that can be passed // to NewHandler function type HandlerOption func(h *Handler) error -// SetSessionStreamPollPeriod sets polling period for session streams -func SetSessionStreamPollPeriod(period time.Duration) HandlerOption { - return func(h *Handler) error { - if period < 0 { - return trace.BadParameter("period should be non zero") - } - h.sessionStreamPollPeriod = period - return nil - } -} - // SetClock sets the clock on a handler func SetClock(clock clockwork.Clock) HandlerOption { return func(h *Handler) error { @@ -213,7 +199,7 @@ type ProxySettingsGetter interface { GetProxySettings(ctx context.Context) (*webclient.ProxySettings, error) } -// PresenceChecker is a function that executes an mfa prompt to enforce +// PresenceChecker is a function that executes an MFA prompt to enforce // that a user is present. type PresenceChecker = func(ctx context.Context, term io.Writer, maintainer client.PresenceMaintainer, sessionID string, mfaCeremony *mfa.Ceremony, opts ...client.PresenceOption) error @@ -226,8 +212,6 @@ type Config struct { Proxy reversetunnelclient.Tunnel // AuthServers is a list of auth servers this proxy talks to AuthServers utils.NetAddr - // DomainName is a domain name served by web handler - DomainName string // ProxyClient is a client that authenticated as proxy ProxyClient authclient.ClientI // ProxySSHAddr points to the SSH address of the proxy @@ -472,7 +456,6 @@ func NewHandler(cfg Config, opts ...HandlerOption) (*APIHandler, error) { clusterFeatures: cfg.ClusterFeatures, healthCheckAppServer: cfg.HealthCheckAppServer, tracer: cfg.TracerProvider.Tracer(teleport.ComponentWeb), - wsIODeadline: wsIODeadline, } if automaticUpgrades(cfg.ClusterFeatures) && h.cfg.AutomaticUpgradesChannels == nil { @@ -500,6 +483,18 @@ func NewHandler(cfg Config, opts ...HandlerOption) (*APIHandler, error) { } h.findEndpointCache = findCache + // We create the cache after applying the options to make sure we use the fake clock if it was passed. + cmcCache, err := utils.NewFnCache(utils.FnCacheConfig{ + TTL: findEndpointCacheTTL, + Clock: h.clock, + Context: cfg.Context, + ReloadOnErr: false, + }) + if err != nil { + return nil, trace.Wrap(err, "creating /find cache") + } + h.clusterMaintenanceConfigCache = cmcCache + sessionLingeringThreshold := cachedSessionLingeringThreshold if cfg.CachedSessionLingeringThreshold != nil { sessionLingeringThreshold = *cfg.CachedSessionLingeringThreshold @@ -1547,6 +1542,8 @@ func (h *Handler) ping(w http.ResponseWriter, r *http.Request, p httprouter.Para return nil, trace.Wrap(err) } + group := r.URL.Query().Get(webclient.AgentUpdateGroupParameter) + return webclient.PingResponse{ Auth: authSettings, Proxy: *proxyConfig, @@ -1554,15 +1551,21 @@ func (h *Handler) ping(w http.ResponseWriter, r *http.Request, p httprouter.Para MinClientVersion: teleport.MinClientVersion, ClusterName: h.auth.clusterName, AutomaticUpgrades: pr.ServerFeatures.GetAutomaticUpgrades(), - AutoUpdate: h.automaticUpdateSettings184(r.Context()), + AutoUpdate: h.automaticUpdateSettings184(r.Context(), group, "" /* updater UUID */), Edition: modules.GetModules().BuildType(), FIPS: modules.IsBoringBinary(), }, nil } func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Params) (interface{}, error) { + group := r.URL.Query().Get(webclient.AgentUpdateGroupParameter) + cacheKey := "find" + if group != "" { + cacheKey += "-" + group + } + // cache the generic answer to avoid doing work for each request - resp, err := utils.FnCacheGet[*webclient.PingResponse](r.Context(), h.findEndpointCache, "find", func(ctx context.Context) (*webclient.PingResponse, error) { + resp, err := utils.FnCacheGet[*webclient.PingResponse](r.Context(), h.findEndpointCache, cacheKey, func(ctx context.Context) (*webclient.PingResponse, error) { proxyConfig, err := h.cfg.ProxySettings.GetProxySettings(ctx) if err != nil { return nil, trace.Wrap(err) @@ -1581,7 +1584,7 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para ClusterName: h.auth.clusterName, Edition: modules.GetModules().BuildType(), FIPS: modules.IsBoringBinary(), - AutoUpdate: h.automaticUpdateSettings184(ctx), + AutoUpdate: h.automaticUpdateSettings184(ctx, group, "" /* updater UUID */), }, nil }) if err != nil { diff --git a/lib/web/apiserver_ping_test.go b/lib/web/apiserver_ping_test.go index 2bf325d4f7902..84e073ca7ae87 100644 --- a/lib/web/apiserver_ping_test.go +++ b/lib/web/apiserver_ping_test.go @@ -299,6 +299,7 @@ func TestPing_autoUpdateResources(t *testing.T) { name string config *autoupdatev1pb.AutoUpdateConfigSpec version *autoupdatev1pb.AutoUpdateVersionSpec + rollout *autoupdatev1pb.AutoUpdateAgentRolloutSpec cleanup bool expected webclient.AutoUpdateSettings }{ @@ -330,19 +331,12 @@ func TestPing_autoUpdateResources(t *testing.T) { }, { name: "enable agent auto update, immediate schedule", - config: &autoupdatev1pb.AutoUpdateConfigSpec{ - Agents: &autoupdatev1pb.AutoUpdateConfigSpecAgents{ - Mode: autoupdate.AgentsUpdateModeEnabled, - Strategy: autoupdate.AgentsStrategyHaltOnError, - }, - }, - version: &autoupdatev1pb.AutoUpdateVersionSpec{ - Agents: &autoupdatev1pb.AutoUpdateVersionSpecAgents{ - Mode: autoupdate.AgentsUpdateModeEnabled, - StartVersion: "1.2.3", - TargetVersion: "1.2.4", - Schedule: autoupdate.AgentsScheduleImmediate, - }, + rollout: &autoupdatev1pb.AutoUpdateAgentRolloutSpec{ + AutoupdateMode: autoupdate.AgentsUpdateModeEnabled, + Strategy: autoupdate.AgentsStrategyHaltOnError, + Schedule: autoupdate.AgentsScheduleImmediate, + StartVersion: "1.2.3", + TargetVersion: "1.2.4", }, expected: webclient.AutoUpdateSettings{ ToolsVersion: api.Version, @@ -354,20 +348,13 @@ func TestPing_autoUpdateResources(t *testing.T) { cleanup: true, }, { - name: "version enable agent auto update, but config disables them", - config: &autoupdatev1pb.AutoUpdateConfigSpec{ - Agents: &autoupdatev1pb.AutoUpdateConfigSpecAgents{ - Mode: autoupdate.AgentsUpdateModeDisabled, - Strategy: autoupdate.AgentsStrategyHaltOnError, - }, - }, - version: &autoupdatev1pb.AutoUpdateVersionSpec{ - Agents: &autoupdatev1pb.AutoUpdateVersionSpecAgents{ - Mode: autoupdate.AgentsUpdateModeEnabled, - StartVersion: "1.2.3", - TargetVersion: "1.2.4", - Schedule: autoupdate.AgentsScheduleImmediate, - }, + name: "agent rollout present but AU mode is disabled", + rollout: &autoupdatev1pb.AutoUpdateAgentRolloutSpec{ + AutoupdateMode: autoupdate.AgentsUpdateModeDisabled, + Strategy: autoupdate.AgentsStrategyHaltOnError, + Schedule: autoupdate.AgentsScheduleImmediate, + StartVersion: "1.2.3", + TargetVersion: "1.2.4", }, expected: webclient.AutoUpdateSettings{ ToolsVersion: api.Version, @@ -462,6 +449,12 @@ func TestPing_autoUpdateResources(t *testing.T) { _, err = env.server.Auth().UpsertAutoUpdateVersion(ctx, version) require.NoError(t, err) } + if tc.rollout != nil { + rollout, err := autoupdate.NewAutoUpdateAgentRollout(tc.rollout) + require.NoError(t, err) + _, err = env.server.Auth().UpsertAutoUpdateAgentRollout(ctx, rollout) + require.NoError(t, err) + } // expire the fn cache to force the next answer to be fresh for _, proxy := range env.proxies { @@ -480,6 +473,7 @@ func TestPing_autoUpdateResources(t *testing.T) { if tc.cleanup { require.NotErrorIs(t, env.server.Auth().DeleteAutoUpdateConfig(ctx), &trace.NotFoundError{}) require.NotErrorIs(t, env.server.Auth().DeleteAutoUpdateVersion(ctx), &trace.NotFoundError{}) + require.NotErrorIs(t, env.server.Auth().DeleteAutoUpdateAgentRollout(ctx), &trace.NotFoundError{}) } }) } diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index ff0f12fdc20cb..3a701fe65a26a 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -482,7 +482,6 @@ func newWebSuiteWithConfig(t *testing.T, cfg webSuiteConfig) *WebSuite { ClusterFeatures: features, Proxy: revTunServer, AuthServers: utils.FromAddr(s.server.TLS.Addr()), - DomainName: s.server.ClusterName(), ProxyClient: s.proxyClient, CipherSuites: utils.DefaultCipherSuites(), AccessPoint: s.proxyClient, @@ -515,7 +514,7 @@ func newWebSuiteWithConfig(t *testing.T, cfg webSuiteConfig) *WebSuite { handlerConfig.HealthCheckAppServer = func(context.Context, string, string) error { return nil } } - handler, err := NewHandler(handlerConfig, SetSessionStreamPollPeriod(200*time.Millisecond), SetClock(s.clock)) + handler, err := NewHandler(handlerConfig, SetClock(s.clock)) require.NoError(t, err) s.webServer = httptest.NewUnstartedServer(handler) @@ -8303,7 +8302,7 @@ func createProxy(ctx context.Context, t *testing.T, proxyID string, node *regula ServerID: proxyID, Emitter: client, EmitterContext: ctx, - Logger: log, + Logger: utils.NewSlogLoggerForTests(), }) require.NoError(t, err) @@ -8364,7 +8363,6 @@ func createProxy(ctx context.Context, t *testing.T, proxyID string, node *regula handler, err := NewHandler(Config{ Proxy: revTunServer, AuthServers: utils.FromAddr(authServer.Addr()), - DomainName: authServer.ClusterName(), ProxyClient: client, ProxyPublicAddrs: utils.MustParseAddrList("proxy-1.example.com", "proxy-2.example.com"), CipherSuites: utils.DefaultCipherSuites(), @@ -8390,7 +8388,7 @@ func createProxy(ctx context.Context, t *testing.T, proxyID string, node *regula return &proxyClientCert, nil }, IntegrationAppHandler: &mockIntegrationAppHandler{}, - }, SetSessionStreamPollPeriod(200*time.Millisecond), SetClock(clock)) + }, SetClock(clock)) require.NoError(t, err) webServer := httptest.NewTLSServer(handler) @@ -9643,7 +9641,6 @@ func TestWebSocketAuthenticateRequest(t *testing.T) { ctx := context.Background() env := newWebPack(t, 1) proxy := env.proxies[0] - proxy.handler.handler.wsIODeadline = time.Second pack := proxy.authPack(t, "test-user@example.com", nil) for _, tc := range []struct { name string diff --git a/lib/web/autoupdate_common.go b/lib/web/autoupdate_common.go new file mode 100644 index 0000000000000..1756172f4c6e4 --- /dev/null +++ b/lib/web/autoupdate_common.go @@ -0,0 +1,228 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package web + +import ( + "context" + "strings" + + "github.com/gravitational/trace" + + autoupdatepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/autoupdate" + "github.com/gravitational/teleport/lib/automaticupgrades" + "github.com/gravitational/teleport/lib/utils" +) + +// autoUpdateAgentVersion returns the version the agent should install/update to based on +// its group and updater UUID. +// If the cluster contains an autoupdate_agent_rollout resource from RFD184 it should take precedence. +// If the resource is not there, we fall back to RFD109-style updates with channels +// and maintenance window derived from the cluster_maintenance_config resource. +// Version returned follows semver without the leading "v". +func (h *Handler) autoUpdateAgentVersion(ctx context.Context, group, updaterUUID string) (string, error) { + rollout, err := h.cfg.AccessPoint.GetAutoUpdateAgentRollout(ctx) + if err != nil { + // Fallback to channels if there is no autoupdate_agent_rollout. + if trace.IsNotFound(err) { + return getVersionFromChannel(ctx, h.cfg.AutomaticUpgradesChannels, group) + } + // Something is broken, we don't want to fallback to channels, this would be harmful. + return "", trace.Wrap(err, "getting autoupdate_agent_rollout") + } + + return getVersionFromRollout(rollout, group, updaterUUID) +} + +// autoUpdateAgentShouldUpdate returns if the agent should update now to based on its group +// and updater UUID. +// If the cluster contains an autoupdate_agent_rollout resource from RFD184 it should take precedence. +// If the resource is not there, we fall back to RFD109-style updates with channels +// and maintenance window derived from the cluster_maintenance_config resource. +func (h *Handler) autoUpdateAgentShouldUpdate(ctx context.Context, group, updaterUUID string, windowLookup bool) (bool, error) { + rollout, err := h.cfg.AccessPoint.GetAutoUpdateAgentRollout(ctx) + if err != nil { + // Fallback to channels if there is no autoupdate_agent_rollout. + if trace.IsNotFound(err) { + // Updaters using the RFD184 API are not aware of maintenance windows + // like RFD109 updaters are. To have both updaters adopt the same behavior + // we must do the CMC window lookup for them. + if windowLookup { + return h.getTriggerFromWindowThenChannel(ctx, group) + } + return getTriggerFromChannel(ctx, h.cfg.AutomaticUpgradesChannels, group) + } + // Something is broken, we don't want to fallback to channels, this would be harmful. + return false, trace.Wrap(err, "failed to get auto-update rollout") + } + + return getTriggerFromRollout(rollout, group, updaterUUID) +} + +// getVersionFromRollout returns the version we should serve to the agent based +// on the RFD184 agent rollout, the agent group name, and its UUID. +// This logic is pretty complex and described in RFD 184. +// The spec is summed up in the following table: +// https://github.com/gravitational/teleport/blob/master/rfd/0184-agent-auto-updates.md#rollout-status-disabled +// Version returned follows semver without the leading "v". +func getVersionFromRollout( + rollout *autoupdatepb.AutoUpdateAgentRollout, + groupName, updaterUUID string, +) (string, error) { + switch rollout.GetSpec().GetAutoupdateMode() { + case autoupdate.AgentsUpdateModeDisabled: + // If AUs are disabled, we always answer the target version + return rollout.GetSpec().GetTargetVersion(), nil + case autoupdate.AgentsUpdateModeSuspended, autoupdate.AgentsUpdateModeEnabled: + // If AUs are enabled or suspended, we modulate the response based on the schedule and agent group state + default: + return "", trace.BadParameter("unsupported agent update mode %q", rollout.GetSpec().GetAutoupdateMode()) + } + + // If the schedule is immediate, agents always update to the latest version + if rollout.GetSpec().GetSchedule() == autoupdate.AgentsScheduleImmediate { + return rollout.GetSpec().GetTargetVersion(), nil + } + + // Else we follow the regular schedule and answer based on the agent group state + group, err := getGroup(rollout, groupName) + if err != nil { + return "", trace.Wrap(err, "getting group %q", groupName) + } + + switch group.GetState() { + case autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK: + return rollout.GetSpec().GetStartVersion(), nil + case autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_DONE: + return rollout.GetSpec().GetTargetVersion(), nil + default: + return "", trace.NotImplemented("unsupported group state %q", group.GetState()) + } +} + +// getTriggerFromRollout returns the version we should serve to the agent based +// on the RFD184 agent rollout, the agent group name, and its UUID. +// This logic is pretty complex and described in RFD 184. +// The spec is summed up in the following table: +// https://github.com/gravitational/teleport/blob/master/rfd/0184-agent-auto-updates.md#rollout-status-disabled +func getTriggerFromRollout(rollout *autoupdatepb.AutoUpdateAgentRollout, groupName, updaterUUID string) (bool, error) { + // If the mode is "paused" or "disabled", we never tell to update + switch rollout.GetSpec().GetAutoupdateMode() { + case autoupdate.AgentsUpdateModeDisabled, autoupdate.AgentsUpdateModeSuspended: + // If AUs are disabled or suspended, never tell to update + return false, nil + case autoupdate.AgentsUpdateModeEnabled: + // If AUs are enabled, we modulate the response based on the schedule and agent group state + default: + return false, trace.BadParameter("unsupported agent update mode %q", rollout.GetSpec().GetAutoupdateMode()) + } + + // If the schedule is immediate, agents always update to the latest version + if rollout.GetSpec().GetSchedule() == autoupdate.AgentsScheduleImmediate { + return true, nil + } + + // Else we follow the regular schedule and answer based on the agent group state + group, err := getGroup(rollout, groupName) + if err != nil { + return false, trace.Wrap(err, "getting group %q", groupName) + } + + switch group.GetState() { + case autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED: + return false, nil + case autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK: + return true, nil + case autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_DONE: + return rollout.GetSpec().GetStrategy() == autoupdate.AgentsStrategyHaltOnError, nil + default: + return false, trace.NotImplemented("Unsupported group state %q", group.GetState()) + } +} + +// getGroup returns the agent rollout group the requesting agent belongs to. +// If a group matches the agent-provided group name, this group is returned. +// Else the default group is returned. The default group currently is the last +// one. This might change in the future. +func getGroup( + rollout *autoupdatepb.AutoUpdateAgentRollout, + groupName string, +) (*autoupdatepb.AutoUpdateAgentRolloutStatusGroup, error) { + groups := rollout.GetStatus().GetGroups() + if len(groups) == 0 { + return nil, trace.BadParameter("no groups found") + } + + // Try to find a group with our name + for _, group := range groups { + if group.Name == groupName { + return group, nil + } + } + + // Fallback to the default group (currently the last one but this might change). + return groups[len(groups)-1], nil +} + +// getVersionFromChannel gets the target version from the RFD109 channels. +// Version returned follows semver without the leading "v". +func getVersionFromChannel(ctx context.Context, channels automaticupgrades.Channels, groupName string) (version string, err error) { + // RFD109 channels return the version with the 'v' prefix. + // We can't change the internals for backward compatibility, so we must trim the prefix if it's here. + defer func() { + version = strings.TrimPrefix(version, "v") + }() + + if channel, ok := channels[groupName]; ok { + return channel.GetVersion(ctx) + } + return channels.DefaultVersion(ctx) +} + +// getTriggerFromWindowThenChannel gets the target version from the RFD109 maintenance window and channels. +func (h *Handler) getTriggerFromWindowThenChannel(ctx context.Context, groupName string) (bool, error) { + // Caching the CMC for 10 seconds because this resource is cached neither by the auth nor the proxy. + // And this function can be accessed via unauthenticated endpoints. + cmc, err := utils.FnCacheGet[types.ClusterMaintenanceConfig](ctx, h.clusterMaintenanceConfigCache, "cmc", func(ctx context.Context) (types.ClusterMaintenanceConfig, error) { + return h.cfg.ProxyClient.GetClusterMaintenanceConfig(ctx) + }) + + // If we have a CMC, we check if the window is active, else we just check if the update is critical. + if err == nil && cmc.WithinUpgradeWindow(h.clock.Now()) { + return true, nil + } + + return getTriggerFromChannel(ctx, h.cfg.AutomaticUpgradesChannels, groupName) +} + +// getTriggerFromWindowThenChannel gets the target version from the RFD109 channels. +func getTriggerFromChannel(ctx context.Context, channels automaticupgrades.Channels, groupName string) (bool, error) { + if channel, ok := channels[groupName]; ok { + return channel.GetCritical(ctx) + } + defaultChannel, err := channels.DefaultChannel() + if err != nil { + return false, trace.Wrap(err, "creating new default channel") + } + return defaultChannel.GetCritical(ctx) +} diff --git a/lib/web/autoupdate_common_test.go b/lib/web/autoupdate_common_test.go new file mode 100644 index 0000000000000..a365ac121b078 --- /dev/null +++ b/lib/web/autoupdate_common_test.go @@ -0,0 +1,796 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package web + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + autoupdatepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/autoupdate" + "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/automaticupgrades" + "github.com/gravitational/teleport/lib/automaticupgrades/constants" + "github.com/gravitational/teleport/lib/utils" +) + +const ( + testVersionHigh = "2.3.4" + testVersionLow = "2.0.4" +) + +// fakeRolloutAccessPoint allows us to mock the ProxyAccessPoint in autoupdate +// tests. +type fakeRolloutAccessPoint struct { + authclient.ProxyAccessPoint + + rollout *autoupdatepb.AutoUpdateAgentRollout + err error +} + +func (ap *fakeRolloutAccessPoint) GetAutoUpdateAgentRollout(_ context.Context) (*autoupdatepb.AutoUpdateAgentRollout, error) { + return ap.rollout, ap.err +} + +// fakeRolloutAccessPoint allows us to mock the proxy's auth client in autoupdate +// tests. +type fakeCMCAuthClient struct { + authclient.ClientI + + cmc types.ClusterMaintenanceConfig + err error +} + +func (c *fakeCMCAuthClient) GetClusterMaintenanceConfig(_ context.Context) (types.ClusterMaintenanceConfig, error) { + return c.cmc, c.err +} + +func TestAutoUpdateAgentVersion(t *testing.T) { + t.Parallel() + groupName := "test-group" + ctx := context.Background() + + // brokenChannelUpstream is a buggy upstream version server. + // This allows us to craft version channels returning errors. + brokenChannelUpstream := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusBadRequest) + })) + t.Cleanup(brokenChannelUpstream.Close) + + tests := []struct { + name string + rollout *autoupdatepb.AutoUpdateAgentRollout + rolloutErr error + channel *automaticupgrades.Channel + expectedVersion string + expectError require.ErrorAssertionFunc + }{ + { + name: "version is looked up from rollout if it is here", + rollout: &autoupdatepb.AutoUpdateAgentRollout{ + Spec: &autoupdatepb.AutoUpdateAgentRolloutSpec{ + AutoupdateMode: autoupdate.AgentsUpdateModeEnabled, + TargetVersion: testVersionHigh, + Schedule: autoupdate.AgentsScheduleImmediate, + }, + }, + channel: &automaticupgrades.Channel{StaticVersion: testVersionLow}, + expectError: require.NoError, + expectedVersion: testVersionHigh, + }, + { + name: "version is looked up from channel if rollout is not here", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{StaticVersion: testVersionLow}, + expectError: require.NoError, + expectedVersion: testVersionLow, + }, + { + name: "hard error getting rollout should not fallback to version channels", + rolloutErr: trace.AccessDenied("something is very broken"), + channel: &automaticupgrades.Channel{ + StaticVersion: testVersionLow, + }, + expectError: require.Error, + }, + { + name: "no rollout, error checking channel", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{ForwardURL: brokenChannelUpstream.URL}, + expectError: require.Error, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Test setup: building the channel, mock client, and handler with test config. + require.NoError(t, tt.channel.CheckAndSetDefaults()) + h := &Handler{ + cfg: Config{ + AccessPoint: &fakeRolloutAccessPoint{ + rollout: tt.rollout, + err: tt.rolloutErr, + }, + AutomaticUpgradesChannels: map[string]*automaticupgrades.Channel{ + groupName: tt.channel, + }, + }, + } + + // Test execution + result, err := h.autoUpdateAgentVersion(ctx, groupName, "") + tt.expectError(t, err) + require.Equal(t, tt.expectedVersion, result) + }) + } +} + +// TestAutoUpdateAgentShouldUpdate also accidentally tests getTriggerFromWindowThenChannel. +func TestAutoUpdateAgentShouldUpdate(t *testing.T) { + t.Parallel() + + groupName := "test-group" + ctx := context.Background() + + // brokenChannelUpstream is a buggy upstream version server. + // This allows us to craft version channels returning errors. + brokenChannelUpstream := httptest.NewServer( + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusBadRequest) + })) + t.Cleanup(brokenChannelUpstream.Close) + + clock := clockwork.NewFakeClock() + cmcCache, err := utils.NewFnCache(utils.FnCacheConfig{ + TTL: findEndpointCacheTTL, + Clock: clock, + Context: ctx, + ReloadOnErr: false, + }) + require.NoError(t, err) + t.Cleanup(func() { + cmcCache.Shutdown(ctx) + }) + + activeUpgradeWindow := types.AgentUpgradeWindow{UTCStartHour: uint32(clock.Now().Hour())} + inactiveUpgradeWindow := types.AgentUpgradeWindow{UTCStartHour: uint32(clock.Now().Add(2 * time.Hour).Hour())} + tests := []struct { + name string + rollout *autoupdatepb.AutoUpdateAgentRollout + rolloutErr error + channel *automaticupgrades.Channel + upgradeWindow types.AgentUpgradeWindow + cmcErr error + windowLookup bool + expectedTrigger bool + expectError require.ErrorAssertionFunc + }{ + { + name: "trigger is looked up from rollout if it is here, trigger firing", + rollout: &autoupdatepb.AutoUpdateAgentRollout{ + Spec: &autoupdatepb.AutoUpdateAgentRolloutSpec{ + AutoupdateMode: autoupdate.AgentsUpdateModeEnabled, + TargetVersion: testVersionHigh, + Schedule: autoupdate.AgentsScheduleImmediate, + }, + }, + channel: &automaticupgrades.Channel{StaticVersion: testVersionLow}, + expectError: require.NoError, + expectedTrigger: true, + }, + { + name: "trigger is looked up from rollout if it is here, trigger not firing", + rollout: &autoupdatepb.AutoUpdateAgentRollout{ + Spec: &autoupdatepb.AutoUpdateAgentRolloutSpec{ + AutoupdateMode: autoupdate.AgentsUpdateModeDisabled, + TargetVersion: testVersionHigh, + Schedule: autoupdate.AgentsScheduleImmediate, + }, + }, + channel: &automaticupgrades.Channel{StaticVersion: testVersionLow}, + expectError: require.NoError, + expectedTrigger: false, + }, + { + name: "trigger is looked up from channel if rollout is not here and window lookup is disabled, trigger not firing", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{ + StaticVersion: testVersionLow, + Critical: false, + }, + expectError: require.NoError, + expectedTrigger: false, + }, + { + name: "trigger is looked up from channel if rollout is not here and window lookup is disabled, trigger firing", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{ + StaticVersion: testVersionLow, + Critical: true, + }, + expectError: require.NoError, + expectedTrigger: true, + }, + { + name: "trigger is looked up from cmc, then channel if rollout is not here and window lookup is enabled, cmc firing", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{ + StaticVersion: testVersionLow, + Critical: false, + }, + upgradeWindow: activeUpgradeWindow, + windowLookup: true, + expectError: require.NoError, + expectedTrigger: true, + }, + { + name: "trigger is looked up from cmc, then channel if rollout is not here and window lookup is enabled, cmc not firing", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{ + StaticVersion: testVersionLow, + Critical: false, + }, + upgradeWindow: inactiveUpgradeWindow, + windowLookup: true, + expectError: require.NoError, + expectedTrigger: false, + }, + { + name: "trigger is looked up from cmc, then channel if rollout is not here and window lookup is enabled, cmc not firing but channel firing", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{ + StaticVersion: testVersionLow, + Critical: true, + }, + upgradeWindow: inactiveUpgradeWindow, + windowLookup: true, + expectError: require.NoError, + expectedTrigger: true, + }, + { + name: "trigger is looked up from cmc, then channel if rollout is not here and window lookup is enabled, no cmc and channel not firing", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{ + StaticVersion: testVersionLow, + Critical: false, + }, + cmcErr: trace.NotFound("no cmc for this cluster"), + windowLookup: true, + expectError: require.NoError, + expectedTrigger: false, + }, + { + name: "trigger is looked up from cmc, then channel if rollout is not here and window lookup is enabled, no cmc and channel firing", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{ + StaticVersion: testVersionLow, + Critical: true, + }, + cmcErr: trace.NotFound("no cmc for this cluster"), + windowLookup: true, + expectError: require.NoError, + expectedTrigger: true, + }, + { + name: "hard error getting rollout should not fallback to RFD109 trigger", + rolloutErr: trace.AccessDenied("something is very broken"), + channel: &automaticupgrades.Channel{ + StaticVersion: testVersionLow, + }, + expectError: require.Error, + }, + { + name: "no rollout, error checking channel", + rolloutErr: trace.NotFound("rollout is not here"), + channel: &automaticupgrades.Channel{ + ForwardURL: brokenChannelUpstream.URL, + }, + expectError: require.Error, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Test setup: building the channel, mock clients, and handler with test config. + cmc := types.NewClusterMaintenanceConfig() + cmc.SetAgentUpgradeWindow(tt.upgradeWindow) + require.NoError(t, tt.channel.CheckAndSetDefaults()) + // Advance clock to invalidate cache + clock.Advance(2 * findEndpointCacheTTL) + h := &Handler{ + cfg: Config{ + AccessPoint: &fakeRolloutAccessPoint{ + rollout: tt.rollout, + err: tt.rolloutErr, + }, + ProxyClient: &fakeCMCAuthClient{ + cmc: cmc, + err: tt.cmcErr, + }, + AutomaticUpgradesChannels: map[string]*automaticupgrades.Channel{ + groupName: tt.channel, + }, + }, + clock: clock, + clusterMaintenanceConfigCache: cmcCache, + } + + // Test execution + result, err := h.autoUpdateAgentShouldUpdate(ctx, groupName, "", tt.windowLookup) + tt.expectError(t, err) + require.Equal(t, tt.expectedTrigger, result) + }) + } +} + +func TestGetVersionFromRollout(t *testing.T) { + t.Parallel() + groupName := "test-group" + + // This test matrix is written based on: + // https://github.com/gravitational/teleport/blob/master/rfd/0184-agent-auto-updates.md#rollout-status-disabled + latestAllTheTime := map[autoupdatepb.AutoUpdateAgentGroupState]string{ + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED: testVersionHigh, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_DONE: testVersionHigh, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE: testVersionHigh, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK: testVersionHigh, + } + + activeDoneOnly := map[autoupdatepb.AutoUpdateAgentGroupState]string{ + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED: testVersionLow, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_DONE: testVersionHigh, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE: testVersionHigh, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK: testVersionLow, + } + + tests := map[string]map[string]map[autoupdatepb.AutoUpdateAgentGroupState]string{ + autoupdate.AgentsUpdateModeDisabled: { + autoupdate.AgentsScheduleImmediate: latestAllTheTime, + autoupdate.AgentsScheduleRegular: latestAllTheTime, + }, + autoupdate.AgentsUpdateModeSuspended: { + autoupdate.AgentsScheduleImmediate: latestAllTheTime, + autoupdate.AgentsScheduleRegular: activeDoneOnly, + }, + autoupdate.AgentsUpdateModeEnabled: { + autoupdate.AgentsScheduleImmediate: latestAllTheTime, + autoupdate.AgentsScheduleRegular: activeDoneOnly, + }, + } + for mode, scheduleCases := range tests { + for schedule, stateCases := range scheduleCases { + for state, expectedVersion := range stateCases { + t.Run(fmt.Sprintf("%s/%s/%s", mode, schedule, state), func(t *testing.T) { + rollout := &autoupdatepb.AutoUpdateAgentRollout{ + Spec: &autoupdatepb.AutoUpdateAgentRolloutSpec{ + StartVersion: testVersionLow, + TargetVersion: testVersionHigh, + Schedule: schedule, + AutoupdateMode: mode, + // Strategy does not affect which version are served + Strategy: autoupdate.AgentsStrategyTimeBased, + }, + Status: &autoupdatepb.AutoUpdateAgentRolloutStatus{ + Groups: []*autoupdatepb.AutoUpdateAgentRolloutStatusGroup{ + { + Name: groupName, + State: state, + }, + }, + }, + } + version, err := getVersionFromRollout(rollout, groupName, "") + require.NoError(t, err) + require.Equal(t, expectedVersion, version) + }) + } + } + } +} + +func TestGetTriggerFromRollout(t *testing.T) { + t.Parallel() + groupName := "test-group" + + // This test matrix is written based on: + // https://github.com/gravitational/teleport/blob/master/rfd/0184-agent-auto-updates.md#rollout-status-disabled + neverUpdate := map[autoupdatepb.AutoUpdateAgentGroupState]bool{ + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED: false, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_DONE: false, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE: false, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK: false, + } + alwaysUpdate := map[autoupdatepb.AutoUpdateAgentGroupState]bool{ + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED: true, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_DONE: true, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE: true, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK: true, + } + + tests := map[string]map[string]map[string]map[autoupdatepb.AutoUpdateAgentGroupState]bool{ + autoupdate.AgentsUpdateModeDisabled: { + autoupdate.AgentsStrategyTimeBased: { + autoupdate.AgentsScheduleImmediate: neverUpdate, + autoupdate.AgentsScheduleRegular: neverUpdate, + }, + autoupdate.AgentsStrategyHaltOnError: { + autoupdate.AgentsScheduleImmediate: neverUpdate, + autoupdate.AgentsScheduleRegular: neverUpdate, + }, + }, + autoupdate.AgentsUpdateModeSuspended: { + autoupdate.AgentsStrategyTimeBased: { + autoupdate.AgentsScheduleImmediate: neverUpdate, + autoupdate.AgentsScheduleRegular: neverUpdate, + }, + autoupdate.AgentsStrategyHaltOnError: { + autoupdate.AgentsScheduleImmediate: neverUpdate, + autoupdate.AgentsScheduleRegular: neverUpdate, + }, + }, + autoupdate.AgentsUpdateModeEnabled: { + autoupdate.AgentsStrategyTimeBased: { + autoupdate.AgentsScheduleImmediate: alwaysUpdate, + autoupdate.AgentsScheduleRegular: { + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED: false, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_DONE: false, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE: true, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK: true, + }, + }, + autoupdate.AgentsStrategyHaltOnError: { + autoupdate.AgentsScheduleImmediate: alwaysUpdate, + autoupdate.AgentsScheduleRegular: { + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED: false, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_DONE: true, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE: true, + autoupdatepb.AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK: true, + }, + }, + }, + } + for mode, strategyCases := range tests { + for strategy, scheduleCases := range strategyCases { + for schedule, stateCases := range scheduleCases { + for state, expectedTrigger := range stateCases { + t.Run(fmt.Sprintf("%s/%s/%s/%s", mode, strategy, schedule, state), func(t *testing.T) { + rollout := &autoupdatepb.AutoUpdateAgentRollout{ + Spec: &autoupdatepb.AutoUpdateAgentRolloutSpec{ + StartVersion: testVersionLow, + TargetVersion: testVersionHigh, + Schedule: schedule, + AutoupdateMode: mode, + Strategy: strategy, + }, + Status: &autoupdatepb.AutoUpdateAgentRolloutStatus{ + Groups: []*autoupdatepb.AutoUpdateAgentRolloutStatusGroup{ + { + Name: groupName, + State: state, + }, + }, + }, + } + shouldUpdate, err := getTriggerFromRollout(rollout, groupName, "") + require.NoError(t, err) + require.Equal(t, expectedTrigger, shouldUpdate) + }) + } + } + } + } +} + +func TestGetGroup(t *testing.T) { + groupName := "test-group" + t.Parallel() + tests := []struct { + name string + rollout *autoupdatepb.AutoUpdateAgentRollout + expectedResult *autoupdatepb.AutoUpdateAgentRolloutStatusGroup + expectError require.ErrorAssertionFunc + }{ + { + name: "nil", + expectError: require.Error, + }, + { + name: "nil status", + rollout: &autoupdatepb.AutoUpdateAgentRollout{}, + expectError: require.Error, + }, + { + name: "nil status groups", + rollout: &autoupdatepb.AutoUpdateAgentRollout{Status: &autoupdatepb.AutoUpdateAgentRolloutStatus{}}, + expectError: require.Error, + }, + { + name: "empty status groups", + rollout: &autoupdatepb.AutoUpdateAgentRollout{ + Status: &autoupdatepb.AutoUpdateAgentRolloutStatus{ + Groups: []*autoupdatepb.AutoUpdateAgentRolloutStatusGroup{}, + }, + }, + expectError: require.Error, + }, + { + name: "group matching name", + rollout: &autoupdatepb.AutoUpdateAgentRollout{ + Status: &autoupdatepb.AutoUpdateAgentRolloutStatus{ + Groups: []*autoupdatepb.AutoUpdateAgentRolloutStatusGroup{ + {Name: "foo", State: 1}, + {Name: "bar", State: 1}, + {Name: groupName, State: 2}, + {Name: "baz", State: 1}, + }, + }, + }, + expectedResult: &autoupdatepb.AutoUpdateAgentRolloutStatusGroup{ + Name: groupName, + State: 2, + }, + expectError: require.NoError, + }, + { + name: "no group matching name, should fallback to default", + rollout: &autoupdatepb.AutoUpdateAgentRollout{ + Status: &autoupdatepb.AutoUpdateAgentRolloutStatus{ + Groups: []*autoupdatepb.AutoUpdateAgentRolloutStatusGroup{ + {Name: "foo", State: 1}, + {Name: "bar", State: 1}, + {Name: "baz", State: 1}, + }, + }, + }, + expectedResult: &autoupdatepb.AutoUpdateAgentRolloutStatusGroup{ + Name: "baz", + State: 1, + }, + expectError: require.NoError, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := getGroup(tt.rollout, groupName) + tt.expectError(t, err) + require.Equal(t, tt.expectedResult, result) + }) + } +} + +type mockRFD109VersionServer struct { + t *testing.T + channels map[string]channelStub +} + +type channelStub struct { + // with our without the leading "v" + version string + critical bool + fail bool +} + +func (m *mockRFD109VersionServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { + var path string + var writeResp func(w http.ResponseWriter, stub channelStub) error + + switch { + case strings.HasSuffix(r.URL.Path, constants.VersionPath): + path = strings.Trim(strings.TrimSuffix(r.URL.Path, constants.VersionPath), "/") + writeResp = func(w http.ResponseWriter, stub channelStub) error { + _, err := w.Write([]byte(stub.version)) + return err + } + case strings.HasSuffix(r.URL.Path, constants.MaintenancePath): + path = strings.Trim(strings.TrimSuffix(r.URL.Path, constants.MaintenancePath), "/") + writeResp = func(w http.ResponseWriter, stub channelStub) error { + response := "no" + if stub.critical { + response = "yes" + } + _, err := w.Write([]byte(response)) + return err + } + default: + assert.Fail(m.t, "unsupported path %q", r.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + + channel, ok := m.channels[path] + if !ok { + w.WriteHeader(http.StatusNotFound) + assert.Fail(m.t, "channel %q not found", path) + return + } + if channel.fail { + w.WriteHeader(http.StatusInternalServerError) + return + } + assert.NoError(m.t, writeResp(w, channel), "failed to write response") +} + +func TestGetVersionFromChannel(t *testing.T) { + t.Parallel() + ctx := context.Background() + + channelName := "test-channel" + + mock := mockRFD109VersionServer{ + t: t, + channels: map[string]channelStub{ + "broken": {fail: true}, + "with-leading-v": {version: "v" + testVersionHigh}, + "without-leading-v": {version: testVersionHigh}, + "low": {version: testVersionLow}, + }, + } + srv := httptest.NewServer(http.HandlerFunc(mock.ServeHTTP)) + t.Cleanup(srv.Close) + + tests := []struct { + name string + channels automaticupgrades.Channels + expectedResult string + expectError require.ErrorAssertionFunc + }{ + { + name: "channel with leading v", + channels: automaticupgrades.Channels{ + channelName: {ForwardURL: srv.URL + "/with-leading-v"}, + "default": {ForwardURL: srv.URL + "/low"}, + }, + expectedResult: testVersionHigh, + expectError: require.NoError, + }, + { + name: "channel without leading v", + channels: automaticupgrades.Channels{ + channelName: {ForwardURL: srv.URL + "/without-leading-v"}, + "default": {ForwardURL: srv.URL + "/low"}, + }, + expectedResult: testVersionHigh, + expectError: require.NoError, + }, + { + name: "fallback to default with leading v", + channels: automaticupgrades.Channels{ + "default": {ForwardURL: srv.URL + "/with-leading-v"}, + }, + expectedResult: testVersionHigh, + expectError: require.NoError, + }, + { + name: "fallback to default without leading v", + channels: automaticupgrades.Channels{ + "default": {ForwardURL: srv.URL + "/without-leading-v"}, + }, + expectedResult: testVersionHigh, + expectError: require.NoError, + }, + { + name: "broken channel", + channels: automaticupgrades.Channels{ + channelName: {ForwardURL: srv.URL + "/broken"}, + "default": {ForwardURL: srv.URL + "/without-leading-v"}, + }, + expectError: require.Error, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Test setup + require.NoError(t, tt.channels.CheckAndSetDefaults()) + + // Test execution + result, err := getVersionFromChannel(ctx, tt.channels, channelName) + tt.expectError(t, err) + require.Equal(t, tt.expectedResult, result) + }) + } +} + +func TestGetTriggerFromChannel(t *testing.T) { + t.Parallel() + ctx := context.Background() + + channelName := "test-channel" + + mock := mockRFD109VersionServer{ + t: t, + channels: map[string]channelStub{ + "broken": {fail: true}, + "critical": {critical: true}, + "non-critical": {critical: false}, + }, + } + srv := httptest.NewServer(http.HandlerFunc(mock.ServeHTTP)) + t.Cleanup(srv.Close) + + tests := []struct { + name string + channels automaticupgrades.Channels + expectedResult bool + expectError require.ErrorAssertionFunc + }{ + { + name: "critical channel", + channels: automaticupgrades.Channels{ + channelName: {ForwardURL: srv.URL + "/critical"}, + "default": {ForwardURL: srv.URL + "/non-critical"}, + }, + expectedResult: true, + expectError: require.NoError, + }, + { + name: "non-critical channel", + channels: automaticupgrades.Channels{ + channelName: {ForwardURL: srv.URL + "/non-critical"}, + "default": {ForwardURL: srv.URL + "/critical"}, + }, + expectedResult: false, + expectError: require.NoError, + }, + { + name: "fallback to default which is critical", + channels: automaticupgrades.Channels{ + "default": {ForwardURL: srv.URL + "/critical"}, + }, + expectedResult: true, + expectError: require.NoError, + }, + { + name: "fallback to default which is non-critical", + channels: automaticupgrades.Channels{ + "default": {ForwardURL: srv.URL + "/non-critical"}, + }, + expectedResult: false, + expectError: require.NoError, + }, + { + name: "broken channel", + channels: automaticupgrades.Channels{ + channelName: {ForwardURL: srv.URL + "/broken"}, + "default": {ForwardURL: srv.URL + "/critical"}, + }, + expectError: require.Error, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Test setup + require.NoError(t, tt.channels.CheckAndSetDefaults()) + + // Test execution + result, err := getTriggerFromChannel(ctx, tt.channels, channelName) + tt.expectError(t, err) + require.Equal(t, tt.expectedResult, result) + }) + } +} diff --git a/lib/web/autoupdate_rfd109.go b/lib/web/autoupdate_rfd109.go index b09b151220754..3bbdd0175b106 100644 --- a/lib/web/autoupdate_rfd109.go +++ b/lib/web/autoupdate_rfd109.go @@ -21,6 +21,7 @@ package web import ( "context" "errors" + "fmt" "net/http" "strings" "time" @@ -28,7 +29,6 @@ import ( "github.com/gravitational/trace" "github.com/julienschmidt/httprouter" - "github.com/gravitational/teleport/lib/automaticupgrades" "github.com/gravitational/teleport/lib/automaticupgrades/constants" "github.com/gravitational/teleport/lib/automaticupgrades/version" ) @@ -59,31 +59,25 @@ func (h *Handler) automaticUpgrades109(w http.ResponseWriter, r *http.Request, p return nil, trace.BadParameter("a channel name is required") } - // We check if the channel is configured - channel, ok := h.cfg.AutomaticUpgradesChannels[channelName] - if !ok { - return nil, trace.NotFound("channel %s not found", channelName) - } - // Finally, we treat the request based on its type switch requestType { case "version": h.log.Debugf("Agent requesting version for channel %s", channelName) - return h.automaticUpgradesVersion109(w, r, channel) + return h.automaticUpgradesVersion109(w, r, channelName) case "critical": h.log.Debugf("Agent requesting criticality for channel %s", channelName) - return h.automaticUpgradesCritical109(w, r, channel) + return h.automaticUpgradesCritical109(w, r, channelName) default: return nil, trace.BadParameter("requestType path must end with 'version' or 'critical'") } } // automaticUpgradesVersion109 handles version requests from upgraders -func (h *Handler) automaticUpgradesVersion109(w http.ResponseWriter, r *http.Request, channel *automaticupgrades.Channel) (interface{}, error) { +func (h *Handler) automaticUpgradesVersion109(w http.ResponseWriter, r *http.Request, channelName string) (interface{}, error) { ctx, cancel := context.WithTimeout(r.Context(), defaultChannelTimeout) defer cancel() - targetVersion, err := channel.GetVersion(ctx) + targetVersion, err := h.autoUpdateAgentVersion(ctx, channelName, "" /* updater UUID */) if err != nil { // If the error is that the upstream channel has no version // We gracefully handle by serving "none" @@ -96,16 +90,20 @@ func (h *Handler) automaticUpgradesVersion109(w http.ResponseWriter, r *http.Req return nil, trace.Wrap(err) } - _, err = w.Write([]byte(targetVersion)) + // RFD 109 specifies that version from channels must have the leading "v". + // As h.autoUpdateAgentVersion doesn't, we must add it. + _, err = fmt.Fprintf(w, "v%s", targetVersion) return nil, trace.Wrap(err) } // automaticUpgradesCritical109 handles criticality requests from upgraders -func (h *Handler) automaticUpgradesCritical109(w http.ResponseWriter, r *http.Request, channel *automaticupgrades.Channel) (interface{}, error) { +func (h *Handler) automaticUpgradesCritical109(w http.ResponseWriter, r *http.Request, channelName string) (interface{}, error) { ctx, cancel := context.WithTimeout(r.Context(), defaultChannelTimeout) defer cancel() - critical, err := channel.GetCritical(ctx) + // RFD109 agents already retrieve maintenance windows from the CMC, no need to + // do a maintenance window lookup for them. + critical, err := h.autoUpdateAgentShouldUpdate(ctx, channelName, "" /* updater UUID */, false /* window lookup */) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/web/autoupdate_rfd184.go b/lib/web/autoupdate_rfd184.go index 4c3ccdeaef907..6ac532650cb64 100644 --- a/lib/web/autoupdate_rfd184.go +++ b/lib/web/autoupdate_rfd184.go @@ -23,6 +23,7 @@ import ( "github.com/gravitational/trace" + "github.com/gravitational/teleport" "github.com/gravitational/teleport/api" "github.com/gravitational/teleport/api/client/webclient" autoupdatepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" @@ -31,8 +32,8 @@ import ( // automaticUpdateSettings184 crafts the automatic updates part of the ping/find response // as described in RFD-184 (agents) and RFD-144 (tools). -// TODO: add the request as a parameter when we'll need to modulate the content based on the UUID and group -func (h *Handler) automaticUpdateSettings184(ctx context.Context) webclient.AutoUpdateSettings { +func (h *Handler) automaticUpdateSettings184(ctx context.Context, group, updaterUUID string) webclient.AutoUpdateSettings { + // Tools auto updates section. autoUpdateConfig, err := h.cfg.AccessPoint.GetAutoUpdateConfig(ctx) // TODO(vapopov) DELETE IN v18.0.0 check of IsNotImplemented, must be backported to all latest supported versions. if err != nil && !trace.IsNotFound(err) && !trace.IsNotImplemented(err) { @@ -45,12 +46,29 @@ func (h *Handler) automaticUpdateSettings184(ctx context.Context) webclient.Auto h.logger.ErrorContext(ctx, "failed to receive AutoUpdateVersion", "error", err) } + // Agent auto updates section. + agentVersion, err := h.autoUpdateAgentVersion(ctx, group, updaterUUID) + if err != nil { + h.logger.ErrorContext(ctx, "failed to resolve AgentVersion", "error", err) + // Defaulting to current version + agentVersion = teleport.Version + } + // If the source of truth is RFD 109 configuration (channels + CMC) we must emulate the + // RFD109 agent maintenance window behavior by looking up the CMC and checking if + // we are in a maintenance window. + shouldUpdate, err := h.autoUpdateAgentShouldUpdate(ctx, group, updaterUUID, true /* window lookup */) + if err != nil { + h.logger.ErrorContext(ctx, "failed to resolve AgentAutoUpdate", "error", err) + // Failing open + shouldUpdate = false + } + return webclient.AutoUpdateSettings{ ToolsAutoUpdate: getToolsAutoUpdate(autoUpdateConfig), ToolsVersion: getToolsVersion(autoUpdateVersion), AgentUpdateJitterSeconds: DefaultAgentUpdateJitterSeconds, - AgentVersion: getAgentVersion184(autoUpdateVersion), - AgentAutoUpdate: agentShouldUpdate184(autoUpdateConfig, autoUpdateVersion), + AgentVersion: agentVersion, + AgentAutoUpdate: shouldUpdate, } } @@ -73,39 +91,3 @@ func getToolsVersion(version *autoupdatepb.AutoUpdateVersion) string { } return version.GetSpec().GetTools().GetTargetVersion() } - -func getAgentVersion184(version *autoupdatepb.AutoUpdateVersion) string { - // If we can't get the AU version or tools AU version is not specified, we default to the current proxy version. - // This ensures we always advertise a version compatible with the cluster. - // TODO: read the version from the autoupdate_agent_rollout when the resource is implemented - if version.GetSpec().GetAgents() == nil { - return api.Version - } - - return version.GetSpec().GetAgents().GetTargetVersion() -} - -func agentShouldUpdate184(config *autoupdatepb.AutoUpdateConfig, version *autoupdatepb.AutoUpdateVersion) bool { - // TODO: read the data from the autoupdate_agent_rollout when the resource is implemented - - // If we can't get the AU config or if AUs are not configured, we default to "disabled". - // This ensures we fail open and don't accidentally update agents if something is going wrong. - // If we want to enable AUs by default, it would be better to create a default "autoupdate_config" resource - // than changing this logic. - if config.GetSpec().GetAgents() == nil { - return false - } - if version.GetSpec().GetAgents() == nil { - return false - } - configMode := config.GetSpec().GetAgents().GetMode() - versionMode := version.GetSpec().GetAgents().GetMode() - - // We update only if both version and config agent modes are "enabled" - if configMode != autoupdate.AgentsUpdateModeEnabled || versionMode != autoupdate.AgentsUpdateModeEnabled { - return false - } - - scheduleName := version.GetSpec().GetAgents().GetSchedule() - return scheduleName == autoupdate.AgentsScheduleImmediate -} diff --git a/lib/web/terminal.go b/lib/web/terminal.go index 861df40b06cde..072e51ecf1140 100644 --- a/lib/web/terminal.go +++ b/lib/web/terminal.go @@ -894,7 +894,7 @@ func (t *TerminalHandler) streamTerminal(ctx context.Context, tc *client.Telepor t.log.WithError(err).Error("Unable to send close event to web client.") } - if err := t.stream.Close(); err != nil { + if err := t.stream.Close(); err != nil && !errors.Is(err, io.EOF) { t.log.WithError(err).Error("Unable to close client web socket.") return } diff --git a/lib/web/terminal/terminal.go b/lib/web/terminal/terminal.go index 39405314d6372..334b7adb1b440 100644 --- a/lib/web/terminal/terminal.go +++ b/lib/web/terminal/terminal.go @@ -115,8 +115,8 @@ func (t *WSStream) WriteMessage(messageType int, data []byte) error { // WriteError displays an error in the terminal window. func (t *WSStream) WriteError(msg string) { - if _, writeErr := replacer.WriteString(t, msg); writeErr != nil { - t.log.WithError(writeErr).Warnf("Unable to send error to terminal: %v", msg) + if _, err := replacer.WriteString(t, msg); err != nil && !errors.Is(err, websocket.ErrCloseSent) { + t.log.WithError(err).Warnf("Unable to send error to terminal: %v", msg) } } diff --git a/lib/web/ui/app.go b/lib/web/ui/app.go index e77958486b729..313cb4f103603 100644 --- a/lib/web/ui/app.go +++ b/lib/web/ui/app.go @@ -34,6 +34,9 @@ import ( type App struct { // Kind is the kind of resource. Used to parse which kind in a list of unified resources in the UI Kind string `json:"kind"` + // SubKind is the subkind of the app resource. Used to differentiate different + // flavors of app. + SubKind string `json:"subkind,omitempty"` // Name is the name of the application. Name string `json:"name"` // Description is the app description. @@ -66,6 +69,9 @@ type App struct { // Integration is the integration name that must be used to access this Application. // Only applicable to AWS App Access. Integration string `json:"integration,omitempty"` + // PermissionSets holds the permission sets that this app grants access to. + // Only valid for Identity Center Account apps + PermissionSets []IdentityCenterPermissionSet `json:"permissionSets,omitempty"` } // UserGroupAndDescription is a user group name and its description. @@ -76,6 +82,19 @@ type UserGroupAndDescription struct { Description string `json:"description"` } +// IdentityCenterPermissionSet holds information about Identity Center +// Permission Sets for transmission to the UI +type IdentityCenterPermissionSet struct { + // Name is the human-readable name of the permission set + Name string `json:"name"` + // ARN is the AWS-assigned ARN of the permission set + ARN string `json:"arn"` + // AssignmentID is the assignment resource that will provision an Account + // Assignment for this Permission Set on the enclosing account + AssignmentID string `json:"accountAssignment,omitempty"` + RequiresRequest bool `json:"requiresRequest,omitempty"` +} + // MakeAppsConfig contains parameters for converting apps to UI representation. type MakeAppsConfig struct { // LocalClusterName is the name of the local cluster. @@ -129,8 +148,11 @@ func MakeApp(app types.Application, c MakeAppsConfig) App { description = oktaDescription } + permissionSets := makePermissionSets(app.GetIdentityCenter().GetPermissionSets()) + resultApp := App{ Kind: types.KindApp, + SubKind: app.GetSubKind(), Name: app.GetName(), Description: description, URI: app.GetURI(), @@ -144,6 +166,7 @@ func MakeApp(app types.Application, c MakeAppsConfig) App { SAMLApp: false, RequiresRequest: c.RequiresRequest, Integration: app.GetIntegration(), + PermissionSets: permissionSets, } if app.IsAWSConsole() { @@ -155,6 +178,21 @@ func MakeApp(app types.Application, c MakeAppsConfig) App { return resultApp } +func makePermissionSets(src []*types.IdentityCenterPermissionSet) []IdentityCenterPermissionSet { + if src == nil { + return nil + } + dst := make([]IdentityCenterPermissionSet, len(src)) + for i, srcPS := range src { + dst[i] = IdentityCenterPermissionSet{ + Name: srcPS.Name, + ARN: srcPS.ARN, + AssignmentID: srcPS.AssignmentID, + } + } + return dst +} + // MakeAppTypeFromSAMLApp creates App type from SAMLIdPServiceProvider type for the WebUI. // Keep in sync with lib/teleterm/apiserver/handler/handler_apps.go. // Note: The SAMLAppPreset field is used in SAML service provider update flow in the diff --git a/package.json b/package.json index 0b74dd4b69dfd..58a3ad8bfd585 100644 --- a/package.json +++ b/package.json @@ -30,27 +30,27 @@ "private": true, "pnpm": { "overrides": { - "@bundled-es-modules/cookie>cookie": "0.7.1" + "jsdom@^20.0.3>nwsapi@^2.2.0": "2.2.9" } }, "devDependencies": { "@gravitational/build": "workspace:*", - "@storybook/addon-actions": "^8.3.4", - "@storybook/addon-controls": "^8.3.4", - "@storybook/addon-toolbars": "^8.3.4", - "@storybook/components": "^8.3.4", - "@storybook/preview-api": "^8.3.4", - "@storybook/react": "^8.3.4", - "@storybook/react-vite": "^8.3.4", - "@storybook/test-runner": "^0.19.1", - "@testing-library/jest-dom": "^6.5.0", + "@storybook/addon-actions": "^8.4.6", + "@storybook/addon-controls": "^8.4.6", + "@storybook/addon-toolbars": "^8.4.6", + "@storybook/components": "^8.4.6", + "@storybook/preview-api": "^8.4.6", + "@storybook/react": "^8.4.6", + "@storybook/react-vite": "^8.4.6", + "@storybook/test-runner": "^0.20.0", + "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.2", "@types/history": "^4.7.11", - "@types/jest": "^29.5.13", - "@types/node": "^20.16.10", - "@types/react": "^18.3.10", - "@types/react-dom": "^18.3.0", + "@types/jest": "^29.5.14", + "@types/node": "^20.17.9", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", "@types/react-highlight": "^0.12.8", "@types/react-router": "^5.1.20", "@types/react-router-dom": "^5.1.1", @@ -58,26 +58,26 @@ "@types/wicg-file-system-access": "^2023.10.5", "jest": "^29.7.0", "jsdom-testing-mocks": "^1.13.1", - "msw": "^2.4.9", - "msw-storybook-addon": "^2.0.3", - "playwright": "^1.47.2", - "prettier": "^3.3.3", + "msw": "^2.6.6", + "msw-storybook-addon": "^2.0.4", + "playwright": "^1.49.0", + "prettier": "^3.4.1", "react-select-event": "^5.5.1", - "storybook": "^8.3.4", - "typescript": "^5.6.2", + "storybook": "^8.4.6", + "typescript": "^5.7.2", "vite": "^5.4.8" }, "dependencies": { - "@codemirror/autocomplete": "^6.18.1", - "@codemirror/lang-sql": "^6.7.1", - "@codemirror/view": "^6.34.1", - "@grpc/grpc-js": "1.11.3", + "@codemirror/autocomplete": "^6.18.3", + "@codemirror/lang-sql": "^6.8.0", + "@codemirror/view": "^6.35.0", + "@grpc/grpc-js": "1.12.2", "@lezer/highlight": "^1.2.1", - "@nivo/bar": "^0.87.0", + "@nivo/bar": "^0.88.0", "@protobuf-ts/runtime": "^2.9.4", "@protobuf-ts/runtime-rpc": "^2.9.4", - "@uiw/codemirror-themes": "^4.23.3", - "@uiw/react-codemirror": "^4.23.3", + "@uiw/codemirror-themes": "^4.23.6", + "@uiw/react-codemirror": "^4.23.6", "d3-scale": "^4.0.2", "d3-time-format": "^4.1.0", "date-fns": "^2.28.0", @@ -90,10 +90,10 @@ "react-is": "^18.3.1", "react-router": "5.3.4", "react-router-dom": "5.3.4", - "react-select": "^5.8.1", + "react-select": "^5.8.3", "react-transition-group": "^4.4.5", "styled-components": "^6.1.13", - "tslib": "^2.7.0", + "tslib": "^2.8.1", "whatwg-fetch": "^3.6.20" }, "msw": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index be0a39a5b4b42..e2b75ad8e9c64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@bundled-es-modules/cookie>cookie': 0.7.1 + jsdom@^20.0.3>nwsapi@^2.2.0: 2.2.9 pnpmfileChecksum: w7xzadmfdycxsdgkkk3qgpkydu @@ -14,23 +14,23 @@ importers: .: dependencies: '@codemirror/autocomplete': - specifier: ^6.18.1 - version: 6.18.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1) + specifier: ^6.18.3 + version: 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3) '@codemirror/lang-sql': - specifier: ^6.7.1 - version: 6.7.1(@codemirror/view@6.34.1) + specifier: ^6.8.0 + version: 6.8.0(@codemirror/view@6.35.0) '@codemirror/view': - specifier: ^6.34.1 - version: 6.34.1 + specifier: ^6.35.0 + version: 6.35.0 '@grpc/grpc-js': - specifier: 1.11.3 - version: 1.11.3 + specifier: 1.12.2 + version: 1.12.2 '@lezer/highlight': specifier: ^1.2.1 version: 1.2.1 '@nivo/bar': - specifier: ^0.87.0 - version: 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^0.88.0 + version: 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@protobuf-ts/runtime': specifier: ^2.9.4 version: 2.9.4 @@ -38,11 +38,11 @@ importers: specifier: ^2.9.4 version: 2.9.4 '@uiw/codemirror-themes': - specifier: ^4.23.3 - version: 4.23.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1) + specifier: ^4.23.6 + version: 4.23.6(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0) '@uiw/react-codemirror': - specifier: ^4.23.3 - version: 4.23.3(@babel/runtime@7.25.6)(@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1))(@codemirror/language@6.10.2)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.3)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.34.1)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^4.23.6 + version: 4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3))(@codemirror/language@6.10.6)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.3)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.35.0)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) d3-scale: specifier: ^4.0.2 version: 4.0.2 @@ -80,8 +80,8 @@ importers: specifier: 5.3.4 version: 5.3.4(react@18.3.1) react-select: - specifier: ^5.8.1 - version: 5.8.1(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^5.8.3 + version: 5.8.3(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-transition-group: specifier: ^4.4.5 version: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -89,8 +89,8 @@ importers: specifier: ^6.1.13 version: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tslib: - specifier: ^2.7.0 - version: 2.7.0 + specifier: ^2.8.1 + version: 2.8.1 whatwg-fetch: specifier: ^3.6.20 version: 3.6.20 @@ -99,35 +99,35 @@ importers: specifier: workspace:* version: link:web/packages/build '@storybook/addon-actions': - specifier: ^8.3.4 - version: 8.3.4(storybook@8.3.4) + specifier: ^8.4.6 + version: 8.4.6(storybook@8.4.6(prettier@3.4.1)) '@storybook/addon-controls': - specifier: ^8.3.4 - version: 8.3.4(storybook@8.3.4) + specifier: ^8.4.6 + version: 8.4.6(storybook@8.4.6(prettier@3.4.1)) '@storybook/addon-toolbars': - specifier: ^8.3.4 - version: 8.3.4(storybook@8.3.4) + specifier: ^8.4.6 + version: 8.4.6(storybook@8.4.6(prettier@3.4.1)) '@storybook/components': - specifier: ^8.3.4 - version: 8.3.4(storybook@8.3.4) + specifier: ^8.4.6 + version: 8.4.6(storybook@8.4.6(prettier@3.4.1)) '@storybook/preview-api': - specifier: ^8.3.4 - version: 8.3.4(storybook@8.3.4) + specifier: ^8.4.6 + version: 8.4.6(storybook@8.4.6(prettier@3.4.1)) '@storybook/react': - specifier: ^8.3.4 - version: 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)(typescript@5.6.2) + specifier: ^8.4.6 + version: 8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@3.4.1))(typescript@5.7.2) '@storybook/react-vite': - specifier: ^8.3.4 - version: 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.3.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3) + specifier: ^8.4.6 + version: 8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.4.6(prettier@3.4.1))(typescript@5.7.2)(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)) '@storybook/test-runner': - specifier: ^0.19.1 - version: 0.19.1(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(storybook@8.3.4) + specifier: ^0.20.0 + version: 0.20.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0)(storybook@8.4.6(prettier@3.4.1)) '@testing-library/jest-dom': - specifier: ^6.5.0 - version: 6.5.0 + specifier: ^6.6.3 + version: 6.6.3 '@testing-library/react': specifier: ^16.0.0 - version: 16.0.1(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 16.0.1(@testing-library/dom@10.1.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@testing-library/user-event': specifier: ^14.5.2 version: 14.5.2(@testing-library/dom@10.1.0) @@ -135,17 +135,17 @@ importers: specifier: ^4.7.11 version: 4.7.11 '@types/jest': - specifier: ^29.5.13 - version: 29.5.13 + specifier: ^29.5.14 + version: 29.5.14 '@types/node': - specifier: ^20.16.10 - version: 20.16.10 + specifier: ^20.17.9 + version: 20.17.9 '@types/react': - specifier: ^18.3.10 - version: 18.3.10 + specifier: ^18.3.12 + version: 18.3.12 '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 + specifier: ^18.3.1 + version: 18.3.1 '@types/react-highlight': specifier: ^0.12.8 version: 0.12.8 @@ -163,54 +163,54 @@ importers: version: 2023.10.5 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) jsdom-testing-mocks: specifier: ^1.13.1 version: 1.13.1 msw: - specifier: ^2.4.9 - version: 2.4.9(typescript@5.6.2) + specifier: ^2.6.6 + version: 2.6.6(@types/node@20.17.9)(typescript@5.7.2) msw-storybook-addon: - specifier: ^2.0.3 - version: 2.0.3(msw@2.4.9(typescript@5.6.2)) + specifier: ^2.0.4 + version: 2.0.4(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2)) playwright: - specifier: ^1.47.2 - version: 1.47.2 + specifier: ^1.49.0 + version: 1.49.0 prettier: - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.4.1 + version: 3.4.1 react-select-event: specifier: ^5.5.1 version: 5.5.1 storybook: - specifier: ^8.3.4 - version: 8.3.4 + specifier: ^8.4.6 + version: 8.4.6(prettier@3.4.1) typescript: - specifier: ^5.6.2 - version: 5.6.2 + specifier: ^5.7.2 + version: 5.7.2 vite: specifier: ^5.4.8 - version: 5.4.8(@types/node@20.16.10)(terser@5.31.1) + version: 5.4.8(@types/node@20.17.9)(terser@5.31.1) e/web/teleport: {} web/packages/build: dependencies: '@babel/core': - specifier: ^7.25.2 - version: 7.25.2 + specifier: ^7.26.0 + version: 7.26.0 '@babel/preset-env': - specifier: ^7.25.4 - version: 7.25.4(@babel/core@7.25.2) + specifier: ^7.26.0 + version: 7.26.0(@babel/core@7.26.0) '@babel/preset-react': - specifier: ^7.24.7 - version: 7.24.7(@babel/core@7.25.2) + specifier: ^7.25.9 + version: 7.25.9(@babel/core@7.26.0) '@babel/preset-typescript': - specifier: ^7.24.7 - version: 7.24.7(@babel/core@7.25.2) + specifier: ^7.26.0 + version: 7.26.0(@babel/core@7.26.0) '@swc/core': - specifier: ^1.7.26 - version: 1.7.26 + specifier: ^1.9.3 + version: 1.9.3 '@swc/plugin-styled-components': specifier: ^5.0.0 version: 5.0.0 @@ -218,44 +218,44 @@ importers: specifier: ^21.1.7 version: 21.1.7 '@vitejs/plugin-react-swc': - specifier: ^3.7.1 - version: 3.7.1(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)) + specifier: ^3.7.2 + version: 3.7.2(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)) babel-plugin-styled-components: specifier: ^2.1.4 - version: 2.1.4(@babel/core@7.25.2)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 2.1.4(@babel/core@7.26.0)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) eslint: specifier: ^8.56.0 version: 8.57.0 eslint-import-resolver-typescript: specifier: ^3.6.3 - version: 3.6.3(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0) eslint-plugin-babel: specifier: ^5.3.1 version: 5.3.1(eslint@8.57.0) eslint-plugin-import: - specifier: 2.30.0 - version: 2.30.0(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + specifier: 2.31.0 + version: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-jest: - specifier: ^28.8.3 - version: 28.8.3(@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0))(typescript@5.6.2) + specifier: ^28.9.0 + version: 28.9.0(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(jest@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0))(typescript@5.7.2) eslint-plugin-jest-dom: - specifier: ^5.4.0 - version: 5.4.0(@testing-library/dom@10.1.0)(eslint@8.57.0) + specifier: ^5.5.0 + version: 5.5.0(@testing-library/dom@10.1.0)(eslint@8.57.0) eslint-plugin-react: - specifier: ^7.37.0 - version: 7.37.0(eslint@8.57.0) + specifier: ^7.37.2 + version: 7.37.2(eslint@8.57.0) eslint-plugin-react-hooks: specifier: ^5.0.0 version: 5.0.0(eslint@8.57.0) eslint-plugin-testing-library: specifier: ^6.3.0 - version: 6.3.0(eslint@8.57.0)(typescript@5.6.2) + version: 6.3.0(eslint@8.57.0)(typescript@5.7.2) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 jest-fail-on-console: - specifier: ^3.3.0 - version: 3.3.0 + specifier: ^3.3.1 + version: 3.3.1 jsdom: specifier: ^25.0.1 version: 25.0.1 @@ -263,14 +263,14 @@ importers: specifier: ^5.12.0 version: 5.12.0(rollup@4.23.0) typescript-eslint: - specifier: ^8.12.2 - version: 8.12.2(eslint@8.57.0)(typescript@5.6.2) + specifier: ^8.16.0 + version: 8.16.0(eslint@8.57.0)(typescript@5.7.2) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.3.0(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)) + version: 3.3.0(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)) vite-tsconfig-paths: - specifier: ^5.0.1 - version: 5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)) + specifier: ^5.1.3 + version: 5.1.3(typescript@5.7.2)(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)) web/packages/design: dependencies: @@ -288,8 +288,8 @@ importers: specifier: workspace:* version: link:../build '@types/styled-system': - specifier: ^5.1.22 - version: 5.1.22 + specifier: ^5.1.23 + version: 5.1.23 jest-styled-components: specifier: ^7.2.0 version: 7.2.0(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) @@ -303,8 +303,8 @@ importers: specifier: ^0.15.0 version: 0.15.0(@xterm/xterm@5.5.0) ace-builds: - specifier: 1.36.2 - version: 1.36.2 + specifier: 1.36.5 + version: 1.36.5 events: specifier: 3.3.0 version: 3.3.0 @@ -324,44 +324,44 @@ importers: specifier: 1.9.0 version: 1.9.0 '@opentelemetry/context-zone': - specifier: 1.26.0 - version: 1.26.0(@opentelemetry/api@1.9.0) + specifier: 1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': - specifier: ^1.26.0 - version: 1.26.0(@opentelemetry/api@1.9.0) + specifier: ^1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/exporter-trace-otlp-http': - specifier: 0.53.0 - version: 0.53.0(@opentelemetry/api@1.9.0) + specifier: 0.55.0 + version: 0.55.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation': - specifier: 0.53.0 - version: 0.53.0(@opentelemetry/api@1.9.0) + specifier: 0.55.0 + version: 0.55.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-document-load': - specifier: 0.40.0 - version: 0.40.0(@opentelemetry/api@1.9.0) + specifier: 0.42.0 + version: 0.42.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-fetch': - specifier: 0.53.0 - version: 0.53.0(@opentelemetry/api@1.9.0) + specifier: 0.55.0 + version: 0.55.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-user-interaction': - specifier: 0.40.0 - version: 0.40.0(@opentelemetry/api@1.9.0)(zone.js@0.14.7) + specifier: 0.42.0 + version: 0.42.0(@opentelemetry/api@1.9.0)(zone.js@0.14.7) '@opentelemetry/instrumentation-xml-http-request': - specifier: 0.53.0 - version: 0.53.0(@opentelemetry/api@1.9.0) + specifier: 0.55.0 + version: 0.55.0(@opentelemetry/api@1.9.0) '@opentelemetry/propagator-b3': - specifier: 1.26.0 - version: 1.26.0(@opentelemetry/api@1.9.0) + specifier: 1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': - specifier: 1.26.0 - version: 1.26.0(@opentelemetry/api@1.9.0) + specifier: 1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': - specifier: 1.26.0 - version: 1.26.0(@opentelemetry/api@1.9.0) + specifier: 1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-web': - specifier: 1.26.0 - version: 1.26.0(@opentelemetry/api@1.9.0) + specifier: 1.28.0 + version: 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': - specifier: 1.27.0 - version: 1.27.0 + specifier: 1.28.0 + version: 1.28.0 '@xterm/addon-canvas': specifier: ^0.7.0 version: 0.7.0(@xterm/xterm@5.5.0) @@ -395,7 +395,7 @@ importers: version: 'link:' babel-plugin-transform-import-meta: specifier: ^2.2.0 - version: 2.2.1(@babel/core@7.25.2) + version: 2.2.1(@babel/core@7.26.0) babel-plugin-transform-vite-meta-env: specifier: ^1.0.3 version: 1.0.3 @@ -409,8 +409,8 @@ importers: web/packages/teleterm: dependencies: '@grpc/grpc-js': - specifier: 1.11.3 - version: 1.11.3 + specifier: 1.12.2 + version: 1.12.2 '@types/which': specifier: ^3.0.4 version: 3.0.4 @@ -436,8 +436,8 @@ importers: specifier: ^5.0.0 version: 5.0.0 winston: - specifier: ^3.14.2 - version: 3.14.2 + specifier: ^3.17.0 + version: 3.17.0 devDependencies: '@electron/notarize': specifier: ^2.5.0 @@ -453,7 +453,7 @@ importers: version: link:../shared '@protobuf-ts/grpc-transport': specifier: ^2.9.4 - version: 2.9.4(@grpc/grpc-js@1.11.3) + version: 2.9.4(@grpc/grpc-js@1.12.2) '@types/node-forge': specifier: ^1.3.11 version: 1.3.11 @@ -477,7 +477,7 @@ importers: version: 25.1.7(electron-builder-squirrel-windows@25.1.7(dmg-builder@25.1.7)) electron-vite: specifier: ^2.3.0 - version: 2.3.0(@swc/core@1.7.26)(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)) + version: 2.3.0(@swc/core@1.9.3)(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)) events: specifier: 3.3.0 version: 3.3.0 @@ -489,7 +489,7 @@ importers: version: 2.5.2 react-dnd: specifier: ^14.0.4 - version: 14.0.5(@types/node@22.7.4)(@types/react@18.3.10)(react@18.3.1) + version: 14.0.5(@types/node@20.17.9)(@types/react@18.3.12)(react@18.3.1) react-dnd-html5-backend: specifier: ^14.0.2 version: 14.1.0 @@ -500,8 +500,8 @@ importers: specifier: ^3.23.8 version: 3.23.8 zod-to-json-schema: - specifier: ^3.23.3 - version: 3.23.3(zod@3.23.8) + specifier: ^3.23.5 + version: 3.23.5(zod@3.23.8) packages: @@ -512,53 +512,49 @@ packages: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - '@adobe/css-tools@4.4.0': - resolution: {integrity: sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==} + '@adobe/css-tools@4.4.1': + resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.25.4': - resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.25.2': - resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.5': - resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.6': - resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.24.7': - resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': - resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.2': - resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.25.4': - resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.25.2': - resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} + '@babel/helper-create-regexp-features-plugin@7.25.9': + resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -568,108 +564,99 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-member-expression-to-functions@7.24.8': - resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.2': - resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.24.7': - resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.24.8': - resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.0': - resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.25.0': - resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.24.7': - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + '@babel/helper-simple-access@7.25.9': + resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': - resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.8': - resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.24.8': - resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.0': - resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.0': - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.25.4': - resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.25.6': - resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3': - resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0': - resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0': - resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': - resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0': - resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -701,24 +688,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-export-namespace-from@7.8.3': - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.24.7': - resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.24.7': - resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -733,8 +710,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.24.7': - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -781,8 +758,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.24.7': - resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -793,332 +770,338 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.24.7': - resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.25.4': - resolution: {integrity: sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==} + '@babel/plugin-transform-async-generator-functions@7.25.9': + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.24.7': - resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.24.7': - resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.25.0': - resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.4': - resolution: {integrity: sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==} + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.24.7': - resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.4': - resolution: {integrity: sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==} + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.24.7': - resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.24.8': - resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.24.7': - resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.24.7': - resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0': - resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.24.7': - resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.24.7': - resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} + '@babel/plugin-transform-exponentiation-operator@7.25.9': + resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.24.7': - resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.24.7': - resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + '@babel/plugin-transform-for-of@7.25.9': + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.1': - resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.24.7': - resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.2': - resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.24.7': - resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.24.7': - resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.24.7': - resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.8': - resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + '@babel/plugin-transform-modules-commonjs@7.25.9': + resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.0': - resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.24.7': - resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': - resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.24.7': - resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': - resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.24.7': - resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.24.7': - resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.24.7': - resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.24.7': - resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.24.8': - resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.24.7': - resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.25.4': - resolution: {integrity: sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==} + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.24.7': - resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.24.7': - resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.24.7': - resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-development@7.24.7': - resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} + '@babel/plugin-transform-react-jsx-development@7.25.9': + resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.24.7': - resolution: {integrity: sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==} + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-pure-annotations@7.24.7': - resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} + '@babel/plugin-transform-react-pure-annotations@7.25.9': + resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.7': - resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + '@babel/plugin-transform-regenerator@7.25.9': + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-reserved-words@7.24.7': - resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.24.7': - resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.24.7': - resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.24.7': - resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.24.7': - resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + '@babel/plugin-transform-template-literals@7.25.9': + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.24.8': - resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} + '@babel/plugin-transform-typeof-symbol@7.25.9': + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.24.7': - resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==} + '@babel/plugin-transform-typescript@7.25.9': + resolution: {integrity: sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.24.7': - resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.24.7': - resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.24.7': - resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.25.4': - resolution: {integrity: sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==} + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.25.4': - resolution: {integrity: sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==} + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1128,57 +1111,39 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/preset-react@7.24.7': - resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} + '@babel/preset-react@7.25.9': + resolution: {integrity: sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.24.7': - resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} + '@babel/preset-typescript@7.26.0': + resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/regjsgen@0.8.0': - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.25.6': - resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.4': - resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.6': - resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.25.4': - resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.25.6': - resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} - engines: {node: '>=6.9.0'} - - '@base2/pretty-print-object@1.0.1': - resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} - '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@bundled-es-modules/cookie@2.0.0': - resolution: {integrity: sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==} + '@bundled-es-modules/cookie@2.0.1': + resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} '@bundled-es-modules/statuses@1.0.1': resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} @@ -1186,25 +1151,22 @@ packages: '@bundled-es-modules/tough-cookie@0.1.6': resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} - '@codemirror/autocomplete@6.18.1': - resolution: {integrity: sha512-iWHdj/B1ethnHRTwZj+C1obmmuCzquH29EbcKr0qIjA9NfDeBDJ7vs+WOHsFeLeflE4o+dHfYndJloMKHUkWUA==} + '@codemirror/autocomplete@6.18.3': + resolution: {integrity: sha512-1dNIOmiM0z4BIBwxmxEfA1yoxh1MF/6KPBbh20a5vphGV0ictKlgQsbJs6D6SkR6iJpGbpwRsa6PFMNlg9T9pQ==} peerDependencies: '@codemirror/language': ^6.0.0 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/common': ^1.0.0 - '@codemirror/commands@6.6.2': - resolution: {integrity: sha512-Fq7eWOl1Rcbrfn6jD8FPCj9Auaxdm5nIK5RYOeW7ughnd/rY5AmPg6b+CfsG39ZHdwiwe8lde3q8uR7CF5S0yQ==} - - '@codemirror/lang-sql@6.7.1': - resolution: {integrity: sha512-flQa7zemrLKk0TIrOJnpeyH/b29BcVybtsTeZMgAo40O6kGbrnUSCgwI3TF5iJY3O9VXJKKCA+i0CBVvDfr88w==} + '@codemirror/commands@6.7.1': + resolution: {integrity: sha512-llTrboQYw5H4THfhN4U3qCnSZ1SOJ60ohhz+SzU0ADGtwlc533DtklQP0vSFaQuCPDn3BPpOd1GbbnUtwNjsrw==} - '@codemirror/language@6.10.2': - resolution: {integrity: sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==} + '@codemirror/lang-sql@6.8.0': + resolution: {integrity: sha512-aGLmY4OwGqN3TdSx3h6QeA1NrvaYtF7kkoWR/+W7/JzB0gQtJ+VJxewlnE3+VImhA4WVlhmkJr109PefOOhjLg==} - '@codemirror/language@6.10.3': - resolution: {integrity: sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A==} + '@codemirror/language@6.10.6': + resolution: {integrity: sha512-KrsbdCnxEztLVbB5PycWXFxas4EOyk/fPAfruSOnDDppevQgid2XZ+KbJ9u+fDikP/e7MW7HPBTvTb8JlZK9vA==} '@codemirror/lint@6.4.2': resolution: {integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==} @@ -1218,8 +1180,8 @@ packages: '@codemirror/theme-one-dark@6.1.2': resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==} - '@codemirror/view@6.34.1': - resolution: {integrity: sha512-t1zK/l9UiRqwUNPm+pdIT0qzJlzuVckbTEMVNFhfWkGiBQClstzg+78vedCvLSX0xJEZ6lwZbPpnljL7L6iwMQ==} + '@codemirror/view@6.35.0': + resolution: {integrity: sha512-I0tYy63q5XkaWsJ8QRv5h6ves7kvtrBWjBcnf/bzohFJQc5c14a1AQRdE8QpPF9eMp5Mq2FMm59TCj1gDfE7kw==} '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} @@ -1259,11 +1221,11 @@ packages: resolution: {integrity: sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==} engines: {node: '>=16.4'} - '@emotion/babel-plugin@11.12.0': - resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} - '@emotion/cache@11.13.1': - resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + '@emotion/cache@11.13.5': + resolution: {integrity: sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==} '@emotion/hash@0.9.2': resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} @@ -1280,8 +1242,8 @@ packages: '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - '@emotion/react@11.13.3': - resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} + '@emotion/react@11.13.5': + resolution: {integrity: sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==} peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -1289,8 +1251,8 @@ packages: '@types/react': optional: true - '@emotion/serialize@1.3.2': - resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} '@emotion/sheet@1.4.0': resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} @@ -1306,8 +1268,8 @@ packages: peerDependencies: react: '>=16.8.0' - '@emotion/utils@1.4.1': - resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} @@ -1318,8 +1280,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.23.1': - resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1330,8 +1292,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.23.1': - resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1342,8 +1304,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.23.1': - resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1354,8 +1316,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.23.1': - resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1366,8 +1328,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.23.1': - resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1378,8 +1340,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.23.1': - resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1390,8 +1352,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.23.1': - resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1402,8 +1364,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.23.1': - resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1414,8 +1376,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.23.1': - resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1426,8 +1388,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.23.1': - resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1438,8 +1400,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.23.1': - resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1450,8 +1412,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.23.1': - resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1462,8 +1424,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.23.1': - resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1474,8 +1436,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.23.1': - resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1486,8 +1448,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.23.1': - resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1498,8 +1460,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.23.1': - resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1510,8 +1472,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.23.1': - resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -1522,14 +1484,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.23.1': - resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.23.1': - resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1540,8 +1502,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.23.1': - resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1552,8 +1514,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.23.1': - resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1564,8 +1526,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.23.1': - resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1576,8 +1538,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.23.1': - resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1588,8 +1550,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.23.1': - resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1615,8 +1577,8 @@ packages: '@floating-ui/core@1.6.8': resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - '@floating-ui/dom@1.6.11': - resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} '@floating-ui/utils@0.2.8': resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} @@ -1624,8 +1586,8 @@ packages: '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - '@grpc/grpc-js@1.11.3': - resolution: {integrity: sha512-i9UraDzFHMR+Iz/MhFLljT+fCpgxZ3O6CxwGJ8YuNYHJItIHUzKJpW2LvoFZNnGPwqc9iWy9RAucxV0JoR9aUQ==} + '@grpc/grpc-js@1.12.2': + resolution: {integrity: sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg==} engines: {node: '>=12.10.0'} '@grpc/proto-loader@0.7.13': @@ -1652,25 +1614,25 @@ packages: resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} deprecated: Use @eslint/object-schema instead - '@inquirer/confirm@3.2.0': - resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} - engines: {node: '>=18'} - - '@inquirer/core@9.2.1': - resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + '@inquirer/confirm@5.0.2': + resolution: {integrity: sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' - '@inquirer/figures@1.0.6': - resolution: {integrity: sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==} + '@inquirer/core@10.1.0': + resolution: {integrity: sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==} engines: {node: '>=18'} - '@inquirer/type@1.5.5': - resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + '@inquirer/figures@1.0.8': + resolution: {integrity: sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==} engines: {node: '>=18'} - '@inquirer/type@2.0.0': - resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + '@inquirer/type@3.0.1': + resolution: {integrity: sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==} engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -1754,11 +1716,11 @@ packages: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0': - resolution: {integrity: sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==} + '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2': + resolution: {integrity: sha512-feQ+ntr+8hbVudnsTUapiMN9q8T90XA1d5jn9QzY09sNoj4iD9wi0PY1vsBFTda4ZjEaxRK9S81oarR2nj7TFQ==} peerDependencies: typescript: '>= 4.3.x' - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: typescript: optional: true @@ -1767,8 +1729,8 @@ packages: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} '@jridgewell/set-array@1.2.1': @@ -1787,8 +1749,8 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} - '@lezer/common@1.2.1': - resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} '@lezer/highlight@1.2.1': resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} @@ -1804,45 +1766,45 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} - '@mswjs/interceptors@0.35.9': - resolution: {integrity: sha512-SSnyl/4ni/2ViHKkiZb8eajA/eN1DNFaHjhGiLUdZvDz6PKF4COSf/17xqSz64nOo2Ia29SA6B2KNCsyCbVmaQ==} + '@mswjs/interceptors@0.37.1': + resolution: {integrity: sha512-SvE+tSpcX884RJrPCskXxoS965Ky/pYABDEhWW6oeSRhpUDLrS5nTvT5n1LLSDVDYvty4imVmXsy+3/ROVuknA==} engines: {node: '>=18'} - '@nivo/annotations@0.87.0': - resolution: {integrity: sha512-4Xk/soEmi706iOKszjX1EcGLBNIvhMifCYXOuLIFlMAXqhw1x2YS7PxickVSskdSzJCwJX4NgQ/R/9u6nxc5OA==} + '@nivo/annotations@0.88.0': + resolution: {integrity: sha512-NXE+1oIUn+EGWMQpnpeRMLgi2wyuzhGDoJQY4OUHissCUiNotid2oNQ/PXJwN0toiu+/j9SyhzI32xr70OPi7Q==} peerDependencies: react: '>= 16.14.0 < 19.0.0' - '@nivo/axes@0.87.0': - resolution: {integrity: sha512-zCRBfiRKJi+xOxwxH5Pxq/8+yv3fAYDl4a1F2Ssnp5gMIobwzVsdearvsm5B04e9bfy3ZXTL7KgbkEkSAwu6SA==} + '@nivo/axes@0.88.0': + resolution: {integrity: sha512-jF7aIxzTNayV5cI1J/b9Q1FfpMBxTXGk3OwSigXMSfYWlliskDn2u0qGRLiYhuXFdQAWIp4oXsO1GcAQ0eRVdg==} peerDependencies: react: '>= 16.14.0 < 19.0.0' - '@nivo/bar@0.87.0': - resolution: {integrity: sha512-r/MEVCNAHKfmsy1Fb+JztVczOhIEtAx4VFs2XUbn9YpEDgxydavUJyfoy5/nGq6h5jG1/t47cfB4nZle7c0fyQ==} + '@nivo/bar@0.88.0': + resolution: {integrity: sha512-wckwuHWeCikxGvvdRfGL+dVFsUD9uHk1r9s7bWUfOD+p8BWhxtYqfXpHolEfgGg3UyPaHtpGA7P4zgE5vgo7gQ==} peerDependencies: react: '>= 16.14.0 < 19.0.0' - '@nivo/colors@0.87.0': - resolution: {integrity: sha512-S4pZzRGKK23t8XAjQMhML6wwsfKO9nH03xuyN4SvCodNA/Dmdys9xV+9Dg/VILTzvzsBTBGTX0dFBg65WoKfVg==} + '@nivo/colors@0.88.0': + resolution: {integrity: sha512-IZ+leYIqAlo7dyLHmsQwujanfRgXyoQ5H7PU3RWLEn1PP0zxDKLgEjFEDADpDauuslh2Tx0L81GNkWR6QSP0Mw==} peerDependencies: react: '>= 16.14.0 < 19.0.0' - '@nivo/core@0.87.0': - resolution: {integrity: sha512-yEQWJn7QjWnbmCZccBCo4dligNyNyz3kgyV9vEtcaB1iGeKhg55RJEAlCOul+IDgSCSPFci2SxTmipE6LZEZCg==} + '@nivo/core@0.88.0': + resolution: {integrity: sha512-XjUkA5MmwjLP38bdrJwn36Gj7T5SYMKD55LYQp/1nIJPdxqJ38dUfE4XyBDfIEgfP6yrHOihw3C63cUdnUBoiw==} peerDependencies: react: '>= 16.14.0 < 19.0.0' - '@nivo/legends@0.87.0': - resolution: {integrity: sha512-bVJCeqEmK4qHrxNaPU/+hXUd/yaKlcQ0yrsR18ewoknVX+pgvbe/+tRKJ+835JXlvRijYIuqwK1sUJQIxyB7oA==} + '@nivo/legends@0.88.0': + resolution: {integrity: sha512-d4DF9pHbD8LmGJlp/Gp1cF4e8y2wfQTcw3jVhbZj9zkb7ZWB7JfeF60VHRfbXNux9bjQ9U78/SssQqueVDPEmg==} peerDependencies: react: '>= 16.14.0 < 19.0.0' - '@nivo/scales@0.87.0': - resolution: {integrity: sha512-IHdY9w2em/xpWurcbhUR3cUA1dgbY06rU8gmA/skFCwf3C4Da3Rqwr0XqvxmkDC+EdT/iFljMbLst7VYiCnSdw==} + '@nivo/scales@0.88.0': + resolution: {integrity: sha512-HbpxkQp6tHCltZ1yDGeqdLcaJl5ze54NPjurfGtx/Uq+H5IQoBd4Tln49bUar5CsFAMsXw8yF1HQvASr7I1SIA==} - '@nivo/tooltip@0.87.0': - resolution: {integrity: sha512-nZJWyRIt/45V/JBdJ9ksmNm1LFfj59G1Dy9wB63Icf2YwyBT+J+zCzOGXaY7gxCxgF1mnSL3dC7fttcEdXyN/g==} + '@nivo/tooltip@0.88.0': + resolution: {integrity: sha512-iEjVfQA8gumAzg/yUinjTwswygCkE5Iwuo8opwnrbpNIqMrleBV+EAKIgB0PrzepIoW8CFG/SJhoiRfbU8jhOw==} peerDependencies: react: '>= 16.14.0 < 19.0.0' @@ -1880,112 +1842,112 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@opentelemetry/api-logs@0.53.0': - resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} + '@opentelemetry/api-logs@0.55.0': + resolution: {integrity: sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg==} engines: {node: '>=14'} '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-zone-peer-dep@1.26.0': - resolution: {integrity: sha512-Mgdy0WsHR52h5AnN2nhZJrelDK6unOFr8aSn3ToETk6DLSOijayOi0M0SZM72qhWr7iFrJ1oxGEIK8uzVaSC8Q==} + '@opentelemetry/context-zone-peer-dep@1.28.0': + resolution: {integrity: sha512-tGtZ+N/QlMpZmHlSpANJsCBsx04FAF7t1nvyocG+Hr1r9rEJFPbdJ23pRDPYdpHX7D5UislKEz3mP+kfsP9p/A==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' zone.js: ^0.10.2 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0 - '@opentelemetry/context-zone@1.26.0': - resolution: {integrity: sha512-ckBEUKo7jZnZ2jARcntv365413cTe9Ra7uMQWvdk10K3tWOUsLnBG8dSMRbkaA+XL9hWGrZ1MMI8UXrwnbp0FA==} + '@opentelemetry/context-zone@1.28.0': + resolution: {integrity: sha512-fMgtDVpEs64S5bKqOJxXk/PJ4H5H5RlFfFbnpUmChbzsZBFtWBWUGyCBb7tcDTYDLGL6kGpq2n/CLj6zvnP8gQ==} engines: {node: '>=14'} - '@opentelemetry/core@1.26.0': - resolution: {integrity: sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==} + '@opentelemetry/core@1.28.0': + resolution: {integrity: sha512-ZLwRMV+fNDpVmF2WYUdBHlq0eOWtEaUJSusrzjGnBt7iSRvfjFE3RXYUZJrqou/wIDWV0DwQ5KIfYe9WXg9Xqw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/exporter-trace-otlp-http@0.53.0': - resolution: {integrity: sha512-m7F5ZTq+V9mKGWYpX8EnZ7NjoqAU7VemQ1E2HAG+W/u0wpY1x0OmbxAXfGKFHCspdJk8UKlwPGrpcB8nay3P8A==} + '@opentelemetry/exporter-trace-otlp-http@0.55.0': + resolution: {integrity: sha512-lMiNic63EVHpW+eChmLD2CieDmwQBFi72+LFbh8+5hY0ShrDGrsGP/zuT5MRh7M/vM/UZYO/2A/FYd7CMQGR7A==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': ^1.0.0 + '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-document-load@0.40.0': - resolution: {integrity: sha512-TG7J0gGG7mYGz/PbNSY+I7DfqZj3DznGgpnkCt6zU2OwNmjaW07TSrm1Jx4lRxq8MwV774iwGa1DXqgZC53Okw==} + '@opentelemetry/instrumentation-document-load@0.42.0': + resolution: {integrity: sha512-/YfGcdl3oJBXktuWSpUU+IrF6V0haudEMqJZvpPkbzVgHJ5I3W1+1REGimmsU4e5PvwHKt/jm3pne7PBSb4WyA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-fetch@0.53.0': - resolution: {integrity: sha512-Sayp/Oypr0lyTgOKide/Dz4ovqDWPdmazapCMyfsVpXpV9zrH2kbdO2vAKUMx9vF98vxsqcxXucf4z54WXWZ8A==} + '@opentelemetry/instrumentation-fetch@0.55.0': + resolution: {integrity: sha512-wkybQE85HzInYX2csZ4UuMlCIMCyGGHcNqL9TcoZgAZC2EuXFReTsLytoszknhcaX+P7UT9Ee3915t8KC6XP4w==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': ^1.0.0 + '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation-user-interaction@0.40.0': - resolution: {integrity: sha512-QvVoRVL84gI5KSzXherCsWN8314o0+rdvlPKPbgMUCt3PEhnAtO0MfL5HHs2BAh9DE7QTxVQVthV5A0MdatJaA==} + '@opentelemetry/instrumentation-user-interaction@0.42.0': + resolution: {integrity: sha512-cRlvT5/Dw4xNr0LWQlNsXP3o9NFj4kHz5TJOka0XCgSrHHoL9/zGbPiSQml8SCD7MS4OmeBYUCn7MJ25/h1WMQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 zone.js: ^0.11.4 || ^0.13.0 || ^0.14.0 - '@opentelemetry/instrumentation-xml-http-request@0.53.0': - resolution: {integrity: sha512-vkALs8zdEUU3GnGvq1rzP0RK3+Fsk2jyzY6X/a+ibbo/miCmmeQNHX+fBRNs/3Offquj19M0qD+olNU9CJloqg==} + '@opentelemetry/instrumentation-xml-http-request@0.55.0': + resolution: {integrity: sha512-Wlz4LzDpBFxHpb24RAM6RoiGspJ7J16ux0Xw5KVLtK3zzpQaxMYEVF0XQNC61WJJa3tRNt3XRjiQ8mrXJZxVQg==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': ^1.0.0 + '@opentelemetry/api': ^1.3.0 - '@opentelemetry/instrumentation@0.53.0': - resolution: {integrity: sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==} + '@opentelemetry/instrumentation@0.55.0': + resolution: {integrity: sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-exporter-base@0.53.0': - resolution: {integrity: sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA==} + '@opentelemetry/otlp-exporter-base@0.55.0': + resolution: {integrity: sha512-iHQI0Zzq3h1T6xUJTVFwmFl5Dt5y1es+fl4kM+k5T/3YvmVyeYkSiF+wHCg6oKrlUAJfk+t55kaAu3sYmt7ZYA==} engines: {node: '>=14'} peerDependencies: - '@opentelemetry/api': ^1.0.0 + '@opentelemetry/api': ^1.3.0 - '@opentelemetry/otlp-transformer@0.53.0': - resolution: {integrity: sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA==} + '@opentelemetry/otlp-transformer@0.55.0': + resolution: {integrity: sha512-kVqEfxtp6mSN2Dhpy0REo1ghP4PYhC1kMHQJ2qVlO99Pc+aigELjZDfg7/YKmL71gR6wVGIeJfiql/eXL7sQPA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': ^1.3.0 - '@opentelemetry/propagator-b3@1.26.0': - resolution: {integrity: sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==} + '@opentelemetry/propagator-b3@1.28.0': + resolution: {integrity: sha512-Q7HVDIMwhN5RxL4bECMT4BdbyYSAKkC6U/RGn4NpO/cbqP6ZRg+BS7fPo/pGZi2w8AHfpIGQFXQmE8d2PC5xxQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/resources@1.26.0': - resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} + '@opentelemetry/resources@1.28.0': + resolution: {integrity: sha512-cIyXSVJjGeTICENN40YSvLDAq4Y2502hGK3iN7tfdynQLKWb3XWZQEkPc+eSx47kiy11YeFAlYkEfXwR1w8kfw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-logs@0.53.0': - resolution: {integrity: sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==} + '@opentelemetry/sdk-logs@0.55.0': + resolution: {integrity: sha512-TSx+Yg/d48uWW6HtjS1AD5x6WPfLhDWLl/WxC7I2fMevaiBuKCuraxTB8MDXieCNnBI24bw9ytyXrDCswFfWgA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.4.0 <1.10.0' - '@opentelemetry/sdk-metrics@1.26.0': - resolution: {integrity: sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==} + '@opentelemetry/sdk-metrics@1.28.0': + resolution: {integrity: sha512-43tqMK/0BcKTyOvm15/WQ3HLr0Vu/ucAl/D84NO7iSlv6O4eOprxSHa3sUtmYkaZWHqdDJV0AHVz/R6u4JALVQ==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.3.0 <1.10.0' - '@opentelemetry/sdk-trace-base@1.26.0': - resolution: {integrity: sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==} + '@opentelemetry/sdk-trace-base@1.28.0': + resolution: {integrity: sha512-ceUVWuCpIao7Y5xE02Xs3nQi0tOGmMea17ecBdwtCvdo9ekmO+ijc9RFDgfifMl7XCBf41zne/1POM3LqSTZDA==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/sdk-trace-web@1.26.0': - resolution: {integrity: sha512-sxeKPcG/gUyxZ8iB8X1MI8/grfSCGgo1n2kxOE73zjVaO9yW/7JuVC3gqUaWRjtZ6VD/V3lo2/ZSwMlm6n2mdg==} + '@opentelemetry/sdk-trace-web@1.28.0': + resolution: {integrity: sha512-/QOIrJc/A/caKbA9voLua4isf///cjQKB6gomEzX2fL18TBqZhIkm9k2DpjlbtrQoYCJDZ9x7Phrec22aQGpQw==} engines: {node: '>=14'} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' @@ -1994,6 +1956,10 @@ packages: resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} engines: {node: '>=14'} + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2048,32 +2014,35 @@ packages: '@react-dnd/shallowequal@2.0.0': resolution: {integrity: sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==} - '@react-spring/animated@9.7.3': - resolution: {integrity: sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==} + '@react-spring/animated@9.7.5': + resolution: {integrity: sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@react-spring/core@9.7.3': - resolution: {integrity: sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==} + '@react-spring/core@9.7.5': + resolution: {integrity: sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@react-spring/shared@9.7.3': - resolution: {integrity: sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==} + '@react-spring/rafz@9.7.5': + resolution: {integrity: sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==} + + '@react-spring/shared@9.7.5': + resolution: {integrity: sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@react-spring/types@9.7.3': - resolution: {integrity: sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==} + '@react-spring/types@9.7.5': + resolution: {integrity: sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==} - '@react-spring/web@9.7.3': - resolution: {integrity: sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg==} + '@react-spring/web@9.7.5': + resolution: {integrity: sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@rollup/pluginutils@5.1.2': - resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2186,100 +2155,85 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@storybook/addon-actions@8.3.4': - resolution: {integrity: sha512-1y0yD3upKcyzNwwA6loAGW2cRDqExwl4oAT7GJQA4tmabI+fNwmANSgU/ezLvvSUf4Qo0eJHg2Zcn8y+Apq2eA==} - peerDependencies: - storybook: ^8.3.4 - - '@storybook/addon-controls@8.3.4': - resolution: {integrity: sha512-qQcaK6dczsb6wXkzGZKOjUYNA7FfKBewRv6NvoVKYY6LfhllGOkmUAtYpdtQG8adsZWTSoZaAOJS2vP2uM67lw==} + '@storybook/addon-actions@8.4.6': + resolution: {integrity: sha512-vbplwjMj7UXbdzoFhQkqFHLQAPJX8OVGTM9Q+yjuWDHViaKKUlgRWp0jclT7aIDNJQU2a6wJbTimHgJeF16Vhg==} peerDependencies: - storybook: ^8.3.4 + storybook: ^8.4.6 - '@storybook/addon-toolbars@8.3.4': - resolution: {integrity: sha512-Km1YciVIxqluDbd1xmHjANNFyMonEOtnA6e4MrnBnC9XkPXSigeFlj0JvxyI/zjBsLBoFRmQiwq55W6l3hQ9sA==} + '@storybook/addon-controls@8.4.6': + resolution: {integrity: sha512-70pEGWh0C2g8s0DYsISElOzsMbQS6p/K9iU5EqfotDF+hvEqstjsV/bTbR5f3OK4vR/7Gxamk7j8RVd14Nql6A==} peerDependencies: - storybook: ^8.3.4 + storybook: ^8.4.6 - '@storybook/builder-vite@8.3.4': - resolution: {integrity: sha512-Sa6SZ7LeHpkrnuvua8P8MR8e8a+MPKbyMmr9TqCCy8Ud/t4AM4kHY3JpJGtrgeK9l43fBnBwfdZYoRl5J6oWeA==} + '@storybook/addon-toolbars@8.4.6': + resolution: {integrity: sha512-+Xao/uGa8FnYsyUiREUkYXWNysm3Aba8tL/Bwd+HufHtdiKJGa9lrXaC7VLCqBUaEjwqM3aaPwqEWIROsthmPQ==} peerDependencies: - '@preact/preset-vite': '*' - storybook: ^8.3.4 - typescript: '>= 4.3.x' - vite: ^4.0.0 || ^5.0.0 - vite-plugin-glimmerx: '*' - peerDependenciesMeta: - '@preact/preset-vite': - optional: true - typescript: - optional: true - vite-plugin-glimmerx: - optional: true + storybook: ^8.4.6 - '@storybook/components@8.3.4': - resolution: {integrity: sha512-iQzLJd87uGbFBbYNqlrN/ABrnx3dUrL0tjPCarzglzshZoPCNOsllJeJx5TJwB9kCxSZ8zB9TTOgr7NXl+oyVA==} + '@storybook/builder-vite@8.4.6': + resolution: {integrity: sha512-PyJsaEPyuRFFEplpNUi+nbuJd7d1DC2dAZjpsaHTXyqg5iPIbkIgsbCJLUDeIXnUDqM/utjmMpN0sQKJuhIc6w==} peerDependencies: - storybook: ^8.3.4 + storybook: ^8.4.6 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - '@storybook/core-common@8.2.9': - resolution: {integrity: sha512-DdV+Myvi8nk9rv62M5j0B2bTlQfCX4p3htwzKPgmaHyhvVLuOqBbfKtDOWPCwaVLXx7Q0wpBFlgM0rxmQXLVDQ==} + '@storybook/components@8.4.6': + resolution: {integrity: sha512-9tKSJJCyFT5RZMRGyozTBJkr9C9Yfk1nuOE9XbDEE1Z+3/IypKR9+iwc5mfNBStDNY+rxtYWNLKBb5GPR2yhzA==} peerDependencies: - storybook: ^8.2.9 + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/core@8.3.4': - resolution: {integrity: sha512-4PZB91JJpuKfcjeOR2LXj3ABaPLLSd2P/SfYOKNCygrDstsQa/yay3/yN5Z9yi1cIG84KRr6/sUW+0x8HsGLPg==} - - '@storybook/csf-plugin@8.3.4': - resolution: {integrity: sha512-ZMFWYxeTN4GxCn8dyIH4roECyLDy29yv/QKM+pHM3AC5Ny2HWI35SohWao4fGBAFxPQFbR5hPN8xa6ofHPSSTg==} + '@storybook/core@8.4.6': + resolution: {integrity: sha512-WeojVtHy0/t50tzw/15S+DLzKsj8BN9yWdo3vJMvm+nflLFvfq1XvD9WGOWeaFp8E/o3AP+4HprXG0r42KEJtA==} peerDependencies: - storybook: ^8.3.4 + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true - '@storybook/csf-tools@8.2.9': - resolution: {integrity: sha512-tkW6c/AMRLrQ/Hyu0nD+VHufqFNgZqrjlboP+upasVAoPcKjzMVpEMoYHrIzw0yxKhA2f+CitTGGbywJpUfH7w==} + '@storybook/csf-plugin@8.4.6': + resolution: {integrity: sha512-JDIT0czC4yMgKGNf39KTZr3zm5MusAZdn6LBrTfvWb7CrTCR4iVHa4lp2yb7EJk41vHsBec0QUYDDuiFH/vV0g==} peerDependencies: - storybook: ^8.2.9 + storybook: ^8.4.6 - '@storybook/csf@0.1.11': - resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==} + '@storybook/csf@0.1.12': + resolution: {integrity: sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==} '@storybook/global@5.0.0': resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==} - '@storybook/manager-api@8.3.4': - resolution: {integrity: sha512-tBx7MBfPUrKSlD666zmVjtIvoNArwCciZiW/UJ8IWmomrTJRfFBnVvPVM2gp1lkDIzRHYmz5x9BHbYaEDNcZWQ==} + '@storybook/manager-api@8.4.6': + resolution: {integrity: sha512-TsXlQ5m5rTl2KNT9icPFyy822AqXrx1QplZBt/L7cFn7SpqQKDeSta21FH7MG0piAvzOweXebVSqKngJ6cCWWQ==} peerDependencies: - storybook: ^8.3.4 + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/preview-api@8.3.4': - resolution: {integrity: sha512-/YKQ3QDVSHmtFXXCShf5w0XMlg8wkfTpdYxdGv1CKFV8DU24f3N7KWulAgeWWCWQwBzZClDa9kzxmroKlQqx3A==} + '@storybook/preview-api@8.4.6': + resolution: {integrity: sha512-LbD+lR1FGvWaJBXteVx5xdgs1x1D7tyidBg2CsW2ex+cP0iJ176JgjPfutZxlWOfQnhfRYNnJ3WKoCIfxFOTKA==} peerDependencies: - storybook: ^8.3.4 + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/react-dom-shim@8.3.4': - resolution: {integrity: sha512-L4llDvjaAzqPx6h4ddZMh36wPr75PrI2S8bXy+flLqAeVRYnRt4WNKGuxqH0t0U6MwId9+vlCZ13JBfFuY7eQQ==} + '@storybook/react-dom-shim@8.4.6': + resolution: {integrity: sha512-f7RM8GO++fqMxbjNdEzeGS1P821jXuwRnAraejk5hyjB5SqetauFxMwoFYEYfJXPaLX2qIubnIJ78hdJ/IBaEA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.3.4 + storybook: ^8.4.6 - '@storybook/react-vite@8.3.4': - resolution: {integrity: sha512-0Xm8eTH+jQ7SV4moLkPN4G6U2IDrqXPXUqsZdXaccepIMcD4G75foQFm2LOrFJuY+IMySPspKeTqf8OLskPppw==} + '@storybook/react-vite@8.4.6': + resolution: {integrity: sha512-bVoYj3uJRz0SknK2qN3vBVSoEXsvyARQLuHjP9eX0lWBd9XSxZinmVbexPdD0OeJYcJIdmbli2/Gw7/hu5CjFA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.3.4 - vite: ^4.0.0 || ^5.0.0 + storybook: ^8.4.6 + vite: ^4.0.0 || ^5.0.0 || ^6.0.0 - '@storybook/react@8.3.4': - resolution: {integrity: sha512-PA7iQL4/9X2/iLrv+AUPNtlhTHJWhDao9gQIT1Hef39FtFk+TU9lZGbv+g29R1H9V3cHP5162nG2aTu395kmbA==} + '@storybook/react@8.4.6': + resolution: {integrity: sha512-QAT23beoYNLhFGAXPimtuMErvpcI7eZbZ4AlLqW1fhiTZrRYw06cjC1bs9H3tODMcHH9LS5p3Wz9b29jtV2XGw==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.3.4 + '@storybook/test': 8.4.6 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.3.4 + storybook: ^8.4.6 typescript: '>= 4.2.x' peerDependenciesMeta: '@storybook/test': @@ -2287,15 +2241,17 @@ packages: typescript: optional: true - '@storybook/test-runner@0.19.1': - resolution: {integrity: sha512-Nc4djXw3Lv3AAXg6TJ7yVTeuMryjMsTDd8GCbE/PStU602rpe8syEqElz78GPoJqB1VYWQ3T9pcu93MKyHT+xQ==} + '@storybook/test-runner@0.20.0': + resolution: {integrity: sha512-0cSNW61/XYg8jtcRlk8qc5fJa8qKSq7tvSpvikwS7zcXkKgfu6fbGX56ErxnvidmyCyXjMe/j0UHzLACzc2nTg==} engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 - '@storybook/theming@8.3.4': - resolution: {integrity: sha512-D4XVsQgTtpHEHLhwkx59aGy1GBwOedVr/mNns7hFrH8FjEpxrrWCuZQASq1ZpCl8LXlh7uvmT5sM2rOdQbGuGg==} + '@storybook/theming@8.4.6': + resolution: {integrity: sha512-q7vDPN/mgj7cXIVQ9R1/V75hrzNgKkm2G0LjMo57//9/djQ+7LxvBsR1iScbFIRSEqppvMiBFzkts+2uXidySA==} peerDependencies: - storybook: ^8.3.4 + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 '@styled-system/background@5.1.2': resolution: {integrity: sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==} @@ -2336,68 +2292,68 @@ packages: '@styled-system/variant@5.1.5': resolution: {integrity: sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==} - '@swc/core-darwin-arm64@1.7.26': - resolution: {integrity: sha512-FF3CRYTg6a7ZVW4yT9mesxoVVZTrcSWtmZhxKCYJX9brH4CS/7PRPjAKNk6kzWgWuRoglP7hkjQcd6EpMcZEAw==} + '@swc/core-darwin-arm64@1.9.3': + resolution: {integrity: sha512-hGfl/KTic/QY4tB9DkTbNuxy5cV4IeejpPD4zo+Lzt4iLlDWIeANL4Fkg67FiVceNJboqg48CUX+APhDHO5G1w==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.7.26': - resolution: {integrity: sha512-az3cibZdsay2HNKmc4bjf62QVukuiMRh5sfM5kHR/JMTrLyS6vSw7Ihs3UTkZjUxkLTT8ro54LI6sV6sUQUbLQ==} + '@swc/core-darwin-x64@1.9.3': + resolution: {integrity: sha512-IaRq05ZLdtgF5h9CzlcgaNHyg4VXuiStnOFpfNEMuI5fm5afP2S0FHq8WdakUz5WppsbddTdplL+vpeApt/WCQ==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.7.26': - resolution: {integrity: sha512-VYPFVJDO5zT5U3RpCdHE5v1gz4mmR8BfHecUZTmD2v1JeFY6fv9KArJUpjrHEEsjK/ucXkQFmJ0jaiWXmpOV9Q==} + '@swc/core-linux-arm-gnueabihf@1.9.3': + resolution: {integrity: sha512-Pbwe7xYprj/nEnZrNBvZfjnTxlBIcfApAGdz2EROhjpPj+FBqBa3wOogqbsuGGBdCphf8S+KPprL1z+oDWkmSQ==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.7.26': - resolution: {integrity: sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==} + '@swc/core-linux-arm64-gnu@1.9.3': + resolution: {integrity: sha512-AQ5JZiwNGVV/2K2TVulg0mw/3LYfqpjZO6jDPtR2evNbk9Yt57YsVzS+3vHSlUBQDRV9/jqMuZYVU3P13xrk+g==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.7.26': - resolution: {integrity: sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==} + '@swc/core-linux-arm64-musl@1.9.3': + resolution: {integrity: sha512-tzVH480RY6RbMl/QRgh5HK3zn1ZTFsThuxDGo6Iuk1MdwIbdFYUY034heWUTI4u3Db97ArKh0hNL0xhO3+PZdg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.7.26': - resolution: {integrity: sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==} + '@swc/core-linux-x64-gnu@1.9.3': + resolution: {integrity: sha512-ivXXBRDXDc9k4cdv10R21ccBmGebVOwKXT/UdH1PhxUn9m/h8erAWjz5pcELwjiMf27WokqPgaWVfaclDbgE+w==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.7.26': - resolution: {integrity: sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==} + '@swc/core-linux-x64-musl@1.9.3': + resolution: {integrity: sha512-ILsGMgfnOz1HwdDz+ZgEuomIwkP1PHT6maigZxaCIuC6OPEhKE8uYna22uU63XvYcLQvZYDzpR3ms47WQPuNEg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.7.26': - resolution: {integrity: sha512-9TNXPIJqFynlAOrRD6tUQjMq7KApSklK3R/tXgIxc7Qx+lWu8hlDQ/kVPLpU7PWvMMwC/3hKBW+p5f+Tms1hmA==} + '@swc/core-win32-arm64-msvc@1.9.3': + resolution: {integrity: sha512-e+XmltDVIHieUnNJHtspn6B+PCcFOMYXNJB1GqoCcyinkEIQNwC8KtWgMqUucUbEWJkPc35NHy9k8aCXRmw9Kg==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.7.26': - resolution: {integrity: sha512-9YngxNcG3177GYdsTum4V98Re+TlCeJEP4kEwEg9EagT5s3YejYdKwVAkAsJszzkXuyRDdnHUpYbTrPG6FiXrQ==} + '@swc/core-win32-ia32-msvc@1.9.3': + resolution: {integrity: sha512-rqpzNfpAooSL4UfQnHhkW8aL+oyjqJniDP0qwZfGnjDoJSbtPysHg2LpcOBEdSnEH+uIZq6J96qf0ZFD8AGfXA==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.7.26': - resolution: {integrity: sha512-VR+hzg9XqucgLjXxA13MtV5O3C0bK0ywtLIBw/+a+O+Oc6mxFWHtdUeXDbIi5AiPbn0fjgVJMqYnyjGyyX8u0w==} + '@swc/core-win32-x64-msvc@1.9.3': + resolution: {integrity: sha512-3YJJLQ5suIEHEKc1GHtqVq475guiyqisKSoUnoaRtxkDaW5g1yvPt9IoSLOe2mRs7+FFhGGU693RsBUSwOXSdQ==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.7.26': - resolution: {integrity: sha512-f5uYFf+TmMQyYIoxkn/evWhNGuUzC730dFwAKGwBVHHVoPyak1/GvJUm6i1SKl+2Hrj9oN0i3WSoWWZ4pgI8lw==} + '@swc/core@1.9.3': + resolution: {integrity: sha512-oRj0AFePUhtatX+BscVhnzaAmWjpfAeySpM1TCbxA1rtBDeH/JDhi5yYzAKneDYtVtBvA7ApfeuzhMC9ye4xSg==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '*' @@ -2408,8 +2364,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/jest@0.2.36': - resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} + '@swc/jest@0.2.37': + resolution: {integrity: sha512-CR2BHhmXKGxTiFr21DYPRHQunLkX3mNIFGFkxBGji6r9uyIR5zftTOVYj1e0sFNMV2H7mf/+vpaglqaryBtqfQ==} engines: {npm: '>= 7.0.0'} peerDependencies: '@swc/core': '*' @@ -2417,8 +2373,8 @@ packages: '@swc/plugin-styled-components@5.0.0': resolution: {integrity: sha512-c9WCV2hU4OxfczzeABNFwkLftAovP7IeHPX0nxqu1HMn4x/T6MjWoJ22hspBv32NpUwGlvIgRG3SyHRHE80enw==} - '@swc/types@0.1.12': - resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} + '@swc/types@0.1.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} @@ -2428,8 +2384,8 @@ packages: resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} engines: {node: '>=18'} - '@testing-library/jest-dom@6.5.0': - resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==} + '@testing-library/jest-dom@6.6.3': + resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} '@testing-library/react@16.0.1': @@ -2472,29 +2428,23 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - '@types/cacheable-request@6.0.2': resolution: {integrity: sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} '@types/d3-color@3.1.3': resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - '@types/d3-format@1.4.2': - resolution: {integrity: sha512-WeGCHAs7PHdZYq6lwl/+jsl+Nfc1J2W1kNcMeIMYzQsT6mtBDBgtJ/rcdjZ0k0rVIvqEZqhhuD5TK/v3P2gFHQ==} + '@types/d3-format@1.4.5': + resolution: {integrity: sha512-mLxrC1MSWupOSncXN/HOlWUAAIffAEBaI4+PKy2uMPsKe4FNZlk7qrbTjmzJXITQQqBHivaks4Td18azgqnotA==} - '@types/d3-path@3.0.1': - resolution: {integrity: sha512-blRhp7ki7pVznM8k6lk5iUU9paDbVRVq+/xpf0RRgSJn5gr6SE7RcFtxooYGMBOc1RZiGyqRpVdu5AD0z0ooMA==} + '@types/d3-path@3.1.0': + resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} '@types/d3-scale@4.0.8': resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} @@ -2502,17 +2452,17 @@ packages: '@types/d3-shape@3.1.6': resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} - '@types/d3-time-format@2.3.1': - resolution: {integrity: sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA==} + '@types/d3-time-format@2.3.4': + resolution: {integrity: sha512-xdDXbpVO74EvadI3UDxjxTdR6QIxm1FKzEA/+F8tL4GWWUg/hgvBqf6chql64U5A9ZUGWo7pEu4eNlyLwbKdhg==} - '@types/d3-time-format@3.0.1': - resolution: {integrity: sha512-5GIimz5IqaRsdnxs4YlyTZPwAMfALu/wA4jqSiuqgdbCxUZ2WjrnwANqOtoBJQgeaUTdYNfALJO0Yb0YrDqduA==} + '@types/d3-time-format@3.0.4': + resolution: {integrity: sha512-or9DiDnYI1h38J9hxKEsw513+KVuFbEVhl7qdxcaudoiqWWepapUen+2vAriFGexr6W5+P4l9+HJrB39GG+oRg==} - '@types/d3-time@1.1.1': - resolution: {integrity: sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw==} + '@types/d3-time@1.1.4': + resolution: {integrity: sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g==} - '@types/d3-time@3.0.2': - resolution: {integrity: sha512-kbdRXTmUgNfw5OTE3KZnFQn6XdIc4QGroN5UixgdrXATmYsdlPQS6pEut9tVlIojtzuFD4txs/L+Rq41AHtLpg==} + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -2520,32 +2470,14 @@ packages: '@types/doctrine@0.0.9': resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==} - '@types/escodegen@0.0.6': - resolution: {integrity: sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==} - - '@types/estree@0.0.51': - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/express-serve-static-core@4.19.6': - resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - - '@types/find-cache-dir@3.2.1': - resolution: {integrity: sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==} - '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - '@types/glob@7.2.0': - resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - - '@types/graceful-fs@4.1.8': - resolution: {integrity: sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==} + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} '@types/history@4.7.11': resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} @@ -2553,20 +2485,17 @@ packages: '@types/http-cache-semantics@4.0.1': resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - '@types/istanbul-lib-coverage@2.0.3': - resolution: {integrity: sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==} + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - '@types/istanbul-lib-report@3.0.0': - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/istanbul-reports@3.0.1': - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - - '@types/jest@29.5.13': - resolution: {integrity: sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==} + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} @@ -2584,26 +2513,14 @@ packages: resolution: {integrity: sha512-xoBtGl5R9jeKUhc8ZqeYaRDx04qqJ10yhhXYGmJ4Jr8qKpvMsDQQrNUvF/wUJ4klOtmJeJM+p2Xo3zp9uaC3tw==} deprecated: This is a stub types definition. keyv provides its own type definitions, so you do not need this installed. - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/minimatch@5.1.2': - resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/mute-stream@0.0.4': - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - '@types/node@20.16.10': - resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} - - '@types/node@22.7.4': - resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} + '@types/node@20.17.9': + resolution: {integrity: sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -2614,14 +2531,8 @@ packages: '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} - '@types/qs@6.9.16': - resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} '@types/react-highlight@0.12.8': resolution: {integrity: sha512-V7O7zwXUw8WSPd//YUO8sz489J/EeobJljASGhP0rClrvq+1Y1qWEpToGu+Pp7YuChxhAXSgkLkrOYpZX5A62g==} @@ -2635,8 +2546,8 @@ packages: '@types/react-transition-group@4.4.11': resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} - '@types/react@18.3.10': - resolution: {integrity: sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==} + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} @@ -2647,12 +2558,6 @@ packages: '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - '@types/shimmer@1.2.0': resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} @@ -2662,8 +2567,8 @@ packages: '@types/statuses@2.0.5': resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} - '@types/styled-system@5.1.22': - resolution: {integrity: sha512-NbRp37zWcrf/+Qf2NumdyZfhSx1dzJ50zgfKvnezYJx1HTRUMVYY8jtWvK1eoIAa6F5sXwHLhE8oXNu15ThBAA==} + '@types/styled-system@5.1.23': + resolution: {integrity: sha512-mIwCCdhDa2ifdQCEm8ZeD8m4UEbFsokqEoT9YNOUv4alUJ8jbMKxvpr+oOwfuZgwqLh5HjWuEzwnX7DzWvjFBg==} '@types/stylis@4.2.5': resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} @@ -2701,20 +2606,17 @@ packages: '@types/wicg-file-system-access@2023.10.5': resolution: {integrity: sha512-e9kZO9kCdLqT2h9Tw38oGv9UNzBBWaR1MzuAavxPcsV/7FJ3tWbU6RI3uB+yKIDPGLkGVbplS52ub0AcRLvrhA==} - '@types/wrap-ansi@3.0.0': - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - - '@types/yargs-parser@20.2.1': - resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.29': - resolution: {integrity: sha512-nacjqA3ee9zRF/++a3FUY1suHTFKZeHba2n8WeDw9cCVdmzmHpIxyzOJBcpHvvEmS8E9KqWlSnWHUkOrkhWcvA==} + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} '@types/yauzl@2.10.0': resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} - '@typescript-eslint/eslint-plugin@8.12.2': - resolution: {integrity: sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==} + '@typescript-eslint/eslint-plugin@8.16.0': + resolution: {integrity: sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -2724,8 +2626,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.12.2': - resolution: {integrity: sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==} + '@typescript-eslint/parser@8.16.0': + resolution: {integrity: sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2738,18 +2640,15 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@7.14.1': - resolution: {integrity: sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/scope-manager@8.12.2': - resolution: {integrity: sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==} + '@typescript-eslint/scope-manager@8.16.0': + resolution: {integrity: sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.12.2': - resolution: {integrity: sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==} + '@typescript-eslint/type-utils@8.16.0': + resolution: {integrity: sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: @@ -2759,12 +2658,8 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@7.14.1': - resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/types@8.12.2': - resolution: {integrity: sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==} + '@typescript-eslint/types@8.16.0': + resolution: {integrity: sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -2776,17 +2671,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@7.14.1': - resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@8.12.2': - resolution: {integrity: sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==} + '@typescript-eslint/typescript-estree@8.16.0': + resolution: {integrity: sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2800,32 +2686,26 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@7.14.1': - resolution: {integrity: sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/utils@8.12.2': - resolution: {integrity: sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==} + '@typescript-eslint/utils@8.16.0': + resolution: {integrity: sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@7.14.1': - resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/visitor-keys@8.12.2': - resolution: {integrity: sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==} + '@typescript-eslint/visitor-keys@8.16.0': + resolution: {integrity: sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@uiw/codemirror-extensions-basic-setup@4.23.3': - resolution: {integrity: sha512-nEMjgbCyeLx+UQgOGAAoUWYFE34z5TlyaKNszuig/BddYFDb0WKcgmC37bDFxR2dZssf3K/lwGWLpXnGKXePbA==} + '@uiw/codemirror-extensions-basic-setup@4.23.6': + resolution: {integrity: sha512-bvtq8IOvdkLJMhoJBRGPEzU51fMpPDwEhcAHp9xCR05MtbIokQgsnLXrmD1aZm6e7s/3q47H+qdSfAAkR5MkLA==} peerDependencies: '@codemirror/autocomplete': '>=6.0.0' '@codemirror/commands': '>=6.0.0' @@ -2835,15 +2715,15 @@ packages: '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' - '@uiw/codemirror-themes@4.23.3': - resolution: {integrity: sha512-oUq2qoj+hMrR34Xhbp7S1P2elPtySWyzij97IwsZAdGZD/yS+c9+2yRSMYqtaWh7D9M4sJmwgU1lZibmwLZOfQ==} + '@uiw/codemirror-themes@4.23.6': + resolution: {integrity: sha512-0dpuLQW+V6zrKvfvor/eo71V3tpr2L2Hsu8QZAdtSzksjWABxTOzH3ShaBRxCEsrz6sU9sa9o7ShwBMMDz59bQ==} peerDependencies: '@codemirror/language': '>=6.0.0' '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' - '@uiw/react-codemirror@4.23.3': - resolution: {integrity: sha512-TBBLUbeqXmfQSfO+f3rPNOAb+QXbSm7KPB64FHQWLGg2WJNbpOhjLOWMyL+C4ZP3aSCNc2Y5aftEK1vp3wCKTA==} + '@uiw/react-codemirror@4.23.6': + resolution: {integrity: sha512-caYKGV6TfGLRV1HHD3p0G3FiVzKL1go7wes5XT2nWjB0+dTdyzyb81MKRSacptgZcotujfNO6QXn65uhETRAMw==} peerDependencies: '@babel/runtime': '>=7.11.0' '@codemirror/state': '>=6.0.0' @@ -2856,10 +2736,10 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitejs/plugin-react-swc@3.7.1': - resolution: {integrity: sha512-vgWOY0i1EROUK0Ctg1hwhtC3SdcDjZcdit4Ups4aPkDcB1jYhmo+RMYWY87cmXMhvtD5uf8lV89j2w16vkdSVg==} + '@vitejs/plugin-react-swc@3.7.2': + resolution: {integrity: sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==} peerDependencies: - vite: ^4 || ^5 + vite: ^4 || ^5 || ^6 '@xmldom/xmldom@0.8.10': resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} @@ -2905,12 +2785,8 @@ packages: abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - ace-builds@1.36.2: - resolution: {integrity: sha512-eqqfbGwx/GKjM/EnFu4QtQ+d2NNBu84MGgxoG8R5iyFpcVeQ4p9YlTL+ZzdEJqhdkASqoqOxCSNNGyB6lvMm+A==} + ace-builds@1.36.5: + resolution: {integrity: sha512-mZ5KVanRT6nLRDLqtG/1YQQLX/gZVC/v526cm1Ru/MTSlrbweSmqv2ZT0d2GaHpJq035MwCMIrj+LgDAUnDXrg==} acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} @@ -2925,21 +2801,12 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -3049,13 +2916,14 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} @@ -3118,8 +2986,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.7.5: - resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==} + axios@1.7.8: + resolution: {integrity: sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==} b4a@1.6.4: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} @@ -3170,8 +3038,8 @@ packages: babel-plugin-transform-vite-meta-env@1.0.3: resolution: {integrity: sha512-eyfuDEXrMu667TQpmctHeTlJrZA6jXYHyEJFjcM0yEa60LS/LXlOg2PBbMb8DVS+V9CnTj/j9itdlDVMcY2zEg==} - babel-preset-current-node-syntax@1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} peerDependencies: '@babel/core': ^7.0.0 @@ -3218,10 +3086,6 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - boolean@3.1.4: resolution: {integrity: sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -3239,8 +3103,8 @@ packages: browser-assert@1.2.1: resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - browserslist@4.23.3: - resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -3263,10 +3127,6 @@ packages: builder-util@25.1.7: resolution: {integrity: sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww==} - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -3306,8 +3166,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001651: - resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + caniuse-lite@1.0.30001684: + resolution: {integrity: sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -3329,8 +3189,8 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - char-regex@2.0.1: - resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} + char-regex@2.0.2: + resolution: {integrity: sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==} engines: {node: '>=12.20'} chownr@2.0.0: @@ -3343,8 +3203,8 @@ packages: ci-info@3.3.0: resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==} - cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} @@ -3387,8 +3247,8 @@ packages: codemirror@6.0.1: resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} - collect-v8-coverage@1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -3450,25 +3310,14 @@ packages: console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - cookie@0.7.1: - resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} core-js-compat@3.38.1: @@ -3507,8 +3356,8 @@ packages: crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} css-color-keywords@1.0.0: @@ -3627,14 +3476,6 @@ packages: resolution: {integrity: sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==} engines: {node: '>=0.11'} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -3643,15 +3484,6 @@ packages: supports-color: optional: true - debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -3672,8 +3504,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -3717,18 +3549,10 @@ packages: delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -3814,9 +3638,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -3833,8 +3654,8 @@ packages: electron-publish@25.1.7: resolution: {integrity: sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg==} - electron-to-chromium@1.5.13: - resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + electron-to-chromium@1.5.67: + resolution: {integrity: sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==} electron-vite@2.3.0: resolution: {integrity: sha512-lsN2FymgJlp4k6MrcsphGqZQ9fKRdJKasoaiwIrAewN1tapYI/KINLdfEL7n10LuF0pPSNf/IqjzZbB5VINctg==} @@ -3865,14 +3686,6 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - encoding@0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} @@ -3915,13 +3728,10 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + es-iterator-helpers@1.2.0: + resolution: {integrity: sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} - es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -3950,8 +3760,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.23.1: - resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} engines: {node: '>=18'} hasBin: true @@ -3959,9 +3769,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -4016,45 +3823,24 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-module-utils@2.8.2: - resolution: {integrity: sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - eslint-plugin-babel@5.3.1: resolution: {integrity: sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==} engines: {node: '>=4'} peerDependencies: eslint: '>=4.0.0' - eslint-plugin-import@2.30.0: - resolution: {integrity: sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==} + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: '@typescript-eslint/parser': optional: true - eslint-plugin-jest-dom@5.4.0: - resolution: {integrity: sha512-yBqvFsnpS5Sybjoq61cJiUsenRkC9K32hYQBFS9doBR7nbQZZ5FyO+X7MlmfM1C48Ejx/qTuOCgukDUNyzKZ7A==} + eslint-plugin-jest-dom@5.5.0: + resolution: {integrity: sha512-CRlXfchTr7EgC3tDI7MGHY6QjdJU5Vv2RPaeeGtkXUHnKZf04kgzMPIJUXt4qKCvYWVVIEo9ut9Oq1vgXAykEA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} peerDependencies: '@testing-library/dom': ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -4063,8 +3849,8 @@ packages: '@testing-library/dom': optional: true - eslint-plugin-jest@28.8.3: - resolution: {integrity: sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==} + eslint-plugin-jest@28.9.0: + resolution: {integrity: sha512-rLu1s1Wf96TgUUxSw6loVIkNtUjq1Re7A9QdCCHSohnvXEBAjuL420h0T/fMmkQlNsQP2GhQzEUpYHPfxBkvYQ==} engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} peerDependencies: '@typescript-eslint/eslint-plugin': ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -4082,8 +3868,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react@7.37.0: - resolution: {integrity: sha512-IHBePmfWH5lKhJnJ7WB1V+v/GolbB0rjS8XYVCSQCZKaQCAUhMoVoOEn1Ef8Z8Wf0a7l8KTJvuZg5/e4qrZ6nA==} + eslint-plugin-react@7.37.2: + resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 @@ -4110,6 +3896,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4148,10 +3938,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -4178,10 +3964,6 @@ packages: exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - express@4.21.1: - resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} - engines: {node: '>= 0.10.0'} - extract-zip@2.0.1: resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} engines: {node: '>= 10.17.0'} @@ -4210,8 +3992,8 @@ packages: fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} - fb-watchman@2.0.1: - resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -4230,10 +4012,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@1.3.1: - resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} - engines: {node: '>= 0.8'} - find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -4271,8 +4049,8 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -4287,22 +4065,14 @@ packages: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - fromentries@1.3.2: resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} @@ -4400,12 +4170,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-promise@4.2.2: - resolution: {integrity: sha512-xcUzJ8NWN5bktoTIX7eOclO1Npxd/dyVqUJxlLIDasT4C7KZyqlPIwkdJ0Ypiy3p2ZKahTjK4M9uC3sNSfNMzw==} - engines: {node: '>=12'} - peerDependencies: - glob: ^7.1.6 - glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -4439,8 +4203,8 @@ packages: resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: @@ -4450,8 +4214,9 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.1.0: + resolution: {integrity: sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==} + engines: {node: '>= 0.4'} got@11.8.6: resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} @@ -4538,20 +4303,12 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - htmlparser2@3.10.1: resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - http-proxy-agent@5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -4584,10 +4341,6 @@ packages: engines: {node: ^8.11.2 || >=10} os: [darwin] - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -4650,10 +4403,6 @@ packages: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - is-arguments@1.1.1: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} @@ -4759,10 +4508,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -4845,8 +4590,8 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} - istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} istanbul-lib-hook@3.0.0: @@ -4857,32 +4602,33 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} - istanbul-lib-instrument@5.1.0: - resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} - istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} istanbul-lib-processinfo@2.0.3: resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} engines: {node: '>=8'} - istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} - istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + iterator.prototype@1.1.3: + resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==} + engines: {node: '>= 0.4'} jackspeak@3.4.2: resolution: {integrity: sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==} @@ -4951,8 +4697,8 @@ packages: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-fail-on-console@3.3.0: - resolution: {integrity: sha512-J9rnFQvQwkcGJw01zCEKe2Uag+E926lFgIyaQGep2LqhQH7OCRHyD+tm/jnNoKlSRnOBO60DmzMjeQAVI3f5cw==} + jest-fail-on-console@3.3.1: + resolution: {integrity: sha512-dmq/dmh5OBgJlD1MJdpznzwFQP8S7msf3ghTGWQLGhagWwHKzGtqXza76nuJUKOK7BdwqcTK6CCE49Xxv4ckUQ==} jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} @@ -4990,8 +4736,8 @@ packages: jest-environment-node: ^29.3.1 jest-runner: ^29.3.1 - jest-pnp-resolver@1.2.2: - resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: jest-resolve: '*' @@ -5113,13 +4859,9 @@ packages: canvas: optional: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: @@ -5229,8 +4971,8 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - logform@2.6.0: - resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} long@5.2.3: @@ -5266,13 +5008,17 @@ packages: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + make-fetch-happen@10.2.1: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -5284,16 +5030,9 @@ packages: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} engines: {node: '>=10'} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - memoize-one@6.0.0: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -5301,10 +5040,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -5317,11 +5052,6 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} engines: {node: '>=4.0.0'} @@ -5412,22 +5142,16 @@ packages: moo-color@1.0.2: resolution: {integrity: sha512-5iXz5n9LWQzx/C2WesGFfpE6RLamzdHwsn3KpfzShwbfIqs7stnoEpaNErf/7+3mbxwZ4s8Foq7I0tPxw7BWHg==} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw-storybook-addon@2.0.3: - resolution: {integrity: sha512-CzHmGO32JeOPnyUnRWnB0PFTXCY1HKfHiEB/6fYoUYiFm2NYosLjzs9aBd3XJUryYEN0avJqMNh7nCRDxE5JjQ==} + msw-storybook-addon@2.0.4: + resolution: {integrity: sha512-rstO8+r01sRMg6PPP7OxM8LG5/6r4+wmp2uapHeHvm9TQQRHvpPXOU/Y9/Somysz8Oi4Ea1aummXH3JlnP2LIA==} peerDependencies: msw: ^2.0.0 - msw@2.4.9: - resolution: {integrity: sha512-1m8xccT6ipN4PTqLinPwmzhxQREuxaEJYdx4nIbggxP8aM7r1e71vE7RtOUSQoAm1LydjGfZKy7370XD/tsuYg==} + msw@2.6.6: + resolution: {integrity: sha512-npfIIVRHKQX3Lw4aLWX4wBh+lQwpqdZNyJYB5K/+ktK8NhtkdsTxGK7WDrgknozcVyRI7TOqY6yBS9j2FTR+YQ==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -5436,9 +5160,9 @@ packages: typescript: optional: true - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} @@ -5510,11 +5234,11 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} deprecated: This package is no longer supported. - nwsapi@2.2.13: - resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} - nwsapi@2.2.2: - resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} + nwsapi@2.2.9: + resolution: {integrity: sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==} nyc@15.1.0: resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} @@ -5552,10 +5276,6 @@ packages: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -5639,10 +5359,6 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -5662,9 +5378,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.10: - resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} - path-to-regexp@1.9.0: resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} @@ -5682,16 +5395,17 @@ packages: pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -5700,13 +5414,13 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} - playwright-core@1.47.2: - resolution: {integrity: sha512-3JvMfF+9LJfe16l7AbSmU555PaTl2tPyQsVInqm3id16pdDfvZ8TTZ/pyzmkbDrZTQefyzU7AIHlZqQnxpqHVQ==} + playwright-core@1.49.0: + resolution: {integrity: sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==} engines: {node: '>=18'} hasBin: true - playwright@1.47.2: - resolution: {integrity: sha512-nx1cLMmQWqmA3UsnjaaokyoUpdVaaDhJhMoxX2qj3McpjnsqFHs516QAKYhqHAgOP+oCFTEOCOAaD1RgD/RQfA==} + playwright@1.49.0: + resolution: {integrity: sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==} engines: {node: '>=18'} hasBin: true @@ -5737,8 +5451,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.4.1: + resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==} engines: {node: '>=14'} hasBin: true @@ -5753,8 +5467,8 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + process-on-spawn@1.1.0: + resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} engines: {node: '>=8'} process@0.11.10: @@ -5784,23 +5498,15 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - protobufjs@7.3.2: - resolution: {integrity: sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==} - engines: {node: '>=12.0.0'} - protobufjs@7.4.0: resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} engines: {node: '>=12.0.0'} - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + psl@1.14.0: + resolution: {integrity: sha512-Syk1bnf6fRZ9wQs03AtKJHcM12cKbOLo9L8JtCCdYj5/DTsHmTyXM4BK5ouWeG2P6kZ4nmFvuNTdtaqfobCOCg==} pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -5809,12 +5515,8 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} - - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -5829,14 +5531,6 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - react-day-picker@8.10.1: resolution: {integrity: sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==} peerDependencies: @@ -5866,8 +5560,8 @@ packages: peerDependencies: typescript: '>= 4.3.x' - react-docgen@7.0.3: - resolution: {integrity: sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==} + react-docgen@7.1.0: + resolution: {integrity: sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g==} engines: {node: '>=16.14.0'} react-dom@18.3.1: @@ -5875,12 +5569,6 @@ packages: peerDependencies: react: ^18.3.1 - react-element-to-jsx-string@15.0.0: - resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} - peerDependencies: - react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - react-highlight@0.15.0: resolution: {integrity: sha512-5uV/b/N4Z421GSVVe05fz+OfTsJtFzx/fJBdafZyw4LS70XjIZwgEx3Lrkfc01W/RzZ2Dtfb0DApoaJFAIKBtA==} @@ -5890,9 +5578,6 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.1.0: - resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -5909,8 +5594,8 @@ packages: react-select-event@5.5.1: resolution: {integrity: sha512-goAx28y0+iYrbqZA2FeRTreHHs/ZtSuKxtA+J5jpKT5RHPCbVZJ4MqACfPnWyFXsEec+3dP5bCrNTxIX8oYe9A==} - react-select@5.8.1: - resolution: {integrity: sha512-RT1CJmuc+ejqm5MPgzyZujqDskdvB9a9ZqrdnVLsvAHjJ3Tj0hELnLeVPQlmYdVKCdCpxanepl6z7R5KhXhWzg==} + react-select@5.8.3: + resolution: {integrity: sha512-lVswnIq8/iTj1db7XCG74M/3fbGB6ZaluCzvwPGT5ZOjCdL/k0CLWhEK0vCBLuU5bHTEf6Gj8jtSvi+3v+tO1w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -5954,8 +5639,8 @@ packages: resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} engines: {node: '>= 0.4'} - regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} regenerate@1.4.2: @@ -5971,12 +5656,15 @@ packages: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} - regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} - regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true release-zalgo@1.0.0: @@ -6139,18 +5827,10 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} - serialize-error@7.0.1: resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} engines: {node: '>=10'} - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} - engines: {node: '>= 0.8.0'} - set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -6162,9 +5842,6 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} @@ -6224,10 +5901,6 @@ packages: resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -6274,10 +5947,6 @@ packages: stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} - stack-utils@2.0.5: - resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} - engines: {node: '>=10'} - stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -6290,9 +5959,14 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - storybook@8.3.4: - resolution: {integrity: sha512-nzvuK5TsEgJwcWGLGgafabBOxKn37lfJVv7ZoUVPgJIjk2mNRyJDFwYRJzUZaD37eiR/c/lQ6MoaeqlGwiXoxw==} + storybook@8.4.6: + resolution: {integrity: sha512-J6juZSZT2u3PUW0QZYZZYxBq6zU5O0OrkSgkMXGMg/QrS9to9IHmt4FjEMEyACRbXo8POcB/fSXa3VpGe7bv3g==} hasBin: true + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true streamx@2.18.0: resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} @@ -6476,18 +6150,10 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} @@ -6547,8 +6213,8 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsutils@3.21.0: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} @@ -6584,14 +6250,10 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - type-fest@4.26.1: - resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} + type-fest@4.29.0: + resolution: {integrity: sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ==} engines: {node: '>=16'} - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -6611,17 +6273,18 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typescript-eslint@8.12.2: - resolution: {integrity: sha512-UbuVUWSrHVR03q9CWx+JDHeO6B/Hr9p4U5lRH++5tq/EbFq1faYZe50ZSBePptgfIKLEti0aPQ3hFgnPVcd8ZQ==} + typescript-eslint@8.16.0: + resolution: {integrity: sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} hasBin: true @@ -6667,21 +6330,12 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - unplugin@1.14.1: - resolution: {integrity: sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==} + unplugin@1.16.0: + resolution: {integrity: sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==} engines: {node: '>=14.0.0'} - peerDependencies: - webpack-sources: ^3 - peerDependenciesMeta: - webpack-sources: - optional: true - update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -6710,10 +6364,6 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -6729,10 +6379,6 @@ packages: value-equal@1.0.1: resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - verror@1.10.1: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} engines: {node: '>=0.6.0'} @@ -6742,8 +6388,8 @@ packages: peerDependencies: vite: ^2 || ^3 || ^4 || ^5 - vite-tsconfig-paths@5.0.1: - resolution: {integrity: sha512-yqwv+LstU7NwPeNqajZzLEBVpUFU6Dugtb2P84FXuvaoYA+/70l9MHE+GYfYAycVyPSDYZ7mjOFuYBRqlEpTig==} + vite-tsconfig-paths@5.1.3: + resolution: {integrity: sha512-0bz+PDlLpGfP2CigeSKL9NFTF1KtXkeHGZSSaGQSuPZH77GhoiQaA8IjYgOaynSuwlDTolSUEU0ErVvju3NURg==} peerDependencies: vite: '*' peerDependenciesMeta: @@ -6812,10 +6458,6 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -6859,8 +6501,8 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + which-typed-array@1.1.16: + resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} engines: {node: '>= 0.4'} which@1.3.1: @@ -6880,12 +6522,12 @@ packages: wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - winston-transport@4.7.0: - resolution: {integrity: sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==} + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} - winston@3.14.2: - resolution: {integrity: sha512-CO8cdpBB2yqzEf8v895L+GNKYJiEq8eKlHU38af3snQBQ+sdAIUepjMSguOIJC7ICbzm0ZI+Af2If4vIJrtmOg==} + winston@3.17.0: + resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==} engines: {node: '>= 12.0.0'} wrap-ansi@6.2.0: @@ -6988,8 +6630,8 @@ packages: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} engines: {node: '>= 10'} - zod-to-json-schema@3.23.3: - resolution: {integrity: sha512-TYWChTxKQbRJp5ST22o/Irt9KC5nj7CdBKYB/AosCRdj/wxEMvv4NNaj9XVUHDOIp53ZxArGhnw5HMZziPFjog==} + zod-to-json-schema@3.23.5: + resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} peerDependencies: zod: ^3.23.3 @@ -7005,891 +6647,818 @@ snapshots: '@aashutoshrathi/word-wrap@1.2.6': {} - '@adobe/css-tools@4.4.0': {} + '@adobe/css-tools@4.4.1': {} '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.24.7': + '@babel/code-frame@7.26.2': dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/compat-data@7.25.4': {} + '@babel/compat-data@7.26.2': {} - '@babel/core@7.25.2': + '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.5 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helpers': 7.25.0 - '@babel/parser': 7.25.4 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.6 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.25.5': - dependencies: - '@babel/types': 7.25.4 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/generator@7.25.6': + '@babel/generator@7.26.2': dependencies: - '@babel/types': 7.25.6 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 + jsesc: 3.0.2 - '@babel/helper-annotate-as-pure@7.24.7': + '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.25.4 + '@babel/types': 7.26.0 - '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helper-compilation-targets@7.25.2': + '@babel/helper-compilation-targets@7.25.9': dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2)': + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.6 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2)': + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - regexpu-core: 5.3.2 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.24.8': + '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.24.7': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.24.7': + '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.25.6 + '@babel/types': 7.26.0 - '@babel/helper-plugin-utils@7.24.8': {} + '@babel/helper-plugin-utils@7.25.9': {} - '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2)': + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-wrap-function': 7.25.0 - '@babel/traverse': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-member-expression-to-functions': 7.24.8 - '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-simple-access@7.24.7': + '@babel/helper-simple-access@7.25.9': dependencies: - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.4 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': dependencies: - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.24.8': {} + '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-validator-identifier@7.24.7': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.24.8': {} + '@babel/helper-validator-option@7.25.9': {} - '@babel/helper-wrap-function@7.25.0': + '@babel/helper-wrap-function@7.25.9': dependencies: - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.4 - '@babel/types': 7.25.6 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helpers@7.25.0': + '@babel/helpers@7.26.0': dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.4 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 - '@babel/highlight@7.24.7': + '@babel/parser@7.26.2': dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + '@babel/types': 7.26.0 - '@babel/parser@7.25.4': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/types': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color - '@babel/parser@7.25.6': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/types': 7.25.6 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.4 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.26.0 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-async-generator-functions@7.25.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/traverse': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) - '@babel/traverse': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/template': 7.25.0 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 - '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2)': + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-simple-access': 7.24.7 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.25.2)': + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/types': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 regenerator-transform: 0.15.2 - '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-typescript@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/plugin-transform-unicode-sets-regex@7.25.4(@babel/core@7.25.2)': - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 - - '@babel/preset-env@7.25.4(@babel/core@7.25.2)': - dependencies: - '@babel/compat-data': 7.25.4 - '@babel/core': 7.25.2 - '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-async-generator-functions': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) - '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) - '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) - '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-private-methods': 7.25.4(@babel/core@7.25.2) - '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-unicode-sets-regex': 7.25.4(@babel/core@7.25.2) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.26.0) core-js-compat: 3.38.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/types': 7.25.4 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.0 esutils: 2.0.3 - '@babel/preset-react@7.24.7(@babel/core@7.25.2)': + '@babel/preset-react@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-react-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.24.7(@babel/core@7.25.2)': + '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) - '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typescript': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/regjsgen@0.8.0': {} - - '@babel/runtime@7.25.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/runtime@7.25.6': + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.0': + '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.4 - '@babel/types': 7.25.4 - - '@babel/traverse@7.25.4': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.5 - '@babel/parser': 7.25.4 - '@babel/template': 7.25.0 - '@babel/types': 7.25.4 - debug: 4.3.7 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 - '@babel/traverse@7.25.6': + '@babel/traverse@7.25.9': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.6 - '@babel/parser': 7.25.6 - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.25.4': + '@babel/types@7.26.0': dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@babel/types@7.25.6': - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@base2/pretty-print-object@1.0.1': {} + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 '@bcoe/v8-coverage@0.2.3': {} - '@bundled-es-modules/cookie@2.0.0': + '@bundled-es-modules/cookie@2.0.1': dependencies: - cookie: 0.7.1 + cookie: 0.7.2 '@bundled-es-modules/statuses@1.0.1': dependencies: @@ -7900,52 +7469,36 @@ snapshots: '@types/tough-cookie': 4.0.5 tough-cookie: 4.1.4 - '@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1)': - dependencies: - '@codemirror/language': 6.10.2 - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 - '@lezer/common': 1.2.1 - - '@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1)': + '@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3)': dependencies: - '@codemirror/language': 6.10.3 + '@codemirror/language': 6.10.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 - '@lezer/common': 1.2.1 + '@codemirror/view': 6.35.0 + '@lezer/common': 1.2.3 - '@codemirror/commands@6.6.2': + '@codemirror/commands@6.7.1': dependencies: - '@codemirror/language': 6.10.3 + '@codemirror/language': 6.10.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 - '@lezer/common': 1.2.1 + '@codemirror/view': 6.35.0 + '@lezer/common': 1.2.3 - '@codemirror/lang-sql@6.7.1(@codemirror/view@6.34.1)': + '@codemirror/lang-sql@6.8.0(@codemirror/view@6.35.0)': dependencies: - '@codemirror/autocomplete': 6.18.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1) - '@codemirror/language': 6.10.2 + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3) + '@codemirror/language': 6.10.6 '@codemirror/state': 6.4.1 - '@lezer/common': 1.2.1 + '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 transitivePeerDependencies: - '@codemirror/view' - '@codemirror/language@6.10.2': + '@codemirror/language@6.10.6': dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 - '@lezer/common': 1.2.1 - '@lezer/highlight': 1.2.1 - '@lezer/lr': 1.4.2 - style-mod: 4.1.2 - - '@codemirror/language@6.10.3': - dependencies: - '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 - '@lezer/common': 1.2.1 + '@codemirror/view': 6.35.0 + '@lezer/common': 1.2.3 '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 style-mod: 4.1.2 @@ -7953,25 +7506,25 @@ snapshots: '@codemirror/lint@6.4.2': dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 + '@codemirror/view': 6.35.0 crelt: 1.0.6 '@codemirror/search@6.5.3': dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 + '@codemirror/view': 6.35.0 crelt: 1.0.6 '@codemirror/state@6.4.1': {} '@codemirror/theme-one-dark@6.1.2': dependencies: - '@codemirror/language': 6.10.3 + '@codemirror/language': 6.10.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 + '@codemirror/view': 6.35.0 '@lezer/highlight': 1.2.1 - '@codemirror/view@6.34.1': + '@codemirror/view@6.35.0': dependencies: '@codemirror/state': 6.4.1 style-mod: 4.1.2 @@ -8061,13 +7614,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/babel-plugin@11.12.0': + '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.24.7 - '@babel/runtime': 7.25.6 + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.0 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 - '@emotion/serialize': 1.3.2 + '@emotion/serialize': 1.3.3 babel-plugin-macros: 3.1.0 convert-source-map: 1.9.0 escape-string-regexp: 4.0.0 @@ -8077,11 +7630,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@emotion/cache@11.13.1': + '@emotion/cache@11.13.5': dependencies: '@emotion/memoize': 0.9.0 '@emotion/sheet': 1.4.0 - '@emotion/utils': 1.4.1 + '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 stylis: 4.2.0 @@ -8099,28 +7652,28 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.13.3(@types/react@18.3.10)(react@18.3.1)': + '@emotion/react@11.13.5(@types/react@18.3.12)(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.6 - '@emotion/babel-plugin': 11.12.0 - '@emotion/cache': 11.13.1 - '@emotion/serialize': 1.3.2 + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.13.5 + '@emotion/serialize': 1.3.3 '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) - '@emotion/utils': 1.4.1 + '@emotion/utils': 1.4.2 '@emotion/weak-memoize': 0.4.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/react': 18.3.10 + '@types/react': 18.3.12 transitivePeerDependencies: - supports-color - '@emotion/serialize@1.3.2': + '@emotion/serialize@1.3.3': dependencies: '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/unitless': 0.10.0 - '@emotion/utils': 1.4.1 + '@emotion/utils': 1.4.2 csstype: 3.1.3 '@emotion/sheet@1.4.0': {} @@ -8133,149 +7686,149 @@ snapshots: dependencies: react: 18.3.1 - '@emotion/utils@1.4.1': {} + '@emotion/utils@1.4.2': {} '@emotion/weak-memoize@0.4.0': {} '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.23.1': + '@esbuild/aix-ppc64@0.24.0': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.23.1': + '@esbuild/android-arm64@0.24.0': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.23.1': + '@esbuild/android-arm@0.24.0': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.23.1': + '@esbuild/android-x64@0.24.0': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.23.1': + '@esbuild/darwin-arm64@0.24.0': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.23.1': + '@esbuild/darwin-x64@0.24.0': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.23.1': + '@esbuild/freebsd-arm64@0.24.0': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.23.1': + '@esbuild/freebsd-x64@0.24.0': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.23.1': + '@esbuild/linux-arm64@0.24.0': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.23.1': + '@esbuild/linux-arm@0.24.0': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.23.1': + '@esbuild/linux-ia32@0.24.0': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.23.1': + '@esbuild/linux-loong64@0.24.0': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.23.1': + '@esbuild/linux-mips64el@0.24.0': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.23.1': + '@esbuild/linux-ppc64@0.24.0': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.23.1': + '@esbuild/linux-riscv64@0.24.0': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.23.1': + '@esbuild/linux-s390x@0.24.0': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.23.1': + '@esbuild/linux-x64@0.24.0': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.23.1': + '@esbuild/netbsd-x64@0.24.0': optional: true - '@esbuild/openbsd-arm64@0.23.1': + '@esbuild/openbsd-arm64@0.24.0': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.23.1': + '@esbuild/openbsd-x64@0.24.0': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.23.1': + '@esbuild/sunos-x64@0.24.0': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.23.1': + '@esbuild/win32-arm64@0.24.0': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.23.1': + '@esbuild/win32-ia32@0.24.0': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.23.1': + '@esbuild/win32-x64@0.24.0': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': @@ -8305,7 +7858,7 @@ snapshots: dependencies: '@floating-ui/utils': 0.2.8 - '@floating-ui/dom@1.6.11': + '@floating-ui/dom@1.6.12': dependencies: '@floating-ui/core': 1.6.8 '@floating-ui/utils': 0.2.8 @@ -8314,7 +7867,7 @@ snapshots: '@gar/promisify@1.1.3': {} - '@grpc/grpc-js@1.11.3': + '@grpc/grpc-js@1.12.2': dependencies: '@grpc/proto-loader': 0.7.13 '@js-sdsl/ordered-map': 4.4.2 @@ -8344,35 +7897,31 @@ snapshots: '@humanwhocodes/object-schema@2.0.2': {} - '@inquirer/confirm@3.2.0': + '@inquirer/confirm@5.0.2(@types/node@20.17.9)': dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 + '@inquirer/core': 10.1.0(@types/node@20.17.9) + '@inquirer/type': 3.0.1(@types/node@20.17.9) + '@types/node': 20.17.9 - '@inquirer/core@9.2.1': + '@inquirer/core@10.1.0(@types/node@20.17.9)': dependencies: - '@inquirer/figures': 1.0.6 - '@inquirer/type': 2.0.0 - '@types/mute-stream': 0.0.4 - '@types/node': 22.7.4 - '@types/wrap-ansi': 3.0.0 + '@inquirer/figures': 1.0.8 + '@inquirer/type': 3.0.1(@types/node@20.17.9) ansi-escapes: 4.3.2 cli-width: 4.1.0 - mute-stream: 1.0.0 + mute-stream: 2.0.0 signal-exit: 4.1.0 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 + transitivePeerDependencies: + - '@types/node' - '@inquirer/figures@1.0.6': {} - - '@inquirer/type@1.5.5': - dependencies: - mute-stream: 1.0.0 + '@inquirer/figures@1.0.8': {} - '@inquirer/type@2.0.0': + '@inquirer/type@3.0.1(@types/node@20.17.9)': dependencies: - mute-stream: 1.0.0 + '@types/node': 20.17.9 '@isaacs/cliui@8.0.2': dependencies: @@ -8396,7 +7945,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -8409,14 +7958,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.3.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -8445,7 +7994,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -8463,7 +8012,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.16.10 + '@types/node': 20.17.9 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -8485,17 +8034,17 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.16.10 + '@types/node': 20.17.9 chalk: 4.1.2 - collect-v8-coverage: 1.0.1 + collect-v8-coverage: 1.0.2 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.1 - istanbul-lib-report: 3.0.0 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 + istanbul-reports: 3.1.7 jest-message-util: 29.7.0 jest-util: 29.7.0 jest-worker: 29.7.0 @@ -8520,8 +8069,8 @@ snapshots: dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.3 - collect-v8-coverage: 1.0.1 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 '@jest/test-sequencer@29.7.0': dependencies: @@ -8532,7 +8081,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.26.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -8553,21 +8102,19 @@ snapshots: '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.3 - '@types/istanbul-reports': 3.0.1 - '@types/node': 20.16.10 - '@types/yargs': 17.0.29 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.17.9 + '@types/yargs': 17.0.33 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.7.2)(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1))': dependencies: - glob: 7.2.3 - glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.6.2) - vite: 5.4.8(@types/node@20.16.10)(terser@5.31.1) + react-docgen-typescript: 2.2.2(typescript@5.7.2) + vite: 5.4.8(@types/node@20.17.9)(terser@5.31.1) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 '@jridgewell/gen-mapping@0.3.5': dependencies: @@ -8575,7 +8122,7 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.1': {} + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -8589,24 +8136,24 @@ snapshots: '@jridgewell/trace-mapping@0.3.25': dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 '@js-sdsl/ordered-map@4.4.2': {} - '@lezer/common@1.2.1': {} + '@lezer/common@1.2.3': {} '@lezer/highlight@1.2.1': dependencies: - '@lezer/common': 1.2.1 + '@lezer/common': 1.2.3 '@lezer/lr@1.4.2': dependencies: - '@lezer/common': 1.2.1 + '@lezer/common': 1.2.3 '@malept/cross-spawn-promise@2.0.0': dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 '@malept/flatpak-bundler@0.4.0': dependencies: @@ -8617,7 +8164,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@mswjs/interceptors@0.35.9': + '@mswjs/interceptors@0.37.1': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -8626,39 +8173,39 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@nivo/annotations@0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@nivo/annotations@0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@nivo/colors': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nivo/core': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-spring/web': 9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/colors': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/core': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-spring/web': 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lodash: 4.17.21 react: 18.3.1 transitivePeerDependencies: - react-dom - '@nivo/axes@0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@nivo/axes@0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@nivo/core': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nivo/scales': 0.87.0 - '@react-spring/web': 9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@types/d3-format': 1.4.2 - '@types/d3-time-format': 2.3.1 + '@nivo/core': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/scales': 0.88.0 + '@react-spring/web': 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/d3-format': 1.4.5 + '@types/d3-time-format': 2.3.4 d3-format: 1.4.5 d3-time-format: 3.0.0 react: 18.3.1 transitivePeerDependencies: - react-dom - '@nivo/bar@0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@nivo/bar@0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@nivo/annotations': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nivo/axes': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nivo/colors': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nivo/core': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nivo/legends': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nivo/scales': 0.87.0 - '@nivo/tooltip': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-spring/web': 9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/annotations': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/axes': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/colors': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/core': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/legends': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/scales': 0.88.0 + '@nivo/tooltip': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-spring/web': 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/d3-scale': 4.0.8 '@types/d3-shape': 3.1.6 d3-scale: 4.0.2 @@ -8668,12 +8215,12 @@ snapshots: transitivePeerDependencies: - react-dom - '@nivo/colors@0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@nivo/colors@0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@nivo/core': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/core': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/d3-color': 3.1.3 '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 + '@types/d3-scale-chromatic': 3.1.0 '@types/prop-types': 15.7.13 d3-color: 3.1.0 d3-scale: 4.0.2 @@ -8684,10 +8231,10 @@ snapshots: transitivePeerDependencies: - react-dom - '@nivo/core@0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@nivo/core@0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@nivo/tooltip': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-spring/web': 9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/tooltip': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-spring/web': 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/d3-shape': 3.1.6 d3-color: 3.1.0 d3-format: 1.4.5 @@ -8702,30 +8249,30 @@ snapshots: transitivePeerDependencies: - react-dom - '@nivo/legends@0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@nivo/legends@0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@nivo/colors': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@nivo/core': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/colors': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/core': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/d3-scale': 4.0.8 d3-scale: 4.0.2 react: 18.3.1 transitivePeerDependencies: - react-dom - '@nivo/scales@0.87.0': + '@nivo/scales@0.88.0': dependencies: '@types/d3-scale': 4.0.8 - '@types/d3-time': 1.1.1 - '@types/d3-time-format': 3.0.1 + '@types/d3-time': 1.1.4 + '@types/d3-time-format': 3.0.4 d3-scale: 4.0.2 d3-time: 1.1.0 d3-time-format: 3.0.0 lodash: 4.17.21 - '@nivo/tooltip@0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@nivo/tooltip@0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@nivo/core': 0.87.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@react-spring/web': 9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@nivo/core': 0.88.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@react-spring/web': 9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 transitivePeerDependencies: - react-dom @@ -8763,83 +8310,82 @@ snapshots: '@open-draft/until@2.1.0': {} - '@opentelemetry/api-logs@0.53.0': + '@opentelemetry/api-logs@0.55.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/api@1.9.0': {} - '@opentelemetry/context-zone-peer-dep@1.26.0(@opentelemetry/api@1.9.0)(zone.js@0.14.7)': + '@opentelemetry/context-zone-peer-dep@1.28.0(@opentelemetry/api@1.9.0)(zone.js@0.14.7)': dependencies: '@opentelemetry/api': 1.9.0 zone.js: 0.14.7 - '@opentelemetry/context-zone@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/context-zone@1.28.0(@opentelemetry/api@1.9.0)': dependencies: - '@opentelemetry/context-zone-peer-dep': 1.26.0(@opentelemetry/api@1.9.0)(zone.js@0.14.7) + '@opentelemetry/context-zone-peer-dep': 1.28.0(@opentelemetry/api@1.9.0)(zone.js@0.14.7) zone.js: 0.14.7 transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/core@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/core@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/exporter-trace-otlp-http@0.53.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/exporter-trace-otlp-http@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-exporter-base': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-document-load@0.40.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-document-load@0.42.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-web': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.27.0 + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-web': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-fetch@0.53.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-fetch@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-web': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-web': 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-user-interaction@0.40.0(@opentelemetry/api@1.9.0)(zone.js@0.14.7)': + '@opentelemetry/instrumentation-user-interaction@0.42.0(@opentelemetry/api@1.9.0)(zone.js@0.14.7)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-web': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-web': 1.28.0(@opentelemetry/api@1.9.0) zone.js: 0.14.7 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation-xml-http-request@0.53.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation-xml-http-request@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-web': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-web': 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 transitivePeerDependencies: - supports-color - '@opentelemetry/instrumentation@0.53.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/instrumentation@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/api-logs': 0.55.0 '@types/shimmer': 1.2.0 import-in-the-middle: 1.8.1 require-in-the-middle: 7.3.0 @@ -8848,69 +8394,71 @@ snapshots: transitivePeerDependencies: - supports-color - '@opentelemetry/otlp-exporter-base@0.53.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-exporter-base@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.55.0(@opentelemetry/api@1.9.0) - '@opentelemetry/otlp-transformer@0.53.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/otlp-transformer@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.53.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-logs': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) - protobufjs: 7.3.2 + '@opentelemetry/api-logs': 0.55.0 + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.28.0(@opentelemetry/api@1.9.0) + protobufjs: 7.4.0 - '@opentelemetry/propagator-b3@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/propagator-b3@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/resources@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/sdk-logs@0.53.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-logs@0.55.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.53.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api-logs': 0.55.0 + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-metrics@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-metrics@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-base@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 - '@opentelemetry/sdk-trace-web@1.26.0(@opentelemetry/api@1.9.0)': + '@opentelemetry/sdk-trace-web@1.28.0(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 1.26.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 1.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.28.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.27.0 '@opentelemetry/semantic-conventions@1.27.0': {} + '@opentelemetry/semantic-conventions@1.28.0': {} + '@pkgjs/parseargs@0.11.0': optional: true - '@protobuf-ts/grpc-transport@2.9.4(@grpc/grpc-js@1.11.3)': + '@protobuf-ts/grpc-transport@2.9.4(@grpc/grpc-js@1.12.2)': dependencies: - '@grpc/grpc-js': 1.11.3 + '@grpc/grpc-js': 1.12.2 '@protobuf-ts/runtime': 2.9.4 '@protobuf-ts/runtime-rpc': 2.9.4 @@ -8949,40 +8497,43 @@ snapshots: '@react-dnd/shallowequal@2.0.0': {} - '@react-spring/animated@9.7.3(react@18.3.1)': + '@react-spring/animated@9.7.5(react@18.3.1)': dependencies: - '@react-spring/shared': 9.7.3(react@18.3.1) - '@react-spring/types': 9.7.3 + '@react-spring/shared': 9.7.5(react@18.3.1) + '@react-spring/types': 9.7.5 react: 18.3.1 - '@react-spring/core@9.7.3(react@18.3.1)': + '@react-spring/core@9.7.5(react@18.3.1)': dependencies: - '@react-spring/animated': 9.7.3(react@18.3.1) - '@react-spring/shared': 9.7.3(react@18.3.1) - '@react-spring/types': 9.7.3 + '@react-spring/animated': 9.7.5(react@18.3.1) + '@react-spring/shared': 9.7.5(react@18.3.1) + '@react-spring/types': 9.7.5 react: 18.3.1 - '@react-spring/shared@9.7.3(react@18.3.1)': + '@react-spring/rafz@9.7.5': {} + + '@react-spring/shared@9.7.5(react@18.3.1)': dependencies: - '@react-spring/types': 9.7.3 + '@react-spring/rafz': 9.7.5 + '@react-spring/types': 9.7.5 react: 18.3.1 - '@react-spring/types@9.7.3': {} + '@react-spring/types@9.7.5': {} - '@react-spring/web@9.7.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@react-spring/web@9.7.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@react-spring/animated': 9.7.3(react@18.3.1) - '@react-spring/core': 9.7.3(react@18.3.1) - '@react-spring/shared': 9.7.3(react@18.3.1) - '@react-spring/types': 9.7.3 + '@react-spring/animated': 9.7.5(react@18.3.1) + '@react-spring/core': 9.7.5(react@18.3.1) + '@react-spring/shared': 9.7.5(react@18.3.1) + '@react-spring/types': 9.7.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@rollup/pluginutils@5.1.2(rollup@4.23.0)': + '@rollup/pluginutils@5.1.3(rollup@4.23.0)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.2 optionalDependencies: rollup: 4.23.0 @@ -9056,194 +8607,152 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.0 - '@storybook/addon-actions@8.3.4(storybook@8.3.4)': + '@storybook/addon-actions@8.4.6(storybook@8.4.6(prettier@3.4.1))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) uuid: 9.0.1 - '@storybook/addon-controls@8.3.4(storybook@8.3.4)': + '@storybook/addon-controls@8.4.6(storybook@8.4.6(prettier@3.4.1))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - lodash: 4.17.21 - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) ts-dedent: 2.2.0 - '@storybook/addon-toolbars@8.3.4(storybook@8.3.4)': + '@storybook/addon-toolbars@8.4.6(storybook@8.4.6(prettier@3.4.1))': dependencies: - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) - '@storybook/builder-vite@8.3.4(storybook@8.3.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3)': + '@storybook/builder-vite@8.4.6(storybook@8.4.6(prettier@3.4.1))(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1))': dependencies: - '@storybook/csf-plugin': 8.3.4(storybook@8.3.4)(webpack-sources@3.2.3) - '@types/find-cache-dir': 3.2.1 + '@storybook/csf-plugin': 8.4.6(storybook@8.4.6(prettier@3.4.1)) browser-assert: 1.2.1 - es-module-lexer: 1.5.4 - express: 4.21.1 - find-cache-dir: 3.3.2 - fs-extra: 11.2.0 - magic-string: 0.30.11 - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) ts-dedent: 2.2.0 - vite: 5.4.8(@types/node@20.16.10)(terser@5.31.1) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - webpack-sources - - '@storybook/components@8.3.4(storybook@8.3.4)': - dependencies: - storybook: 8.3.4 + vite: 5.4.8(@types/node@20.17.9)(terser@5.31.1) - '@storybook/core-common@8.2.9(storybook@8.3.4)': + '@storybook/components@8.4.6(storybook@8.4.6(prettier@3.4.1))': dependencies: - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) - '@storybook/core@8.3.4': + '@storybook/core@8.4.6(prettier@3.4.1)': dependencies: - '@storybook/csf': 0.1.11 - '@types/express': 4.17.21 + '@storybook/csf': 0.1.12 better-opn: 3.0.2 browser-assert: 1.2.1 - esbuild: 0.23.1 - esbuild-register: 3.6.0(esbuild@0.23.1) - express: 4.21.1 + esbuild: 0.24.0 + esbuild-register: 3.6.0(esbuild@0.24.0) jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.9 semver: 7.6.3 util: 0.12.5 ws: 8.18.0 + optionalDependencies: + prettier: 3.4.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@storybook/csf-plugin@8.3.4(storybook@8.3.4)(webpack-sources@3.2.3)': - dependencies: - storybook: 8.3.4 - unplugin: 1.14.1(webpack-sources@3.2.3) - transitivePeerDependencies: - - webpack-sources - - '@storybook/csf-tools@8.2.9(storybook@8.3.4)': + '@storybook/csf-plugin@8.4.6(storybook@8.4.6(prettier@3.4.1))': dependencies: - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) + unplugin: 1.16.0 - '@storybook/csf@0.1.11': + '@storybook/csf@0.1.12': dependencies: type-fest: 2.19.0 '@storybook/global@5.0.0': {} - '@storybook/manager-api@8.3.4(storybook@8.3.4)': + '@storybook/manager-api@8.4.6(storybook@8.4.6(prettier@3.4.1))': dependencies: - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) - '@storybook/preview-api@8.3.4(storybook@8.3.4)': + '@storybook/preview-api@8.4.6(storybook@8.4.6(prettier@3.4.1))': dependencies: - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) - '@storybook/react-dom-shim@8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)': + '@storybook/react-dom-shim@8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@3.4.1))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) - '@storybook/react-vite@8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.3.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3)': + '@storybook/react-vite@8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.23.0)(storybook@8.4.6(prettier@3.4.1))(typescript@5.7.2)(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1)) - '@rollup/pluginutils': 5.1.2(rollup@4.23.0) - '@storybook/builder-vite': 8.3.4(storybook@8.3.4)(typescript@5.6.2)(vite@5.4.8(@types/node@20.16.10)(terser@5.31.1))(webpack-sources@3.2.3) - '@storybook/react': 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)(typescript@5.6.2) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.7.2)(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)) + '@rollup/pluginutils': 5.1.3(rollup@4.23.0) + '@storybook/builder-vite': 8.4.6(storybook@8.4.6(prettier@3.4.1))(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)) + '@storybook/react': 8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@3.4.1))(typescript@5.7.2) find-up: 5.0.0 - magic-string: 0.30.11 + magic-string: 0.30.14 react: 18.3.1 - react-docgen: 7.0.3 + react-docgen: 7.1.0 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.8 - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) tsconfig-paths: 4.2.0 - vite: 5.4.8(@types/node@20.16.10)(terser@5.31.1) + vite: 5.4.8(@types/node@20.17.9)(terser@5.31.1) transitivePeerDependencies: - - '@preact/preset-vite' - '@storybook/test' - rollup - supports-color - typescript - - vite-plugin-glimmerx - - webpack-sources - '@storybook/react@8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4)(typescript@5.6.2)': + '@storybook/react@8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@3.4.1))(typescript@5.7.2)': dependencies: - '@storybook/components': 8.3.4(storybook@8.3.4) + '@storybook/components': 8.4.6(storybook@8.4.6(prettier@3.4.1)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.3.4(storybook@8.3.4) - '@storybook/preview-api': 8.3.4(storybook@8.3.4) - '@storybook/react-dom-shim': 8.3.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.3.4) - '@storybook/theming': 8.3.4(storybook@8.3.4) - '@types/escodegen': 0.0.6 - '@types/estree': 0.0.51 - '@types/node': 22.7.4 - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - acorn-walk: 7.2.0 - escodegen: 2.1.0 - html-tags: 3.3.1 - prop-types: 15.8.1 + '@storybook/manager-api': 8.4.6(storybook@8.4.6(prettier@3.4.1)) + '@storybook/preview-api': 8.4.6(storybook@8.4.6(prettier@3.4.1)) + '@storybook/react-dom-shim': 8.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.4.6(prettier@3.4.1)) + '@storybook/theming': 8.4.6(storybook@8.4.6(prettier@3.4.1)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-element-to-jsx-string: 15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - semver: 7.6.3 - storybook: 8.3.4 - ts-dedent: 2.2.0 - type-fest: 2.19.0 - util-deprecate: 1.0.2 + storybook: 8.4.6(prettier@3.4.1) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 - '@storybook/test-runner@0.19.1(@types/node@20.16.10)(babel-plugin-macros@3.1.0)(storybook@8.3.4)': + '@storybook/test-runner@0.20.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0)(storybook@8.4.6(prettier@3.4.1))': dependencies: - '@babel/core': 7.25.2 - '@babel/generator': 7.25.5 - '@babel/template': 7.25.0 - '@babel/types': 7.25.4 + '@babel/core': 7.26.0 + '@babel/generator': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 '@jest/types': 29.6.3 - '@storybook/core-common': 8.2.9(storybook@8.3.4) - '@storybook/csf': 0.1.11 - '@storybook/csf-tools': 8.2.9(storybook@8.3.4) - '@storybook/preview-api': 8.3.4(storybook@8.3.4) - '@swc/core': 1.7.26 - '@swc/jest': 0.2.36(@swc/core@1.7.26) + '@storybook/csf': 0.1.12 + '@swc/core': 1.9.3 + '@swc/jest': 0.2.37(@swc/core@1.9.3) expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0) + jest: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-junit: 16.0.0 - jest-playwright-preset: 4.0.0(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)) + jest-playwright-preset: 4.0.0(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0)) jest-runner: 29.7.0 jest-serializer-html: 7.1.0 - jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)) + jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0)) nyc: 15.1.0 - playwright: 1.47.2 + playwright: 1.49.0 + storybook: 8.4.6(prettier@3.4.1) transitivePeerDependencies: - '@swc/helpers' - '@types/node' - babel-plugin-macros - debug - node-notifier - - storybook - supports-color - ts-node - '@storybook/theming@8.3.4(storybook@8.3.4)': + '@storybook/theming@8.4.6(storybook@8.4.6(prettier@3.4.1))': dependencies: - storybook: 8.3.4 + storybook: 8.4.6(prettier@3.4.1) '@styled-system/background@5.1.2': dependencies: @@ -9296,58 +8805,58 @@ snapshots: '@styled-system/core': 5.1.2 '@styled-system/css': 5.1.5 - '@swc/core-darwin-arm64@1.7.26': + '@swc/core-darwin-arm64@1.9.3': optional: true - '@swc/core-darwin-x64@1.7.26': + '@swc/core-darwin-x64@1.9.3': optional: true - '@swc/core-linux-arm-gnueabihf@1.7.26': + '@swc/core-linux-arm-gnueabihf@1.9.3': optional: true - '@swc/core-linux-arm64-gnu@1.7.26': + '@swc/core-linux-arm64-gnu@1.9.3': optional: true - '@swc/core-linux-arm64-musl@1.7.26': + '@swc/core-linux-arm64-musl@1.9.3': optional: true - '@swc/core-linux-x64-gnu@1.7.26': + '@swc/core-linux-x64-gnu@1.9.3': optional: true - '@swc/core-linux-x64-musl@1.7.26': + '@swc/core-linux-x64-musl@1.9.3': optional: true - '@swc/core-win32-arm64-msvc@1.7.26': + '@swc/core-win32-arm64-msvc@1.9.3': optional: true - '@swc/core-win32-ia32-msvc@1.7.26': + '@swc/core-win32-ia32-msvc@1.9.3': optional: true - '@swc/core-win32-x64-msvc@1.7.26': + '@swc/core-win32-x64-msvc@1.9.3': optional: true - '@swc/core@1.7.26': + '@swc/core@1.9.3': dependencies: '@swc/counter': 0.1.3 - '@swc/types': 0.1.12 + '@swc/types': 0.1.17 optionalDependencies: - '@swc/core-darwin-arm64': 1.7.26 - '@swc/core-darwin-x64': 1.7.26 - '@swc/core-linux-arm-gnueabihf': 1.7.26 - '@swc/core-linux-arm64-gnu': 1.7.26 - '@swc/core-linux-arm64-musl': 1.7.26 - '@swc/core-linux-x64-gnu': 1.7.26 - '@swc/core-linux-x64-musl': 1.7.26 - '@swc/core-win32-arm64-msvc': 1.7.26 - '@swc/core-win32-ia32-msvc': 1.7.26 - '@swc/core-win32-x64-msvc': 1.7.26 + '@swc/core-darwin-arm64': 1.9.3 + '@swc/core-darwin-x64': 1.9.3 + '@swc/core-linux-arm-gnueabihf': 1.9.3 + '@swc/core-linux-arm64-gnu': 1.9.3 + '@swc/core-linux-arm64-musl': 1.9.3 + '@swc/core-linux-x64-gnu': 1.9.3 + '@swc/core-linux-x64-musl': 1.9.3 + '@swc/core-win32-arm64-msvc': 1.9.3 + '@swc/core-win32-ia32-msvc': 1.9.3 + '@swc/core-win32-x64-msvc': 1.9.3 '@swc/counter@0.1.3': {} - '@swc/jest@0.2.36(@swc/core@1.7.26)': + '@swc/jest@0.2.37(@swc/core@1.9.3)': dependencies: '@jest/create-cache-key-function': 29.7.0 - '@swc/core': 1.7.26 + '@swc/core': 1.9.3 '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 @@ -9355,7 +8864,7 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@swc/types@0.1.12': + '@swc/types@0.1.17': dependencies: '@swc/counter': 0.1.3 @@ -9365,8 +8874,8 @@ snapshots: '@testing-library/dom@10.1.0': dependencies: - '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.25.6 + '@babel/code-frame': 7.26.2 + '@babel/runtime': 7.26.0 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -9374,25 +8883,25 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/jest-dom@6.5.0': + '@testing-library/jest-dom@6.6.3': dependencies: - '@adobe/css-tools': 4.4.0 - aria-query: 5.3.0 + '@adobe/css-tools': 4.4.1 + aria-query: 5.3.2 chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 lodash: 4.17.21 redent: 3.0.0 - '@testing-library/react@16.0.1(@testing-library/dom@10.1.0)(@types/react-dom@18.3.0)(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@testing-library/react@16.0.1(@testing-library/dom@10.1.0)(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.26.0 '@testing-library/dom': 10.1.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.10 - '@types/react-dom': 18.3.0 + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 '@testing-library/user-event@14.5.2(@testing-library/dom@10.1.0)': dependencies: @@ -9404,66 +8913,57 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.4 - '@babel/types': 7.25.4 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 '@types/babel__generator': 7.6.3 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.3': dependencies: - '@babel/types': 7.25.4 + '@babel/types': 7.26.0 '@types/babel__template@7.4.1': dependencies: - '@babel/parser': 7.25.4 - '@babel/types': 7.25.4 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.25.6 - - '@types/body-parser@1.19.5': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 20.16.10 + '@babel/types': 7.26.0 '@types/cacheable-request@6.0.2': dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 4.2.0 - '@types/node': 20.16.10 + '@types/node': 20.17.9 '@types/responselike': 1.0.0 - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.16.10 - '@types/cookie@0.6.0': {} '@types/d3-color@3.1.3': {} - '@types/d3-format@1.4.2': {} + '@types/d3-format@1.4.5': {} - '@types/d3-path@3.0.1': {} + '@types/d3-path@3.1.0': {} - '@types/d3-scale-chromatic@3.0.3': {} + '@types/d3-scale-chromatic@3.1.0': {} '@types/d3-scale@4.0.8': dependencies: - '@types/d3-time': 3.0.2 + '@types/d3-time': 3.0.4 '@types/d3-shape@3.1.6': dependencies: - '@types/d3-path': 3.0.1 + '@types/d3-path': 3.1.0 - '@types/d3-time-format@2.3.1': {} + '@types/d3-time-format@2.3.4': {} - '@types/d3-time-format@3.0.1': {} + '@types/d3-time-format@3.0.4': {} - '@types/d3-time@1.1.1': {} + '@types/d3-time@1.1.4': {} - '@types/d3-time@3.0.2': {} + '@types/d3-time@3.0.4': {} '@types/debug@4.1.12': dependencies: @@ -9471,71 +8971,44 @@ snapshots: '@types/doctrine@0.0.9': {} - '@types/escodegen@0.0.6': {} - - '@types/estree@0.0.51': {} - '@types/estree@1.0.6': {} - '@types/express-serve-static-core@4.19.6': - dependencies: - '@types/node': 20.16.10 - '@types/qs': 6.9.16 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.16 - '@types/serve-static': 1.15.7 - - '@types/find-cache-dir@3.2.1': {} - '@types/fs-extra@9.0.13': dependencies: - '@types/node': 20.16.10 - - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 20.16.10 + '@types/node': 20.17.9 - '@types/graceful-fs@4.1.8': + '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.9 '@types/history@4.7.11': {} '@types/http-cache-semantics@4.0.1': {} - '@types/http-errors@2.0.4': {} + '@types/istanbul-lib-coverage@2.0.6': {} - '@types/istanbul-lib-coverage@2.0.3': {} - - '@types/istanbul-lib-report@3.0.0': + '@types/istanbul-lib-report@3.0.3': dependencies: - '@types/istanbul-lib-coverage': 2.0.3 + '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports@3.0.1': + '@types/istanbul-reports@3.0.4': dependencies: - '@types/istanbul-lib-report': 3.0.0 + '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.13': + '@types/jest@29.5.14': dependencies: expect: 29.7.0 pretty-format: 29.7.0 '@types/jsdom@20.0.1': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.9 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 '@types/jsdom@21.1.7': dependencies: - '@types/node': 22.7.4 + '@types/node': 20.17.9 '@types/tough-cookie': 4.0.5 parse5: 7.1.2 @@ -9547,25 +9020,13 @@ snapshots: dependencies: keyv: 4.5.0 - '@types/mime@1.3.5': {} - - '@types/minimatch@5.1.2': {} - '@types/ms@0.7.34': {} - '@types/mute-stream@0.0.4': - dependencies: - '@types/node': 20.16.10 - '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.7.4 + '@types/node': 20.17.9 - '@types/node@20.16.10': - dependencies: - undici-types: 6.19.8 - - '@types/node@22.7.4': + '@types/node@20.17.9': dependencies: undici-types: 6.19.8 @@ -9573,40 +9034,36 @@ snapshots: '@types/plist@3.0.2': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.9 xmlbuilder: 15.1.1 optional: true '@types/prop-types@15.7.13': {} - '@types/qs@6.9.16': {} - - '@types/range-parser@1.2.7': {} - - '@types/react-dom@18.3.0': + '@types/react-dom@18.3.1': dependencies: - '@types/react': 18.3.10 + '@types/react': 18.3.12 '@types/react-highlight@0.12.8': dependencies: - '@types/react': 18.3.10 + '@types/react': 18.3.12 '@types/react-router-dom@5.3.3': dependencies: '@types/history': 4.7.11 - '@types/react': 18.3.10 + '@types/react': 18.3.12 '@types/react-router': 5.1.20 '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 - '@types/react': 18.3.10 + '@types/react': 18.3.12 '@types/react-transition-group@4.4.11': dependencies: - '@types/react': 18.3.10 + '@types/react': 18.3.12 - '@types/react@18.3.10': + '@types/react@18.3.12': dependencies: '@types/prop-types': 15.7.13 csstype: 3.1.3 @@ -9615,28 +9072,17 @@ snapshots: '@types/responselike@1.0.0': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.9 '@types/semver@7.5.8': {} - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 20.16.10 - - '@types/serve-static@1.15.7': - dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 20.16.10 - '@types/send': 0.17.4 - '@types/shimmer@1.2.0': {} '@types/stack-utils@2.0.3': {} '@types/statuses@2.0.5': {} - '@types/styled-system@5.1.22': + '@types/styled-system@5.1.23': dependencies: csstype: 3.1.3 @@ -9644,12 +9090,12 @@ snapshots: '@types/tar-fs@2.0.4': dependencies: - '@types/node': 22.7.4 + '@types/node': 20.17.9 '@types/tar-stream': 2.2.2 '@types/tar-stream@2.2.2': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.9 '@types/tough-cookie@4.0.5': {} @@ -9662,7 +9108,7 @@ snapshots: '@types/wait-on@5.3.4': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.9 '@types/webidl-conversions@7.0.1': {} @@ -9674,47 +9120,45 @@ snapshots: '@types/wicg-file-system-access@2023.10.5': {} - '@types/wrap-ansi@3.0.0': {} - - '@types/yargs-parser@20.2.1': {} + '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.29': + '@types/yargs@17.0.33': dependencies: - '@types/yargs-parser': 20.2.1 + '@types/yargs-parser': 21.0.3 '@types/yauzl@2.10.0': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.9 optional: true - '@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 8.12.2(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 8.12.2 - '@typescript-eslint/type-utils': 8.12.2(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/utils': 8.12.2(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.12.2 + '@typescript-eslint/parser': 8.16.0(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/type-utils': 8.16.0(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.16.0(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.16.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.7.2) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2)': + '@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2)': dependencies: - '@typescript-eslint/scope-manager': 8.12.2 - '@typescript-eslint/types': 8.12.2 - '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.12.2 + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.7 eslint: 8.57.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color @@ -9723,35 +9167,28 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@7.14.1': + '@typescript-eslint/scope-manager@8.16.0': dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 - '@typescript-eslint/scope-manager@8.12.2': + '@typescript-eslint/type-utils@8.16.0(eslint@8.57.0)(typescript@5.7.2)': dependencies: - '@typescript-eslint/types': 8.12.2 - '@typescript-eslint/visitor-keys': 8.12.2 - - '@typescript-eslint/type-utils@8.12.2(eslint@8.57.0)(typescript@5.6.2)': - dependencies: - '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.2) - '@typescript-eslint/utils': 8.12.2(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) + '@typescript-eslint/utils': 8.16.0(eslint@8.57.0)(typescript@5.7.2) debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.6.2) + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.7.2) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - - eslint - supports-color '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@7.14.1': {} - - '@typescript-eslint/types@8.12.2': {} + '@typescript-eslint/types@8.16.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -9759,50 +9196,35 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 - tsutils: 3.21.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.6.2)': - dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 - debug: 4.3.7 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) + tsutils: 3.21.0(typescript@5.7.2) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.12.2(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.16.0(typescript@5.7.2)': dependencies: - '@typescript-eslint/types': 8.12.2 - '@typescript-eslint/visitor-keys': 8.12.2 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/visitor-keys': 8.16.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.7.2) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.6.2)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.13 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.7.2) eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.6.3 @@ -9810,68 +9232,53 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@7.14.1(eslint@8.57.0)(typescript@5.6.2)': + '@typescript-eslint/utils@8.16.0(eslint@8.57.0)(typescript@5.7.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.14.1 - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.6.2) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.12.2(eslint@8.57.0)(typescript@5.6.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 8.12.2 - '@typescript-eslint/types': 8.12.2 - '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.16.0 + '@typescript-eslint/types': 8.16.0 + '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.7.2) eslint: 8.57.0 + optionalDependencies: + typescript: 5.7.2 transitivePeerDependencies: - supports-color - - typescript '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.14.1': + '@typescript-eslint/visitor-keys@8.16.0': dependencies: - '@typescript-eslint/types': 7.14.1 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.16.0 + eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.12.2': + '@uiw/codemirror-extensions-basic-setup@4.23.6(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3))(@codemirror/commands@6.7.1)(@codemirror/language@6.10.6)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.3)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)': dependencies: - '@typescript-eslint/types': 8.12.2 - eslint-visitor-keys: 3.4.3 - - '@uiw/codemirror-extensions-basic-setup@4.23.3(@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1))(@codemirror/commands@6.6.2)(@codemirror/language@6.10.2)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)': - dependencies: - '@codemirror/autocomplete': 6.18.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1) - '@codemirror/commands': 6.6.2 - '@codemirror/language': 6.10.2 + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/language': 6.10.6 '@codemirror/lint': 6.4.2 '@codemirror/search': 6.5.3 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 + '@codemirror/view': 6.35.0 - '@uiw/codemirror-themes@4.23.3(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)': + '@uiw/codemirror-themes@4.23.6(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)': dependencies: - '@codemirror/language': 6.10.2 + '@codemirror/language': 6.10.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 + '@codemirror/view': 6.35.0 - '@uiw/react-codemirror@4.23.3(@babel/runtime@7.25.6)(@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1))(@codemirror/language@6.10.2)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.3)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.34.1)(codemirror@6.0.1(@lezer/common@1.2.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@uiw/react-codemirror@4.23.6(@babel/runtime@7.26.0)(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3))(@codemirror/language@6.10.6)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.3)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.35.0)(codemirror@6.0.1(@lezer/common@1.2.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@babel/runtime': 7.25.6 - '@codemirror/commands': 6.6.2 + '@babel/runtime': 7.26.0 + '@codemirror/commands': 6.7.1 '@codemirror/state': 6.4.1 '@codemirror/theme-one-dark': 6.1.2 - '@codemirror/view': 6.34.1 - '@uiw/codemirror-extensions-basic-setup': 4.23.3(@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1))(@codemirror/commands@6.6.2)(@codemirror/language@6.10.2)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1) - codemirror: 6.0.1(@lezer/common@1.2.1) + '@codemirror/view': 6.35.0 + '@uiw/codemirror-extensions-basic-setup': 4.23.6(@codemirror/autocomplete@6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3))(@codemirror/commands@6.7.1)(@codemirror/language@6.10.6)(@codemirror/lint@6.4.2)(@codemirror/search@6.5.3)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0) + codemirror: 6.0.1(@lezer/common@1.2.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -9882,10 +9289,10 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react-swc@3.7.1(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1))': + '@vitejs/plugin-react-swc@3.7.2(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1))': dependencies: - '@swc/core': 1.7.26 - vite: 5.4.8(@types/node@22.7.4)(terser@5.31.1) + '@swc/core': 1.9.3 + vite: 5.4.8(@types/node@20.17.9)(terser@5.31.1) transitivePeerDependencies: - '@swc/helpers' @@ -9921,39 +9328,26 @@ snapshots: abbrev@1.1.1: {} - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - ace-builds@1.36.2: {} + ace-builds@1.36.5: {} acorn-globals@7.0.1: dependencies: - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk: 8.3.4 - acorn-import-attributes@1.9.5(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - - acorn-jsx@5.3.2(acorn@7.4.1): + acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: - acorn: 7.4.1 + acorn: 8.14.0 - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.1 - - acorn-walk@7.2.0: {} + acorn: 8.14.0 acorn-walk@8.3.4: dependencies: - acorn: 8.12.1 - - acorn@7.4.1: {} + acorn: 8.14.0 - acorn@8.12.1: {} + acorn@8.14.0: {} agent-base@6.0.2: dependencies: @@ -10038,7 +9432,7 @@ snapshots: ejs: 3.1.10 electron-builder-squirrel-windows: 25.1.7(dmg-builder@25.1.7) electron-publish: 25.1.7 - form-data: 4.0.0 + form-data: 4.0.1 fs-extra: 10.1.0 hosted-git-info: 4.1.0 is-ci: 3.0.1 @@ -10115,13 +9509,13 @@ snapshots: dependencies: dequal: 2.0.3 + aria-query@5.3.2: {} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 is-array-buffer: 3.0.4 - array-flatten@1.1.1: {} - array-includes@3.1.8: dependencies: call-bind: 1.0.7 @@ -10189,7 +9583,7 @@ snapshots: ast-types@0.16.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 astral-regex@2.0.0: optional: true @@ -10206,23 +9600,23 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - axios@1.7.5: + axios@1.7.8: dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 + follow-redirects: 1.15.9 + form-data: 4.0.1 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug b4a@1.6.4: {} - babel-jest@29.7.0(@babel/core@7.25.2): + babel-jest@29.7.0(@babel/core@7.26.0): dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.26.0 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.25.2) + babel-preset-jest: 29.6.3(@babel/core@7.26.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -10231,56 +9625,56 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.25.9 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.1.0 + istanbul-lib-instrument: 5.2.1 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.6 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.26.0 cosmiconfig: 7.1.0 resolve: 1.22.8 - babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.26.0): dependencies: - '@babel/compat-data': 7.25.4 - '@babel/core': 7.25.2 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): dependencies: - '@babel/core': 7.25.2 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) core-js-compat: 3.38.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.26.0): dependencies: - '@babel/core': 7.25.2 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - babel-plugin-styled-components@2.1.4(@babel/core@7.25.2)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + babel-plugin-styled-components@2.1.4(@babel/core@7.26.0)(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-module-imports': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) lodash: 4.17.21 picomatch: 2.3.1 styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10288,38 +9682,41 @@ snapshots: - '@babel/core' - supports-color - babel-plugin-transform-import-meta@2.2.1(@babel/core@7.25.2): + babel-plugin-transform-import-meta@2.2.1(@babel/core@7.26.0): dependencies: - '@babel/core': 7.25.2 - '@babel/template': 7.25.0 - tslib: 2.7.0 + '@babel/core': 7.26.0 + '@babel/template': 7.25.9 + tslib: 2.8.1 babel-plugin-transform-vite-meta-env@1.0.3: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.0 '@types/babel__core': 7.20.5 - babel-preset-current-node-syntax@1.0.1(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) - - babel-preset-jest@29.6.3(@babel/core@7.25.2): - dependencies: - '@babel/core': 7.25.2 + babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) + + babel-preset-jest@29.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) balanced-match@1.0.2: {} @@ -10366,23 +9763,6 @@ snapshots: bluebird@3.7.2: {} - body-parser@1.20.3: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - boolean@3.1.4: optional: true @@ -10401,12 +9781,12 @@ snapshots: browser-assert@1.2.1: {} - browserslist@4.23.3: + browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001651 - electron-to-chromium: 1.5.13 + caniuse-lite: 1.0.30001684 + electron-to-chromium: 1.5.67 node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) + update-browserslist-db: 1.1.1(browserslist@4.24.2) bser@2.1.1: dependencies: @@ -10436,7 +9816,7 @@ snapshots: bluebird-lst: 1.0.9 builder-util-runtime: 9.2.10 chalk: 4.1.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 debug: 4.3.7 fs-extra: 10.1.0 http-proxy-agent: 7.0.2 @@ -10449,8 +9829,6 @@ snapshots: transitivePeerDependencies: - supports-color - bytes@3.1.2: {} - cac@6.7.14: {} cacache@16.1.3: @@ -10511,7 +9889,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001651: {} + caniuse-lite@1.0.30001684: {} chalk@2.4.2: dependencies: @@ -10533,7 +9911,7 @@ snapshots: char-regex@1.0.2: {} - char-regex@2.0.1: {} + char-regex@2.0.2: {} chownr@2.0.0: {} @@ -10541,7 +9919,7 @@ snapshots: ci-info@3.3.0: {} - cjs-module-lexer@1.3.1: {} + cjs-module-lexer@1.4.1: {} clean-stack@2.2.0: {} @@ -10579,19 +9957,19 @@ snapshots: co@4.6.0: {} - codemirror@6.0.1(@lezer/common@1.2.1): + codemirror@6.0.1(@lezer/common@1.2.3): dependencies: - '@codemirror/autocomplete': 6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.1) - '@codemirror/commands': 6.6.2 - '@codemirror/language': 6.10.3 + '@codemirror/autocomplete': 6.18.3(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0)(@lezer/common@1.2.3) + '@codemirror/commands': 6.7.1 + '@codemirror/language': 6.10.6 '@codemirror/lint': 6.4.2 '@codemirror/search': 6.5.3 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.34.1 + '@codemirror/view': 6.35.0 transitivePeerDependencies: - '@lezer/common' - collect-v8-coverage@1.0.1: {} + collect-v8-coverage@1.0.2: {} color-convert@1.9.3: dependencies: @@ -10649,27 +10027,19 @@ snapshots: config-file-ts@0.2.8-rc1: dependencies: glob: 10.4.5 - typescript: 5.6.2 + typescript: 5.7.2 console-control-strings@1.1.0: {} - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} - cookie-signature@1.0.6: {} - - cookie@0.7.1: {} + cookie@0.7.2: {} core-js-compat@3.38.1: dependencies: - browserslist: 4.23.3 + browserslist: 4.24.2 core-util-is@1.0.2: optional: true @@ -10696,28 +10066,13 @@ snapshots: buffer: 5.7.1 optional: true - create-jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - create-jest@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0): + create-jest@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -10725,7 +10080,6 @@ snapshots: - babel-plugin-macros - supports-color - ts-node - optional: true create-react-class@15.7.0: dependencies: @@ -10734,7 +10088,7 @@ snapshots: crelt@1.0.6: {} - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -10859,18 +10213,10 @@ snapshots: date-fns@2.28.0: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@3.2.7: dependencies: ms: 2.1.3 - debug@4.3.6: - dependencies: - ms: 2.1.2 - debug@4.3.7: dependencies: ms: 2.1.3 @@ -10883,7 +10229,7 @@ snapshots: dependencies: mimic-response: 3.1.0 - dedent@1.5.1(babel-plugin-macros@3.1.0): + dedent@1.5.3(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -10905,7 +10251,7 @@ snapshots: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.1.0 define-lazy-prop@2.0.0: {} @@ -10919,12 +10265,8 @@ snapshots: delegates@1.0.0: {} - depd@2.0.0: {} - dequal@2.0.3: {} - destroy@1.2.0: {} - detect-libc@2.0.3: {} detect-newline@3.1.0: {} @@ -10994,7 +10336,7 @@ snapshots: dom-helpers@5.2.1: dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.26.0 csstype: 3.1.3 dom-serializer@0.2.2: @@ -11027,8 +10369,6 @@ snapshots: eastasianwidth@0.2.0: {} - ee-first@1.1.1: {} - ejs@3.1.10: dependencies: jake: 10.8.5 @@ -11073,26 +10413,26 @@ snapshots: transitivePeerDependencies: - supports-color - electron-to-chromium@1.5.13: {} + electron-to-chromium@1.5.67: {} - electron-vite@2.3.0(@swc/core@1.7.26)(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)): + electron-vite@2.3.0(@swc/core@1.9.3)(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)): dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/core': 7.26.0 + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) cac: 6.7.14 esbuild: 0.21.5 - magic-string: 0.30.11 - picocolors: 1.0.1 - vite: 5.4.8(@types/node@22.7.4)(terser@5.31.1) + magic-string: 0.30.14 + picocolors: 1.1.1 + vite: 5.4.8(@types/node@20.17.9)(terser@5.31.1) optionalDependencies: - '@swc/core': 1.7.26 + '@swc/core': 1.9.3 transitivePeerDependencies: - supports-color electron@33.1.0: dependencies: '@electron/get': 2.0.2 - '@types/node': 20.16.10 + '@types/node': 20.17.9 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -11105,10 +10445,6 @@ snapshots: enabled@2.0.0: {} - encodeurl@1.0.2: {} - - encodeurl@2.0.0: {} - encoding@0.1.13: dependencies: iconv-lite: 0.6.3 @@ -11154,8 +10490,8 @@ snapshots: function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.3 - gopd: 1.0.1 + globalthis: 1.0.4 + gopd: 1.1.0 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 @@ -11184,7 +10520,7 @@ snapshots: typed-array-byte-offset: 1.0.2 typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.16 es-define-property@1.0.0: dependencies: @@ -11192,7 +10528,7 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.0.19: + es-iterator-helpers@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 @@ -11201,16 +10537,15 @@ snapshots: es-set-tostringtag: 2.0.3 function-bind: 1.1.2 get-intrinsic: 1.2.4 - globalthis: 1.0.3 + globalthis: 1.0.4 + gopd: 1.1.0 has-property-descriptors: 1.0.2 has-proto: 1.0.3 has-symbols: 1.0.3 internal-slot: 1.0.7 - iterator.prototype: 1.1.2 + iterator.prototype: 1.1.3 safe-array-concat: 1.1.2 - es-module-lexer@1.5.4: {} - es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -11233,10 +10568,10 @@ snapshots: es6-error@4.1.1: {} - esbuild-register@3.6.0(esbuild@0.23.1): + esbuild-register@3.6.0(esbuild@0.24.0): dependencies: debug: 4.3.7 - esbuild: 0.23.1 + esbuild: 0.24.0 transitivePeerDependencies: - supports-color @@ -11266,37 +10601,35 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.23.1: + esbuild@0.24.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.23.1 - '@esbuild/android-arm': 0.23.1 - '@esbuild/android-arm64': 0.23.1 - '@esbuild/android-x64': 0.23.1 - '@esbuild/darwin-arm64': 0.23.1 - '@esbuild/darwin-x64': 0.23.1 - '@esbuild/freebsd-arm64': 0.23.1 - '@esbuild/freebsd-x64': 0.23.1 - '@esbuild/linux-arm': 0.23.1 - '@esbuild/linux-arm64': 0.23.1 - '@esbuild/linux-ia32': 0.23.1 - '@esbuild/linux-loong64': 0.23.1 - '@esbuild/linux-mips64el': 0.23.1 - '@esbuild/linux-ppc64': 0.23.1 - '@esbuild/linux-riscv64': 0.23.1 - '@esbuild/linux-s390x': 0.23.1 - '@esbuild/linux-x64': 0.23.1 - '@esbuild/netbsd-x64': 0.23.1 - '@esbuild/openbsd-arm64': 0.23.1 - '@esbuild/openbsd-x64': 0.23.1 - '@esbuild/sunos-x64': 0.23.1 - '@esbuild/win32-arm64': 0.23.1 - '@esbuild/win32-ia32': 0.23.1 - '@esbuild/win32-x64': 0.23.1 + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 escalade@3.2.0: {} - escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} escape-string-regexp@2.0.0: {} @@ -11319,43 +10652,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.6 + debug: 4.3.7 enhanced-resolve: 5.17.0 eslint: 8.57.0 - eslint-module-utils: 2.8.2(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.0 is-bun-module: 1.1.0 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.12.2(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 8.16.0(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.2(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.12.2(eslint@8.57.0)(typescript@5.6.2) - eslint: 8.57.0 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -11364,7 +10687,7 @@ snapshots: eslint: 8.57.0 eslint-rule-composer: 0.3.0 - eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -11375,7 +10698,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -11384,29 +10707,30 @@ snapshots: object.groupby: 1.0.3 object.values: 1.2.0 semver: 6.3.1 + string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.12.2(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/parser': 8.16.0(eslint@8.57.0)(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest-dom@5.4.0(@testing-library/dom@10.1.0)(eslint@8.57.0): + eslint-plugin-jest-dom@5.5.0(@testing-library/dom@10.1.0)(eslint@8.57.0): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.0 eslint: 8.57.0 requireindex: 1.2.0 optionalDependencies: '@testing-library/dom': 10.1.0 - eslint-plugin-jest@28.8.3(@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(jest@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0))(typescript@5.6.2): + eslint-plugin-jest@28.9.0(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(jest@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0))(typescript@5.7.2): dependencies: - '@typescript-eslint/utils': 7.14.1(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/utils': 8.16.0(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - jest: 29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2) + jest: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - supports-color - typescript @@ -11415,14 +10739,14 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-react@7.37.0(eslint@8.57.0): + eslint-plugin-react@7.37.2(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 + es-iterator-helpers: 1.2.0 eslint: 8.57.0 estraverse: 5.3.0 hasown: 2.0.2 @@ -11437,9 +10761,9 @@ snapshots: string.prototype.matchall: 4.0.11 string.prototype.repeat: 1.0.0 - eslint-plugin-testing-library@6.3.0(eslint@8.57.0)(typescript@5.6.2): + eslint-plugin-testing-library@6.3.0(eslint@8.57.0)(typescript@5.7.2): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -11459,6 +10783,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.0: {} + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) @@ -11471,8 +10797,8 @@ snapshots: '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.6 + cross-spawn: 7.0.6 + debug: 4.3.7 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -11504,8 +10830,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -11526,13 +10852,11 @@ snapshots: esutils@2.0.3: {} - etag@1.8.1: {} - events@3.3.0: {} execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -11560,42 +10884,6 @@ snapshots: exponential-backoff@3.1.1: {} - express@4.21.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.1 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.1 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.10 - proxy-addr: 2.0.7 - qs: 6.13.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.2 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - extract-zip@2.0.1: dependencies: debug: 4.3.7 @@ -11629,7 +10917,7 @@ snapshots: dependencies: reusify: 1.0.4 - fb-watchman@2.0.1: + fb-watchman@2.0.2: dependencies: bser: 2.1.1 @@ -11651,18 +10939,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.3.1: - dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 @@ -11707,7 +10983,7 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.6: {} + follow-redirects@1.15.9: {} for-each@0.3.3: dependencies: @@ -11715,24 +10991,20 @@ snapshots: foreground-child@2.0.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 3.0.7 - foreground-child@3.1.1: + foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.0: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - forwarded@0.2.0: {} - - fresh@0.5.2: {} - fromentries@1.3.2: {} fs-constants@1.0.0: {} @@ -11836,14 +11108,9 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-promise@4.2.2(glob@7.2.3): - dependencies: - '@types/glob': 7.2.0 - glob: 7.2.3 - glob@10.4.5: dependencies: - foreground-child: 3.1.1 + foreground-child: 3.3.0 jackspeak: 3.4.2 minimatch: 9.0.5 minipass: 7.1.2 @@ -11895,9 +11162,10 @@ snapshots: dependencies: type-fest: 0.20.2 - globalthis@1.0.3: + globalthis@1.0.4: dependencies: define-properties: 1.2.1 + gopd: 1.1.0 globby@11.1.0: dependencies: @@ -11910,7 +11178,7 @@ snapshots: globrex@0.1.2: {} - gopd@1.0.1: + gopd@1.1.0: dependencies: get-intrinsic: 1.2.4 @@ -11971,7 +11239,7 @@ snapshots: history@4.10.1: dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.0 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.3 @@ -12000,8 +11268,6 @@ snapshots: html-escaper@2.0.2: {} - html-tags@3.3.1: {} - htmlparser2@3.10.1: dependencies: domelementtype: 1.3.1 @@ -12013,14 +11279,6 @@ snapshots: http-cache-semantics@4.1.1: {} - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 @@ -12067,10 +11325,6 @@ snapshots: node-addon-api: 1.7.2 optional: true - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -12088,9 +11342,9 @@ snapshots: import-in-the-middle@1.8.1: dependencies: - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) - cjs-module-lexer: 1.3.1 + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) + cjs-module-lexer: 1.4.1 module-details-from-path: 1.0.3 import-local@3.0.3: @@ -12128,8 +11382,6 @@ snapshots: jsbn: 1.1.0 sprintf-js: 1.1.3 - ipaddr.js@1.9.1: {} - is-arguments@1.1.1: dependencies: call-bind: 1.0.7 @@ -12217,8 +11469,6 @@ snapshots: is-path-inside@3.0.3: {} - is-plain-object@5.0.0: {} - is-potential-custom-element-name@1.0.1: {} is-regex@1.1.4: @@ -12244,7 +11494,7 @@ snapshots: is-typed-array@1.1.13: dependencies: - which-typed-array: 1.1.15 + which-typed-array: 1.1.16 is-typedarray@1.0.0: {} @@ -12283,7 +11533,7 @@ snapshots: isexe@3.1.1: {} - istanbul-lib-coverage@3.2.0: {} + istanbul-lib-coverage@3.2.2: {} istanbul-lib-hook@3.0.0: dependencies: @@ -12291,29 +11541,29 @@ snapshots: istanbul-lib-instrument@4.0.3: dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.26.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - istanbul-lib-instrument@5.1.0: + istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.25.2 - '@babel/parser': 7.25.6 + '@babel/core': 7.26.0 + '@babel/parser': 7.26.2 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color - istanbul-lib-instrument@6.0.1: + istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.25.2 - '@babel/parser': 7.25.6 + '@babel/core': 7.26.0 + '@babel/parser': 7.26.2 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -12321,32 +11571,32 @@ snapshots: istanbul-lib-processinfo@2.0.3: dependencies: archy: 1.0.0 - cross-spawn: 7.0.3 - istanbul-lib-coverage: 3.2.0 + cross-spawn: 7.0.6 + istanbul-lib-coverage: 3.2.2 p-map: 3.0.0 rimraf: 3.0.2 uuid: 8.3.2 - istanbul-lib-report@3.0.0: + istanbul-lib-report@3.0.1: dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 supports-color: 7.2.0 istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.3.7 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.5: + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 + istanbul-lib-report: 3.0.1 - iterator.prototype@1.1.2: + iterator.prototype@1.1.3: dependencies: define-properties: 1.2.1 get-intrinsic: 1.2.4 @@ -12384,10 +11634,10 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1(babel-plugin-macros@3.1.0) + dedent: 1.5.3(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -12397,42 +11647,23 @@ snapshots: jest-util: 29.7.0 p-limit: 3.1.0 pretty-format: 29.7.0 - pure-rand: 6.0.4 + pure-rand: 6.1.0 slash: 3.0.0 - stack-utils: 2.0.5 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-cli@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0) - exit: 0.1.2 - import-local: 3.0.3 - jest-config: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 + stack-utils: 2.0.6 transitivePeerDependencies: - - '@types/node' - babel-plugin-macros - supports-color - - ts-node - jest-cli@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0): + jest-cli@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0) + create-jest: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.0.3 - jest-config: 29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -12441,14 +11672,13 @@ snapshots: - babel-plugin-macros - supports-color - ts-node - optional: true - jest-config@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0): + jest-config@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0): dependencies: - '@babel/core': 7.25.2 + '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) + babel-jest: 29.7.0(@babel/core@7.26.0) chalk: 4.1.2 ci-info: 3.3.0 deepmerge: 4.2.2 @@ -12468,42 +11698,11 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.9 transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0): - dependencies: - '@babel/core': 7.25.2 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.2) - chalk: 4.1.2 - ci-info: 3.3.0 - deepmerge: 4.2.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 22.7.4 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - optional: true - jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -12529,7 +11728,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 22.7.4 + '@types/node': 20.17.9 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -12543,21 +11742,21 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 jest-mock: 29.7.0 jest-util: 29.7.0 - jest-fail-on-console@3.3.0: {} + jest-fail-on-console@3.3.1: {} jest-get-type@29.6.3: {} jest-haste-map@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.8 - '@types/node': 20.16.10 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.17.9 anymatch: 3.1.3 - fb-watchman: 2.0.1 + fb-watchman: 2.0.2 graceful-fs: 4.2.11 jest-regex-util: 29.6.3 jest-util: 29.7.0 @@ -12588,7 +11787,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -12601,26 +11800,26 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 jest-util: 29.7.0 - jest-playwright-preset@4.0.0(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)): + jest-playwright-preset@4.0.0(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0)): dependencies: expect-playwright: 0.8.0 - jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0) + jest: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-process-manager: 0.4.0 jest-runner: 29.7.0 nyc: 15.1.0 - playwright-core: 1.47.2 + playwright-core: 1.49.0 rimraf: 3.0.2 uuid: 8.3.2 transitivePeerDependencies: - debug - supports-color - jest-pnp-resolver@1.2.2(jest-resolve@29.7.0): + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): optionalDependencies: jest-resolve: 29.7.0 @@ -12654,7 +11853,7 @@ snapshots: chalk: 4.1.2 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.2(jest-resolve@29.7.0) + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) jest-util: 29.7.0 jest-validate: 29.7.0 resolve: 1.22.8 @@ -12668,7 +11867,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -12696,10 +11895,10 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 chalk: 4.1.2 - cjs-module-lexer: 1.3.1 - collect-v8-coverage: 1.0.1 + cjs-module-lexer: 1.4.1 + collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 @@ -12720,15 +11919,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.25.2 - '@babel/generator': 7.25.5 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) - '@babel/types': 7.25.6 + '@babel/core': 7.26.0 + '@babel/generator': 7.26.2 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.25.2) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -12745,13 +11944,13 @@ snapshots: jest-styled-components@7.2.0(styled-components@6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - '@adobe/css-tools': 4.4.0 + '@adobe/css-tools': 4.4.1 styled-components: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1) jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 chalk: 4.1.2 ci-info: 3.3.0 graceful-fs: 4.2.11 @@ -12766,11 +11965,11 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0)): + jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0)): dependencies: ansi-escapes: 6.2.1 chalk: 5.3.0 - jest: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0) + jest: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) jest-regex-util: 29.6.3 jest-watcher: 29.7.0 slash: 5.1.0 @@ -12781,7 +11980,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.10 + '@types/node': 20.17.9 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -12795,36 +11994,23 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.9 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0): + jest@29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/types': 29.6.3 import-local: 3.0.3 - jest-cli: 29.7.0(@types/node@20.16.10)(babel-plugin-macros@3.1.0) + jest-cli: 29.7.0(@types/node@20.17.9)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0): - dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) - '@jest/types': 29.6.3 - import-local: 3.0.3 - jest-cli: 29.7.0(@types/node@22.7.4)(babel-plugin-macros@3.1.0) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - optional: true - joi@17.13.3: dependencies: '@hapi/hoek': 9.3.0 @@ -12856,7 +12042,7 @@ snapshots: jsdom@20.0.3: dependencies: abab: 2.0.6 - acorn: 8.12.1 + acorn: 8.14.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -12864,12 +12050,12 @@ snapshots: decimal.js: 10.4.3 domexception: 4.0.0 escodegen: 2.1.0 - form-data: 4.0.0 + form-data: 4.0.1 html-encoding-sniffer: 3.0.0 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.2 + nwsapi: 2.2.9 parse5: 7.1.2 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -12891,12 +12077,12 @@ snapshots: cssstyle: 4.1.0 data-urls: 5.0.0 decimal.js: 10.4.3 - form-data: 4.0.0 + form-data: 4.0.1 html-encoding-sniffer: 4.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.13 + nwsapi: 2.2.16 parse5: 7.1.2 rrweb-cssom: 0.7.1 saxes: 6.0.0 @@ -12914,9 +12100,7 @@ snapshots: - supports-color - utf-8-validate - jsesc@0.5.0: {} - - jsesc@2.5.2: {} + jsesc@3.0.2: {} json-buffer@3.0.1: {} @@ -13008,7 +12192,7 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - logform@2.6.0: + logform@2.7.0: dependencies: '@colors/colors': 1.6.0 '@types/triple-beam': 1.3.5 @@ -13043,7 +12227,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.11: + magic-string@0.30.14: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -13051,6 +12235,10 @@ snapshots: dependencies: semver: 6.3.1 + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.5.0 @@ -13082,18 +12270,12 @@ snapshots: escape-string-regexp: 4.0.0 optional: true - media-typer@0.3.0: {} - memoize-one@6.0.0: {} - merge-descriptors@1.0.3: {} - merge-stream@2.0.0: {} merge2@1.4.1: {} - methods@1.1.2: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -13105,8 +12287,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mime@1.6.0: {} - mime@2.6.0: {} mimic-fn@2.1.0: {} @@ -13182,24 +12362,21 @@ snapshots: dependencies: color-name: 1.1.4 - ms@2.0.0: {} - - ms@2.1.2: {} - ms@2.1.3: {} - msw-storybook-addon@2.0.3(msw@2.4.9(typescript@5.6.2)): + msw-storybook-addon@2.0.4(msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2)): dependencies: is-node-process: 1.2.0 - msw: 2.4.9(typescript@5.6.2) + msw: 2.6.6(@types/node@20.17.9)(typescript@5.7.2) - msw@2.4.9(typescript@5.6.2): + msw@2.6.6(@types/node@20.17.9)(typescript@5.7.2): dependencies: - '@bundled-es-modules/cookie': 2.0.0 + '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 3.2.0 - '@mswjs/interceptors': 0.35.9 + '@inquirer/confirm': 5.0.2(@types/node@20.17.9) + '@mswjs/interceptors': 0.37.1 + '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 '@types/cookie': 0.6.0 '@types/statuses': 2.0.5 @@ -13210,12 +12387,14 @@ snapshots: outvariant: 1.4.3 path-to-regexp: 6.3.0 strict-event-emitter: 0.5.1 - type-fest: 4.26.1 + type-fest: 4.29.0 yargs: 17.7.2 optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 + transitivePeerDependencies: + - '@types/node' - mute-stream@1.0.0: {} + mute-stream@2.0.0: {} nanoid@3.3.7: {} @@ -13259,7 +12438,7 @@ snapshots: node-preload@0.2.1: dependencies: - process-on-spawn: 1.0.0 + process-on-spawn: 1.1.0 node-pty@1.1.0-beta14: dependencies: @@ -13286,9 +12465,9 @@ snapshots: gauge: 4.0.4 set-blocking: 2.0.0 - nwsapi@2.2.13: {} + nwsapi@2.2.16: {} - nwsapi@2.2.2: {} + nwsapi@2.2.9: {} nyc@15.1.0: dependencies: @@ -13302,17 +12481,17 @@ snapshots: foreground-child: 2.0.0 get-package-type: 0.1.0 glob: 7.2.3 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 istanbul-lib-hook: 3.0.0 istanbul-lib-instrument: 4.0.3 istanbul-lib-processinfo: 2.0.3 - istanbul-lib-report: 3.0.0 + istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 + istanbul-reports: 3.1.7 make-dir: 3.1.0 node-preload: 0.2.1 p-map: 3.0.0 - process-on-spawn: 1.0.0 + process-on-spawn: 1.1.0 resolve-from: 5.0.0 rimraf: 3.0.2 signal-exit: 3.0.7 @@ -13360,10 +12539,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -13450,7 +12625,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -13461,8 +12636,6 @@ snapshots: dependencies: entities: 4.4.0 - parseurl@1.3.3: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -13476,8 +12649,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.10: {} - path-to-regexp@1.9.0: dependencies: isarray: 0.0.1 @@ -13490,23 +12661,23 @@ snapshots: pend@1.2.0: {} - picocolors@1.0.1: {} - - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} + picomatch@4.0.2: {} + pirates@4.0.6: {} pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - playwright-core@1.47.2: {} + playwright-core@1.49.0: {} - playwright@1.47.2: + playwright@1.49.0: dependencies: - playwright-core: 1.47.2 + playwright-core: 1.49.0 optionalDependencies: fsevents: 2.3.2 @@ -13518,7 +12689,7 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.26.0 possible-typed-array-names@1.0.0: {} @@ -13527,18 +12698,18 @@ snapshots: postcss@8.4.38: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + picocolors: 1.1.1 + source-map-js: 1.2.1 postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier@3.3.3: {} + prettier@3.4.1: {} pretty-format@27.5.1: dependencies: @@ -13554,7 +12725,7 @@ snapshots: process-nextick-args@2.0.1: {} - process-on-spawn@1.0.0: + process-on-spawn@1.1.0: dependencies: fromentries: 1.3.2 @@ -13580,21 +12751,6 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - protobufjs@7.3.2: - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 20.16.10 - long: 5.2.3 - protobufjs@7.4.0: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -13607,17 +12763,14 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 20.16.10 + '@types/node': 20.17.9 long: 5.2.3 - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: {} - psl@1.9.0: {} + psl@1.14.0: + dependencies: + punycode: 2.3.1 pump@3.0.0: dependencies: @@ -13626,11 +12779,7 @@ snapshots: punycode@2.3.1: {} - pure-rand@6.0.4: {} - - qs@6.13.0: - dependencies: - side-channel: 1.0.6 + pure-rand@6.1.0: {} querystringify@2.2.0: {} @@ -13640,15 +12789,6 @@ snapshots: quick-lru@5.1.1: {} - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - react-day-picker@8.10.1(date-fns@2.28.0)(react@18.3.1): dependencies: date-fns: 2.28.0 @@ -13658,7 +12798,7 @@ snapshots: dependencies: dnd-core: 14.0.1 - react-dnd@14.0.5(@types/node@22.7.4)(@types/react@18.3.10)(react@18.3.1): + react-dnd@14.0.5(@types/node@20.17.9)(@types/react@18.3.12)(react@18.3.1): dependencies: '@react-dnd/invariant': 2.0.0 '@react-dnd/shallowequal': 2.0.0 @@ -13667,18 +12807,18 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/node': 22.7.4 - '@types/react': 18.3.10 + '@types/node': 20.17.9 + '@types/react': 18.3.12 - react-docgen-typescript@2.2.2(typescript@5.6.2): + react-docgen-typescript@2.2.2(typescript@5.7.2): dependencies: - typescript: 5.6.2 + typescript: 5.7.2 - react-docgen@7.0.3: + react-docgen@7.1.0: dependencies: - '@babel/core': 7.25.2 - '@babel/traverse': 7.25.6 - '@babel/types': 7.25.6 + '@babel/core': 7.26.0 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 '@types/doctrine': 0.0.9 @@ -13695,14 +12835,6 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-element-to-jsx-string@15.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@base2/pretty-print-object': 1.0.1 - is-plain-object: 5.0.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - react-is: 18.1.0 - react-highlight@0.15.0: dependencies: highlight.js: 10.7.3 @@ -13711,13 +12843,11 @@ snapshots: react-is@17.0.2: {} - react-is@18.1.0: {} - react-is@18.3.1: {} react-router-dom@5.3.4(react@18.3.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.0 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -13728,7 +12858,7 @@ snapshots: react-router@5.3.4(react@18.3.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.0 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 @@ -13743,26 +12873,26 @@ snapshots: dependencies: '@testing-library/dom': 10.1.0 - react-select@5.8.1(@types/react@18.3.10)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-select@5.8.3(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.6 - '@emotion/cache': 11.13.1 - '@emotion/react': 11.13.3(@types/react@18.3.10)(react@18.3.1) - '@floating-ui/dom': 1.6.11 + '@babel/runtime': 7.26.0 + '@emotion/cache': 11.13.5 + '@emotion/react': 11.13.5(@types/react@18.3.12)(react@18.3.1) + '@floating-ui/dom': 1.6.12 '@types/react-transition-group': 4.4.11 memoize-one: 6.0.0 prop-types: 15.8.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.10)(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.12)(react@18.3.1) transitivePeerDependencies: - '@types/react' - supports-color react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@babel/runtime': 7.25.0 + '@babel/runtime': 7.26.0 dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -13805,7 +12935,7 @@ snapshots: esprima: 4.0.1 source-map: 0.6.1 tiny-invariant: 1.3.3 - tslib: 2.7.0 + tslib: 2.8.1 redent@3.0.0: dependencies: @@ -13814,7 +12944,7 @@ snapshots: redux@4.1.2: dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.26.0 reflect.getprototypeof@1.0.4: dependencies: @@ -13822,10 +12952,10 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.3 get-intrinsic: 1.2.4 - globalthis: 1.0.3 + globalthis: 1.0.4 which-builtin-type: 1.1.3 - regenerate-unicode-properties@10.1.1: + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -13835,7 +12965,7 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.25.6 + '@babel/runtime': 7.26.0 regexp.prototype.flags@1.5.2: dependencies: @@ -13844,18 +12974,20 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 - regexpu-core@5.3.2: + regexpu-core@6.2.0: dependencies: - '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 - regjsparser: 0.9.1 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - regjsparser@0.9.1: + regjsgen@0.8.0: {} + + regjsparser@0.12.0: dependencies: - jsesc: 0.5.0 + jsesc: 3.0.2 release-zalgo@1.0.0: dependencies: @@ -13937,7 +13069,7 @@ snapshots: dependencies: boolean: 3.1.4 detect-node: 2.1.0 - globalthis: 1.0.3 + globalthis: 1.0.4 json-stringify-safe: 5.0.1 semver-compare: 1.0.0 sprintf-js: 1.1.3 @@ -13982,7 +13114,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 safe-array-concat@1.1.2: dependencies: @@ -14026,38 +13158,11 @@ snapshots: semver@7.6.3: {} - send@0.19.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - serialize-error@7.0.1: dependencies: type-fest: 0.13.1 optional: true - serve-static@1.16.2: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.0 - transitivePeerDependencies: - - supports-color - set-blocking@2.0.0: {} set-function-length@1.2.2: @@ -14066,7 +13171,7 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - gopd: 1.0.1 + gopd: 1.1.0 has-property-descriptors: 1.0.2 set-function-name@2.0.2: @@ -14076,8 +13181,6 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - setprototypeof@1.2.0: {} - shallowequal@1.1.0: {} shebang-command@2.0.0: @@ -14135,8 +13238,6 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 - source-map-js@1.2.0: {} - source-map-js@1.2.1: {} source-map-support@0.5.13: @@ -14185,10 +13286,6 @@ snapshots: stack-trace@0.0.10: {} - stack-utils@2.0.5: - dependencies: - escape-string-regexp: 2.0.0 - stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 @@ -14197,9 +13294,11 @@ snapshots: statuses@2.0.1: {} - storybook@8.3.4: + storybook@8.4.6(prettier@3.4.1): dependencies: - '@storybook/core': 8.3.4 + '@storybook/core': 8.4.6(prettier@3.4.1) + optionalDependencies: + prettier: 3.4.1 transitivePeerDependencies: - bufferutil - supports-color @@ -14222,7 +13321,7 @@ snapshots: string-length@5.0.1: dependencies: - char-regex: 2.0.1 + char-regex: 2.0.2 strip-ansi: 7.1.0 string-width@4.2.3: @@ -14245,7 +13344,7 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.0.0 get-intrinsic: 1.2.4 - gopd: 1.0.1 + gopd: 1.1.0 has-symbols: 1.0.3 internal-slot: 1.0.7 regexp.prototype.flags: 1.5.2 @@ -14407,7 +13506,7 @@ snapshots: terser@5.31.1: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.12.1 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 optional: true @@ -14446,17 +13545,13 @@ snapshots: tmpl@1.0.5: {} - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} - tough-cookie@4.1.4: dependencies: - psl: 1.9.0 + psl: 1.14.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 @@ -14481,15 +13576,15 @@ snapshots: dependencies: utf8-byte-length: 1.0.4 - ts-api-utils@1.3.0(typescript@5.6.2): + ts-api-utils@1.3.0(typescript@5.7.2): dependencies: - typescript: 5.6.2 + typescript: 5.7.2 ts-dedent@2.2.0: {} - tsconfck@3.1.0(typescript@5.6.2): + tsconfck@3.1.0(typescript@5.7.2): optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 tsconfig-paths@3.15.0: dependencies: @@ -14508,12 +13603,12 @@ snapshots: tslib@2.6.2: {} - tslib@2.7.0: {} + tslib@2.8.1: {} - tsutils@3.21.0(typescript@5.6.2): + tsutils@3.21.0(typescript@5.7.2): dependencies: tslib: 1.14.1 - typescript: 5.6.2 + typescript: 5.7.2 type-check@0.4.0: dependencies: @@ -14532,12 +13627,7 @@ snapshots: type-fest@2.19.0: {} - type-fest@4.26.1: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 + type-fest@4.29.0: {} typed-array-buffer@1.0.2: dependencies: @@ -14549,7 +13639,7 @@ snapshots: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.1.0 has-proto: 1.0.3 is-typed-array: 1.1.13 @@ -14558,7 +13648,7 @@ snapshots: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.1.0 has-proto: 1.0.3 is-typed-array: 1.1.13 @@ -14566,7 +13656,7 @@ snapshots: dependencies: call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.1.0 has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 @@ -14575,18 +13665,18 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typescript-eslint@8.12.2(eslint@8.57.0)(typescript@5.6.2): + typescript-eslint@8.16.0(eslint@8.57.0)(typescript@5.7.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.0)(typescript@5.6.2))(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/parser': 8.12.2(eslint@8.57.0)(typescript@5.6.2) - '@typescript-eslint/utils': 8.12.2(eslint@8.57.0)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/parser': 8.16.0(eslint@8.57.0)(typescript@5.7.2) + '@typescript-eslint/utils': 8.16.0(eslint@8.57.0)(typescript@5.7.2) + eslint: 8.57.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.2 transitivePeerDependencies: - - eslint - supports-color - typescript@5.6.2: {} + typescript@5.7.2: {} unbox-primitive@1.0.2: dependencies: @@ -14622,20 +13712,16 @@ snapshots: universalify@2.0.1: {} - unpipe@1.0.0: {} - - unplugin@1.14.1(webpack-sources@3.2.3): + unplugin@1.16.0: dependencies: - acorn: 8.12.1 + acorn: 8.14.0 webpack-virtual-modules: 0.6.2 - optionalDependencies: - webpack-sources: 3.2.3 - update-browserslist-db@1.1.0(browserslist@4.23.3): + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: - browserslist: 4.23.3 + browserslist: 4.24.2 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: @@ -14646,11 +13732,11 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - use-isomorphic-layout-effect@1.1.2(@types/react@18.3.10)(react@18.3.1): + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.12)(react@18.3.1): dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 18.3.10 + '@types/react': 18.3.12 utf8-byte-length@1.0.4: {} @@ -14662,9 +13748,7 @@ snapshots: is-arguments: 1.1.1 is-generator-function: 1.0.10 is-typed-array: 1.1.13 - which-typed-array: 1.1.15 - - utils-merge@1.0.1: {} + which-typed-array: 1.1.16 uuid@8.3.2: {} @@ -14673,13 +13757,11 @@ snapshots: v8-to-istanbul@9.1.3: dependencies: '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.3 + '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 value-equal@1.0.1: {} - vary@1.1.2: {} - verror@1.10.1: dependencies: assert-plus: 1.0.0 @@ -14687,38 +13769,28 @@ snapshots: extsprintf: 1.4.1 optional: true - vite-plugin-wasm@3.3.0(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)): + vite-plugin-wasm@3.3.0(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)): dependencies: - vite: 5.4.8(@types/node@22.7.4)(terser@5.31.1) + vite: 5.4.8(@types/node@20.17.9)(terser@5.31.1) - vite-tsconfig-paths@5.0.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.4)(terser@5.31.1)): + vite-tsconfig-paths@5.1.3(typescript@5.7.2)(vite@5.4.8(@types/node@20.17.9)(terser@5.31.1)): dependencies: - debug: 4.3.6 + debug: 4.3.7 globrex: 0.1.2 - tsconfck: 3.1.0(typescript@5.6.2) + tsconfck: 3.1.0(typescript@5.7.2) optionalDependencies: - vite: 5.4.8(@types/node@22.7.4)(terser@5.31.1) + vite: 5.4.8(@types/node@20.17.9)(terser@5.31.1) transitivePeerDependencies: - supports-color - typescript - vite@5.4.8(@types/node@20.16.10)(terser@5.31.1): + vite@5.4.8(@types/node@20.17.9)(terser@5.31.1): dependencies: esbuild: 0.21.5 postcss: 8.4.47 rollup: 4.23.0 optionalDependencies: - '@types/node': 20.16.10 - fsevents: 2.3.3 - terser: 5.31.1 - - vite@5.4.8(@types/node@22.7.4)(terser@5.31.1): - dependencies: - esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.23.0 - optionalDependencies: - '@types/node': 22.7.4 + '@types/node': 20.17.9 fsevents: 2.3.3 terser: 5.31.1 @@ -14734,7 +13806,7 @@ snapshots: wait-on@7.2.0: dependencies: - axios: 1.7.5 + axios: 1.7.8 joi: 17.13.3 lodash: 4.17.21 minimist: 1.2.8 @@ -14760,9 +13832,6 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-sources@3.2.3: - optional: true - webpack-virtual-modules@0.6.2: {} whatwg-encoding@2.0.0: @@ -14810,7 +13879,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.0.2 which-collection: 1.0.1 - which-typed-array: 1.1.15 + which-typed-array: 1.1.16 which-collection@1.0.1: dependencies: @@ -14821,12 +13890,12 @@ snapshots: which-module@2.0.1: {} - which-typed-array@1.1.15: + which-typed-array@1.1.16: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 - gopd: 1.0.1 + gopd: 1.1.0 has-tostringtag: 1.0.2 which@1.3.1: @@ -14845,25 +13914,25 @@ snapshots: dependencies: string-width: 4.2.3 - winston-transport@4.7.0: + winston-transport@4.9.0: dependencies: - logform: 2.6.0 + logform: 2.7.0 readable-stream: 3.6.2 triple-beam: 1.3.0 - winston@3.14.2: + winston@3.17.0: dependencies: '@colors/colors': 1.6.0 '@dabh/diagnostics': 2.0.2 async: 3.2.6 is-stream: 2.0.1 - logform: 2.6.0 + logform: 2.7.0 one-time: 1.0.0 readable-stream: 3.6.2 safe-stable-stringify: 2.3.1 stack-trace: 0.0.10 triple-beam: 1.3.0 - winston-transport: 4.7.0 + winston-transport: 4.9.0 wrap-ansi@6.2.0: dependencies: @@ -14965,7 +14034,7 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 - zod-to-json-schema@3.23.3(zod@3.23.8): + zod-to-json-schema@3.23.5(zod@3.23.8): dependencies: zod: 3.23.8 diff --git a/proto/accessgraph/v1alpha/access_graph_service.proto b/proto/accessgraph/v1alpha/access_graph_service.proto index 979e781290c94..b78b473327ffe 100644 --- a/proto/accessgraph/v1alpha/access_graph_service.proto +++ b/proto/accessgraph/v1alpha/access_graph_service.proto @@ -21,6 +21,7 @@ syntax = "proto3"; package accessgraph.v1alpha; import "accessgraph/v1alpha/aws.proto"; +import "accessgraph/v1alpha/azure.proto"; import "accessgraph/v1alpha/entra.proto"; import "accessgraph/v1alpha/events.proto"; import "accessgraph/v1alpha/gitlab.proto"; @@ -86,6 +87,9 @@ service AccessGraphService { // EntraEventsStream is a stream of commands to the Entra ID SSO importer. rpc EntraEventsStream(stream EntraEventsStreamRequest) returns (stream EntraEventsStreamResponse); + + // AzureEventsStream is a stream of commands to the Azure importer + rpc AzureEventsStream(stream AzureEventsStreamRequest) returns (stream AzureEventsStreamResponse); } // QueryRequest is a request to query the access graph. @@ -265,3 +269,23 @@ message EntraEventsStreamRequest { // EntraEventsStreamResponse is the response from GitlabEventsStream. message EntraEventsStreamResponse {} + +// AzureEventsStreamRequest is a request to send commands to the Azure importer +message AzureEventsStreamRequest { + oneof operation { + // sync is a command to sync the access graph with the Teleport database state. + // it's issued once Teleport finishes syncing all resources with the database. + AzureSyncOperation sync = 1; + // upsert is a command to put a resource into the access graph or update it. + AzureResourceList upsert = 2; + // delete is a command to delete a resource from the access graph when it's deleted from Teleport. + AzureResourceList delete = 3; + } +} + +// AzureSyncOperation is a command that Teleport sends to the access graph service +// at the end of the sync process. +message AzureSyncOperation {} + +// AzureEventsStreamResponse is a response from AzureEventsStream +message AzureEventsStreamResponse {} diff --git a/proto/accessgraph/v1alpha/azure.proto b/proto/accessgraph/v1alpha/azure.proto new file mode 100644 index 0000000000000..1050c3c98f75e --- /dev/null +++ b/proto/accessgraph/v1alpha/azure.proto @@ -0,0 +1,140 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +syntax = "proto3"; +package accessgraph.v1alpha; + +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha;accessgraphv1alpha"; + +// AzureResourceList is a list of Azure resources +message AzureResourceList { + repeated AzureResource resources = 1; +} + +// AzureResource is a list of Azure resources supported by the access graph. +message AzureResource { + oneof resource { + // principal is an Azure principal + AzurePrincipal principal = 1; + // role_definition is an Azure role definition + AzureRoleDefinition role_definition = 2; + // role_assignment is an Azure role assignment, which assigns a role definition to a principal + AzureRoleAssignment role_assignment = 3; + // virtual_machine is an Azure virtual machine, an instance of a compute resource + AzureVirtualMachine virtual_machine = 4; + } +} + +// AzureVirtualMachine is an Azure virtual machine +message AzureVirtualMachine { + // id is the ID of the virtual machine + string id = 1; + // subscription_id is the ID of the subscription to which the virtual machine belongs + string subscription_id = 2; + // last_sync_time is when the virtual machine was last fetched from Azure + google.protobuf.Timestamp last_sync_time = 3; + // name is the given name of the virtual machine + string name = 4; + // resource_group is the name of the resource group to which the virtual machine belongs + string resource_group = 5; + // tags are a collection of arbitrary key-values applied to the virtual machine + map tags = 6; + // location is the geographical location of the Virtual Machine + string location = 7; +} + +// AzureIdentity is a Graph API object identity +message AzureIdentity { + // sign_in_type is the type of identity used when signing in, e.g. "emailAddress" or "userName" + string sign_in_type = 1; + // issuer is the issuer of the identity, such as a domain name like "goteleport.com" + string issuer = 2; + // issuer_assigned_id unique identifier assigned to the user by the issuer + string issuer_assigned_id = 3; +} + +// AzurePrincipal is a Graph API principal (user, group, service principal) +message AzurePrincipal { + // id is the ID of the principal + string id = 1; + // subscription_id is the ID of the subscription to which the principal belongs + string subscription_id = 2; + // last_sync_time is when the principal was last fetched from Azure + google.protobuf.Timestamp last_sync_time = 3; + // display_name is the given name for the principal, e.g. a user's first+last name + string display_name = 4; + // member_of lists the groups and directories the principal is assigned to + repeated string member_of = 5; + // identities lists the identities that can be used to sign in to the account + repeated AzureIdentity identities = 6; + // object_type defines the type of principal, e.g. "user" or "group" + string object_type = 7; +} + +// AzureRoleAssignment links an Azure principal to a role definition with a scope +message AzureRoleAssignment { + // id is the ID of the role assignment + string id = 1; + // subscription_id is the ID of the subscription to which the role assignment belongs + string subscription_id = 2; + // last_sync_time is when the role assignment was last fetched from Azure + google.protobuf.Timestamp last_sync_time = 3; + // principal_id is the ID of the principal being assigned a role + string principal_id = 4; + // role_definition_id is the ID of the role definition assigned to the principal + string role_definition_id = 5; + // scope constrains which resources the assignment applies to + string scope = 6; + // condition further which resources the assignment applies to + string condition = 7; +} + +// AzureRoleDefinition defines a role by its permissions +message AzureRoleDefinition { + // id is the ID of the role definition + string id = 1; + // subscription_id is the ID of the subscription to which the role definition belongs + string subscription_id = 2; + // last_sync_time is when the role definition was last fetched from Azure + google.protobuf.Timestamp last_sync_time = 3; + // name is the given name for the role definition + string name = 4; + // description provides additional detail about the role definition + string description = 5; + // assignable_scopes limits the scopes defined in corresponding role assignments + repeated string assignable_scopes = 6; + // permissions define the actions and not (disallowed) actions + repeated AzureRBACPermission permissions = 7; + // role_name is the given name for the role itself + string role_name = 8; + // type defines the type of role + string type = 9; +} + +// AzurePermission defines the actions and not (disallowed) actions for a role definition +message AzureRBACPermission { + // actions define the resources and verbs allowed on the resources + repeated string actions = 1; + // not_actions define the resources and verbs disallowed on the resources + repeated string not_actions = 2; + // data_actions define fine-grained resources and verbs allowed within the resource + repeated string data_actions = 3; + // not_data_actions define fine-grained resources and verbs disallowed within the resource + repeated string not_data_actions = 4; +} diff --git a/rfd/0160-kubernetes-operator-resource-versioning.md b/rfd/0160-kubernetes-operator-resource-versioning.md index 790232c7f0435..8c7b0021d71e2 100644 --- a/rfd/0160-kubernetes-operator-resource-versioning.md +++ b/rfd/0160-kubernetes-operator-resource-versioning.md @@ -95,7 +95,7 @@ or multiple controllers if we need it. kubectl get teleportrolev6 # get roles v7 - kubeclt get teleportrolev7 + kubectl get teleportrolev7 # get roles v5, we could remove it but it would break kubectl get teleportrole diff --git a/rfd/0182-multi-port-tcp-app-access.md b/rfd/0182-multi-port-tcp-app-access.md index 499f5753bae8f..d8810689dd4a2 100644 --- a/rfd/0182-multi-port-tcp-app-access.md +++ b/rfd/0182-multi-port-tcp-app-access.md @@ -544,8 +544,7 @@ Changes in `api/proto/teleport/legacy/client/proto/authservice.proto`: + // Used merely for audit events and mirrors the URI from the app spec. string URI = 8 [(gogoproto.jsontag) = "uri,omitempty"]; + // TargetPort signifies that the cert grants access to a specific port in a multi-port TCP app, as -+ // long as the port is defined in the app spec. When specified, it must be between 1 and 65535 and -+ // the URI is expected to use this port as well. ++ // long as the port is defined in the app spec. When specified, it must be between 1 and 65535. + // Used only for routing, should not be used in other contexts (e.g., access requests). + uint32 TargetPort = 9 [(gogoproto.jsontag) = "target_port,omitempty"]; } diff --git a/rfd/0184-agent-auto-updates.md b/rfd/0184-agent-auto-updates.md index 64b5e1e2d0ddd..a204b424bef70 100644 --- a/rfd/0184-agent-auto-updates.md +++ b/rfd/0184-agent-auto-updates.md @@ -1451,7 +1451,7 @@ Hello messages are sent on connection and are used to build the serve's local in This information is available almost instantaneously after the connection and can be cheaply queried by the auth ( everything is in memory). The inventory is then used to count the local instances and drive the rollout. -Both instance heartbeats and Hello merssages will be extended to incorporate and send data that is written to +Both instance heartbeats and Hello messages will be extended to incorporate and send data that is written to `/var/lib/teleport/versions/update.yaml` and `/tmp/teleport_update_uuid` by the `teleport-update` binary. The following data related to the update is sent by the agent: diff --git a/rfd/0186-optionally-require-reason-for-access-request.md b/rfd/0186-optionally-require-reason-for-access-request.md index eeca95046737b..eff1f19cfd79a 100644 --- a/rfd/0186-optionally-require-reason-for-access-request.md +++ b/rfd/0186-optionally-require-reason-for-access-request.md @@ -1,9 +1,9 @@ --- authors: Pawel Kopiczko (pawel.kopiczko@goteleport.com) -state: draft +state: implemented --- -# RFD 186 - Optionally require reason for access request +# RFD 186 - Optionally require reason for Access Request ## Required Approvers diff --git a/tool/tctl/common/auth_command.go b/tool/tctl/common/auth_command.go index 141a38e8fe46d..f46934965c9b6 100644 --- a/tool/tctl/common/auth_command.go +++ b/tool/tctl/common/auth_command.go @@ -87,6 +87,7 @@ type AuthCommand struct { caType string streamTarfile bool identityWriter identityfile.ConfigWriter + integration string rotateGracePeriod time.Duration rotateType string @@ -116,6 +117,7 @@ func (a *AuthCommand) Initialize(app *kingpin.Application, config *servicecfg.Co a.authExport.Flag("type", fmt.Sprintf("export certificate type (%v)", strings.Join(allowedCertificateTypes, ", "))). EnumVar(&a.authType, allowedCertificateTypes...) + a.authExport.Flag("integration", "Name of the integration. Only applies to \"github\" CAs.").StringVar(&a.integration) a.authGenerate = auth.Command("gen", "Generate a new SSH keypair.").Hidden() a.authGenerate.Flag("pub-key", "path to the public key").Required().StringVar(&a.genPubPath) @@ -206,6 +208,7 @@ var allowedCertificateTypes = []string{ "db-client-der", "openssh", "saml-idp", + "github", } // allowedCRLCertificateTypes list of certificate authorities types that can @@ -233,6 +236,7 @@ func (a *AuthCommand) ExportAuthorities(ctx context.Context, clt *authclient.Cli AuthType: a.authType, ExportAuthorityFingerprint: a.exportAuthorityFingerprint, UseCompatVersion: a.compatVersion == "1.0", + Integration: a.integration, }, ) if err != nil { diff --git a/tool/tctl/common/bots_command.go b/tool/tctl/common/bots_command.go index 1cca70353894d..306969eec1f26 100644 --- a/tool/tctl/common/bots_command.go +++ b/tool/tctl/common/bots_command.go @@ -114,10 +114,10 @@ func (c *BotsCommand) Initialize(app *kingpin.Application, config *servicecfg.Co c.botsInstances = bots.Command("instances", "Manage bot instances.").Alias("instance") - c.botsInstancesShow = c.botsInstances.Command("show", "Shows information about a specific bot instance").Alias("get").Alias("describe") + c.botsInstancesShow = c.botsInstances.Command("show", "Shows information about a specific bot instance.").Alias("get").Alias("describe") c.botsInstancesShow.Arg("id", "The full ID of the bot instance, in the form of [bot name]/[uuid]").Required().StringVar(&c.instanceID) - c.botsInstancesList = c.botsInstances.Command("list", "List bot instances").Alias("ls") + c.botsInstancesList = c.botsInstances.Command("list", "List bot instances.").Alias("ls") c.botsInstancesList.Arg("name", "The name of the bot from which to list instances. If unset, lists instances from all bots.").StringVar(&c.botName) c.botsInstancesAdd = c.botsInstances.Command("add", "Join a new instance onto an existing bot.").Alias("join") diff --git a/tool/tctl/common/resource_command.go b/tool/tctl/common/resource_command.go index 66a916c6711b1..e8d798d8c7896 100644 --- a/tool/tctl/common/resource_command.go +++ b/tool/tctl/common/resource_command.go @@ -49,7 +49,6 @@ import ( dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" dbobjectimportrulev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobjectimportrule/v1" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" - gitserverv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/gitserver/v1" loginrulepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" pluginsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1" @@ -1980,7 +1979,7 @@ func (rc *ResourceCommand) Delete(ctx context.Context, client *authclient.Client } fmt.Printf("static host user %q has been deleted\n", rc.ref.Name) case types.KindGitServer: - if _, err := client.GitServerClient().DeleteGitServer(ctx, &gitserverv1.DeleteGitServerRequest{Name: rc.ref.Name}); err != nil { + if err := client.GitServerClient().DeleteGitServer(ctx, rc.ref.Name); err != nil { return trace.Wrap(err) } fmt.Printf("git_server %q has been deleted\n", rc.ref.Name) @@ -3232,29 +3231,27 @@ func (rc *ResourceCommand) getCollection(ctx context.Context, client *authclient } return &accessMonitoringRuleCollection{items: rules}, nil case types.KindGitServer: - var servers []types.Server + var page, servers []types.Server // TODO(greedy52) use unified resource request once available. if rc.ref.Name != "" { - server, err := client.GitServerClient().GetGitServer(ctx, &gitserverv1.GetGitServerRequest{Name: rc.ref.Name}) + server, err := client.GitServerClient().GetGitServer(ctx, rc.ref.Name) if err != nil { return nil, trace.Wrap(err) } return &serverCollection{servers: append(servers, server)}, nil } - req := &gitserverv1.ListGitServersRequest{} + var err error + var token string for { - resp, err := client.GitServerClient().ListGitServers(ctx, req) + page, token, err = client.GitServerClient().ListGitServers(ctx, 0, token) if err != nil { return nil, trace.Wrap(err) } - for _, server := range resp.Servers { - servers = append(servers, server) - } - if resp.NextPageToken == "" { + servers = append(servers, page...) + if token == "" { break } - req.PageToken = resp.NextPageToken } // TODO(greedy52) consider making dedicated git server collection. return &serverCollection{servers: servers}, nil @@ -3676,14 +3673,10 @@ func (rc *ResourceCommand) createGitServer(ctx context.Context, client *authclie if err != nil { return trace.Wrap(err) } - serverV2, ok := server.(*types.ServerV2) - if !ok { - return trace.CompareFailed("expecting types.ServerV2 but got %T", server) - } if rc.IsForced() { - _, err = client.GitServerClient().UpsertGitServer(ctx, &gitserverv1.UpsertGitServerRequest{Server: serverV2}) + _, err = client.GitServerClient().UpsertGitServer(ctx, server) } else { - _, err = client.GitServerClient().CreateGitServer(ctx, &gitserverv1.CreateGitServerRequest{Server: serverV2}) + _, err = client.GitServerClient().CreateGitServer(ctx, server) } if err != nil { return trace.Wrap(err) @@ -3696,11 +3689,7 @@ func (rc *ResourceCommand) updateGitServer(ctx context.Context, client *authclie if err != nil { return trace.Wrap(err) } - serverV2, ok := server.(*types.ServerV2) - if !ok { - return trace.CompareFailed("expecting types.ServerV2 but got %T", server) - } - _, err = client.GitServerClient().UpdateGitServer(ctx, &gitserverv1.UpdateGitServerRequest{Server: serverV2}) + _, err = client.GitServerClient().UpdateGitServer(ctx, server) if err != nil { return trace.Wrap(err) } diff --git a/tool/tctl/common/resource_command_test.go b/tool/tctl/common/resource_command_test.go index da1bd0d42bfda..a3dd729d72477 100644 --- a/tool/tctl/common/resource_command_test.go +++ b/tool/tctl/common/resource_command_test.go @@ -691,7 +691,11 @@ version: v3 metadata: name: foo spec: - uri: "localhost1" + uri: "tcp://localhost1" + tcp_ports: + - port: 1234 + - port: 30000 + end_port: 30768 --- kind: app version: v3 @@ -1198,7 +1202,11 @@ func TestAppResource(t *testing.T) { Name: "foo", Labels: map[string]string{types.OriginLabel: types.OriginDynamic}, }, types.AppSpecV3{ - URI: "localhost1", + URI: "tcp://localhost1", + TCPPorts: []*types.PortRange{ + &types.PortRange{Port: 1234}, + &types.PortRange{Port: 30000, EndPort: 30768}, + }, }) require.NoError(t, err) appFooBar1, err := types.NewAppV3(types.Metadata{ diff --git a/tool/teleport-update/main.go b/tool/teleport-update/main.go index e6702ae9f35c2..aa01952a1dbec 100644 --- a/tool/teleport-update/main.go +++ b/tool/teleport-update/main.go @@ -25,7 +25,6 @@ import ( "log/slog" "os" "os/signal" - "path/filepath" "syscall" "github.com/gravitational/trace" @@ -41,8 +40,7 @@ import ( const appHelp = `Teleport Updater -The Teleport Updater updates the version a Teleport agent on a Linux server -that is being used as agent to provide connectivity to Teleport resources. +The Teleport Updater automatically updates a Teleport agent. The Teleport Updater supports upgrade schedules and automated rollbacks. @@ -59,22 +57,16 @@ const ( updateVersionEnvVar = "TELEPORT_UPDATE_VERSION" ) -const ( - // lockFileName specifies the name of the file containing the flock lock preventing concurrent updater execution. - lockFileName = ".update-lock" -) - var plog = logutils.NewPackageLogger(teleport.ComponentKey, teleport.ComponentUpdater) func main() { - if err := Run(os.Args[1:]); err != nil { - libutils.FatalError(err) + if code := Run(os.Args[1:]); code != 0 { + os.Exit(code) } } type cliConfig struct { autoupdate.OverrideConfig - // Debug logs enabled Debug bool // LogFormat controls the format of logging. Can be either `json` or `text`. @@ -84,12 +76,20 @@ type cliConfig struct { DataDir string // LinkDir for linking binaries and systemd services LinkDir string + // InstallSuffix is the isolated suffix for the installation. + InstallSuffix string // SelfSetup mode for using the current version of the teleport-update to setup the update service. SelfSetup bool + // UpdateNow forces an immediate update. + UpdateNow bool } -func Run(args []string) error { - var ccfg cliConfig +func Run(args []string) int { + var ( + ccfg cliConfig + userLinkDir bool + userDataDir bool + ) ctx := context.Background() ctx, _ = signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM) @@ -97,45 +97,49 @@ func Run(args []string) error { app.Flag("debug", "Verbose logging to stdout."). Short('d').BoolVar(&ccfg.Debug) app.Flag("data-dir", "Teleport data directory. Access to this directory should be limited."). - Default(libdefaults.DataDir).StringVar(&ccfg.DataDir) + Default(libdefaults.DataDir).IsSetByUser(&userDataDir).StringVar(&ccfg.DataDir) app.Flag("log-format", "Controls the format of output logs. Can be `json` or `text`. Defaults to `text`."). Default(libutils.LogFormatText).EnumVar(&ccfg.LogFormat, libutils.LogFormatJSON, libutils.LogFormatText) - app.Flag("link-dir", "Directory to link the active Teleport installation into."). - Default(autoupdate.DefaultLinkDir).Hidden().StringVar(&ccfg.LinkDir) + app.Flag("install-suffix", "Suffix for creating an agent installation outside of the default $PATH. Note: this changes the default data directory."). + Short('n').StringVar(&ccfg.InstallSuffix) + app.Flag("link-dir", "Directory to link the active Teleport installation's binaries into."). + Default(autoupdate.DefaultLinkDir).IsSetByUser(&userLinkDir).Hidden().StringVar(&ccfg.LinkDir) app.HelpFlag.Short('h') versionCmd := app.Command("version", fmt.Sprintf("Print the version of your %s binary.", autoupdate.BinaryName)) - enableCmd := app.Command("enable", "Enable agent auto-updates and perform initial installation or update.") + enableCmd := app.Command("enable", "Enable agent auto-updates and perform initial installation or update. This creates a systemd timer that periodically runs the update subcommand.") enableCmd.Flag("proxy", "Address of the Teleport Proxy."). Short('p').Envar(proxyServerEnvVar).StringVar(&ccfg.Proxy) enableCmd.Flag("group", "Update group for this agent installation."). Short('g').Envar(updateGroupEnvVar).StringVar(&ccfg.Group) - enableCmd.Flag("template", "Go template used to override Teleport download URL."). + enableCmd.Flag("template", "Go template used to override the Teleport download URL."). Short('t').Envar(templateEnvVar).StringVar(&ccfg.URLTemplate) - enableCmd.Flag("force-version", "Force the provided version instead of querying it from the Teleport cluster."). + enableCmd.Flag("force-version", "Force the provided version instead of using the version provided by the Teleport cluster."). Short('f').Envar(updateVersionEnvVar).Hidden().StringVar(&ccfg.ForceVersion) enableCmd.Flag("self-setup", "Use the current teleport-update binary to create systemd service config for auto-updates."). Short('s').Hidden().BoolVar(&ccfg.SelfSetup) // TODO(sclevine): add force-fips and force-enterprise as hidden flags - pinCmd := app.Command("pin", "Install Teleport and lock the updater on the installed version.") + pinCmd := app.Command("pin", "Install Teleport and lock the updater to the installed version.") pinCmd.Flag("proxy", "Address of the Teleport Proxy."). Short('p').Envar(proxyServerEnvVar).StringVar(&ccfg.Proxy) pinCmd.Flag("group", "Update group for this agent installation."). Short('g').Envar(updateGroupEnvVar).StringVar(&ccfg.Group) pinCmd.Flag("template", "Go template used to override Teleport download URL."). Short('t').Envar(templateEnvVar).StringVar(&ccfg.URLTemplate) - pinCmd.Flag("force-version", "Force the provided version instead of querying it from the Teleport cluster."). + pinCmd.Flag("force-version", "Force the provided version instead of using the version provided by the Teleport cluster."). Short('f').Envar(updateVersionEnvVar).StringVar(&ccfg.ForceVersion) pinCmd.Flag("self-setup", "Use the current teleport-update binary to create systemd service config for auto-updates."). Short('s').Hidden().BoolVar(&ccfg.SelfSetup) - disableCmd := app.Command("disable", "Disable agent auto-updates.") + disableCmd := app.Command("disable", "Disable agent auto-updates. Does not affect the active installation of Teleport.") unpinCmd := app.Command("unpin", "Unpin the current version, allowing it to be updated.") - updateCmd := app.Command("update", "Update agent to the latest version, if a new version is available.") + updateCmd := app.Command("update", "Update the agent to the latest version, if a new version is available.") + updateCmd.Flag("now", "Force immediate update even if update window is not active."). + Short('n').BoolVar(&ccfg.UpdateNow) updateCmd.Flag("self-setup", "Use the current teleport-update binary to create systemd service config for auto-updates."). Short('s').Hidden().BoolVar(&ccfg.SelfSetup) @@ -153,12 +157,23 @@ func Run(args []string) error { command, err := app.Parse(args) if err != nil { app.Usage(args) - return trace.Wrap(err) + libutils.FatalError(err) } + + // These have different defaults if --install-suffix is specified. + // If the user did not set them, let autoupdate.NewNamespace set them. + if !userDataDir { + ccfg.DataDir = "" + } + if !userLinkDir { + ccfg.LinkDir = "" + } + // Logging must be configured as early as possible to ensure all log // message are formatted correctly. if err := setupLogger(ccfg.Debug, ccfg.LogFormat); err != nil { - return trace.Errorf("failed to set up logger") + plog.ErrorContext(ctx, "Failed to set up logger.", "error", err) + return 1 } switch command { @@ -175,9 +190,9 @@ func Run(args []string) error { case updateCmd.FullCommand(): err = cmdUpdate(ctx, &ccfg) case linkCmd.FullCommand(): - err = cmdLink(ctx, &ccfg) + err = cmdLinkPackage(ctx, &ccfg) case unlinkCmd.FullCommand(): - err = cmdUnlink(ctx, &ccfg) + err = cmdUnlinkPackage(ctx, &ccfg) case setupCmd.FullCommand(): err = cmdSetup(ctx, &ccfg) case statusCmd.FullCommand(): @@ -188,10 +203,16 @@ func Run(args []string) error { modules.GetModules().PrintVersion() default: // This should only happen when there's a missing switch case above. - err = trace.Errorf("command %q not configured", command) + err = trace.Errorf("command %s not configured", command) } - - return err + if errors.Is(err, autoupdate.ErrNotSupported) { + return autoupdate.CodeNotSupported + } + if err != nil { + plog.ErrorContext(ctx, "Command failed.", "error", err) + return 1 + } + return 0 } func setupLogger(debug bool, format string) error { @@ -211,21 +232,43 @@ func setupLogger(debug bool, format string) error { return nil } -// cmdDisable disables updates. -func cmdDisable(ctx context.Context, ccfg *cliConfig) error { +func initConfig(ccfg *cliConfig) (updater *autoupdate.Updater, lockFile string, err error) { + ns, err := autoupdate.NewNamespace(plog, ccfg.InstallSuffix, ccfg.DataDir, ccfg.LinkDir) + if err != nil { + return nil, "", trace.Wrap(err) + } + lockFile, err = ns.Init() + if err != nil { + return nil, "", trace.Wrap(err) + } + updater, err = autoupdate.NewLocalUpdater(autoupdate.LocalUpdaterConfig{ + SelfSetup: ccfg.SelfSetup, + Log: plog, + }, ns) + return updater, lockFile, trace.Wrap(err) +} + +func statusConfig(ccfg *cliConfig) (*autoupdate.Updater, error) { + ns, err := autoupdate.NewNamespace(plog, ccfg.InstallSuffix, ccfg.DataDir, ccfg.LinkDir) + if err != nil { + return nil, trace.Wrap(err) + } updater, err := autoupdate.NewLocalUpdater(autoupdate.LocalUpdaterConfig{ - DataDir: ccfg.DataDir, - LinkDir: ccfg.LinkDir, - SystemDir: autoupdate.DefaultSystemDir, SelfSetup: ccfg.SelfSetup, Log: plog, - }) + }, ns) + return updater, trace.Wrap(err) +} + +// cmdDisable disables updates. +func cmdDisable(ctx context.Context, ccfg *cliConfig) error { + updater, lockFile, err := initConfig(ccfg) if err != nil { - return trace.Errorf("failed to initialize updater: %w", err) + return trace.Wrap(err, "failed to initialize updater") } - unlock, err := libutils.FSWriteLock(filepath.Join(ccfg.DataDir, lockFileName)) + unlock, err := libutils.FSWriteLock(lockFile) if err != nil { - return trace.Errorf("failed to grab concurrent execution lock: %w", err) + return trace.Wrap(err, "failed to grab concurrent execution lock %s", lockFile) } defer func() { if err := unlock(); err != nil { @@ -240,19 +283,13 @@ func cmdDisable(ctx context.Context, ccfg *cliConfig) error { // cmdUnpin unpins the current version. func cmdUnpin(ctx context.Context, ccfg *cliConfig) error { - updater, err := autoupdate.NewLocalUpdater(autoupdate.LocalUpdaterConfig{ - DataDir: ccfg.DataDir, - LinkDir: ccfg.LinkDir, - SystemDir: autoupdate.DefaultSystemDir, - SelfSetup: ccfg.SelfSetup, - Log: plog, - }) + updater, lockFile, err := initConfig(ccfg) if err != nil { - return trace.Errorf("failed to setup updater: %w", err) + return trace.Wrap(err, "failed to setup updater") } - unlock, err := libutils.FSWriteLock(filepath.Join(ccfg.DataDir, lockFileName)) + unlock, err := libutils.FSWriteLock(lockFile) if err != nil { - return trace.Errorf("failed to grab concurrent execution lock: %w", err) + return trace.Wrap(err, "failed to grab concurrent execution lock %n", lockFile) } defer func() { if err := unlock(); err != nil { @@ -267,21 +304,22 @@ func cmdUnpin(ctx context.Context, ccfg *cliConfig) error { // cmdInstall installs Teleport and sets configuration. func cmdInstall(ctx context.Context, ccfg *cliConfig) error { - updater, err := autoupdate.NewLocalUpdater(autoupdate.LocalUpdaterConfig{ - DataDir: ccfg.DataDir, - LinkDir: ccfg.LinkDir, - SystemDir: autoupdate.DefaultSystemDir, - SelfSetup: ccfg.SelfSetup, - Log: plog, - }) + if ccfg.InstallSuffix != "" { + ns, err := autoupdate.NewNamespace(plog, ccfg.InstallSuffix, ccfg.DataDir, ccfg.LinkDir) + if err != nil { + return trace.Wrap(err) + } + ns.LogWarning(ctx) + } + updater, lockFile, err := initConfig(ccfg) if err != nil { - return trace.Errorf("failed to initialize updater: %w", err) + return trace.Wrap(err, "failed to initialize updater") } // Ensure enable can't run concurrently. - unlock, err := libutils.FSWriteLock(filepath.Join(ccfg.DataDir, lockFileName)) + unlock, err := libutils.FSWriteLock(lockFile) if err != nil { - return trace.Errorf("failed to grab concurrent execution lock: %w", err) + return trace.Wrap(err, "failed to grab concurrent execution lock %s", lockFile) } defer func() { if err := unlock(); err != nil { @@ -296,20 +334,14 @@ func cmdInstall(ctx context.Context, ccfg *cliConfig) error { // cmdUpdate updates Teleport to the version specified by cluster reachable at the proxy address. func cmdUpdate(ctx context.Context, ccfg *cliConfig) error { - updater, err := autoupdate.NewLocalUpdater(autoupdate.LocalUpdaterConfig{ - DataDir: ccfg.DataDir, - LinkDir: ccfg.LinkDir, - SystemDir: autoupdate.DefaultSystemDir, - SelfSetup: ccfg.SelfSetup, - Log: plog, - }) + updater, lockFile, err := initConfig(ccfg) if err != nil { - return trace.Errorf("failed to initialize updater: %w", err) + return trace.Wrap(err, "failed to initialize updater") } // Ensure update can't run concurrently. - unlock, err := libutils.FSWriteLock(filepath.Join(ccfg.DataDir, lockFileName)) + unlock, err := libutils.FSWriteLock(lockFile) if err != nil { - return trace.Errorf("failed to grab concurrent execution lock: %w", err) + return trace.Wrap(err, "failed to grab concurrent execution lock %s", lockFile) } defer func() { if err := unlock(); err != nil { @@ -317,33 +349,27 @@ func cmdUpdate(ctx context.Context, ccfg *cliConfig) error { } }() - if err := updater.Update(ctx); err != nil { + if err := updater.Update(ctx, ccfg.UpdateNow); err != nil { return trace.Wrap(err) } return nil } -// cmdLink creates system package links if no version is linked and auto-updates is disabled. -func cmdLink(ctx context.Context, ccfg *cliConfig) error { - updater, err := autoupdate.NewLocalUpdater(autoupdate.LocalUpdaterConfig{ - DataDir: ccfg.DataDir, - LinkDir: ccfg.LinkDir, - SystemDir: autoupdate.DefaultSystemDir, - SelfSetup: ccfg.SelfSetup, - Log: plog, - }) +// cmdLinkPackage creates system package links if no version is linked and auto-updates is disabled. +func cmdLinkPackage(ctx context.Context, ccfg *cliConfig) error { + updater, lockFile, err := initConfig(ccfg) if err != nil { - return trace.Errorf("failed to initialize updater: %w", err) + return trace.Wrap(err, "failed to initialize updater") } // Skip operation and warn if the updater is currently running. - unlock, err := libutils.FSTryReadLock(filepath.Join(ccfg.DataDir, lockFileName)) + unlock, err := libutils.FSTryReadLock(lockFile) if errors.Is(err, libutils.ErrUnsuccessfulLockTry) { plog.WarnContext(ctx, "Updater is currently running. Skipping package linking.") return nil } if err != nil { - return trace.Errorf("failed to grab concurrent execution lock: %w", err) + return trace.Wrap(err, "failed to grab concurrent execution lock %q", lockFile) } defer func() { if err := unlock(); err != nil { @@ -357,26 +383,21 @@ func cmdLink(ctx context.Context, ccfg *cliConfig) error { return nil } -// cmdUnlink remove system package links. -func cmdUnlink(ctx context.Context, ccfg *cliConfig) error { - updater, err := autoupdate.NewLocalUpdater(autoupdate.LocalUpdaterConfig{ - DataDir: ccfg.DataDir, - LinkDir: ccfg.LinkDir, - SystemDir: autoupdate.DefaultSystemDir, - SelfSetup: ccfg.SelfSetup, - Log: plog, - }) +// cmdUnlinkPackage remove system package links. +func cmdUnlinkPackage(ctx context.Context, ccfg *cliConfig) error { + updater, lockFile, err := initConfig(ccfg) if err != nil { - return trace.Errorf("failed to setup updater: %w", err) + return trace.Wrap(err, "failed to setup updater") } // Error if the updater is running. We could remove its links by accident. - unlock, err := libutils.FSTryWriteLock(filepath.Join(ccfg.DataDir, lockFileName)) + unlock, err := libutils.FSTryWriteLock(lockFile) if errors.Is(err, libutils.ErrUnsuccessfulLockTry) { - return trace.Errorf("updater is currently running") + plog.WarnContext(ctx, "Updater is currently running. Skipping package unlinking.") + return nil } if err != nil { - return trace.Errorf("failed to grab concurrent execution lock: %w", err) + return trace.Wrap(err, "failed to grab concurrent execution lock %q", lockFile) } defer func() { if err := unlock(); err != nil { @@ -392,32 +413,30 @@ func cmdUnlink(ctx context.Context, ccfg *cliConfig) error { // cmdSetup writes configuration files that are needed to run teleport-update update. func cmdSetup(ctx context.Context, ccfg *cliConfig) error { - err := autoupdate.Setup(ctx, plog, ccfg.LinkDir, ccfg.DataDir) + ns, err := autoupdate.NewNamespace(plog, ccfg.InstallSuffix, ccfg.DataDir, ccfg.LinkDir) + if err != nil { + return trace.Wrap(err) + } + err = ns.Setup(ctx) if errors.Is(err, autoupdate.ErrNotSupported) { plog.WarnContext(ctx, "Not enabling systemd service because systemd is not running.") - os.Exit(autoupdate.CodeNotSupported) + return trace.Wrap(err) } if err != nil { - return trace.Errorf("failed to setup teleport-update service: %w", err) + return trace.Wrap(err, "failed to setup teleport-update service") } return nil } // cmdStatus displays auto-update status. func cmdStatus(ctx context.Context, ccfg *cliConfig) error { - updater, err := autoupdate.NewLocalUpdater(autoupdate.LocalUpdaterConfig{ - DataDir: ccfg.DataDir, - LinkDir: ccfg.LinkDir, - SystemDir: autoupdate.DefaultSystemDir, - SelfSetup: ccfg.SelfSetup, - Log: plog, - }) + updater, err := statusConfig(ccfg) if err != nil { - return trace.Errorf("failed to initialize updater: %w", err) + return trace.Wrap(err, "failed to initialize updater") } status, err := updater.Status(ctx) if err != nil { - return trace.Errorf("failed to get status: %w", err) + return trace.Wrap(err, "failed to get status") } enc := yaml.NewEncoder(os.Stdout) return trace.Wrap(enc.Encode(status)) @@ -425,20 +444,14 @@ func cmdStatus(ctx context.Context, ccfg *cliConfig) error { // cmdUninstall removes the updater-managed install of Teleport and gracefully reverts back to the Teleport package. func cmdUninstall(ctx context.Context, ccfg *cliConfig) error { - updater, err := autoupdate.NewLocalUpdater(autoupdate.LocalUpdaterConfig{ - DataDir: ccfg.DataDir, - LinkDir: ccfg.LinkDir, - SystemDir: autoupdate.DefaultSystemDir, - SelfSetup: ccfg.SelfSetup, - Log: plog, - }) + updater, lockFile, err := initConfig(ccfg) if err != nil { - return trace.Errorf("failed to initialize updater: %w", err) + return trace.Wrap(err, "failed to initialize updater") } // Ensure update can't run concurrently. - unlock, err := libutils.FSWriteLock(filepath.Join(ccfg.DataDir, lockFileName)) + unlock, err := libutils.FSWriteLock(lockFile) if err != nil { - return trace.Errorf("failed to grab concurrent execution lock: %w", err) + return trace.Wrap(err, "failed to grab concurrent execution lock %s", lockFile) } defer func() { if err := unlock(); err != nil { diff --git a/tool/tsh/common/app_test.go b/tool/tsh/common/app_test.go index 87b9dcb24239b..9a6d9da771d78 100644 --- a/tool/tsh/common/app_test.go +++ b/tool/tsh/common/app_test.go @@ -24,9 +24,11 @@ import ( "crypto/tls" "encoding/json" "fmt" + "io" "net/http" "net/http/httptest" "os/user" + "strings" "testing" "time" @@ -44,6 +46,7 @@ import ( "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/service/servicecfg" + "github.com/gravitational/teleport/lib/tlsca" testserver "github.com/gravitational/teleport/tool/teleport/testenv" ) @@ -597,3 +600,150 @@ uri: https://test-app.example.com:8443 }) } } + +func TestWriteAppTable(t *testing.T) { + defaultAppListings := []appListing{ + appListing{ + Proxy: "example.com", + Cluster: "foo-cluster", + App: mustMakeNewAppV3(t, types.Metadata{Name: "root-app"}, types.AppSpecV3{ + // Short URLs, because in tests the width of the term is just 80 characters and the public + // address column gets truncated very early. + PublicAddr: "https://root-app.example.com", + URI: "http://localhost:8080", + }), + }, + appListing{ + Proxy: "example.com", + Cluster: "bar-cluster", + App: mustMakeNewAppV3(t, types.Metadata{Name: "leaf-app"}, types.AppSpecV3{ + PublicAddr: "https://leaf-app.example.com", + URI: "http://localhost:4242", + }), + }, + } + + tests := []struct { + name string + config appTableConfig + appListings []appListing + wantHeaders []string + wantNoHeaders []string + wantValues []string + wantNoValues []string + }{ + { + name: "regular list", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: false, + listAll: false, + }, + appListings: defaultAppListings, + wantHeaders: []string{"Application", "Public Address"}, + // Public addresses are expected to be truncated when verbose mode is off. + wantValues: []string{"https://root-app...", "https://leaf-app...", "root-app", "leaf-app"}, + wantNoHeaders: []string{"URI", "Proxy", "Cluster"}, + wantNoValues: []string{"http://localhost:8080", "foo-cluster", "bar-cluster"}, + }, + { + name: "regular list with active app", + config: appTableConfig{ + active: []tlsca.RouteToApp{ + tlsca.RouteToApp{Name: "root-app"}, + }, + verbose: false, + listAll: false, + }, + appListings: defaultAppListings, + wantHeaders: []string{"Application"}, + wantValues: []string{"> root-app", "leaf-app"}, + }, + { + name: "regular list with no apps", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: false, + listAll: false, + }, + appListings: []appListing{}, + wantHeaders: []string{"Application", "Public Address"}, + }, + { + name: "verbose", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: true, + listAll: false, + }, + appListings: defaultAppListings, + wantHeaders: []string{"URI", "Application", "Public Address"}, + wantValues: []string{"http://localhost:8080", "http://localhost:4242", + "https://root-app.example.com", "https://leaf-app.example.com", "root-app", "leaf-app"}, + wantNoHeaders: []string{"Proxy", "Cluster"}, + wantNoValues: []string{"foo-cluster", "bar-cluster"}, + }, + { + name: "list all", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: false, + listAll: true, + }, + appListings: defaultAppListings, + wantHeaders: []string{"Proxy", "Cluster", "Application", "Public Address"}, + // Public addresses are expected to be truncated when verbose mode is off. + wantValues: []string{"foo-cluste...", "bar-cluste...", "example.co...", "https://ro...", "https://le...", "root-app", "leaf-app"}, + wantNoHeaders: []string{"URI"}, + wantNoValues: []string{"http://localhost:8080"}, + }, + { + name: "verbose and list all", + config: appTableConfig{ + active: []tlsca.RouteToApp{}, + verbose: true, + listAll: true, + }, + appListings: defaultAppListings, + wantHeaders: []string{"Proxy", "Cluster", "URI", "Application", "Public Address"}, + wantValues: []string{"foo-cluster", "bar-cluster", "http://localhost:8080", "http://localhost:4242", + "https://root-app.example.com", "https://leaf-app.example.com", "root-app", "leaf-app"}, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + var b bytes.Buffer + w := io.Writer(&b) + + err := writeAppTable(w, test.appListings, test.config) + require.NoError(t, err) + + lines := strings.SplitN(b.String(), "\n", 3) + headers := lines[0] + // The second line contains header separators ("------"), that's why it's skipped here. + values := lines[2] + + for _, wantHeader := range test.wantHeaders { + assert.Contains(t, headers, wantHeader) + } + for _, wantNoHeader := range test.wantNoHeaders { + assert.NotContains(t, headers, wantNoHeader) + } + + for _, wantValue := range test.wantValues { + assert.Contains(t, values, wantValue) + } + for _, wantNoValue := range test.wantNoValues { + assert.NotContains(t, values, wantNoValue) + } + }) + } +} + +func mustMakeNewAppV3(t *testing.T, meta types.Metadata, spec types.AppSpecV3) *types.AppV3 { + t.Helper() + app, err := types.NewAppV3(meta, spec) + require.NoError(t, err) + return app +} diff --git a/tool/tsh/common/git.go b/tool/tsh/common/git.go new file mode 100644 index 0000000000000..1e941c863fa0d --- /dev/null +++ b/tool/tsh/common/git.go @@ -0,0 +1,39 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "github.com/alecthomas/kingpin/v2" +) + +type gitCommands struct { + list *gitListCommand +} + +func newGitCommands(app *kingpin.Application) gitCommands { + git := app.Command("git", "Git server commands.") + cmds := gitCommands{ + newGitListCommand(git), + } + + // TODO(greedy52) hide the commands until all basic features are implemented. + git.Hidden() + cmds.list.Hidden() + return cmds +} diff --git a/tool/tsh/common/git_list.go b/tool/tsh/common/git_list.go new file mode 100644 index 0000000000000..2e70b534565bc --- /dev/null +++ b/tool/tsh/common/git_list.go @@ -0,0 +1,174 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "fmt" + "strings" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport" + apiclient "github.com/gravitational/teleport/api/client" + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/asciitable" + "github.com/gravitational/teleport/lib/client" + "github.com/gravitational/teleport/lib/defaults" +) + +// gitListCommand implements `tsh git ls`. +type gitListCommand struct { + *kingpin.CmdClause + + format string + labels string + predicateExpression string + searchKeywords string + + // fetchFn is the function to fetch git servers. Defaults to c.doFetch. + // Can be set for testing. + fetchFn func(*CLIConf, *client.TeleportClient) ([]types.Server, error) +} + +func newGitListCommand(parent *kingpin.CmdClause) *gitListCommand { + cmd := &gitListCommand{ + CmdClause: parent.Command("ls", "List Git servers."), + } + cmd.Flag("format", defaults.FormatFlagDescription(defaults.DefaultFormats...)). + Short('f'). + Default(teleport.Text). + EnumVar(&cmd.format, defaults.DefaultFormats...) + + cmd.Flag("search", searchHelp).StringVar(&cmd.searchKeywords) + cmd.Flag("query", queryHelp).StringVar(&cmd.predicateExpression) + cmd.Arg("labels", labelHelp).StringVar(&cmd.labels) + return cmd +} + +func (c *gitListCommand) run(cf *CLIConf) error { + c.init(cf) + + tc, err := makeClient(cf) + if err != nil { + return trace.Wrap(err) + } + + servers, err := c.fetchFn(cf, tc) + if err != nil { + return trace.Wrap(err) + } + return printGitServers(cf, servers) +} + +func (c *gitListCommand) init(cf *CLIConf) { + cf.Format = c.format + cf.Labels = c.labels + cf.PredicateExpression = c.predicateExpression + cf.SearchKeywords = c.searchKeywords + + if c.fetchFn == nil { + c.fetchFn = c.doFetch + } +} + +func (c *gitListCommand) doFetch(cf *CLIConf, tc *client.TeleportClient) ([]types.Server, error) { + var resources types.EnrichedResources + err := client.RetryWithRelogin(cf.Context, tc, func() error { + client, err := tc.ConnectToCluster(cf.Context) + if err != nil { + return trace.Wrap(err) + } + defer client.Close() + + resources, err = apiclient.GetAllUnifiedResources(cf.Context, client.AuthClient, &proto.ListUnifiedResourcesRequest{ + Kinds: []string{types.KindGitServer}, + SortBy: types.SortBy{Field: types.ResourceMetadataName}, + SearchKeywords: tc.SearchKeywords, + PredicateExpression: tc.PredicateExpression, + }) + return trace.Wrap(err) + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resources.ToResourcesWithLabels().AsServers() +} + +func printGitServers(cf *CLIConf, servers []types.Server) error { + format := strings.ToLower(cf.Format) + switch format { + case teleport.Text, "": + return printGitServersAsText(cf, servers) + case teleport.JSON, teleport.YAML: + out, err := serializeNodes(servers, format) + if err != nil { + return trace.Wrap(err) + } + if _, err := fmt.Fprintln(cf.Stdout(), out); err != nil { + return trace.Wrap(err) + } + return nil + default: + return trace.BadParameter("unsupported format %q", format) + } +} + +func printGitServersAsText(cf *CLIConf, servers []types.Server) error { + var rows [][]string + var showLoginNote bool + for _, server := range servers { + // TODO(greedy52) fill in GitHub login when available from Profile. + login := "(n/a)*" + showLoginNote = true + + if github := server.GetGitHub(); github != nil { + rows = append(rows, []string{ + "GitHub", + github.Organization, + login, + github.GetOrganizationURL(), + }) + } else { + return trace.BadParameter("expecting Git server but got %v", server.GetKind()) + } + } + + t := asciitable.MakeTable([]string{"Type", "Organization", "Username", "URL"}, rows...) + if _, err := fmt.Fprintln(cf.Stdout(), t.AsBuffer().String()); err != nil { + return trace.Wrap(err) + } + + if showLoginNote { + fmt.Fprint(cf.Stdout(), gitLoginNote) + } + + fmt.Fprint(cf.Stdout(), gitCommandsGeneralHint) + return nil +} + +const gitLoginNote = "" + + "(n/a)*: Username will be retrieved automatically upon running git commands.\n" + + " Alternatively, run `tsh git login --github-org `.\n\n" + +const gitCommandsGeneralHint = "" + + "hint: use 'tsh git clone ' to clone a new repository\n" + + " use 'tsh git config update' to configure an existing repository to use Teleport\n" + + " once the repository is cloned or configured, use 'git' as normal\n\n" diff --git a/tool/tsh/common/git_list_test.go b/tool/tsh/common/git_list_test.go new file mode 100644 index 0000000000000..071bf0765e61e --- /dev/null +++ b/tool/tsh/common/git_list_test.go @@ -0,0 +1,136 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "bytes" + "fmt" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/profile" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client" +) + +func makeGitServer(t *testing.T, gitHubOrg string) types.Server { + t.Helper() + server, err := types.NewGitHubServer( + types.GitHubServerMetadata{ + Integration: gitHubOrg, + Organization: gitHubOrg, + }) + require.NoError(t, err) + return server +} + +func TestGitListCommand(t *testing.T) { + server1 := makeGitServer(t, "org1") + server2 := makeGitServer(t, "org2") + + tests := []struct { + name string + format string + fetchFn func(*CLIConf, *client.TeleportClient) ([]types.Server, error) + wantError bool + containsOutput []string + }{ + { + name: "fetch error", + fetchFn: func(c *CLIConf, client *client.TeleportClient) ([]types.Server, error) { + return nil, trace.ConnectionProblem(fmt.Errorf("bad connection"), "bad connection") + }, + wantError: true, + }, + { + name: "text format", + fetchFn: func(c *CLIConf, client *client.TeleportClient) ([]types.Server, error) { + return []types.Server{server1, server2}, nil + }, + containsOutput: []string{ + "Type Organization Username URL", + "GitHub org1 (n/a)* https://github.com/org1", + "GitHub org2 (n/a)* https://github.com/org2", + }, + }, + { + name: "json format", + format: "json", + fetchFn: func(c *CLIConf, client *client.TeleportClient) ([]types.Server, error) { + return []types.Server{server1, server2}, nil + }, + containsOutput: []string{ + `"kind": "git_server"`, + `"hostname": "org1.github-org"`, + `"hostname": "org2.github-org"`, + }, + }, + { + name: "yaml format", + format: "yaml", + fetchFn: func(c *CLIConf, client *client.TeleportClient) ([]types.Server, error) { + return []types.Server{server1, server2}, nil + }, + containsOutput: []string{ + "- kind: git_server", + "hostname: org1.github-org", + "hostname: org2.github-org", + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + var capture bytes.Buffer + cf := &CLIConf{ + Proxy: "proxy", + Username: "alice", + OverrideStdout: &capture, + HomePath: t.TempDir(), + } + + // Create a empty profile so we don't ping proxy. + clientStore, err := initClientStore(cf, cf.Proxy) + require.NoError(t, err) + profile := &profile.Profile{ + SSHProxyAddr: "proxy:3023", + WebProxyAddr: "proxy:3080", + } + err = clientStore.SaveProfile(profile, true) + require.NoError(t, err) + + cmd := gitListCommand{ + format: test.format, + fetchFn: test.fetchFn, + } + + err = cmd.run(cf) + if test.wantError { + require.Error(t, err) + } else { + require.NoError(t, err) + for _, output := range test.containsOutput { + require.Contains(t, capture.String(), output) + } + } + }) + } +} diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index 8c51c89641eda..5ea5324efa467 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -1242,6 +1242,8 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { vnetAdminSetupCmd := newVnetAdminSetupCommand(app) vnetDaemonCmd := newVnetDaemonCommand(app) + gitCmd := newGitCommands(app) + if runtime.GOOS == constants.WindowsOS { bench.Hidden() } @@ -1619,6 +1621,8 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { err = vnetAdminSetupCmd.run(&cf) case vnetDaemonCmd.FullCommand(): err = vnetDaemonCmd.run(&cf) + case gitCmd.list.FullCommand(): + err = gitCmd.list.run(&cf) default: // Handle commands that might not be available. switch { @@ -2823,13 +2827,26 @@ func showApps(apps []types.Application, active []tlsca.RouteToApp, w io.Writer, format = strings.ToLower(format) switch format { case teleport.Text, "": - showAppsAsText(apps, active, verbose, w) + appListings := make([]appListing, 0, len(apps)) + for _, app := range apps { + appListings = append(appListings, appListing{App: app}) + } + + if err := writeAppTable(w, appListings, appTableConfig{ + listAll: false, // showApps lists apps from a single cluster. + active: active, + verbose: verbose, + }); err != nil { + return trace.Wrap(err) + } case teleport.JSON, teleport.YAML: out, err := serializeApps(apps, format) if err != nil { return trace.Wrap(err) } - fmt.Fprintln(w, out) + if _, err := fmt.Fprintln(w, out); err != nil { + return trace.Wrap(err) + } default: return trace.BadParameter("unsupported format %q", format) } @@ -2850,46 +2867,118 @@ func serializeApps(apps []types.Application, format string) (string, error) { return string(out), trace.Wrap(err) } -func getAppRow(proxy, cluster string, app types.Application, active []tlsca.RouteToApp, verbose bool) []string { - var row []string - if proxy != "" && cluster != "" { - row = append(row, proxy, cluster) - } +type appTableConfig struct { + // active is a list of apps for which the user retrieved a short-lived cert with tsh app login. + active []tlsca.RouteToApp + // verbose makes the table show extra columns. + verbose bool + // listAll makes the table render two extra columns: Proxy and Cluster. + listAll bool +} - name := app.GetName() - for _, a := range active { - if name == a.Name { - name = fmt.Sprintf("> %v", name) - break - } - } +func writeAppTable(w io.Writer, appListings []appListing, config appTableConfig) error { + getName := func(app types.Application) string { + isActive := slices.ContainsFunc(config.active, func(route tlsca.RouteToApp) bool { + // TODO(ravicious): This should be based on name _and_ route.ClusterName, so that we don't + // incorrectly show multiple apps with the same name but from different clusters as active. + // However, to do this we'd need to double check if route.ClusterName always matches + // appListing.Cluster (and also fill out that field in showApps). + return route.Name == app.GetName() + }) - labels := common.FormatLabels(app.GetAllLabels(), verbose) - if verbose { - row = append(row, name, app.GetDescription(), app.GetProtocol(), app.GetPublicAddr(), app.GetURI(), labels) - } else { - row = append(row, name, app.GetDescription(), app.GetProtocol(), app.GetPublicAddr(), labels) - } + if isActive { + return fmt.Sprintf("> %s", app.GetName()) + } + + return app.GetName() + } + getLabels := func(app types.Application) string { + return common.FormatLabels(app.GetAllLabels(), config.verbose) + } + + const labelsColumn = "Labels" + allColumns := []appTableColumn{ + appTableColumn{ + name: "Proxy", + getFromListing: appListing.GetProxy, + hide: !config.listAll, + }, + appTableColumn{ + name: "Cluster", + getFromListing: appListing.GetCluster, + hide: !config.listAll, + }, + appTableColumn{ + name: "Application", + get: getName, + }, + appTableColumn{ + name: "Description", + get: types.Application.GetDescription, + }, + appTableColumn{ + name: "Type", + get: types.Application.GetProtocol, + }, + appTableColumn{ + name: "Public Address", + get: types.Application.GetPublicAddr, + }, + appTableColumn{ + name: "URI", + get: types.Application.GetURI, + hide: !config.verbose, + }, + appTableColumn{ + name: labelsColumn, + get: getLabels, + }, + } + columns := slices.DeleteFunc(allColumns, func(column appTableColumn) bool { return column.hide }) + + headers := make([]string, 0, len(columns)) + for _, column := range columns { + headers = append(headers, column.name) + } + + rows := make([][]string, 0, len(appListings)) + for _, appListing := range appListings { + appRow := make([]string, 0, len(columns)) + + for _, column := range columns { + var content string + switch { + case column.get != nil: + content = column.get(appListing.App) + case column.getFromListing != nil: + content = column.getFromListing(appListing) + } - return row -} + appRow = append(appRow, content) + } -func showAppsAsText(apps []types.Application, active []tlsca.RouteToApp, verbose bool, w io.Writer) { - var rows [][]string - for _, app := range apps { - rows = append(rows, getAppRow("", "", app, active, verbose)) + rows = append(rows, appRow) } - // In verbose mode, print everything on a single line and include host UUID. + + // In verbose mode, print everything on a single line. // In normal mode, chunk the labels, print two per line and allow multiple - // lines per node. + // lines per app. var t asciitable.Table - if verbose { - t = asciitable.MakeTable([]string{"Application", "Description", "Type", "Public Address", "URI", "Labels"}, rows...) + if config.verbose { + t = asciitable.MakeTable(headers, rows...) } else { - t = asciitable.MakeTableWithTruncatedColumn( - []string{"Application", "Description", "Type", "Public Address", "Labels"}, rows, "Labels") + t = asciitable.MakeTableWithTruncatedColumn(headers, rows, labelsColumn) } - fmt.Fprintln(w, t.AsBuffer().String()) + + _, err := fmt.Fprintln(w, t.AsBuffer().String()) + return trace.Wrap(err) +} + +type appTableColumn struct { + name string + get func(app types.Application) string + getFromListing func(listing appListing) string + hide bool } func showDatabases(cf *CLIConf, databases []types.Database, active []tlsca.RouteToDatabase, accessChecker services.AccessChecker) error { @@ -5218,6 +5307,14 @@ type appListing struct { App types.Application `json:"app"` } +func (al appListing) GetProxy() string { + return al.Proxy +} + +func (al appListing) GetCluster() string { + return al.Cluster +} + type appListings []appListing func (l appListings) Len() int { @@ -5327,37 +5424,28 @@ func listAppsAllClusters(cf *CLIConf) error { format := strings.ToLower(cf.Format) switch format { case teleport.Text, "": - printAppsWithClusters(listings, active, cf.Verbose) + if err := writeAppTable(cf.Stdout(), listings, appTableConfig{ + listAll: true, + active: active, + verbose: cf.Verbose, + }); err != nil { + return trace.Wrap(err) + } + case teleport.JSON, teleport.YAML: out, err := serializeAppsWithClusters(listings, format) if err != nil { return trace.Wrap(err) } - fmt.Fprintln(cf.Stdout(), out) + if _, err := fmt.Fprintln(cf.Stdout(), out); err != nil { + return trace.Wrap(err) + } default: return trace.BadParameter("unsupported format %q", format) } return nil } -func printAppsWithClusters(apps []appListing, active []tlsca.RouteToApp, verbose bool) { - var rows [][]string - for _, app := range apps { - rows = append(rows, getAppRow(app.Proxy, app.Cluster, app.App, active, verbose)) - } - // In verbose mode, print everything on a single line and include host UUID. - // In normal mode, chunk the labels, print two per line and allow multiple - // lines per node. - var t asciitable.Table - if verbose { - t = asciitable.MakeTable([]string{"Proxy", "Cluster", "Application", "Description", "Type", "Public Address", "URI", "Labels"}, rows...) - } else { - t = asciitable.MakeTableWithTruncatedColumn( - []string{"Proxy", "Cluster", "Application", "Description", "Type", "Public Address", "Labels"}, rows, "Labels") - } - fmt.Println(t.AsBuffer().String()) -} - func serializeAppsWithClusters(apps []appListing, format string) (string, error) { var out []byte var err error diff --git a/web/packages/build/jest/jest-environment-patched-jsdom.js b/web/packages/build/jest/jest-environment-patched-jsdom.js index 642a360b9e395..7240299f7138a 100644 --- a/web/packages/build/jest/jest-environment-patched-jsdom.js +++ b/web/packages/build/jest/jest-environment-patched-jsdom.js @@ -1,4 +1,6 @@ import { TextEncoder, TextDecoder } from 'node:util'; +import { BroadcastChannel } from 'node:worker_threads'; +import { TransformStream } from 'node:stream/web'; import { TestEnvironment as JSDOMEnvironment } from 'jest-environment-jsdom'; @@ -48,6 +50,15 @@ export default class PatchedJSDOMEnvironment extends JSDOMEnvironment { dispatchEvent: () => {}, }); } + + // TODO(ravicious): JSDOM doesn't have BroadcastChannel and TransformStream which are used by msw. + // https://github.com/mswjs/msw/issues/2340 + if (!global.BroadcastChannel) { + global.BroadcastChannel = BroadcastChannel; + } + if (!global.TransformStream) { + global.TransformStream = TransformStream; + } } } export const TestEnvironment = PatchedJSDOMEnvironment; diff --git a/web/packages/build/package.json b/web/packages/build/package.json index e83e6d9c068b1..72ba908e15b14 100644 --- a/web/packages/build/package.json +++ b/web/packages/build/package.json @@ -10,30 +10,30 @@ "directory": "packages/build" }, "dependencies": { - "@babel/core": "^7.25.2", - "@babel/preset-env": "^7.25.4", - "@babel/preset-react": "^7.24.7", - "@babel/preset-typescript": "^7.24.7", - "@swc/core": "^1.7.26", + "@babel/core": "^7.26.0", + "@babel/preset-env": "^7.26.0", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.26.0", + "@swc/core": "^1.9.3", "@swc/plugin-styled-components": "^5.0.0", "@types/jsdom": "^21.1.7", - "@vitejs/plugin-react-swc": "^3.7.1", + "@vitejs/plugin-react-swc": "^3.7.2", "babel-plugin-styled-components": "^2.1.4", "eslint": "^8.56.0", "eslint-import-resolver-typescript": "^3.6.3", "eslint-plugin-babel": "^5.3.1", - "eslint-plugin-import": "2.30.0", - "eslint-plugin-jest": "^28.8.3", - "eslint-plugin-jest-dom": "^5.4.0", - "eslint-plugin-react": "^7.37.0", + "eslint-plugin-import": "2.31.0", + "eslint-plugin-jest": "^28.9.0", + "eslint-plugin-jest-dom": "^5.5.0", + "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-testing-library": "^6.3.0", "jest-environment-jsdom": "^29.7.0", - "jest-fail-on-console": "^3.3.0", + "jest-fail-on-console": "^3.3.1", "jsdom": "^25.0.1", "rollup-plugin-visualizer": "^5.12.0", - "typescript-eslint": "^8.12.2", + "typescript-eslint": "^8.16.0", "vite-plugin-wasm": "^3.3.0", - "vite-tsconfig-paths": "^5.0.1" + "vite-tsconfig-paths": "^5.1.3" } } diff --git a/web/packages/design/package.json b/web/packages/design/package.json index 9cc7577f44305..c676d82acac15 100644 --- a/web/packages/design/package.json +++ b/web/packages/design/package.json @@ -16,7 +16,7 @@ }, "devDependencies": { "@gravitational/build": "workspace:*", - "@types/styled-system": "^5.1.22", + "@types/styled-system": "^5.1.23", "jest-styled-components": "^7.2.0" } } diff --git a/web/packages/design/src/Alert/Alert.tsx b/web/packages/design/src/Alert/Alert.tsx index 68c5487b7788e..f8ce4b7269310 100644 --- a/web/packages/design/src/Alert/Alert.tsx +++ b/web/packages/design/src/Alert/Alert.tsx @@ -22,6 +22,8 @@ import { style, color, ColorProps } from 'styled-system'; import { IconProps } from 'design/Icon/Icon'; +import { StatusIcon, StatusKind } from 'design/StatusIcon'; + import { space, SpaceProps, width, WidthProps } from '../system'; import { Theme } from '../theme'; import * as Icon from '../Icon'; @@ -193,7 +195,12 @@ export const Alert = ({ - + ` ${backgroundColor} `; -const AlertIcon = ({ - kind, - customIcon: CustomIcon, - ...otherProps -}: { - kind: AlertKind | BannerKind; - customIcon?: React.ComponentType; -} & IconProps) => { - const commonProps = { role: 'graphics-symbol', ...otherProps }; - if (CustomIcon) { - return ; - } - switch (kind) { - case 'success': - return ; - case 'danger': - case 'outline-danger': - return ; - case 'info': - case 'outline-info': - return ; - case 'warning': - case 'outline-warn': - return ; - case 'neutral': - case 'primary': - return ; - } -}; - const iconContainerStyles = ({ kind, theme, @@ -468,7 +445,12 @@ export const Banner = ({ gap={3} alignItems="center" > - + {children} {details} @@ -525,3 +507,18 @@ const bannerColors = (theme: Theme, kind: BannerKind) => { }; } }; + +const iconKind = (kind: AlertKind | BannerKind): StatusKind => { + switch (kind) { + case 'outline-danger': + return 'danger'; + case 'outline-warn': + return 'warning'; + case 'outline-info': + return 'info'; + case 'primary': + return 'neutral'; + default: + return kind; + } +}; diff --git a/web/packages/design/src/Button/Button.test.tsx b/web/packages/design/src/Button/Button.test.tsx index 5310cb9c02151..8f4528e102baf 100644 --- a/web/packages/design/src/Button/Button.test.tsx +++ b/web/packages/design/src/Button/Button.test.tsx @@ -16,11 +16,21 @@ * along with this program. If not, see . */ -import React from 'react'; +import React, { + ComponentPropsWithoutRef, + ComponentPropsWithRef, + PropsWithChildren, +} from 'react'; -import { render, theme } from 'design/utils/testing'; +import { render, theme, screen } from 'design/utils/testing'; -import { Button, ButtonPrimary, ButtonSecondary, ButtonWarning } from './index'; +import { + Button, + ButtonPrimary, + ButtonSecondary, + ButtonWarning, + ButtonSize, +} from './index'; describe('design/Button', () => { it('renders a