diff --git a/.github/workflows/post-release.yaml b/.github/workflows/post-release.yaml index 05e12675db625..df1c33bb64798 100644 --- a/.github/workflows/post-release.yaml +++ b/.github/workflows/post-release.yaml @@ -94,12 +94,17 @@ jobs: git config --global user.email "noreply@github.com" git config --global user.name "GitHub" + # get Go version from go.mod (preferring the toolchain directive if it's present) + GO_VERSION=$(go mod edit -json | jq -r 'if has("Toolchain") then .Toolchain | sub("go"; "") else .Go end') + # update versions in docs/config.json # for docker images replace version number after : jq --arg major "${MAJOR_VERSION}" \ --arg version "${FULL_VERSION}" \ + --arg go_version "${GO_VERSION}" \ '.variables.teleport.major_version |= $major | .variables.teleport.version |= $version | + .variables.teleport.golang |= $go_version | .variables.teleport.plugin.version |= $version | .variables.teleport.latest_oss_docker_image |= sub(":.*";":")+$version | .variables.teleport.latest_oss_debug_docker_image |= sub(":.*";":")+$version | diff --git a/CHANGELOG.md b/CHANGELOG.md index ee71831450a81..879bcb05bf4c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,33 @@ # Changelog +## 17.0.4 (12/5/2024) + +* Fixed a bug introduced in 17.0.3 breaking in-cluster joining on some Kubernetes clusters. [#49841](https://github.com/gravitational/teleport/pull/49841) +* SSH or Kubernetes information included for audit log list for start session events. [#49832](https://github.com/gravitational/teleport/pull/49832) +* Avoid tight web session renewals for sessions with short TTL (between 3m and 30s). [#49768](https://github.com/gravitational/teleport/pull/49768) +* Updated Go to 1.23.4. [#49758](https://github.com/gravitational/teleport/pull/49758) +* Fixed re-rendering bug when filtering Unified Resources. [#49744](https://github.com/gravitational/teleport/pull/49744) + +## 17.0.3 (12/3/2024) + +* Restore ability to disable multi-factor authentication for local users. [#49692](https://github.com/gravitational/teleport/pull/49692) +* Bumping one of our dependencies to a more secure version to address CVE-2024-53259. [#49662](https://github.com/gravitational/teleport/pull/49662) +* Add ability to configure resource labels in `teleport-cluster`'s operator sub-chart. [#49647](https://github.com/gravitational/teleport/pull/49647) +* Fixed proxy peering listener not using the exact address specified in `peer_listen_addr`. [#49589](https://github.com/gravitational/teleport/pull/49589) +* Teleport Connect now shows whether it is being used on a trusted device or if enrollment is required for full access. [#49577](https://github.com/gravitational/teleport/pull/49577) +* Kubernetes in-cluster joining now also accepts tokens whose audience is the Teleport cluster name (before it only allowed the default Kubernetes audience). Kubernetes JWKS joining is unchanged and still requires tokens with the cluster name in the audience. [#49556](https://github.com/gravitational/teleport/pull/49556) +* Session recording playback in the web UI is now searchable. [#49506](https://github.com/gravitational/teleport/pull/49506) +* Fixed an incorrect warning indicating that tsh v17.0.2 was incompatible with cluster v17.0.1, despite full compatibility. [#49491](https://github.com/gravitational/teleport/pull/49491) +* Increase CockroachDB setup timeout from 5 to 30 seconds. This mitigates the Auth Service not being able to configure TTL on slow CockroachDB event backends. [#49469](https://github.com/gravitational/teleport/pull/49469) +* Fixed a potential panic in login rule and SAML IdP expression parser. [#49429](https://github.com/gravitational/teleport/pull/49429) +* Support for long-running kube exec/port-forward, respect client_idle_timeout config. [#49421](https://github.com/gravitational/teleport/pull/49421) +* Fixed a permissions error with Postgres database user auto-provisioning that occurs when the database admin is not a superuser and the database is upgraded to Postgres v16 or higher. [#49390](https://github.com/gravitational/teleport/pull/49390) + +Enterprise: +* Jamf Service sync audit events are attributed to "Jamf Service". +* Users can now see a list of their enrolled devices on their Account page. +* Add support for Entra ID groups being members of other groups using Nested Access Lists. + ## 17.0.2 (11/25/2024) * Fixed missing user participants in session recordings listing for non-interactive Kubernetes recordings. [#49343](https://github.com/gravitational/teleport/pull/49343) diff --git a/Cargo.lock b/Cargo.lock index 10426a2791182..e62135285d28c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2400,7 +2400,6 @@ dependencies = [ "aws-lc-rs", "log", "once_cell", - "ring", "rustls-pki-types", "rustls-webpki", "subtle", diff --git a/Makefile b/Makefile index daa8e96b862ed..ba8d83de4a6db 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ # Stable releases: "1.0.0" # Pre-releases: "1.0.0-alpha.1", "1.0.0-beta.2", "1.0.0-rc.3" # Master/dev branch: "1.0.0-dev" -VERSION=17.0.2 +VERSION=17.0.4 DOCKER_IMAGE ?= teleport 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 a9b8c665de599..eb405a343f567 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -3806,6 +3806,12 @@ 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() + case types.KindIdentityCenterAccountAssignment: + src := respResource.GetIdentityCenterAccountAssignment() + dst := proto.UnpackICAccountAssignment(src) + resources[i] = dst default: return nil, trace.NotImplemented("resource type %s does not support pagination", req.ResourceType) } diff --git a/api/client/events.go b/api/client/events.go index 89e5b5ecc3157..c7d9d8c51d14b 100644 --- a/api/client/events.go +++ b/api/client/events.go @@ -30,6 +30,7 @@ import ( provisioningv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/provisioning/v1" userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v2" usertasksv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" + workloadidentityv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" accesslistv1conv "github.com/gravitational/teleport/api/types/accesslist/convert/v1" @@ -135,6 +136,10 @@ func EventToGRPC(in types.Event) (*proto.Event, error) { out.Resource = &proto.Event_IdentityCenterAccountAssignment{ IdentityCenterAccountAssignment: r, } + case *workloadidentityv1pb.WorkloadIdentity: + out.Resource = &proto.Event_WorkloadIdentity{ + WorkloadIdentity: r, + } default: return nil, trace.BadParameter("resource type %T is not supported", r) } @@ -609,6 +614,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.GetWorkloadIdentity(); r != nil { + out.Resource = types.Resource153ToLegacy(r) + return &out, nil } else { return nil, trace.BadParameter("received unsupported resource %T", in.Resource) } diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 9e6c582bec7c4..d70547fd44ffc 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -10628,6 +10628,249 @@ func (m *CreateRegisterChallengeRequest) GetDeviceUsage() DeviceUsage { return DeviceUsage_DEVICE_USAGE_UNSPECIFIED } +// IdentityCenterAccount holds information about an Identity Center account +// within an IdentityCenterAccountAssignment +type IdentityCenterAccount struct { + // ID is the AWS-assigned account ID + ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` + // ARN is the full Amazon Resource Name for the AWS account + ARN string `protobuf:"bytes,2,opt,name=ARN,proto3" json:"ARN,omitempty"` + // AccountName is the human-readable name of the account + AccountName string `protobuf:"bytes,3,opt,name=AccountName,proto3" json:"AccountName,omitempty"` + // Description is a free text description of the account + Description string `protobuf:"bytes,4,opt,name=Description,proto3" json:"Description,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IdentityCenterAccount) Reset() { *m = IdentityCenterAccount{} } +func (m *IdentityCenterAccount) String() string { return proto.CompactTextString(m) } +func (*IdentityCenterAccount) ProtoMessage() {} +func (*IdentityCenterAccount) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffcffcda38ae159, []int{156} +} +func (m *IdentityCenterAccount) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IdentityCenterAccount) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IdentityCenterAccount.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 *IdentityCenterAccount) XXX_Merge(src proto.Message) { + xxx_messageInfo_IdentityCenterAccount.Merge(m, src) +} +func (m *IdentityCenterAccount) XXX_Size() int { + return m.Size() +} +func (m *IdentityCenterAccount) XXX_DiscardUnknown() { + xxx_messageInfo_IdentityCenterAccount.DiscardUnknown(m) +} + +var xxx_messageInfo_IdentityCenterAccount proto.InternalMessageInfo + +func (m *IdentityCenterAccount) GetID() string { + if m != nil { + return m.ID + } + return "" +} + +func (m *IdentityCenterAccount) GetARN() string { + if m != nil { + return m.ARN + } + return "" +} + +func (m *IdentityCenterAccount) GetAccountName() string { + if m != nil { + return m.AccountName + } + return "" +} + +func (m *IdentityCenterAccount) GetDescription() string { + if m != nil { + return m.Description + } + return "" +} + +// IdentityCenterPermissionSet holds information about an Identity Center +// permission set within an IdentityCenterAccountAssignment +type IdentityCenterPermissionSet struct { + // ARN is the full Amazon Resource Name for the Permission Set + ARN string `protobuf:"bytes,1,opt,name=ARN,proto3" json:"ARN,omitempty"` + // Name is the human readable name for the Permission Set + Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IdentityCenterPermissionSet) Reset() { *m = IdentityCenterPermissionSet{} } +func (m *IdentityCenterPermissionSet) String() string { return proto.CompactTextString(m) } +func (*IdentityCenterPermissionSet) ProtoMessage() {} +func (*IdentityCenterPermissionSet) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffcffcda38ae159, []int{157} +} +func (m *IdentityCenterPermissionSet) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IdentityCenterPermissionSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IdentityCenterPermissionSet.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 *IdentityCenterPermissionSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_IdentityCenterPermissionSet.Merge(m, src) +} +func (m *IdentityCenterPermissionSet) XXX_Size() int { + return m.Size() +} +func (m *IdentityCenterPermissionSet) XXX_DiscardUnknown() { + xxx_messageInfo_IdentityCenterPermissionSet.DiscardUnknown(m) +} + +var xxx_messageInfo_IdentityCenterPermissionSet proto.InternalMessageInfo + +func (m *IdentityCenterPermissionSet) GetARN() string { + if m != nil { + return m.ARN + } + return "" +} + +func (m *IdentityCenterPermissionSet) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +// IdentityCenterAccountAssignment represents a requestable Identity Center +// Account Assignment. This is strictly a wire-format object for use with the +// Unfied resource cache, and the types defined in the `identitycenter` package +// should be used for actual processing. +type IdentityCenterAccountAssignment struct { + // Kind is the database server resource kind. + Kind string `protobuf:"bytes,1,opt,name=Kind,proto3" json:"kind"` + // SubKind is an optional resource subkind. + SubKind string `protobuf:"bytes,2,opt,name=SubKind,proto3" json:"sub_kind,omitempty"` + // Version is the resource version. + Version string `protobuf:"bytes,3,opt,name=Version,proto3" json:"version"` + // Metadata is the account metadata. + Metadata types.Metadata `protobuf:"bytes,4,opt,name=Metadata,proto3" json:"metadata"` + // DisplayName is a human-readable name for the Account assignment + DisplayName string `protobuf:"bytes,5,opt,name=DisplayName,proto3" json:"DisplayName,omitempty"` + // Account is the Identity Center Account this assigment references + Account *IdentityCenterAccount `protobuf:"bytes,6,opt,name=Account,proto3" json:"Account,omitempty"` + // PermissionSet is the Identity Center Permission Set this assignment + // references + PermissionSet *IdentityCenterPermissionSet `protobuf:"bytes,7,opt,name=PermissionSet,proto3" json:"PermissionSet,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IdentityCenterAccountAssignment) Reset() { *m = IdentityCenterAccountAssignment{} } +func (m *IdentityCenterAccountAssignment) String() string { return proto.CompactTextString(m) } +func (*IdentityCenterAccountAssignment) ProtoMessage() {} +func (*IdentityCenterAccountAssignment) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffcffcda38ae159, []int{158} +} +func (m *IdentityCenterAccountAssignment) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IdentityCenterAccountAssignment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IdentityCenterAccountAssignment.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 *IdentityCenterAccountAssignment) XXX_Merge(src proto.Message) { + xxx_messageInfo_IdentityCenterAccountAssignment.Merge(m, src) +} +func (m *IdentityCenterAccountAssignment) XXX_Size() int { + return m.Size() +} +func (m *IdentityCenterAccountAssignment) XXX_DiscardUnknown() { + xxx_messageInfo_IdentityCenterAccountAssignment.DiscardUnknown(m) +} + +var xxx_messageInfo_IdentityCenterAccountAssignment proto.InternalMessageInfo + +func (m *IdentityCenterAccountAssignment) GetKind() string { + if m != nil { + return m.Kind + } + return "" +} + +func (m *IdentityCenterAccountAssignment) GetSubKind() string { + if m != nil { + return m.SubKind + } + return "" +} + +func (m *IdentityCenterAccountAssignment) GetVersion() string { + if m != nil { + return m.Version + } + return "" +} + +func (m *IdentityCenterAccountAssignment) GetMetadata() types.Metadata { + if m != nil { + return m.Metadata + } + return types.Metadata{} +} + +func (m *IdentityCenterAccountAssignment) GetDisplayName() string { + if m != nil { + return m.DisplayName + } + return "" +} + +func (m *IdentityCenterAccountAssignment) GetAccount() *IdentityCenterAccount { + if m != nil { + return m.Account + } + return nil +} + +func (m *IdentityCenterAccountAssignment) GetPermissionSet() *IdentityCenterPermissionSet { + if m != nil { + return m.PermissionSet + } + return nil +} + // PaginatedResource represents one of the supported resources. type PaginatedResource struct { // Resource is the resource itself. @@ -10644,6 +10887,7 @@ type PaginatedResource struct { // *PaginatedResource_UserGroup // *PaginatedResource_AppServerOrSAMLIdPServiceProvider // *PaginatedResource_SAMLIdPServiceProvider + // *PaginatedResource_IdentityCenterAccountAssignment 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"` @@ -10659,7 +10903,7 @@ func (m *PaginatedResource) Reset() { *m = PaginatedResource{} } func (m *PaginatedResource) String() string { return proto.CompactTextString(m) } func (*PaginatedResource) ProtoMessage() {} func (*PaginatedResource) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{156} + return fileDescriptor_0ffcffcda38ae159, []int{159} } func (m *PaginatedResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10727,6 +10971,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_IdentityCenterAccountAssignment struct { + IdentityCenterAccountAssignment *IdentityCenterAccountAssignment `protobuf:"bytes,16,opt,name=IdentityCenterAccountAssignment,proto3,oneof" json:"identity_center_account_assignment,omitempty"` +} func (*PaginatedResource_DatabaseServer) isPaginatedResource_Resource() {} func (*PaginatedResource_AppServer) isPaginatedResource_Resource() {} @@ -10739,6 +10986,7 @@ func (*PaginatedResource_DatabaseService) isPaginatedResource_Resource() func (*PaginatedResource_UserGroup) isPaginatedResource_Resource() {} func (*PaginatedResource_AppServerOrSAMLIdPServiceProvider) isPaginatedResource_Resource() {} func (*PaginatedResource_SAMLIdPServiceProvider) isPaginatedResource_Resource() {} +func (*PaginatedResource_IdentityCenterAccountAssignment) isPaginatedResource_Resource() {} func (m *PaginatedResource) GetResource() isPaginatedResource_Resource { if m != nil { @@ -10825,6 +11073,13 @@ func (m *PaginatedResource) GetSAMLIdPServiceProvider() *types.SAMLIdPServicePro return nil } +func (m *PaginatedResource) GetIdentityCenterAccountAssignment() *IdentityCenterAccountAssignment { + if x, ok := m.GetResource().(*PaginatedResource_IdentityCenterAccountAssignment); ok { + return x.IdentityCenterAccountAssignment + } + return nil +} + func (m *PaginatedResource) GetLogins() []string { if m != nil { return m.Logins @@ -10853,6 +11108,7 @@ func (*PaginatedResource) XXX_OneofWrappers() []interface{} { (*PaginatedResource_UserGroup)(nil), (*PaginatedResource_AppServerOrSAMLIdPServiceProvider)(nil), (*PaginatedResource_SAMLIdPServiceProvider)(nil), + (*PaginatedResource_IdentityCenterAccountAssignment)(nil), } } @@ -10900,7 +11156,7 @@ func (m *ListUnifiedResourcesRequest) Reset() { *m = ListUnifiedResource func (m *ListUnifiedResourcesRequest) String() string { return proto.CompactTextString(m) } func (*ListUnifiedResourcesRequest) ProtoMessage() {} func (*ListUnifiedResourcesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{157} + return fileDescriptor_0ffcffcda38ae159, []int{160} } func (m *ListUnifiedResourcesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11037,7 +11293,7 @@ func (m *ListUnifiedResourcesResponse) Reset() { *m = ListUnifiedResourc func (m *ListUnifiedResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ListUnifiedResourcesResponse) ProtoMessage() {} func (*ListUnifiedResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{158} + return fileDescriptor_0ffcffcda38ae159, []int{161} } func (m *ListUnifiedResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11133,7 +11389,7 @@ func (m *ListResourcesRequest) Reset() { *m = ListResourcesRequest{} } func (m *ListResourcesRequest) String() string { return proto.CompactTextString(m) } func (*ListResourcesRequest) ProtoMessage() {} func (*ListResourcesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{159} + return fileDescriptor_0ffcffcda38ae159, []int{162} } func (m *ListResourcesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11269,7 +11525,7 @@ func (m *GetSSHTargetsRequest) Reset() { *m = GetSSHTargetsRequest{} } func (m *GetSSHTargetsRequest) String() string { return proto.CompactTextString(m) } func (*GetSSHTargetsRequest) ProtoMessage() {} func (*GetSSHTargetsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{160} + return fileDescriptor_0ffcffcda38ae159, []int{163} } func (m *GetSSHTargetsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11325,7 +11581,7 @@ func (m *GetSSHTargetsResponse) Reset() { *m = GetSSHTargetsResponse{} } func (m *GetSSHTargetsResponse) String() string { return proto.CompactTextString(m) } func (*GetSSHTargetsResponse) ProtoMessage() {} func (*GetSSHTargetsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{161} + return fileDescriptor_0ffcffcda38ae159, []int{164} } func (m *GetSSHTargetsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11380,7 +11636,7 @@ func (m *ListResourcesResponse) Reset() { *m = ListResourcesResponse{} } func (m *ListResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ListResourcesResponse) ProtoMessage() {} func (*ListResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{162} + return fileDescriptor_0ffcffcda38ae159, []int{165} } func (m *ListResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11445,7 +11701,7 @@ func (m *CreateSessionTrackerRequest) Reset() { *m = CreateSessionTracke func (m *CreateSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*CreateSessionTrackerRequest) ProtoMessage() {} func (*CreateSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{163} + return fileDescriptor_0ffcffcda38ae159, []int{166} } func (m *CreateSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11494,7 +11750,7 @@ func (m *GetSessionTrackerRequest) Reset() { *m = GetSessionTrackerReque func (m *GetSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*GetSessionTrackerRequest) ProtoMessage() {} func (*GetSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{164} + return fileDescriptor_0ffcffcda38ae159, []int{167} } func (m *GetSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11543,7 +11799,7 @@ func (m *RemoveSessionTrackerRequest) Reset() { *m = RemoveSessionTracke func (m *RemoveSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*RemoveSessionTrackerRequest) ProtoMessage() {} func (*RemoveSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{165} + return fileDescriptor_0ffcffcda38ae159, []int{168} } func (m *RemoveSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11591,7 +11847,7 @@ func (m *SessionTrackerUpdateState) Reset() { *m = SessionTrackerUpdateS func (m *SessionTrackerUpdateState) String() string { return proto.CompactTextString(m) } func (*SessionTrackerUpdateState) ProtoMessage() {} func (*SessionTrackerUpdateState) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{166} + return fileDescriptor_0ffcffcda38ae159, []int{169} } func (m *SessionTrackerUpdateState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11639,7 +11895,7 @@ func (m *SessionTrackerAddParticipant) Reset() { *m = SessionTrackerAddP func (m *SessionTrackerAddParticipant) String() string { return proto.CompactTextString(m) } func (*SessionTrackerAddParticipant) ProtoMessage() {} func (*SessionTrackerAddParticipant) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{167} + return fileDescriptor_0ffcffcda38ae159, []int{170} } func (m *SessionTrackerAddParticipant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11687,7 +11943,7 @@ func (m *SessionTrackerRemoveParticipant) Reset() { *m = SessionTrackerR func (m *SessionTrackerRemoveParticipant) String() string { return proto.CompactTextString(m) } func (*SessionTrackerRemoveParticipant) ProtoMessage() {} func (*SessionTrackerRemoveParticipant) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{168} + return fileDescriptor_0ffcffcda38ae159, []int{171} } func (m *SessionTrackerRemoveParticipant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11736,7 +11992,7 @@ func (m *SessionTrackerUpdateExpiry) Reset() { *m = SessionTrackerUpdate func (m *SessionTrackerUpdateExpiry) String() string { return proto.CompactTextString(m) } func (*SessionTrackerUpdateExpiry) ProtoMessage() {} func (*SessionTrackerUpdateExpiry) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{169} + return fileDescriptor_0ffcffcda38ae159, []int{172} } func (m *SessionTrackerUpdateExpiry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11791,7 +12047,7 @@ func (m *UpdateSessionTrackerRequest) Reset() { *m = UpdateSessionTracke func (m *UpdateSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*UpdateSessionTrackerRequest) ProtoMessage() {} func (*UpdateSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{170} + return fileDescriptor_0ffcffcda38ae159, []int{173} } func (m *UpdateSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11912,7 +12168,7 @@ func (m *PresenceMFAChallengeRequest) Reset() { *m = PresenceMFAChalleng func (m *PresenceMFAChallengeRequest) String() string { return proto.CompactTextString(m) } func (*PresenceMFAChallengeRequest) ProtoMessage() {} func (*PresenceMFAChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{171} + return fileDescriptor_0ffcffcda38ae159, []int{174} } func (m *PresenceMFAChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11970,7 +12226,7 @@ func (m *PresenceMFAChallengeSend) Reset() { *m = PresenceMFAChallengeSe func (m *PresenceMFAChallengeSend) String() string { return proto.CompactTextString(m) } func (*PresenceMFAChallengeSend) ProtoMessage() {} func (*PresenceMFAChallengeSend) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{172} + return fileDescriptor_0ffcffcda38ae159, []int{175} } func (m *PresenceMFAChallengeSend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12057,7 +12313,7 @@ func (m *GetDomainNameResponse) Reset() { *m = GetDomainNameResponse{} } func (m *GetDomainNameResponse) String() string { return proto.CompactTextString(m) } func (*GetDomainNameResponse) ProtoMessage() {} func (*GetDomainNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{173} + return fileDescriptor_0ffcffcda38ae159, []int{176} } func (m *GetDomainNameResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12106,7 +12362,7 @@ func (m *GetClusterCACertResponse) Reset() { *m = GetClusterCACertRespon func (m *GetClusterCACertResponse) String() string { return proto.CompactTextString(m) } func (*GetClusterCACertResponse) ProtoMessage() {} func (*GetClusterCACertResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{174} + return fileDescriptor_0ffcffcda38ae159, []int{177} } func (m *GetClusterCACertResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12154,7 +12410,7 @@ func (m *GetLicenseResponse) Reset() { *m = GetLicenseResponse{} } func (m *GetLicenseResponse) String() string { return proto.CompactTextString(m) } func (*GetLicenseResponse) ProtoMessage() {} func (*GetLicenseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{175} + return fileDescriptor_0ffcffcda38ae159, []int{178} } func (m *GetLicenseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12202,7 +12458,7 @@ func (m *ListReleasesResponse) Reset() { *m = ListReleasesResponse{} } func (m *ListReleasesResponse) String() string { return proto.CompactTextString(m) } func (*ListReleasesResponse) ProtoMessage() {} func (*ListReleasesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{176} + return fileDescriptor_0ffcffcda38ae159, []int{179} } func (m *ListReleasesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12251,7 +12507,7 @@ func (m *GetOIDCAuthRequestRequest) Reset() { *m = GetOIDCAuthRequestReq func (m *GetOIDCAuthRequestRequest) String() string { return proto.CompactTextString(m) } func (*GetOIDCAuthRequestRequest) ProtoMessage() {} func (*GetOIDCAuthRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{177} + return fileDescriptor_0ffcffcda38ae159, []int{180} } func (m *GetOIDCAuthRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12300,7 +12556,7 @@ func (m *GetSAMLAuthRequestRequest) Reset() { *m = GetSAMLAuthRequestReq func (m *GetSAMLAuthRequestRequest) String() string { return proto.CompactTextString(m) } func (*GetSAMLAuthRequestRequest) ProtoMessage() {} func (*GetSAMLAuthRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{178} + return fileDescriptor_0ffcffcda38ae159, []int{181} } func (m *GetSAMLAuthRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12349,7 +12605,7 @@ func (m *GetGithubAuthRequestRequest) Reset() { *m = GetGithubAuthReques func (m *GetGithubAuthRequestRequest) String() string { return proto.CompactTextString(m) } func (*GetGithubAuthRequestRequest) ProtoMessage() {} func (*GetGithubAuthRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{179} + return fileDescriptor_0ffcffcda38ae159, []int{182} } func (m *GetGithubAuthRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12398,7 +12654,7 @@ func (m *CreateOIDCConnectorRequest) Reset() { *m = CreateOIDCConnectorR func (m *CreateOIDCConnectorRequest) String() string { return proto.CompactTextString(m) } func (*CreateOIDCConnectorRequest) ProtoMessage() {} func (*CreateOIDCConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{180} + return fileDescriptor_0ffcffcda38ae159, []int{183} } func (m *CreateOIDCConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12447,7 +12703,7 @@ func (m *UpdateOIDCConnectorRequest) Reset() { *m = UpdateOIDCConnectorR func (m *UpdateOIDCConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpdateOIDCConnectorRequest) ProtoMessage() {} func (*UpdateOIDCConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{181} + return fileDescriptor_0ffcffcda38ae159, []int{184} } func (m *UpdateOIDCConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12496,7 +12752,7 @@ func (m *UpsertOIDCConnectorRequest) Reset() { *m = UpsertOIDCConnectorR func (m *UpsertOIDCConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpsertOIDCConnectorRequest) ProtoMessage() {} func (*UpsertOIDCConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{182} + return fileDescriptor_0ffcffcda38ae159, []int{185} } func (m *UpsertOIDCConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12545,7 +12801,7 @@ func (m *CreateSAMLConnectorRequest) Reset() { *m = CreateSAMLConnectorR func (m *CreateSAMLConnectorRequest) String() string { return proto.CompactTextString(m) } func (*CreateSAMLConnectorRequest) ProtoMessage() {} func (*CreateSAMLConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{183} + return fileDescriptor_0ffcffcda38ae159, []int{186} } func (m *CreateSAMLConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12594,7 +12850,7 @@ func (m *UpdateSAMLConnectorRequest) Reset() { *m = UpdateSAMLConnectorR func (m *UpdateSAMLConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpdateSAMLConnectorRequest) ProtoMessage() {} func (*UpdateSAMLConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{184} + return fileDescriptor_0ffcffcda38ae159, []int{187} } func (m *UpdateSAMLConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12643,7 +12899,7 @@ func (m *UpsertSAMLConnectorRequest) Reset() { *m = UpsertSAMLConnectorR func (m *UpsertSAMLConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpsertSAMLConnectorRequest) ProtoMessage() {} func (*UpsertSAMLConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{185} + return fileDescriptor_0ffcffcda38ae159, []int{188} } func (m *UpsertSAMLConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12692,7 +12948,7 @@ func (m *CreateGithubConnectorRequest) Reset() { *m = CreateGithubConnec func (m *CreateGithubConnectorRequest) String() string { return proto.CompactTextString(m) } func (*CreateGithubConnectorRequest) ProtoMessage() {} func (*CreateGithubConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{186} + return fileDescriptor_0ffcffcda38ae159, []int{189} } func (m *CreateGithubConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12741,7 +12997,7 @@ func (m *UpdateGithubConnectorRequest) Reset() { *m = UpdateGithubConnec func (m *UpdateGithubConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpdateGithubConnectorRequest) ProtoMessage() {} func (*UpdateGithubConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{187} + return fileDescriptor_0ffcffcda38ae159, []int{190} } func (m *UpdateGithubConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12790,7 +13046,7 @@ func (m *UpsertGithubConnectorRequest) Reset() { *m = UpsertGithubConnec func (m *UpsertGithubConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpsertGithubConnectorRequest) ProtoMessage() {} func (*UpsertGithubConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{188} + return fileDescriptor_0ffcffcda38ae159, []int{191} } func (m *UpsertGithubConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12841,7 +13097,7 @@ func (m *GetSSODiagnosticInfoRequest) Reset() { *m = GetSSODiagnosticInf func (m *GetSSODiagnosticInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetSSODiagnosticInfoRequest) ProtoMessage() {} func (*GetSSODiagnosticInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{189} + return fileDescriptor_0ffcffcda38ae159, []int{192} } func (m *GetSSODiagnosticInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12907,7 +13163,7 @@ func (m *SystemRoleAssertion) Reset() { *m = SystemRoleAssertion{} } func (m *SystemRoleAssertion) String() string { return proto.CompactTextString(m) } func (*SystemRoleAssertion) ProtoMessage() {} func (*SystemRoleAssertion) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{190} + return fileDescriptor_0ffcffcda38ae159, []int{193} } func (m *SystemRoleAssertion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12977,7 +13233,7 @@ func (m *SystemRoleAssertionSet) Reset() { *m = SystemRoleAssertionSet{} func (m *SystemRoleAssertionSet) String() string { return proto.CompactTextString(m) } func (*SystemRoleAssertionSet) ProtoMessage() {} func (*SystemRoleAssertionSet) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{191} + return fileDescriptor_0ffcffcda38ae159, []int{194} } func (m *SystemRoleAssertionSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13046,7 +13302,7 @@ func (m *UpstreamInventoryOneOf) Reset() { *m = UpstreamInventoryOneOf{} func (m *UpstreamInventoryOneOf) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryOneOf) ProtoMessage() {} func (*UpstreamInventoryOneOf) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{192} + return fileDescriptor_0ffcffcda38ae159, []int{195} } func (m *UpstreamInventoryOneOf) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13173,7 +13429,7 @@ func (m *DownstreamInventoryOneOf) Reset() { *m = DownstreamInventoryOne func (m *DownstreamInventoryOneOf) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryOneOf) ProtoMessage() {} func (*DownstreamInventoryOneOf) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{193} + return fileDescriptor_0ffcffcda38ae159, []int{196} } func (m *DownstreamInventoryOneOf) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13272,7 +13528,7 @@ func (m *DownstreamInventoryPing) Reset() { *m = DownstreamInventoryPing func (m *DownstreamInventoryPing) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryPing) ProtoMessage() {} func (*DownstreamInventoryPing) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{194} + return fileDescriptor_0ffcffcda38ae159, []int{197} } func (m *DownstreamInventoryPing) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13321,7 +13577,7 @@ func (m *UpstreamInventoryPong) Reset() { *m = UpstreamInventoryPong{} } func (m *UpstreamInventoryPong) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryPong) ProtoMessage() {} func (*UpstreamInventoryPong) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{195} + return fileDescriptor_0ffcffcda38ae159, []int{198} } func (m *UpstreamInventoryPong) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13388,7 +13644,7 @@ func (m *UpstreamInventoryHello) Reset() { *m = UpstreamInventoryHello{} func (m *UpstreamInventoryHello) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryHello) ProtoMessage() {} func (*UpstreamInventoryHello) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{196} + return fileDescriptor_0ffcffcda38ae159, []int{199} } func (m *UpstreamInventoryHello) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13488,7 +13744,7 @@ func (m *UpstreamInventoryAgentMetadata) Reset() { *m = UpstreamInventor func (m *UpstreamInventoryAgentMetadata) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryAgentMetadata) ProtoMessage() {} func (*UpstreamInventoryAgentMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{197} + return fileDescriptor_0ffcffcda38ae159, []int{200} } func (m *UpstreamInventoryAgentMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13590,7 +13846,7 @@ func (m *DownstreamInventoryHello) Reset() { *m = DownstreamInventoryHel func (m *DownstreamInventoryHello) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryHello) ProtoMessage() {} func (*DownstreamInventoryHello) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{198} + return fileDescriptor_0ffcffcda38ae159, []int{201} } func (m *DownstreamInventoryHello) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13693,7 +13949,7 @@ func (m *DownstreamInventoryHello_SupportedCapabilities) String() string { } func (*DownstreamInventoryHello_SupportedCapabilities) ProtoMessage() {} func (*DownstreamInventoryHello_SupportedCapabilities) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{198, 0} + return fileDescriptor_0ffcffcda38ae159, []int{201, 0} } func (m *DownstreamInventoryHello_SupportedCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13866,7 +14122,7 @@ func (m *InventoryUpdateLabelsRequest) Reset() { *m = InventoryUpdateLab func (m *InventoryUpdateLabelsRequest) String() string { return proto.CompactTextString(m) } func (*InventoryUpdateLabelsRequest) ProtoMessage() {} func (*InventoryUpdateLabelsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{199} + return fileDescriptor_0ffcffcda38ae159, []int{202} } func (m *InventoryUpdateLabelsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13932,7 +14188,7 @@ func (m *DownstreamInventoryUpdateLabels) Reset() { *m = DownstreamInven func (m *DownstreamInventoryUpdateLabels) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryUpdateLabels) ProtoMessage() {} func (*DownstreamInventoryUpdateLabels) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{200} + return fileDescriptor_0ffcffcda38ae159, []int{203} } func (m *DownstreamInventoryUpdateLabels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13997,7 +14253,7 @@ func (m *InventoryHeartbeat) Reset() { *m = InventoryHeartbeat{} } func (m *InventoryHeartbeat) String() string { return proto.CompactTextString(m) } func (*InventoryHeartbeat) ProtoMessage() {} func (*InventoryHeartbeat) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{201} + return fileDescriptor_0ffcffcda38ae159, []int{204} } func (m *InventoryHeartbeat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14069,7 +14325,7 @@ func (m *UpstreamInventoryGoodbye) Reset() { *m = UpstreamInventoryGoodb func (m *UpstreamInventoryGoodbye) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryGoodbye) ProtoMessage() {} func (*UpstreamInventoryGoodbye) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{202} + return fileDescriptor_0ffcffcda38ae159, []int{205} } func (m *UpstreamInventoryGoodbye) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14119,7 +14375,7 @@ func (m *InventoryStatusRequest) Reset() { *m = InventoryStatusRequest{} func (m *InventoryStatusRequest) String() string { return proto.CompactTextString(m) } func (*InventoryStatusRequest) ProtoMessage() {} func (*InventoryStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{203} + return fileDescriptor_0ffcffcda38ae159, []int{206} } func (m *InventoryStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14177,7 +14433,7 @@ func (m *InventoryStatusSummary) Reset() { *m = InventoryStatusSummary{} func (m *InventoryStatusSummary) String() string { return proto.CompactTextString(m) } func (*InventoryStatusSummary) ProtoMessage() {} func (*InventoryStatusSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{204} + return fileDescriptor_0ffcffcda38ae159, []int{207} } func (m *InventoryStatusSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14254,7 +14510,7 @@ func (m *InventoryConnectedServiceCountsRequest) Reset() { func (m *InventoryConnectedServiceCountsRequest) String() string { return proto.CompactTextString(m) } func (*InventoryConnectedServiceCountsRequest) ProtoMessage() {} func (*InventoryConnectedServiceCountsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{205} + return fileDescriptor_0ffcffcda38ae159, []int{208} } func (m *InventoryConnectedServiceCountsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14296,7 +14552,7 @@ func (m *InventoryConnectedServiceCounts) Reset() { *m = InventoryConnec func (m *InventoryConnectedServiceCounts) String() string { return proto.CompactTextString(m) } func (*InventoryConnectedServiceCounts) ProtoMessage() {} func (*InventoryConnectedServiceCounts) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{206} + return fileDescriptor_0ffcffcda38ae159, []int{209} } func (m *InventoryConnectedServiceCounts) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14350,7 +14606,7 @@ func (m *InventoryPingRequest) Reset() { *m = InventoryPingRequest{} } func (m *InventoryPingRequest) String() string { return proto.CompactTextString(m) } func (*InventoryPingRequest) ProtoMessage() {} func (*InventoryPingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{207} + return fileDescriptor_0ffcffcda38ae159, []int{210} } func (m *InventoryPingRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14407,7 +14663,7 @@ func (m *InventoryPingResponse) Reset() { *m = InventoryPingResponse{} } func (m *InventoryPingResponse) String() string { return proto.CompactTextString(m) } func (*InventoryPingResponse) ProtoMessage() {} func (*InventoryPingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{208} + return fileDescriptor_0ffcffcda38ae159, []int{211} } func (m *InventoryPingResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14456,7 +14712,7 @@ func (m *GetClusterAlertsResponse) Reset() { *m = GetClusterAlertsRespon func (m *GetClusterAlertsResponse) String() string { return proto.CompactTextString(m) } func (*GetClusterAlertsResponse) ProtoMessage() {} func (*GetClusterAlertsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{209} + return fileDescriptor_0ffcffcda38ae159, []int{212} } func (m *GetClusterAlertsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14503,7 +14759,7 @@ func (m *GetAlertAcksRequest) Reset() { *m = GetAlertAcksRequest{} } func (m *GetAlertAcksRequest) String() string { return proto.CompactTextString(m) } func (*GetAlertAcksRequest) ProtoMessage() {} func (*GetAlertAcksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{210} + return fileDescriptor_0ffcffcda38ae159, []int{213} } func (m *GetAlertAcksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14545,7 +14801,7 @@ func (m *GetAlertAcksResponse) Reset() { *m = GetAlertAcksResponse{} } func (m *GetAlertAcksResponse) String() string { return proto.CompactTextString(m) } func (*GetAlertAcksResponse) ProtoMessage() {} func (*GetAlertAcksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{211} + return fileDescriptor_0ffcffcda38ae159, []int{214} } func (m *GetAlertAcksResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14595,7 +14851,7 @@ func (m *ClearAlertAcksRequest) Reset() { *m = ClearAlertAcksRequest{} } func (m *ClearAlertAcksRequest) String() string { return proto.CompactTextString(m) } func (*ClearAlertAcksRequest) ProtoMessage() {} func (*ClearAlertAcksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{212} + return fileDescriptor_0ffcffcda38ae159, []int{215} } func (m *ClearAlertAcksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14644,7 +14900,7 @@ func (m *UpsertClusterAlertRequest) Reset() { *m = UpsertClusterAlertReq func (m *UpsertClusterAlertRequest) String() string { return proto.CompactTextString(m) } func (*UpsertClusterAlertRequest) ProtoMessage() {} func (*UpsertClusterAlertRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{213} + return fileDescriptor_0ffcffcda38ae159, []int{216} } func (m *UpsertClusterAlertRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14693,7 +14949,7 @@ func (m *GetConnectionDiagnosticRequest) Reset() { *m = GetConnectionDia func (m *GetConnectionDiagnosticRequest) String() string { return proto.CompactTextString(m) } func (*GetConnectionDiagnosticRequest) ProtoMessage() {} func (*GetConnectionDiagnosticRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{214} + return fileDescriptor_0ffcffcda38ae159, []int{217} } func (m *GetConnectionDiagnosticRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14744,7 +15000,7 @@ func (m *AppendDiagnosticTraceRequest) Reset() { *m = AppendDiagnosticTr func (m *AppendDiagnosticTraceRequest) String() string { return proto.CompactTextString(m) } func (*AppendDiagnosticTraceRequest) ProtoMessage() {} func (*AppendDiagnosticTraceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{215} + return fileDescriptor_0ffcffcda38ae159, []int{218} } func (m *AppendDiagnosticTraceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14799,7 +15055,7 @@ func (m *SubmitUsageEventRequest) Reset() { *m = SubmitUsageEventRequest func (m *SubmitUsageEventRequest) String() string { return proto.CompactTextString(m) } func (*SubmitUsageEventRequest) ProtoMessage() {} func (*SubmitUsageEventRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{216} + return fileDescriptor_0ffcffcda38ae159, []int{219} } func (m *SubmitUsageEventRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14846,7 +15102,7 @@ func (m *GetLicenseRequest) Reset() { *m = GetLicenseRequest{} } func (m *GetLicenseRequest) String() string { return proto.CompactTextString(m) } func (*GetLicenseRequest) ProtoMessage() {} func (*GetLicenseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{217} + return fileDescriptor_0ffcffcda38ae159, []int{220} } func (m *GetLicenseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14886,7 +15142,7 @@ func (m *ListReleasesRequest) Reset() { *m = ListReleasesRequest{} } func (m *ListReleasesRequest) String() string { return proto.CompactTextString(m) } func (*ListReleasesRequest) ProtoMessage() {} func (*ListReleasesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{218} + return fileDescriptor_0ffcffcda38ae159, []int{221} } func (m *ListReleasesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14930,7 +15186,7 @@ func (m *CreateTokenV2Request) Reset() { *m = CreateTokenV2Request{} } func (m *CreateTokenV2Request) String() string { return proto.CompactTextString(m) } func (*CreateTokenV2Request) ProtoMessage() {} func (*CreateTokenV2Request) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{219} + return fileDescriptor_0ffcffcda38ae159, []int{222} } func (m *CreateTokenV2Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15007,7 +15263,7 @@ func (m *UpsertTokenV2Request) Reset() { *m = UpsertTokenV2Request{} } func (m *UpsertTokenV2Request) String() string { return proto.CompactTextString(m) } func (*UpsertTokenV2Request) ProtoMessage() {} func (*UpsertTokenV2Request) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{220} + return fileDescriptor_0ffcffcda38ae159, []int{223} } func (m *UpsertTokenV2Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15082,7 +15338,7 @@ func (m *GetHeadlessAuthenticationRequest) Reset() { *m = GetHeadlessAut func (m *GetHeadlessAuthenticationRequest) String() string { return proto.CompactTextString(m) } func (*GetHeadlessAuthenticationRequest) ProtoMessage() {} func (*GetHeadlessAuthenticationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{221} + return fileDescriptor_0ffcffcda38ae159, []int{224} } func (m *GetHeadlessAuthenticationRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15140,7 +15396,7 @@ func (m *UpdateHeadlessAuthenticationStateRequest) Reset() { func (m *UpdateHeadlessAuthenticationStateRequest) String() string { return proto.CompactTextString(m) } func (*UpdateHeadlessAuthenticationStateRequest) ProtoMessage() {} func (*UpdateHeadlessAuthenticationStateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{222} + return fileDescriptor_0ffcffcda38ae159, []int{225} } func (m *UpdateHeadlessAuthenticationStateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15206,7 +15462,7 @@ func (m *ExportUpgradeWindowsRequest) Reset() { *m = ExportUpgradeWindow func (m *ExportUpgradeWindowsRequest) String() string { return proto.CompactTextString(m) } func (*ExportUpgradeWindowsRequest) ProtoMessage() {} func (*ExportUpgradeWindowsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{223} + return fileDescriptor_0ffcffcda38ae159, []int{226} } func (m *ExportUpgradeWindowsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15272,7 +15528,7 @@ func (m *ExportUpgradeWindowsResponse) Reset() { *m = ExportUpgradeWindo func (m *ExportUpgradeWindowsResponse) String() string { return proto.CompactTextString(m) } func (*ExportUpgradeWindowsResponse) ProtoMessage() {} func (*ExportUpgradeWindowsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{224} + return fileDescriptor_0ffcffcda38ae159, []int{227} } func (m *ExportUpgradeWindowsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15347,7 +15603,7 @@ func (m *ListAccessRequestsRequest) Reset() { *m = ListAccessRequestsReq func (m *ListAccessRequestsRequest) String() string { return proto.CompactTextString(m) } func (*ListAccessRequestsRequest) ProtoMessage() {} func (*ListAccessRequestsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{225} + return fileDescriptor_0ffcffcda38ae159, []int{228} } func (m *ListAccessRequestsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15426,7 +15682,7 @@ func (m *ListAccessRequestsResponse) Reset() { *m = ListAccessRequestsRe func (m *ListAccessRequestsResponse) String() string { return proto.CompactTextString(m) } func (*ListAccessRequestsResponse) ProtoMessage() {} func (*ListAccessRequestsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{226} + return fileDescriptor_0ffcffcda38ae159, []int{229} } func (m *ListAccessRequestsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15482,7 +15738,7 @@ func (m *AccessRequestAllowedPromotionRequest) Reset() { *m = AccessRequ func (m *AccessRequestAllowedPromotionRequest) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotionRequest) ProtoMessage() {} func (*AccessRequestAllowedPromotionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{227} + return fileDescriptor_0ffcffcda38ae159, []int{230} } func (m *AccessRequestAllowedPromotionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15531,7 +15787,7 @@ func (m *AccessRequestAllowedPromotionResponse) Reset() { *m = AccessReq func (m *AccessRequestAllowedPromotionResponse) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotionResponse) ProtoMessage() {} func (*AccessRequestAllowedPromotionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{228} + return fileDescriptor_0ffcffcda38ae159, []int{231} } func (m *AccessRequestAllowedPromotionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15739,6 +15995,9 @@ func init() { proto.RegisterType((*CreateAuthenticateChallengeRequest)(nil), "proto.CreateAuthenticateChallengeRequest") proto.RegisterType((*CreatePrivilegeTokenRequest)(nil), "proto.CreatePrivilegeTokenRequest") proto.RegisterType((*CreateRegisterChallengeRequest)(nil), "proto.CreateRegisterChallengeRequest") + proto.RegisterType((*IdentityCenterAccount)(nil), "proto.IdentityCenterAccount") + proto.RegisterType((*IdentityCenterPermissionSet)(nil), "proto.IdentityCenterPermissionSet") + proto.RegisterType((*IdentityCenterAccountAssignment)(nil), "proto.IdentityCenterAccountAssignment") proto.RegisterType((*PaginatedResource)(nil), "proto.PaginatedResource") proto.RegisterType((*ListUnifiedResourcesRequest)(nil), "proto.ListUnifiedResourcesRequest") proto.RegisterMapType((map[string]string)(nil), "proto.ListUnifiedResourcesRequest.LabelsEntry") @@ -15828,953 +16087,968 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 15128 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x6c, 0x5c, 0x49, - 0x76, 0x18, 0xbb, 0xf9, 0x3e, 0x7c, 0xa8, 0x55, 0x24, 0xc5, 0x16, 0xf5, 0x68, 0xe9, 0x6a, 0x34, - 0xa3, 0xd1, 0xce, 0xea, 0x41, 0xcd, 0xcc, 0xce, 0x6b, 0x67, 0xa6, 0xf9, 0x90, 0x48, 0x89, 0xaf, - 0xb9, 0x4d, 0x52, 0xf3, 0xf2, 0xf6, 0x5e, 0x75, 0x97, 0xc8, 0x6b, 0x35, 0xef, 0xed, 0xbd, 0xf7, - 0xb6, 0x34, 0x5a, 0xc7, 0x0e, 0x6c, 0xe7, 0x61, 0x20, 0x48, 0x62, 0x03, 0x49, 0xe0, 0x24, 0x1f, - 0x4e, 0x80, 0x04, 0x08, 0x02, 0x04, 0xf0, 0x4f, 0xe0, 0x9f, 0x18, 0x41, 0xbe, 0xb2, 0x31, 0x10, - 0x24, 0x86, 0xed, 0x9f, 0x00, 0xa1, 0x93, 0x05, 0xfc, 0x43, 0x24, 0x1f, 0x46, 0x90, 0x00, 0x59, - 0xc0, 0x40, 0x50, 0xa7, 0x1e, 0xb7, 0xea, 0x3e, 0xba, 0x49, 0x49, 0xb3, 0xce, 0x8f, 0xc4, 0x3e, - 0x75, 0xce, 0xa9, 0xaa, 0x53, 0x75, 0xab, 0x4e, 0x9d, 0x3a, 0x75, 0x0e, 0xdc, 0x88, 0x68, 0x8b, - 0xb6, 0xfd, 0x20, 0xba, 0xd9, 0xa2, 0x7b, 0x4e, 0xe3, 0xf9, 0xcd, 0x46, 0xcb, 0xa5, 0x5e, 0x74, - 0xb3, 0x1d, 0xf8, 0x91, 0x7f, 0xd3, 0xe9, 0x44, 0xfb, 0x21, 0x0d, 0x9e, 0xba, 0x0d, 0x7a, 0x03, - 0x21, 0x64, 0x10, 0xff, 0x9b, 0x9b, 0xde, 0xf3, 0xf7, 0x7c, 0x8e, 0xc3, 0xfe, 0xe2, 0x85, 0x73, - 0xe7, 0xf6, 0x7c, 0x7f, 0xaf, 0x45, 0x39, 0xf1, 0xa3, 0xce, 0xe3, 0x9b, 0xf4, 0xa0, 0x1d, 0x3d, - 0x17, 0x85, 0x95, 0x64, 0x61, 0xe4, 0x1e, 0xd0, 0x30, 0x72, 0x0e, 0xda, 0x02, 0xe1, 0x4d, 0xd5, - 0x14, 0x27, 0x8a, 0x58, 0x49, 0xe4, 0xfa, 0xde, 0xcd, 0xa7, 0xb7, 0xf5, 0x9f, 0x02, 0xf5, 0x5a, - 0xd7, 0x56, 0x37, 0x68, 0x10, 0x85, 0xc7, 0xc2, 0xa4, 0x4f, 0xa9, 0x17, 0xa5, 0xaa, 0x17, 0x98, - 0xd1, 0xf3, 0x36, 0x0d, 0x39, 0x8a, 0xfc, 0x4f, 0xa0, 0x5e, 0xce, 0x46, 0xc5, 0x7f, 0x05, 0xca, - 0x77, 0xb3, 0x51, 0x9e, 0xd1, 0x47, 0x4c, 0xa6, 0x9e, 0xfa, 0xa3, 0x07, 0x7a, 0xe0, 0xb4, 0xdb, - 0x34, 0x88, 0xff, 0x10, 0xe8, 0x67, 0x15, 0xfa, 0xc1, 0x63, 0x87, 0x89, 0xe8, 0xe0, 0xb1, 0x93, - 0xea, 0x46, 0x27, 0x74, 0xf6, 0xa8, 0x68, 0xfe, 0xd3, 0xdb, 0xfa, 0x4f, 0x8e, 0x6a, 0xfd, 0x4e, - 0x01, 0x06, 0x1f, 0x3a, 0x51, 0x63, 0x9f, 0x7c, 0x02, 0x83, 0x0f, 0x5c, 0xaf, 0x19, 0x96, 0x0b, - 0x97, 0xfa, 0xaf, 0x8d, 0xcd, 0x97, 0x6e, 0xf0, 0xae, 0x60, 0x21, 0x2b, 0x58, 0x98, 0xfd, 0xc9, - 0x61, 0xa5, 0xef, 0xe8, 0xb0, 0x72, 0xea, 0x09, 0x43, 0x7b, 0xcb, 0x3f, 0x70, 0x23, 0x1c, 0x5b, - 0x9b, 0xd3, 0x91, 0x1d, 0x98, 0xaa, 0xb6, 0x5a, 0xfe, 0xb3, 0x2d, 0x27, 0x88, 0x5c, 0xa7, 0x55, - 0xeb, 0x34, 0x1a, 0x34, 0x0c, 0xcb, 0xc5, 0x4b, 0x85, 0x6b, 0x23, 0x0b, 0x57, 0x8e, 0x0e, 0x2b, - 0x15, 0x87, 0x15, 0xd7, 0xdb, 0xbc, 0xbc, 0x1e, 0x72, 0x04, 0x8d, 0x51, 0x16, 0xbd, 0xf5, 0x07, - 0x43, 0x50, 0x5a, 0xf1, 0xc3, 0x68, 0x91, 0x8d, 0xa8, 0x4d, 0x7f, 0xd4, 0xa1, 0x61, 0x44, 0xae, - 0xc0, 0x10, 0x83, 0xad, 0x2e, 0x95, 0x0b, 0x97, 0x0a, 0xd7, 0x46, 0x17, 0xc6, 0x8e, 0x0e, 0x2b, - 0xc3, 0xfb, 0x7e, 0x18, 0xd5, 0xdd, 0xa6, 0x2d, 0x8a, 0xc8, 0x9b, 0x30, 0xb2, 0xe1, 0x37, 0xe9, - 0x86, 0x73, 0x40, 0xb1, 0x15, 0xa3, 0x0b, 0x13, 0x47, 0x87, 0x95, 0x51, 0xcf, 0x6f, 0xd2, 0xba, - 0xe7, 0x1c, 0x50, 0x5b, 0x15, 0x93, 0x5d, 0x18, 0xb0, 0xfd, 0x16, 0x2d, 0xf7, 0x23, 0xda, 0xc2, - 0xd1, 0x61, 0x65, 0x20, 0xf0, 0x5b, 0xf4, 0x67, 0x87, 0x95, 0x77, 0xf7, 0xdc, 0x68, 0xbf, 0xf3, - 0xe8, 0x46, 0xc3, 0x3f, 0xb8, 0xb9, 0x17, 0x38, 0x4f, 0x5d, 0x3e, 0x09, 0x9d, 0xd6, 0xcd, 0x78, - 0xaa, 0xb6, 0x5d, 0x31, 0xee, 0xb5, 0xe7, 0x61, 0x44, 0x0f, 0x18, 0x27, 0x1b, 0xf9, 0x91, 0x87, - 0x30, 0x5d, 0x6d, 0x36, 0x5d, 0x4e, 0xb1, 0x15, 0xb8, 0x5e, 0xc3, 0x6d, 0x3b, 0xad, 0xb0, 0x3c, - 0x70, 0xa9, 0xff, 0xda, 0xa8, 0x10, 0x8a, 0x2a, 0xaf, 0xb7, 0x15, 0x82, 0x26, 0x94, 0x4c, 0x06, - 0xe4, 0x0e, 0x8c, 0x2c, 0x6d, 0xd4, 0x58, 0xdb, 0xc3, 0xf2, 0x20, 0x32, 0x9b, 0x3d, 0x3a, 0xac, - 0x4c, 0x35, 0xbd, 0x10, 0xbb, 0xa6, 0x33, 0x50, 0x88, 0xe4, 0x5d, 0x18, 0xdf, 0xea, 0x3c, 0x6a, - 0xb9, 0x8d, 0xed, 0xb5, 0xda, 0x03, 0xfa, 0xbc, 0x3c, 0x74, 0xa9, 0x70, 0x6d, 0x7c, 0x81, 0x1c, - 0x1d, 0x56, 0x26, 0xdb, 0x08, 0xaf, 0x47, 0xad, 0xb0, 0xfe, 0x84, 0x3e, 0xb7, 0x0d, 0xbc, 0x98, - 0xae, 0x56, 0x5b, 0x61, 0x74, 0xc3, 0x29, 0xba, 0x30, 0xdc, 0xd7, 0xe9, 0x38, 0x1e, 0xb9, 0x09, - 0x60, 0xd3, 0x03, 0x3f, 0xa2, 0xd5, 0x66, 0x33, 0x28, 0x8f, 0xa0, 0x6c, 0x4f, 0x1d, 0x1d, 0x56, - 0xc6, 0x02, 0x84, 0xd6, 0x9d, 0x66, 0x33, 0xb0, 0x35, 0x14, 0xb2, 0x08, 0x23, 0xb6, 0xcf, 0x05, - 0x5c, 0x1e, 0xbd, 0x54, 0xb8, 0x36, 0x36, 0x7f, 0x4a, 0x4c, 0x43, 0x09, 0x5e, 0x38, 0x73, 0x74, - 0x58, 0x21, 0x81, 0xf8, 0xa5, 0xf7, 0x52, 0x62, 0x90, 0x0a, 0x0c, 0x6f, 0xf8, 0x8b, 0x4e, 0x63, - 0x9f, 0x96, 0x01, 0xe7, 0xde, 0xe0, 0xd1, 0x61, 0xa5, 0xf0, 0x5d, 0x5b, 0x42, 0xc9, 0x53, 0x18, - 0x8b, 0x07, 0x2a, 0x2c, 0x8f, 0xa1, 0xf8, 0xb6, 0x8f, 0x0e, 0x2b, 0x67, 0x42, 0x04, 0xd7, 0xd9, - 0xd0, 0x6b, 0x12, 0x7c, 0x89, 0x59, 0xa0, 0x57, 0x44, 0xbe, 0x86, 0x99, 0xf8, 0x67, 0x35, 0x0c, - 0x69, 0xc0, 0x78, 0xac, 0x2e, 0x95, 0x27, 0x50, 0x32, 0xaf, 0x1f, 0x1d, 0x56, 0x2c, 0xad, 0x05, - 0x75, 0x47, 0xa2, 0xd4, 0xdd, 0xa6, 0xd6, 0xd3, 0x6c, 0x26, 0xf7, 0x07, 0x46, 0xc6, 0x4b, 0x13, - 0xf6, 0x85, 0x1d, 0x2f, 0x8c, 0x9c, 0x47, 0x2d, 0x9a, 0x89, 0x64, 0xfd, 0x45, 0x01, 0xc8, 0x66, - 0x9b, 0x7a, 0xb5, 0xda, 0x0a, 0xfb, 0x9e, 0xe4, 0xe7, 0xf4, 0x16, 0x8c, 0xf2, 0x81, 0x63, 0xa3, - 0x5b, 0xc4, 0xd1, 0x9d, 0x3c, 0x3a, 0xac, 0x80, 0x18, 0x5d, 0x36, 0xb2, 0x31, 0x02, 0xb9, 0x0a, - 0xfd, 0xdb, 0xdb, 0x6b, 0xf8, 0xad, 0xf4, 0x2f, 0x4c, 0x1d, 0x1d, 0x56, 0xfa, 0xa3, 0xa8, 0xf5, - 0xb3, 0xc3, 0xca, 0xc8, 0x52, 0x27, 0x40, 0xb1, 0xd8, 0xac, 0x9c, 0x5c, 0x85, 0xe1, 0xc5, 0x56, - 0x27, 0x8c, 0x68, 0x50, 0x1e, 0x88, 0x3f, 0xd2, 0x06, 0x07, 0xd9, 0xb2, 0x8c, 0x7c, 0x07, 0x06, - 0x76, 0x42, 0x1a, 0x94, 0x07, 0x71, 0xbc, 0x27, 0xc4, 0x78, 0x33, 0xd0, 0xee, 0xfc, 0xc2, 0x08, - 0xfb, 0x12, 0x3b, 0x21, 0x0d, 0x6c, 0x44, 0x22, 0x37, 0x60, 0x90, 0x0f, 0xda, 0x10, 0x2e, 0x52, - 0x13, 0x6a, 0x76, 0xb4, 0xe8, 0xee, 0xbb, 0x0b, 0xa3, 0x47, 0x87, 0x95, 0x41, 0x1c, 0x3c, 0x9b, - 0xa3, 0xdd, 0x1f, 0x18, 0x29, 0x94, 0x8a, 0xf6, 0x08, 0xa3, 0x65, 0x9f, 0x85, 0xf5, 0x1d, 0x18, - 0xd3, 0xba, 0x4f, 0xce, 0xc3, 0x00, 0xfb, 0x1f, 0x17, 0x91, 0x71, 0x5e, 0x19, 0xdb, 0x38, 0x6c, - 0x84, 0x5a, 0xff, 0x64, 0x0a, 0x4a, 0x8c, 0xd2, 0x58, 0x79, 0x6e, 0xe8, 0xa2, 0xe2, 0x74, 0x25, - 0x53, 0x54, 0xe5, 0x82, 0x2e, 0xac, 0x6b, 0xa0, 0x6a, 0x17, 0x8b, 0xd0, 0xf8, 0xd1, 0x61, 0x65, - 0xa4, 0x23, 0x60, 0x71, 0xdb, 0x48, 0x0d, 0x86, 0x97, 0xbf, 0x69, 0xbb, 0x01, 0x0d, 0x51, 0xb4, - 0x63, 0xf3, 0x73, 0x37, 0xf8, 0x76, 0x79, 0x43, 0x6e, 0x97, 0x37, 0xb6, 0xe5, 0x76, 0xb9, 0x70, - 0x41, 0x2c, 0xc6, 0xa7, 0x29, 0x27, 0x89, 0xe7, 0xc7, 0x6f, 0xfe, 0x69, 0xa5, 0x60, 0x4b, 0x4e, - 0xe4, 0x2d, 0x18, 0xba, 0xeb, 0x07, 0x07, 0x4e, 0x24, 0xc6, 0x60, 0xfa, 0xe8, 0xb0, 0x52, 0x7a, - 0x8c, 0x10, 0x6d, 0x4a, 0x09, 0x1c, 0x72, 0x17, 0x26, 0x6d, 0xbf, 0x13, 0xd1, 0x6d, 0x5f, 0x8e, - 0xdc, 0x20, 0x52, 0x5d, 0x3c, 0x3a, 0xac, 0xcc, 0x05, 0xac, 0xa4, 0x1e, 0xf9, 0x75, 0x31, 0x84, - 0x1a, 0x7d, 0x82, 0x8a, 0x2c, 0xc3, 0x64, 0x15, 0x57, 0x6f, 0x21, 0x35, 0x3e, 0x5e, 0xa3, 0x0b, - 0x17, 0x8e, 0x0e, 0x2b, 0x67, 0x1d, 0x2c, 0xa9, 0x07, 0xa2, 0x48, 0x67, 0x63, 0x12, 0x91, 0x0d, - 0x38, 0xfd, 0xa0, 0xf3, 0x88, 0x06, 0x1e, 0x8d, 0x68, 0x28, 0x5b, 0x34, 0x8c, 0x2d, 0xba, 0x74, - 0x74, 0x58, 0x39, 0xff, 0x44, 0x15, 0x66, 0xb4, 0x29, 0x4d, 0x4a, 0x28, 0x9c, 0x12, 0x0d, 0x5d, - 0x72, 0x22, 0xe7, 0x91, 0x13, 0x52, 0x5c, 0x94, 0xc6, 0xe6, 0xcf, 0x70, 0x11, 0xdf, 0x48, 0x94, - 0x2e, 0x5c, 0x11, 0x52, 0x3e, 0xa7, 0xfa, 0xde, 0x14, 0x45, 0x5a, 0x45, 0x49, 0x9e, 0x6c, 0x6d, - 0x56, 0xfb, 0xce, 0x28, 0xb6, 0x16, 0xd7, 0x66, 0xb5, 0xef, 0xe8, 0xab, 0x96, 0xda, 0x81, 0xd6, - 0x60, 0x70, 0x87, 0xed, 0xce, 0xb8, 0x66, 0x4d, 0xce, 0x5f, 0x16, 0x2d, 0x4a, 0xce, 0xbf, 0x1b, - 0xec, 0x07, 0x22, 0xe2, 0x97, 0x77, 0x0a, 0x77, 0x74, 0x7d, 0x2f, 0xc6, 0x32, 0xf2, 0x19, 0x80, - 0x68, 0x55, 0xb5, 0xdd, 0x2e, 0x8f, 0x61, 0x27, 0x4f, 0x9b, 0x9d, 0xac, 0xb6, 0xdb, 0x0b, 0x17, - 0x45, 0xff, 0xce, 0xa8, 0xfe, 0x39, 0xed, 0xb6, 0xc6, 0x4d, 0x63, 0x42, 0x3e, 0x81, 0x71, 0x5c, - 0xd2, 0xe4, 0x88, 0x8e, 0xe3, 0x88, 0x9e, 0x3b, 0x3a, 0xac, 0xcc, 0xe2, 0x6a, 0x95, 0x31, 0x9e, - 0x06, 0x01, 0xf9, 0x15, 0x98, 0x11, 0xec, 0x1e, 0xba, 0x5e, 0xd3, 0x7f, 0x16, 0x2e, 0xd1, 0xf0, - 0x49, 0xe4, 0xb7, 0x71, 0xf9, 0x1b, 0x9b, 0x3f, 0x6f, 0x36, 0xcf, 0xc4, 0x59, 0xb8, 0x2e, 0x5a, - 0x6a, 0xa9, 0x96, 0x3e, 0xe3, 0x08, 0xf5, 0x26, 0xc7, 0xd0, 0x17, 0xc8, 0x4c, 0x16, 0x64, 0x15, - 0x4e, 0xed, 0x84, 0xd4, 0xe8, 0xc3, 0x24, 0xee, 0x0f, 0x15, 0x36, 0xc2, 0x9d, 0x90, 0xd6, 0xf3, - 0xfa, 0x91, 0xa4, 0x23, 0x36, 0x90, 0xa5, 0xc0, 0x6f, 0x27, 0xe6, 0xf8, 0x29, 0x94, 0x88, 0x75, - 0x74, 0x58, 0xb9, 0xd8, 0x0c, 0xfc, 0x76, 0x3d, 0x7f, 0xa2, 0x67, 0x50, 0x93, 0x1f, 0xc0, 0x99, - 0x45, 0xdf, 0xf3, 0x68, 0x83, 0xad, 0xa0, 0x4b, 0xae, 0xb3, 0xe7, 0xf9, 0x61, 0xe4, 0x36, 0x56, - 0x97, 0xca, 0xa5, 0x78, 0x7b, 0x68, 0x28, 0x8c, 0x7a, 0x53, 0xa1, 0x98, 0xdb, 0x43, 0x0e, 0x17, - 0xf2, 0x15, 0x4c, 0x88, 0xba, 0x68, 0x80, 0x53, 0xf3, 0x74, 0xf7, 0x89, 0xa6, 0x90, 0xf9, 0x46, - 0x1f, 0xc8, 0x9f, 0x5c, 0x75, 0x32, 0x79, 0x91, 0xaf, 0x61, 0x6c, 0xfd, 0x6e, 0xd5, 0xa6, 0x61, - 0xdb, 0xf7, 0x42, 0x5a, 0x26, 0x38, 0xa2, 0x17, 0x05, 0xeb, 0xf5, 0xbb, 0xd5, 0x6a, 0x27, 0xda, - 0xa7, 0x5e, 0xe4, 0x36, 0x9c, 0x88, 0x4a, 0xac, 0x85, 0x39, 0x36, 0xf3, 0x0e, 0x1e, 0x3b, 0xf5, - 0x40, 0x40, 0xb4, 0x5e, 0xe8, 0xec, 0xc8, 0x1c, 0x8c, 0xd4, 0x6a, 0x2b, 0x6b, 0xfe, 0x9e, 0xeb, - 0x95, 0xa7, 0x98, 0x30, 0x6c, 0xf5, 0x9b, 0x3c, 0x86, 0x19, 0xed, 0x6c, 0x50, 0x67, 0xff, 0xd3, - 0x03, 0xea, 0x45, 0xe5, 0x69, 0x6c, 0xc3, 0x77, 0xd5, 0xe1, 0xe6, 0x86, 0x7e, 0x84, 0x78, 0x7a, - 0xfb, 0x46, 0x35, 0xfe, 0x59, 0x93, 0x44, 0x0b, 0xc5, 0x72, 0xc1, 0x9e, 0x76, 0x32, 0x4a, 0xc8, - 0x36, 0x0c, 0x6f, 0x75, 0x82, 0xb6, 0x1f, 0xd2, 0xf2, 0x0c, 0x0a, 0xee, 0x4a, 0xb7, 0x2f, 0x54, - 0xa0, 0x2e, 0xcc, 0xb0, 0x25, 0xba, 0xcd, 0x7f, 0x68, 0xbd, 0x93, 0xac, 0xc8, 0xa7, 0x30, 0x5e, - 0xab, 0xad, 0xc4, 0x1b, 0xca, 0x19, 0xdc, 0x50, 0xce, 0x1f, 0x1d, 0x56, 0xca, 0x4c, 0xa5, 0x8a, - 0x37, 0x15, 0xfd, 0xab, 0xd2, 0x29, 0x18, 0x87, 0xed, 0xb5, 0x5a, 0xcc, 0x61, 0x36, 0xe6, 0xc0, - 0x94, 0xb9, 0x6c, 0x0e, 0x3a, 0x05, 0xf9, 0x57, 0x05, 0xb8, 0xa4, 0xb3, 0xcc, 0x12, 0x4c, 0xf9, - 0xec, 0x8b, 0x48, 0x73, 0xfe, 0xe8, 0xb0, 0x72, 0xc3, 0xec, 0x47, 0x3d, 0x73, 0xb0, 0xb4, 0xb6, - 0xf5, 0x6c, 0x0a, 0xb6, 0x57, 0xef, 0x40, 0x66, 0x7b, 0xe7, 0x5e, 0xb8, 0xbd, 0xa6, 0xd4, 0x7a, - 0xb7, 0xb7, 0x57, 0x53, 0xac, 0xcf, 0x61, 0x54, 0x2d, 0xda, 0x64, 0x18, 0xfa, 0xab, 0xad, 0x56, - 0xa9, 0x8f, 0xfd, 0x51, 0xab, 0xad, 0x94, 0x0a, 0x64, 0x12, 0x20, 0xde, 0xa9, 0x4a, 0x45, 0x32, - 0x0e, 0x23, 0x72, 0x27, 0x29, 0xf5, 0x23, 0x7e, 0xbb, 0x5d, 0x1a, 0x20, 0x04, 0x26, 0xcd, 0xf5, - 0xac, 0x34, 0x68, 0xfd, 0x56, 0x01, 0x46, 0xd5, 0x77, 0x48, 0x4e, 0xc1, 0xd8, 0xce, 0x46, 0x6d, - 0x6b, 0x79, 0x71, 0xf5, 0xee, 0xea, 0xf2, 0x52, 0xa9, 0x8f, 0x5c, 0x80, 0xb3, 0xdb, 0xb5, 0x95, - 0xfa, 0xd2, 0x42, 0x7d, 0x6d, 0x73, 0xb1, 0xba, 0x56, 0xdf, 0xb2, 0x37, 0x3f, 0xff, 0xa2, 0xbe, - 0xbd, 0xb3, 0xb1, 0xb1, 0xbc, 0x56, 0x2a, 0x90, 0x32, 0x4c, 0xb3, 0xe2, 0x07, 0x3b, 0x0b, 0xcb, - 0x3a, 0x42, 0xa9, 0x48, 0x2e, 0xc3, 0x85, 0xac, 0x92, 0xfa, 0xca, 0x72, 0x75, 0x69, 0x6d, 0xb9, - 0x56, 0x2b, 0xf5, 0x93, 0x59, 0x98, 0x62, 0x28, 0xd5, 0xad, 0x2d, 0x83, 0x76, 0xc0, 0x6a, 0xc1, - 0x98, 0xf6, 0x01, 0x90, 0xf3, 0x50, 0x5e, 0x5c, 0xb6, 0xb7, 0xeb, 0x5b, 0x3b, 0xf6, 0xd6, 0x66, - 0x6d, 0xb9, 0x6e, 0xb6, 0x30, 0x59, 0xba, 0xb6, 0x79, 0x6f, 0x75, 0xa3, 0xce, 0x40, 0xb5, 0x52, - 0x81, 0x35, 0xc3, 0x28, 0xad, 0xad, 0x6e, 0xdc, 0x5b, 0x5b, 0xae, 0xef, 0xd4, 0x96, 0x05, 0x4a, - 0xd1, 0xfa, 0xb5, 0x62, 0x6a, 0x4b, 0x27, 0xf3, 0x30, 0x56, 0xe3, 0xf6, 0x0a, 0x5c, 0xe6, 0xf8, - 0x01, 0x91, 0xe9, 0x68, 0xe3, 0xc2, 0x8c, 0xc1, 0x57, 0x30, 0x1d, 0x89, 0x69, 0x69, 0x5b, 0xec, - 0x6b, 0x6e, 0xf8, 0x2d, 0x5d, 0x4b, 0x6b, 0x0b, 0x98, 0xad, 0x4a, 0xc9, 0xbc, 0xa6, 0xcf, 0xf1, - 0xd3, 0x22, 0x9e, 0x48, 0xa4, 0x3e, 0xa7, 0xef, 0xed, 0x4a, 0xb3, 0x9b, 0x8f, 0x87, 0x54, 0xa8, - 0x61, 0x48, 0x93, 0xa1, 0x4b, 0x28, 0x3c, 0xf2, 0xa6, 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, 0x90, 0xaf, 0xb8, 0x5c, 0x1e, 0xa8, 0x5b, - 0xb7, 0x18, 0xc0, 0xe6, 0x70, 0xeb, 0x0f, 0xfb, 0x75, 0x25, 0x83, 0xe9, 0xd2, 0x9a, 0xbc, 0x51, - 0x97, 0x46, 0x39, 0x23, 0x94, 0x1d, 0x05, 0xf9, 0x57, 0x82, 0x47, 0xc1, 0xfe, 0xf8, 0x28, 0x28, - 0x3e, 0x35, 0x7e, 0x14, 0x8c, 0x51, 0xd8, 0x28, 0x0a, 0xb5, 0x0d, 0xb9, 0x0e, 0xc4, 0xa3, 0x28, - 0x54, 0x3d, 0x31, 0x8a, 0x1a, 0x12, 0xf9, 0x00, 0xa0, 0xfa, 0xb0, 0x86, 0x67, 0x1e, 0x7b, 0x43, - 0xa8, 0xae, 0xb8, 0xc9, 0x38, 0xcf, 0x42, 0x71, 0xa4, 0x0a, 0xf4, 0x33, 0xa3, 0x86, 0x4d, 0x16, - 0x60, 0xa2, 0xfa, 0xe3, 0x4e, 0x40, 0x57, 0x9b, 0x6c, 0x9f, 0x8a, 0xf8, 0xe1, 0x78, 0x94, 0x2f, - 0xa4, 0x0e, 0x2b, 0xa8, 0xbb, 0xa2, 0x44, 0x63, 0x60, 0x92, 0x90, 0x4d, 0x38, 0x7d, 0x6f, 0x71, - 0x4b, 0xcc, 0xab, 0x6a, 0xa3, 0xe1, 0x77, 0xbc, 0x48, 0xe8, 0xab, 0x97, 0x8f, 0x0e, 0x2b, 0x17, - 0xf6, 0x1a, 0xed, 0xba, 0x9c, 0x83, 0x0e, 0x2f, 0xd6, 0x15, 0xd6, 0x14, 0x2d, 0xb9, 0x02, 0xfd, - 0x3b, 0xf6, 0xaa, 0x38, 0x39, 0x9f, 0x3e, 0x3a, 0xac, 0x4c, 0x74, 0x02, 0x57, 0x23, 0x61, 0xa5, - 0xe4, 0x7d, 0x80, 0x6d, 0x27, 0xd8, 0xa3, 0xd1, 0x96, 0x1f, 0x44, 0xa8, 0x70, 0x4e, 0x2c, 0x9c, - 0x3d, 0x3a, 0xac, 0xcc, 0x44, 0x08, 0xad, 0xb3, 0xe5, 0x4f, 0xef, 0x74, 0x8c, 0x7c, 0x7f, 0x60, - 0xa4, 0x58, 0xea, 0xb7, 0x47, 0x6b, 0x34, 0x0c, 0xf9, 0xf9, 0xb0, 0x05, 0x93, 0xf7, 0x68, 0xc4, - 0x26, 0xae, 0x3c, 0xef, 0x74, 0x1f, 0xd6, 0x8f, 0x60, 0xec, 0xa1, 0x1b, 0xed, 0xd7, 0x68, 0x23, - 0xa0, 0x91, 0xb4, 0xf5, 0xa0, 0xc8, 0x9f, 0xb9, 0xd1, 0x7e, 0x3d, 0xe4, 0x70, 0x7d, 0x5f, 0xd7, - 0xd0, 0xad, 0x65, 0x38, 0x25, 0x6a, 0x53, 0xc7, 0xab, 0x79, 0x93, 0x61, 0x01, 0x19, 0xe2, 0xb0, - 0xeb, 0x0c, 0x4d, 0x36, 0xff, 0xba, 0x08, 0x33, 0x8b, 0xfb, 0x8e, 0xb7, 0x47, 0xb7, 0x9c, 0x30, - 0x7c, 0xe6, 0x07, 0x4d, 0xad, 0xf1, 0x78, 0xb6, 0x4c, 0x35, 0x1e, 0x0f, 0x93, 0xf3, 0x30, 0xb6, - 0xd9, 0x6a, 0x4a, 0x1a, 0x71, 0xee, 0xc5, 0xba, 0xfc, 0x56, 0xb3, 0xde, 0x96, 0xbc, 0x74, 0x24, - 0x46, 0xb3, 0x41, 0x9f, 0x29, 0x9a, 0xfe, 0x98, 0xc6, 0xa3, 0xcf, 0x34, 0x1a, 0x0d, 0x89, 0x2c, - 0xc3, 0xe9, 0x1a, 0x6d, 0xf8, 0x5e, 0xf3, 0xae, 0xd3, 0x88, 0xfc, 0x60, 0xdb, 0x7f, 0x42, 0x3d, - 0x31, 0xa1, 0xf1, 0x60, 0x10, 0x62, 0x61, 0xfd, 0x31, 0x96, 0xd6, 0x23, 0x56, 0x6c, 0xa7, 0x29, - 0xc8, 0x26, 0x8c, 0x3c, 0x14, 0x16, 0x43, 0x71, 0x58, 0xbe, 0x7a, 0x43, 0x99, 0x10, 0x17, 0x03, - 0x8a, 0xb3, 0xd0, 0x69, 0xa9, 0xe3, 0xbe, 0xd2, 0xb3, 0x70, 0x29, 0x93, 0x98, 0xb6, 0x62, 0x62, - 0xed, 0xc0, 0xc4, 0x56, 0xab, 0xb3, 0xe7, 0x7a, 0x6c, 0xd1, 0xa9, 0xd1, 0x1f, 0x91, 0x25, 0x80, - 0x18, 0x20, 0xec, 0x80, 0x53, 0xe2, 0x88, 0x1d, 0x17, 0xec, 0xde, 0x11, 0x5f, 0x2e, 0x42, 0xf0, - 0x44, 0x64, 0x6b, 0x74, 0xd6, 0xff, 0xed, 0x07, 0x22, 0x06, 0x00, 0x37, 0xc1, 0x1a, 0x8d, 0xd8, - 0xf6, 0x74, 0x06, 0x8a, 0xca, 0x5c, 0x37, 0x74, 0x74, 0x58, 0x29, 0xba, 0x4d, 0xbb, 0xb8, 0xba, - 0x44, 0xde, 0x86, 0x41, 0x44, 0x43, 0xf9, 0x4f, 0xaa, 0xfa, 0x74, 0x0e, 0x7c, 0xf1, 0xc1, 0xdd, - 0xd7, 0xe6, 0xc8, 0xe4, 0x1d, 0x18, 0x5d, 0xa2, 0x2d, 0xba, 0xe7, 0x44, 0xbe, 0x5c, 0x4e, 0xb8, - 0x01, 0x4c, 0x02, 0xb5, 0x39, 0x17, 0x63, 0xb2, 0xe3, 0xb0, 0x4d, 0x9d, 0xd0, 0xf7, 0xf4, 0xe3, - 0x70, 0x80, 0x10, 0xfd, 0x38, 0xcc, 0x71, 0xc8, 0xdf, 0x2f, 0xc0, 0x58, 0xd5, 0xf3, 0x84, 0x61, - 0x29, 0x14, 0x52, 0x9f, 0xb9, 0xa1, 0x2c, 0xb1, 0x6b, 0xce, 0x23, 0xda, 0xda, 0x75, 0x5a, 0x1d, - 0x1a, 0x2e, 0x7c, 0xcd, 0x4e, 0x28, 0xff, 0xe5, 0xb0, 0xf2, 0xe1, 0x09, 0x4c, 0x45, 0xb1, 0x4d, - 0x77, 0x3b, 0x70, 0xdc, 0x28, 0x64, 0x5f, 0xad, 0x13, 0x57, 0xa8, 0x7f, 0x37, 0x5a, 0x3b, 0xe2, - 0xbd, 0x61, 0xa8, 0xd7, 0xde, 0x40, 0x0e, 0xe0, 0x54, 0x35, 0x0c, 0x3b, 0x07, 0xb4, 0x16, 0x39, - 0x41, 0xb4, 0xed, 0x1e, 0x50, 0x5c, 0x90, 0xba, 0x1b, 0x17, 0xde, 0xf8, 0xc9, 0x61, 0xa5, 0xc0, - 0x0e, 0x45, 0x0e, 0x92, 0x32, 0xbd, 0x27, 0x88, 0xea, 0x91, 0xab, 0x6f, 0x6f, 0x68, 0x66, 0x48, - 0xf2, 0xb6, 0xae, 0x28, 0x85, 0x64, 0x75, 0x29, 0x6f, 0xc4, 0xad, 0x45, 0x38, 0x7f, 0x8f, 0x46, - 0x36, 0x0d, 0x69, 0x24, 0xbf, 0x11, 0x9c, 0xe1, 0xb1, 0x71, 0x77, 0x18, 0x7f, 0x2b, 0x62, 0x1c, - 0x7e, 0xfe, 0x5d, 0xc8, 0x12, 0xeb, 0xaf, 0x15, 0xa0, 0xb2, 0x18, 0x50, 0x7e, 0x9e, 0xc8, 0x61, - 0xd4, 0x7d, 0xed, 0x3a, 0x0f, 0x03, 0xdb, 0xcf, 0xdb, 0xd2, 0x2a, 0x83, 0xa5, 0x6c, 0x50, 0x6c, - 0x84, 0x1e, 0xd3, 0xc8, 0x65, 0x3d, 0x86, 0x19, 0x9b, 0x7a, 0xf4, 0x99, 0xf3, 0xa8, 0x45, 0x0d, - 0x3b, 0x51, 0x05, 0x06, 0xf9, 0x87, 0x9e, 0xea, 0x02, 0x87, 0x9f, 0xcc, 0xe6, 0x66, 0x4d, 0xc0, - 0xd8, 0x96, 0xeb, 0xed, 0x09, 0xee, 0xd6, 0x9f, 0x0d, 0xc0, 0x38, 0xff, 0x2d, 0x8e, 0x48, 0x89, - 0xed, 0xb2, 0x70, 0x9c, 0xed, 0xf2, 0x3d, 0x98, 0x60, 0xfb, 0x0d, 0x0d, 0x76, 0x69, 0xc0, 0xd6, - 0x7f, 0x21, 0x09, 0x3c, 0xee, 0x85, 0x58, 0x50, 0x7f, 0xca, 0x4b, 0x6c, 0x13, 0x91, 0xac, 0xc1, - 0x24, 0x07, 0xdc, 0xa5, 0x4e, 0xd4, 0x89, 0x2d, 0x56, 0xa7, 0xc4, 0x99, 0x48, 0x82, 0xf9, 0xd4, - 0x14, 0xbc, 0x1e, 0x0b, 0xa0, 0x9d, 0xa0, 0x25, 0x9f, 0xc0, 0xa9, 0xad, 0xc0, 0xff, 0xe6, 0xb9, - 0xa6, 0x20, 0xf0, 0xaf, 0x93, 0x9f, 0x9e, 0x58, 0x51, 0x5d, 0x57, 0x13, 0x92, 0xd8, 0xe4, 0x4d, - 0x18, 0x59, 0x0d, 0x17, 0xfc, 0xc0, 0xf5, 0xf6, 0xf0, 0x1b, 0x1d, 0xe1, 0x86, 0x7e, 0x37, 0xac, - 0x3f, 0x42, 0xa0, 0xad, 0x8a, 0x13, 0x26, 0xe9, 0xe1, 0xde, 0x26, 0xe9, 0x5b, 0x00, 0x6b, 0xbe, - 0xd3, 0xac, 0xb6, 0x5a, 0x8b, 0xd5, 0x10, 0x77, 0x62, 0xb1, 0x1f, 0xb5, 0x7c, 0xa7, 0x59, 0x77, - 0x5a, 0xad, 0x7a, 0xc3, 0x09, 0x6d, 0x0d, 0x87, 0x7c, 0x09, 0x67, 0x43, 0x77, 0xcf, 0xc3, 0xce, - 0xd5, 0x9d, 0xd6, 0x9e, 0x1f, 0xb8, 0xd1, 0xfe, 0x41, 0x3d, 0xec, 0xb8, 0x11, 0xb7, 0x07, 0x4d, - 0xce, 0x5f, 0x14, 0x8b, 0x5c, 0x4d, 0xe2, 0x55, 0x25, 0x5a, 0x8d, 0x61, 0xd9, 0xb3, 0x61, 0x76, - 0x01, 0x79, 0x08, 0x13, 0x6b, 0x6e, 0x83, 0x7a, 0x21, 0x45, 0x03, 0xdf, 0x73, 0xb4, 0x16, 0x75, - 0xff, 0x98, 0x99, 0x10, 0x27, 0x5a, 0x3a, 0x11, 0x7e, 0xba, 0x26, 0x9f, 0xfb, 0x03, 0x23, 0x43, - 0xa5, 0x61, 0xfb, 0x94, 0x00, 0x3e, 0x74, 0x02, 0xcf, 0xf5, 0xf6, 0x42, 0xeb, 0x6f, 0x11, 0x18, - 0x51, 0xe3, 0x74, 0x43, 0x3f, 0xa9, 0x88, 0xad, 0x19, 0xa7, 0x6c, 0x6c, 0x87, 0xb3, 0x35, 0x0c, - 0x72, 0x16, 0xcf, 0x2e, 0x42, 0x29, 0x18, 0x66, 0x9f, 0x90, 0xd3, 0x6e, 0xdb, 0x0c, 0xc6, 0x96, - 0x86, 0xa5, 0x05, 0x9c, 0x34, 0x23, 0x7c, 0x69, 0x68, 0x3e, 0xb2, 0x8b, 0x4b, 0x0b, 0xec, 0x9b, - 0xdc, 0x5c, 0x5d, 0x5a, 0xc4, 0xf1, 0x1f, 0xe1, 0xdf, 0xa4, 0xef, 0x36, 0x1b, 0x36, 0x42, 0x59, - 0x69, 0xad, 0xba, 0xbe, 0x26, 0xc6, 0x18, 0x4b, 0x43, 0xe7, 0xa0, 0x65, 0x23, 0x94, 0x69, 0xbb, - 0xdc, 0xa4, 0xb2, 0xe8, 0x7b, 0x51, 0xe0, 0xb7, 0x42, 0x54, 0xe1, 0x46, 0xf8, 0x1c, 0x14, 0xb6, - 0x98, 0x86, 0x28, 0xb2, 0x13, 0xa8, 0xe4, 0x21, 0xcc, 0x56, 0x9b, 0x4f, 0x1d, 0xaf, 0x41, 0x9b, - 0xbc, 0xe4, 0xa1, 0x1f, 0x3c, 0x79, 0xdc, 0xf2, 0x9f, 0x85, 0x38, 0x49, 0x46, 0x84, 0xe9, 0x52, - 0xa0, 0x48, 0xd3, 0xce, 0x33, 0x89, 0x64, 0xe7, 0x51, 0xb3, 0x75, 0x60, 0xb1, 0xe5, 0x77, 0x9a, - 0x62, 0xea, 0xe0, 0x3a, 0xd0, 0x60, 0x00, 0x9b, 0xc3, 0x99, 0x94, 0x56, 0x6a, 0xeb, 0x38, 0x31, - 0x84, 0x94, 0xf6, 0xc3, 0x03, 0x9b, 0xc1, 0xc8, 0x55, 0x18, 0x96, 0x8a, 0x3b, 0xbf, 0xc9, 0x40, - 0x0b, 0xba, 0x54, 0xd8, 0x65, 0x19, 0xfb, 0x8e, 0x6d, 0xda, 0xf0, 0x9f, 0xd2, 0xe0, 0xf9, 0xa2, - 0xdf, 0xa4, 0xd2, 0xac, 0x25, 0xcc, 0x36, 0xbc, 0xa0, 0xde, 0x60, 0x25, 0xb6, 0x89, 0xc8, 0x2a, - 0xe0, 0x1b, 0x77, 0x58, 0x3e, 0x15, 0x57, 0xc0, 0x37, 0xf6, 0xd0, 0x96, 0x65, 0x64, 0x09, 0x4e, - 0x57, 0x3b, 0x91, 0x7f, 0xe0, 0x44, 0x6e, 0x63, 0xa7, 0xbd, 0x17, 0x38, 0xac, 0x92, 0x12, 0x12, - 0xe0, 0x41, 0xc6, 0x91, 0x85, 0xf5, 0x8e, 0x28, 0xb5, 0xd3, 0x04, 0xe4, 0x5d, 0x18, 0x5f, 0x0d, - 0xb9, 0xe9, 0xd2, 0x09, 0x69, 0x13, 0xed, 0x4f, 0xa2, 0x95, 0x6e, 0x58, 0x47, 0x43, 0x66, 0x9d, - 0x1d, 0x7d, 0x9a, 0xb6, 0x81, 0x47, 0x2c, 0x18, 0xaa, 0x86, 0xa1, 0x1b, 0x46, 0x68, 0x56, 0x1a, - 0x59, 0x80, 0xa3, 0xc3, 0xca, 0x90, 0x83, 0x10, 0x5b, 0x94, 0x90, 0x87, 0x30, 0xb6, 0x44, 0x99, - 0xe6, 0xbc, 0x1d, 0x74, 0xc2, 0x08, 0x8d, 0x44, 0x63, 0xf3, 0x67, 0xc5, 0x6a, 0xa4, 0x95, 0x88, - 0xb9, 0xcc, 0x55, 0xd4, 0x26, 0xc2, 0xeb, 0x11, 0x2b, 0xd0, 0xb7, 0x5a, 0x0d, 0x9f, 0x1d, 0x0b, - 0x04, 0xcd, 0x8a, 0xdb, 0x64, 0xeb, 0xcb, 0x34, 0xb6, 0x01, 0x8f, 0x05, 0x62, 0x41, 0xab, 0xef, - 0x63, 0x89, 0x7e, 0x2c, 0x30, 0x48, 0x48, 0x23, 0x65, 0x0d, 0x9f, 0x31, 0x2c, 0x9e, 0x66, 0xa1, - 0x6c, 0xe2, 0x09, 0x6d, 0xe5, 0x1f, 0xc1, 0xd8, 0x62, 0x27, 0x8c, 0xfc, 0x83, 0xed, 0x7d, 0x7a, - 0x40, 0xd1, 0x90, 0x24, 0x0e, 0x3f, 0x0d, 0x04, 0xd7, 0x23, 0x06, 0xd7, 0xbb, 0xa9, 0xa1, 0x93, - 0xcf, 0x80, 0xc8, 0x53, 0xcc, 0x3d, 0x36, 0x3f, 0x3c, 0x36, 0x97, 0xd1, 0x96, 0x34, 0xc2, 0x8f, - 0x2e, 0xf2, 0xf0, 0x53, 0xdf, 0x53, 0xc5, 0xba, 0x3d, 0x33, 0x4d, 0xcc, 0x1a, 0xc4, 0x9b, 0x78, - 0x2f, 0x70, 0xda, 0xfb, 0xe5, 0x72, 0x7c, 0x34, 0x10, 0x9d, 0xda, 0x63, 0x70, 0x43, 0xc5, 0x89, - 0xd1, 0x49, 0x0d, 0x80, 0xff, 0x5c, 0x63, 0x03, 0xcf, 0xad, 0x4f, 0x65, 0x43, 0x5e, 0xac, 0x40, - 0xca, 0x0a, 0x8f, 0x3b, 0x82, 0x6d, 0xcb, 0x35, 0x46, 0x53, 0x63, 0x43, 0x9e, 0x40, 0x89, 0xff, - 0x5a, 0xf7, 0x3d, 0x37, 0xe2, 0xfb, 0xc5, 0x9c, 0x61, 0xaa, 0x4c, 0x16, 0xcb, 0x0a, 0xd0, 0x44, - 0x2c, 0x2a, 0x38, 0x50, 0xa5, 0x5a, 0x35, 0x29, 0xc6, 0x64, 0x0b, 0xc6, 0xb6, 0x02, 0xbf, 0xd9, - 0x69, 0x44, 0xa8, 0x65, 0x9c, 0xc3, 0x85, 0x9f, 0x88, 0x7a, 0xb4, 0x12, 0x2e, 0x93, 0x36, 0x07, - 0xd4, 0xd9, 0xbe, 0xa0, 0xcb, 0x44, 0x43, 0x24, 0x0b, 0x30, 0xb4, 0xe5, 0xb7, 0xdc, 0xc6, 0xf3, - 0xf2, 0x79, 0x6c, 0xf4, 0xb4, 0x64, 0x86, 0x40, 0xd9, 0x54, 0x54, 0x69, 0xdb, 0x08, 0xd2, 0x55, - 0x5a, 0x8e, 0x44, 0xaa, 0x30, 0xf1, 0x19, 0x9b, 0x30, 0xae, 0xef, 0x79, 0x8e, 0x1b, 0xd0, 0xf2, - 0x05, 0x1c, 0x17, 0x34, 0xe3, 0xff, 0x48, 0x2f, 0xd0, 0xa7, 0xb3, 0x41, 0x41, 0x56, 0xe1, 0xd4, - 0x6a, 0x58, 0x8b, 0x02, 0xb7, 0x4d, 0xd7, 0x1d, 0xcf, 0xd9, 0xa3, 0xcd, 0xf2, 0xc5, 0xd8, 0x8e, - 0xee, 0x86, 0xf5, 0x10, 0xcb, 0xea, 0x07, 0xbc, 0x50, 0xb7, 0xa3, 0x27, 0xe8, 0xc8, 0xe7, 0x30, - 0xbd, 0xfc, 0x4d, 0xc4, 0x66, 0x4c, 0xab, 0xda, 0x69, 0xba, 0x51, 0x2d, 0xf2, 0x03, 0x67, 0x8f, - 0x96, 0x2b, 0xc8, 0xef, 0xb5, 0xa3, 0xc3, 0xca, 0x25, 0x2a, 0xca, 0xeb, 0x0e, 0x43, 0xa8, 0x87, - 0x1c, 0x43, 0xbf, 0x1f, 0xcf, 0xe2, 0xc0, 0xa4, 0x5f, 0xeb, 0xb4, 0x99, 0xb6, 0x8d, 0xd2, 0xbf, - 0x64, 0x48, 0x5f, 0x2b, 0xe1, 0xd2, 0x0f, 0x39, 0x20, 0x25, 0x7d, 0x0d, 0x91, 0xd8, 0x40, 0xee, - 0xfb, 0xae, 0x57, 0x6d, 0x44, 0xee, 0x53, 0x2a, 0x4e, 0xcc, 0x61, 0xf9, 0x32, 0xb6, 0x14, 0x6d, - 0xfe, 0xbf, 0xe8, 0xbb, 0x5e, 0xdd, 0xc1, 0xe2, 0x7a, 0x28, 0xca, 0xf5, 0x6f, 0x24, 0x4d, 0x4d, - 0x7e, 0x00, 0x67, 0xd6, 0xfd, 0x47, 0x6e, 0x8b, 0xf2, 0x25, 0x87, 0x8b, 0x05, 0xed, 0x97, 0x16, - 0xf2, 0x45, 0x9b, 0xff, 0x01, 0x62, 0xd4, 0xc5, 0x6a, 0x75, 0xa0, 0x70, 0x74, 0x9b, 0x7f, 0x36, - 0x17, 0xb2, 0x0c, 0xe3, 0xf8, 0x5d, 0xb6, 0xf0, 0x67, 0x58, 0xbe, 0x82, 0x47, 0xba, 0xcb, 0x09, - 0x2d, 0xed, 0xc6, 0xb2, 0x86, 0xb3, 0xec, 0x45, 0xc1, 0x73, 0xdb, 0x20, 0x23, 0x1f, 0xc3, 0x5c, - 0x72, 0x7a, 0x2f, 0xfa, 0xde, 0x63, 0x77, 0xaf, 0x13, 0xd0, 0x66, 0xf9, 0x35, 0xd6, 0x54, 0xbb, - 0x0b, 0x06, 0xf9, 0x0a, 0x66, 0x70, 0xaf, 0xab, 0x7a, 0xbe, 0xf7, 0xfc, 0xc0, 0xfd, 0x31, 0xea, - 0xcf, 0x4c, 0xed, 0xbd, 0x8a, 0x6a, 0xef, 0xd5, 0xa3, 0xc3, 0xca, 0x65, 0xdc, 0x13, 0xeb, 0x8e, - 0x8e, 0x91, 0xb0, 0x5a, 0x67, 0xf3, 0x98, 0x7b, 0x08, 0xa7, 0x53, 0xed, 0x27, 0x25, 0xe8, 0x7f, - 0x22, 0xee, 0x67, 0x47, 0x6d, 0xf6, 0x27, 0x79, 0x0b, 0x06, 0x9f, 0xb2, 0x83, 0x1a, 0xaa, 0x23, - 0xf1, 0x8d, 0x9f, 0x46, 0xba, 0xea, 0x3d, 0xf6, 0x6d, 0x8e, 0xf4, 0x41, 0xf1, 0xbd, 0xc2, 0xfd, - 0x81, 0x91, 0xb1, 0xd2, 0x38, 0xbf, 0x56, 0xbf, 0x3f, 0x30, 0x32, 0x51, 0x9a, 0xb4, 0xaa, 0x70, - 0x2a, 0x81, 0x4f, 0xca, 0x30, 0x4c, 0x3d, 0xa6, 0xfc, 0x37, 0xb9, 0x42, 0x64, 0xcb, 0x9f, 0x64, - 0x1a, 0x06, 0x5b, 0xee, 0x81, 0x1b, 0x61, 0x85, 0x83, 0x36, 0xff, 0x61, 0xfd, 0x76, 0x01, 0x48, - 0x7a, 0x3f, 0x22, 0x37, 0x13, 0x6c, 0xb8, 0xea, 0x2b, 0x40, 0xfa, 0xc5, 0x81, 0xe4, 0xfe, 0x19, - 0x4c, 0xf1, 0x09, 0x21, 0x77, 0x4e, 0xad, 0x2e, 0xbe, 0x62, 0x67, 0x14, 0xeb, 0xc6, 0x26, 0x51, - 0x8c, 0xfb, 0xec, 0x1a, 0x36, 0xad, 0x03, 0x33, 0x99, 0x3b, 0x11, 0x59, 0x87, 0x99, 0x03, 0xdf, - 0x8b, 0xf6, 0x5b, 0xcf, 0xe5, 0x46, 0x24, 0x6a, 0x2b, 0x60, 0x6d, 0xb8, 0xf8, 0x66, 0x22, 0xd8, - 0x53, 0x02, 0x2c, 0x38, 0x62, 0x3d, 0xc2, 0xe8, 0x24, 0x7b, 0x62, 0xd9, 0x70, 0x3a, 0xb5, 0xa0, - 0x93, 0xef, 0xc3, 0x78, 0x03, 0x0f, 0x77, 0x46, 0x4d, 0x7c, 0x3b, 0xd3, 0xe0, 0xfa, 0xb7, 0xca, - 0xe1, 0xbc, 0x2b, 0xff, 0xbc, 0x00, 0xb3, 0x39, 0x4b, 0xf9, 0xc9, 0x45, 0xfd, 0x05, 0x9c, 0x39, - 0x70, 0xbe, 0xa9, 0x07, 0x78, 0x76, 0xaf, 0x07, 0x8e, 0x97, 0x90, 0x36, 0x2e, 0x53, 0xd9, 0x18, - 0xba, 0x6f, 0xd3, 0x81, 0xf3, 0x8d, 0x8d, 0x08, 0x36, 0x2b, 0xe7, 0xed, 0xfc, 0x14, 0x26, 0x8c, - 0xc5, 0xfb, 0xc4, 0x8d, 0xb3, 0x6e, 0xc3, 0xe9, 0x25, 0xda, 0xa2, 0x11, 0x3d, 0xb6, 0xcd, 0xce, - 0xda, 0x02, 0xa8, 0xd1, 0x03, 0xa7, 0xbd, 0xef, 0x33, 0xa5, 0x7e, 0x41, 0xff, 0x25, 0x6c, 0x3e, - 0x44, 0x1e, 0x4f, 0x64, 0xc1, 0xee, 0x1d, 0xae, 0xe8, 0x87, 0x0a, 0xd3, 0xd6, 0xa8, 0xac, 0xff, - 0x58, 0x04, 0x22, 0x56, 0xdf, 0x80, 0x3a, 0x07, 0xb2, 0x19, 0xef, 0xc3, 0x38, 0x3f, 0xa1, 0x73, - 0x30, 0x36, 0x67, 0x6c, 0x7e, 0x4a, 0x7c, 0x79, 0x7a, 0xd1, 0x4a, 0x9f, 0x6d, 0xa0, 0x32, 0x52, - 0x9b, 0x72, 0xd3, 0x02, 0x92, 0x16, 0x0d, 0x52, 0xbd, 0x88, 0x91, 0xea, 0xbf, 0xc9, 0x27, 0x30, - 0xb9, 0xe8, 0x1f, 0xb4, 0x99, 0x4c, 0x04, 0x71, 0xbf, 0x30, 0xdb, 0x88, 0x7a, 0x8d, 0xc2, 0x95, - 0x3e, 0x3b, 0x81, 0x4e, 0x36, 0x60, 0xea, 0x6e, 0xab, 0x13, 0xee, 0x57, 0xbd, 0xe6, 0x62, 0xcb, - 0x0f, 0x25, 0x97, 0x01, 0x71, 0xd2, 0x12, 0x6b, 0x67, 0x1a, 0x63, 0xa5, 0xcf, 0xce, 0x22, 0x24, - 0x57, 0x61, 0x70, 0xf9, 0x29, 0x5b, 0xd3, 0xa5, 0x87, 0x8b, 0x70, 0xc0, 0xdb, 0xf4, 0xe8, 0xe6, - 0xe3, 0x95, 0x3e, 0x9b, 0x97, 0x2e, 0x8c, 0xc2, 0xb0, 0x3c, 0xdd, 0xdf, 0x64, 0xfa, 0xb6, 0x12, - 0x67, 0x2d, 0x72, 0xa2, 0x4e, 0x48, 0xe6, 0x60, 0x64, 0xa7, 0xcd, 0x0e, 0x9d, 0xd2, 0x2c, 0x62, - 0xab, 0xdf, 0xd6, 0x5b, 0xa6, 0xa4, 0xc9, 0x79, 0x88, 0x6d, 0xba, 0x02, 0x59, 0x33, 0xf2, 0xae, - 0x98, 0xc2, 0xed, 0x8e, 0x6d, 0xd4, 0x5b, 0x4c, 0xd4, 0x5b, 0x4a, 0xca, 0xda, 0x9a, 0xc9, 0x14, - 0x9e, 0xf5, 0x39, 0x5c, 0xdc, 0x69, 0x87, 0x34, 0x88, 0xaa, 0xed, 0x76, 0xcb, 0x6d, 0xf0, 0x1b, - 0x32, 0xb4, 0x02, 0xc8, 0xc9, 0xf2, 0x2e, 0x0c, 0x71, 0x80, 0x98, 0x26, 0x72, 0x0e, 0x56, 0xdb, - 0x6d, 0x61, 0x7b, 0xb8, 0xc3, 0x35, 0x7f, 0x6e, 0x4d, 0xb0, 0x05, 0xb6, 0xf5, 0x9b, 0x05, 0xb8, - 0xc8, 0xbf, 0x80, 0x5c, 0xd6, 0xdf, 0x81, 0x51, 0xf4, 0x7f, 0x6b, 0x3b, 0x0d, 0xf9, 0x4d, 0x70, - 0x47, 0x40, 0x09, 0xb4, 0xe3, 0x72, 0xcd, 0xb3, 0xb0, 0x98, 0xef, 0x59, 0x28, 0x3f, 0xb0, 0xfe, - 0xcc, 0x0f, 0xec, 0x33, 0xb0, 0x44, 0x8b, 0x5a, 0xad, 0x54, 0xa3, 0xc2, 0x17, 0x69, 0x95, 0xf5, - 0x3f, 0x8b, 0x30, 0x7b, 0x8f, 0x7a, 0x34, 0x70, 0xb0, 0x9f, 0x86, 0x95, 0x4b, 0xf7, 0x30, 0x2a, - 0x74, 0xf5, 0x30, 0xaa, 0x48, 0xbb, 0x61, 0x11, 0xed, 0x86, 0x29, 0x77, 0x29, 0x76, 0x16, 0xdd, - 0xb1, 0x57, 0x45, 0xb7, 0xf0, 0x2c, 0xda, 0x09, 0x5c, 0x7e, 0xcb, 0xb0, 0x1a, 0x7b, 0x27, 0x0d, - 0xf4, 0xb4, 0x39, 0x4c, 0x09, 0x6f, 0x8d, 0x61, 0xe1, 0x9d, 0x64, 0xfa, 0x24, 0x6d, 0xc0, 0x10, - 0x37, 0x77, 0xe2, 0xdd, 0xd6, 0xd8, 0xfc, 0x75, 0xf1, 0x4d, 0xe5, 0x74, 0x50, 0xd8, 0x46, 0x71, - 0x63, 0xe7, 0x53, 0x20, 0x42, 0x80, 0x2d, 0xb8, 0xcc, 0x7d, 0x06, 0x63, 0x1a, 0xca, 0x71, 0xf6, - 0x7e, 0x65, 0x76, 0x65, 0xea, 0xa8, 0xb7, 0xc7, 0x2d, 0xb8, 0xda, 0xde, 0x6f, 0x7d, 0x08, 0xe5, - 0x74, 0x6b, 0x84, 0xa9, 0xad, 0x97, 0x65, 0xcf, 0x5a, 0x82, 0xe9, 0x7b, 0x34, 0xc2, 0x89, 0x8b, - 0x1f, 0x91, 0xe6, 0x65, 0x97, 0xf8, 0xce, 0xe4, 0xaa, 0x8a, 0x40, 0x36, 0xc1, 0xb4, 0xaf, 0xb4, - 0x06, 0x33, 0x09, 0x2e, 0xa2, 0xfe, 0x0f, 0x60, 0x58, 0x80, 0xd4, 0x8a, 0x2a, 0x5c, 0x75, 0xe9, - 0x23, 0x51, 0xb0, 0x3b, 0xcf, 0xe7, 0xad, 0xe0, 0x6c, 0x4b, 0x02, 0x6b, 0x1f, 0xce, 0xb0, 0x6d, - 0x36, 0xe6, 0xaa, 0xa6, 0xe3, 0x39, 0x18, 0x6d, 0x33, 0x45, 0x21, 0x74, 0x7f, 0xcc, 0xa7, 0xd1, - 0xa0, 0x3d, 0xc2, 0x00, 0x35, 0xf7, 0xc7, 0x94, 0x5c, 0x00, 0xc0, 0x42, 0xec, 0xa6, 0x58, 0x05, - 0x10, 0x9d, 0x9b, 0x32, 0x09, 0xa0, 0x8f, 0x1e, 0x9f, 0x37, 0x36, 0xfe, 0x6d, 0x05, 0x30, 0x9b, - 0xaa, 0x49, 0x74, 0xe0, 0x26, 0x8c, 0x48, 0xfd, 0x38, 0x71, 0xc9, 0xa0, 0xf7, 0xc0, 0x56, 0x48, - 0xe4, 0x75, 0x38, 0xe5, 0xd1, 0x6f, 0xa2, 0x7a, 0xaa, 0x0d, 0x13, 0x0c, 0xbc, 0x25, 0xdb, 0x61, - 0xfd, 0x02, 0x1a, 0x96, 0x6b, 0x9e, 0xff, 0xec, 0x71, 0xcb, 0x79, 0x42, 0x53, 0x15, 0x7f, 0x1f, - 0x46, 0x6a, 0xbd, 0x2b, 0xe6, 0x9f, 0x8f, 0xac, 0xdc, 0x56, 0x24, 0x56, 0x0b, 0xe6, 0x58, 0x97, - 0x6a, 0xd5, 0xf5, 0xb5, 0xd5, 0xe6, 0xd6, 0xb7, 0x2d, 0xc0, 0xa7, 0x70, 0x2e, 0xb3, 0xb6, 0x6f, - 0x5b, 0x88, 0xbf, 0x3f, 0x00, 0xb3, 0x7c, 0x33, 0x49, 0xcf, 0xe0, 0xe3, 0x2f, 0x35, 0x3f, 0x97, - 0xfb, 0xde, 0x5b, 0x19, 0xf7, 0xbd, 0x48, 0xa2, 0xdf, 0xf7, 0x1a, 0xb7, 0xbc, 0xef, 0x65, 0xdf, - 0xf2, 0xa2, 0x11, 0xca, 0xbc, 0xe5, 0x4d, 0xde, 0xed, 0x2e, 0xe7, 0xdf, 0xed, 0xe2, 0xc5, 0x53, - 0xc6, 0xdd, 0x6e, 0xd6, 0x8d, 0x6e, 0xc2, 0x51, 0x6a, 0xe4, 0xd5, 0x3a, 0x4a, 0xbd, 0x0e, 0xc3, - 0xd5, 0x76, 0x5b, 0x73, 0x3c, 0xc4, 0xe1, 0x71, 0xda, 0x6d, 0x2e, 0x3c, 0x59, 0x28, 0xd7, 0x79, - 0xc8, 0x58, 0xe7, 0xdf, 0x07, 0x58, 0xc4, 0xe7, 0x11, 0x38, 0x70, 0x63, 0x88, 0x81, 0x1a, 0x3e, - 0x7f, 0x34, 0x81, 0x03, 0xa7, 0x9b, 0x57, 0x62, 0x64, 0xae, 0xd8, 0x5b, 0xbb, 0x50, 0x4e, 0x4f, - 0x9f, 0x57, 0xb0, 0x74, 0xfd, 0x5e, 0x01, 0x2e, 0x08, 0x25, 0x27, 0xf1, 0x81, 0x9f, 0x7c, 0x76, - 0xbe, 0x03, 0xe3, 0x82, 0x76, 0x3b, 0xfe, 0x10, 0xf8, 0x05, 0xbb, 0x5c, 0x8c, 0xf9, 0x8a, 0x6e, - 0xa0, 0x91, 0x77, 0x60, 0x04, 0xff, 0x88, 0x2f, 0x86, 0x98, 0x64, 0x46, 0x11, 0xb5, 0x9e, 0xbc, - 0x1e, 0x52, 0xa8, 0xd6, 0xd7, 0x70, 0x31, 0xaf, 0xe1, 0xaf, 0x40, 0x2e, 0xff, 0xae, 0x00, 0xe7, - 0x04, 0x7b, 0x63, 0xa9, 0x78, 0xa1, 0x5d, 0xe7, 0x04, 0xee, 0xca, 0xf7, 0x61, 0x8c, 0x55, 0x28, - 0xdb, 0xdd, 0x2f, 0xb6, 0x56, 0x71, 0x72, 0x88, 0x4b, 0x96, 0x9c, 0xc8, 0x11, 0xee, 0x37, 0xce, - 0x41, 0x4b, 0x5a, 0x46, 0x6c, 0x9d, 0xd8, 0xfa, 0x12, 0xce, 0x67, 0x77, 0xe1, 0x15, 0xc8, 0xe7, - 0x3e, 0xcc, 0x65, 0x6c, 0x0a, 0x2f, 0xb6, 0x27, 0x7f, 0x01, 0xe7, 0x32, 0x79, 0xbd, 0x82, 0x66, - 0xae, 0x30, 0x8d, 0x23, 0x7a, 0x05, 0x43, 0x68, 0x3d, 0x84, 0xb3, 0x19, 0x9c, 0x5e, 0x41, 0x13, - 0xef, 0xc1, 0xac, 0xd2, 0xb4, 0x5f, 0xaa, 0x85, 0xeb, 0x70, 0x81, 0x33, 0x7a, 0x35, 0xa3, 0xf2, - 0x00, 0xce, 0x09, 0x76, 0xaf, 0x40, 0x7a, 0x2b, 0x70, 0x3e, 0x3e, 0x50, 0x67, 0xe8, 0x49, 0xc7, - 0x5e, 0x64, 0xac, 0x35, 0xb8, 0x14, 0x73, 0xca, 0x51, 0x1a, 0x8e, 0xcf, 0x8d, 0xab, 0x83, 0xf1, - 0x28, 0xbd, 0x92, 0x11, 0x7d, 0x08, 0x67, 0x0c, 0xa6, 0xaf, 0x4c, 0x55, 0x5a, 0x85, 0x29, 0xce, - 0xd8, 0x54, 0x9d, 0xe7, 0x75, 0xd5, 0x79, 0x6c, 0xfe, 0x74, 0xcc, 0x12, 0xc1, 0xbb, 0x77, 0x32, - 0xb4, 0xe9, 0x75, 0xd4, 0xa6, 0x25, 0x4a, 0xdc, 0xc2, 0x77, 0x60, 0x88, 0x43, 0x44, 0xfb, 0x32, - 0x98, 0xf1, 0xc3, 0x02, 0x27, 0x13, 0xc8, 0xd6, 0x0f, 0xe0, 0x02, 0x3f, 0x89, 0xc6, 0x17, 0x95, - 0xe6, 0x69, 0xf1, 0xfb, 0x89, 0x83, 0xe8, 0x59, 0xc1, 0x37, 0x89, 0x9f, 0x73, 0x1e, 0x7d, 0x24, - 0xe7, 0x76, 0x1e, 0xff, 0x63, 0x3d, 0x5d, 0x93, 0x07, 0xcc, 0x62, 0xe6, 0x01, 0xf3, 0x0a, 0x5c, - 0x56, 0x07, 0xcc, 0x64, 0x35, 0x72, 0x6a, 0x59, 0x5f, 0xc2, 0x39, 0xde, 0x51, 0xe9, 0x52, 0x68, - 0x36, 0xe3, 0xc3, 0x44, 0x37, 0x67, 0x45, 0x37, 0x4d, 0xec, 0x9c, 0x4e, 0xfe, 0xed, 0x82, 0xfc, - 0xe4, 0xb2, 0x99, 0xff, 0xbc, 0x4f, 0xdc, 0x1b, 0x50, 0x51, 0x02, 0x31, 0x5b, 0xf4, 0x62, 0xc7, - 0xed, 0x75, 0x98, 0xd1, 0xd9, 0xb8, 0x0d, 0xba, 0x7b, 0x1b, 0x6f, 0x90, 0xde, 0x66, 0x9f, 0x05, - 0x02, 0xe4, 0xb4, 0x2b, 0x67, 0xc8, 0x0d, 0xf1, 0x6d, 0x85, 0x69, 0xd5, 0xe1, 0x7c, 0x7a, 0x28, - 0xdc, 0x86, 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, 0x32, - 0x10, 0x59, 0xb4, 0x58, 0xb3, 0x65, 0xd5, 0x67, 0xa1, 0x7f, 0xb1, 0x66, 0x8b, 0x87, 0x4c, 0xa8, - 0x09, 0x36, 0xc2, 0xc0, 0x66, 0xb0, 0xa4, 0x46, 0x5e, 0x3c, 0x86, 0x46, 0x7e, 0x7f, 0x60, 0xa4, - 0xbf, 0x34, 0x60, 0x93, 0x9a, 0xbb, 0xe7, 0x3d, 0x74, 0xa3, 0x7d, 0x55, 0x61, 0xd5, 0xfa, 0x0a, - 0xa6, 0x8c, 0xea, 0xc5, 0x57, 0xdc, 0xf5, 0x05, 0x16, 0xd3, 0x67, 0x17, 0xab, 0xe8, 0x56, 0x83, - 0x26, 0x8b, 0x71, 0xbe, 0xde, 0x34, 0x9c, 0x3a, 0x3e, 0xef, 0xb5, 0x65, 0xa1, 0xf5, 0xcf, 0x06, - 0x34, 0xee, 0xda, 0xbb, 0xb6, 0x2e, 0xbd, 0xbb, 0x0d, 0xc0, 0x67, 0x88, 0xd6, 0x39, 0xa6, 0x00, - 0x8e, 0x09, 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, 0x83, 0xe4, 0xe3, 0x8c, - 0x41, 0xbc, 0xb0, 0x7a, 0x4d, 0xde, 0x60, 0xa7, 0xfb, 0x76, 0xb2, 0xf7, 0x19, 0xcf, 0x60, 0x86, - 0xd1, 0xba, 0x8f, 0xf1, 0x60, 0xb1, 0xfc, 0x4d, 0x44, 0x3d, 0xbe, 0xb6, 0x0f, 0x61, 0x3d, 0x57, - 0xbb, 0xd4, 0x13, 0x23, 0x0b, 0xfb, 0x7b, 0xcc, 0xa7, 0x4e, 0x55, 0x99, 0x9d, 0xcd, 0x1f, 0x27, - 0x91, 0xbd, 0xb6, 0xec, 0x35, 0xdb, 0xbe, 0xab, 0x0e, 0x4c, 0x7c, 0x12, 0x05, 0xad, 0x3a, 0x15, - 0x70, 0x5b, 0x47, 0xb2, 0x5e, 0xef, 0xea, 0xd5, 0x3e, 0x02, 0x03, 0xdb, 0x8b, 0xdb, 0x6b, 0xa5, - 0x82, 0x75, 0x13, 0x40, 0xab, 0x09, 0x60, 0x68, 0x63, 0xd3, 0x5e, 0xaf, 0xae, 0x95, 0xfa, 0xc8, - 0x0c, 0x9c, 0x7e, 0xb8, 0xba, 0xb1, 0xb4, 0xf9, 0xb0, 0x56, 0xaf, 0xad, 0x57, 0xed, 0xed, 0xc5, - 0xaa, 0xbd, 0x54, 0x2a, 0x58, 0x5f, 0xc3, 0xb4, 0xd9, 0xc3, 0x57, 0x3a, 0x09, 0x23, 0x98, 0x52, - 0xfa, 0xcc, 0xfd, 0x87, 0xdb, 0x9a, 0x47, 0xab, 0x38, 0xfc, 0x25, 0x3d, 0xb3, 0xc4, 0x31, 0x51, - 0x7c, 0x46, 0x1a, 0x12, 0x79, 0x93, 0xab, 0x05, 0xc9, 0x97, 0xcb, 0x4c, 0x2d, 0xa8, 0xc7, 0x7a, - 0x01, 0x2e, 0x7d, 0xdf, 0x83, 0x69, 0xb3, 0xd6, 0xe3, 0x5a, 0xa9, 0x5e, 0x43, 0x57, 0x5f, 0xed, - 0x59, 0x13, 0x21, 0xfa, 0xb5, 0x81, 0x58, 0x59, 0xbf, 0x07, 0x25, 0x81, 0x15, 0xef, 0xbc, 0x57, - 0xa4, 0x19, 0xb1, 0x90, 0xf1, 0x08, 0x53, 0x3a, 0xa5, 0xfb, 0x50, 0x62, 0x2b, 0xa6, 0xa0, 0xe4, - 0x15, 0x4c, 0xc3, 0xe0, 0x5a, 0x7c, 0x9d, 0x63, 0xf3, 0x1f, 0xf8, 0xba, 0x27, 0x72, 0x82, 0x48, - 0xfa, 0xc1, 0x8d, 0xda, 0xea, 0x37, 0x79, 0x13, 0x86, 0xee, 0xba, 0xad, 0x48, 0x98, 0x46, 0xe2, - 0x4d, 0x9e, 0xb1, 0xe5, 0x05, 0xb6, 0x40, 0xb0, 0x6c, 0x38, 0xad, 0x55, 0x78, 0x82, 0xa6, 0x92, - 0x32, 0x0c, 0x6f, 0xd0, 0x6f, 0xb4, 0xfa, 0xe5, 0x4f, 0xeb, 0x5d, 0x38, 0x2d, 0x7c, 0x0c, 0x35, - 0x31, 0x5d, 0x16, 0x6f, 0xc5, 0x0b, 0xc6, 0x83, 0x55, 0xc1, 0x12, 0x8b, 0x18, 0xdd, 0x4e, 0xbb, - 0xf9, 0x82, 0x74, 0x6c, 0xa3, 0x38, 0x21, 0xdd, 0x1b, 0xf2, 0x16, 0xa8, 0xd7, 0x70, 0xfe, 0x8d, - 0x22, 0x94, 0x13, 0x56, 0x86, 0xc5, 0x7d, 0xa7, 0xd5, 0xa2, 0xde, 0x1e, 0x25, 0xd7, 0x60, 0x60, - 0x7b, 0x73, 0x7b, 0x4b, 0x58, 0x49, 0xa5, 0x77, 0x01, 0x03, 0x29, 0x1c, 0x1b, 0x31, 0xc8, 0x03, - 0x38, 0x2d, 0xbd, 0x88, 0x55, 0x91, 0x18, 0xa1, 0x0b, 0xdd, 0x7d, 0x92, 0xd3, 0x74, 0xe4, 0x6d, - 0x61, 0x12, 0xf9, 0x51, 0xc7, 0x0d, 0x68, 0x13, 0x2d, 0x3f, 0xf1, 0x55, 0xbd, 0x56, 0x62, 0xeb, - 0x68, 0xe4, 0x7b, 0x30, 0x5e, 0xab, 0x6d, 0xc6, 0xb5, 0x0f, 0x1a, 0x37, 0x44, 0x7a, 0x91, 0x6d, - 0x20, 0xf2, 0x27, 0xc1, 0xd6, 0xef, 0x17, 0x60, 0x36, 0xc7, 0xdc, 0x42, 0xde, 0x34, 0xe4, 0x30, - 0xa5, 0xc9, 0x41, 0xa2, 0xac, 0xf4, 0x09, 0x41, 0x2c, 0x6a, 0x3e, 0xd9, 0xfd, 0x27, 0xf0, 0xc9, - 0x5e, 0xe9, 0x8b, 0xfd, 0xb0, 0xc9, 0xeb, 0xd0, 0x5f, 0xab, 0x6d, 0x0a, 0xb3, 0x3a, 0x89, 0x7b, - 0xa0, 0x21, 0x33, 0x84, 0x05, 0x80, 0x11, 0x09, 0xb2, 0x4e, 0xc1, 0x84, 0x31, 0x30, 0x96, 0x05, - 0xe3, 0x7a, 0x0b, 0xd9, 0xe8, 0x2f, 0xfa, 0x4d, 0x35, 0xfa, 0xec, 0x6f, 0xeb, 0x97, 0x4d, 0x99, - 0x91, 0x0b, 0x00, 0xf2, 0xbe, 0xd6, 0x6d, 0xca, 0x9b, 0x1f, 0x01, 0x59, 0x6d, 0x92, 0xcb, 0x30, - 0x1e, 0xd0, 0xa6, 0x1b, 0xd0, 0x46, 0x54, 0xef, 0x04, 0xe2, 0x61, 0x8c, 0x3d, 0x26, 0x61, 0x3b, - 0x41, 0x8b, 0x7c, 0x07, 0x86, 0xf8, 0x45, 0xb2, 0xe8, 0xbd, 0x3c, 0x24, 0xd4, 0x6a, 0x9b, 0xeb, - 0x77, 0xab, 0xfc, 0xa2, 0xdb, 0x16, 0x28, 0xd6, 0x02, 0x8c, 0x69, 0xbd, 0xea, 0x55, 0xfb, 0x34, - 0x0c, 0xea, 0x56, 0x4a, 0xfe, 0xc3, 0xfa, 0xad, 0x02, 0x4c, 0xe3, 0x34, 0xd8, 0x73, 0xd9, 0xf6, - 0x10, 0xf7, 0x65, 0xde, 0x18, 0xb4, 0xf3, 0xc6, 0xa0, 0x25, 0x70, 0xd5, 0xe8, 0x7d, 0x90, 0x1a, - 0xbd, 0xf3, 0x59, 0xa3, 0x87, 0x4b, 0x80, 0xeb, 0x7b, 0xfa, 0xa0, 0xe9, 0xd7, 0x75, 0xbf, 0x5d, - 0x80, 0x29, 0xad, 0x4d, 0xaa, 0x83, 0xb7, 0x8d, 0x26, 0x9d, 0xcb, 0x68, 0x52, 0x6a, 0x3e, 0x2d, - 0xa4, 0x5a, 0xf4, 0x5a, 0xb7, 0x16, 0x65, 0x4d, 0x27, 0x63, 0x9a, 0xfc, 0x59, 0x01, 0x66, 0x32, - 0x65, 0x40, 0xce, 0x30, 0xfd, 0xbf, 0x11, 0xd0, 0x48, 0x48, 0x5e, 0xfc, 0x62, 0xf0, 0xd5, 0x30, - 0xec, 0xd0, 0x40, 0xc8, 0x5d, 0xfc, 0x22, 0xaf, 0xc1, 0xc4, 0x16, 0x0d, 0x5c, 0xbf, 0xc9, 0x1f, - 0x26, 0x70, 0x8f, 0xdf, 0x09, 0xdb, 0x04, 0x92, 0xf3, 0x30, 0xaa, 0x3c, 0x56, 0xb9, 0x0d, 0xd7, - 0x8e, 0x01, 0x8c, 0xf7, 0x92, 0xbb, 0xc7, 0x2f, 0x7e, 0x18, 0xb1, 0xf8, 0xc5, 0x16, 0x60, 0x69, - 0x51, 0x1d, 0xe2, 0x0b, 0xb0, 0x34, 0x97, 0x9e, 0x81, 0xa1, 0xcf, 0x6c, 0x9c, 0xc7, 0x18, 0x73, - 0xc2, 0x16, 0xbf, 0xc8, 0x24, 0xba, 0x96, 0xe3, 0xbb, 0x18, 0x74, 0x29, 0xff, 0x00, 0xa6, 0xb3, - 0xe4, 0x9a, 0xf5, 0x15, 0x08, 0xda, 0xa2, 0xa2, 0xfd, 0x12, 0xa6, 0xaa, 0xcd, 0x66, 0x3c, 0x5d, - 0xf9, 0xa8, 0xf2, 0x75, 0x82, 0xdb, 0x34, 0x85, 0x5a, 0x3b, 0xb0, 0xea, 0xb9, 0x91, 0x3d, 0xb5, - 0xfc, 0x8d, 0x1b, 0x46, 0xae, 0xb7, 0xa7, 0x19, 0x5e, 0xed, 0x33, 0x1b, 0xf4, 0x59, 0xc6, 0x14, - 0x60, 0x1a, 0x87, 0xc9, 0x9b, 0xc3, 0x33, 0x98, 0x4f, 0x6b, 0x6c, 0xe3, 0xa5, 0x6b, 0xd6, 0xe4, - 0x1b, 0x17, 0xf4, 0x57, 0x1b, 0x4f, 0xac, 0xef, 0xc1, 0x19, 0xbe, 0xec, 0x77, 0x6b, 0xbc, 0x68, - 0xb6, 0x6e, 0x27, 0xb6, 0xde, 0x93, 0x96, 0x9c, 0xae, 0x2d, 0xb3, 0xc7, 0x8d, 0xb6, 0x60, 0x95, - 0xff, 0xa3, 0x00, 0x73, 0x09, 0xd2, 0xda, 0x73, 0xaf, 0x21, 0xf7, 0x9c, 0xd7, 0x93, 0xae, 0xfb, - 0xa8, 0x2b, 0x71, 0x03, 0xa9, 0xdb, 0x54, 0xde, 0xfb, 0xe4, 0x26, 0x00, 0x27, 0xd6, 0x54, 0x1c, - 0xbc, 0x1e, 0x10, 0x5e, 0x4e, 0xa8, 0xe4, 0x68, 0x28, 0xa4, 0x03, 0x59, 0x72, 0x17, 0xdf, 0x48, - 0x2f, 0xfb, 0x39, 0xc6, 0x59, 0xa1, 0x82, 0xbc, 0x9e, 0x63, 0x48, 0xcf, 0xe2, 0x6f, 0xfd, 0x9d, - 0x7e, 0x98, 0xd5, 0x07, 0xf0, 0x45, 0xfa, 0xba, 0x05, 0x63, 0x8b, 0xbe, 0x17, 0xd1, 0x6f, 0x22, - 0x2d, 0xce, 0x05, 0x51, 0xde, 0x08, 0xaa, 0x44, 0xa8, 0xd7, 0x1c, 0x50, 0x67, 0xba, 0x9e, 0xe1, - 0xad, 0x19, 0x23, 0x92, 0x45, 0x98, 0xd8, 0xa0, 0xcf, 0x52, 0x02, 0x44, 0x8f, 0x51, 0x8f, 0x3e, - 0xab, 0x6b, 0x42, 0xd4, 0xdd, 0xf8, 0x0c, 0x1a, 0xf2, 0x08, 0x26, 0xe5, 0xe4, 0x32, 0x84, 0x39, - 0xa7, 0xef, 0xbc, 0xe6, 0x74, 0xe6, 0x71, 0x20, 0x58, 0x0d, 0x39, 0x32, 0x4c, 0x70, 0x64, 0x5d, - 0xe7, 0x35, 0xf2, 0xd0, 0x06, 0xe6, 0xd6, 0xae, 0x95, 0x18, 0xfe, 0xb8, 0xc9, 0x90, 0x06, 0x3a, - 0x0b, 0x6b, 0x0b, 0xca, 0xe9, 0xf1, 0x10, 0xb5, 0xbd, 0x0d, 0x43, 0x1c, 0x2a, 0x54, 0x25, 0x19, - 0xc2, 0x48, 0x61, 0x73, 0x5b, 0x46, 0x53, 0xec, 0x4a, 0x1c, 0x66, 0xad, 0xa0, 0x7d, 0x49, 0xe1, - 0x28, 0x65, 0xf5, 0x56, 0x72, 0x78, 0xd1, 0xd5, 0x59, 0x0e, 0xaf, 0xee, 0x8b, 0x23, 0x9f, 0xa4, - 0x2c, 0xa2, 0x89, 0x4e, 0xe7, 0x24, 0x1a, 0x76, 0x1d, 0x86, 0x05, 0x28, 0x11, 0x5c, 0x29, 0xfe, - 0xfc, 0x24, 0x82, 0xf5, 0x01, 0x9c, 0x45, 0x7b, 0xa1, 0xeb, 0xed, 0xb5, 0xe8, 0x4e, 0x68, 0x3c, - 0x2a, 0xe9, 0xf5, 0x59, 0x7f, 0x04, 0x73, 0x59, 0xb4, 0x3d, 0xbf, 0x6c, 0x1e, 0xee, 0xe4, 0x4f, - 0x8a, 0x30, 0xbd, 0x1a, 0xea, 0x0a, 0x97, 0x0a, 0x79, 0x92, 0x11, 0x86, 0x03, 0x65, 0xb2, 0xd2, - 0x97, 0x15, 0x66, 0xe3, 0x6d, 0xed, 0xb9, 0x6b, 0xb1, 0x5b, 0x7c, 0x0d, 0xb6, 0x6d, 0xa9, 0x07, - 0xaf, 0xaf, 0xc3, 0xc0, 0x06, 0x5b, 0xaa, 0xfb, 0xc5, 0xd8, 0x71, 0x0a, 0x06, 0xc2, 0xe7, 0xa6, - 0x6c, 0x8b, 0x64, 0x3f, 0xc8, 0xdd, 0xd4, 0xa3, 0xd6, 0x81, 0xde, 0xf1, 0x23, 0x56, 0xfa, 0x52, - 0xef, 0x5b, 0xdf, 0x85, 0xb1, 0x6a, 0xf3, 0x80, 0xbb, 0x64, 0xfa, 0x5e, 0xe2, 0xb3, 0xd4, 0x4a, - 0x56, 0xfa, 0x6c, 0x1d, 0x91, 0x5c, 0xe5, 0xaf, 0x1a, 0x86, 0x72, 0x62, 0x6a, 0x30, 0x65, 0xad, - 0xda, 0x6e, 0x2f, 0x8c, 0xc0, 0x10, 0x7f, 0x68, 0x69, 0x7d, 0x09, 0x73, 0xc2, 0x91, 0x87, 0x5b, - 0x47, 0xd1, 0xdd, 0x27, 0x8c, 0x7d, 0xb5, 0xba, 0x39, 0xdf, 0x5c, 0x04, 0xc0, 0xb3, 0xd0, 0xaa, - 0xd7, 0xa4, 0xdf, 0x08, 0x4f, 0x42, 0x0d, 0x62, 0xbd, 0x03, 0xa3, 0x4a, 0x42, 0xa8, 0xf0, 0x6b, - 0x9b, 0x1d, 0x4a, 0x6b, 0xda, 0x78, 0xc5, 0x2b, 0x9f, 0xee, 0x9e, 0x35, 0xfa, 0x2e, 0xa2, 0xe4, - 0xf0, 0x13, 0x82, 0x0b, 0x33, 0x89, 0x49, 0x10, 0x07, 0x61, 0x50, 0x3a, 0x3a, 0x77, 0x75, 0x54, - 0xbf, 0x93, 0x2a, 0x7c, 0xf1, 0x58, 0x2a, 0xbc, 0xf5, 0x2f, 0x8b, 0x78, 0xb8, 0x4c, 0xc9, 0x23, - 0x61, 0xa7, 0xd3, 0x6d, 0x85, 0x0b, 0x30, 0x8a, 0xbd, 0x5f, 0x92, 0x0f, 0x06, 0xbb, 0xfb, 0xa1, - 0x8c, 0xfc, 0xe4, 0xb0, 0xd2, 0x87, 0xce, 0x27, 0x31, 0x19, 0xf9, 0x18, 0x86, 0x97, 0xbd, 0x26, - 0x72, 0xe8, 0x3f, 0x01, 0x07, 0x49, 0xc4, 0xc6, 0x04, 0x9b, 0xbc, 0xcd, 0x3e, 0x61, 0x6e, 0xde, - 0xb1, 0x35, 0x48, 0x7c, 0xca, 0x1d, 0xcc, 0x3b, 0xe5, 0x0e, 0x25, 0x4e, 0xb9, 0x16, 0x0c, 0x6e, - 0x06, 0x4d, 0x11, 0xdb, 0x66, 0x72, 0x7e, 0x5c, 0x08, 0x0e, 0x61, 0x36, 0x2f, 0xb2, 0xfe, 0x57, - 0x01, 0x66, 0xef, 0xd1, 0x28, 0x73, 0x0e, 0x19, 0x52, 0x29, 0xbc, 0xb4, 0x54, 0x8a, 0x2f, 0x22, - 0x15, 0xd5, 0xeb, 0xfe, 0xbc, 0x5e, 0x0f, 0xe4, 0xf5, 0x7a, 0x30, 0xbf, 0xd7, 0xf7, 0x60, 0x88, - 0x77, 0x95, 0x9d, 0xe4, 0x57, 0x23, 0x7a, 0x10, 0x9f, 0xe4, 0x75, 0x2f, 0x3a, 0x9b, 0x97, 0x31, - 0x45, 0x72, 0xcd, 0x09, 0xf5, 0x93, 0xbc, 0xf8, 0x69, 0xfd, 0x10, 0x9f, 0x1a, 0xaf, 0xf9, 0x8d, - 0x27, 0x9a, 0x45, 0x78, 0x98, 0x7f, 0xa1, 0xc9, 0x1b, 0x04, 0x86, 0xc5, 0x4b, 0x6c, 0x89, 0x41, - 0x2e, 0xc1, 0xd8, 0xaa, 0x77, 0xd7, 0x0f, 0x1a, 0x74, 0xd3, 0x6b, 0x71, 0xee, 0x23, 0xb6, 0x0e, - 0x12, 0x96, 0x12, 0x51, 0x43, 0x6c, 0x7e, 0x40, 0x40, 0xc2, 0xfc, 0xc0, 0x60, 0xbb, 0xf3, 0x36, - 0x2f, 0x13, 0x86, 0x18, 0xf6, 0x77, 0xb7, 0x93, 0xbb, 0x3a, 0xe2, 0xf7, 0x42, 0x7c, 0x04, 0x67, - 0x6d, 0xda, 0x6e, 0x39, 0x4c, 0xa7, 0x3b, 0xf0, 0x39, 0xbe, 0xea, 0xf3, 0xa5, 0x8c, 0x67, 0x82, - 0xa6, 0x4f, 0x85, 0x6a, 0x72, 0xb1, 0x4b, 0x93, 0x0f, 0xe0, 0xf2, 0x3d, 0x1a, 0x99, 0x0b, 0x6a, - 0x6c, 0x6f, 0x16, 0x9d, 0x5f, 0x81, 0x91, 0xd0, 0xb4, 0x95, 0xcb, 0x67, 0x6f, 0x99, 0x84, 0xbb, - 0x77, 0xe4, 0x6d, 0x92, 0xe0, 0xa3, 0xfe, 0xb2, 0x3e, 0x81, 0x4a, 0x5e, 0x75, 0xc7, 0x73, 0x79, - 0x75, 0xe1, 0x52, 0x3e, 0x03, 0xd1, 0xdc, 0x65, 0x90, 0x76, 0x75, 0xf1, 0x09, 0xf5, 0x6a, 0xad, - 0x69, 0x8a, 0x17, 0x7f, 0x58, 0x0b, 0xd2, 0xf9, 0xef, 0x25, 0x9a, 0x5b, 0xc7, 0x2b, 0x6b, 0x93, - 0x41, 0x2c, 0xd7, 0x2a, 0x8c, 0x48, 0x98, 0x90, 0xeb, 0x6c, 0x66, 0x4b, 0xa5, 0x40, 0x9b, 0x92, - 0x81, 0x22, 0xb3, 0x7e, 0x28, 0xaf, 0x6f, 0x4c, 0x8a, 0xe3, 0xbd, 0x9b, 0x3d, 0xce, 0x7d, 0x8d, - 0xe5, 0xc3, 0x59, 0x93, 0xb7, 0x6e, 0x96, 0x2f, 0x69, 0x66, 0x79, 0x6e, 0x8d, 0xbf, 0x64, 0x9a, - 0x89, 0x85, 0xa5, 0x41, 0x03, 0x91, 0x8b, 0xba, 0xf1, 0x7d, 0x3c, 0xfd, 0x10, 0xf7, 0x16, 0xcc, - 0x65, 0x55, 0xa8, 0x9d, 0x03, 0x95, 0x85, 0x57, 0xe8, 0x3b, 0x4b, 0x70, 0x51, 0x46, 0x97, 0xf2, - 0xfd, 0x28, 0x8c, 0x02, 0xa7, 0x5d, 0x6b, 0x04, 0x6e, 0x3b, 0xa6, 0xb2, 0x60, 0x88, 0x43, 0x84, - 0x24, 0xf8, 0x55, 0x18, 0xc7, 0x11, 0x25, 0xd6, 0xaf, 0x16, 0xc0, 0x32, 0xfc, 0xb4, 0x70, 0x9c, - 0xb7, 0x02, 0xff, 0xa9, 0xdb, 0xd4, 0xae, 0x9f, 0xde, 0x34, 0x4c, 0x9f, 0xfc, 0x4d, 0x62, 0xd2, - 0x45, 0x5c, 0xac, 0x99, 0xb7, 0x12, 0xe6, 0x48, 0xae, 0x78, 0xa2, 0xef, 0x96, 0xf9, 0x20, 0x42, - 0x99, 0x29, 0xff, 0x4f, 0x01, 0xae, 0x74, 0x6d, 0x83, 0xe8, 0xcf, 0x23, 0x28, 0x25, 0xcb, 0xc4, - 0x0c, 0xaa, 0x68, 0x7e, 0x1b, 0x69, 0x0e, 0xbb, 0xb7, 0xb9, 0x1f, 0xba, 0xf4, 0x6f, 0x6a, 0x2b, - 0xce, 0x29, 0x7e, 0x27, 0x6f, 0x3d, 0xc6, 0xaf, 0xf0, 0x23, 0xa7, 0xb5, 0x88, 0x06, 0x80, 0xfe, - 0xf8, 0x4d, 0x41, 0xc4, 0xa0, 0xf5, 0x64, 0x98, 0x0c, 0x0d, 0xd9, 0xfa, 0x14, 0xbf, 0xeb, 0xec, - 0x46, 0x1f, 0xef, 0x53, 0x5b, 0x84, 0x2b, 0x09, 0xdf, 0x81, 0x17, 0x60, 0x12, 0xc1, 0x0c, 0x13, - 0x3f, 0xd3, 0xbd, 0xef, 0x05, 0x7e, 0xa7, 0xfd, 0xf3, 0x19, 0xf5, 0x3f, 0x28, 0x70, 0x67, 0x4e, - 0xbd, 0x5a, 0x31, 0xd0, 0x8b, 0x00, 0x31, 0x34, 0xe1, 0xd4, 0xaf, 0x0a, 0x76, 0x6f, 0xf3, 0x23, - 0x37, 0xde, 0x2a, 0xec, 0x71, 0x06, 0x1a, 0xd9, 0xcf, 0x77, 0x24, 0xef, 0xa0, 0xc3, 0x80, 0xaa, - 0xfd, 0x78, 0x72, 0x7f, 0x57, 0xda, 0x3f, 0x4e, 0x48, 0xb7, 0x0f, 0xd3, 0x6c, 0x05, 0xa8, 0x76, - 0xa2, 0x7d, 0x3f, 0x70, 0x23, 0xf9, 0x3c, 0x85, 0x6c, 0x89, 0x88, 0x00, 0x9c, 0xea, 0xa3, 0x9f, - 0x1d, 0x56, 0xde, 0x3b, 0x49, 0xdc, 0x4f, 0xc9, 0x73, 0x5b, 0x45, 0x11, 0xb0, 0x66, 0xa1, 0x7f, - 0xd1, 0x5e, 0xc3, 0x05, 0xcf, 0x5e, 0x53, 0x0b, 0x9e, 0xbd, 0x66, 0xfd, 0x79, 0x11, 0x2a, 0x3c, - 0x66, 0x09, 0xfa, 0x99, 0xc4, 0x56, 0x0b, 0xcd, 0x71, 0xe5, 0xb8, 0x06, 0x86, 0x44, 0x4c, 0x92, - 0xe2, 0x71, 0x62, 0x92, 0xfc, 0x12, 0xe4, 0x98, 0xac, 0x8e, 0x61, 0x05, 0x78, 0xe3, 0xe8, 0xb0, - 0x72, 0x25, 0xb6, 0x02, 0xf0, 0xd2, 0x2c, 0x73, 0x40, 0x4e, 0x15, 0x69, 0xfb, 0xc5, 0xc0, 0x0b, - 0xd8, 0x2f, 0x6e, 0xc1, 0x30, 0x1e, 0x66, 0x56, 0xb7, 0x84, 0xe7, 0x27, 0x4e, 0x4f, 0x8c, 0x50, - 0x54, 0x77, 0xf5, 0x70, 0x80, 0x12, 0xcd, 0xfa, 0x07, 0x45, 0xb8, 0x94, 0x2f, 0x73, 0xd1, 0xb6, - 0x25, 0x80, 0xd8, 0xc3, 0xa5, 0x9b, 0x47, 0x0d, 0x7e, 0x3b, 0xcf, 0xe8, 0x23, 0xe5, 0xd1, 0xa6, - 0xd1, 0x31, 0xdd, 0x47, 0xbe, 0xb4, 0x4e, 0x5c, 0xa7, 0x18, 0x0f, 0xb0, 0x45, 0x34, 0x5b, 0x01, - 0x32, 0xa2, 0xd9, 0x0a, 0x18, 0x79, 0x04, 0xb3, 0x5b, 0x81, 0xfb, 0xd4, 0x89, 0xe8, 0x03, 0xfa, - 0x9c, 0x3f, 0x16, 0x5a, 0x16, 0x2f, 0x84, 0xf8, 0xf3, 0xf9, 0x6b, 0x47, 0x87, 0x95, 0xd7, 0xda, - 0x1c, 0x05, 0x23, 0x96, 0xf1, 0xb7, 0x9f, 0xf5, 0xf4, 0xa3, 0xa1, 0x3c, 0x46, 0xd6, 0x7f, 0x28, - 0xc0, 0x39, 0x54, 0xcb, 0x85, 0xd9, 0x55, 0x56, 0xfe, 0x42, 0x8e, 0x95, 0x7a, 0x07, 0xc5, 0x5c, - 0x44, 0xc7, 0x4a, 0xe3, 0x25, 0xba, 0x6d, 0xa0, 0x91, 0x55, 0x18, 0x13, 0xbf, 0xf1, 0xfb, 0xeb, - 0xc7, 0x03, 0xc1, 0x8c, 0xb6, 0x60, 0xe1, 0x54, 0xe7, 0xa6, 0x22, 0x9c, 0xd8, 0x82, 0x19, 0x3e, - 0xd8, 0xb4, 0x75, 0x5a, 0xeb, 0xa7, 0x45, 0x38, 0xbf, 0x4b, 0x03, 0xf7, 0xf1, 0xf3, 0x9c, 0xce, - 0x6c, 0xc2, 0xb4, 0x04, 0xf1, 0xb8, 0x25, 0xc6, 0x27, 0xc6, 0xe3, 0x59, 0xca, 0xa6, 0x8a, 0xc0, - 0x27, 0xf2, 0x8b, 0xcb, 0x24, 0x3c, 0x81, 0xcb, 0xe4, 0xdb, 0x30, 0x92, 0x88, 0x1c, 0x84, 0xe3, - 0x2f, 0xbf, 0xd0, 0x78, 0xa8, 0x56, 0xfa, 0x6c, 0x85, 0x49, 0x7e, 0x3d, 0xff, 0xaa, 0x4a, 0x98, - 0x3e, 0x7a, 0xd9, 0x3f, 0xf1, 0x83, 0x65, 0x1f, 0xab, 0xa3, 0x95, 0x66, 0x7c, 0xb0, 0x2b, 0x7d, - 0x76, 0x5e, 0x4d, 0x0b, 0x63, 0x30, 0x5a, 0xc5, 0x7b, 0x3b, 0x76, 0x72, 0xff, 0xdf, 0x45, 0xb8, - 0x28, 0x1f, 0xfe, 0xe4, 0x88, 0xf9, 0x73, 0x98, 0x95, 0xa0, 0x6a, 0x9b, 0x29, 0x0c, 0xb4, 0x69, - 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, 0x36, 0x53, - 0xd6, 0xd3, 0x81, 0x97, 0xb5, 0x9e, 0xae, 0xf4, 0x25, 0xed, 0xa7, 0x0b, 0x93, 0x30, 0xbe, 0x41, - 0x9f, 0xc5, 0x72, 0xff, 0xeb, 0x85, 0x44, 0xa8, 0x07, 0xa6, 0x61, 0xf0, 0x98, 0x0f, 0x85, 0x38, - 0x14, 0x10, 0x86, 0x7a, 0xd0, 0x35, 0x0c, 0x8e, 0xba, 0x0a, 0xc3, 0xfc, 0x32, 0xbb, 0x79, 0x8c, - 0x13, 0xbe, 0x7a, 0xc1, 0xc3, 0x9f, 0x55, 0x36, 0xf9, 0x61, 0x5f, 0xd0, 0x5b, 0x0f, 0xe0, 0xb2, - 0xf0, 0xf1, 0x36, 0x07, 0x1f, 0x2b, 0x3a, 0xe1, 0xf6, 0x65, 0x39, 0x70, 0xf1, 0x1e, 0x4d, 0x2e, - 0x3d, 0xc6, 0x0b, 0xa7, 0x4f, 0xe0, 0x94, 0x01, 0x57, 0x1c, 0x51, 0x2b, 0x55, 0x73, 0x48, 0xb1, - 0x4e, 0x62, 0x5b, 0x97, 0xb2, 0xaa, 0xd0, 0x1b, 0x6b, 0x51, 0x0c, 0x0e, 0x1b, 0xc4, 0x57, 0x6c, - 0xe1, 0x09, 0x56, 0xbd, 0x6b, 0xda, 0x77, 0xcd, 0x57, 0x3c, 0x1e, 0x3d, 0x50, 0xee, 0xbc, 0xaa, - 0xd4, 0x9a, 0x30, 0xee, 0x02, 0xac, 0x49, 0x18, 0x97, 0x45, 0x2d, 0x1a, 0x86, 0xd6, 0x7f, 0x1d, - 0x04, 0x4b, 0x08, 0x36, 0xeb, 0x86, 0x5e, 0xca, 0xe3, 0x51, 0xaa, 0xb1, 0x62, 0xa3, 0x3a, 0xa3, - 0xc7, 0x24, 0x8d, 0x4b, 0xf9, 0xcc, 0x43, 0x3d, 0xaf, 0x11, 0x43, 0x8d, 0x99, 0x97, 0xea, 0xfd, - 0x57, 0x39, 0xcb, 0x24, 0xff, 0xd8, 0xf0, 0xc9, 0x76, 0xce, 0x32, 0x69, 0xf0, 0xcd, 0x5e, 0x32, - 0x6d, 0xf3, 0x4a, 0xa4, 0xff, 0x45, 0xae, 0x44, 0xd8, 0x17, 0xa9, 0x5f, 0x8a, 0xec, 0x98, 0xb2, - 0x14, 0xdf, 0xa3, 0xbc, 0xbd, 0xd7, 0x8b, 0x44, 0xc4, 0x05, 0x0d, 0x62, 0x70, 0x35, 0xd8, 0x10, - 0x17, 0x4a, 0x9a, 0xcd, 0x72, 0x71, 0x9f, 0x36, 0x9e, 0x08, 0x5b, 0xb1, 0xbc, 0xd0, 0xcd, 0xb2, - 0x99, 0xf3, 0xf8, 0xd4, 0xfc, 0x3b, 0xe7, 0x05, 0xf5, 0x06, 0x23, 0xd5, 0x23, 0x46, 0x24, 0xd9, - 0x92, 0x1f, 0xc3, 0x94, 0x1a, 0xea, 0x84, 0x8b, 0xd6, 0xd8, 0xfc, 0x6b, 0x71, 0x28, 0xd3, 0x83, - 0xc7, 0xce, 0x8d, 0xa7, 0xb7, 0x6f, 0x64, 0xe0, 0xf2, 0x40, 0x04, 0x0d, 0x59, 0xa0, 0xf9, 0x67, - 0xe9, 0x17, 0x5d, 0x19, 0x84, 0xe4, 0x0b, 0x98, 0xae, 0xd5, 0x36, 0xf9, 0x63, 0x0e, 0x5b, 0x5e, - 0xf0, 0xdb, 0x6b, 0xc2, 0x61, 0x0b, 0x87, 0x3b, 0x0c, 0xfd, 0xba, 0x78, 0x04, 0xa2, 0xbb, 0x05, - 0xe8, 0xa1, 0x18, 0xb2, 0x58, 0xe8, 0x37, 0xe5, 0x7f, 0x4f, 0xbd, 0x55, 0x60, 0xaa, 0x88, 0xdb, - 0xa2, 0xe2, 0xd1, 0x91, 0x9c, 0xd8, 0x39, 0xb7, 0x7c, 0x85, 0x6f, 0xf9, 0x96, 0xef, 0x77, 0x8b, - 0xf2, 0x85, 0x46, 0xfa, 0xa2, 0xf5, 0xc4, 0x97, 0x7d, 0x99, 0x3d, 0x38, 0xd6, 0x3e, 0x9d, 0xd9, - 0x38, 0xb2, 0x20, 0xaf, 0x4a, 0x55, 0xb0, 0xb2, 0x49, 0x75, 0xed, 0x10, 0x17, 0x18, 0xb7, 0xa7, - 0xa8, 0x15, 0x69, 0x54, 0xc9, 0x7b, 0xb8, 0xfe, 0x97, 0xbf, 0x87, 0xfb, 0x37, 0xa3, 0x70, 0x7a, - 0xcb, 0xd9, 0x73, 0x3d, 0xb6, 0x1f, 0xd8, 0x34, 0xf4, 0x3b, 0x41, 0x83, 0x92, 0x2a, 0x4c, 0x9a, - 0xee, 0xb7, 0x3d, 0x9c, 0x8b, 0xd9, 0x96, 0x67, 0xc2, 0xc8, 0x3c, 0x8c, 0xaa, 0x27, 0xbf, 0x62, - 0x9f, 0xca, 0x78, 0x0a, 0xbc, 0xd2, 0x67, 0xc7, 0x68, 0xe4, 0x7d, 0xe3, 0xea, 0xe8, 0x94, 0x7a, - 0xbd, 0x8e, 0xb8, 0xf3, 0xdc, 0x3f, 0xd2, 0xf3, 0x9b, 0xe6, 0x5e, 0xcb, 0xef, 0x47, 0x7e, 0x98, - 0xba, 0x4d, 0x1a, 0x34, 0x5a, 0x9c, 0x32, 0xa9, 0xa1, 0x9a, 0x91, 0x1b, 0x7b, 0x3c, 0xe3, 0x9e, - 0xe9, 0x4b, 0x18, 0x7b, 0xd0, 0x79, 0x44, 0xe5, 0xbd, 0xd9, 0x90, 0xd8, 0x7a, 0x93, 0x4e, 0xe5, - 0xa2, 0x7c, 0xf7, 0x0e, 0x1f, 0x83, 0x27, 0x9d, 0x47, 0x34, 0x1d, 0xd4, 0x9e, 0xad, 0x79, 0x1a, - 0x33, 0xb2, 0x0f, 0xa5, 0xa4, 0xff, 0xb7, 0x08, 0xef, 0xd7, 0xc5, 0x6b, 0x1d, 0xc3, 0xb4, 0x68, - 0xa1, 0xf3, 0xb9, 0x57, 0xaa, 0x51, 0x49, 0x8a, 0x2b, 0xf9, 0x65, 0x98, 0xc9, 0x34, 0x68, 0xaa, - 0x17, 0x6c, 0xdd, 0x6d, 0xa5, 0xb8, 0x80, 0x24, 0xa4, 0x26, 0x9f, 0xcb, 0x19, 0x35, 0x67, 0xd7, - 0x42, 0x9a, 0x70, 0x2a, 0xe1, 0xd7, 0x2c, 0xf2, 0x83, 0xe4, 0x7b, 0x4a, 0xe3, 0x9e, 0x27, 0x43, - 0xec, 0x66, 0xd6, 0x95, 0x64, 0x49, 0xd6, 0x60, 0x54, 0x59, 0x12, 0x44, 0x64, 0xb5, 0x2c, 0xab, - 0x49, 0xf9, 0xe8, 0xb0, 0x32, 0x1d, 0x5b, 0x4d, 0x0c, 0x9e, 0x31, 0x03, 0xf2, 0x2b, 0x70, 0x59, - 0x4d, 0xd1, 0xcd, 0x20, 0xdb, 0xbe, 0x24, 0x42, 0xf3, 0x5f, 0x4f, 0xce, 0xf0, 0x3c, 0xfc, 0xdd, - 0xdb, 0x0b, 0xc5, 0x72, 0x61, 0xa5, 0xcf, 0xee, 0xcd, 0x9a, 0xfc, 0x5a, 0x01, 0xce, 0xe4, 0xd4, - 0x3a, 0x8e, 0xb5, 0xf6, 0x34, 0xfa, 0xe1, 0xb9, 0x01, 0x5f, 0x6d, 0xb9, 0xcd, 0xf8, 0x75, 0xa3, - 0xb4, 0xfe, 0x19, 0xfd, 0xce, 0xa9, 0x89, 0xbc, 0x05, 0x43, 0x78, 0xfc, 0x0e, 0xcb, 0x13, 0xa8, - 0xa0, 0x62, 0x74, 0x22, 0x3c, 0xa4, 0xeb, 0x5b, 0x92, 0xc0, 0x21, 0x2b, 0x4c, 0xd1, 0xc3, 0x2d, - 0x51, 0x2a, 0x66, 0x22, 0x96, 0x99, 0x38, 0x2c, 0xf0, 0x22, 0x19, 0x64, 0xc4, 0xc8, 0xc1, 0x60, - 0x92, 0x2d, 0x00, 0x8c, 0x04, 0x62, 0x55, 0xba, 0x3f, 0x30, 0x32, 0x50, 0x1a, 0xe4, 0x1f, 0x8e, - 0x74, 0x98, 0xff, 0x8d, 0x11, 0xfe, 0xba, 0x76, 0xc7, 0x73, 0x1f, 0xbb, 0xf1, 0x02, 0xa6, 0x1b, - 0xee, 0xe2, 0x64, 0x48, 0x42, 0xad, 0xce, 0x49, 0x7b, 0xa4, 0x6c, 0x7c, 0xc5, 0x9e, 0x36, 0xbe, - 0x3b, 0xda, 0x6d, 0x98, 0x16, 0xb3, 0x94, 0xab, 0x4f, 0xa6, 0x4d, 0x2d, 0xbe, 0x26, 0xfb, 0x1a, - 0x86, 0x30, 0xcc, 0x28, 0xbf, 0x6a, 0x1c, 0x9b, 0xbf, 0x21, 0x96, 0xed, 0x2e, 0xcd, 0xe7, 0x71, - 0x49, 0xc5, 0x8b, 0x79, 0x2e, 0x71, 0x04, 0x18, 0x12, 0x47, 0x08, 0xd9, 0x86, 0xa9, 0x2d, 0xb6, - 0x9b, 0x73, 0xb7, 0xed, 0x76, 0x20, 0xec, 0x1e, 0xdc, 0xa2, 0x82, 0xda, 0x44, 0x5b, 0x16, 0xd7, - 0xa9, 0x2a, 0xd7, 0x37, 0xd4, 0x0c, 0x72, 0xb2, 0x0c, 0x93, 0x35, 0xea, 0x04, 0x8d, 0xfd, 0x07, - 0xf4, 0x39, 0xd3, 0xa4, 0x8c, 0xfc, 0x1f, 0x21, 0x96, 0xb0, 0xfe, 0x62, 0x91, 0xee, 0x3e, 0x62, - 0x12, 0x91, 0x4f, 0x61, 0xa8, 0xe6, 0x07, 0xd1, 0xc2, 0x73, 0xb1, 0xa8, 0xc9, 0xcb, 0x28, 0x0e, - 0x5c, 0x38, 0x2b, 0x73, 0xa0, 0x84, 0x7e, 0x10, 0xd5, 0x1f, 0x19, 0xe1, 0xae, 0x38, 0x0a, 0x79, - 0x0e, 0xd3, 0xe6, 0x82, 0x22, 0xbc, 0x89, 0x47, 0x84, 0x06, 0x97, 0xb5, 0x6a, 0x71, 0x94, 0x85, - 0x6b, 0x82, 0xfb, 0xa5, 0xe4, 0xb2, 0xf5, 0x18, 0xcb, 0x75, 0xb5, 0x27, 0x8b, 0x9e, 0xac, 0x63, - 0xf2, 0x18, 0xde, 0xa3, 0x6a, 0xc8, 0xbd, 0x90, 0x47, 0xe3, 0x80, 0x6a, 0x1d, 0x5c, 0x94, 0x50, - 0x12, 0x4e, 0x98, 0xcc, 0x38, 0x64, 0xa7, 0x48, 0xc9, 0x16, 0x9c, 0xde, 0x09, 0xe9, 0x56, 0x40, - 0x9f, 0xba, 0xf4, 0x99, 0xe4, 0x07, 0x71, 0xf4, 0x29, 0xc6, 0xaf, 0xcd, 0x4b, 0xb3, 0x18, 0xa6, - 0x89, 0xc9, 0xfb, 0x00, 0x5b, 0xae, 0xe7, 0xd1, 0x26, 0xde, 0x68, 0x8e, 0x21, 0x2b, 0xb4, 0xd6, - 0xb6, 0x11, 0x5a, 0xf7, 0xbd, 0x96, 0x2e, 0x52, 0x0d, 0x99, 0x2c, 0xc0, 0xc4, 0xaa, 0xd7, 0x68, - 0x75, 0x84, 0xe7, 0x41, 0x88, 0x0b, 0x8a, 0x88, 0x8a, 0xe7, 0xf2, 0x82, 0x7a, 0xea, 0x23, 0x37, - 0x49, 0xc8, 0x03, 0x20, 0x02, 0x20, 0x66, 0xad, 0xf3, 0xa8, 0x45, 0xc5, 0xe7, 0x8e, 0x56, 0x18, - 0xc9, 0x08, 0xa7, 0xbb, 0x11, 0x6c, 0x2e, 0x45, 0x36, 0xf7, 0x3e, 0x8c, 0x69, 0x73, 0x3e, 0x23, - 0x04, 0xc4, 0xb4, 0x1e, 0x02, 0x62, 0x54, 0x0f, 0xf5, 0xf0, 0x4f, 0x0b, 0x70, 0x3e, 0xfb, 0x5b, - 0x12, 0x0a, 0xd8, 0x26, 0x8c, 0x2a, 0xa0, 0x7a, 0xf4, 0x23, 0x4f, 0x15, 0x09, 0x0d, 0x88, 0x7f, - 0xd0, 0x72, 0xe5, 0xd1, 0x7b, 0x1f, 0xf3, 0x78, 0x01, 0x53, 0xff, 0xdf, 0x1c, 0x81, 0x69, 0x74, - 0x6e, 0x4f, 0xae, 0x53, 0x9f, 0x60, 0x28, 0x17, 0x84, 0x69, 0x96, 0x6b, 0x61, 0xc4, 0xe2, 0xf0, - 0x64, 0x50, 0x33, 0x83, 0x80, 0xbc, 0xa3, 0xbb, 0x5b, 0x14, 0xb5, 0x64, 0x35, 0x12, 0xa8, 0x77, - 0x21, 0xf6, 0xc3, 0x78, 0xd3, 0xb8, 0xed, 0x3f, 0xf6, 0xa2, 0x37, 0x70, 0xdc, 0x45, 0x6f, 0x47, - 0x2d, 0x7a, 0x3c, 0x44, 0xc8, 0x1b, 0xda, 0xa2, 0xf7, 0xea, 0x57, 0xbb, 0xa1, 0x57, 0xbd, 0xda, - 0x0d, 0xbf, 0xdc, 0x6a, 0x37, 0xf2, 0x82, 0xab, 0xdd, 0x5d, 0x98, 0xdc, 0xa0, 0xb4, 0xa9, 0xdd, - 0xc1, 0x8c, 0xc6, 0xbb, 0xa7, 0x47, 0xd1, 0xba, 0x96, 0x75, 0x11, 0x93, 0xa0, 0xca, 0x5d, 0x35, - 0xe1, 0x2f, 0x67, 0xd5, 0x1c, 0x7b, 0xc5, 0xab, 0xe6, 0xf8, 0xcb, 0xac, 0x9a, 0xa9, 0xa5, 0x6f, - 0xe2, 0xc4, 0x4b, 0xdf, 0xcb, 0xac, 0x56, 0x1f, 0xa3, 0xb7, 0x62, 0xad, 0xb6, 0x22, 0x1c, 0x53, - 0x34, 0x4f, 0x90, 0x15, 0x3f, 0x94, 0xce, 0xdc, 0xf8, 0x37, 0x83, 0x61, 0x4a, 0x00, 0xce, 0x04, - 0xff, 0xb6, 0x16, 0xd0, 0x47, 0x51, 0xa7, 0x57, 0x8f, 0x1e, 0x86, 0xc5, 0x8b, 0x49, 0xb1, 0xc6, - 0x25, 0x8f, 0x51, 0xb6, 0x2c, 0xb7, 0xfe, 0xa4, 0xc0, 0xef, 0x3b, 0xff, 0x7f, 0x5c, 0x2a, 0x5f, - 0xe6, 0x0e, 0xf2, 0xd7, 0xe3, 0x48, 0x0a, 0x22, 0xea, 0x43, 0xe0, 0x34, 0x9e, 0xc4, 0x97, 0xc0, - 0x3f, 0x60, 0xdf, 0xb9, 0x5e, 0x80, 0x41, 0x73, 0xe3, 0xb3, 0xa2, 0x59, 0xb8, 0x7b, 0x5b, 0x2e, - 0x00, 0x22, 0xa0, 0x04, 0x07, 0x9b, 0x0b, 0x80, 0x4e, 0x80, 0x6e, 0x78, 0xa7, 0x2c, 0x9b, 0x07, - 0x02, 0xc8, 0x6c, 0xc1, 0xbb, 0xe9, 0xa7, 0xec, 0x78, 0x18, 0x89, 0x9f, 0xb2, 0xeb, 0x62, 0x8c, - 0x1f, 0xb5, 0xef, 0xc0, 0x39, 0x9b, 0x1e, 0xf8, 0x4f, 0xe9, 0xab, 0x65, 0xfb, 0x15, 0x9c, 0x35, - 0x19, 0xf2, 0x47, 0x4f, 0x3c, 0x42, 0xff, 0xc7, 0xd9, 0x71, 0xfd, 0x05, 0x01, 0x8f, 0xeb, 0xcf, - 0xc3, 0x83, 0xb3, 0x3f, 0xf5, 0x7d, 0x03, 0xcb, 0x2c, 0x1f, 0xce, 0x9b, 0xcc, 0xab, 0xcd, 0x26, - 0xa6, 0x06, 0x6d, 0xb8, 0x6d, 0xc7, 0x8b, 0xc8, 0x26, 0x8c, 0x69, 0x3f, 0x13, 0xa6, 0x02, 0xad, - 0x44, 0xe8, 0x34, 0x31, 0xc0, 0x08, 0xaf, 0x1a, 0x83, 0x2d, 0x0a, 0x95, 0xa4, 0x78, 0x98, 0xc8, - 0xf4, 0x3a, 0x17, 0x60, 0x42, 0xfb, 0xa9, 0xac, 0xa1, 0xf8, 0xf1, 0x6b, 0x35, 0x98, 0x02, 0x33, - 0x49, 0xac, 0x06, 0xcc, 0x65, 0x09, 0x8d, 0xc7, 0xe1, 0x26, 0xcb, 0x71, 0x98, 0xad, 0xde, 0x8e, - 0x7c, 0xa7, 0xf2, 0x42, 0x6c, 0x59, 0x7f, 0x77, 0x00, 0xce, 0x89, 0xc1, 0x78, 0x95, 0x23, 0x4e, - 0x7e, 0x08, 0x63, 0xda, 0x18, 0x0b, 0xa1, 0x5f, 0x92, 0x4f, 0x96, 0xf2, 0xe6, 0x02, 0x37, 0x69, - 0x74, 0x10, 0x50, 0x4f, 0x0c, 0xf7, 0x4a, 0x9f, 0xad, 0xb3, 0x24, 0x2d, 0x98, 0x34, 0x07, 0x5a, - 0x58, 0x75, 0xae, 0x64, 0x56, 0x62, 0xa2, 0xca, 0x20, 0xdd, 0xcd, 0x7a, 0xe6, 0x70, 0xaf, 0xf4, - 0xd9, 0x09, 0xde, 0xe4, 0x1b, 0x38, 0x9d, 0x1a, 0x65, 0x61, 0xac, 0x7b, 0x3d, 0xb3, 0xc2, 0x14, - 0x36, 0xb7, 0xf4, 0x06, 0x08, 0xce, 0xad, 0x36, 0x5d, 0x09, 0x69, 0xc2, 0xb8, 0x3e, 0xf0, 0xc2, - 0xec, 0x74, 0xb9, 0x8b, 0x28, 0x39, 0x22, 0x57, 0xee, 0x84, 0x2c, 0x71, 0xec, 0x9f, 0x9b, 0xd6, - 0x6b, 0x03, 0x79, 0x04, 0x86, 0xf8, 0x6f, 0xeb, 0x77, 0x0b, 0x70, 0x6e, 0x2b, 0xa0, 0x21, 0xf5, - 0x1a, 0xd4, 0x70, 0xfe, 0x7e, 0xc9, 0x19, 0x91, 0x67, 0x38, 0x2e, 0xbe, 0xb4, 0xe1, 0xd8, 0xfa, - 0xf7, 0x05, 0x28, 0x67, 0x35, 0xb9, 0x46, 0xbd, 0x26, 0xd9, 0x82, 0x52, 0xb2, 0x0f, 0xe2, 0x8b, - 0xb1, 0x54, 0x8c, 0xe5, 0xdc, 0xde, 0xae, 0xf4, 0xd9, 0x29, 0x6a, 0xb2, 0x01, 0xa7, 0x35, 0x98, - 0x30, 0xdc, 0x16, 0x8f, 0x63, 0xb8, 0x65, 0x23, 0x9c, 0x22, 0xd5, 0xed, 0xde, 0x2b, 0xb8, 0xeb, - 0x2e, 0xf9, 0x07, 0x8e, 0xeb, 0x31, 0x25, 0x5a, 0x8b, 0xe2, 0x05, 0x31, 0x54, 0x88, 0x9d, 0x5b, - 0x72, 0x11, 0x2a, 0xdf, 0xc1, 0x28, 0x14, 0xeb, 0x23, 0xdc, 0x1d, 0x84, 0xfd, 0x8f, 0xbf, 0x3c, - 0x56, 0xcc, 0x2e, 0xc1, 0xe0, 0xf6, 0x5a, 0x6d, 0xb1, 0x2a, 0xde, 0x31, 0xf3, 0xe8, 0x17, 0xad, - 0xb0, 0xde, 0x70, 0x6c, 0x5e, 0x60, 0x7d, 0x08, 0xe4, 0x1e, 0x8d, 0x44, 0x90, 0x7f, 0x45, 0x77, - 0x15, 0x86, 0x05, 0x48, 0x50, 0xa2, 0x47, 0x9f, 0x48, 0x19, 0x60, 0xcb, 0x32, 0x6b, 0x4b, 0x9e, - 0x41, 0x5a, 0xd4, 0x09, 0xb5, 0x4d, 0xff, 0x3d, 0x18, 0x09, 0x04, 0x4c, 0xec, 0xf9, 0x93, 0x2a, - 0x87, 0x0b, 0x82, 0xb9, 0xad, 0x5c, 0xe2, 0xd8, 0xea, 0x2f, 0x6b, 0x0d, 0x23, 0xd5, 0x6c, 0xae, - 0x2e, 0x2d, 0x32, 0xa9, 0x0a, 0x61, 0xc9, 0xe1, 0xb8, 0x89, 0xae, 0xef, 0x11, 0xd5, 0x5f, 0x31, - 0xa3, 0x68, 0x70, 0x01, 0x11, 0xf1, 0x99, 0x34, 0x14, 0xeb, 0x8e, 0x8a, 0x7b, 0x93, 0xc1, 0x2d, - 0x2f, 0x17, 0xc9, 0x06, 0x46, 0xf4, 0xb9, 0x87, 0x5e, 0x3e, 0xaf, 0xa2, 0x11, 0x0e, 0xcc, 0x71, - 0x15, 0x82, 0xf5, 0x4a, 0x64, 0x62, 0xf4, 0xd5, 0xb2, 0xbb, 0x08, 0xa3, 0x0a, 0xa6, 0xae, 0xec, - 0xb8, 0xac, 0x0c, 0xfc, 0xdd, 0x3b, 0xfc, 0xc1, 0x77, 0x43, 0x31, 0x88, 0xe9, 0x58, 0x15, 0xfc, - 0x9b, 0xfe, 0x96, 0xab, 0x08, 0x69, 0x10, 0x7d, 0xab, 0x55, 0xc4, 0x21, 0x9f, 0x4e, 0x52, 0x85, - 0x81, 0xbf, 0x3b, 0x7f, 0x1c, 0x41, 0x7d, 0xcb, 0x55, 0x30, 0x41, 0x7d, 0x7b, 0x55, 0x50, 0x19, - 0x1b, 0x8b, 0x4f, 0xd2, 0x54, 0x25, 0xcb, 0xe9, 0x4a, 0xa4, 0x51, 0x3c, 0x41, 0xd1, 0x75, 0x3c, - 0x28, 0x9c, 0xe7, 0xc2, 0xfa, 0x39, 0x54, 0xc3, 0x04, 0xf6, 0xed, 0x56, 0xf3, 0x0f, 0x0b, 0x3c, - 0x52, 0x57, 0x6d, 0x53, 0xcb, 0x81, 0xea, 0x3d, 0xf6, 0x35, 0x8f, 0x02, 0xed, 0x6b, 0x7f, 0xe0, - 0x7a, 0x4d, 0xdd, 0xa3, 0xc0, 0xe9, 0x44, 0xfb, 0x2a, 0x92, 0xf5, 0x13, 0xd7, 0x6b, 0xda, 0x49, - 0x6c, 0xf2, 0x3e, 0x4c, 0x68, 0x20, 0xa5, 0x09, 0xf2, 0x5c, 0x23, 0x3a, 0xb9, 0xdb, 0xb4, 0x4d, - 0x4c, 0xeb, 0x2f, 0x0a, 0x30, 0x95, 0x91, 0x9d, 0x1b, 0x0d, 0x25, 0x78, 0xc2, 0x52, 0x0b, 0x95, - 0xc8, 0x0e, 0x86, 0x41, 0x43, 0x8c, 0xfd, 0x57, 0x21, 0x62, 0x96, 0x05, 0x2d, 0x93, 0x78, 0x51, - 0xcb, 0x79, 0x97, 0x9d, 0x3d, 0x5c, 0x47, 0x27, 0x21, 0x40, 0xdc, 0x12, 0x61, 0x92, 0xae, 0x31, - 0x75, 0x59, 0x4b, 0x43, 0xfe, 0x4a, 0xf2, 0xa0, 0x6b, 0xd5, 0x58, 0xbf, 0x5e, 0x84, 0x33, 0x19, - 0xfd, 0xaf, 0xd1, 0xe8, 0x2f, 0x43, 0x04, 0x89, 0x64, 0xf0, 0xfd, 0x3f, 0xa7, 0x64, 0xf0, 0xd6, - 0x1f, 0x16, 0xe1, 0xcc, 0x4e, 0x3b, 0xc4, 0x87, 0x61, 0xab, 0xde, 0x53, 0xea, 0x45, 0x7e, 0xf0, - 0x1c, 0x1f, 0xb3, 0x90, 0x77, 0x60, 0x70, 0x85, 0xb6, 0x5a, 0xbe, 0x98, 0xff, 0x17, 0xa4, 0x53, - 0x47, 0x12, 0x1b, 0x91, 0x56, 0xfa, 0x6c, 0x8e, 0x4d, 0xde, 0x87, 0xd1, 0x15, 0xea, 0x04, 0xd1, - 0x23, 0xea, 0xc8, 0xe3, 0x90, 0xcc, 0x80, 0xa2, 0x91, 0x08, 0x84, 0x95, 0x3e, 0x3b, 0xc6, 0x26, - 0xf3, 0x30, 0xb0, 0xe5, 0x7b, 0x7b, 0xea, 0x11, 0x7c, 0x4e, 0x85, 0x0c, 0x67, 0xa5, 0xcf, 0x46, - 0x5c, 0xb2, 0x0e, 0x13, 0xd5, 0x3d, 0xea, 0x45, 0xeb, 0x34, 0x72, 0x9a, 0x4e, 0xe4, 0x08, 0xb5, - 0xf9, 0x6a, 0x1e, 0xb1, 0x81, 0xbc, 0xd2, 0x67, 0x9b, 0xd4, 0xe4, 0x43, 0x18, 0xbe, 0xe7, 0xfb, - 0xcd, 0x47, 0xcf, 0x65, 0x28, 0x87, 0x4a, 0x1e, 0x23, 0x81, 0xb6, 0xd2, 0x67, 0x4b, 0x8a, 0x85, - 0x41, 0xe8, 0x5f, 0x0f, 0xf7, 0xac, 0xc3, 0x02, 0x94, 0x97, 0xfc, 0x67, 0x5e, 0xa6, 0x54, 0xbf, - 0x67, 0x4a, 0x55, 0xb2, 0xcf, 0xc0, 0x4f, 0xc8, 0xf5, 0x6d, 0x18, 0xd8, 0x72, 0xbd, 0xbd, 0x84, - 0x2a, 0x98, 0x41, 0xc7, 0xb0, 0x50, 0x3c, 0xae, 0xb7, 0x47, 0xd6, 0xa4, 0x7e, 0x2f, 0xec, 0x98, - 0xfd, 0xc6, 0xa1, 0x22, 0x83, 0x5a, 0xc7, 0x8e, 0xf5, 0x78, 0xfe, 0x5b, 0x76, 0xf0, 0x4d, 0x98, - 0xcd, 0xa9, 0x57, 0xbc, 0x6a, 0x67, 0x7d, 0x1b, 0x40, 0xc5, 0xe6, 0x0d, 0x98, 0xc9, 0x1c, 0xbf, - 0x14, 0xe2, 0xbf, 0xc8, 0x9a, 0x88, 0xbc, 0xe7, 0x65, 0x18, 0x96, 0xa9, 0xc1, 0xb8, 0x5d, 0x49, - 0xfe, 0xc4, 0x77, 0x5d, 0xf2, 0x43, 0x95, 0x31, 0x5b, 0xe4, 0xf7, 0xb8, 0xab, 0xc5, 0xc8, 0xe2, - 0x9f, 0xd3, 0x07, 0x2f, 0xf1, 0xd1, 0x28, 0x5e, 0xac, 0xce, 0x15, 0x3f, 0x8c, 0x3c, 0xe5, 0x30, - 0x6c, 0xab, 0xdf, 0xe4, 0x3a, 0x94, 0x64, 0x1a, 0x10, 0x91, 0x6f, 0x48, 0xa4, 0xae, 0xb7, 0x53, - 0x70, 0xf2, 0x1e, 0xcc, 0x26, 0x61, 0xb2, 0x97, 0xfc, 0x61, 0x5e, 0x5e, 0xb1, 0xf5, 0xc7, 0x45, - 0x0c, 0x63, 0xde, 0x65, 0x5e, 0x33, 0xe9, 0x6e, 0xd6, 0x84, 0xb4, 0x8a, 0x9b, 0x35, 0x72, 0x1e, - 0x46, 0x37, 0x6b, 0x46, 0x7e, 0x35, 0x3b, 0x06, 0xb0, 0x66, 0xb3, 0x2e, 0x54, 0x83, 0xc6, 0xbe, - 0x1b, 0xd1, 0x46, 0xd4, 0x09, 0xc4, 0x2a, 0x6c, 0xa7, 0xe0, 0xc4, 0x82, 0xf1, 0x7b, 0x2d, 0xf7, - 0x51, 0x43, 0x32, 0xe3, 0x22, 0x30, 0x60, 0xe4, 0x75, 0x98, 0x5c, 0xf5, 0xc2, 0xc8, 0x69, 0xb5, - 0xd6, 0x69, 0xb4, 0xef, 0x37, 0x45, 0xf6, 0x58, 0x3b, 0x01, 0x65, 0xf5, 0x2e, 0xfa, 0x5e, 0xe4, - 0xb8, 0x1e, 0x0d, 0xec, 0x8e, 0x17, 0xb9, 0x07, 0x54, 0xf4, 0x3d, 0x05, 0x27, 0x6f, 0xc3, 0x8c, - 0x82, 0x6d, 0x06, 0x8d, 0x7d, 0x1a, 0x46, 0x01, 0x66, 0x5d, 0x44, 0xd7, 0x20, 0x3b, 0xbb, 0x10, - 0x6b, 0x68, 0xf9, 0x9d, 0xe6, 0xb2, 0xf7, 0xd4, 0x0d, 0x7c, 0x0f, 0x73, 0x9a, 0x8c, 0x88, 0x1a, - 0x12, 0x70, 0xeb, 0x77, 0x46, 0x32, 0x3f, 0xdb, 0x97, 0x99, 0x83, 0x5f, 0xc0, 0xf8, 0xa2, 0xd3, - 0x76, 0x1e, 0xb9, 0x2d, 0x37, 0x72, 0x55, 0x7a, 0xba, 0x77, 0x7a, 0x7c, 0xf3, 0x32, 0x31, 0x0c, - 0x6d, 0xea, 0xc4, 0xb6, 0xc1, 0x6a, 0xee, 0xcf, 0x87, 0x60, 0x26, 0x13, 0x8f, 0x5c, 0x13, 0x79, - 0xec, 0xd4, 0xba, 0x2a, 0x92, 0xa4, 0xd9, 0x49, 0x30, 0x1b, 0x4b, 0x04, 0x2d, 0xb6, 0xa8, 0xe3, - 0x75, 0x44, 0x8a, 0x34, 0xdb, 0x80, 0xb1, 0xb1, 0x64, 0x7a, 0x83, 0xc6, 0x0c, 0xfd, 0xbd, 0xed, - 0x04, 0x94, 0x5c, 0x82, 0x31, 0x06, 0x91, 0xac, 0x06, 0xf8, 0xcb, 0x44, 0x0d, 0xc4, 0x38, 0x6d, - 0xf8, 0x4d, 0xaa, 0x71, 0x1a, 0xe4, 0x9c, 0x4c, 0x28, 0xe3, 0xc4, 0x20, 0x92, 0xd3, 0x10, 0xe7, - 0xa4, 0x81, 0xc8, 0x6b, 0x30, 0x51, 0x6d, 0xb7, 0x35, 0x46, 0x98, 0x1b, 0xcd, 0x36, 0x81, 0xe4, - 0x22, 0x40, 0xb5, 0xdd, 0x96, 0x6c, 0x30, 0xef, 0x99, 0xad, 0x41, 0xc8, 0x8d, 0x38, 0x12, 0x9d, - 0xc6, 0x0a, 0xaf, 0x2a, 0xec, 0x8c, 0x12, 0x26, 0x57, 0x15, 0xb6, 0x4b, 0x30, 0x05, 0x2e, 0xd7, - 0x04, 0x98, 0x7c, 0x04, 0x67, 0x13, 0x3e, 0x1d, 0x5a, 0x05, 0x78, 0x8d, 0x60, 0xe7, 0x23, 0x90, - 0x77, 0xe1, 0x4c, 0xa2, 0x50, 0x56, 0x87, 0x37, 0x06, 0x76, 0x4e, 0x29, 0xf9, 0x00, 0xca, 0x89, - 0xd7, 0xe6, 0x71, 0xa5, 0x78, 0x3b, 0x60, 0xe7, 0x96, 0xb3, 0xaf, 0x2b, 0xf1, 0x6c, 0x4d, 0x54, - 0x89, 0x17, 0xa1, 0x76, 0x76, 0x21, 0x59, 0x81, 0x4a, 0xa6, 0x9f, 0x8c, 0x56, 0x31, 0xe6, 0x73, - 0xb3, 0x7b, 0xa1, 0x91, 0x05, 0x38, 0x9f, 0x89, 0x22, 0x9b, 0x81, 0x59, 0xde, 0xec, 0xae, 0x38, - 0x64, 0x1e, 0xa6, 0x63, 0x7f, 0x21, 0xad, 0x09, 0x98, 0xe0, 0xcd, 0xce, 0x2c, 0x23, 0x6f, 0x99, - 0x31, 0x05, 0x78, 0x65, 0x98, 0xdf, 0xcd, 0x4e, 0x17, 0x58, 0x47, 0x05, 0x38, 0x9f, 0xb9, 0x51, - 0x4a, 0x7d, 0x7e, 0x2e, 0xa9, 0x38, 0x6a, 0x6b, 0xc1, 0x75, 0x18, 0x40, 0x05, 0x9f, 0xdb, 0xa1, - 0xa5, 0x8b, 0x2c, 0xd2, 0x73, 0x56, 0xac, 0xd4, 0x46, 0x1c, 0x72, 0x4f, 0xdd, 0x3b, 0xf6, 0xa3, - 0x25, 0xe3, 0x66, 0x52, 0x81, 0xca, 0xa8, 0x5c, 0xbf, 0x7f, 0x94, 0x37, 0x8d, 0x2f, 0x73, 0xc5, - 0xf3, 0xc7, 0x05, 0xa8, 0xf4, 0xd0, 0x0f, 0x54, 0x9f, 0x0a, 0xc7, 0xe8, 0xd3, 0x7d, 0xd5, 0x27, - 0xfe, 0xa4, 0x77, 0xfe, 0x78, 0x3a, 0xc8, 0xab, 0xee, 0xd6, 0x5f, 0x14, 0x80, 0xa4, 0xf5, 0x50, - 0xf2, 0x5d, 0x18, 0xad, 0xd5, 0x56, 0x0c, 0x6f, 0xc1, 0xd4, 0xcd, 0x53, 0x8c, 0x41, 0x6e, 0x1d, - 0xcb, 0x3d, 0x50, 0x77, 0x0e, 0xfc, 0x24, 0xe5, 0x93, 0xd8, 0xdf, 0xd5, 0x27, 0x31, 0xe5, 0x91, - 0xb8, 0x9c, 0xe1, 0x64, 0x37, 0xd0, 0xc3, 0xc9, 0x2e, 0xed, 0x41, 0x67, 0x2d, 0x41, 0x39, 0x4f, - 0x95, 0xc5, 0x15, 0x8e, 0xc7, 0x6f, 0xd3, 0x6e, 0xcf, 0xf8, 0x0a, 0x67, 0x82, 0xad, 0x77, 0xe1, - 0x8c, 0xa2, 0xe6, 0x89, 0x61, 0xb4, 0xc0, 0x09, 0xe2, 0xfc, 0xab, 0x02, 0x34, 0xc4, 0x00, 0xeb, - 0x8f, 0x06, 0x52, 0x84, 0xb5, 0xce, 0xc1, 0x81, 0x13, 0x3c, 0x27, 0x55, 0x93, 0xb0, 0xbf, 0xe7, - 0x91, 0x63, 0x61, 0xe0, 0x27, 0x87, 0x95, 0x3e, 0x8d, 0x3b, 0xdb, 0x17, 0x50, 0xc3, 0xf0, 0x1a, - 0x94, 0xdf, 0xbb, 0x15, 0x79, 0x70, 0x28, 0x03, 0x48, 0x76, 0x61, 0x42, 0xec, 0xdd, 0xf8, 0x5b, - 0x7e, 0x63, 0xb7, 0x92, 0xdf, 0x98, 0xd1, 0xbc, 0x1b, 0x06, 0x09, 0x9f, 0x8d, 0x26, 0x1b, 0xf2, - 0x05, 0x4c, 0x4a, 0x4d, 0x4d, 0x30, 0xe6, 0x9e, 0x52, 0xb7, 0xbb, 0x33, 0x36, 0x69, 0x38, 0xe7, - 0x04, 0x23, 0xd6, 0x64, 0xb9, 0xd8, 0x71, 0xce, 0x83, 0xc7, 0x69, 0xb2, 0x41, 0x22, 0x9a, 0x6c, - 0xc0, 0xe6, 0x3e, 0x05, 0x92, 0xee, 0x57, 0xaf, 0xcf, 0x69, 0x42, 0xfb, 0x9c, 0xe6, 0xaa, 0x30, - 0x95, 0xd1, 0x81, 0x13, 0xb1, 0xf8, 0x14, 0x48, 0xba, 0xa5, 0x27, 0xe1, 0x60, 0x5d, 0x83, 0xd7, - 0x95, 0x08, 0xd4, 0x6c, 0x30, 0x78, 0x4a, 0x0b, 0xf8, 0xaf, 0x16, 0xa1, 0xd2, 0x03, 0x95, 0xfc, - 0xe3, 0x42, 0x52, 0xda, 0x7c, 0x36, 0xbe, 0x9f, 0x94, 0x76, 0x36, 0x7d, 0x86, 0xd8, 0x17, 0x3e, - 0xf8, 0xb5, 0x3f, 0x7d, 0xe1, 0x93, 0x47, 0x7a, 0xc8, 0x4e, 0x2e, 0xad, 0x01, 0x5d, 0x5a, 0xbb, - 0x30, 0x6d, 0x9c, 0xd9, 0x8e, 0xb3, 0x79, 0x59, 0x00, 0x22, 0x47, 0xed, 0x9a, 0xbf, 0x27, 0x52, - 0xe9, 0x16, 0xcb, 0x05, 0x5b, 0x83, 0x5a, 0x77, 0x61, 0x26, 0xc1, 0x57, 0x58, 0xe6, 0xbf, 0x0b, - 0xea, 0x91, 0x3c, 0x32, 0xee, 0x5f, 0x38, 0xfd, 0xb3, 0xc3, 0xca, 0x04, 0x53, 0xeb, 0x6f, 0xc4, - 0x79, 0x0a, 0xe4, 0x5f, 0xd6, 0xba, 0x7e, 0xb7, 0x50, 0x6d, 0xe9, 0xc1, 0x83, 0xc8, 0x6d, 0x18, - 0xe2, 0x90, 0x44, 0x34, 0x70, 0x1d, 0x5b, 0xac, 0x0b, 0x02, 0xd1, 0x9a, 0xc1, 0x27, 0xbd, 0xf8, - 0xa3, 0x1a, 0x87, 0xa0, 0xb0, 0x76, 0x78, 0x76, 0x9c, 0x18, 0xac, 0x22, 0x8e, 0x0f, 0x54, 0xe3, - 0x50, 0x19, 0xd2, 0xc9, 0x44, 0xe2, 0x79, 0xfe, 0xb3, 0x16, 0x6d, 0xf2, 0xb4, 0x86, 0x0b, 0xe3, - 0xc2, 0xc9, 0x64, 0xc0, 0x61, 0x0c, 0x90, 0xcc, 0xfa, 0x04, 0x66, 0x98, 0xb6, 0x10, 0x24, 0xeb, - 0xc3, 0x9c, 0x18, 0x0c, 0x66, 0x7a, 0xee, 0x3b, 0x0c, 0x84, 0x9e, 0xfb, 0xa2, 0xd0, 0x5a, 0x83, - 0xb3, 0xdc, 0x32, 0xa9, 0x77, 0x29, 0xbe, 0x07, 0x18, 0xc4, 0xdf, 0x89, 0x07, 0xa1, 0x19, 0xbd, - 0xe7, 0x78, 0xd6, 0xc7, 0xf8, 0xe2, 0x48, 0x4c, 0x54, 0xd7, 0xf7, 0x62, 0x33, 0xe4, 0xf1, 0x9e, - 0x28, 0xff, 0x55, 0x38, 0x5f, 0x6d, 0xb7, 0xa9, 0xd7, 0x8c, 0x09, 0xb7, 0x03, 0xe7, 0x98, 0x01, - 0x24, 0x48, 0x15, 0x06, 0x11, 0x5b, 0x5d, 0xd0, 0x8a, 0xe6, 0x66, 0x34, 0x07, 0xf1, 0x44, 0x78, - 0x58, 0xac, 0x80, 0x53, 0x5a, 0x4d, 0x98, 0xad, 0x75, 0x1e, 0x1d, 0xb8, 0x11, 0xfa, 0xfb, 0x63, - 0x10, 0x16, 0x59, 0xf7, 0xaa, 0x4c, 0x68, 0xc6, 0x85, 0x71, 0x2d, 0x7e, 0x99, 0x82, 0x4f, 0x06, - 0x44, 0x60, 0x96, 0xa7, 0xb7, 0x6f, 0xc4, 0xa4, 0x68, 0x82, 0xe1, 0xb5, 0x60, 0xb1, 0x48, 0x7a, - 0x66, 0x4d, 0xc1, 0x69, 0xfd, 0x42, 0x8a, 0xcf, 0x90, 0x19, 0x98, 0x32, 0x2f, 0x9a, 0x38, 0xf8, - 0x6b, 0x98, 0xe6, 0x86, 0x70, 0x1e, 0xde, 0x7d, 0x3e, 0x8e, 0x64, 0x5e, 0xdc, 0x9d, 0x4f, 0x3c, - 0x34, 0x40, 0xff, 0x63, 0x95, 0xb8, 0x63, 0x77, 0x9e, 0xbf, 0x1a, 0x7d, 0x3a, 0x6f, 0x5c, 0x95, - 0x16, 0x77, 0xe7, 0x17, 0x86, 0x45, 0x98, 0x5c, 0xc6, 0x9d, 0x0f, 0xff, 0xb7, 0xc2, 0x7d, 0x1e, - 0x03, 0x15, 0xac, 0x50, 0x07, 0x1f, 0x15, 0x65, 0x3f, 0xf7, 0x9e, 0x84, 0xa2, 0x8a, 0x83, 0x59, - 0x74, 0x9b, 0xd6, 0xef, 0x15, 0xe0, 0x1a, 0x57, 0xc8, 0xb2, 0xe9, 0xf0, 0xd6, 0x29, 0x87, 0x98, - 0xbc, 0x07, 0x83, 0xa1, 0xe6, 0x7d, 0x61, 0x89, 0x96, 0x77, 0xe3, 0xc4, 0x09, 0x48, 0x15, 0xc6, - 0xf5, 0xb7, 0x33, 0xc7, 0x0b, 0xb1, 0x67, 0x8f, 0x1d, 0x3c, 0x76, 0xd4, 0x7b, 0x9a, 0x27, 0x70, - 0x6e, 0xf9, 0x1b, 0x36, 0x21, 0xc4, 0x0e, 0x25, 0x4e, 0x0f, 0xf1, 0x73, 0xe2, 0x53, 0xdb, 0x62, - 0xc6, 0x98, 0x47, 0xfb, 0x24, 0x98, 0x9d, 0x93, 0xe5, 0x26, 0xa7, 0x54, 0xf8, 0x51, 0xdb, 0x80, - 0x59, 0x7f, 0x54, 0x80, 0xf3, 0xd9, 0xb5, 0x89, 0x85, 0x65, 0x15, 0x4e, 0x2f, 0x3a, 0x9e, 0xef, - 0xb9, 0x0d, 0xa7, 0x55, 0x6b, 0xec, 0xd3, 0x66, 0x47, 0x05, 0xd3, 0x55, 0xab, 0xcc, 0x1e, 0xf5, - 0x24, 0xb9, 0x44, 0xb1, 0xd3, 0x54, 0xec, 0x84, 0x88, 0xcf, 0x2f, 0xf8, 0xda, 0xdb, 0xa2, 0x81, - 0xe2, 0xc7, 0x5b, 0x96, 0x53, 0x4a, 0x6e, 0x49, 0x8b, 0x7f, 0x73, 0xc7, 0x73, 0x23, 0x45, 0xc4, - 0x4d, 0x3d, 0x59, 0x45, 0xd6, 0x7f, 0x2a, 0xc0, 0x59, 0xcc, 0x9f, 0x65, 0x64, 0xe4, 0x8c, 0x63, - 0x4a, 0xcb, 0xb0, 0xc8, 0x05, 0xe3, 0x39, 0x89, 0x81, 0x6d, 0xc6, 0x47, 0x26, 0x6f, 0xc1, 0x40, - 0x4d, 0x7a, 0x83, 0x4d, 0x26, 0x72, 0x29, 0x0b, 0x0a, 0x56, 0x6e, 0x23, 0x16, 0x3b, 0xc3, 0x2f, - 0xd1, 0xb0, 0x41, 0x3d, 0x4c, 0x7a, 0xcd, 0x2d, 0x0f, 0x1a, 0x24, 0x0e, 0xf7, 0x34, 0x90, 0x17, - 0xee, 0x69, 0xd0, 0x0c, 0xf7, 0x64, 0x3d, 0xe5, 0xd9, 0xb3, 0x92, 0x1d, 0x12, 0x83, 0xf4, 0x71, - 0x2a, 0x47, 0x36, 0xdf, 0x07, 0xce, 0x64, 0xf5, 0x8c, 0x29, 0xe9, 0x89, 0xf4, 0xd7, 0xf9, 0x31, - 0x9c, 0xb7, 0xe0, 0x35, 0x03, 0xb7, 0xda, 0x6a, 0xf9, 0xcf, 0x68, 0x73, 0x2b, 0xf0, 0x0f, 0xfc, - 0xc8, 0xc8, 0x1e, 0x24, 0x92, 0xc4, 0xc7, 0x77, 0x3a, 0x62, 0x56, 0x26, 0xc0, 0xd6, 0x5f, 0x81, - 0xab, 0x3d, 0x38, 0x8a, 0x4e, 0xd5, 0xe0, 0xb4, 0x93, 0x28, 0x93, 0x6e, 0x3d, 0x57, 0xb3, 0xfa, - 0x95, 0x64, 0x14, 0xda, 0x69, 0xfa, 0xeb, 0xdb, 0x46, 0x5e, 0x69, 0x52, 0x86, 0xe9, 0x2d, 0x7b, - 0x73, 0x69, 0x67, 0x71, 0xbb, 0xbe, 0xfd, 0xc5, 0xd6, 0x72, 0x7d, 0x67, 0xe3, 0xc1, 0xc6, 0xe6, - 0xc3, 0x0d, 0x1e, 0x04, 0xdd, 0x28, 0xd9, 0x5e, 0xae, 0xae, 0x97, 0x0a, 0x64, 0x1a, 0x4a, 0x06, - 0x78, 0x79, 0x67, 0xa1, 0x54, 0xbc, 0xfe, 0xb5, 0x91, 0x2f, 0x99, 0x9c, 0x87, 0x72, 0x6d, 0x67, - 0x6b, 0x6b, 0xd3, 0x56, 0x5c, 0xf5, 0x10, 0xec, 0x33, 0x70, 0xda, 0x28, 0xbd, 0x6b, 0x2f, 0x2f, - 0x97, 0x0a, 0xac, 0x29, 0x06, 0x78, 0xcb, 0x5e, 0x5e, 0x5f, 0xdd, 0x59, 0x2f, 0x15, 0xaf, 0xd7, - 0xf5, 0x37, 0x6c, 0xe4, 0x1c, 0xcc, 0x2e, 0x2d, 0xef, 0xae, 0x2e, 0x2e, 0x67, 0xf1, 0x9e, 0x86, - 0x92, 0x5e, 0xb8, 0xbd, 0xb9, 0xbd, 0xc5, 0x59, 0xeb, 0xd0, 0x87, 0xcb, 0x0b, 0xd5, 0x9d, 0xed, - 0x95, 0x8d, 0x52, 0xbf, 0x35, 0x30, 0x52, 0x2c, 0x15, 0xaf, 0xff, 0xd0, 0x78, 0xe0, 0xc6, 0x9a, - 0x2f, 0xd0, 0x77, 0x6a, 0xd5, 0x7b, 0xf9, 0x55, 0xf0, 0xd2, 0xf5, 0xbb, 0xd5, 0x52, 0x81, 0x5c, - 0x80, 0xb3, 0x06, 0x74, 0xab, 0x5a, 0xab, 0x3d, 0xdc, 0xb4, 0x97, 0xd6, 0x96, 0x6b, 0xb5, 0x52, - 0xf1, 0xfa, 0xae, 0x11, 0xe2, 0x8e, 0xd5, 0xb0, 0x7e, 0xb7, 0x5a, 0xb7, 0x97, 0x3f, 0xdb, 0x59, - 0xb5, 0x97, 0x97, 0xd2, 0x35, 0x18, 0xa5, 0x5f, 0x2c, 0xd7, 0x4a, 0x05, 0x32, 0x05, 0xa7, 0x0c, - 0xe8, 0xc6, 0x66, 0xa9, 0x78, 0xfd, 0x75, 0x11, 0x05, 0x8d, 0x4c, 0x02, 0x2c, 0x2d, 0xd7, 0x16, - 0x97, 0x37, 0x96, 0x56, 0x37, 0xee, 0x95, 0xfa, 0xc8, 0x04, 0x8c, 0x56, 0xd5, 0xcf, 0xc2, 0xf5, - 0x0f, 0xe0, 0x54, 0xe2, 0x78, 0xcf, 0x30, 0xd4, 0xc1, 0xb8, 0xd4, 0x87, 0xe2, 0x97, 0x3f, 0xd1, - 0xc6, 0xca, 0x4f, 0xea, 0xa5, 0xc2, 0xf5, 0x05, 0x99, 0x62, 0x57, 0xfb, 0xce, 0xc9, 0x18, 0x0c, - 0x2f, 0x2d, 0xdf, 0xad, 0xee, 0xac, 0x6d, 0x97, 0xfa, 0xd8, 0x8f, 0x45, 0x7b, 0xb9, 0xba, 0xbd, - 0xbc, 0x54, 0x2a, 0x90, 0x51, 0x18, 0xac, 0x6d, 0x57, 0xb7, 0x97, 0x4b, 0x45, 0x32, 0x02, 0x03, - 0x3b, 0xb5, 0x65, 0xbb, 0xd4, 0x3f, 0xff, 0x6f, 0xff, 0x51, 0x81, 0x1b, 0x1a, 0xe5, 0x63, 0xa9, - 0xaf, 0xb5, 0x03, 0xa5, 0x58, 0xf2, 0x44, 0x3e, 0xd1, 0xdc, 0xd3, 0x23, 0x6a, 0x01, 0x73, 0x5d, - 0x6e, 0x5e, 0x10, 0xe1, 0x5a, 0xe1, 0x56, 0x81, 0xd8, 0xe8, 0xa9, 0x92, 0x38, 0x5f, 0x29, 0xce, - 0xd9, 0x47, 0xe0, 0xb9, 0x0b, 0x5d, 0x8f, 0x65, 0xe4, 0x97, 0xc0, 0xd2, 0x79, 0xe6, 0x9c, 0x42, - 0xbe, 0x7b, 0xbc, 0xd3, 0x86, 0xac, 0xf3, 0xf5, 0xe3, 0xa1, 0x93, 0xfb, 0x30, 0xc1, 0x74, 0x73, - 0x85, 0x46, 0xce, 0x25, 0x09, 0xb5, 0x23, 0xc1, 0xdc, 0xf9, 0xec, 0x42, 0x95, 0xf2, 0x67, 0x1c, - 0x3b, 0xc2, 0x0f, 0xd7, 0x21, 0x91, 0x91, 0x32, 0x24, 0x84, 0xaf, 0xf8, 0x73, 0xa7, 0x13, 0xe0, - 0xdd, 0xdb, 0xb7, 0x0a, 0xa4, 0x86, 0x61, 0xea, 0x0c, 0x25, 0x9f, 0xc8, 0xd7, 0x7b, 0x69, 0xed, - 0x9f, 0xb7, 0xa6, 0xa2, 0x12, 0x74, 0xe6, 0x9c, 0x0e, 0x36, 0x80, 0xa4, 0x75, 0x67, 0x72, 0x29, - 0x9e, 0x07, 0xd9, 0x6a, 0xf5, 0xdc, 0x99, 0x94, 0x73, 0xe3, 0x32, 0xd3, 0x9e, 0xc8, 0x32, 0x4c, - 0x8a, 0x67, 0xf0, 0x42, 0x9b, 0x27, 0xdd, 0xce, 0x03, 0xb9, 0x6c, 0xee, 0xa1, 0x9c, 0xd4, 0x89, - 0x80, 0xcc, 0xc5, 0xfd, 0x48, 0x1e, 0x13, 0xe6, 0xce, 0x65, 0x96, 0x89, 0xfe, 0xdd, 0x85, 0x49, - 0xf3, 0x70, 0x41, 0xe4, 0x00, 0x65, 0x9e, 0x39, 0x72, 0x1b, 0x54, 0x87, 0xd9, 0x75, 0xc7, 0xc5, - 0xfb, 0x12, 0xe1, 0x41, 0x27, 0x9d, 0xd4, 0x48, 0xa5, 0x8b, 0xd7, 0x5a, 0x8d, 0x7a, 0x4d, 0x35, - 0x08, 0x79, 0xe1, 0xfb, 0xf1, 0xb3, 0xa9, 0x49, 0x1d, 0xd9, 0x74, 0x20, 0x24, 0x96, 0x99, 0x74, - 0x39, 0xcb, 0x27, 0x74, 0x2e, 0xcf, 0x8d, 0x99, 0xac, 0xa3, 0x92, 0x9e, 0xe0, 0xa8, 0xcd, 0x89, - 0x13, 0xb3, 0x2b, 0x63, 0x30, 0x06, 0x2d, 0x13, 0xbe, 0x28, 0x0c, 0x49, 0x8e, 0xe0, 0x72, 0x99, - 0xdd, 0x2a, 0x90, 0xaf, 0xf1, 0xab, 0xce, 0x64, 0xf7, 0xd0, 0x8d, 0xf6, 0x85, 0xf6, 0x73, 0x2e, - 0x93, 0x81, 0xf8, 0x50, 0xba, 0x70, 0xb7, 0x61, 0x3a, 0xcb, 0x73, 0x5a, 0x09, 0xb4, 0x8b, 0x5b, - 0x75, 0xee, 0x2c, 0xb0, 0xd9, 0x51, 0xa3, 0x99, 0x3f, 0x48, 0x5d, 0x1c, 0x77, 0x73, 0x79, 0x7e, - 0x04, 0x93, 0x6c, 0x96, 0x3c, 0xa0, 0xb4, 0x5d, 0x6d, 0xb9, 0x4f, 0x69, 0x48, 0x64, 0x8c, 0x61, - 0x05, 0xca, 0xa3, 0xbd, 0x56, 0x20, 0xdf, 0x81, 0xb1, 0x87, 0x4e, 0xd4, 0xd8, 0x17, 0xb1, 0x36, - 0x65, 0x28, 0x4e, 0x84, 0xcd, 0xc9, 0x5f, 0x58, 0x78, 0xab, 0x40, 0xbe, 0x0f, 0xc3, 0xf7, 0x68, - 0x84, 0xaf, 0xa7, 0x2f, 0x2b, 0x47, 0x3f, 0x6e, 0x9f, 0x5c, 0xf5, 0xd4, 0x13, 0x21, 0xd9, 0xe0, - 0xa4, 0x31, 0x97, 0xdc, 0x04, 0xe0, 0x0b, 0x02, 0x72, 0x48, 0x16, 0xcf, 0xa5, 0x9a, 0x4d, 0xee, - 0x31, 0xe5, 0xa1, 0x45, 0x23, 0x7a, 0xdc, 0x2a, 0xf3, 0x64, 0xb4, 0x06, 0x93, 0x2a, 0x4b, 0xd2, - 0x06, 0x86, 0x44, 0xb1, 0x12, 0xcc, 0xc2, 0x13, 0x70, 0xfb, 0x80, 0x7d, 0x15, 0x3c, 0x45, 0x30, - 0xc6, 0xce, 0xc0, 0x95, 0x74, 0x56, 0x0f, 0xc0, 0xa1, 0x2f, 0xa1, 0x52, 0x88, 0x1c, 0x4d, 0xa3, - 0x5d, 0xf1, 0xc3, 0xc8, 0xa4, 0x55, 0x90, 0x6c, 0xda, 0x5f, 0x84, 0x39, 0xbd, 0x5e, 0x33, 0xd8, - 0x73, 0xbc, 0xe6, 0xe6, 0xc5, 0x90, 0x9e, 0xbb, 0xdc, 0x05, 0x43, 0x9c, 0xdf, 0xfa, 0x7f, 0xa3, - 0x58, 0xc0, 0xe5, 0x64, 0x09, 0xa6, 0x64, 0x5d, 0x9b, 0x6d, 0xea, 0xd5, 0x6a, 0x2b, 0x98, 0x11, - 0x47, 0xba, 0x95, 0x68, 0x30, 0xc9, 0x9d, 0xa4, 0x8b, 0xd8, 0xd6, 0x67, 0xc4, 0xc8, 0x20, 0xdd, - 0x22, 0x67, 0xc4, 0x5b, 0x5f, 0x66, 0x14, 0xe2, 0x07, 0xdc, 0xa8, 0x64, 0x28, 0xff, 0xbb, 0xf3, - 0xa4, 0xcb, 0x01, 0x68, 0x2e, 0xe7, 0x08, 0x71, 0xab, 0x40, 0xbe, 0x00, 0x92, 0x3e, 0x92, 0x28, - 0x11, 0xe6, 0x1e, 0xbf, 0x94, 0x08, 0xbb, 0x9c, 0x67, 0xee, 0xc1, 0x8c, 0x8a, 0x90, 0xa3, 0xd5, - 0x3a, 0x4f, 0x72, 0x5a, 0x93, 0xd7, 0x4a, 0xf2, 0x09, 0x4c, 0x89, 0x49, 0xab, 0x17, 0x90, 0x92, - 0x5a, 0x7f, 0xc4, 0xa9, 0x24, 0x77, 0x9e, 0xde, 0x87, 0x99, 0x5a, 0x42, 0x62, 0xdc, 0xd3, 0xfe, - 0xac, 0xc9, 0x02, 0x81, 0x35, 0x1a, 0x71, 0x91, 0x65, 0xf3, 0x7a, 0x00, 0x84, 0x1b, 0x85, 0x24, - 0xbb, 0xa7, 0x2e, 0x7d, 0x46, 0x2e, 0x24, 0x9a, 0xce, 0x80, 0x88, 0x86, 0x0b, 0x58, 0x6e, 0xcf, - 0xb6, 0x79, 0x82, 0x6b, 0x84, 0x1a, 0xf7, 0xe8, 0x97, 0x0c, 0x02, 0xe3, 0x2a, 0x5e, 0x0c, 0xc0, - 0xd9, 0x5c, 0x0c, 0xf2, 0x2b, 0x18, 0x9a, 0xb6, 0xfb, 0xb1, 0x8a, 0x7c, 0x27, 0xeb, 0xf4, 0x9b, - 0x73, 0x30, 0x9c, 0x7b, 0xeb, 0x78, 0xc8, 0xea, 0x20, 0x3b, 0x71, 0x8f, 0x46, 0x5b, 0xad, 0xce, - 0x9e, 0x8b, 0xa9, 0x4f, 0x89, 0x32, 0x1a, 0x29, 0x90, 0x98, 0x97, 0x32, 0x22, 0x5c, 0x5c, 0x50, - 0xa3, 0x3f, 0x22, 0xab, 0x50, 0xe2, 0xeb, 0xbf, 0xc6, 0xe2, 0x42, 0x8a, 0x85, 0x40, 0x71, 0x02, - 0xe7, 0x20, 0xcc, 0x1d, 0xad, 0x9b, 0xdc, 0x71, 0x89, 0xc8, 0x6f, 0x52, 0x57, 0x30, 0xa7, 0x0c, - 0x98, 0x0a, 0xd7, 0xcf, 0x46, 0xc4, 0xa6, 0x21, 0x8d, 0x64, 0x0c, 0x1c, 0x9e, 0xf8, 0xf6, 0x4a, - 0xbc, 0xd9, 0xa7, 0x4b, 0xe3, 0x4f, 0x3f, 0x11, 0xaf, 0x6d, 0xf7, 0x0e, 0x51, 0xc9, 0x80, 0x33, - 0x98, 0xbe, 0x6e, 0xe8, 0x24, 0x27, 0xe3, 0xfb, 0x36, 0xee, 0x41, 0x18, 0xf7, 0x67, 0x26, 0x6e, - 0x1b, 0xfb, 0x2d, 0xa9, 0x26, 0x34, 0xaa, 0xdd, 0x79, 0x5c, 0xd2, 0xd8, 0x26, 0xc9, 0x54, 0xd8, - 0x4e, 0x10, 0x50, 0x8f, 0x13, 0xe7, 0xe9, 0x1b, 0x59, 0xd4, 0x1f, 0xe3, 0xd2, 0xa3, 0x51, 0xf3, - 0x07, 0x81, 0xbd, 0x58, 0xf0, 0x44, 0x4d, 0xb7, 0x0a, 0xe4, 0x3d, 0x18, 0x11, 0x6d, 0x64, 0x44, - 0x46, 0xa3, 0xc3, 0x2e, 0xad, 0x46, 0x4a, 0xe0, 0x42, 0xc2, 0x36, 0x9b, 0x38, 0x79, 0xa3, 0xcf, - 0xdb, 0xfc, 0x1e, 0xdb, 0x6c, 0x9b, 0x2f, 0x42, 0xb9, 0x28, 0x77, 0x5d, 0xa4, 0x2c, 0xab, 0x58, - 0x31, 0x12, 0xd4, 0x63, 0x7b, 0xe4, 0x4c, 0x98, 0xde, 0x8c, 0x01, 0x17, 0x55, 0xdc, 0x34, 0xa5, - 0x37, 0x1b, 0xe0, 0x5e, 0x7b, 0xed, 0x2a, 0x94, 0xaa, 0x0d, 0xdc, 0x09, 0x6a, 0xf4, 0xc0, 0x69, - 0xef, 0xfb, 0x01, 0x55, 0x87, 0x96, 0x64, 0x81, 0xe4, 0x35, 0xa3, 0x34, 0x0b, 0x51, 0xb0, 0x46, - 0x1d, 0x8c, 0x4a, 0x3d, 0xab, 0x54, 0x8b, 0x44, 0x51, 0x36, 0x45, 0x97, 0x43, 0xca, 0xf4, 0x22, - 0x3b, 0x56, 0xb5, 0x5e, 0x8e, 0xcd, 0x07, 0xb8, 0x60, 0x28, 0xe4, 0x50, 0xed, 0x10, 0x0a, 0xa4, - 0x8e, 0x73, 0xf2, 0x6d, 0x90, 0x42, 0xad, 0xca, 0x7b, 0xe3, 0x58, 0x2c, 0x79, 0xd4, 0x79, 0xd5, - 0x7f, 0x0f, 0x26, 0x97, 0xd9, 0x82, 0xde, 0x69, 0xba, 0x3c, 0x12, 0x3f, 0x31, 0x43, 0xab, 0xe7, - 0x12, 0xae, 0xc8, 0xdc, 0x68, 0x48, 0x2a, 0x8e, 0xfe, 0x72, 0x4f, 0xd1, 0x60, 0x72, 0x3c, 0xa6, - 0x25, 0x5b, 0x91, 0x0c, 0x01, 0x8f, 0xe6, 0xe2, 0xac, 0x3f, 0xcb, 0x35, 0xc2, 0x6a, 0xbb, 0xdd, - 0x92, 0x26, 0x69, 0x7e, 0xf7, 0x7e, 0xd5, 0x38, 0x42, 0xa6, 0xca, 0x25, 0xef, 0xb4, 0xd2, 0xf8, - 0xb9, 0x96, 0xab, 0x38, 0x87, 0x67, 0x4e, 0x79, 0xaf, 0xb9, 0xa8, 0x62, 0x67, 0x57, 0x5b, 0xad, - 0x14, 0x71, 0x48, 0xde, 0x34, 0xb9, 0x67, 0xe1, 0xf4, 0xaa, 0x01, 0x8f, 0xe8, 0x5c, 0xeb, 0xaa, - 0xb6, 0xdb, 0x7c, 0xb1, 0xbc, 0xa8, 0x16, 0x0c, 0xb3, 0x20, 0x7d, 0x44, 0x4f, 0x96, 0x8b, 0xb5, - 0xfd, 0x3e, 0x4e, 0xb3, 0x38, 0xa1, 0x31, 0xd1, 0x0f, 0xbc, 0xc9, 0x7c, 0xce, 0x4a, 0x09, 0x4b, - 0x14, 0xaa, 0x7d, 0xe2, 0x14, 0xaa, 0x3e, 0x71, 0x76, 0x64, 0x65, 0x99, 0x49, 0xc0, 0x25, 0xbf, - 0x8b, 0x79, 0xc5, 0xca, 0x52, 0x5a, 0x4a, 0x26, 0x8d, 0x57, 0x5d, 0x4e, 0x67, 0x93, 0x37, 0xbb, - 0x9c, 0x9b, 0x6d, 0xfe, 0x3e, 0x94, 0x92, 0xf9, 0xaa, 0x15, 0xd3, 0x9c, 0x44, 0xd6, 0xb9, 0x63, - 0x72, 0x17, 0xa6, 0xf5, 0x11, 0x55, 0xfd, 0xce, 0x5b, 0xfd, 0xf3, 0xf8, 0x6c, 0xc3, 0x4c, 0x66, - 0x7a, 0x69, 0xb5, 0xc5, 0x76, 0x4b, 0x3e, 0x9d, 0xcb, 0x95, 0xc2, 0x99, 0xec, 0x0c, 0xf3, 0xe4, - 0x35, 0xf3, 0xe0, 0x9f, 0x9d, 0x6f, 0x7b, 0xee, 0x6a, 0x0f, 0x2c, 0x21, 0xd0, 0xaf, 0x71, 0x07, - 0x4c, 0xd5, 0x71, 0x59, 0x33, 0x05, 0xe4, 0x54, 0x60, 0x75, 0x43, 0x51, 0x73, 0x60, 0x3a, 0xa3, - 0x38, 0x5f, 0xc4, 0x57, 0xf2, 0x79, 0xc6, 0x13, 0x6b, 0x57, 0x86, 0x88, 0xce, 0x95, 0x4c, 0xd7, - 0x4c, 0xe4, 0x5d, 0xce, 0x92, 0x73, 0x6a, 0x3e, 0x1c, 0xbf, 0xc9, 0x79, 0xdc, 0x9a, 0xca, 0x6c, - 0x63, 0xa4, 0x09, 0x4f, 0x9a, 0x6d, 0xb2, 0xd2, 0x9b, 0x2b, 0x31, 0x74, 0x4b, 0xa0, 0xcf, 0x77, - 0xe3, 0xaf, 0xb8, 0x1d, 0xc7, 0xac, 0x42, 0xb7, 0xe3, 0x64, 0xf2, 0xbf, 0x94, 0x8f, 0xa0, 0x33, - 0x77, 0xf8, 0xa5, 0x6d, 0x22, 0xcf, 0x39, 0xd1, 0x8f, 0x4a, 0xd9, 0x39, 0xd0, 0xd5, 0xdc, 0xc8, - 0x44, 0xd1, 0xab, 0x78, 0x28, 0xbf, 0xc1, 0x1c, 0x29, 0x75, 0x49, 0x02, 0xdf, 0x5d, 0x4d, 0xd9, - 0x84, 0x72, 0x3c, 0x98, 0x89, 0x0e, 0x9c, 0x70, 0x28, 0xa5, 0x30, 0xce, 0xe6, 0xa6, 0x7e, 0x27, - 0x6f, 0xa4, 0xbe, 0xf4, 0x1c, 0xc1, 0x74, 0xad, 0x82, 0xaf, 0xe7, 0x5a, 0xc8, 0xe9, 0x73, 0xb1, - 0x11, 0x57, 0xcf, 0x12, 0x9f, 0x5a, 0xcf, 0x33, 0x52, 0xc8, 0xdf, 0x43, 0xbd, 0x58, 0x4b, 0x03, - 0x9f, 0xdb, 0xeb, 0x0b, 0x59, 0x7c, 0xc2, 0xf4, 0x8a, 0xab, 0xb5, 0x4b, 0xea, 0x69, 0xc9, 0x82, - 0x93, 0xac, 0xb8, 0xc7, 0x69, 0x5a, 0x1e, 0x9f, 0x25, 0x18, 0xd3, 0xf2, 0xc7, 0x93, 0xb3, 0x86, - 0x98, 0x8c, 0x3d, 0x74, 0xce, 0xe8, 0x9c, 0xb9, 0x7d, 0x2e, 0xa2, 0x29, 0x59, 0x65, 0xa1, 0xcf, - 0x6d, 0xc5, 0xb9, 0x34, 0x0f, 0xc3, 0x8c, 0xac, 0xa4, 0xc0, 0x5b, 0x73, 0x3e, 0x29, 0x1c, 0xa3, - 0x41, 0xf9, 0x5d, 0x22, 0xba, 0x68, 0x7a, 0x34, 0x29, 0x5f, 0x7f, 0x9d, 0x12, 0x49, 0x6a, 0x31, - 0x4f, 0x8c, 0x8c, 0x29, 0x78, 0x46, 0xd9, 0xc4, 0x34, 0x28, 0x1a, 0x28, 0xb2, 0xd9, 0x6c, 0xe1, - 0xf3, 0x91, 0x8c, 0x84, 0xfa, 0x6a, 0x85, 0xed, 0x9a, 0x6f, 0x3f, 0x43, 0x77, 0x53, 0x6b, 0x76, - 0x2e, 0xc7, 0xae, 0x19, 0xf6, 0x73, 0x5b, 0xfa, 0x03, 0x6d, 0xcd, 0x4e, 0xa5, 0xcd, 0x27, 0xd7, - 0x92, 0x8a, 0x5b, 0x5e, 0x66, 0xfd, 0x2e, 0x7b, 0xc2, 0x74, 0x56, 0xc6, 0x7d, 0xcd, 0xae, 0x9b, - 0x9b, 0x8e, 0x3f, 0x43, 0x0a, 0xb6, 0x9c, 0xff, 0x39, 0xdc, 0xba, 0xe4, 0xdf, 0xcf, 0x6d, 0xe1, - 0x97, 0xda, 0x42, 0x97, 0xc8, 0x93, 0xaf, 0x8e, 0xe3, 0x3d, 0x12, 0xe9, 0xe7, 0xf2, 0xde, 0xc0, - 0x07, 0x47, 0xe9, 0x24, 0xf7, 0x4a, 0xb3, 0xe9, 0x96, 0x02, 0x3f, 0xd3, 0xec, 0x3b, 0x93, 0xee, - 0x22, 0xe3, 0x77, 0x26, 0x61, 0xb4, 0xed, 0xd5, 0xb0, 0xaf, 0xe5, 0x62, 0x9c, 0x91, 0x1c, 0x3f, - 0xb1, 0x18, 0xe7, 0xa7, 0xcf, 0xef, 0x72, 0x0c, 0x3a, 0x55, 0x73, 0xf7, 0x3c, 0x2d, 0xb7, 0xbd, - 0x3a, 0x04, 0xa5, 0xd3, 0xed, 0xab, 0x25, 0x26, 0x2b, 0x15, 0xfe, 0x26, 0xd3, 0x7f, 0xb8, 0xf6, - 0xae, 0x67, 0x29, 0x27, 0x73, 0xf9, 0xc9, 0xd9, 0xd5, 0x72, 0x93, 0x99, 0xd6, 0x5c, 0x63, 0xa8, - 0xa7, 0x08, 0x57, 0x0c, 0x33, 0xb2, 0x95, 0x2b, 0x86, 0x99, 0x39, 0xc5, 0x6f, 0xa2, 0xd5, 0xc5, - 0xf6, 0x5b, 0x54, 0xb7, 0xba, 0x68, 0x39, 0xa7, 0x13, 0x46, 0x0f, 0xf2, 0x31, 0x8c, 0xaa, 0x9c, - 0xdc, 0xca, 0xbe, 0x9d, 0x4c, 0x0b, 0x3e, 0x57, 0x4e, 0x17, 0x88, 0x0a, 0xdf, 0x91, 0x86, 0x0f, - 0xac, 0xb3, 0x6c, 0x1a, 0x8c, 0xf2, 0xab, 0x7d, 0x47, 0x5a, 0x3d, 0x0c, 0xb2, 0x54, 0x46, 0xee, - 0x24, 0xd9, 0xf7, 0x60, 0x3c, 0xce, 0xbe, 0xbd, 0x3b, 0xaf, 0x11, 0x26, 0x52, 0x72, 0x27, 0x09, - 0xdf, 0x93, 0x57, 0x1a, 0x58, 0x9f, 0x59, 0xd8, 0x7d, 0x17, 0xff, 0x58, 0x5a, 0x59, 0x8c, 0x96, - 0xa6, 0x72, 0x79, 0x77, 0x59, 0x7c, 0xc7, 0xf5, 0x74, 0x98, 0x6a, 0x68, 0x33, 0x12, 0xda, 0xaa, - 0xa1, 0xcd, 0x4a, 0x48, 0x1b, 0x9b, 0xfc, 0xbf, 0x90, 0x26, 0x85, 0x98, 0xe9, 0x05, 0xa3, 0x59, - 0x29, 0xbe, 0x17, 0xf3, 0x8a, 0x93, 0xac, 0x6b, 0x50, 0x4a, 0xe6, 0xee, 0x54, 0xe7, 0xb1, 0x9c, - 0x24, 0xab, 0xea, 0x90, 0x97, 0x9b, 0xf4, 0x73, 0x4b, 0xda, 0xc7, 0x4d, 0xbe, 0x97, 0xb3, 0x1b, - 0xa5, 0xb3, 0xce, 0x37, 0x98, 0x4f, 0x18, 0x69, 0x3c, 0xf5, 0x93, 0x72, 0x2a, 0x4d, 0xa8, 0xae, - 0x59, 0x65, 0x64, 0xfe, 0x74, 0x65, 0x44, 0xa9, 0xec, 0x8c, 0xeb, 0x6f, 0x9a, 0x47, 0xd8, 0x2e, - 0x31, 0xdf, 0x7b, 0x5e, 0xff, 0x92, 0x5f, 0x80, 0xd9, 0x9c, 0x18, 0xd6, 0xe4, 0x6a, 0xc2, 0xd2, - 0x9a, 0x1d, 0xe3, 0x5a, 0x4d, 0x90, 0xcc, 0xfc, 0xda, 0xeb, 0xe8, 0x37, 0x60, 0xc4, 0x77, 0x48, - 0xdd, 0xc5, 0x3d, 0x74, 0xa3, 0x7d, 0x9e, 0x46, 0x5a, 0x5b, 0x36, 0x33, 0x03, 0x43, 0x90, 0x1a, - 0x9e, 0x45, 0x0c, 0x68, 0xc6, 0x75, 0x5c, 0x06, 0xc3, 0xb9, 0x6c, 0x86, 0x6c, 0xed, 0x60, 0x73, - 0x21, 0x23, 0xf8, 0x86, 0x9a, 0x0b, 0xf9, 0x81, 0x39, 0x72, 0x9b, 0xb9, 0x25, 0x75, 0xa4, 0x6c, - 0x8e, 0xf9, 0x71, 0x38, 0x72, 0x39, 0xde, 0x67, 0x1c, 0x53, 0xa1, 0x35, 0x48, 0x0e, 0x7a, 0xf7, - 0xd5, 0xc3, 0x96, 0x5b, 0xae, 0x49, 0x35, 0xaf, 0xb5, 0x2f, 0x2f, 0x88, 0x47, 0x6e, 0xfb, 0x96, - 0xe5, 0xf7, 0x94, 0xdd, 0xbe, 0xe3, 0x6e, 0xba, 0xea, 0xfe, 0x2b, 0x11, 0xdd, 0xc5, 0xe8, 0xa8, - 0x06, 0x9f, 0xcb, 0x81, 0x93, 0x0d, 0x74, 0x04, 0x4a, 0x42, 0xb5, 0x43, 0x69, 0x76, 0xf8, 0x98, - 0x5c, 0x7e, 0x7c, 0x1e, 0x1b, 0xe1, 0x37, 0x4e, 0x32, 0x8f, 0x13, 0x71, 0x3b, 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, 0x26, 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, 0xae, 0x90, 0xd1, 0xd1, 0xac, 0x79, 0x9c, 0xc4, 0xe7, 0xf3, 0x38, - 0x09, 0x4d, 0x18, 0x57, 0xba, 0xcc, 0xe3, 0x24, 0xe5, 0x67, 0xc8, 0x2f, 0x11, 0x13, 0xe5, 0x38, - 0x33, 0x39, 0x37, 0x9c, 0x0a, 0x79, 0x88, 0xe6, 0xbd, 0x04, 0xfc, 0x78, 0xb3, 0xf9, 0x7c, 0x1e, - 0x53, 0x9c, 0xcf, 0xbb, 0x52, 0x88, 0xc9, 0xe6, 0x9a, 0xb6, 0xab, 0xec, 0x90, 0x30, 0x5d, 0x1a, - 0xbc, 0xcb, 0xe6, 0x4d, 0xb3, 0x0b, 0xdf, 0x6e, 0x11, 0x6d, 0xba, 0xf0, 0x55, 0x47, 0x99, 0x24, - 0xdf, 0x5c, 0x92, 0xee, 0xf3, 0xfb, 0x73, 0x79, 0xc1, 0x91, 0xa4, 0x9b, 0x4f, 0x1c, 0x8e, 0x4e, - 0xdc, 0x52, 0x75, 0x48, 0x4a, 0xb6, 0xf4, 0xa4, 0xf3, 0x7c, 0x5d, 0x6a, 0x0f, 0xa9, 0x50, 0x58, - 0x89, 0x4e, 0xeb, 0x73, 0x3d, 0xb7, 0x84, 0x6c, 0xa3, 0x2d, 0x37, 0x0d, 0xd7, 0xec, 0xc0, 0x79, - 0x31, 0xb7, 0x7a, 0x72, 0x4d, 0x05, 0xf5, 0xd1, 0xb9, 0xe6, 0x45, 0xfc, 0x51, 0x5c, 0xd3, 0xd4, - 0x9f, 0xa0, 0xf5, 0x4b, 0xbc, 0xb8, 0xf2, 0x1e, 0xfb, 0xf9, 0x96, 0x94, 0x29, 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, 0xb7, 0x20, 0x8d, 0x6e, 0xc7, 0x68, 0xc1, - 0x71, 0x8c, 0x6d, 0xc7, 0x91, 0x44, 0xbe, 0x65, 0x8a, 0x6d, 0x87, 0xdb, 0x41, 0x27, 0x8c, 0x68, - 0x33, 0x6d, 0x51, 0x32, 0x1b, 0x23, 0x3d, 0x23, 0x4c, 0xf4, 0xdd, 0x79, 0xb2, 0x8a, 0x6b, 0x9b, - 0x09, 0xee, 0x66, 0x72, 0xcb, 0x66, 0x83, 0x4b, 0xcf, 0x8a, 0x7a, 0xd6, 0x63, 0xb6, 0x29, 0xaf, - 0xee, 0xfc, 0x46, 0x29, 0x11, 0x1d, 0xb3, 0x77, 0x79, 0x22, 0xfa, 0x10, 0xdd, 0x00, 0xb8, 0xf9, - 0xaf, 0x97, 0x64, 0x92, 0x0f, 0x8d, 0xc8, 0xa7, 0x30, 0x2a, 0x89, 0x7b, 0x0b, 0x24, 0x49, 0x8d, - 0x02, 0x59, 0x82, 0x09, 0xe3, 0x15, 0x95, 0x3a, 0xdd, 0x64, 0xbd, 0xad, 0xea, 0x32, 0xce, 0x13, - 0xc6, 0x6b, 0x29, 0xc5, 0x25, 0xeb, 0x0d, 0x55, 0x2e, 0x97, 0xef, 0xc3, 0x98, 0x10, 0x69, 0x57, - 0x69, 0xe4, 0xdb, 0xdb, 0x66, 0x34, 0x8f, 0xe4, 0x4e, 0xd3, 0x8d, 0x16, 0x7d, 0xef, 0xb1, 0xbb, - 0xd7, 0x53, 0x30, 0x69, 0x92, 0xdd, 0x79, 0xf2, 0x15, 0x26, 0x5d, 0x96, 0xa9, 0xb0, 0x69, 0xf4, - 0xcc, 0x0f, 0x9e, 0xb8, 0xde, 0x5e, 0x0f, 0x96, 0x97, 0x4c, 0x96, 0x49, 0x3a, 0xe9, 0x3b, 0xf2, - 0x15, 0xcc, 0xd5, 0xf2, 0x99, 0xf7, 0x64, 0xd2, 0x7d, 0x7b, 0xa9, 0xc1, 0x79, 0xf4, 0x9e, 0x39, - 0x69, 0xdb, 0xbb, 0x32, 0xfd, 0x82, 0x47, 0x53, 0x94, 0xb6, 0xfa, 0x86, 0x1f, 0x34, 0x7b, 0x73, - 0xac, 0x98, 0x8e, 0xb4, 0x09, 0x32, 0x29, 0x8c, 0x2f, 0xe0, 0x6c, 0x2d, 0x97, 0x75, 0x2f, 0x16, - 0xbd, 0x34, 0xc9, 0x73, 0x28, 0x8a, 0x13, 0xb6, 0xbb, 0x2b, 0xcf, 0x55, 0x5c, 0xd3, 0xd8, 0x3e, - 0xb4, 0x15, 0xd0, 0xc7, 0x34, 0x40, 0x77, 0xed, 0x5e, 0x8e, 0xca, 0x26, 0xba, 0xec, 0xf9, 0x2a, - 0x9c, 0xae, 0xa5, 0x58, 0xe5, 0x91, 0xf4, 0xba, 0xff, 0x99, 0xc2, 0x9e, 0x1e, 0xb3, 0x5d, 0x3d, - 0xbc, 0x84, 0xc6, 0xee, 0xd1, 0x68, 0x67, 0xb5, 0x87, 0x94, 0xe4, 0x7b, 0x02, 0x89, 0xb8, 0x7b, - 0x9b, 0x51, 0xd6, 0x34, 0xca, 0x34, 0x46, 0xee, 0xc7, 0xfb, 0xa9, 0xbc, 0x0b, 0xe9, 0x59, 0x6d, - 0x1e, 0x87, 0x3b, 0xb8, 0x16, 0x0a, 0x97, 0xe5, 0xd9, 0x58, 0x05, 0xe0, 0x90, 0xd8, 0x54, 0xa7, - 0x79, 0x2f, 0x87, 0xa4, 0xca, 0x8f, 0x7f, 0x7c, 0x7a, 0x08, 0xd8, 0xc5, 0x94, 0x2b, 0x7b, 0x57, - 0x16, 0xdc, 0x0a, 0xba, 0xe6, 0x37, 0x9e, 0xe8, 0x56, 0x50, 0x2d, 0x2d, 0xff, 0x9c, 0x99, 0x34, - 0x5f, 0xac, 0xf8, 0x98, 0x39, 0x5f, 0x77, 0xfc, 0xd2, 0x13, 0xf3, 0xcf, 0xcd, 0xa6, 0xe0, 0xc2, - 0x82, 0x74, 0x47, 0xda, 0x16, 0xb1, 0x42, 0x93, 0x73, 0xae, 0x68, 0x94, 0x59, 0x11, 0x89, 0x4c, - 0xb3, 0xa2, 0xde, 0xd0, 0x7c, 0x5b, 0x3e, 0xb1, 0x69, 0xbb, 0x85, 0x5e, 0xd0, 0x07, 0x3e, 0xa7, - 0x89, 0x1d, 0x63, 0xd3, 0x45, 0xbd, 0xfd, 0xb7, 0xa6, 0x84, 0xd7, 0x8f, 0x21, 0x78, 0x15, 0xed, - 0x38, 0x5d, 0x16, 0x8b, 0x52, 0x77, 0x46, 0xba, 0x55, 0x20, 0x1b, 0x70, 0xe6, 0x1e, 0x8d, 0xc4, - 0x1a, 0x67, 0xd3, 0x30, 0x0a, 0xdc, 0x46, 0xd4, 0xf5, 0x62, 0x50, 0x9e, 0x4d, 0x32, 0x68, 0x76, - 0xdf, 0x66, 0xfc, 0x6a, 0xd9, 0xfc, 0xba, 0xd2, 0x75, 0x71, 0x91, 0x15, 0xb7, 0x0d, 0x27, 0x69, - 0x62, 0xfe, 0x14, 0x1f, 0xe6, 0x1e, 0x38, 0xf9, 0xa4, 0xa5, 0x38, 0xfa, 0x89, 0x38, 0x6d, 0xdd, - 0x80, 0x21, 0x4e, 0x94, 0xbb, 0xa1, 0x8e, 0xeb, 0x34, 0xe4, 0x36, 0x8c, 0x2a, 0x17, 0x1a, 0x62, - 0x14, 0xe5, 0xb6, 0xeb, 0x36, 0x8c, 0xf2, 0xa3, 0xd5, 0xf1, 0x49, 0x3e, 0x84, 0x51, 0xe5, 0x73, - 0x73, 0xe2, 0x9d, 0xfe, 0x13, 0x98, 0xd0, 0xbd, 0x6f, 0x4e, 0x2e, 0xc8, 0xef, 0xe3, 0xf5, 0xad, - 0xbc, 0x25, 0xc9, 0xa7, 0x9f, 0x49, 0x04, 0x85, 0x11, 0x22, 0xe5, 0x0b, 0xa4, 0x04, 0xe6, 0x36, - 0xff, 0x74, 0x8a, 0x9a, 0x7c, 0x28, 0x5f, 0x32, 0x29, 0xe2, 0x34, 0x52, 0x17, 0x99, 0x4d, 0x72, - 0x31, 0xbf, 0x08, 0xb1, 0x5a, 0x60, 0x7b, 0x36, 0xfb, 0x38, 0xd7, 0xcc, 0xbd, 0x45, 0x97, 0xc7, - 0x65, 0x13, 0xb5, 0xb4, 0x54, 0xa2, 0xbb, 0x7c, 0x46, 0x17, 0xf3, 0x73, 0xe3, 0xe1, 0x60, 0xdc, - 0xc7, 0x53, 0x60, 0xaa, 0x34, 0xb7, 0x7b, 0x5d, 0x72, 0xed, 0xc5, 0xc7, 0xde, 0x34, 0xbb, 0x2e, - 0x64, 0xdd, 0x4e, 0xd1, 0xe2, 0x7d, 0xe6, 0x2b, 0x61, 0xb7, 0x2a, 0x9d, 0x18, 0x8f, 0xdf, 0xd9, - 0xfc, 0x96, 0x9d, 0xcb, 0xb8, 0xd8, 0xee, 0x39, 0x16, 0x79, 0xec, 0x7e, 0x01, 0xb5, 0xc3, 0xcc, - 0xa8, 0x60, 0xf9, 0xcc, 0xae, 0x69, 0xbe, 0x11, 0x99, 0x94, 0x6a, 0xd3, 0x7b, 0x82, 0x4f, 0xc4, - 0xb2, 0x53, 0x01, 0xbe, 0xde, 0x83, 0x8b, 0x94, 0xc4, 0x1b, 0x3d, 0xf1, 0xd4, 0x35, 0xe9, 0x39, - 0xbe, 0xc3, 0x66, 0xd7, 0xd7, 0x23, 0xb5, 0x61, 0xc6, 0xcd, 0xb5, 0xf2, 0x10, 0xcd, 0x66, 0x68, - 0x7a, 0x88, 0x76, 0xed, 0x43, 0x9e, 0xf8, 0x3f, 0x83, 0x4a, 0xec, 0x00, 0x72, 0xb2, 0x41, 0xc8, - 0x77, 0x4c, 0x24, 0x29, 0x49, 0x85, 0xa4, 0x5b, 0xae, 0x9f, 0xb9, 0xcb, 0x79, 0x12, 0xd6, 0x9f, - 0xc1, 0x08, 0xc7, 0xb6, 0x44, 0x52, 0xcc, 0xbc, 0xf4, 0x9a, 0x5d, 0xec, 0xb0, 0xe2, 0xcd, 0xdc, - 0x2b, 0x61, 0x94, 0x1e, 0xed, 0x93, 0x33, 0x52, 0xfe, 0x19, 0x09, 0x46, 0x56, 0x97, 0xe1, 0xed, - 0x7d, 0xf5, 0x58, 0xce, 0x19, 0xd7, 0x93, 0x0f, 0xa8, 0x13, 0xbf, 0x13, 0x4b, 0x04, 0x11, 0xd4, - 0xdf, 0xe6, 0xa6, 0x8b, 0x92, 0x8f, 0x9c, 0xb2, 0x30, 0x94, 0x53, 0x54, 0x59, 0x56, 0xc1, 0xe0, - 0xec, 0x28, 0xe2, 0x07, 0x6e, 0xf4, 0x7c, 0xd1, 0x5e, 0x8b, 0xcd, 0x0a, 0x7a, 0x81, 0xe4, 0x0d, - 0xb2, 0xd0, 0x5e, 0x23, 0x5f, 0xe2, 0x52, 0x22, 0xd8, 0x2f, 0xf8, 0x7e, 0x14, 0x46, 0x81, 0xd3, - 0xae, 0x35, 0x02, 0xb7, 0x1d, 0xe5, 0x76, 0x3a, 0xf6, 0xe1, 0xce, 0x22, 0xd3, 0x5c, 0x4a, 0x45, - 0x90, 0xf9, 0xac, 0xc8, 0x37, 0xea, 0x59, 0x4d, 0x56, 0x61, 0x97, 0x93, 0x4b, 0x4d, 0x86, 0x95, - 0x7f, 0x95, 0x4c, 0xeb, 0x30, 0x9b, 0x13, 0x2f, 0x48, 0xdd, 0xde, 0x76, 0x8f, 0x27, 0x34, 0xd7, - 0xbd, 0x62, 0xf2, 0x15, 0xcc, 0x64, 0x06, 0x14, 0x52, 0x16, 0xe8, 0x6e, 0xe1, 0x86, 0x7a, 0x31, - 0x7f, 0x02, 0x65, 0xfe, 0xa0, 0x03, 0xfd, 0x96, 0x8d, 0xd8, 0x32, 0xf1, 0x33, 0x9f, 0x1c, 0x84, - 0xe4, 0x7a, 0x9d, 0x8f, 0xa7, 0x1e, 0x9b, 0x4f, 0x63, 0x50, 0x91, 0x44, 0x3a, 0x77, 0xf5, 0xe1, - 0x65, 0x15, 0x76, 0x7b, 0x4b, 0xb4, 0x05, 0x33, 0xbb, 0x34, 0x70, 0x1f, 0x3f, 0x4f, 0x32, 0x94, - 0x92, 0xc9, 0x2c, 0xed, 0xc6, 0xf1, 0x73, 0x98, 0x5d, 0xf4, 0x0f, 0xda, 0xe2, 0xd5, 0x9e, 0xc1, - 0x53, 0x5d, 0xc5, 0x67, 0x97, 0xf7, 0xf6, 0x65, 0x9a, 0xcb, 0x4f, 0xbc, 0xaf, 0x5c, 0xd8, 0x7a, - 0xe6, 0xe6, 0x57, 0x6f, 0xcf, 0x4c, 0xfa, 0x6d, 0x9c, 0x84, 0x59, 0x99, 0xf8, 0xf5, 0x49, 0xd8, - 0x25, 0x53, 0x7f, 0xce, 0x1b, 0xb0, 0xd9, 0x9c, 0xe4, 0xfb, 0x5d, 0xb8, 0x1e, 0xa3, 0xb5, 0x1b, - 0x72, 0x6f, 0x31, 0x73, 0x89, 0x27, 0x9c, 0xa6, 0x33, 0x13, 0x8d, 0x67, 0xb6, 0x53, 0x8b, 0xaa, - 0xd0, 0x6a, 0x75, 0x51, 0xb1, 0x88, 0x1e, 0x56, 0x81, 0x61, 0xa2, 0x11, 0x7f, 0x42, 0xa7, 0xed, - 0xb6, 0x5a, 0xa7, 0x88, 0x51, 0xa9, 0xfd, 0x00, 0xc6, 0x6b, 0x7a, 0xe5, 0x19, 0x95, 0xe4, 0x4e, - 0x0a, 0xf5, 0x0a, 0xa8, 0x77, 0xdb, 0xbb, 0xf8, 0x82, 0xaa, 0x8d, 0xe7, 0x58, 0xbd, 0xc8, 0x75, - 0x9d, 0x31, 0x12, 0xc3, 0xa9, 0x5d, 0x20, 0x2b, 0x6f, 0xa3, 0x72, 0x9d, 0xc9, 0xce, 0x25, 0x57, - 0xe7, 0xe9, 0x66, 0x92, 0x69, 0x39, 0x89, 0xd5, 0x3b, 0xff, 0xad, 0xf2, 0x89, 0xef, 0x9a, 0xd7, - 0x93, 0xfb, 0xf9, 0xc4, 0xa9, 0xf0, 0x74, 0x3f, 0x9f, 0x54, 0x82, 0x3d, 0xdd, 0xcf, 0x27, 0x23, - 0x7b, 0xde, 0x32, 0xf2, 0x8a, 0xf3, 0xf4, 0x74, 0x31, 0x46, 0x28, 0x36, 0x19, 0xe9, 0x80, 0x1e, - 0xe8, 0xc1, 0x39, 0x78, 0x76, 0x9f, 0x2e, 0xb6, 0xd6, 0x64, 0x50, 0x8e, 0x44, 0x3a, 0xa0, 0xbb, - 0x50, 0xe2, 0x89, 0x0e, 0xe2, 0x98, 0x86, 0xb1, 0xeb, 0x5f, 0x3a, 0xff, 0x42, 0x97, 0x41, 0x2d, - 0x25, 0x23, 0xc1, 0x29, 0x93, 0x59, 0x4e, 0x88, 0xb8, 0x2e, 0x53, 0x15, 0xe2, 0x78, 0x6f, 0xca, - 0x30, 0x95, 0x0a, 0x01, 0x37, 0x77, 0x36, 0xa3, 0x44, 0xa9, 0x94, 0xe3, 0x7a, 0x74, 0x38, 0xd5, - 0xa5, 0x8c, 0x90, 0x71, 0x73, 0xe7, 0x32, 0xcb, 0x04, 0xa3, 0x88, 0xa7, 0x80, 0xce, 0x4e, 0x5c, - 0x1d, 0x3f, 0xe4, 0xea, 0x82, 0x23, 0xab, 0xb9, 0x7e, 0x1c, 0x54, 0x51, 0x2b, 0x55, 0x59, 0x8a, - 0x32, 0xb2, 0x65, 0xbf, 0x91, 0xf1, 0xd6, 0xc2, 0xc0, 0x88, 0xbd, 0xc1, 0xba, 0xa7, 0xee, 0x26, - 0x0f, 0x65, 0xd6, 0x98, 0x9c, 0x9a, 0x7a, 0x31, 0xc8, 0x1d, 0xc1, 0x87, 0x32, 0x4f, 0xcc, 0xab, - 0x66, 0xfc, 0x08, 0xce, 0x27, 0x1e, 0x70, 0x98, 0x8c, 0xaf, 0x67, 0xbf, 0xf2, 0xc8, 0x14, 0x4f, - 0xbe, 0xce, 0x7e, 0x29, 0xfd, 0xd0, 0x23, 0x31, 0xee, 0x27, 0x5d, 0xf3, 0xd6, 0x61, 0x12, 0x97, - 0x19, 0x99, 0xf7, 0x3d, 0x8e, 0x0d, 0x63, 0x82, 0x93, 0x41, 0x8a, 0x92, 0xa5, 0xea, 0xfd, 0xf8, - 0xb8, 0x78, 0x14, 0xcc, 0xb3, 0xc8, 0xcf, 0x99, 0x2f, 0x85, 0x11, 0x98, 0xb5, 0x8b, 0x89, 0xe4, - 0xf4, 0xe4, 0xfb, 0x70, 0x2a, 0x7e, 0x2b, 0xcc, 0x59, 0x64, 0xa0, 0x75, 0x31, 0x94, 0x9d, 0x8a, - 0x1f, 0x0c, 0x9f, 0x9c, 0x7c, 0x45, 0x6e, 0x45, 0x31, 0xf9, 0x85, 0xd4, 0x73, 0x17, 0xa3, 0x0f, - 0xc7, 0xd9, 0x91, 0x34, 0xd9, 0x9e, 0x74, 0x74, 0x1a, 0xf8, 0xb9, 0x65, 0x87, 0x3d, 0xd4, 0x3f, - 0xb7, 0xae, 0xa1, 0x19, 0x95, 0xfa, 0x9b, 0xc3, 0x67, 0x1d, 0xae, 0x60, 0xa8, 0x94, 0x2d, 0x1e, - 0x1c, 0x2f, 0x1b, 0x2b, 0xbf, 0xed, 0xc9, 0x00, 0x2b, 0x2d, 0xb8, 0xdc, 0x33, 0xee, 0x23, 0xb9, - 0x69, 0xb8, 0xb8, 0xf4, 0x8e, 0x10, 0xd9, 0xe5, 0xe4, 0x31, 0x9d, 0x15, 0x3e, 0x51, 0xed, 0xb3, - 0x5d, 0x22, 0x39, 0xaa, 0x7d, 0xb6, 0x6b, 0xfc, 0xc5, 0xcf, 0x31, 0x15, 0x93, 0xd8, 0xa3, 0x30, - 0xfc, 0x11, 0xf5, 0x78, 0x50, 0xe8, 0xae, 0xd7, 0x3e, 0x97, 0xcd, 0x4b, 0xd1, 0x14, 0x21, 0x9e, - 0x69, 0x2e, 0x8a, 0x93, 0x58, 0x1e, 0xf3, 0xde, 0x4c, 0xba, 0xb8, 0x56, 0x5f, 0xe4, 0x13, 0xf0, - 0xc4, 0x2d, 0xcf, 0x81, 0x2f, 0x2c, 0xfd, 0xe4, 0xbf, 0x5f, 0x2c, 0xfc, 0xe4, 0xa7, 0x17, 0x0b, - 0xff, 0xf9, 0xa7, 0x17, 0x0b, 0xff, 0xed, 0xa7, 0x17, 0x0b, 0x5f, 0xce, 0x1f, 0x2f, 0x34, 0x31, - 0x4f, 0x9e, 0x78, 0x93, 0xb3, 0x1b, 0xc2, 0xff, 0xee, 0xfc, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xdd, 0x9a, 0x35, 0x14, 0xb6, 0xeb, 0x00, 0x00, + // 15364 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x59, 0x6c, 0x5c, 0xc9, + 0x76, 0x98, 0x9a, 0x3b, 0x0f, 0x17, 0xb5, 0x8a, 0xa4, 0xd8, 0xa2, 0x96, 0x96, 0xae, 0x46, 0x33, + 0x1a, 0xbd, 0x79, 0x5a, 0x38, 0xcb, 0x9b, 0x7d, 0xa6, 0x9b, 0xa4, 0x44, 0x4a, 0xdc, 0xe6, 0x36, + 0x49, 0xcd, 0xe6, 0xd7, 0xef, 0xb2, 0xbb, 0x44, 0x5e, 0xab, 0x79, 0x6f, 0xbf, 0x7b, 0x6f, 0x4b, + 0xa3, 0xe7, 0x3c, 0x07, 0xb6, 0xb3, 0x18, 0x08, 0x92, 0xd8, 0x40, 0x12, 0x38, 0xc9, 0x87, 0x13, + 0xc0, 0x01, 0x82, 0x00, 0x01, 0xfc, 0x13, 0xf8, 0xcb, 0x08, 0xf2, 0x95, 0x17, 0x03, 0x41, 0x62, + 0xd8, 0xfe, 0x09, 0x10, 0x3a, 0x79, 0x81, 0x7f, 0x88, 0xe4, 0xc3, 0x08, 0x12, 0x20, 0x2f, 0x30, + 0x10, 0xd4, 0xa9, 0xe5, 0x56, 0xdd, 0xa5, 0x9b, 0x94, 0x34, 0xcf, 0xf9, 0x91, 0xd8, 0x67, 0xab, + 0xaa, 0x53, 0x75, 0xab, 0xea, 0x9c, 0x3a, 0x75, 0x0a, 0x6e, 0x46, 0xb4, 0x45, 0xdb, 0x7e, 0x10, + 0xdd, 0x6a, 0xd1, 0x3d, 0xa7, 0xf1, 0xec, 0x56, 0xa3, 0xe5, 0x52, 0x2f, 0xba, 0xd5, 0x0e, 0xfc, + 0xc8, 0xbf, 0xe5, 0x74, 0xa2, 0xfd, 0x90, 0x06, 0x4f, 0xdc, 0x06, 0xbd, 0x89, 0x10, 0x32, 0x88, + 0xff, 0xcd, 0x4d, 0xef, 0xf9, 0x7b, 0x3e, 0xa7, 0x61, 0x7f, 0x71, 0xe4, 0xdc, 0xf9, 0x3d, 0xdf, + 0xdf, 0x6b, 0x51, 0xce, 0xbc, 0xdb, 0x79, 0x74, 0x8b, 0x1e, 0xb4, 0xa3, 0x67, 0x02, 0x59, 0x4e, + 0x22, 0x23, 0xf7, 0x80, 0x86, 0x91, 0x73, 0xd0, 0x16, 0x04, 0xaf, 0xab, 0xaa, 0x38, 0x51, 0xc4, + 0x30, 0x91, 0xeb, 0x7b, 0xb7, 0x9e, 0xdc, 0xd1, 0x7f, 0x0a, 0xd2, 0xeb, 0x5d, 0x6b, 0xdd, 0xa0, + 0x41, 0x14, 0x1e, 0x8b, 0x92, 0x3e, 0xa1, 0x5e, 0x94, 0x2a, 0x5e, 0x50, 0x46, 0xcf, 0xda, 0x34, + 0xe4, 0x24, 0xf2, 0x3f, 0x41, 0x7a, 0x25, 0x9b, 0x14, 0xff, 0x15, 0x24, 0xdf, 0xcd, 0x26, 0x79, + 0x4a, 0x77, 0x99, 0x4e, 0x3d, 0xf5, 0x47, 0x0f, 0xf2, 0xc0, 0x69, 0xb7, 0x69, 0x10, 0xff, 0x21, + 0xc8, 0xcf, 0x29, 0xf2, 0x83, 0x47, 0x0e, 0x53, 0xd1, 0xc1, 0x23, 0x27, 0xd5, 0x8c, 0x4e, 0xe8, + 0xec, 0x51, 0x51, 0xfd, 0x27, 0x77, 0xf4, 0x9f, 0x9c, 0xd4, 0xfa, 0xed, 0x02, 0x0c, 0x3e, 0x74, + 0xa2, 0xc6, 0x3e, 0xf9, 0x04, 0x06, 0x1f, 0xb8, 0x5e, 0x33, 0x2c, 0x15, 0x2e, 0xf7, 0x5f, 0x1f, + 0x9b, 0x2f, 0xde, 0xe4, 0x4d, 0x41, 0x24, 0x43, 0x54, 0x67, 0x7f, 0x72, 0x58, 0x3e, 0x75, 0x74, + 0x58, 0x3e, 0xfd, 0x98, 0x91, 0xbd, 0xe1, 0x1f, 0xb8, 0x11, 0xf6, 0xad, 0xcd, 0xf9, 0xc8, 0x36, + 0x4c, 0x55, 0x5a, 0x2d, 0xff, 0xe9, 0xa6, 0x13, 0x44, 0xae, 0xd3, 0xaa, 0x75, 0x1a, 0x0d, 0x1a, + 0x86, 0xa5, 0xbe, 0xcb, 0x85, 0xeb, 0x23, 0xd5, 0xab, 0x47, 0x87, 0xe5, 0xb2, 0xc3, 0xd0, 0xf5, + 0x36, 0xc7, 0xd7, 0x43, 0x4e, 0xa0, 0x09, 0xca, 0xe2, 0xb7, 0xfe, 0x60, 0x08, 0x8a, 0xcb, 0x7e, + 0x18, 0x2d, 0xb0, 0x1e, 0xb5, 0xe9, 0x0f, 0x3b, 0x34, 0x8c, 0xc8, 0x55, 0x18, 0x62, 0xb0, 0x95, + 0xc5, 0x52, 0xe1, 0x72, 0xe1, 0xfa, 0x68, 0x75, 0xec, 0xe8, 0xb0, 0x3c, 0xbc, 0xef, 0x87, 0x51, + 0xdd, 0x6d, 0xda, 0x02, 0x45, 0x5e, 0x87, 0x91, 0x75, 0xbf, 0x49, 0xd7, 0x9d, 0x03, 0x8a, 0xb5, + 0x18, 0xad, 0x4e, 0x1c, 0x1d, 0x96, 0x47, 0x3d, 0xbf, 0x49, 0xeb, 0x9e, 0x73, 0x40, 0x6d, 0x85, + 0x26, 0x3b, 0x30, 0x60, 0xfb, 0x2d, 0x5a, 0xea, 0x47, 0xb2, 0xea, 0xd1, 0x61, 0x79, 0x20, 0xf0, + 0x5b, 0xf4, 0x67, 0x87, 0xe5, 0x77, 0xf6, 0xdc, 0x68, 0xbf, 0xb3, 0x7b, 0xb3, 0xe1, 0x1f, 0xdc, + 0xda, 0x0b, 0x9c, 0x27, 0x2e, 0x1f, 0x84, 0x4e, 0xeb, 0x56, 0x3c, 0x54, 0xdb, 0xae, 0xe8, 0xf7, + 0xda, 0xb3, 0x30, 0xa2, 0x07, 0x4c, 0x92, 0x8d, 0xf2, 0xc8, 0x43, 0x98, 0xae, 0x34, 0x9b, 0x2e, + 0xe7, 0xd8, 0x0c, 0x5c, 0xaf, 0xe1, 0xb6, 0x9d, 0x56, 0x58, 0x1a, 0xb8, 0xdc, 0x7f, 0x7d, 0x54, + 0x28, 0x45, 0xe1, 0xeb, 0x6d, 0x45, 0xa0, 0x29, 0x25, 0x53, 0x00, 0x79, 0x13, 0x46, 0x16, 0xd7, + 0x6b, 0xac, 0xee, 0x61, 0x69, 0x10, 0x85, 0xcd, 0x1e, 0x1d, 0x96, 0xa7, 0x9a, 0x5e, 0x88, 0x4d, + 0xd3, 0x05, 0x28, 0x42, 0xf2, 0x0e, 0x8c, 0x6f, 0x76, 0x76, 0x5b, 0x6e, 0x63, 0x6b, 0xb5, 0xf6, + 0x80, 0x3e, 0x2b, 0x0d, 0x5d, 0x2e, 0x5c, 0x1f, 0xaf, 0x92, 0xa3, 0xc3, 0xf2, 0x64, 0x1b, 0xe1, + 0xf5, 0xa8, 0x15, 0xd6, 0x1f, 0xd3, 0x67, 0xb6, 0x41, 0x17, 0xf3, 0xd5, 0x6a, 0xcb, 0x8c, 0x6f, + 0x38, 0xc5, 0x17, 0x86, 0xfb, 0x3a, 0x1f, 0xa7, 0x23, 0xb7, 0x00, 0x6c, 0x7a, 0xe0, 0x47, 0xb4, + 0xd2, 0x6c, 0x06, 0xa5, 0x11, 0xd4, 0xed, 0xe9, 0xa3, 0xc3, 0xf2, 0x58, 0x80, 0xd0, 0xba, 0xd3, + 0x6c, 0x06, 0xb6, 0x46, 0x42, 0x16, 0x60, 0xc4, 0xf6, 0xb9, 0x82, 0x4b, 0xa3, 0x97, 0x0b, 0xd7, + 0xc7, 0xe6, 0x4f, 0x8b, 0x61, 0x28, 0xc1, 0xd5, 0xb3, 0x47, 0x87, 0x65, 0x12, 0x88, 0x5f, 0x7a, + 0x2b, 0x25, 0x05, 0x29, 0xc3, 0xf0, 0xba, 0xbf, 0xe0, 0x34, 0xf6, 0x69, 0x09, 0x70, 0xec, 0x0d, + 0x1e, 0x1d, 0x96, 0x0b, 0xdf, 0xb5, 0x25, 0x94, 0x3c, 0x81, 0xb1, 0xb8, 0xa3, 0xc2, 0xd2, 0x18, + 0xaa, 0x6f, 0xeb, 0xe8, 0xb0, 0x7c, 0x36, 0x44, 0x70, 0x9d, 0x75, 0xbd, 0xa6, 0xc1, 0x17, 0x18, + 0x05, 0x7a, 0x41, 0xe4, 0x6b, 0x98, 0x89, 0x7f, 0x56, 0xc2, 0x90, 0x06, 0x4c, 0xc6, 0xca, 0x62, + 0x69, 0x02, 0x35, 0xf3, 0xea, 0xd1, 0x61, 0xd9, 0xd2, 0x6a, 0x50, 0x77, 0x24, 0x49, 0xdd, 0x6d, + 0x6a, 0x2d, 0xcd, 0x16, 0x72, 0x7f, 0x60, 0x64, 0xbc, 0x38, 0x61, 0x5f, 0xdc, 0xf6, 0xc2, 0xc8, + 0xd9, 0x6d, 0xd1, 0x4c, 0x22, 0xeb, 0x2f, 0x0a, 0x40, 0x36, 0xda, 0xd4, 0xab, 0xd5, 0x96, 0xd9, + 0xf7, 0x24, 0x3f, 0xa7, 0x37, 0x60, 0x94, 0x77, 0x1c, 0xeb, 0xdd, 0x3e, 0xec, 0xdd, 0xc9, 0xa3, + 0xc3, 0x32, 0x88, 0xde, 0x65, 0x3d, 0x1b, 0x13, 0x90, 0x6b, 0xd0, 0xbf, 0xb5, 0xb5, 0x8a, 0xdf, + 0x4a, 0x7f, 0x75, 0xea, 0xe8, 0xb0, 0xdc, 0x1f, 0x45, 0xad, 0x9f, 0x1d, 0x96, 0x47, 0x16, 0x3b, + 0x01, 0xaa, 0xc5, 0x66, 0x78, 0x72, 0x0d, 0x86, 0x17, 0x5a, 0x9d, 0x30, 0xa2, 0x41, 0x69, 0x20, + 0xfe, 0x48, 0x1b, 0x1c, 0x64, 0x4b, 0x1c, 0xf9, 0x0e, 0x0c, 0x6c, 0x87, 0x34, 0x28, 0x0d, 0x62, + 0x7f, 0x4f, 0x88, 0xfe, 0x66, 0xa0, 0x9d, 0xf9, 0xea, 0x08, 0xfb, 0x12, 0x3b, 0x21, 0x0d, 0x6c, + 0x24, 0x22, 0x37, 0x61, 0x90, 0x77, 0xda, 0x10, 0x4e, 0x52, 0x13, 0x6a, 0x74, 0xb4, 0xe8, 0xce, + 0x3b, 0xd5, 0xd1, 0xa3, 0xc3, 0xf2, 0x20, 0x76, 0x9e, 0xcd, 0xc9, 0xee, 0x0f, 0x8c, 0x14, 0x8a, + 0x7d, 0xf6, 0x08, 0xe3, 0x65, 0x9f, 0x85, 0xf5, 0x1d, 0x18, 0xd3, 0x9a, 0x4f, 0x2e, 0xc0, 0x00, + 0xfb, 0x1f, 0x27, 0x91, 0x71, 0x5e, 0x18, 0x5b, 0x38, 0x6c, 0x84, 0x5a, 0xff, 0x64, 0x0a, 0x8a, + 0x8c, 0xd3, 0x98, 0x79, 0x6e, 0xea, 0xaa, 0xe2, 0x7c, 0x45, 0x53, 0x55, 0xa5, 0x82, 0xae, 0xac, + 0xeb, 0xa0, 0x4a, 0x17, 0x93, 0xd0, 0xf8, 0xd1, 0x61, 0x79, 0xa4, 0x23, 0x60, 0x71, 0xdd, 0x48, + 0x0d, 0x86, 0x97, 0xbe, 0x69, 0xbb, 0x01, 0x0d, 0x51, 0xb5, 0x63, 0xf3, 0x73, 0x37, 0xf9, 0x72, + 0x79, 0x53, 0x2e, 0x97, 0x37, 0xb7, 0xe4, 0x72, 0x59, 0xbd, 0x28, 0x26, 0xe3, 0x33, 0x94, 0xb3, + 0xc4, 0xe3, 0xe3, 0x37, 0xfe, 0xb4, 0x5c, 0xb0, 0xa5, 0x24, 0xf2, 0x06, 0x0c, 0xdd, 0xf5, 0x83, + 0x03, 0x27, 0x12, 0x7d, 0x30, 0x7d, 0x74, 0x58, 0x2e, 0x3e, 0x42, 0x88, 0x36, 0xa4, 0x04, 0x0d, + 0xb9, 0x0b, 0x93, 0xb6, 0xdf, 0x89, 0xe8, 0x96, 0x2f, 0x7b, 0x6e, 0x10, 0xb9, 0x2e, 0x1d, 0x1d, + 0x96, 0xe7, 0x02, 0x86, 0xa9, 0x47, 0x7e, 0x5d, 0x74, 0xa1, 0xc6, 0x9f, 0xe0, 0x22, 0x4b, 0x30, + 0x59, 0xc1, 0xd9, 0x5b, 0x68, 0x8d, 0xf7, 0xd7, 0x68, 0xf5, 0xe2, 0xd1, 0x61, 0xf9, 0x9c, 0x83, + 0x98, 0x7a, 0x20, 0x50, 0xba, 0x18, 0x93, 0x89, 0xac, 0xc3, 0x99, 0x07, 0x9d, 0x5d, 0x1a, 0x78, + 0x34, 0xa2, 0xa1, 0xac, 0xd1, 0x30, 0xd6, 0xe8, 0xf2, 0xd1, 0x61, 0xf9, 0xc2, 0x63, 0x85, 0xcc, + 0xa8, 0x53, 0x9a, 0x95, 0x50, 0x38, 0x2d, 0x2a, 0xba, 0xe8, 0x44, 0xce, 0xae, 0x13, 0x52, 0x9c, + 0x94, 0xc6, 0xe6, 0xcf, 0x72, 0x15, 0xdf, 0x4c, 0x60, 0xab, 0x57, 0x85, 0x96, 0xcf, 0xab, 0xb6, + 0x37, 0x05, 0x4a, 0x2b, 0x28, 0x29, 0x93, 0xcd, 0xcd, 0x6a, 0xdd, 0x19, 0xc5, 0xda, 0xe2, 0xdc, + 0xac, 0xd6, 0x1d, 0x7d, 0xd6, 0x52, 0x2b, 0xd0, 0x2a, 0x0c, 0x6e, 0xb3, 0xd5, 0x19, 0xe7, 0xac, + 0xc9, 0xf9, 0x2b, 0xa2, 0x46, 0xc9, 0xf1, 0x77, 0x93, 0xfd, 0x40, 0x42, 0xfc, 0xf2, 0x4e, 0xe3, + 0x8a, 0xae, 0xaf, 0xc5, 0x88, 0x23, 0x9f, 0x01, 0x88, 0x5a, 0x55, 0xda, 0xed, 0xd2, 0x18, 0x36, + 0xf2, 0x8c, 0xd9, 0xc8, 0x4a, 0xbb, 0x5d, 0xbd, 0x24, 0xda, 0x77, 0x56, 0xb5, 0xcf, 0x69, 0xb7, + 0x35, 0x69, 0x9a, 0x10, 0xf2, 0x09, 0x8c, 0xe3, 0x94, 0x26, 0x7b, 0x74, 0x1c, 0x7b, 0xf4, 0xfc, + 0xd1, 0x61, 0x79, 0x16, 0x67, 0xab, 0x8c, 0xfe, 0x34, 0x18, 0xc8, 0x2f, 0xc3, 0x8c, 0x10, 0xf7, + 0xd0, 0xf5, 0x9a, 0xfe, 0xd3, 0x70, 0x91, 0x86, 0x8f, 0x23, 0xbf, 0x8d, 0xd3, 0xdf, 0xd8, 0xfc, + 0x05, 0xb3, 0x7a, 0x26, 0x4d, 0xf5, 0x86, 0xa8, 0xa9, 0xa5, 0x6a, 0xfa, 0x94, 0x13, 0xd4, 0x9b, + 0x9c, 0x42, 0x9f, 0x20, 0x33, 0x45, 0x90, 0x15, 0x38, 0xbd, 0x1d, 0x52, 0xa3, 0x0d, 0x93, 0xb8, + 0x3e, 0x94, 0x59, 0x0f, 0x77, 0x42, 0x5a, 0xcf, 0x6b, 0x47, 0x92, 0x8f, 0xd8, 0x40, 0x16, 0x03, + 0xbf, 0x9d, 0x18, 0xe3, 0xa7, 0x51, 0x23, 0xd6, 0xd1, 0x61, 0xf9, 0x52, 0x33, 0xf0, 0xdb, 0xf5, + 0xfc, 0x81, 0x9e, 0xc1, 0x4d, 0xbe, 0x0f, 0x67, 0x17, 0x7c, 0xcf, 0xa3, 0x0d, 0x36, 0x83, 0x2e, + 0xba, 0xce, 0x9e, 0xe7, 0x87, 0x91, 0xdb, 0x58, 0x59, 0x2c, 0x15, 0xe3, 0xe5, 0xa1, 0xa1, 0x28, + 0xea, 0x4d, 0x45, 0x62, 0x2e, 0x0f, 0x39, 0x52, 0xc8, 0x57, 0x30, 0x21, 0xca, 0xa2, 0x01, 0x0e, + 0xcd, 0x33, 0xdd, 0x07, 0x9a, 0x22, 0xe6, 0x0b, 0x7d, 0x20, 0x7f, 0xf2, 0xad, 0x93, 0x29, 0x8b, + 0x7c, 0x0d, 0x63, 0x6b, 0x77, 0x2b, 0x36, 0x0d, 0xdb, 0xbe, 0x17, 0xd2, 0x12, 0xc1, 0x1e, 0xbd, + 0x24, 0x44, 0xaf, 0xdd, 0xad, 0x54, 0x3a, 0xd1, 0x3e, 0xf5, 0x22, 0xb7, 0xe1, 0x44, 0x54, 0x52, + 0x55, 0xe7, 0xd8, 0xc8, 0x3b, 0x78, 0xe4, 0xd4, 0x03, 0x01, 0xd1, 0x5a, 0xa1, 0x8b, 0x23, 0x73, + 0x30, 0x52, 0xab, 0x2d, 0xaf, 0xfa, 0x7b, 0xae, 0x57, 0x9a, 0x62, 0xca, 0xb0, 0xd5, 0x6f, 0xf2, + 0x08, 0x66, 0x34, 0xdb, 0xa0, 0xce, 0xfe, 0xa7, 0x07, 0xd4, 0x8b, 0x4a, 0xd3, 0x58, 0x87, 0xef, + 0x2a, 0xe3, 0xe6, 0xa6, 0x6e, 0x42, 0x3c, 0xb9, 0x73, 0xb3, 0x12, 0xff, 0xac, 0x49, 0xa6, 0x6a, + 0x5f, 0xa9, 0x60, 0x4f, 0x3b, 0x19, 0x18, 0xb2, 0x05, 0xc3, 0x9b, 0x9d, 0xa0, 0xed, 0x87, 0xb4, + 0x34, 0x83, 0x8a, 0xbb, 0xda, 0xed, 0x0b, 0x15, 0xa4, 0xd5, 0x19, 0x36, 0x45, 0xb7, 0xf9, 0x0f, + 0xad, 0x75, 0x52, 0x14, 0xf9, 0x14, 0xc6, 0x6b, 0xb5, 0xe5, 0x78, 0x41, 0x39, 0x8b, 0x0b, 0xca, + 0x85, 0xa3, 0xc3, 0x72, 0x89, 0x6d, 0xa9, 0xe2, 0x45, 0x45, 0xff, 0xaa, 0x74, 0x0e, 0x26, 0x61, + 0x6b, 0xb5, 0x16, 0x4b, 0x98, 0x8d, 0x25, 0xb0, 0xcd, 0x5c, 0xb6, 0x04, 0x9d, 0x83, 0xfc, 0xcb, + 0x02, 0x5c, 0xd6, 0x45, 0x66, 0x29, 0xa6, 0x74, 0xee, 0x79, 0xb4, 0x39, 0x7f, 0x74, 0x58, 0xbe, + 0x69, 0xb6, 0xa3, 0x9e, 0xd9, 0x59, 0x5a, 0xdd, 0x7a, 0x56, 0x05, 0xeb, 0xab, 0x37, 0x20, 0xb3, + 0xbe, 0x73, 0xcf, 0x5d, 0x5f, 0x53, 0x6b, 0xbd, 0xeb, 0xdb, 0xab, 0x2a, 0xd6, 0xe7, 0x30, 0xaa, + 0x26, 0x6d, 0x32, 0x0c, 0xfd, 0x95, 0x56, 0xab, 0x78, 0x8a, 0xfd, 0x51, 0xab, 0x2d, 0x17, 0x0b, + 0x64, 0x12, 0x20, 0x5e, 0xa9, 0x8a, 0x7d, 0x64, 0x1c, 0x46, 0xe4, 0x4a, 0x52, 0xec, 0x47, 0xfa, + 0x76, 0xbb, 0x38, 0x40, 0x08, 0x4c, 0x9a, 0xf3, 0x59, 0x71, 0xd0, 0xfa, 0xcd, 0x02, 0x8c, 0xaa, + 0xef, 0x90, 0x9c, 0x86, 0xb1, 0xed, 0xf5, 0xda, 0xe6, 0xd2, 0xc2, 0xca, 0xdd, 0x95, 0xa5, 0xc5, + 0xe2, 0x29, 0x72, 0x11, 0xce, 0x6d, 0xd5, 0x96, 0xeb, 0x8b, 0xd5, 0xfa, 0xea, 0xc6, 0x42, 0x65, + 0xb5, 0xbe, 0x69, 0x6f, 0x7c, 0xfe, 0x45, 0x7d, 0x6b, 0x7b, 0x7d, 0x7d, 0x69, 0xb5, 0x58, 0x20, + 0x25, 0x98, 0x66, 0xe8, 0x07, 0xdb, 0xd5, 0x25, 0x9d, 0xa0, 0xd8, 0x47, 0xae, 0xc0, 0xc5, 0x2c, + 0x4c, 0x7d, 0x79, 0xa9, 0xb2, 0xb8, 0xba, 0x54, 0xab, 0x15, 0xfb, 0xc9, 0x2c, 0x4c, 0x31, 0x92, + 0xca, 0xe6, 0xa6, 0xc1, 0x3b, 0x60, 0xb5, 0x60, 0x4c, 0xfb, 0x00, 0xc8, 0x05, 0x28, 0x2d, 0x2c, + 0xd9, 0x5b, 0xf5, 0xcd, 0x6d, 0x7b, 0x73, 0xa3, 0xb6, 0x54, 0x37, 0x6b, 0x98, 0xc4, 0xae, 0x6e, + 0xdc, 0x5b, 0x59, 0xaf, 0x33, 0x50, 0xad, 0x58, 0x60, 0xd5, 0x30, 0xb0, 0xb5, 0x95, 0xf5, 0x7b, + 0xab, 0x4b, 0xf5, 0xed, 0xda, 0x92, 0x20, 0xe9, 0xb3, 0x7e, 0xb5, 0x2f, 0xb5, 0xa4, 0x93, 0x79, + 0x18, 0xab, 0x71, 0x7f, 0x05, 0x4e, 0x73, 0xdc, 0x40, 0x64, 0x7b, 0xb4, 0x71, 0xe1, 0xc6, 0xe0, + 0x33, 0x98, 0x4e, 0xc4, 0x76, 0x69, 0x9b, 0xec, 0x6b, 0x6e, 0xf8, 0x2d, 0x7d, 0x97, 0xd6, 0x16, + 0x30, 0x5b, 0x61, 0xc9, 0xbc, 0xb6, 0x9f, 0xe3, 0xd6, 0x22, 0x5a, 0x24, 0x72, 0x3f, 0xa7, 0xaf, + 0xed, 0x6a, 0x67, 0x37, 0x1f, 0x77, 0xa9, 0xd8, 0x86, 0x21, 0x4f, 0xc6, 0x5e, 0x42, 0xd1, 0x91, + 0xd7, 0xe5, 0x4e, 0x97, 0x5b, 0x77, 0xb8, 0xd8, 0x27, 0xec, 0x12, 0xb1, 0xc9, 0xb5, 0x3a, 0x39, + 0x0b, 0x2b, 0xf9, 0x20, 0x39, 0x66, 0x84, 0x32, 0x50, 0x58, 0x62, 0xfd, 0xb4, 0x13, 0xa4, 0xa4, + 0x0c, 0x83, 0x7c, 0xc6, 0xe5, 0xfa, 0xc0, 0xbd, 0x75, 0x8b, 0x01, 0x6c, 0x0e, 0xb7, 0xfe, 0xb0, + 0x5f, 0xdf, 0x64, 0xb0, 0xbd, 0xb4, 0xa6, 0x6f, 0xdc, 0x4b, 0xa3, 0x9e, 0x11, 0xca, 0x4c, 0x41, + 0xfe, 0x95, 0xa0, 0x29, 0xd8, 0x1f, 0x9b, 0x82, 0xe2, 0x53, 0xe3, 0xa6, 0x60, 0x4c, 0xc2, 0x7a, + 0x51, 0x6c, 0xdb, 0x50, 0xea, 0x40, 0xdc, 0x8b, 0x62, 0xab, 0x27, 0x7a, 0x51, 0x23, 0x22, 0xef, + 0x03, 0x54, 0x1e, 0xd6, 0xd0, 0xe6, 0xb1, 0xd7, 0xc5, 0xd6, 0x15, 0x17, 0x19, 0xe7, 0x69, 0x28, + 0x4c, 0xaa, 0x40, 0xb7, 0x19, 0x35, 0x6a, 0x52, 0x85, 0x89, 0xca, 0x8f, 0x3a, 0x01, 0x5d, 0x69, + 0xb2, 0x75, 0x2a, 0xe2, 0xc6, 0xf1, 0x28, 0x9f, 0x48, 0x1d, 0x86, 0xa8, 0xbb, 0x02, 0xa3, 0x09, + 0x30, 0x59, 0xc8, 0x06, 0x9c, 0xb9, 0xb7, 0xb0, 0x29, 0xc6, 0x55, 0xa5, 0xd1, 0xf0, 0x3b, 0x5e, + 0x24, 0xf6, 0xab, 0x57, 0x8e, 0x0e, 0xcb, 0x17, 0xf7, 0x1a, 0xed, 0xba, 0x1c, 0x83, 0x0e, 0x47, + 0xeb, 0x1b, 0xd6, 0x14, 0x2f, 0xb9, 0x0a, 0xfd, 0xdb, 0xf6, 0x8a, 0xb0, 0x9c, 0xcf, 0x1c, 0x1d, + 0x96, 0x27, 0x3a, 0x81, 0xab, 0xb1, 0x30, 0x2c, 0x79, 0x0f, 0x60, 0xcb, 0x09, 0xf6, 0x68, 0xb4, + 0xe9, 0x07, 0x11, 0x6e, 0x38, 0x27, 0xaa, 0xe7, 0x8e, 0x0e, 0xcb, 0x33, 0x11, 0x42, 0xeb, 0x6c, + 0xfa, 0xd3, 0x1b, 0x1d, 0x13, 0xdf, 0x1f, 0x18, 0xe9, 0x2b, 0xf6, 0xdb, 0xa3, 0x35, 0x1a, 0x86, + 0xdc, 0x3e, 0x6c, 0xc1, 0xe4, 0x3d, 0x1a, 0xb1, 0x81, 0x2b, 0xed, 0x9d, 0xee, 0xdd, 0xfa, 0x21, + 0x8c, 0x3d, 0x74, 0xa3, 0xfd, 0x1a, 0x6d, 0x04, 0x34, 0x92, 0xbe, 0x1e, 0x54, 0xf9, 0x53, 0x37, + 0xda, 0xaf, 0x87, 0x1c, 0xae, 0xaf, 0xeb, 0x1a, 0xb9, 0xb5, 0x04, 0xa7, 0x45, 0x69, 0xca, 0xbc, + 0x9a, 0x37, 0x05, 0x16, 0x50, 0x20, 0x76, 0xbb, 0x2e, 0xd0, 0x14, 0xf3, 0xaf, 0xfa, 0x60, 0x66, + 0x61, 0xdf, 0xf1, 0xf6, 0xe8, 0xa6, 0x13, 0x86, 0x4f, 0xfd, 0xa0, 0xa9, 0x55, 0x1e, 0x6d, 0xcb, + 0x54, 0xe5, 0xd1, 0x98, 0x9c, 0x87, 0xb1, 0x8d, 0x56, 0x53, 0xf2, 0x08, 0xbb, 0x17, 0xcb, 0xf2, + 0x5b, 0xcd, 0x7a, 0x5b, 0xca, 0xd2, 0x89, 0x18, 0xcf, 0x3a, 0x7d, 0xaa, 0x78, 0xfa, 0x63, 0x1e, + 0x8f, 0x3e, 0xd5, 0x78, 0x34, 0x22, 0xb2, 0x04, 0x67, 0x6a, 0xb4, 0xe1, 0x7b, 0xcd, 0xbb, 0x4e, + 0x23, 0xf2, 0x83, 0x2d, 0xff, 0x31, 0xf5, 0xc4, 0x80, 0x46, 0xc3, 0x20, 0x44, 0x64, 0xfd, 0x11, + 0x62, 0xeb, 0x11, 0x43, 0xdb, 0x69, 0x0e, 0xb2, 0x01, 0x23, 0x0f, 0x85, 0xc7, 0x50, 0x18, 0xcb, + 0xd7, 0x6e, 0x2a, 0x17, 0xe2, 0x42, 0x40, 0x71, 0x14, 0x3a, 0x2d, 0x65, 0xee, 0xab, 0x7d, 0x16, + 0x4e, 0x65, 0x92, 0xd2, 0x56, 0x42, 0xac, 0x6d, 0x98, 0xd8, 0x6c, 0x75, 0xf6, 0x5c, 0x8f, 0x4d, + 0x3a, 0x35, 0xfa, 0x43, 0xb2, 0x08, 0x10, 0x03, 0x84, 0x1f, 0x70, 0x4a, 0x98, 0xd8, 0x31, 0x62, + 0xe7, 0x4d, 0xf1, 0xe5, 0x22, 0x04, 0x2d, 0x22, 0x5b, 0xe3, 0xb3, 0xfe, 0x4f, 0x3f, 0x10, 0xd1, + 0x01, 0xb8, 0x08, 0xd6, 0x68, 0xc4, 0x96, 0xa7, 0xb3, 0xd0, 0xa7, 0xdc, 0x75, 0x43, 0x47, 0x87, + 0xe5, 0x3e, 0xb7, 0x69, 0xf7, 0xad, 0x2c, 0x92, 0xb7, 0x60, 0x10, 0xc9, 0x50, 0xff, 0x93, 0xaa, + 0x3c, 0x5d, 0x02, 0x9f, 0x7c, 0x70, 0xf5, 0xb5, 0x39, 0x31, 0x79, 0x1b, 0x46, 0x17, 0x69, 0x8b, + 0xee, 0x39, 0x91, 0x2f, 0xa7, 0x13, 0xee, 0x00, 0x93, 0x40, 0x6d, 0xcc, 0xc5, 0x94, 0xcc, 0x1c, + 0xb6, 0xa9, 0x13, 0xfa, 0x9e, 0x6e, 0x0e, 0x07, 0x08, 0xd1, 0xcd, 0x61, 0x4e, 0x43, 0xfe, 0x7e, + 0x01, 0xc6, 0x2a, 0x9e, 0x27, 0x1c, 0x4b, 0xa1, 0xd0, 0xfa, 0xcc, 0x4d, 0xe5, 0x89, 0x5d, 0x75, + 0x76, 0x69, 0x6b, 0xc7, 0x69, 0x75, 0x68, 0x58, 0xfd, 0x9a, 0x59, 0x28, 0xff, 0xe9, 0xb0, 0xfc, + 0xc1, 0x09, 0x5c, 0x45, 0xb1, 0x4f, 0x77, 0x2b, 0x70, 0xdc, 0x28, 0x64, 0x5f, 0xad, 0x13, 0x17, + 0xa8, 0x7f, 0x37, 0x5a, 0x3d, 0xe2, 0xb5, 0x61, 0xa8, 0xd7, 0xda, 0x40, 0x0e, 0xe0, 0x74, 0x25, + 0x0c, 0x3b, 0x07, 0xb4, 0x16, 0x39, 0x41, 0xb4, 0xe5, 0x1e, 0x50, 0x9c, 0x90, 0xba, 0x3b, 0x17, + 0x5e, 0xfb, 0xc9, 0x61, 0xb9, 0xc0, 0x8c, 0x22, 0x07, 0x59, 0xd9, 0xbe, 0x27, 0x88, 0xea, 0x91, + 0xab, 0x2f, 0x6f, 0xe8, 0x66, 0x48, 0xca, 0xb6, 0xae, 0xaa, 0x0d, 0xc9, 0xca, 0x62, 0x5e, 0x8f, + 0x5b, 0x0b, 0x70, 0xe1, 0x1e, 0x8d, 0x6c, 0x1a, 0xd2, 0x48, 0x7e, 0x23, 0x38, 0xc2, 0x63, 0xe7, + 0xee, 0x30, 0xfe, 0x56, 0xcc, 0xd8, 0xfd, 0xfc, 0xbb, 0x90, 0x18, 0xeb, 0xaf, 0x15, 0xa0, 0xbc, + 0x10, 0x50, 0x6e, 0x4f, 0xe4, 0x08, 0xea, 0x3e, 0x77, 0x5d, 0x80, 0x81, 0xad, 0x67, 0x6d, 0xe9, + 0x95, 0x41, 0x2c, 0xeb, 0x14, 0x1b, 0xa1, 0xc7, 0x74, 0x72, 0x59, 0x8f, 0x60, 0xc6, 0xa6, 0x1e, + 0x7d, 0xea, 0xec, 0xb6, 0xa8, 0xe1, 0x27, 0x2a, 0xc3, 0x20, 0xff, 0xd0, 0x53, 0x4d, 0xe0, 0xf0, + 0x93, 0xf9, 0xdc, 0xac, 0x09, 0x18, 0xdb, 0x74, 0xbd, 0x3d, 0x21, 0xdd, 0xfa, 0xb3, 0x01, 0x18, + 0xe7, 0xbf, 0x85, 0x89, 0x94, 0x58, 0x2e, 0x0b, 0xc7, 0x59, 0x2e, 0xdf, 0x85, 0x09, 0xb6, 0xde, + 0xd0, 0x60, 0x87, 0x06, 0x6c, 0xfe, 0x17, 0x9a, 0x40, 0x73, 0x2f, 0x44, 0x44, 0xfd, 0x09, 0xc7, + 0xd8, 0x26, 0x21, 0x59, 0x85, 0x49, 0x0e, 0xb8, 0x4b, 0x9d, 0xa8, 0x13, 0x7b, 0xac, 0x4e, 0x0b, + 0x9b, 0x48, 0x82, 0xf9, 0xd0, 0x14, 0xb2, 0x1e, 0x09, 0xa0, 0x9d, 0xe0, 0x25, 0x9f, 0xc0, 0xe9, + 0xcd, 0xc0, 0xff, 0xe6, 0x99, 0xb6, 0x41, 0xe0, 0x5f, 0x27, 0xb7, 0x9e, 0x18, 0xaa, 0xae, 0x6f, + 0x13, 0x92, 0xd4, 0xe4, 0x75, 0x18, 0x59, 0x09, 0xab, 0x7e, 0xe0, 0x7a, 0x7b, 0xf8, 0x8d, 0x8e, + 0x70, 0x47, 0xbf, 0x1b, 0xd6, 0x77, 0x11, 0x68, 0x2b, 0x74, 0xc2, 0x25, 0x3d, 0xdc, 0xdb, 0x25, + 0x7d, 0x1b, 0x60, 0xd5, 0x77, 0x9a, 0x95, 0x56, 0x6b, 0xa1, 0x12, 0xe2, 0x4a, 0x2c, 0xd6, 0xa3, + 0x96, 0xef, 0x34, 0xeb, 0x4e, 0xab, 0x55, 0x6f, 0x38, 0xa1, 0xad, 0xd1, 0x90, 0x2f, 0xe1, 0x5c, + 0xe8, 0xee, 0x79, 0xd8, 0xb8, 0xba, 0xd3, 0xda, 0xf3, 0x03, 0x37, 0xda, 0x3f, 0xa8, 0x87, 0x1d, + 0x37, 0xe2, 0xfe, 0xa0, 0xc9, 0xf9, 0x4b, 0x62, 0x92, 0xab, 0x49, 0xba, 0x8a, 0x24, 0xab, 0x31, + 0x2a, 0x7b, 0x36, 0xcc, 0x46, 0x90, 0x87, 0x30, 0xb1, 0xea, 0x36, 0xa8, 0x17, 0x52, 0x74, 0xf0, + 0x3d, 0x43, 0x6f, 0x51, 0xf7, 0x8f, 0x99, 0x29, 0x71, 0xa2, 0xa5, 0x33, 0xe1, 0xa7, 0x6b, 0xca, + 0xb9, 0x3f, 0x30, 0x32, 0x54, 0x1c, 0xb6, 0x4f, 0x0b, 0xe0, 0x43, 0x27, 0xf0, 0x5c, 0x6f, 0x2f, + 0xb4, 0xfe, 0x16, 0x81, 0x11, 0xd5, 0x4f, 0x37, 0x75, 0x4b, 0x45, 0x2c, 0xcd, 0x38, 0x64, 0x63, + 0x3f, 0x9c, 0xad, 0x51, 0x90, 0x73, 0x68, 0xbb, 0x88, 0x4d, 0xc1, 0x30, 0xfb, 0x84, 0x9c, 0x76, + 0xdb, 0x66, 0x30, 0x36, 0x35, 0x2c, 0x56, 0x71, 0xd0, 0x8c, 0xf0, 0xa9, 0xa1, 0xb9, 0x6b, 0xf7, + 0x2d, 0x56, 0xd9, 0x37, 0xb9, 0xb1, 0xb2, 0xb8, 0x80, 0xfd, 0x3f, 0xc2, 0xbf, 0x49, 0xdf, 0x6d, + 0x36, 0x6c, 0x84, 0x32, 0x6c, 0xad, 0xb2, 0xb6, 0x2a, 0xfa, 0x18, 0xb1, 0xa1, 0x73, 0xd0, 0xb2, + 0x11, 0xca, 0x76, 0xbb, 0xdc, 0xa5, 0xb2, 0xe0, 0x7b, 0x51, 0xe0, 0xb7, 0x42, 0xdc, 0xc2, 0x8d, + 0xf0, 0x31, 0x28, 0x7c, 0x31, 0x0d, 0x81, 0xb2, 0x13, 0xa4, 0xe4, 0x21, 0xcc, 0x56, 0x9a, 0x4f, + 0x1c, 0xaf, 0x41, 0x9b, 0x1c, 0xf3, 0xd0, 0x0f, 0x1e, 0x3f, 0x6a, 0xf9, 0x4f, 0x43, 0x1c, 0x24, + 0x23, 0xc2, 0x75, 0x29, 0x48, 0xa4, 0x6b, 0xe7, 0xa9, 0x24, 0xb2, 0xf3, 0xb8, 0xd9, 0x3c, 0xb0, + 0xd0, 0xf2, 0x3b, 0x4d, 0x31, 0x74, 0x70, 0x1e, 0x68, 0x30, 0x80, 0xcd, 0xe1, 0x4c, 0x4b, 0xcb, + 0xb5, 0x35, 0x1c, 0x18, 0x42, 0x4b, 0xfb, 0xe1, 0x81, 0xcd, 0x60, 0xe4, 0x1a, 0x0c, 0xcb, 0x8d, + 0x3b, 0x3f, 0xc9, 0x40, 0x0f, 0xba, 0xdc, 0xb0, 0x4b, 0x1c, 0xfb, 0x8e, 0x6d, 0xda, 0xf0, 0x9f, + 0xd0, 0xe0, 0xd9, 0x82, 0xdf, 0xa4, 0xd2, 0xad, 0x25, 0xdc, 0x36, 0x1c, 0x51, 0x6f, 0x30, 0x8c, + 0x6d, 0x12, 0xb2, 0x02, 0xf8, 0xc2, 0x1d, 0x96, 0x4e, 0xc7, 0x05, 0xf0, 0x85, 0x3d, 0xb4, 0x25, + 0x8e, 0x2c, 0xc2, 0x99, 0x4a, 0x27, 0xf2, 0x0f, 0x9c, 0xc8, 0x6d, 0x6c, 0xb7, 0xf7, 0x02, 0x87, + 0x15, 0x52, 0x44, 0x06, 0x34, 0x64, 0x1c, 0x89, 0xac, 0x77, 0x04, 0xd6, 0x4e, 0x33, 0x90, 0x77, + 0x60, 0x7c, 0x25, 0xe4, 0xae, 0x4b, 0x27, 0xa4, 0x4d, 0xf4, 0x3f, 0x89, 0x5a, 0xba, 0x61, 0x1d, + 0x1d, 0x99, 0x75, 0x66, 0xfa, 0x34, 0x6d, 0x83, 0x8e, 0x58, 0x30, 0x54, 0x09, 0x43, 0x37, 0x8c, + 0xd0, 0xad, 0x34, 0x52, 0x85, 0xa3, 0xc3, 0xf2, 0x90, 0x83, 0x10, 0x5b, 0x60, 0xc8, 0x43, 0x18, + 0x5b, 0xa4, 0x6c, 0xe7, 0xbc, 0x15, 0x74, 0xc2, 0x08, 0x9d, 0x44, 0x63, 0xf3, 0xe7, 0xc4, 0x6c, + 0xa4, 0x61, 0xc4, 0x58, 0xe6, 0x5b, 0xd4, 0x26, 0xc2, 0xeb, 0x11, 0x43, 0xe8, 0x4b, 0xad, 0x46, + 0xcf, 0xcc, 0x02, 0xc1, 0xb3, 0xec, 0x36, 0xd9, 0xfc, 0x32, 0x8d, 0x75, 0x40, 0xb3, 0x40, 0x4c, + 0x68, 0xf5, 0x7d, 0xc4, 0xe8, 0x66, 0x81, 0xc1, 0x42, 0x1a, 0x29, 0x6f, 0xf8, 0x8c, 0xe1, 0xf1, + 0x34, 0x91, 0xb2, 0x8a, 0x27, 0xf4, 0x95, 0x7f, 0x08, 0x63, 0x0b, 0x9d, 0x30, 0xf2, 0x0f, 0xb6, + 0xf6, 0xe9, 0x01, 0x45, 0x47, 0x92, 0x30, 0x7e, 0x1a, 0x08, 0xae, 0x47, 0x0c, 0xae, 0x37, 0x53, + 0x23, 0x27, 0x9f, 0x01, 0x91, 0x56, 0xcc, 0x3d, 0x36, 0x3e, 0x3c, 0x36, 0x96, 0xd1, 0x97, 0x34, + 0xc2, 0x4d, 0x17, 0x69, 0xfc, 0xd4, 0xf7, 0x14, 0x5a, 0xf7, 0x67, 0xa6, 0x99, 0x59, 0x85, 0x78, + 0x15, 0xef, 0x05, 0x4e, 0x7b, 0xbf, 0x54, 0x8a, 0x4d, 0x03, 0xd1, 0xa8, 0x3d, 0x06, 0x37, 0xb6, + 0x38, 0x31, 0x39, 0xa9, 0x01, 0xf0, 0x9f, 0xab, 0xac, 0xe3, 0xb9, 0xf7, 0xa9, 0x64, 0xe8, 0x8b, + 0x21, 0xa4, 0xae, 0xd0, 0xdc, 0x11, 0x62, 0x5b, 0xae, 0xd1, 0x9b, 0x9a, 0x18, 0xf2, 0x18, 0x8a, + 0xfc, 0xd7, 0x9a, 0xef, 0xb9, 0x11, 0x5f, 0x2f, 0xe6, 0x0c, 0x57, 0x65, 0x12, 0x2d, 0x0b, 0x40, + 0x17, 0xb1, 0x28, 0xe0, 0x40, 0x61, 0xb5, 0x62, 0x52, 0x82, 0xc9, 0x26, 0x8c, 0x6d, 0x06, 0x7e, + 0xb3, 0xd3, 0x88, 0x70, 0x97, 0x71, 0x1e, 0x27, 0x7e, 0x22, 0xca, 0xd1, 0x30, 0x5c, 0x27, 0x6d, + 0x0e, 0xa8, 0xb3, 0x75, 0x41, 0xd7, 0x89, 0x46, 0x48, 0xaa, 0x30, 0xb4, 0xe9, 0xb7, 0xdc, 0xc6, + 0xb3, 0xd2, 0x05, 0xac, 0xf4, 0xb4, 0x14, 0x86, 0x40, 0x59, 0x55, 0xdc, 0xd2, 0xb6, 0x11, 0xa4, + 0x6f, 0x69, 0x39, 0x11, 0xa9, 0xc0, 0xc4, 0x67, 0x6c, 0xc0, 0xb8, 0xbe, 0xe7, 0x39, 0x6e, 0x40, + 0x4b, 0x17, 0xb1, 0x5f, 0xd0, 0x8d, 0xff, 0x43, 0x1d, 0xa1, 0x0f, 0x67, 0x83, 0x83, 0xac, 0xc0, + 0xe9, 0x95, 0xb0, 0x16, 0x05, 0x6e, 0x9b, 0xae, 0x39, 0x9e, 0xb3, 0x47, 0x9b, 0xa5, 0x4b, 0xb1, + 0x1f, 0xdd, 0x0d, 0xeb, 0x21, 0xe2, 0xea, 0x07, 0x1c, 0xa9, 0xfb, 0xd1, 0x13, 0x7c, 0xe4, 0x73, + 0x98, 0x5e, 0xfa, 0x26, 0x62, 0x23, 0xa6, 0x55, 0xe9, 0x34, 0xdd, 0xa8, 0x16, 0xf9, 0x81, 0xb3, + 0x47, 0x4b, 0x65, 0x94, 0xf7, 0xca, 0xd1, 0x61, 0xf9, 0x32, 0x15, 0xf8, 0xba, 0xc3, 0x08, 0xea, + 0x21, 0xa7, 0xd0, 0xcf, 0xc7, 0xb3, 0x24, 0x30, 0xed, 0xd7, 0x3a, 0x6d, 0xb6, 0xdb, 0x46, 0xed, + 0x5f, 0x36, 0xb4, 0xaf, 0x61, 0xb8, 0xf6, 0x43, 0x0e, 0x48, 0x69, 0x5f, 0x23, 0x24, 0x36, 0x90, + 0xfb, 0xbe, 0xeb, 0x55, 0x1a, 0x91, 0xfb, 0x84, 0x0a, 0x8b, 0x39, 0x2c, 0x5d, 0xc1, 0x9a, 0xa2, + 0xcf, 0xff, 0x17, 0x7d, 0xd7, 0xab, 0x3b, 0x88, 0xae, 0x87, 0x02, 0xaf, 0x7f, 0x23, 0x69, 0x6e, + 0xf2, 0x7d, 0x38, 0xbb, 0xe6, 0xef, 0xba, 0x2d, 0xca, 0xa7, 0x1c, 0xae, 0x16, 0xf4, 0x5f, 0x5a, + 0x28, 0x17, 0x7d, 0xfe, 0x07, 0x48, 0x51, 0x17, 0xb3, 0xd5, 0x81, 0xa2, 0xd1, 0x7d, 0xfe, 0xd9, + 0x52, 0xc8, 0x12, 0x8c, 0xe3, 0x77, 0xd9, 0xc2, 0x9f, 0x61, 0xe9, 0x2a, 0x9a, 0x74, 0x57, 0x12, + 0xbb, 0xb4, 0x9b, 0x4b, 0x1a, 0xcd, 0x92, 0x17, 0x05, 0xcf, 0x6c, 0x83, 0x8d, 0x7c, 0x0c, 0x73, + 0xc9, 0xe1, 0xbd, 0xe0, 0x7b, 0x8f, 0xdc, 0xbd, 0x4e, 0x40, 0x9b, 0xa5, 0x57, 0x58, 0x55, 0xed, + 0x2e, 0x14, 0xe4, 0x2b, 0x98, 0xc1, 0xb5, 0xae, 0xe2, 0xf9, 0xde, 0xb3, 0x03, 0xf7, 0x47, 0xb8, + 0x7f, 0x66, 0xdb, 0xde, 0x6b, 0xb8, 0xed, 0xbd, 0x76, 0x74, 0x58, 0xbe, 0x82, 0x6b, 0x62, 0xdd, + 0xd1, 0x29, 0x12, 0x5e, 0xeb, 0x6c, 0x19, 0x73, 0x0f, 0xe1, 0x4c, 0xaa, 0xfe, 0xa4, 0x08, 0xfd, + 0x8f, 0xc5, 0xf9, 0xec, 0xa8, 0xcd, 0xfe, 0x24, 0x6f, 0xc0, 0xe0, 0x13, 0x66, 0xa8, 0xe1, 0x76, + 0x24, 0x3e, 0xf1, 0xd3, 0x58, 0x57, 0xbc, 0x47, 0xbe, 0xcd, 0x89, 0xde, 0xef, 0x7b, 0xb7, 0x70, + 0x7f, 0x60, 0x64, 0xac, 0x38, 0xce, 0x8f, 0xd5, 0xef, 0x0f, 0x8c, 0x4c, 0x14, 0x27, 0xad, 0x0a, + 0x9c, 0x4e, 0xd0, 0x93, 0x12, 0x0c, 0x53, 0x8f, 0x6d, 0xfe, 0x9b, 0x7c, 0x43, 0x64, 0xcb, 0x9f, + 0x64, 0x1a, 0x06, 0x5b, 0xee, 0x81, 0x1b, 0x61, 0x81, 0x83, 0x36, 0xff, 0x61, 0xfd, 0x56, 0x01, + 0x48, 0x7a, 0x3d, 0x22, 0xb7, 0x12, 0x62, 0xf8, 0xd6, 0x57, 0x80, 0xf4, 0x83, 0x03, 0x29, 0xfd, + 0x33, 0x98, 0xe2, 0x03, 0x42, 0xae, 0x9c, 0x5a, 0x59, 0x7c, 0xc6, 0xce, 0x40, 0xeb, 0xce, 0x26, + 0x81, 0xc6, 0x75, 0x76, 0x15, 0xab, 0xd6, 0x81, 0x99, 0xcc, 0x95, 0x88, 0xac, 0xc1, 0xcc, 0x81, + 0xef, 0x45, 0xfb, 0xad, 0x67, 0x72, 0x21, 0x12, 0xa5, 0x15, 0xb0, 0x34, 0x9c, 0x7c, 0x33, 0x09, + 0xec, 0x29, 0x01, 0x16, 0x12, 0xb1, 0x1c, 0xe1, 0x74, 0x92, 0x2d, 0xb1, 0x6c, 0x38, 0x93, 0x9a, + 0xd0, 0xc9, 0x47, 0x30, 0xde, 0x40, 0xe3, 0xce, 0x28, 0x89, 0x2f, 0x67, 0x1a, 0x5c, 0xff, 0x56, + 0x39, 0x9c, 0x37, 0xe5, 0x9f, 0x15, 0x60, 0x36, 0x67, 0x2a, 0x3f, 0xb9, 0xaa, 0xbf, 0x80, 0xb3, + 0x07, 0xce, 0x37, 0xf5, 0x00, 0x6d, 0xf7, 0x7a, 0xe0, 0x78, 0x09, 0x6d, 0xe3, 0x34, 0x95, 0x4d, + 0xa1, 0xc7, 0x36, 0x1d, 0x38, 0xdf, 0xd8, 0x48, 0x60, 0x33, 0x3c, 0xaf, 0xe7, 0xa7, 0x30, 0x61, + 0x4c, 0xde, 0x27, 0xae, 0x9c, 0x75, 0x07, 0xce, 0x2c, 0xd2, 0x16, 0x8d, 0xe8, 0xb1, 0x7d, 0x76, + 0xd6, 0x26, 0x40, 0x8d, 0x1e, 0x38, 0xed, 0x7d, 0x9f, 0x6d, 0xea, 0xab, 0xfa, 0x2f, 0xe1, 0xf3, + 0x21, 0xd2, 0x3c, 0x91, 0x88, 0x9d, 0x37, 0xf9, 0x46, 0x3f, 0x54, 0x94, 0xb6, 0xc6, 0x65, 0xfd, + 0xfb, 0x3e, 0x20, 0x62, 0xf6, 0x0d, 0xa8, 0x73, 0x20, 0xab, 0xf1, 0x1e, 0x8c, 0x73, 0x0b, 0x9d, + 0x83, 0xb1, 0x3a, 0x63, 0xf3, 0x53, 0xe2, 0xcb, 0xd3, 0x51, 0xcb, 0xa7, 0x6c, 0x83, 0x94, 0xb1, + 0xda, 0x94, 0xbb, 0x16, 0x90, 0xb5, 0xcf, 0x60, 0xd5, 0x51, 0x8c, 0x55, 0xff, 0x4d, 0x3e, 0x81, + 0xc9, 0x05, 0xff, 0xa0, 0xcd, 0x74, 0x22, 0x98, 0xfb, 0x85, 0xdb, 0x46, 0x94, 0x6b, 0x20, 0x97, + 0x4f, 0xd9, 0x09, 0x72, 0xb2, 0x0e, 0x53, 0x77, 0x5b, 0x9d, 0x70, 0xbf, 0xe2, 0x35, 0x17, 0x5a, + 0x7e, 0x28, 0xa5, 0x0c, 0x08, 0x4b, 0x4b, 0xcc, 0x9d, 0x69, 0x8a, 0xe5, 0x53, 0x76, 0x16, 0x23, + 0xb9, 0x06, 0x83, 0x4b, 0x4f, 0xd8, 0x9c, 0x2e, 0x23, 0x5c, 0x44, 0x00, 0xde, 0x86, 0x47, 0x37, + 0x1e, 0x2d, 0x9f, 0xb2, 0x39, 0xb6, 0x3a, 0x0a, 0xc3, 0xd2, 0xba, 0xbf, 0xc5, 0xf6, 0xdb, 0x4a, + 0x9d, 0xb5, 0xc8, 0x89, 0x3a, 0x21, 0x99, 0x83, 0x91, 0xed, 0x36, 0x33, 0x3a, 0xa5, 0x5b, 0xc4, + 0x56, 0xbf, 0xad, 0x37, 0x4c, 0x4d, 0x93, 0x0b, 0x10, 0xfb, 0x74, 0x05, 0xb1, 0xe6, 0xe4, 0x5d, + 0x36, 0x95, 0xdb, 0x9d, 0xda, 0x28, 0xb7, 0x2f, 0x51, 0x6e, 0x31, 0xa9, 0x6b, 0x6b, 0x26, 0x53, + 0x79, 0xd6, 0xe7, 0x70, 0x69, 0xbb, 0x1d, 0xd2, 0x20, 0xaa, 0xb4, 0xdb, 0x2d, 0xb7, 0xc1, 0x4f, + 0xc8, 0xd0, 0x0b, 0x20, 0x07, 0xcb, 0x3b, 0x30, 0xc4, 0x01, 0x62, 0x98, 0xc8, 0x31, 0x58, 0x69, + 0xb7, 0x85, 0xef, 0xe1, 0x4d, 0xbe, 0xf3, 0xe7, 0xde, 0x04, 0x5b, 0x50, 0x5b, 0xbf, 0x51, 0x80, + 0x4b, 0xfc, 0x0b, 0xc8, 0x15, 0xfd, 0x1d, 0x18, 0xc5, 0xf8, 0xb7, 0xb6, 0xd3, 0x90, 0xdf, 0x04, + 0x0f, 0x04, 0x94, 0x40, 0x3b, 0xc6, 0x6b, 0x91, 0x85, 0x7d, 0xf9, 0x91, 0x85, 0xf2, 0x03, 0xeb, + 0xcf, 0xfc, 0xc0, 0x3e, 0x03, 0x4b, 0xd4, 0xa8, 0xd5, 0x4a, 0x55, 0x2a, 0x7c, 0x9e, 0x5a, 0x59, + 0xff, 0xa3, 0x0f, 0x66, 0xef, 0x51, 0x8f, 0x06, 0x0e, 0xb6, 0xd3, 0xf0, 0x72, 0xe9, 0x11, 0x46, + 0x85, 0xae, 0x11, 0x46, 0x65, 0xe9, 0x37, 0xec, 0x43, 0xbf, 0x61, 0x2a, 0x5c, 0x8a, 0xd9, 0xa2, + 0xdb, 0xf6, 0x8a, 0x68, 0x16, 0xda, 0xa2, 0x9d, 0xc0, 0xe5, 0xa7, 0x0c, 0x2b, 0x71, 0x74, 0xd2, + 0x40, 0x4f, 0x9f, 0xc3, 0x94, 0x88, 0xd6, 0x18, 0x16, 0xd1, 0x49, 0x66, 0x4c, 0xd2, 0x3a, 0x0c, + 0x71, 0x77, 0x27, 0x9e, 0x6d, 0x8d, 0xcd, 0xdf, 0x10, 0xdf, 0x54, 0x4e, 0x03, 0x85, 0x6f, 0x14, + 0x17, 0x76, 0x3e, 0x04, 0x22, 0x04, 0xd8, 0x42, 0xca, 0xdc, 0x67, 0x30, 0xa6, 0x91, 0x1c, 0x67, + 0xed, 0x57, 0x6e, 0x57, 0xb6, 0x1d, 0xf5, 0xf6, 0xb8, 0x07, 0x57, 0x5b, 0xfb, 0xad, 0x0f, 0xa0, + 0x94, 0xae, 0x8d, 0x70, 0xb5, 0xf5, 0xf2, 0xec, 0x59, 0x8b, 0x30, 0x7d, 0x8f, 0x46, 0x38, 0x70, + 0xf1, 0x23, 0xd2, 0xa2, 0xec, 0x12, 0xdf, 0x99, 0x9c, 0x55, 0x11, 0xc8, 0x06, 0x98, 0xf6, 0x95, + 0xd6, 0x60, 0x26, 0x21, 0x45, 0x94, 0xff, 0x3e, 0x0c, 0x0b, 0x90, 0x9a, 0x51, 0x45, 0xa8, 0x2e, + 0xdd, 0x15, 0x88, 0x9d, 0x79, 0x3e, 0x6e, 0x85, 0x64, 0x5b, 0x32, 0x58, 0xfb, 0x70, 0x96, 0x2d, + 0xb3, 0xb1, 0x54, 0x35, 0x1c, 0xcf, 0xc3, 0x68, 0x9b, 0x6d, 0x14, 0x42, 0xf7, 0x47, 0x7c, 0x18, + 0x0d, 0xda, 0x23, 0x0c, 0x50, 0x73, 0x7f, 0x44, 0xc9, 0x45, 0x00, 0x44, 0x62, 0x33, 0xc5, 0x2c, + 0x80, 0xe4, 0xdc, 0x95, 0x49, 0x00, 0x63, 0xf4, 0xf8, 0xb8, 0xb1, 0xf1, 0x6f, 0x2b, 0x80, 0xd9, + 0x54, 0x49, 0xa2, 0x01, 0xb7, 0x60, 0x44, 0xee, 0x8f, 0x13, 0x87, 0x0c, 0x7a, 0x0b, 0x6c, 0x45, + 0x44, 0x5e, 0x85, 0xd3, 0x1e, 0xfd, 0x26, 0xaa, 0xa7, 0xea, 0x30, 0xc1, 0xc0, 0x9b, 0xb2, 0x1e, + 0xd6, 0x2f, 0xa0, 0x63, 0xb9, 0xe6, 0xf9, 0x4f, 0x1f, 0xb5, 0x9c, 0xc7, 0x34, 0x55, 0xf0, 0x47, + 0x30, 0x52, 0xeb, 0x5d, 0x30, 0xff, 0x7c, 0x64, 0xe1, 0xb6, 0x62, 0xb1, 0x5a, 0x30, 0xc7, 0x9a, + 0x54, 0xab, 0xac, 0xad, 0xae, 0x34, 0x37, 0xbf, 0x6d, 0x05, 0x3e, 0x81, 0xf3, 0x99, 0xa5, 0x7d, + 0xdb, 0x4a, 0xfc, 0xfd, 0x01, 0x98, 0xe5, 0x8b, 0x49, 0x7a, 0x04, 0x1f, 0x7f, 0xaa, 0xf9, 0xb9, + 0x9c, 0xf7, 0xde, 0xce, 0x38, 0xef, 0x45, 0x16, 0xfd, 0xbc, 0xd7, 0x38, 0xe5, 0x7d, 0x37, 0xfb, + 0x94, 0x17, 0x9d, 0x50, 0xe6, 0x29, 0x6f, 0xf2, 0x6c, 0x77, 0x29, 0xff, 0x6c, 0x17, 0x0f, 0x9e, + 0x32, 0xce, 0x76, 0xb3, 0x4e, 0x74, 0x13, 0x81, 0x52, 0x23, 0x2f, 0x37, 0x50, 0xea, 0x55, 0x18, + 0xae, 0xb4, 0xdb, 0x5a, 0xe0, 0x21, 0x76, 0x8f, 0xd3, 0x6e, 0x73, 0xe5, 0x49, 0xa4, 0x9c, 0xe7, + 0x21, 0x63, 0x9e, 0x7f, 0x0f, 0x60, 0x01, 0xaf, 0x47, 0x60, 0xc7, 0x8d, 0x21, 0x05, 0xee, 0xf0, + 0xf9, 0xa5, 0x09, 0xec, 0x38, 0xdd, 0xbd, 0x12, 0x13, 0xf3, 0x8d, 0xbd, 0xb5, 0x03, 0xa5, 0xf4, + 0xf0, 0x79, 0x09, 0x53, 0xd7, 0xef, 0x15, 0xe0, 0xa2, 0xd8, 0xe4, 0x24, 0x3e, 0xf0, 0x93, 0x8f, + 0xce, 0xb7, 0x61, 0x5c, 0xf0, 0x6e, 0xc5, 0x1f, 0x02, 0x3f, 0x60, 0x97, 0x93, 0x31, 0x9f, 0xd1, + 0x0d, 0x32, 0xf2, 0x36, 0x8c, 0xe0, 0x1f, 0xf1, 0xc1, 0x10, 0xd3, 0xcc, 0x28, 0x92, 0xd6, 0x93, + 0xc7, 0x43, 0x8a, 0xd4, 0xfa, 0x1a, 0x2e, 0xe5, 0x55, 0xfc, 0x25, 0xe8, 0xe5, 0xdf, 0x14, 0xe0, + 0xbc, 0x10, 0x6f, 0x4c, 0x15, 0xcf, 0xb5, 0xea, 0x9c, 0x20, 0x5c, 0xf9, 0x3e, 0x8c, 0xb1, 0x02, + 0x65, 0xbd, 0xfb, 0xc5, 0xd2, 0x2a, 0x2c, 0x87, 0x18, 0xb3, 0xe8, 0x44, 0x8e, 0x08, 0xbf, 0x71, + 0x0e, 0x5a, 0xd2, 0x33, 0x62, 0xeb, 0xcc, 0xd6, 0x97, 0x70, 0x21, 0xbb, 0x09, 0x2f, 0x41, 0x3f, + 0xf7, 0x61, 0x2e, 0x63, 0x51, 0x78, 0xbe, 0x35, 0xf9, 0x0b, 0x38, 0x9f, 0x29, 0xeb, 0x25, 0x54, + 0x73, 0x99, 0xed, 0x38, 0xa2, 0x97, 0xd0, 0x85, 0xd6, 0x43, 0x38, 0x97, 0x21, 0xe9, 0x25, 0x54, + 0xf1, 0x1e, 0xcc, 0xaa, 0x9d, 0xf6, 0x0b, 0xd5, 0x70, 0x0d, 0x2e, 0x72, 0x41, 0x2f, 0xa7, 0x57, + 0x1e, 0xc0, 0x79, 0x21, 0xee, 0x25, 0x68, 0x6f, 0x19, 0x2e, 0xc4, 0x06, 0x75, 0xc6, 0x3e, 0xe9, + 0xd8, 0x93, 0x8c, 0xb5, 0x0a, 0x97, 0x63, 0x49, 0x39, 0x9b, 0x86, 0xe3, 0x4b, 0xe3, 0xdb, 0xc1, + 0xb8, 0x97, 0x5e, 0x4a, 0x8f, 0x3e, 0x84, 0xb3, 0x86, 0xd0, 0x97, 0xb6, 0x55, 0x5a, 0x81, 0x29, + 0x2e, 0xd8, 0xdc, 0x3a, 0xcf, 0xeb, 0x5b, 0xe7, 0xb1, 0xf9, 0x33, 0xb1, 0x48, 0x04, 0xef, 0xbc, + 0x99, 0xb1, 0x9b, 0x5e, 0xc3, 0xdd, 0xb4, 0x24, 0x89, 0x6b, 0xf8, 0x36, 0x0c, 0x71, 0x88, 0xa8, + 0x5f, 0x86, 0x30, 0x6e, 0x2c, 0x70, 0x36, 0x41, 0x6c, 0x7d, 0x1f, 0x2e, 0x72, 0x4b, 0x34, 0x3e, + 0xa8, 0x34, 0xad, 0xc5, 0x8f, 0x12, 0x86, 0xe8, 0x39, 0x21, 0x37, 0x49, 0x9f, 0x63, 0x8f, 0xee, + 0xca, 0xb1, 0x9d, 0x27, 0xff, 0x58, 0x57, 0xd7, 0xa4, 0x81, 0xd9, 0x97, 0x69, 0x60, 0x5e, 0x85, + 0x2b, 0xca, 0xc0, 0x4c, 0x16, 0x23, 0x87, 0x96, 0xf5, 0x25, 0x9c, 0xe7, 0x0d, 0x95, 0x21, 0x85, + 0x66, 0x35, 0x3e, 0x48, 0x34, 0x73, 0x56, 0x34, 0xd3, 0xa4, 0xce, 0x69, 0xe4, 0xdf, 0x2e, 0xc8, + 0x4f, 0x2e, 0x5b, 0xf8, 0xcf, 0xdb, 0xe2, 0x5e, 0x87, 0xb2, 0x52, 0x88, 0x59, 0xa3, 0xe7, 0x33, + 0xb7, 0xd7, 0x60, 0x46, 0x17, 0xe3, 0x36, 0xe8, 0xce, 0x1d, 0x3c, 0x41, 0x7a, 0x8b, 0x7d, 0x16, + 0x08, 0x90, 0xc3, 0xae, 0x94, 0xa1, 0x37, 0xa4, 0xb7, 0x15, 0xa5, 0x55, 0x87, 0x0b, 0xe9, 0xae, + 0x70, 0x1b, 0xf2, 0x3e, 0x01, 0xf9, 0x84, 0x7d, 0xc2, 0x08, 0x11, 0x9d, 0x91, 0x2b, 0x54, 0x7e, + 0xc7, 0x9c, 0x5d, 0x72, 0x59, 0x96, 0x9c, 0x6a, 0x12, 0xed, 0x67, 0xa5, 0xcb, 0xf1, 0xf0, 0x63, + 0x20, 0x12, 0xb5, 0x50, 0xb3, 0x65, 0xd1, 0xe7, 0xa0, 0x7f, 0xa1, 0x66, 0x8b, 0x8b, 0x4c, 0xb8, + 0x13, 0x6c, 0x84, 0x81, 0xcd, 0x60, 0xc9, 0x1d, 0x79, 0xdf, 0x31, 0x76, 0xe4, 0xf7, 0x07, 0x46, + 0xfa, 0x8b, 0x03, 0x36, 0xa9, 0xb9, 0x7b, 0xde, 0x43, 0x37, 0xda, 0x57, 0x05, 0x56, 0xac, 0xaf, + 0x60, 0xca, 0x28, 0x5e, 0x7c, 0xc5, 0x5d, 0x6f, 0x60, 0xb1, 0xfd, 0xec, 0x42, 0x05, 0xc3, 0x6a, + 0xd0, 0x65, 0x31, 0xce, 0xe7, 0x9b, 0x86, 0x53, 0xc7, 0xeb, 0xbd, 0xb6, 0x44, 0x5a, 0xbf, 0x33, + 0xa0, 0x49, 0xd7, 0xee, 0xb5, 0x75, 0x69, 0xdd, 0x1d, 0x00, 0x3e, 0x42, 0xb4, 0xc6, 0xb1, 0x0d, + 0xe0, 0x98, 0x88, 0x56, 0xe1, 0x53, 0xb2, 0xad, 0x11, 0x1d, 0xf7, 0xde, 0x9b, 0x88, 0x3f, 0xe6, + 0x4c, 0xf2, 0xaa, 0xa7, 0x8a, 0x3f, 0x16, 0xa2, 0x43, 0x5b, 0x27, 0x22, 0xdf, 0x4f, 0x5e, 0xce, + 0x18, 0xc4, 0x03, 0xab, 0x57, 0xe4, 0x09, 0x76, 0xba, 0x6d, 0x27, 0xbb, 0x9f, 0xf1, 0x14, 0x66, + 0x18, 0xaf, 0xfb, 0x08, 0x0d, 0x8b, 0xa5, 0x6f, 0x22, 0xea, 0xf1, 0xb9, 0x7d, 0x08, 0xcb, 0xb9, + 0xd6, 0xa5, 0x9c, 0x98, 0x58, 0xf8, 0xdf, 0x63, 0x39, 0x75, 0xaa, 0x70, 0x76, 0xb6, 0x7c, 0x1c, + 0x44, 0xf6, 0xea, 0x92, 0xd7, 0x6c, 0xfb, 0xae, 0x32, 0x98, 0xf8, 0x20, 0x0a, 0x5a, 0x75, 0x2a, + 0xe0, 0xb6, 0x4e, 0x64, 0xbd, 0xda, 0x35, 0xaa, 0x7d, 0x04, 0x06, 0xb6, 0x16, 0xb6, 0x56, 0x8b, + 0x05, 0xeb, 0x16, 0x80, 0x56, 0x12, 0xc0, 0xd0, 0xfa, 0x86, 0xbd, 0x56, 0x59, 0x2d, 0x9e, 0x22, + 0x33, 0x70, 0xe6, 0xe1, 0xca, 0xfa, 0xe2, 0xc6, 0xc3, 0x5a, 0xbd, 0xb6, 0x56, 0xb1, 0xb7, 0x16, + 0x2a, 0xf6, 0x62, 0xb1, 0x60, 0x7d, 0x0d, 0xd3, 0x66, 0x0b, 0x5f, 0xea, 0x20, 0x8c, 0x60, 0x4a, + 0xed, 0x67, 0xee, 0x3f, 0xdc, 0xd2, 0x22, 0x5a, 0x85, 0xf1, 0x97, 0x8c, 0xcc, 0x12, 0x66, 0xa2, + 0xf8, 0x8c, 0x34, 0x22, 0xf2, 0x3a, 0xdf, 0x16, 0x24, 0x6f, 0x2e, 0xb3, 0x6d, 0x41, 0x3d, 0xde, + 0x17, 0xe0, 0xd4, 0xf7, 0x3d, 0x98, 0x36, 0x4b, 0x3d, 0xae, 0x97, 0xea, 0x15, 0x0c, 0xf5, 0xd5, + 0xae, 0x35, 0x11, 0xa2, 0x1f, 0x1b, 0x88, 0x99, 0xf5, 0x7b, 0x50, 0x14, 0x54, 0xf1, 0xca, 0x7b, + 0x55, 0xba, 0x11, 0x0b, 0x19, 0x97, 0x30, 0x65, 0x50, 0xba, 0x0f, 0x45, 0x36, 0x63, 0x0a, 0x4e, + 0x5e, 0xc0, 0x34, 0x0c, 0xae, 0xc6, 0xc7, 0x39, 0x36, 0xff, 0x81, 0xb7, 0x7b, 0x22, 0x27, 0x88, + 0x64, 0x1c, 0xdc, 0xa8, 0xad, 0x7e, 0x93, 0xd7, 0x61, 0xe8, 0xae, 0xdb, 0x8a, 0x84, 0x6b, 0x24, + 0x5e, 0xe4, 0x99, 0x58, 0x8e, 0xb0, 0x05, 0x81, 0x65, 0xc3, 0x19, 0xad, 0xc0, 0x13, 0x54, 0x95, + 0x94, 0x60, 0x78, 0x9d, 0x7e, 0xa3, 0x95, 0x2f, 0x7f, 0x5a, 0xef, 0xc0, 0x19, 0x11, 0x63, 0xa8, + 0xa9, 0xe9, 0x8a, 0xb8, 0x2b, 0x5e, 0x30, 0x2e, 0xac, 0x0a, 0x91, 0x88, 0x62, 0x7c, 0xdb, 0xed, + 0xe6, 0x73, 0xf2, 0xb1, 0x85, 0xe2, 0x84, 0x7c, 0xaf, 0xc9, 0x53, 0xa0, 0x5e, 0xdd, 0xf9, 0x37, + 0xfa, 0xa0, 0x94, 0xf0, 0x32, 0x2c, 0xec, 0x3b, 0xad, 0x16, 0xf5, 0xf6, 0x28, 0xb9, 0x0e, 0x03, + 0x5b, 0x1b, 0x5b, 0x9b, 0xc2, 0x4b, 0x2a, 0xa3, 0x0b, 0x18, 0x48, 0xd1, 0xd8, 0x48, 0x41, 0x1e, + 0xc0, 0x19, 0x19, 0x45, 0xac, 0x50, 0xa2, 0x87, 0x2e, 0x76, 0x8f, 0x49, 0x4e, 0xf3, 0x91, 0xb7, + 0x84, 0x4b, 0xe4, 0x87, 0x1d, 0x37, 0xa0, 0x4d, 0xf4, 0xfc, 0xc4, 0x47, 0xf5, 0x1a, 0xc6, 0xd6, + 0xc9, 0xc8, 0xf7, 0x60, 0xbc, 0x56, 0xdb, 0x88, 0x4b, 0x1f, 0x34, 0x4e, 0x88, 0x74, 0x94, 0x6d, + 0x10, 0xf2, 0x2b, 0xc1, 0xd6, 0xef, 0x17, 0x60, 0x36, 0xc7, 0xdd, 0x42, 0x5e, 0x37, 0xf4, 0x30, + 0xa5, 0xe9, 0x41, 0x92, 0x2c, 0x9f, 0x12, 0x8a, 0x58, 0xd0, 0x62, 0xb2, 0xfb, 0x4f, 0x10, 0x93, + 0xbd, 0x7c, 0x2a, 0x8e, 0xc3, 0x26, 0xaf, 0x42, 0x7f, 0xad, 0xb6, 0x21, 0xdc, 0xea, 0x24, 0x6e, + 0x81, 0x46, 0xcc, 0x08, 0xaa, 0x00, 0x23, 0x12, 0x64, 0x9d, 0x86, 0x09, 0xa3, 0x63, 0x2c, 0x0b, + 0xc6, 0xf5, 0x1a, 0xb2, 0xde, 0x5f, 0xf0, 0x9b, 0xaa, 0xf7, 0xd9, 0xdf, 0xd6, 0x8f, 0x4d, 0x9d, + 0x91, 0x8b, 0x00, 0xf2, 0xbc, 0xd6, 0x6d, 0xca, 0x93, 0x1f, 0x01, 0x59, 0x69, 0x92, 0x2b, 0x30, + 0x1e, 0xd0, 0xa6, 0x1b, 0xd0, 0x46, 0x54, 0xef, 0x04, 0xe2, 0x62, 0x8c, 0x3d, 0x26, 0x61, 0xdb, + 0x41, 0x8b, 0x7c, 0x07, 0x86, 0xf8, 0x41, 0xb2, 0x68, 0xbd, 0x34, 0x12, 0x6a, 0xb5, 0x8d, 0xb5, + 0xbb, 0x15, 0x7e, 0xd0, 0x6d, 0x0b, 0x12, 0xab, 0x0a, 0x63, 0x5a, 0xab, 0x7a, 0x95, 0x3e, 0x0d, + 0x83, 0xba, 0x97, 0x92, 0xff, 0xb0, 0x7e, 0xb3, 0x00, 0xd3, 0x38, 0x0c, 0xf6, 0x5c, 0xb6, 0x3c, + 0xc4, 0x6d, 0x99, 0x37, 0x3a, 0xed, 0x82, 0xd1, 0x69, 0x09, 0x5a, 0xd5, 0x7b, 0xef, 0xa7, 0x7a, + 0xef, 0x42, 0x56, 0xef, 0xe1, 0x14, 0xe0, 0xfa, 0x9e, 0xde, 0x69, 0xfa, 0x71, 0xdd, 0x6f, 0x15, + 0x60, 0x4a, 0xab, 0x93, 0x6a, 0xe0, 0x1d, 0xa3, 0x4a, 0xe7, 0x33, 0xaa, 0x94, 0x1a, 0x4f, 0xd5, + 0x54, 0x8d, 0x5e, 0xe9, 0x56, 0xa3, 0xac, 0xe1, 0x64, 0x0c, 0x93, 0x3f, 0x2b, 0xc0, 0x4c, 0xa6, + 0x0e, 0xc8, 0x59, 0xb6, 0xff, 0x6f, 0x04, 0x34, 0x12, 0x9a, 0x17, 0xbf, 0x18, 0x7c, 0x25, 0x0c, + 0x3b, 0x34, 0x10, 0x7a, 0x17, 0xbf, 0xc8, 0x2b, 0x30, 0xb1, 0x49, 0x03, 0xd7, 0x6f, 0xf2, 0x8b, + 0x09, 0x3c, 0xe2, 0x77, 0xc2, 0x36, 0x81, 0xe4, 0x02, 0x8c, 0xaa, 0x88, 0x55, 0xee, 0xc3, 0xb5, + 0x63, 0x00, 0x93, 0xbd, 0xe8, 0xee, 0xf1, 0x83, 0x1f, 0xc6, 0x2c, 0x7e, 0xb1, 0x09, 0x58, 0x7a, + 0x54, 0x87, 0xf8, 0x04, 0x2c, 0xdd, 0xa5, 0x67, 0x61, 0xe8, 0x33, 0x1b, 0xc7, 0x31, 0xe6, 0x9c, + 0xb0, 0xc5, 0x2f, 0x32, 0x89, 0xa1, 0xe5, 0x78, 0x2f, 0x06, 0x43, 0xca, 0xdf, 0x87, 0xe9, 0x2c, + 0xbd, 0x66, 0x7d, 0x05, 0x82, 0xb7, 0x4f, 0xf1, 0x7e, 0x09, 0x53, 0x95, 0x66, 0x33, 0x1e, 0xae, + 0xbc, 0x57, 0xf9, 0x3c, 0xc1, 0x7d, 0x9a, 0x62, 0x5b, 0x3b, 0xb0, 0xe2, 0xb9, 0x91, 0x3d, 0xb5, + 0xf4, 0x8d, 0x1b, 0x46, 0xae, 0xb7, 0xa7, 0x39, 0x5e, 0xed, 0xb3, 0xeb, 0xf4, 0x69, 0xc6, 0x10, + 0x60, 0x3b, 0x0e, 0x53, 0x36, 0x87, 0x67, 0x08, 0x9f, 0xd6, 0xc4, 0xc6, 0x53, 0xd7, 0xac, 0x29, + 0x37, 0x46, 0xf4, 0x57, 0x1a, 0x8f, 0xad, 0xef, 0xc1, 0x59, 0x3e, 0xed, 0x77, 0xab, 0xbc, 0xa8, + 0xb6, 0xee, 0x27, 0xb6, 0xde, 0x95, 0x9e, 0x9c, 0xae, 0x35, 0xb3, 0xc7, 0x8d, 0xba, 0x60, 0x91, + 0xff, 0xbd, 0x00, 0x73, 0x09, 0xd6, 0xda, 0x33, 0xaf, 0x21, 0xd7, 0x9c, 0x57, 0x93, 0xa1, 0xfb, + 0xb8, 0x57, 0xe2, 0x0e, 0x52, 0xb7, 0xa9, 0xa2, 0xf7, 0xc9, 0x2d, 0x00, 0xce, 0xac, 0x6d, 0x71, + 0xf0, 0x78, 0x40, 0x44, 0x39, 0xe1, 0x26, 0x47, 0x23, 0x21, 0x1d, 0xc8, 0xd2, 0xbb, 0xf8, 0x46, + 0x7a, 0xf9, 0xcf, 0x31, 0xcf, 0x0a, 0x15, 0xec, 0xf5, 0x1c, 0x47, 0x7a, 0x96, 0x7c, 0xeb, 0xef, + 0xf4, 0xc3, 0xac, 0xde, 0x81, 0xcf, 0xd3, 0xd6, 0x4d, 0x18, 0x5b, 0xf0, 0xbd, 0x88, 0x7e, 0x13, + 0x69, 0x79, 0x2e, 0x88, 0x8a, 0x46, 0x50, 0x18, 0xb1, 0xbd, 0xe6, 0x80, 0x3a, 0xdb, 0xeb, 0x19, + 0xd1, 0x9a, 0x31, 0x21, 0x59, 0x80, 0x89, 0x75, 0xfa, 0x34, 0xa5, 0x40, 0x8c, 0x18, 0xf5, 0xe8, + 0xd3, 0xba, 0xa6, 0x44, 0x3d, 0x8c, 0xcf, 0xe0, 0x21, 0xbb, 0x30, 0x29, 0x07, 0x97, 0xa1, 0xcc, + 0x39, 0x7d, 0xe5, 0x35, 0x87, 0x33, 0xcf, 0x03, 0xc1, 0x4a, 0xc8, 0xd1, 0x61, 0x42, 0x22, 0x6b, + 0x3a, 0x2f, 0x91, 0xa7, 0x36, 0x30, 0x97, 0x76, 0x0d, 0x63, 0xc4, 0xe3, 0x26, 0x53, 0x1a, 0xe8, + 0x22, 0xac, 0x4d, 0x28, 0xa5, 0xfb, 0x43, 0x94, 0xf6, 0x16, 0x0c, 0x71, 0xa8, 0xd8, 0x2a, 0xc9, + 0x14, 0x46, 0x8a, 0x9a, 0xfb, 0x32, 0x9a, 0x62, 0x55, 0xe2, 0x30, 0x6b, 0x19, 0xfd, 0x4b, 0x8a, + 0x46, 0x6d, 0x56, 0x6f, 0x27, 0xbb, 0x17, 0x43, 0x9d, 0x65, 0xf7, 0xea, 0xb1, 0x38, 0xf2, 0x4a, + 0xca, 0x02, 0xba, 0xe8, 0x74, 0x49, 0xa2, 0x62, 0x37, 0x60, 0x58, 0x80, 0x12, 0xc9, 0x95, 0xe2, + 0xcf, 0x4f, 0x12, 0x58, 0xef, 0xc3, 0x39, 0xf4, 0x17, 0xba, 0xde, 0x5e, 0x8b, 0x6e, 0x87, 0xc6, + 0xa5, 0x92, 0x5e, 0x9f, 0xf5, 0x87, 0x30, 0x97, 0xc5, 0xdb, 0xf3, 0xcb, 0xe6, 0xe9, 0x4e, 0xfe, + 0xa4, 0x0f, 0xa6, 0x57, 0x42, 0x7d, 0xc3, 0xa5, 0x52, 0x9e, 0x64, 0xa4, 0xe1, 0x40, 0x9d, 0x2c, + 0x9f, 0xca, 0x4a, 0xb3, 0xf1, 0x96, 0x76, 0xdd, 0xb5, 0xaf, 0x5b, 0x7e, 0x0d, 0xb6, 0x6c, 0xa9, + 0x0b, 0xaf, 0xaf, 0xc2, 0xc0, 0x3a, 0x9b, 0xaa, 0xfb, 0x45, 0xdf, 0x71, 0x0e, 0x06, 0xc2, 0xeb, + 0xa6, 0x6c, 0x89, 0x64, 0x3f, 0xc8, 0xdd, 0xd4, 0xa5, 0xd6, 0x81, 0xde, 0xf9, 0x23, 0x96, 0x4f, + 0xa5, 0xee, 0xb7, 0xbe, 0x03, 0x63, 0x95, 0xe6, 0x01, 0x0f, 0xc9, 0xf4, 0xbd, 0xc4, 0x67, 0xa9, + 0x61, 0x96, 0x4f, 0xd9, 0x3a, 0x21, 0xb9, 0xc6, 0x6f, 0x35, 0x0c, 0xe5, 0xe4, 0xd4, 0x60, 0x9b, + 0xb5, 0x4a, 0xbb, 0x5d, 0x1d, 0x81, 0x21, 0x7e, 0xd1, 0xd2, 0xfa, 0x12, 0xe6, 0x44, 0x20, 0x0f, + 0xf7, 0x8e, 0x62, 0xb8, 0x4f, 0x18, 0xc7, 0x6a, 0x75, 0x0b, 0xbe, 0xb9, 0x04, 0x80, 0xb6, 0xd0, + 0x8a, 0xd7, 0xa4, 0xdf, 0x88, 0x48, 0x42, 0x0d, 0x62, 0xbd, 0x0d, 0xa3, 0x4a, 0x43, 0xb8, 0xe1, + 0xd7, 0x16, 0x3b, 0xd4, 0xd6, 0xb4, 0x71, 0x8b, 0x57, 0x5e, 0xdd, 0x3d, 0x67, 0xb4, 0x5d, 0x64, + 0xc9, 0xe1, 0x16, 0x82, 0x0b, 0x33, 0x89, 0x41, 0x10, 0x27, 0x61, 0x50, 0x7b, 0x74, 0x1e, 0xea, + 0xa8, 0x7e, 0x27, 0xb7, 0xf0, 0x7d, 0xc7, 0xda, 0xc2, 0x5b, 0xff, 0xa2, 0x0f, 0x8d, 0xcb, 0x94, + 0x3e, 0x12, 0x7e, 0x3a, 0xdd, 0x57, 0x58, 0x85, 0x51, 0x6c, 0xfd, 0xa2, 0xbc, 0x30, 0xd8, 0x3d, + 0x0e, 0x65, 0xe4, 0x27, 0x87, 0xe5, 0x53, 0x18, 0x7c, 0x12, 0xb3, 0x91, 0x8f, 0x61, 0x78, 0xc9, + 0x6b, 0xa2, 0x84, 0xfe, 0x13, 0x48, 0x90, 0x4c, 0xac, 0x4f, 0xb0, 0xca, 0x5b, 0xec, 0x13, 0xe6, + 0xee, 0x1d, 0x5b, 0x83, 0xc4, 0x56, 0xee, 0x60, 0x9e, 0x95, 0x3b, 0x94, 0xb0, 0x72, 0x2d, 0x18, + 0xdc, 0x08, 0x9a, 0x22, 0xb7, 0xcd, 0xe4, 0xfc, 0xb8, 0x50, 0x1c, 0xc2, 0x6c, 0x8e, 0xb2, 0xfe, + 0x67, 0x01, 0x66, 0xef, 0xd1, 0x28, 0x73, 0x0c, 0x19, 0x5a, 0x29, 0xbc, 0xb0, 0x56, 0xfa, 0x9e, + 0x47, 0x2b, 0xaa, 0xd5, 0xfd, 0x79, 0xad, 0x1e, 0xc8, 0x6b, 0xf5, 0x60, 0x7e, 0xab, 0xef, 0xc1, + 0x10, 0x6f, 0x2a, 0xb3, 0xe4, 0x57, 0x22, 0x7a, 0x10, 0x5b, 0xf2, 0x7a, 0x14, 0x9d, 0xcd, 0x71, + 0x6c, 0x23, 0xb9, 0xea, 0x84, 0xba, 0x25, 0x2f, 0x7e, 0x5a, 0x3f, 0xc0, 0xab, 0xc6, 0xab, 0x7e, + 0xe3, 0xb1, 0xe6, 0x11, 0x1e, 0xe6, 0x5f, 0x68, 0xf2, 0x04, 0x81, 0x51, 0x71, 0x8c, 0x2d, 0x29, + 0xc8, 0x65, 0x18, 0x5b, 0xf1, 0xee, 0xfa, 0x41, 0x83, 0x6e, 0x78, 0x2d, 0x2e, 0x7d, 0xc4, 0xd6, + 0x41, 0xc2, 0x53, 0x22, 0x4a, 0x88, 0xdd, 0x0f, 0x08, 0x48, 0xb8, 0x1f, 0x18, 0x6c, 0x67, 0xde, + 0xe6, 0x38, 0xe1, 0x88, 0x61, 0x7f, 0x77, 0xb3, 0xdc, 0x95, 0x89, 0xdf, 0x8b, 0x70, 0x17, 0xce, + 0xd9, 0xb4, 0xdd, 0x72, 0xd8, 0x9e, 0xee, 0xc0, 0xe7, 0xf4, 0xaa, 0xcd, 0x97, 0x33, 0xae, 0x09, + 0x9a, 0x31, 0x15, 0xaa, 0xca, 0x7d, 0x5d, 0xaa, 0x7c, 0x00, 0x57, 0xee, 0xd1, 0xc8, 0x9c, 0x50, + 0x63, 0x7f, 0xb3, 0x68, 0xfc, 0x32, 0x8c, 0x84, 0xa6, 0xaf, 0x5c, 0x5e, 0x7b, 0xcb, 0x64, 0xdc, + 0x79, 0x53, 0x9e, 0x26, 0x09, 0x39, 0xea, 0x2f, 0xeb, 0x13, 0x28, 0xe7, 0x15, 0x77, 0xbc, 0x90, + 0x57, 0x17, 0x2e, 0xe7, 0x0b, 0x10, 0xd5, 0x5d, 0x02, 0xe9, 0x57, 0x17, 0x9f, 0x50, 0xaf, 0xda, + 0x9a, 0xae, 0x78, 0xf1, 0x87, 0x55, 0x95, 0xc1, 0x7f, 0x2f, 0x50, 0xdd, 0x3a, 0x1e, 0x59, 0x9b, + 0x02, 0x62, 0xbd, 0x56, 0x60, 0x44, 0xc2, 0x84, 0x5e, 0x67, 0x33, 0x6b, 0x2a, 0x15, 0xda, 0x94, + 0x02, 0x14, 0x9b, 0xf5, 0x03, 0x79, 0x7c, 0x63, 0x72, 0x1c, 0xef, 0xde, 0xec, 0x71, 0xce, 0x6b, + 0x2c, 0x1f, 0xce, 0x99, 0xb2, 0x75, 0xb7, 0x7c, 0x51, 0x73, 0xcb, 0x73, 0x6f, 0xfc, 0x65, 0xd3, + 0x4d, 0x2c, 0x3c, 0x0d, 0x1a, 0x88, 0x5c, 0xd2, 0x9d, 0xef, 0xe3, 0xe9, 0x8b, 0xb8, 0xb7, 0x61, + 0x2e, 0xab, 0x40, 0xcd, 0x0e, 0x54, 0x1e, 0x5e, 0xb1, 0xdf, 0x59, 0x84, 0x4b, 0x32, 0xbb, 0x94, + 0xef, 0x47, 0x61, 0x14, 0x38, 0xed, 0x5a, 0x23, 0x70, 0xdb, 0x31, 0x97, 0x05, 0x43, 0x1c, 0x22, + 0x34, 0xc1, 0x8f, 0xc2, 0x38, 0x8d, 0xc0, 0x58, 0xbf, 0x52, 0x00, 0xcb, 0x88, 0xd3, 0xc2, 0x7e, + 0xde, 0x0c, 0xfc, 0x27, 0x6e, 0x53, 0x3b, 0x7e, 0x7a, 0xdd, 0x70, 0x7d, 0xf2, 0x3b, 0x89, 0xc9, + 0x10, 0x71, 0x31, 0x67, 0xde, 0x4e, 0xb8, 0x23, 0xf9, 0xc6, 0x13, 0x63, 0xb7, 0xcc, 0x0b, 0x11, + 0xca, 0x4d, 0xf9, 0xbf, 0x0b, 0x70, 0xb5, 0x6b, 0x1d, 0x44, 0x7b, 0x76, 0xa1, 0x98, 0xc4, 0x89, + 0x11, 0x54, 0xd6, 0xe2, 0x36, 0xd2, 0x12, 0x76, 0xee, 0xf0, 0x38, 0x74, 0x19, 0xdf, 0xd4, 0x56, + 0x92, 0x53, 0xf2, 0x4e, 0x5e, 0x7b, 0xcc, 0x5f, 0xe1, 0x47, 0x4e, 0x6b, 0x01, 0x1d, 0x00, 0xfd, + 0xf1, 0x9d, 0x82, 0x88, 0x41, 0xeb, 0xc9, 0x34, 0x19, 0x1a, 0xb1, 0xf5, 0x29, 0x7e, 0xd7, 0xd9, + 0x95, 0x3e, 0xde, 0xa7, 0xb6, 0x00, 0x57, 0x13, 0xb1, 0x03, 0xcf, 0x21, 0x24, 0x82, 0x19, 0xa6, + 0x7e, 0xb6, 0xf7, 0xbe, 0x17, 0xf8, 0x9d, 0xf6, 0xcf, 0xa7, 0xd7, 0xff, 0xa0, 0xc0, 0x83, 0x39, + 0xf5, 0x62, 0x45, 0x47, 0x2f, 0x00, 0xc4, 0xd0, 0x44, 0x50, 0xbf, 0x42, 0xec, 0xdc, 0xe1, 0x26, + 0x37, 0x9e, 0x2a, 0xec, 0x71, 0x01, 0x1a, 0xdb, 0xcf, 0xb7, 0x27, 0xdf, 0xc4, 0x80, 0x01, 0x55, + 0xfa, 0xf1, 0xf4, 0xfe, 0x8e, 0xf4, 0x7f, 0x9c, 0x90, 0x6f, 0x1f, 0xa6, 0xd9, 0x0c, 0x50, 0xe9, + 0x44, 0xfb, 0x7e, 0xe0, 0x46, 0xf2, 0x7a, 0x0a, 0xd9, 0x14, 0x19, 0x01, 0x38, 0xd7, 0x87, 0x3f, + 0x3b, 0x2c, 0xbf, 0x7b, 0x92, 0xbc, 0x9f, 0x52, 0xe6, 0x96, 0xca, 0x22, 0x60, 0xcd, 0x42, 0xff, + 0x82, 0xbd, 0x8a, 0x13, 0x9e, 0xbd, 0xaa, 0x26, 0x3c, 0x7b, 0xd5, 0xfa, 0xf3, 0x3e, 0x28, 0xf3, + 0x9c, 0x25, 0x18, 0x67, 0x12, 0x7b, 0x2d, 0xb4, 0xc0, 0x95, 0xe3, 0x3a, 0x18, 0x12, 0x39, 0x49, + 0xfa, 0x8e, 0x93, 0x93, 0xe4, 0x97, 0x20, 0xc7, 0x65, 0x75, 0x0c, 0x2f, 0xc0, 0x6b, 0x47, 0x87, + 0xe5, 0xab, 0xb1, 0x17, 0x80, 0x63, 0xb3, 0xdc, 0x01, 0x39, 0x45, 0xa4, 0xfd, 0x17, 0x03, 0xcf, + 0xe1, 0xbf, 0xb8, 0x0d, 0xc3, 0x68, 0xcc, 0xac, 0x6c, 0x8a, 0xc8, 0x4f, 0x1c, 0x9e, 0x98, 0xa1, + 0xa8, 0xee, 0xea, 0xe9, 0x00, 0x25, 0x99, 0xf5, 0x0f, 0xfa, 0xe0, 0x72, 0xbe, 0xce, 0x45, 0xdd, + 0x16, 0x01, 0xe2, 0x08, 0x97, 0x6e, 0x11, 0x35, 0xf8, 0xed, 0x3c, 0xa5, 0xbb, 0x2a, 0xa2, 0x4d, + 0xe3, 0x63, 0x7b, 0x1f, 0x79, 0xd3, 0x3a, 0x71, 0x9c, 0x62, 0x5c, 0xc0, 0x16, 0xd9, 0x6c, 0x05, + 0xc8, 0xc8, 0x66, 0x2b, 0x60, 0x64, 0x17, 0x66, 0x37, 0x03, 0xf7, 0x89, 0x13, 0xd1, 0x07, 0xf4, + 0x19, 0xbf, 0x2c, 0xb4, 0x24, 0x6e, 0x08, 0xf1, 0xeb, 0xf3, 0xd7, 0x8f, 0x0e, 0xcb, 0xaf, 0xb4, + 0x39, 0x09, 0x66, 0x2c, 0xe3, 0x77, 0x3f, 0xeb, 0xe9, 0x4b, 0x43, 0x79, 0x82, 0xac, 0x7f, 0x57, + 0x80, 0xf3, 0xb8, 0x2d, 0x17, 0x6e, 0x57, 0x59, 0xf8, 0x73, 0x05, 0x56, 0xea, 0x0d, 0x14, 0x63, + 0x11, 0x03, 0x2b, 0x8d, 0x9b, 0xe8, 0xb6, 0x41, 0x46, 0x56, 0x60, 0x4c, 0xfc, 0xc6, 0xef, 0xaf, + 0x1f, 0x0d, 0x82, 0x19, 0x6d, 0xc2, 0xc2, 0xa1, 0xce, 0x5d, 0x45, 0x38, 0xb0, 0x85, 0x30, 0xbc, + 0xb0, 0x69, 0xeb, 0xbc, 0xd6, 0x4f, 0xfb, 0xe0, 0xc2, 0x0e, 0x0d, 0xdc, 0x47, 0xcf, 0x72, 0x1a, + 0xb3, 0x01, 0xd3, 0x12, 0xc4, 0xf3, 0x96, 0x18, 0x9f, 0x18, 0xcf, 0x67, 0x29, 0xab, 0x2a, 0x12, + 0x9f, 0xc8, 0x2f, 0x2e, 0x93, 0xf1, 0x04, 0x21, 0x93, 0x6f, 0xc1, 0x48, 0x22, 0x73, 0x10, 0xf6, + 0xbf, 0xfc, 0x42, 0xe3, 0xae, 0x5a, 0x3e, 0x65, 0x2b, 0x4a, 0xf2, 0x6b, 0xf9, 0x47, 0x55, 0xc2, + 0xf5, 0xd1, 0xcb, 0xff, 0x89, 0x1f, 0x2c, 0xfb, 0x58, 0x1d, 0x0d, 0x9b, 0xf1, 0xc1, 0x2e, 0x9f, + 0xb2, 0xf3, 0x4a, 0xaa, 0x8e, 0xc1, 0x68, 0x05, 0xcf, 0xed, 0x98, 0xe5, 0xfe, 0xbf, 0xfa, 0xe0, + 0x92, 0xbc, 0xf8, 0x93, 0xa3, 0xe6, 0xcf, 0x61, 0x56, 0x82, 0x2a, 0x6d, 0xb6, 0x61, 0xa0, 0x4d, + 0x53, 0xd3, 0x3c, 0xa7, 0xac, 0xd4, 0xb4, 0x23, 0x68, 0x62, 0x65, 0xe7, 0xb1, 0xbf, 0x1c, 0xef, + 0xe7, 0xc7, 0x59, 0x79, 0x9c, 0xd0, 0x0b, 0xa9, 0xcf, 0x99, 0x86, 0x6a, 0x8c, 0xf9, 0xb3, 0x99, + 0xf2, 0x9e, 0x0e, 0xbc, 0xa8, 0xf7, 0x74, 0xf9, 0x54, 0xd2, 0x7f, 0x5a, 0x9d, 0x84, 0xf1, 0x75, + 0xfa, 0x34, 0xd6, 0xfb, 0x5f, 0x2f, 0x24, 0x52, 0x3d, 0xb0, 0x1d, 0x06, 0xcf, 0xf9, 0x50, 0x88, + 0x53, 0x01, 0x61, 0xaa, 0x07, 0x7d, 0x87, 0xc1, 0x49, 0x57, 0x60, 0x98, 0x1f, 0x66, 0x37, 0x8f, + 0x61, 0xe1, 0xab, 0x1b, 0x3c, 0xfc, 0x5a, 0x65, 0x93, 0x1b, 0xfb, 0x82, 0xdf, 0x7a, 0x00, 0x57, + 0x44, 0x8c, 0xb7, 0xd9, 0xf9, 0x58, 0xd0, 0x09, 0x97, 0x2f, 0xcb, 0x81, 0x4b, 0xf7, 0x68, 0x72, + 0xea, 0x31, 0x6e, 0x38, 0x7d, 0x02, 0xa7, 0x0d, 0xb8, 0x92, 0x88, 0xbb, 0x52, 0x35, 0x86, 0x94, + 0xe8, 0x24, 0xb5, 0x75, 0x39, 0xab, 0x08, 0xbd, 0xb2, 0x16, 0xc5, 0xe4, 0xb0, 0x41, 0x7c, 0xc4, + 0x16, 0x9e, 0x60, 0xd6, 0xbb, 0xae, 0x7d, 0xd7, 0x7c, 0xc6, 0xe3, 0xd9, 0x03, 0xe5, 0xca, 0xab, + 0xb0, 0xd6, 0x84, 0x71, 0x16, 0x60, 0x4d, 0xc2, 0xb8, 0x44, 0xb5, 0x68, 0x18, 0x5a, 0xff, 0x79, + 0x10, 0x2c, 0xa1, 0xd8, 0xac, 0x13, 0x7a, 0xa9, 0x8f, 0xdd, 0x54, 0x65, 0xc5, 0x42, 0x75, 0x56, + 0xcf, 0x49, 0x1a, 0x63, 0xf9, 0xc8, 0xc3, 0x7d, 0x5e, 0x23, 0x86, 0x1a, 0x23, 0x2f, 0xd5, 0xfa, + 0xaf, 0x72, 0xa6, 0x49, 0xfe, 0xb1, 0xe1, 0x95, 0xed, 0x9c, 0x69, 0xd2, 0x90, 0x9b, 0x3d, 0x65, + 0xda, 0xe6, 0x91, 0x48, 0xff, 0xf3, 0x1c, 0x89, 0xb0, 0x2f, 0x52, 0x3f, 0x14, 0xd9, 0x36, 0x75, + 0x29, 0xbe, 0x47, 0x79, 0x7a, 0xaf, 0xa3, 0x44, 0xc6, 0x05, 0x0d, 0x62, 0x48, 0x35, 0xc4, 0x10, + 0x17, 0x8a, 0x9a, 0xcf, 0x72, 0x61, 0x9f, 0x36, 0x1e, 0x0b, 0x5f, 0xb1, 0x3c, 0xd0, 0xcd, 0xf2, + 0x99, 0xf3, 0xfc, 0xd4, 0xfc, 0x3b, 0xe7, 0x88, 0x7a, 0x83, 0xb1, 0xea, 0x19, 0x23, 0x92, 0x62, + 0xc9, 0x8f, 0x60, 0x4a, 0x75, 0x75, 0x22, 0x44, 0x6b, 0x6c, 0xfe, 0x95, 0x38, 0x95, 0xe9, 0xc1, + 0x23, 0xe7, 0xe6, 0x93, 0x3b, 0x37, 0x33, 0x68, 0x79, 0x22, 0x82, 0x86, 0x44, 0x68, 0xf1, 0x59, + 0xfa, 0x41, 0x57, 0x06, 0x23, 0xf9, 0x02, 0xa6, 0x6b, 0xb5, 0x0d, 0x7e, 0x99, 0xc3, 0x96, 0x07, + 0xfc, 0xf6, 0xaa, 0x08, 0xd8, 0xc2, 0xee, 0x0e, 0x43, 0xbf, 0x2e, 0x2e, 0x81, 0xe8, 0x61, 0x01, + 0x7a, 0x2a, 0x86, 0x2c, 0x11, 0xfa, 0x49, 0xf9, 0xdf, 0x53, 0x77, 0x15, 0xd8, 0x56, 0xc4, 0x6d, + 0x51, 0x71, 0xe9, 0x48, 0x0e, 0xec, 0x9c, 0x53, 0xbe, 0xc2, 0xb7, 0x7c, 0xca, 0xf7, 0xbb, 0x7d, + 0xf2, 0x86, 0x46, 0xfa, 0xa0, 0xf5, 0xc4, 0x87, 0x7d, 0x99, 0x2d, 0x38, 0xd6, 0x3a, 0x9d, 0x59, + 0x39, 0x52, 0x95, 0x47, 0xa5, 0x2a, 0x59, 0xd9, 0xa4, 0x3a, 0x76, 0x88, 0x11, 0xc6, 0xe9, 0x29, + 0xee, 0x8a, 0x34, 0xae, 0xe4, 0x39, 0x5c, 0xff, 0x8b, 0x9f, 0xc3, 0xfd, 0x18, 0x66, 0xe4, 0xd5, + 0xa8, 0x05, 0xea, 0x45, 0x34, 0x90, 0x27, 0xf6, 0x93, 0x71, 0xd2, 0x37, 0x4c, 0xef, 0x57, 0x84, + 0xfe, 0x8a, 0xbd, 0x2e, 0x3c, 0x3a, 0xec, 0x4f, 0x72, 0xd9, 0x0c, 0x88, 0xe3, 0x77, 0xde, 0x8c, + 0xf0, 0xb7, 0xcb, 0xac, 0xba, 0xdc, 0xcf, 0xe2, 0xca, 0x54, 0x7d, 0xb6, 0x0e, 0xb2, 0x16, 0xe0, + 0xbc, 0x59, 0xfc, 0x26, 0x0d, 0x0e, 0x5c, 0xdc, 0x7b, 0xd7, 0x68, 0x24, 0x0b, 0x2d, 0xc4, 0x85, + 0x12, 0x3d, 0xa0, 0x5a, 0x98, 0x81, 0xff, 0xb7, 0x0f, 0xca, 0x99, 0x8d, 0xa8, 0x84, 0xa1, 0xbb, + 0xe7, 0x61, 0x06, 0x8d, 0x0b, 0x30, 0xf0, 0xc0, 0xf5, 0x9a, 0xba, 0x21, 0xf9, 0xd8, 0xf5, 0x9a, + 0x36, 0x42, 0x99, 0x0d, 0x52, 0xeb, 0xec, 0x22, 0x81, 0x66, 0x22, 0x87, 0x9d, 0xdd, 0x3a, 0x23, + 0xd2, 0x6d, 0x10, 0x41, 0x46, 0xae, 0xc1, 0xb0, 0xcc, 0xb6, 0xd6, 0x1f, 0x7b, 0xcf, 0x64, 0x9a, + 0x35, 0x89, 0x23, 0x1f, 0xc1, 0xc8, 0x1a, 0x8d, 0x9c, 0xa6, 0x13, 0x39, 0x62, 0xec, 0xc8, 0x87, + 0x30, 0x24, 0xb8, 0x5a, 0x14, 0x2b, 0xf4, 0xc8, 0x81, 0x80, 0xd8, 0x8a, 0x05, 0x15, 0xe8, 0x86, + 0xed, 0x96, 0xf3, 0x4c, 0x05, 0x93, 0x32, 0x05, 0xc6, 0x20, 0xf2, 0x8e, 0x19, 0x72, 0x11, 0x1f, + 0x9f, 0x65, 0x2a, 0x24, 0x0e, 0xc8, 0x58, 0xc6, 0x30, 0x90, 0x58, 0xd5, 0x22, 0x9b, 0xa0, 0x95, + 0xc9, 0x6d, 0x50, 0xda, 0x26, 0xa3, 0xf5, 0xdf, 0x00, 0xce, 0x6c, 0x3a, 0x7b, 0xae, 0xc7, 0x76, + 0x14, 0x36, 0x0d, 0xfd, 0x4e, 0xd0, 0xa0, 0xa4, 0x02, 0x93, 0x66, 0x00, 0x77, 0x8f, 0xf0, 0x74, + 0xb6, 0x69, 0x32, 0x61, 0x64, 0x1e, 0x46, 0xd5, 0xa5, 0x71, 0xb1, 0xd3, 0xc9, 0xb8, 0x4c, 0xbe, + 0x7c, 0xca, 0x8e, 0xc9, 0xc8, 0x7b, 0xc6, 0xe1, 0xe3, 0x69, 0x95, 0xff, 0x00, 0x69, 0xe7, 0x79, + 0x84, 0xad, 0xe7, 0x37, 0xcd, 0xdd, 0x1a, 0x3f, 0x61, 0xfb, 0x41, 0xea, 0x3c, 0x72, 0xd0, 0xa8, + 0x71, 0xca, 0x29, 0x8b, 0x1b, 0xd5, 0xdc, 0xec, 0xf5, 0x19, 0x27, 0x95, 0x5f, 0xc2, 0xd8, 0x83, + 0xce, 0x2e, 0x95, 0x27, 0xaf, 0x43, 0x62, 0xf3, 0x96, 0xbc, 0x96, 0x20, 0xf0, 0x3b, 0x6f, 0xf2, + 0xaf, 0xf8, 0x71, 0x67, 0x97, 0xa6, 0x9f, 0x45, 0x60, 0xab, 0xa6, 0x26, 0x8c, 0xec, 0x43, 0x31, + 0x79, 0x83, 0x40, 0x74, 0x69, 0x97, 0x7b, 0x0f, 0x98, 0xe8, 0x47, 0x7b, 0x7c, 0x81, 0xc7, 0x35, + 0x1b, 0x85, 0xa4, 0xa4, 0x92, 0x1f, 0xc3, 0x4c, 0xa6, 0x4b, 0x5c, 0xdd, 0x81, 0xec, 0xee, 0x6d, + 0xc7, 0x25, 0x28, 0xa1, 0x35, 0x79, 0xe1, 0xd2, 0x28, 0x39, 0xbb, 0x14, 0xd2, 0x84, 0xd3, 0x89, + 0xc8, 0x78, 0xf1, 0xc2, 0x4c, 0x7e, 0xac, 0x3d, 0xee, 0x9a, 0x64, 0x92, 0xe6, 0xcc, 0xb2, 0x92, + 0x22, 0xc9, 0x2a, 0x8c, 0x2a, 0x5f, 0x94, 0xc8, 0xcd, 0x97, 0xe5, 0x77, 0x2b, 0x1d, 0x1d, 0x96, + 0xa7, 0x63, 0xbf, 0x9b, 0x21, 0x33, 0x16, 0x40, 0x7e, 0x19, 0xae, 0xa8, 0x21, 0xba, 0x11, 0x64, + 0x7b, 0x28, 0xc5, 0xe3, 0x0e, 0x37, 0x92, 0x23, 0x3c, 0x8f, 0x7e, 0xe7, 0x4e, 0xb5, 0xaf, 0x54, + 0x58, 0x3e, 0x65, 0xf7, 0x16, 0x4d, 0x7e, 0xb5, 0x00, 0x67, 0x73, 0x4a, 0x1d, 0xc7, 0x52, 0x7b, + 0xba, 0x8d, 0xd1, 0xf2, 0xc4, 0x7b, 0x7f, 0x6e, 0x33, 0xbe, 0x1f, 0x2b, 0xfd, 0xc7, 0x46, 0xbb, + 0x73, 0x4a, 0x22, 0xbf, 0x53, 0xe8, 0x39, 0x4b, 0x63, 0x2e, 0xba, 0xb1, 0xf9, 0x57, 0xbb, 0x4d, + 0x61, 0x31, 0x75, 0xf5, 0xf6, 0xd1, 0x61, 0xf9, 0x0d, 0x95, 0xd0, 0xac, 0x81, 0x54, 0xf2, 0xce, + 0x6e, 0xdd, 0x51, 0x74, 0x46, 0xed, 0x7a, 0x2e, 0x14, 0x6f, 0xc0, 0x10, 0xfa, 0x99, 0xc2, 0xd2, + 0x04, 0x5a, 0x62, 0x98, 0x86, 0x0b, 0xbd, 0x51, 0xfa, 0xde, 0x4b, 0xd0, 0x90, 0x65, 0x66, 0xd1, + 0xe0, 0xde, 0x4f, 0x5a, 0x20, 0x22, 0x69, 0x9f, 0xb0, 0x8a, 0x39, 0x4a, 0x66, 0xd3, 0x31, 0x1e, + 0x1b, 0x31, 0xd9, 0xaa, 0x00, 0x23, 0x81, 0x98, 0x3c, 0xef, 0x0f, 0x8c, 0x0c, 0x14, 0x07, 0xf9, + 0xf7, 0x2d, 0x6f, 0x86, 0xfc, 0xfa, 0x08, 0xbf, 0x46, 0xbe, 0xed, 0xb9, 0x8f, 0xdc, 0x78, 0x9e, + 0xd5, 0x3d, 0xd4, 0xf1, 0xab, 0x5f, 0xc2, 0x7e, 0xcc, 0x79, 0xdf, 0x4b, 0x39, 0xb3, 0xfb, 0x7a, + 0x3a, 0xb3, 0xdf, 0xd4, 0x8e, 0x7d, 0xb5, 0xe4, 0xbc, 0xdc, 0x4e, 0x30, 0x9d, 0xc7, 0xf1, 0x79, + 0xf0, 0xd7, 0x30, 0x84, 0xf9, 0x74, 0xf9, 0x99, 0xfa, 0xd8, 0xfc, 0x4d, 0xd1, 0x9d, 0x5d, 0xaa, + 0xcf, 0x13, 0xf0, 0x8a, 0xd4, 0x10, 0x5c, 0xe3, 0x08, 0x30, 0x34, 0x8e, 0x10, 0xb2, 0x05, 0x53, + 0x9b, 0x6c, 0xdb, 0xca, 0xef, 0x27, 0xb4, 0x03, 0xe1, 0xe0, 0xe3, 0xae, 0x43, 0xdc, 0x36, 0xb7, + 0x25, 0xba, 0x4e, 0x15, 0x5e, 0xdf, 0x39, 0x66, 0xb0, 0x93, 0x25, 0x98, 0xac, 0x51, 0x27, 0x68, + 0xec, 0x3f, 0xa0, 0xcf, 0x98, 0xc9, 0x60, 0x3c, 0x74, 0x13, 0x22, 0x86, 0xb5, 0x17, 0x51, 0x7a, + 0x9c, 0x94, 0xc9, 0x44, 0x3e, 0x85, 0xa1, 0x9a, 0x1f, 0x44, 0xd5, 0x67, 0x62, 0xee, 0x95, 0xa7, + 0xae, 0x1c, 0x58, 0x3d, 0x27, 0x1f, 0xfb, 0x09, 0xfd, 0x20, 0xaa, 0xef, 0x1a, 0x79, 0xdd, 0x38, + 0x09, 0x79, 0x06, 0xd3, 0xe6, 0xbc, 0x27, 0xc2, 0xe6, 0x47, 0x84, 0xa9, 0x92, 0x35, 0xb9, 0x72, + 0x92, 0xea, 0x75, 0x21, 0xfd, 0x72, 0x72, 0x76, 0x7d, 0x84, 0x78, 0x7d, 0x7f, 0x9f, 0xc5, 0x4f, + 0xd6, 0xf0, 0x95, 0x24, 0xde, 0xa2, 0x4a, 0xc8, 0xc3, 0xed, 0x47, 0xe3, 0xcc, 0x81, 0x1d, 0x9c, + 0x3b, 0x51, 0x13, 0x4e, 0x98, 0x7c, 0x5a, 0xcb, 0x4e, 0xb1, 0x92, 0x4d, 0x38, 0xb3, 0x1d, 0xd2, + 0xcd, 0x80, 0x3e, 0x71, 0xe9, 0x53, 0x29, 0x0f, 0xe2, 0x34, 0x6b, 0x4c, 0x5e, 0x9b, 0x63, 0xb3, + 0x04, 0xa6, 0x99, 0xc9, 0x7b, 0x00, 0x9b, 0xae, 0xe7, 0xd1, 0x26, 0x1e, 0xdd, 0x8f, 0xa1, 0x28, + 0x3c, 0x96, 0x68, 0x23, 0xb4, 0xee, 0x7b, 0x2d, 0x5d, 0xa5, 0x1a, 0x31, 0xa9, 0xc2, 0xc4, 0x8a, + 0xd7, 0x68, 0x75, 0x44, 0x88, 0x4d, 0x88, 0xf3, 0x9e, 0x48, 0xff, 0xe8, 0x72, 0x44, 0x3d, 0xf5, + 0x91, 0x9b, 0x2c, 0xe4, 0x01, 0x10, 0x01, 0x10, 0xa3, 0xd6, 0xd9, 0x6d, 0x51, 0xf1, 0xb9, 0xa3, + 0xbb, 0x51, 0x0a, 0xc2, 0xe1, 0x6e, 0x64, 0x55, 0x4c, 0xb1, 0xcd, 0xbd, 0x07, 0x63, 0xda, 0x98, + 0xcf, 0xc8, 0x75, 0x32, 0xad, 0xe7, 0x3a, 0x19, 0xd5, 0x73, 0x9a, 0xfc, 0xd3, 0x02, 0x5c, 0xc8, + 0xfe, 0x96, 0x84, 0xa5, 0xb1, 0x01, 0xa3, 0x0a, 0xa8, 0x6e, 0xb7, 0x49, 0xf3, 0x39, 0xb1, 0x51, + 0xe3, 0x1f, 0xb4, 0x9c, 0x79, 0xf4, 0xd6, 0xc7, 0x32, 0x9e, 0xe3, 0x4c, 0xeb, 0x6f, 0x8e, 0xc0, + 0x34, 0xde, 0xe2, 0x48, 0xce, 0x53, 0x9f, 0x60, 0xce, 0x22, 0x84, 0x69, 0x47, 0x34, 0xc2, 0x5b, + 0xcb, 0xe1, 0xc9, 0xec, 0x7d, 0x06, 0x03, 0x79, 0x5b, 0x8f, 0x2b, 0xea, 0xd3, 0x5e, 0x65, 0x92, + 0x40, 0xbd, 0x09, 0x71, 0xc0, 0xd1, 0xeb, 0x46, 0x58, 0xcb, 0xb1, 0x27, 0xbd, 0x81, 0xe3, 0x4e, + 0x7a, 0xdb, 0x6a, 0xd2, 0xe3, 0xb9, 0x70, 0x5e, 0xd3, 0x26, 0xbd, 0x97, 0x3f, 0xdb, 0x0d, 0xbd, + 0xec, 0xd9, 0x6e, 0xf8, 0xc5, 0x66, 0xbb, 0x91, 0xe7, 0x9c, 0xed, 0xee, 0xc2, 0xe4, 0x3a, 0xa5, + 0x4d, 0xed, 0xb0, 0x71, 0x34, 0x5e, 0x3d, 0x3d, 0x8a, 0x6e, 0xe4, 0xac, 0x13, 0xc7, 0x04, 0x57, + 0xee, 0xac, 0x09, 0x7f, 0x39, 0xb3, 0xe6, 0xd8, 0x4b, 0x9e, 0x35, 0xc7, 0x5f, 0x64, 0xd6, 0x4c, + 0x4d, 0x7d, 0x13, 0x27, 0x9e, 0xfa, 0x5e, 0x64, 0xb6, 0xfa, 0x18, 0xc3, 0x72, 0x6b, 0xb5, 0x65, + 0x11, 0x81, 0xa5, 0x85, 0x3c, 0x2d, 0xfb, 0xa1, 0xbc, 0xb5, 0x80, 0x7f, 0x33, 0x18, 0xbe, 0x7d, + 0x21, 0x8c, 0x7b, 0xf6, 0xb7, 0x55, 0xc5, 0x60, 0x5c, 0x9d, 0x5f, 0xdd, 0xee, 0x19, 0x16, 0x57, + 0x83, 0xc5, 0x1c, 0x97, 0xb4, 0xf6, 0x6c, 0x89, 0xb7, 0xfe, 0xa4, 0xc0, 0x0f, 0xf6, 0xff, 0x7f, + 0x9c, 0x2a, 0x5f, 0xe4, 0xb0, 0xfd, 0xd7, 0xe2, 0x94, 0x21, 0x22, 0xbd, 0x49, 0xe0, 0x34, 0x1e, + 0xc7, 0xd1, 0x0e, 0xdf, 0x67, 0xdf, 0xb9, 0x8e, 0xc0, 0xec, 0xd0, 0xb1, 0x49, 0x6b, 0x22, 0x77, + 0xee, 0xc8, 0x09, 0x40, 0x64, 0x4e, 0xe1, 0x60, 0x73, 0x02, 0xd0, 0x19, 0x30, 0xde, 0xf4, 0xb4, + 0x65, 0xf3, 0x8c, 0x17, 0x99, 0x35, 0x78, 0x27, 0x9d, 0xb3, 0x01, 0x6d, 0xa6, 0x38, 0x67, 0x83, + 0xae, 0xc6, 0x38, 0x7b, 0xc3, 0x36, 0x9c, 0xb7, 0xe9, 0x81, 0xff, 0x84, 0xbe, 0x5c, 0xb1, 0x5f, + 0xc1, 0x39, 0x53, 0x20, 0xbf, 0xdd, 0xc7, 0x9f, 0xa2, 0xf8, 0x38, 0xfb, 0x01, 0x0b, 0xc1, 0xc0, + 0x1f, 0xb0, 0xe0, 0x79, 0xf0, 0xd9, 0x9f, 0xfa, 0xba, 0x81, 0x38, 0xcb, 0x87, 0x0b, 0xa6, 0xf0, + 0x4a, 0xb3, 0x89, 0x6f, 0xe0, 0x36, 0xdc, 0xb6, 0xe3, 0x45, 0x64, 0x03, 0xc6, 0xb4, 0x9f, 0x09, + 0x8f, 0x86, 0x86, 0x11, 0x7b, 0x9a, 0x18, 0x60, 0xe4, 0x11, 0x8e, 0xc1, 0x16, 0x85, 0x72, 0x52, + 0x3d, 0x4c, 0x65, 0x7a, 0x99, 0x55, 0x98, 0xd0, 0x7e, 0x2a, 0xb7, 0x3f, 0x7e, 0xfc, 0x5a, 0x09, + 0xa6, 0xc2, 0x4c, 0x16, 0xab, 0x01, 0x73, 0x59, 0x4a, 0xe3, 0x09, 0xe7, 0xc9, 0x52, 0x9c, 0x4f, + 0xae, 0x77, 0xc4, 0xea, 0xe9, 0xbc, 0x5c, 0x72, 0xd6, 0xdf, 0x1d, 0x80, 0xf3, 0xa2, 0x33, 0x5e, + 0x66, 0x8f, 0x93, 0x1f, 0xc0, 0x98, 0xd6, 0xc7, 0x42, 0xe9, 0x97, 0xe5, 0xdd, 0xbc, 0xbc, 0xb1, + 0xc0, 0x3d, 0x2f, 0x1d, 0x04, 0xd4, 0x13, 0xdd, 0xbd, 0x7c, 0xca, 0xd6, 0x45, 0x92, 0x16, 0x4c, + 0x9a, 0x1d, 0x2d, 0x9c, 0x4f, 0x57, 0x33, 0x0b, 0x31, 0x49, 0x65, 0x36, 0xfa, 0x66, 0x3d, 0xb3, + 0xbb, 0x97, 0x4f, 0xd9, 0x09, 0xd9, 0xe4, 0x1b, 0x38, 0x93, 0xea, 0x65, 0xe1, 0x59, 0x7c, 0x35, + 0xb3, 0xc0, 0x14, 0x35, 0x3f, 0xd2, 0x08, 0x10, 0x9c, 0x5b, 0x6c, 0xba, 0x10, 0xd2, 0x84, 0x71, + 0xbd, 0xe3, 0x85, 0x77, 0xec, 0x4a, 0x17, 0x55, 0x72, 0x42, 0xbe, 0xb9, 0x13, 0xba, 0xc4, 0xbe, + 0x7f, 0x66, 0x1e, 0xd3, 0x18, 0xc4, 0x23, 0x30, 0xc4, 0x7f, 0x5b, 0xbf, 0x5b, 0x80, 0xf3, 0x9b, + 0x01, 0x0d, 0xa9, 0xd7, 0xa0, 0xc6, 0x2d, 0x87, 0x17, 0x1c, 0x11, 0x79, 0x27, 0x24, 0x7d, 0x2f, + 0x7c, 0x42, 0x62, 0xfd, 0xdb, 0x02, 0x94, 0xb2, 0xaa, 0x5c, 0xa3, 0x5e, 0x93, 0x6c, 0x42, 0x31, + 0xd9, 0x06, 0xf1, 0xc5, 0x58, 0x2a, 0x99, 0x78, 0x6e, 0x6b, 0x97, 0x4f, 0xd9, 0x29, 0x6e, 0xb2, + 0x0e, 0x67, 0x34, 0x98, 0x38, 0xa1, 0xe8, 0x3b, 0xce, 0x09, 0x05, 0xeb, 0xe1, 0x14, 0xab, 0x7e, + 0xc0, 0xb3, 0x8c, 0xab, 0xee, 0xa2, 0x7f, 0xe0, 0xb8, 0x1e, 0xdb, 0x44, 0x6b, 0xe9, 0xea, 0x20, + 0x86, 0x0a, 0xb5, 0xf3, 0x23, 0x0b, 0x84, 0xca, 0x0b, 0x5f, 0x8a, 0xc4, 0xfa, 0x10, 0x57, 0x07, + 0xe1, 0xa6, 0xe4, 0x57, 0xec, 0x95, 0xb0, 0xcb, 0x30, 0xb8, 0xb5, 0x5a, 0x5b, 0xa8, 0x88, 0x0b, + 0xfb, 0x3c, 0xcd, 0x4b, 0x2b, 0xac, 0x37, 0x1c, 0x9b, 0x23, 0xac, 0x0f, 0x80, 0xdc, 0xa3, 0x91, + 0x78, 0xcd, 0x42, 0xf1, 0x5d, 0x83, 0x61, 0x01, 0x12, 0x9c, 0xe8, 0x7c, 0x17, 0x6f, 0x63, 0xd8, + 0x12, 0x67, 0x6d, 0x4a, 0x1b, 0xa4, 0x45, 0x9d, 0x50, 0x5b, 0xf4, 0xdf, 0x85, 0x91, 0x40, 0xc0, + 0xc4, 0x9a, 0x3f, 0xa9, 0x1e, 0x2b, 0x42, 0x30, 0x3f, 0x14, 0x92, 0x34, 0xb6, 0xfa, 0xcb, 0x5a, + 0xc5, 0x94, 0x4c, 0x1b, 0x2b, 0x8b, 0x0b, 0x4c, 0xab, 0x42, 0x59, 0xb2, 0x3b, 0x6e, 0xe1, 0x1d, + 0x8f, 0x88, 0xea, 0xd7, 0xf5, 0x51, 0x35, 0x38, 0x81, 0x88, 0x44, 0x64, 0x1a, 0x89, 0xf5, 0xa6, + 0x4a, 0xf0, 0x94, 0x21, 0x2d, 0xef, 0xd1, 0x9d, 0x75, 0x4c, 0x5d, 0x75, 0x0f, 0xc3, 0xd9, 0x5e, + 0x46, 0x25, 0x1c, 0x98, 0xe3, 0x5b, 0x08, 0xd6, 0x2a, 0xf1, 0xe4, 0xa8, 0xaf, 0xa6, 0xdd, 0x05, + 0x18, 0x55, 0x30, 0x75, 0x36, 0xcd, 0x75, 0x65, 0xd0, 0xef, 0xbc, 0xc9, 0x33, 0x1b, 0x34, 0x94, + 0x80, 0x98, 0x8f, 0x15, 0xc1, 0xbf, 0xe9, 0x6f, 0xb9, 0x88, 0x90, 0x06, 0xd1, 0xb7, 0x5a, 0x44, + 0x9c, 0xdb, 0xec, 0x24, 0x45, 0x18, 0xf4, 0x3b, 0xf3, 0xc7, 0x51, 0xd4, 0xb7, 0x5c, 0x04, 0x53, + 0xd4, 0xb7, 0x57, 0x04, 0x95, 0x49, 0xe0, 0xf8, 0x20, 0x4d, 0x15, 0xb2, 0x94, 0x2e, 0x44, 0xfa, + 0xee, 0x13, 0x1c, 0x5d, 0xfb, 0x83, 0xc2, 0x05, 0xae, 0xac, 0x9f, 0x43, 0x31, 0x4c, 0x61, 0xdf, + 0x6e, 0x31, 0xff, 0xb0, 0xc0, 0x53, 0xd2, 0xd5, 0x36, 0xb4, 0xc7, 0x7e, 0xbd, 0x47, 0xbe, 0x16, + 0x3a, 0xa3, 0x7d, 0xed, 0xda, 0x51, 0x26, 0x86, 0xce, 0x38, 0x9d, 0x68, 0x5f, 0xa5, 0x6c, 0xc7, + 0x73, 0xcd, 0x24, 0x35, 0x79, 0x0f, 0x26, 0x34, 0x90, 0xda, 0x09, 0xf2, 0x47, 0x75, 0x74, 0x76, + 0xb7, 0x69, 0x9b, 0x94, 0xd6, 0x5f, 0x14, 0x60, 0x2a, 0xe3, 0x19, 0x7a, 0x74, 0x94, 0xa0, 0x85, + 0xa5, 0x26, 0x2a, 0xf1, 0x0c, 0x1e, 0x66, 0xc7, 0x31, 0xd6, 0x5f, 0x45, 0x88, 0xcf, 0x89, 0x68, + 0x4f, 0xe6, 0xf7, 0x69, 0x8f, 0x3b, 0x66, 0x3f, 0x93, 0xaf, 0x93, 0x93, 0x10, 0x20, 0xae, 0x89, + 0x70, 0x49, 0xd7, 0xd8, 0x76, 0x59, 0x7b, 0x6f, 0xff, 0xa5, 0x3c, 0xf8, 0xaf, 0x15, 0x63, 0xfd, + 0x5a, 0x1f, 0x9c, 0xcd, 0x68, 0x7f, 0x8d, 0x46, 0x7f, 0x19, 0x2a, 0x78, 0x02, 0x63, 0x71, 0x65, + 0xc2, 0x52, 0x3f, 0x7a, 0x6e, 0xb6, 0xf0, 0xf5, 0x8b, 0x58, 0x07, 0xe1, 0x4b, 0x51, 0x82, 0x5e, + 0x90, 0xf5, 0x87, 0x7d, 0x70, 0x76, 0xbb, 0x1d, 0xe2, 0x0d, 0xc8, 0x15, 0xef, 0x09, 0xf5, 0x22, + 0x3f, 0x78, 0x86, 0xb7, 0xb6, 0xc8, 0xdb, 0x30, 0xb8, 0x4c, 0x5b, 0x2d, 0x5f, 0x8c, 0xff, 0x8b, + 0x32, 0x7a, 0x29, 0x49, 0x8d, 0x44, 0xcb, 0xa7, 0x6c, 0x4e, 0x4d, 0xde, 0x83, 0xd1, 0x65, 0xea, + 0x04, 0xd1, 0x2e, 0x75, 0xa4, 0x39, 0x24, 0x9f, 0xfa, 0xd1, 0x58, 0x04, 0xc1, 0xf2, 0x29, 0x3b, + 0xa6, 0x26, 0xf3, 0x30, 0xb0, 0xe9, 0x7b, 0x7b, 0x2a, 0xdb, 0x43, 0x4e, 0x81, 0x8c, 0x66, 0xf9, + 0x94, 0x8d, 0xb4, 0x64, 0x0d, 0x26, 0x2a, 0x7b, 0xd4, 0x8b, 0x12, 0x07, 0xf2, 0xd7, 0xf2, 0x98, + 0x0d, 0xe2, 0xe5, 0x53, 0xb6, 0xc9, 0x4d, 0x3e, 0x80, 0xe1, 0x7b, 0xbe, 0xdf, 0xdc, 0x7d, 0x26, + 0x73, 0x96, 0x94, 0xf3, 0x04, 0x09, 0xb2, 0xe5, 0x53, 0xb6, 0xe4, 0xa8, 0x0e, 0x42, 0xff, 0x5a, + 0xb8, 0x67, 0x1d, 0x16, 0xa0, 0xb4, 0xe8, 0x3f, 0xf5, 0x32, 0xb5, 0xfa, 0x3d, 0x53, 0xab, 0x52, + 0x7c, 0x06, 0x7d, 0x42, 0xaf, 0x6f, 0xc1, 0xc0, 0xa6, 0xeb, 0xed, 0x25, 0xb6, 0x82, 0x19, 0x7c, + 0x8c, 0x0a, 0xd5, 0xe3, 0x7a, 0x7b, 0x64, 0x55, 0xee, 0xef, 0x85, 0x1f, 0xb3, 0xdf, 0x30, 0x2a, + 0x32, 0xb8, 0x75, 0xea, 0x78, 0x1f, 0xcf, 0x7f, 0xcb, 0x06, 0xbe, 0x0e, 0xb3, 0x39, 0xe5, 0x6a, + 0x01, 0x26, 0x03, 0xb8, 0xb1, 0x79, 0x0d, 0x66, 0x32, 0xfb, 0x2f, 0x45, 0xf8, 0xcf, 0xb3, 0x06, + 0x22, 0x6f, 0x79, 0x29, 0x8e, 0xca, 0xe0, 0x7e, 0x25, 0x15, 0x88, 0x31, 0xa7, 0x7d, 0xa8, 0x32, + 0x39, 0x91, 0xfc, 0x1e, 0x77, 0xb4, 0x64, 0x70, 0xfc, 0x73, 0x7a, 0xff, 0x05, 0x3e, 0x1a, 0x25, + 0x8b, 0x95, 0xb9, 0xec, 0x87, 0x91, 0xa7, 0x22, 0xe3, 0x6d, 0xf5, 0x9b, 0xdc, 0x80, 0xa2, 0x7c, + 0xef, 0x46, 0x3c, 0xac, 0x15, 0x88, 0xf0, 0x8e, 0x14, 0x9c, 0xbc, 0x0b, 0xb3, 0x49, 0x98, 0x6c, + 0x25, 0xbf, 0x81, 0x9a, 0x87, 0xb6, 0xfe, 0xb8, 0x0f, 0xf3, 0xf5, 0x77, 0x19, 0xd7, 0x4c, 0xbb, + 0x1b, 0x35, 0x19, 0xe7, 0xb3, 0x51, 0x23, 0x17, 0x60, 0x74, 0xa3, 0x66, 0x3c, 0x24, 0x68, 0xc7, + 0x00, 0x56, 0x6d, 0xd6, 0x84, 0x4a, 0xd0, 0xd8, 0x77, 0x23, 0xda, 0x88, 0x3a, 0x81, 0x0c, 0xfc, + 0x49, 0xc1, 0x89, 0x05, 0xe3, 0xf7, 0x5a, 0xee, 0x6e, 0x43, 0x0a, 0xe3, 0x2a, 0x30, 0x60, 0xe4, + 0x55, 0x98, 0x5c, 0xf1, 0xc2, 0xc8, 0x69, 0xb5, 0xd6, 0x68, 0xb4, 0xef, 0x37, 0xc5, 0x33, 0xc9, + 0x76, 0x02, 0xca, 0xca, 0x5d, 0xf0, 0xbd, 0xc8, 0x71, 0x3d, 0x1a, 0xd8, 0x1d, 0x2f, 0x72, 0x0f, + 0xa8, 0x68, 0x7b, 0x0a, 0x4e, 0xde, 0x82, 0x19, 0x05, 0xdb, 0x08, 0x1a, 0xfb, 0x34, 0x8c, 0x02, + 0x7c, 0x5e, 0x14, 0x63, 0xe0, 0xec, 0x6c, 0x24, 0x96, 0xd0, 0xf2, 0x3b, 0xcd, 0x25, 0xef, 0x89, + 0x1b, 0xf8, 0xfc, 0x38, 0x7a, 0x44, 0x94, 0x90, 0x80, 0x5b, 0xbf, 0x3d, 0x92, 0xf9, 0xd9, 0xbe, + 0xc8, 0x18, 0xfc, 0x02, 0xc6, 0x17, 0x9c, 0xb6, 0xb3, 0xeb, 0xb6, 0xdc, 0xc8, 0x55, 0xef, 0x30, + 0xbe, 0xdd, 0xe3, 0x9b, 0x97, 0x2f, 0x20, 0xd1, 0xa6, 0xce, 0x6c, 0x1b, 0xa2, 0xe6, 0xfe, 0x7c, + 0x08, 0x66, 0x32, 0xe9, 0xc8, 0x75, 0xf1, 0x60, 0xa3, 0x9a, 0x57, 0xc5, 0x6b, 0x80, 0x76, 0x12, + 0xcc, 0xfa, 0x12, 0x41, 0x0b, 0x2d, 0xea, 0x78, 0x1d, 0xf1, 0x16, 0xa0, 0x6d, 0xc0, 0x58, 0x5f, + 0xb2, 0x7d, 0x83, 0x26, 0x0c, 0x2f, 0x36, 0xd8, 0x09, 0x28, 0xc6, 0x8d, 0x75, 0xa2, 0x7d, 0x29, + 0x6a, 0x80, 0x5f, 0xc1, 0xd5, 0x40, 0x4c, 0xd2, 0xba, 0xdf, 0xa4, 0x9a, 0xa4, 0x41, 0x2e, 0xc9, + 0x84, 0x32, 0x49, 0x0c, 0x22, 0x25, 0x0d, 0x71, 0x49, 0x1a, 0x88, 0xbc, 0x02, 0x13, 0x95, 0x76, + 0x5b, 0x13, 0x84, 0x8f, 0x00, 0xda, 0x26, 0x90, 0x5c, 0x02, 0xa8, 0xb4, 0xdb, 0x52, 0x0c, 0x3e, + 0xf0, 0x67, 0x6b, 0x10, 0x72, 0x33, 0x4e, 0xb9, 0xa8, 0x89, 0xc2, 0xa3, 0x0a, 0x3b, 0x03, 0xc3, + 0xf4, 0xaa, 0xf2, 0xd3, 0x09, 0xa1, 0xc0, 0xf5, 0x9a, 0x00, 0x93, 0x0f, 0xe1, 0x5c, 0x22, 0xf4, + 0x44, 0x2b, 0x00, 0x8f, 0x11, 0xec, 0x7c, 0x02, 0xf2, 0x0e, 0x9c, 0x4d, 0x20, 0x65, 0x71, 0x78, + 0x62, 0x60, 0xe7, 0x60, 0xc9, 0xfb, 0x50, 0x4a, 0xa4, 0x55, 0x88, 0x0b, 0xc5, 0xd3, 0x01, 0x3b, + 0x17, 0xcf, 0xbe, 0xae, 0xc4, 0xfd, 0x4c, 0x51, 0x24, 0x1e, 0x84, 0xda, 0xd9, 0x48, 0xb2, 0x0c, + 0xe5, 0xcc, 0x70, 0x1e, 0xad, 0x60, 0x7c, 0xb8, 0xd0, 0xee, 0x45, 0x46, 0xaa, 0x70, 0x21, 0x93, + 0x44, 0x56, 0x03, 0x9f, 0x33, 0xb4, 0xbb, 0xd2, 0x90, 0x79, 0x98, 0x8e, 0xc3, 0x9a, 0xb4, 0x2a, + 0xe0, 0x4b, 0x86, 0x76, 0x26, 0x8e, 0xbc, 0x61, 0x26, 0xcf, 0xe0, 0x85, 0xe1, 0x43, 0x86, 0x76, + 0x1a, 0x61, 0x1d, 0x15, 0xe0, 0x42, 0xe6, 0x42, 0x29, 0xf7, 0xf3, 0x73, 0xc9, 0x8d, 0xa3, 0x36, + 0x17, 0xdc, 0x10, 0xb1, 0x8a, 0xdc, 0x0f, 0x2d, 0x63, 0xc1, 0x91, 0x9f, 0x8b, 0x7a, 0x10, 0x47, + 0x2e, 0xde, 0x53, 0xe7, 0x8e, 0xfd, 0xe8, 0xc9, 0xb8, 0x95, 0xdc, 0x40, 0x65, 0x14, 0xae, 0x9f, + 0x3f, 0xca, 0x93, 0xc6, 0x17, 0x39, 0xe2, 0xf9, 0xe3, 0x02, 0x94, 0x7b, 0xec, 0x0f, 0x54, 0x9b, + 0x0a, 0xc7, 0x68, 0xd3, 0x7d, 0xd5, 0x26, 0x7e, 0x77, 0x7d, 0xfe, 0x78, 0x7b, 0x90, 0x97, 0xdd, + 0xac, 0xbf, 0x28, 0x00, 0x49, 0xef, 0x43, 0xc9, 0x77, 0x61, 0xb4, 0x56, 0x5b, 0x36, 0x82, 0x1a, + 0x53, 0x27, 0x4f, 0x31, 0x05, 0xb9, 0x7d, 0xac, 0x28, 0x46, 0x3d, 0x86, 0xf1, 0x93, 0x54, 0xe8, + 0x64, 0x7f, 0xd7, 0xd0, 0xc9, 0x54, 0xe0, 0xe4, 0x52, 0x46, 0x2c, 0xe0, 0x40, 0x8f, 0x58, 0xc0, + 0x74, 0xa0, 0x9f, 0xb5, 0x08, 0xa5, 0xbc, 0xad, 0x2c, 0xce, 0x70, 0x3c, 0x51, 0xa1, 0x76, 0x7a, + 0xc6, 0x67, 0x38, 0x13, 0x6c, 0xbd, 0x03, 0x67, 0x15, 0x37, 0x7f, 0x01, 0x49, 0xcb, 0x10, 0x22, + 0xec, 0x5f, 0x95, 0x89, 0x24, 0x06, 0x58, 0x7f, 0x34, 0x90, 0x62, 0xac, 0x75, 0x0e, 0x0e, 0x9c, + 0xe0, 0x19, 0xa9, 0x98, 0x8c, 0xfd, 0x3d, 0x4d, 0x8e, 0xea, 0xc0, 0x4f, 0x0e, 0xcb, 0xa7, 0x34, + 0xe9, 0x6c, 0x5d, 0xc0, 0x1d, 0x86, 0xd7, 0xa0, 0xfc, 0xdc, 0xad, 0x8f, 0x67, 0x41, 0x33, 0x80, + 0x64, 0x07, 0x26, 0xc4, 0xda, 0x8d, 0xbf, 0xe5, 0x37, 0x76, 0x3b, 0xf9, 0x8d, 0x19, 0xd5, 0xbb, + 0x69, 0xb0, 0xf0, 0xd1, 0x68, 0x8a, 0x21, 0x5f, 0xc0, 0xa4, 0xdc, 0xa9, 0x09, 0xc1, 0x3c, 0x52, + 0xea, 0x4e, 0x77, 0xc1, 0x26, 0x0f, 0x97, 0x9c, 0x10, 0xc4, 0xaa, 0x2c, 0x27, 0x3b, 0x2e, 0x79, + 0xf0, 0x38, 0x55, 0x36, 0x58, 0x44, 0x95, 0x0d, 0xd8, 0xdc, 0xa7, 0x40, 0xd2, 0xed, 0xea, 0xf5, + 0x39, 0x4d, 0x68, 0x9f, 0xd3, 0x5c, 0x05, 0xa6, 0x32, 0x1a, 0x70, 0x22, 0x11, 0x9f, 0x02, 0x49, + 0xd7, 0xf4, 0x24, 0x12, 0xac, 0xeb, 0xf0, 0xaa, 0x52, 0x81, 0x1a, 0x0d, 0x86, 0x4c, 0xe9, 0x01, + 0xff, 0x95, 0x3e, 0x28, 0xf7, 0x20, 0x25, 0xff, 0xb8, 0x90, 0xd4, 0x36, 0x1f, 0x8d, 0xef, 0x25, + 0xb5, 0x9d, 0xcd, 0x9f, 0xa1, 0xf6, 0xea, 0xfb, 0xbf, 0xfa, 0xa7, 0xcf, 0x6d, 0x79, 0xa4, 0xbb, + 0xec, 0xe4, 0xda, 0x1a, 0xd0, 0xb5, 0xb5, 0x03, 0xd3, 0x86, 0xcd, 0x76, 0x9c, 0xc5, 0xcb, 0x02, + 0x10, 0x8f, 0x31, 0xaf, 0xfa, 0x7b, 0xe2, 0xcd, 0xe8, 0xbe, 0x52, 0xc1, 0xd6, 0xa0, 0xd6, 0x5d, + 0x98, 0x49, 0xc8, 0x15, 0x9e, 0xf9, 0xef, 0x82, 0xca, 0x06, 0x81, 0x82, 0xfb, 0xab, 0x67, 0x7e, + 0x76, 0x58, 0x9e, 0x60, 0xdb, 0xfa, 0x9b, 0xf1, 0x83, 0x1c, 0xf2, 0x2f, 0x6b, 0x4d, 0x3f, 0x5b, + 0xa8, 0xb4, 0xf4, 0x2c, 0x59, 0xe4, 0x0e, 0x0c, 0x71, 0x48, 0x22, 0xed, 0xbd, 0x4e, 0x2d, 0xe6, + 0x05, 0x41, 0x68, 0xcd, 0xe0, 0xdd, 0x75, 0xfc, 0x51, 0x89, 0x73, 0xad, 0x58, 0xdb, 0xfc, 0x19, + 0xa8, 0x18, 0xac, 0x52, 0xeb, 0x0f, 0x54, 0xe2, 0x9c, 0x30, 0x32, 0xc8, 0x44, 0xd2, 0x79, 0xfe, + 0xd3, 0x16, 0x6d, 0xf2, 0xf7, 0x3b, 0xab, 0xe3, 0x22, 0xc8, 0x64, 0xc0, 0x61, 0x02, 0x90, 0xcd, + 0xfa, 0x04, 0x66, 0xd8, 0x6e, 0x21, 0x48, 0x96, 0x87, 0x8f, 0xbf, 0x30, 0x98, 0x79, 0x45, 0xc5, + 0x61, 0x20, 0xbc, 0xa2, 0x22, 0x90, 0xd6, 0x2a, 0x9c, 0xe3, 0x9e, 0x49, 0xbd, 0x49, 0xf1, 0x39, + 0xc0, 0x20, 0xfe, 0x4e, 0xdc, 0x7c, 0xce, 0x68, 0x3d, 0xa7, 0xb3, 0x3e, 0xc6, 0xab, 0x75, 0x62, + 0xa0, 0xba, 0xbe, 0x17, 0xbb, 0x21, 0x8f, 0x77, 0x17, 0xff, 0xaf, 0xc2, 0x85, 0x4a, 0xbb, 0x4d, + 0xbd, 0x66, 0xcc, 0xb8, 0x15, 0x38, 0xc7, 0xcc, 0x94, 0x42, 0x2a, 0x30, 0x88, 0xd4, 0xea, 0x80, + 0x56, 0x54, 0x37, 0xa3, 0x3a, 0x48, 0x27, 0xf2, 0x20, 0x63, 0x01, 0x9c, 0xd3, 0x6a, 0xc2, 0x6c, + 0xad, 0xb3, 0x7b, 0xe0, 0x46, 0x78, 0xb1, 0x05, 0xb3, 0x0d, 0xc9, 0xb2, 0x57, 0xe4, 0xcb, 0x7d, + 0x5c, 0x19, 0xd7, 0xe3, 0x2b, 0x58, 0x78, 0x37, 0x46, 0x64, 0x20, 0x7a, 0x72, 0xe7, 0x66, 0xcc, + 0x8a, 0x2e, 0x18, 0x5e, 0x0a, 0xa2, 0xc5, 0xeb, 0x7e, 0xd6, 0x14, 0x9c, 0xd1, 0x0f, 0xa4, 0xf8, + 0x08, 0x99, 0x81, 0x29, 0xf3, 0xa0, 0x89, 0x83, 0xbf, 0x86, 0x69, 0xee, 0x08, 0xe7, 0xef, 0x18, + 0xcc, 0xc7, 0x29, 0xfb, 0xfb, 0x76, 0xe6, 0x13, 0xf7, 0x21, 0x30, 0x4c, 0x5a, 0xbd, 0x50, 0xb3, + 0x33, 0xcf, 0xaf, 0x47, 0x3f, 0x99, 0x37, 0x8e, 0x4a, 0xfb, 0x76, 0xe6, 0xab, 0xc3, 0x22, 0x1f, + 0x34, 0x93, 0xce, 0xbb, 0xff, 0x5b, 0x91, 0x3e, 0x8f, 0x19, 0x39, 0x96, 0xa9, 0x83, 0xb7, 0xe7, + 0xb2, 0xf3, 0x1a, 0x4c, 0x42, 0x9f, 0x4a, 0xf8, 0xda, 0xe7, 0x36, 0xad, 0xdf, 0x2b, 0xc0, 0x75, + 0xbe, 0x21, 0xcb, 0xe6, 0xc3, 0x53, 0xa7, 0x1c, 0x66, 0xf2, 0x2e, 0x0c, 0x86, 0x5a, 0xf4, 0x85, + 0x25, 0x6a, 0xde, 0x4d, 0x12, 0x67, 0x20, 0x15, 0x18, 0xd7, 0x2f, 0x89, 0x1d, 0x2f, 0x97, 0xa4, + 0x3d, 0x76, 0xf0, 0xc8, 0x51, 0x17, 0xc7, 0x1e, 0xc3, 0xf9, 0xa5, 0x6f, 0xd8, 0x80, 0x10, 0x2b, + 0x94, 0xb0, 0x1e, 0xe2, 0x7b, 0xf3, 0xa7, 0xb7, 0xc4, 0x88, 0x31, 0x4d, 0xfb, 0x24, 0x98, 0xd9, + 0xc9, 0x72, 0x91, 0x8b, 0x6f, 0x13, 0xd9, 0x06, 0xcc, 0xfa, 0xa3, 0x02, 0x5c, 0xc8, 0x2e, 0x4d, + 0x4c, 0x2c, 0x2b, 0x70, 0x66, 0xc1, 0xf1, 0x7c, 0xcf, 0x6d, 0x38, 0xad, 0x5a, 0x63, 0x9f, 0x36, + 0x3b, 0x2a, 0x6b, 0xb4, 0x9a, 0x65, 0xf6, 0xa8, 0x27, 0xd9, 0x25, 0x89, 0x9d, 0xe6, 0x62, 0x16, + 0x22, 0xde, 0x12, 0xe1, 0x73, 0x6f, 0x8b, 0x06, 0x4a, 0x1e, 0xaf, 0x59, 0x0e, 0x96, 0xdc, 0x96, + 0x1e, 0xff, 0xe6, 0xb6, 0xe7, 0x46, 0x8a, 0x89, 0xbb, 0x7a, 0xb2, 0x50, 0xd6, 0x7f, 0x28, 0xc0, + 0x39, 0x7c, 0x28, 0xce, 0x78, 0x7a, 0x36, 0x4e, 0x9e, 0x2e, 0xf3, 0x7f, 0x17, 0x8c, 0x5b, 0x2f, + 0x06, 0xb5, 0x99, 0x08, 0x9c, 0xbc, 0x01, 0x03, 0x35, 0x19, 0x0d, 0x36, 0x99, 0x78, 0x34, 0x5c, + 0x70, 0x30, 0xbc, 0x8d, 0x54, 0xcc, 0x86, 0x5f, 0xa4, 0x61, 0x83, 0x7a, 0xf8, 0xba, 0x3b, 0xf7, + 0x3c, 0x68, 0x90, 0x38, 0xaf, 0xd9, 0x40, 0x5e, 0x5e, 0xb3, 0x41, 0x33, 0xaf, 0x99, 0xf5, 0x84, + 0x3f, 0x13, 0x97, 0x6c, 0x90, 0xe8, 0xa4, 0x8f, 0x53, 0x8f, 0xc1, 0xf3, 0x75, 0xe0, 0x6c, 0x56, + 0xcb, 0xd8, 0x26, 0x3d, 0xf1, 0xce, 0x7b, 0x7e, 0xb2, 0xf2, 0x4d, 0x78, 0xc5, 0xa0, 0xad, 0xb4, + 0x5a, 0xfe, 0x53, 0xda, 0xdc, 0x0c, 0xfc, 0x03, 0x3f, 0x32, 0x9e, 0xc9, 0x3a, 0xed, 0xe8, 0x74, + 0x6a, 0x31, 0x4e, 0x82, 0xad, 0xbf, 0x02, 0xd7, 0x7a, 0x48, 0x14, 0x8d, 0xaa, 0xc1, 0x19, 0x27, + 0x81, 0x93, 0x61, 0x3d, 0xd7, 0xb2, 0xda, 0x95, 0x14, 0x14, 0xda, 0x69, 0xfe, 0x1b, 0x5b, 0xc6, + 0x03, 0xea, 0xa4, 0x04, 0xd3, 0x9b, 0xf6, 0xc6, 0xe2, 0xf6, 0xc2, 0x56, 0x7d, 0xeb, 0x8b, 0xcd, + 0xa5, 0xfa, 0xf6, 0xfa, 0x83, 0xf5, 0x8d, 0x87, 0xeb, 0x3c, 0xdb, 0xbf, 0x81, 0xd9, 0x5a, 0xaa, + 0xac, 0x15, 0x0b, 0x64, 0x1a, 0x8a, 0x06, 0x78, 0x69, 0xbb, 0x5a, 0xec, 0xbb, 0xf1, 0xb5, 0xf1, + 0x30, 0x38, 0xb9, 0x00, 0xa5, 0xda, 0xf6, 0xe6, 0xe6, 0x86, 0xad, 0xa4, 0xea, 0x6f, 0x0d, 0xcc, + 0xc0, 0x19, 0x03, 0x7b, 0xd7, 0x5e, 0x5a, 0x2a, 0x16, 0x58, 0x55, 0x0c, 0xf0, 0xa6, 0xbd, 0xb4, + 0xb6, 0xb2, 0xbd, 0x56, 0xec, 0xbb, 0x51, 0xd7, 0x2f, 0x6b, 0x92, 0xf3, 0x30, 0xbb, 0xb8, 0xb4, + 0xb3, 0xb2, 0xb0, 0x94, 0x25, 0x7b, 0x1a, 0x8a, 0x3a, 0x72, 0x6b, 0x63, 0x6b, 0x93, 0x8b, 0xd6, + 0xa1, 0x0f, 0x97, 0xaa, 0x95, 0xed, 0xad, 0xe5, 0xf5, 0x62, 0xbf, 0x35, 0x30, 0xd2, 0x57, 0xec, + 0xbb, 0xf1, 0x03, 0xe3, 0x26, 0x27, 0xab, 0xbe, 0x20, 0xdf, 0xae, 0x55, 0xee, 0xe5, 0x17, 0xc1, + 0xb1, 0x6b, 0x77, 0x2b, 0xc5, 0x02, 0xb9, 0x08, 0xe7, 0x0c, 0xe8, 0x66, 0xa5, 0x56, 0x7b, 0xb8, + 0x61, 0x2f, 0xae, 0x2e, 0xd5, 0x6a, 0xc5, 0xbe, 0x1b, 0x3b, 0x46, 0x2e, 0x47, 0x56, 0xc2, 0xda, + 0xdd, 0x4a, 0xdd, 0x5e, 0xfa, 0x6c, 0x7b, 0xc5, 0x5e, 0x5a, 0x4c, 0x97, 0x60, 0x60, 0xbf, 0x58, + 0xaa, 0x15, 0x0b, 0x64, 0x0a, 0x4e, 0x1b, 0xd0, 0xf5, 0x8d, 0x62, 0xdf, 0x8d, 0x57, 0x45, 0xba, + 0x3f, 0x32, 0x09, 0xb0, 0xb8, 0x54, 0x5b, 0x58, 0x5a, 0x5f, 0x5c, 0x59, 0xbf, 0x57, 0x3c, 0x45, + 0x26, 0x60, 0xb4, 0xa2, 0x7e, 0x16, 0x6e, 0xbc, 0x0f, 0xa7, 0x13, 0xe6, 0x3d, 0xa3, 0x50, 0x86, + 0x71, 0xf1, 0x14, 0xaa, 0x5f, 0xfe, 0x44, 0x1f, 0x2b, 0xb7, 0xd4, 0x8b, 0x85, 0x1b, 0x55, 0xf9, + 0x96, 0xb4, 0xf6, 0x9d, 0x93, 0x31, 0x18, 0x5e, 0x5c, 0xba, 0x5b, 0xd9, 0x5e, 0xdd, 0x2a, 0x9e, + 0x62, 0x3f, 0x16, 0xec, 0xa5, 0xca, 0xd6, 0xd2, 0x62, 0xb1, 0x40, 0x46, 0x61, 0xb0, 0xb6, 0x55, + 0xd9, 0x5a, 0x2a, 0xf6, 0x91, 0x11, 0x18, 0xd8, 0xae, 0x2d, 0xd9, 0xc5, 0xfe, 0xf9, 0x7f, 0xfd, + 0x8f, 0x0a, 0xdc, 0xd1, 0x28, 0xef, 0x74, 0x7d, 0xad, 0x19, 0x94, 0x62, 0xca, 0x13, 0x0f, 0xe7, + 0xe6, 0x5a, 0x8f, 0xb8, 0x0b, 0x98, 0xeb, 0x72, 0xf2, 0x82, 0x04, 0xd7, 0x0b, 0xb7, 0x0b, 0xc4, + 0xc6, 0x48, 0x95, 0x84, 0x7d, 0xa5, 0x24, 0x67, 0x9b, 0xc0, 0x73, 0x17, 0xbb, 0x9a, 0x65, 0xe4, + 0x97, 0xc0, 0xd2, 0x65, 0xe6, 0x58, 0x21, 0xdf, 0x3d, 0x9e, 0xb5, 0x21, 0xcb, 0x7c, 0xf5, 0x78, + 0xe4, 0xe4, 0x3e, 0x4c, 0xb0, 0xbd, 0xb9, 0x22, 0x23, 0xe7, 0x93, 0x8c, 0x9a, 0x49, 0x30, 0x77, + 0x21, 0x1b, 0xa9, 0xde, 0xb6, 0x1a, 0xc7, 0x86, 0x70, 0xe3, 0x3a, 0x24, 0x32, 0x25, 0x8c, 0x84, + 0xf0, 0x19, 0x7f, 0xee, 0x4c, 0x02, 0xbc, 0x73, 0xe7, 0x76, 0x81, 0xd4, 0x30, 0x1f, 0xa3, 0xb1, + 0xc9, 0x27, 0xf2, 0x92, 0x61, 0x7a, 0xf7, 0xcf, 0x6b, 0x53, 0x56, 0x2f, 0xd1, 0xe6, 0x58, 0x07, + 0xeb, 0x40, 0xd2, 0x7b, 0x67, 0x72, 0x39, 0x1e, 0x07, 0xd9, 0xdb, 0xea, 0xb9, 0xb3, 0xa9, 0xe0, + 0xc6, 0x25, 0xb6, 0x7b, 0x22, 0x4b, 0x30, 0x29, 0xf2, 0x3d, 0x88, 0xdd, 0x3c, 0xe9, 0x66, 0x0f, + 0xe4, 0x8a, 0xb9, 0x87, 0x7a, 0x52, 0x16, 0x01, 0x99, 0x8b, 0xdb, 0x91, 0x34, 0x13, 0xe6, 0xce, + 0x67, 0xe2, 0x44, 0xfb, 0xee, 0xc2, 0xa4, 0x69, 0x5c, 0x10, 0xd9, 0x41, 0x99, 0x36, 0x47, 0x6e, + 0x85, 0xea, 0x30, 0xbb, 0xe6, 0xb8, 0x78, 0x5e, 0x22, 0x22, 0xe8, 0x64, 0x90, 0x1a, 0x29, 0x77, + 0x89, 0x5a, 0xab, 0x51, 0xaf, 0xa9, 0x3a, 0x21, 0xef, 0x9d, 0x0a, 0xfc, 0x6c, 0x6a, 0x72, 0x8f, + 0x6c, 0x06, 0x10, 0x12, 0xcb, 0x7c, 0x5d, 0x3c, 0x2b, 0x26, 0x74, 0x2e, 0x2f, 0x8c, 0x99, 0xac, + 0xe1, 0x26, 0x3d, 0x21, 0x51, 0x1b, 0x13, 0x27, 0x16, 0x57, 0xc2, 0xac, 0x23, 0x91, 0x9b, 0x8c, + 0x47, 0x0e, 0x49, 0x8e, 0xe2, 0x72, 0x85, 0xdd, 0x2e, 0x90, 0xaf, 0xf1, 0xab, 0xce, 0x14, 0xf7, + 0xd0, 0x8d, 0xf6, 0xc5, 0xee, 0xe7, 0x7c, 0xa6, 0x00, 0xf1, 0xa1, 0x74, 0x91, 0x6e, 0xc3, 0x74, + 0x56, 0xe4, 0xb4, 0x52, 0x68, 0x97, 0xb0, 0xea, 0xdc, 0x51, 0x60, 0x33, 0x53, 0xa3, 0x99, 0xdf, + 0x49, 0x5d, 0x02, 0x77, 0x73, 0x65, 0x7e, 0x08, 0x93, 0x6c, 0x94, 0x3c, 0xa0, 0xb4, 0x5d, 0x69, + 0xb9, 0x4f, 0x68, 0x48, 0x64, 0x32, 0x6d, 0x05, 0xca, 0xe3, 0xbd, 0x5e, 0x20, 0xdf, 0x81, 0xb1, + 0x87, 0x4e, 0xd4, 0xd8, 0x17, 0x49, 0x65, 0x65, 0xce, 0x59, 0x84, 0xcd, 0xc9, 0x5f, 0x88, 0xbc, + 0x5d, 0x20, 0x1f, 0xc1, 0xf0, 0x3d, 0x1a, 0xe1, 0x25, 0xef, 0x2b, 0x2a, 0xd0, 0x8f, 0xfb, 0x27, + 0x57, 0x3c, 0x75, 0x45, 0x48, 0x56, 0x38, 0xe9, 0xcc, 0x25, 0xb7, 0x00, 0xf8, 0x84, 0x80, 0x12, + 0x92, 0xe8, 0xb9, 0x54, 0xb5, 0xc9, 0x3d, 0xb6, 0x79, 0x68, 0xd1, 0x88, 0x1e, 0xb7, 0xc8, 0x3c, + 0x1d, 0xad, 0xc2, 0xa4, 0x7a, 0x0e, 0x6c, 0x1d, 0x73, 0xff, 0x58, 0x09, 0x61, 0xe1, 0x09, 0xa4, + 0xbd, 0xcf, 0xbe, 0x0a, 0xfe, 0x16, 0x36, 0x26, 0x89, 0xc1, 0x99, 0x74, 0x56, 0xcf, 0x34, 0xa3, + 0x4f, 0xa1, 0x52, 0x89, 0x9c, 0x4c, 0xe3, 0x5d, 0xf6, 0xc3, 0xc8, 0xe4, 0x55, 0x90, 0x6c, 0xde, + 0x5f, 0x84, 0x39, 0xbd, 0x5c, 0x33, 0xab, 0x79, 0x3c, 0xe7, 0xe6, 0x25, 0x4b, 0x9f, 0xbb, 0xd2, + 0x85, 0x42, 0xd8, 0x6f, 0xfd, 0xbf, 0xde, 0x57, 0xc0, 0xe9, 0x64, 0x11, 0xa6, 0x64, 0x59, 0x1b, + 0x6d, 0xea, 0xd5, 0x6a, 0xcb, 0xf8, 0xf4, 0x93, 0x0c, 0x2b, 0xd1, 0x60, 0x52, 0x3a, 0x49, 0xa3, + 0xd8, 0xd2, 0x67, 0x24, 0x83, 0x21, 0xdd, 0x52, 0xc4, 0xc4, 0x4b, 0x5f, 0x66, 0xba, 0xed, 0x07, + 0xdc, 0xa9, 0x64, 0x6c, 0xfe, 0x77, 0xe6, 0x49, 0x17, 0x03, 0x68, 0x2e, 0xc7, 0x84, 0xb8, 0x5d, + 0x20, 0x5f, 0x00, 0x49, 0x9b, 0x24, 0x4a, 0x85, 0xb9, 0xe6, 0x97, 0x52, 0x61, 0x17, 0x7b, 0xe6, + 0x1e, 0xcc, 0xa8, 0x54, 0x50, 0x5a, 0xa9, 0xf3, 0x24, 0xa7, 0x36, 0x79, 0xb5, 0x24, 0x9f, 0xc0, + 0x94, 0x18, 0xb4, 0x3a, 0x82, 0x14, 0xd5, 0xfc, 0x23, 0xac, 0x92, 0xdc, 0x71, 0x7a, 0x1f, 0x66, + 0x6a, 0x09, 0x8d, 0xf1, 0x48, 0xfb, 0x73, 0xa6, 0x08, 0x04, 0xd6, 0x68, 0xc4, 0x55, 0x96, 0x2d, + 0xeb, 0x01, 0x10, 0xee, 0x14, 0x92, 0xe2, 0x9e, 0xb8, 0xf4, 0x29, 0xb9, 0x98, 0xa8, 0x3a, 0x03, + 0x22, 0x19, 0x4e, 0x60, 0xb9, 0x2d, 0xdb, 0xe2, 0x2f, 0xb9, 0x23, 0xd4, 0x38, 0x47, 0xbf, 0x6c, + 0x30, 0x18, 0x47, 0xf1, 0xa2, 0x03, 0xce, 0xe5, 0x52, 0x90, 0x5f, 0xc6, 0x1c, 0xcc, 0xdd, 0xcd, + 0x2a, 0xf2, 0x9d, 0x2c, 0xeb, 0x37, 0xc7, 0x30, 0x9c, 0x7b, 0xe3, 0x78, 0xc4, 0xca, 0x90, 0x9d, + 0xb8, 0x47, 0xa3, 0xcd, 0x56, 0x67, 0xcf, 0xc5, 0x37, 0x7e, 0x89, 0x72, 0x1a, 0x29, 0x90, 0x18, + 0x97, 0x32, 0xf5, 0x61, 0x8c, 0xa8, 0xd1, 0x1f, 0x92, 0x15, 0x28, 0xf2, 0xf9, 0x5f, 0x13, 0x71, + 0x31, 0x25, 0x42, 0x90, 0x38, 0x81, 0x73, 0x10, 0xe6, 0xf6, 0xd6, 0x2d, 0x1e, 0xb8, 0x44, 0xe4, + 0x37, 0xa9, 0x6f, 0x30, 0xa7, 0x0c, 0x98, 0x7a, 0x97, 0x82, 0xf5, 0x88, 0x4d, 0x43, 0x1a, 0xc9, + 0x64, 0x4f, 0xfc, 0x85, 0xe7, 0xab, 0xf1, 0x62, 0x9f, 0xc6, 0xc6, 0x9f, 0x7e, 0x22, 0x31, 0xe1, + 0xce, 0x9b, 0x44, 0xbd, 0x7a, 0x9d, 0x21, 0xf4, 0x55, 0x63, 0x4f, 0x72, 0x32, 0xb9, 0x6f, 0xe1, + 0x1a, 0x84, 0x09, 0xae, 0x66, 0xe2, 0xba, 0xb1, 0xdf, 0x92, 0x6b, 0x42, 0xe3, 0xda, 0x99, 0xc7, + 0x29, 0x8d, 0x2d, 0x92, 0x6c, 0x0b, 0xdb, 0x09, 0x02, 0xea, 0x71, 0xe6, 0xbc, 0xfd, 0x46, 0x16, + 0xf7, 0xc7, 0x38, 0xf5, 0x68, 0xdc, 0xfc, 0x42, 0x60, 0x2f, 0x11, 0xfc, 0x45, 0xb2, 0xdb, 0x05, + 0xf2, 0x2e, 0x8c, 0x88, 0x3a, 0x32, 0x26, 0xa3, 0xd2, 0x61, 0x97, 0x5a, 0x23, 0x27, 0x70, 0x25, + 0x61, 0x9d, 0x4d, 0x9a, 0xbc, 0xde, 0xe7, 0x75, 0x7e, 0x97, 0x2d, 0xb6, 0xcd, 0xe7, 0xe1, 0x5c, + 0x90, 0xab, 0x2e, 0x72, 0x96, 0x54, 0x52, 0x24, 0x09, 0xea, 0xb1, 0x3c, 0x72, 0x21, 0x6c, 0xdf, + 0x8c, 0x99, 0x45, 0x55, 0x82, 0x40, 0xb5, 0x6f, 0x36, 0xc0, 0xbd, 0xd6, 0xda, 0x15, 0x28, 0x56, + 0x1a, 0xb8, 0x12, 0xd4, 0xe8, 0x81, 0xd3, 0xde, 0xf7, 0x03, 0xaa, 0x8c, 0x96, 0x24, 0x42, 0xca, + 0x9a, 0x51, 0x3b, 0x0b, 0x81, 0x58, 0xa5, 0x0e, 0xa6, 0x5f, 0x9f, 0x55, 0x5b, 0x8b, 0x04, 0x2a, + 0x9b, 0xa3, 0x8b, 0x91, 0x32, 0xbd, 0xc0, 0xcc, 0xaa, 0xd6, 0x8b, 0x89, 0x79, 0x1f, 0x27, 0x0c, + 0x45, 0x1c, 0xaa, 0x15, 0x42, 0x81, 0x94, 0x39, 0x27, 0xef, 0x06, 0x29, 0xd2, 0x8a, 0x3c, 0x37, + 0x8e, 0xd5, 0x92, 0xc7, 0x9d, 0x57, 0xfc, 0xf7, 0x60, 0x72, 0x89, 0x4d, 0xe8, 0x9d, 0xa6, 0xcb, + 0x9f, 0x9c, 0x20, 0xe6, 0x1b, 0x02, 0xb9, 0x8c, 0xcb, 0xf2, 0x11, 0x40, 0x64, 0x15, 0xa6, 0xbf, + 0x5c, 0x53, 0x34, 0x98, 0xec, 0x8f, 0x69, 0x29, 0x56, 0xbc, 0xfa, 0x81, 0xa6, 0xb9, 0xb0, 0xf5, + 0x67, 0xf9, 0x8e, 0xb0, 0xd2, 0x6e, 0xb7, 0xa4, 0x4b, 0x9a, 0x9f, 0xbd, 0x5f, 0x33, 0x4c, 0xc8, + 0x14, 0x5e, 0xca, 0x4e, 0x6f, 0x1a, 0x3f, 0xd7, 0x1e, 0xe5, 0xce, 0x91, 0x99, 0x83, 0xef, 0x35, + 0x16, 0x55, 0x92, 0xf8, 0x4a, 0xab, 0x95, 0x62, 0x0e, 0xc9, 0xeb, 0xa6, 0xf4, 0x2c, 0x9a, 0x5e, + 0x25, 0xa0, 0x89, 0xce, 0x77, 0x5d, 0x95, 0x76, 0x9b, 0x4f, 0x96, 0x97, 0xd4, 0x84, 0x61, 0x22, + 0xd2, 0x26, 0x7a, 0x12, 0x2f, 0xe6, 0xf6, 0xfb, 0x38, 0xcc, 0xe2, 0x97, 0xbb, 0x89, 0x6e, 0xf0, + 0x26, 0x1f, 0x2e, 0x57, 0x9b, 0xb0, 0x04, 0x52, 0xad, 0x13, 0xa7, 0x71, 0xeb, 0x13, 0x3f, 0x03, + 0xae, 0x3c, 0x33, 0x09, 0xb8, 0x94, 0x77, 0x29, 0x0f, 0xad, 0x3c, 0xa5, 0x45, 0x31, 0x98, 0xe2, + 0x0a, 0x5e, 0x32, 0xd6, 0x87, 0x74, 0x1d, 0xcb, 0xb9, 0x78, 0xd5, 0xe4, 0x62, 0xf2, 0x61, 0x76, + 0x25, 0x34, 0xe7, 0xc5, 0xf6, 0xdc, 0x3e, 0xb9, 0x0b, 0xd3, 0x7a, 0x8f, 0xaa, 0x76, 0xe7, 0xcd, + 0xfe, 0x79, 0x72, 0xb6, 0x60, 0x26, 0xf3, 0x1d, 0x75, 0xb5, 0xc4, 0x76, 0x7b, 0x65, 0x3d, 0x57, + 0x2a, 0x85, 0xb3, 0xc2, 0xb2, 0x4f, 0xbc, 0x1c, 0x4f, 0x5e, 0x31, 0x0d, 0xff, 0xec, 0x87, 0xe5, + 0xe7, 0xae, 0xf5, 0xa0, 0x12, 0x0a, 0xfd, 0x1a, 0x57, 0xc0, 0x54, 0x19, 0x57, 0x34, 0x57, 0x40, + 0x4e, 0x01, 0x56, 0x37, 0x12, 0x35, 0x06, 0xa6, 0x33, 0xd0, 0xf9, 0x2a, 0xbe, 0x9a, 0x2f, 0x33, + 0x1e, 0x58, 0x3b, 0x32, 0x17, 0x7a, 0xae, 0x66, 0xba, 0x3e, 0xb9, 0xdf, 0xc5, 0x96, 0x9c, 0x53, + 0xe3, 0xe1, 0xf8, 0x55, 0xce, 0x93, 0xd6, 0x54, 0x6e, 0x1b, 0xe3, 0x3d, 0xfc, 0xa4, 0xdb, 0x26, + 0xeb, 0x1d, 0x7f, 0xa5, 0x86, 0x6c, 0x1a, 0xcd, 0xa2, 0x23, 0x5f, 0x71, 0x3f, 0x8e, 0x59, 0x84, + 0xee, 0xc7, 0xc9, 0x94, 0x7f, 0x39, 0x9f, 0x40, 0x17, 0xee, 0xf0, 0x43, 0xdb, 0xc4, 0x83, 0xfe, + 0x44, 0x37, 0x95, 0xb2, 0x1f, 0xfb, 0x57, 0x63, 0x23, 0x93, 0x44, 0x2f, 0xe2, 0xa1, 0xfc, 0x06, + 0x73, 0xb4, 0x94, 0x85, 0x3c, 0xd6, 0x36, 0x65, 0x03, 0x4a, 0x71, 0x67, 0x26, 0x1a, 0x70, 0xc2, + 0xae, 0x94, 0xca, 0x38, 0x17, 0x7f, 0xc7, 0x49, 0x89, 0xaf, 0xa5, 0xbe, 0xf4, 0x1c, 0xc5, 0x74, + 0x2d, 0x82, 0xcf, 0xe7, 0x5a, 0x6e, 0xf5, 0xf3, 0xb1, 0x13, 0x37, 0x86, 0x66, 0xcc, 0xe7, 0x3a, + 0x52, 0x19, 0xab, 0x93, 0x06, 0x22, 0xbf, 0xd5, 0x17, 0xb3, 0xe4, 0x84, 0xe9, 0x19, 0x57, 0xab, + 0x97, 0xdc, 0xa7, 0x25, 0x11, 0x27, 0x99, 0x71, 0x8f, 0x53, 0xb5, 0x3c, 0x39, 0x8b, 0x30, 0xc6, + 0x6b, 0xcb, 0x17, 0xd2, 0x73, 0x86, 0x9a, 0x8c, 0x35, 0x74, 0xce, 0x68, 0x9c, 0xb9, 0x7c, 0x2e, + 0xa0, 0x2b, 0x59, 0x82, 0xf3, 0x6b, 0x71, 0x3e, 0x2d, 0xc3, 0x70, 0x23, 0x2b, 0x2d, 0xf0, 0xda, + 0x5c, 0x48, 0x2a, 0xc7, 0xa8, 0x50, 0x7e, 0x93, 0x88, 0xae, 0x9a, 0x1e, 0x55, 0xca, 0xdf, 0xbf, + 0x4e, 0x89, 0xd7, 0x98, 0xf1, 0x41, 0x24, 0x99, 0xfa, 0xf0, 0xac, 0xf2, 0x89, 0x69, 0x50, 0x74, + 0x50, 0x64, 0x8b, 0xd9, 0xc4, 0xeb, 0x23, 0x34, 0x88, 0x52, 0xa9, 0x0d, 0x5f, 0x31, 0x36, 0x6f, + 0x49, 0x74, 0xfe, 0xde, 0x4d, 0xcd, 0xd9, 0xb9, 0x12, 0xb3, 0xd1, 0xbd, 0xd4, 0xf6, 0x7d, 0x6d, + 0xce, 0x4e, 0xf2, 0x86, 0xe4, 0x7a, 0x72, 0xe3, 0x96, 0x22, 0xe9, 0xbd, 0x26, 0x88, 0x10, 0x92, + 0x44, 0x00, 0xa9, 0x65, 0xe8, 0xc1, 0x44, 0xe6, 0x6b, 0xc1, 0x96, 0xe3, 0x3f, 0x47, 0x5a, 0x16, + 0xb2, 0x57, 0x0d, 0xbf, 0xd4, 0x26, 0x3a, 0x93, 0x33, 0x54, 0xe6, 0x78, 0x1e, 0x41, 0x2f, 0xd9, + 0xeb, 0x78, 0xe1, 0x28, 0xd1, 0x40, 0xb7, 0x41, 0xd5, 0xce, 0x26, 0x13, 0x9b, 0xdf, 0xfe, 0x7b, + 0x72, 0xa7, 0x94, 0x94, 0x77, 0x36, 0xe1, 0xb4, 0xed, 0x55, 0xb1, 0xaf, 0xe5, 0x64, 0x9c, 0x68, + 0x13, 0x5e, 0x2a, 0x7a, 0xad, 0x5b, 0xab, 0xb5, 0x77, 0x2f, 0xbb, 0x98, 0x41, 0xa7, 0x6b, 0xee, + 0x9e, 0xa7, 0x6e, 0x22, 0xd4, 0x6c, 0x65, 0x04, 0x69, 0xb0, 0xe4, 0x14, 0x63, 0xa0, 0x54, 0xf2, + 0x9c, 0x69, 0xb9, 0x7b, 0xd7, 0x9f, 0xe3, 0x27, 0x29, 0x1e, 0xcd, 0xdd, 0x7a, 0x3e, 0x13, 0x97, + 0x16, 0xa8, 0xbf, 0x85, 0xaf, 0x04, 0x66, 0x3c, 0xcb, 0xaf, 0x04, 0x66, 0x3e, 0x9e, 0x7f, 0x0b, + 0xbd, 0x2e, 0xb6, 0xdf, 0xa2, 0xba, 0xd7, 0x45, 0x7b, 0x5c, 0x3d, 0xe1, 0xf4, 0x20, 0x1f, 0xc3, + 0xa8, 0x7a, 0x7c, 0x5e, 0xf9, 0xb7, 0x93, 0xef, 0xdf, 0xcf, 0x95, 0xd2, 0x08, 0x51, 0xe0, 0xdb, + 0xd2, 0xf1, 0x81, 0x65, 0x96, 0x4c, 0x87, 0x51, 0x7e, 0xb1, 0x6f, 0x4b, 0xaf, 0x87, 0xc1, 0x96, + 0x7a, 0x7a, 0x3e, 0xc9, 0xf6, 0x3d, 0x18, 0x8f, 0x9f, 0x99, 0xdf, 0x99, 0xd7, 0x18, 0x13, 0x6f, + 0xcf, 0x27, 0x19, 0xdf, 0x95, 0x47, 0x1a, 0x58, 0x9e, 0x89, 0xec, 0xbe, 0x8a, 0x7f, 0x2c, 0xbd, + 0x2c, 0x46, 0x4d, 0x53, 0x8f, 0xd6, 0x77, 0x99, 0x7c, 0xc7, 0xf5, 0x77, 0x5f, 0x55, 0xd7, 0x66, + 0xbc, 0xdc, 0xac, 0xba, 0x36, 0xeb, 0xe5, 0xe5, 0xd8, 0xe5, 0xff, 0x85, 0x74, 0x29, 0xc4, 0x42, + 0x2f, 0x1a, 0xd5, 0x4a, 0xc9, 0xbd, 0x94, 0x87, 0x4e, 0x8a, 0xae, 0x41, 0x31, 0xf9, 0x48, 0xad, + 0xb2, 0xc7, 0x72, 0x5e, 0x13, 0x56, 0x46, 0x5e, 0xee, 0xeb, 0xb6, 0x9b, 0xd2, 0x3f, 0x6e, 0xca, + 0xbd, 0x92, 0x5d, 0x29, 0x5d, 0x74, 0xbe, 0xc3, 0x7c, 0xc2, 0x78, 0xaf, 0x56, 0xb7, 0x94, 0x53, + 0xef, 0xe1, 0xea, 0x3b, 0xab, 0x8c, 0x27, 0x6e, 0x5d, 0x99, 0x51, 0x2a, 0xf3, 0xc8, 0x56, 0x39, + 0x0b, 0x7a, 0x3f, 0x6e, 0xd0, 0xf3, 0xf8, 0x97, 0xfc, 0x02, 0xcc, 0xe6, 0x24, 0x6b, 0x27, 0xd7, + 0x12, 0x9e, 0xd6, 0xec, 0x64, 0xee, 0x6a, 0x80, 0x64, 0x3e, 0x24, 0xbf, 0x86, 0x71, 0x03, 0x46, + 0x7e, 0x87, 0xd4, 0x59, 0xdc, 0x43, 0x37, 0xda, 0xe7, 0xef, 0xa5, 0x6b, 0xd3, 0x66, 0x66, 0x62, + 0x08, 0x52, 0x43, 0x5b, 0xc4, 0x80, 0x66, 0x1c, 0xc7, 0x65, 0x08, 0x9c, 0xcb, 0x16, 0xc8, 0xe6, + 0x0e, 0x36, 0x16, 0x32, 0x92, 0x6f, 0xa8, 0xb1, 0x90, 0x9f, 0x98, 0x23, 0xb7, 0x9a, 0x9b, 0x72, + 0x8f, 0x94, 0x2d, 0x31, 0x3f, 0x0f, 0x47, 0xae, 0xc4, 0xfb, 0x4c, 0x62, 0x2a, 0xb5, 0x06, 0xc9, + 0x21, 0xef, 0x3e, 0x7b, 0xd8, 0x72, 0xc9, 0x35, 0xb9, 0xe6, 0xb5, 0xfa, 0xe5, 0x25, 0xf1, 0xc8, + 0xad, 0xdf, 0x92, 0xfc, 0x9e, 0xb2, 0xeb, 0x77, 0xdc, 0x45, 0x57, 0x9d, 0x7f, 0x25, 0xb2, 0xbb, + 0x18, 0x0d, 0xd5, 0xe0, 0x73, 0x39, 0x70, 0xb2, 0x8e, 0x81, 0x40, 0x49, 0xa8, 0x66, 0x94, 0x66, + 0xa7, 0x8f, 0xc9, 0x95, 0xc7, 0xc7, 0xb1, 0x91, 0x7e, 0xe3, 0x24, 0xe3, 0x38, 0x91, 0xb7, 0x43, + 0x8c, 0x63, 0x03, 0x7a, 0xb2, 0x71, 0x9c, 0x10, 0x68, 0x8e, 0xe3, 0x64, 0x35, 0x93, 0x96, 0x7e, + 0x6e, 0xaf, 0x26, 0xab, 0xa9, 0xc6, 0x71, 0xb6, 0xc4, 0xfc, 0x34, 0x29, 0xb9, 0x12, 0xd5, 0x38, + 0x36, 0x25, 0xe6, 0x90, 0x1f, 0x73, 0x1c, 0x27, 0x0b, 0x31, 0xc7, 0xf1, 0x89, 0xea, 0xa7, 0xc6, + 0x71, 0x76, 0xfd, 0x4e, 0x3c, 0x8e, 0x13, 0x79, 0x85, 0x8c, 0x86, 0x66, 0x8d, 0xe3, 0x24, 0x3d, + 0x1f, 0xc7, 0x49, 0x68, 0xc2, 0xb9, 0xd2, 0x65, 0x1c, 0x27, 0x39, 0x3f, 0x43, 0x79, 0x89, 0x9c, + 0x28, 0xc7, 0x19, 0xc9, 0xb9, 0xe9, 0x54, 0xc8, 0x43, 0x74, 0xef, 0x25, 0xe0, 0xc7, 0x1b, 0xcd, + 0x17, 0xf2, 0x84, 0xe2, 0x78, 0xde, 0x91, 0x4a, 0x4c, 0x56, 0xd7, 0xf4, 0x5d, 0x65, 0xa7, 0x84, + 0xe9, 0x52, 0xe1, 0x1d, 0x36, 0x6e, 0x9a, 0x5d, 0xe4, 0x76, 0xcb, 0x68, 0xd3, 0x45, 0xae, 0x32, + 0x65, 0x92, 0x72, 0x73, 0x59, 0xba, 0x8f, 0xef, 0xcf, 0xe5, 0x01, 0x47, 0x92, 0x6f, 0x3e, 0x61, + 0x1c, 0x9d, 0xb8, 0xa6, 0xca, 0x48, 0x4a, 0xd6, 0xf4, 0xa4, 0xe3, 0x7c, 0x4d, 0xee, 0x1e, 0x52, + 0xa9, 0xb0, 0x12, 0x8d, 0xd6, 0xc7, 0x7a, 0x2e, 0x86, 0x6c, 0xa1, 0x2f, 0x37, 0x0d, 0xd7, 0xfc, + 0xc0, 0x79, 0x39, 0xb7, 0x7a, 0x4a, 0x4d, 0x25, 0xf5, 0xd1, 0xa5, 0xe6, 0x65, 0xfc, 0x51, 0x52, + 0xd3, 0xdc, 0x9f, 0xa0, 0xf7, 0x4b, 0xdc, 0xb8, 0xf2, 0x1e, 0xf9, 0xf9, 0x9e, 0x94, 0x29, 0x23, + 0x58, 0x89, 0xd1, 0x62, 0x8c, 0xd8, 0x87, 0xe2, 0x04, 0x4f, 0x02, 0x73, 0x95, 0x9f, 0xc5, 0x4f, + 0x3e, 0x81, 0xa2, 0x98, 0xde, 0x62, 0x01, 0x59, 0x84, 0xb9, 0x5d, 0x57, 0x95, 0x4e, 0xb7, 0x63, + 0xd4, 0xe0, 0x38, 0xce, 0xb6, 0xe3, 0x68, 0x22, 0xdf, 0x33, 0xc5, 0x96, 0xc3, 0xad, 0xa0, 0x13, + 0x46, 0xb4, 0x99, 0xf6, 0x28, 0x99, 0x95, 0x91, 0x91, 0x11, 0x26, 0xf9, 0xce, 0x3c, 0x59, 0xc1, + 0xb9, 0xcd, 0x04, 0x77, 0x73, 0xb9, 0x65, 0x8b, 0xc1, 0xa9, 0x67, 0x59, 0x5d, 0xeb, 0x31, 0xeb, + 0x94, 0x57, 0x76, 0x7e, 0xa5, 0x94, 0x8a, 0x8e, 0xd9, 0xba, 0x3c, 0x15, 0x7d, 0x80, 0x61, 0x00, + 0xdc, 0xfd, 0xd7, 0x4b, 0x33, 0xc9, 0x8b, 0x46, 0xe4, 0x53, 0x18, 0x95, 0xcc, 0xbd, 0x15, 0x92, + 0xe4, 0x46, 0x85, 0x2c, 0xc2, 0x84, 0x71, 0x8b, 0x4a, 0x59, 0x37, 0x59, 0x77, 0xab, 0xba, 0xf4, + 0xf3, 0x84, 0x71, 0x5b, 0x4a, 0x49, 0xc9, 0xba, 0x43, 0x95, 0x2b, 0xe5, 0x23, 0x18, 0x13, 0x2a, + 0xed, 0xaa, 0x8d, 0x7c, 0x7f, 0xdb, 0x8c, 0x16, 0x91, 0xdc, 0x69, 0xba, 0xd1, 0x82, 0xef, 0x3d, + 0x72, 0xf7, 0x7a, 0x2a, 0x26, 0xcd, 0xb2, 0x33, 0x4f, 0xbe, 0xc2, 0xd7, 0xc5, 0xe5, 0x9b, 0xef, + 0x34, 0x7a, 0xea, 0x07, 0x8f, 0x5d, 0x6f, 0xaf, 0x87, 0xc8, 0xcb, 0xa6, 0xc8, 0x24, 0x9f, 0x8c, + 0x1d, 0xf9, 0x0a, 0xe6, 0x6a, 0xf9, 0xc2, 0x7b, 0x0a, 0xe9, 0xbe, 0xbc, 0xd4, 0xe0, 0x02, 0x46, + 0xcf, 0x9c, 0xb4, 0xee, 0x5d, 0x85, 0x7e, 0xc1, 0xb3, 0x29, 0x4a, 0x5f, 0x7d, 0xc3, 0x0f, 0x9a, + 0xbd, 0x25, 0x96, 0xcd, 0x40, 0xda, 0x04, 0x9b, 0x54, 0xc6, 0x17, 0x70, 0xae, 0x96, 0x2b, 0xba, + 0x97, 0x88, 0x5e, 0x3b, 0xc9, 0xf3, 0xa8, 0x8a, 0x13, 0xd6, 0xbb, 0xab, 0xcc, 0x15, 0x9c, 0xd3, + 0xd8, 0x3a, 0xb4, 0x19, 0xd0, 0x47, 0x34, 0xc0, 0x70, 0xed, 0x5e, 0x81, 0xca, 0x26, 0xb9, 0x6c, + 0xf9, 0x0a, 0x9c, 0xa9, 0xa5, 0x44, 0xe5, 0xb1, 0xf4, 0x3a, 0xff, 0x99, 0xc2, 0x96, 0x1e, 0xb3, + 0x5e, 0x3d, 0xa2, 0x84, 0xc6, 0xee, 0xd1, 0x68, 0x7b, 0xa5, 0x87, 0x96, 0xe4, 0x7d, 0x02, 0x49, + 0xb8, 0x73, 0x87, 0x71, 0xd6, 0x34, 0xce, 0x34, 0x45, 0xee, 0xc7, 0xfb, 0xa9, 0x3c, 0x0b, 0xe9, + 0x59, 0x6c, 0x9e, 0x84, 0x37, 0x71, 0x2e, 0x14, 0x21, 0xcb, 0xb3, 0xf1, 0x16, 0x80, 0x43, 0x62, + 0x57, 0x9d, 0x16, 0xbd, 0x1c, 0x92, 0x0a, 0x37, 0xff, 0xf8, 0xf0, 0x10, 0xb0, 0x4b, 0xa9, 0x50, + 0xf6, 0xae, 0x22, 0xb8, 0x17, 0x74, 0xd5, 0x6f, 0x3c, 0xd6, 0xbd, 0xa0, 0xec, 0x77, 0xd2, 0x3d, + 0xc8, 0x60, 0x3b, 0xf3, 0x62, 0xc6, 0x67, 0x3f, 0x8c, 0xc0, 0x2f, 0x04, 0xc4, 0x33, 0x7e, 0x12, + 0x2e, 0x3c, 0x48, 0x6f, 0x4a, 0xdf, 0x22, 0x16, 0x68, 0x4a, 0xce, 0x55, 0x8d, 0x72, 0x2b, 0x22, + 0x93, 0xe9, 0x56, 0xd4, 0x2b, 0x9a, 0xef, 0xcb, 0x27, 0x36, 0x6d, 0xb7, 0x30, 0x0a, 0xfa, 0xc0, + 0xe7, 0x3c, 0x71, 0x60, 0x6c, 0x1a, 0xd5, 0x3b, 0x7e, 0x6b, 0x4a, 0x44, 0xfd, 0x18, 0x8a, 0x57, + 0xd9, 0x8e, 0xd3, 0xb8, 0x58, 0x95, 0x7a, 0x30, 0xd2, 0xed, 0x02, 0x59, 0x87, 0xb3, 0xf7, 0x68, + 0x24, 0xe6, 0x38, 0x9b, 0x86, 0x51, 0xe0, 0x36, 0xa2, 0xae, 0x07, 0x83, 0xd2, 0x36, 0xc9, 0xe0, + 0xd9, 0x79, 0x8b, 0xc9, 0xab, 0x65, 0xcb, 0xeb, 0xca, 0xd7, 0x25, 0x44, 0x56, 0x9c, 0x36, 0x9c, + 0xa4, 0x8a, 0xf9, 0x43, 0x7c, 0x98, 0x47, 0xe0, 0xe4, 0xb3, 0x16, 0xe3, 0xec, 0x27, 0xc2, 0xda, + 0xba, 0x09, 0x43, 0x9c, 0x29, 0x77, 0x41, 0x1d, 0xd7, 0x79, 0xc8, 0x1d, 0x18, 0x55, 0x21, 0x34, + 0xc4, 0x40, 0xe5, 0xd6, 0xeb, 0x0e, 0x8c, 0x72, 0xd3, 0xea, 0xf8, 0x2c, 0x1f, 0xc0, 0xa8, 0x8a, + 0xb9, 0x39, 0xf1, 0x4a, 0xff, 0x09, 0x4c, 0xe8, 0xd1, 0x37, 0x27, 0x57, 0xe4, 0x47, 0x78, 0x7c, + 0x2b, 0x4f, 0x49, 0xf2, 0xf9, 0x67, 0x12, 0x49, 0x61, 0x84, 0x4a, 0xf9, 0x04, 0x29, 0x81, 0xb9, + 0xd5, 0x3f, 0x93, 0xe2, 0x26, 0x1f, 0xc8, 0x9b, 0x4c, 0x8a, 0x39, 0x4d, 0xd4, 0x45, 0x67, 0x93, + 0x5c, 0xcd, 0xcf, 0xc3, 0xac, 0x26, 0xd8, 0x9e, 0xd5, 0x3e, 0xce, 0x31, 0x73, 0x6f, 0xd5, 0xe5, + 0x49, 0xd9, 0xc0, 0x5d, 0x5a, 0xea, 0x3d, 0xbe, 0x7c, 0x41, 0x97, 0xf2, 0x9f, 0xf0, 0xc3, 0xce, + 0xb8, 0x8f, 0x56, 0x60, 0x0a, 0x9b, 0xdb, 0xbc, 0x2e, 0x4f, 0x02, 0xc6, 0x66, 0x6f, 0x5a, 0x5c, + 0x17, 0xb6, 0x6e, 0x56, 0xb4, 0xb8, 0x9f, 0xf9, 0x52, 0xc4, 0xad, 0xc8, 0x20, 0xc6, 0xe3, 0x37, + 0x36, 0xbf, 0x66, 0xe7, 0x33, 0x0e, 0xb6, 0x7b, 0xf6, 0x45, 0x9e, 0xb8, 0x5f, 0xc0, 0xdd, 0x61, + 0x66, 0x56, 0xb0, 0x7c, 0x61, 0xd7, 0xb5, 0xd8, 0x88, 0x4c, 0x4e, 0xb5, 0xe8, 0x3d, 0xc6, 0x2b, + 0x62, 0xd9, 0x2f, 0x16, 0xbe, 0xda, 0x43, 0x8a, 0xd4, 0xc4, 0x6b, 0x3d, 0xe9, 0xd4, 0x31, 0xe9, + 0x79, 0xbe, 0xc2, 0x66, 0x97, 0xd7, 0xe3, 0x05, 0xc6, 0x8c, 0x93, 0x6b, 0x15, 0x21, 0x9a, 0x2d, + 0xd0, 0x8c, 0x10, 0xed, 0xda, 0x86, 0x3c, 0xf5, 0x7f, 0x06, 0xe5, 0x38, 0x00, 0xe4, 0x64, 0x9d, + 0x90, 0x1f, 0x98, 0x48, 0x52, 0x9a, 0x0a, 0x49, 0xb7, 0xb7, 0x7e, 0xe6, 0xae, 0xe4, 0x69, 0x58, + 0xbf, 0x06, 0x23, 0x02, 0xdb, 0x12, 0x6f, 0x77, 0xe6, 0xbd, 0x02, 0xda, 0xc5, 0x0f, 0x2b, 0xee, + 0xcc, 0xbd, 0x14, 0x41, 0xe9, 0xde, 0x3e, 0xb9, 0x20, 0x15, 0x9f, 0x91, 0x10, 0x64, 0x75, 0xe9, + 0xde, 0xde, 0x47, 0x8f, 0xa5, 0x9c, 0x7e, 0x3d, 0x79, 0x87, 0x3a, 0xf1, 0x3d, 0xb1, 0x44, 0x12, + 0x41, 0xfd, 0x6e, 0x6e, 0x1a, 0x95, 0xbc, 0xe4, 0x94, 0x45, 0xa1, 0x82, 0xa2, 0x4a, 0xb2, 0x08, + 0x06, 0x67, 0xa6, 0x88, 0x1f, 0xb8, 0xd1, 0xb3, 0x05, 0x7b, 0x35, 0x76, 0x2b, 0xe8, 0x08, 0x29, + 0x1b, 0x24, 0xd2, 0x5e, 0x25, 0x5f, 0xe2, 0x54, 0x22, 0xc4, 0x57, 0x7d, 0x3f, 0x0a, 0xa3, 0xc0, + 0x69, 0xd7, 0xf0, 0x4d, 0xe3, 0xdc, 0x46, 0xc7, 0x31, 0xdc, 0x59, 0x6c, 0x5a, 0x48, 0xa9, 0x48, + 0x32, 0x9f, 0x95, 0xf9, 0x46, 0x5d, 0xab, 0xc9, 0x42, 0x76, 0xb1, 0x5c, 0x6a, 0x32, 0xad, 0xfc, + 0xcb, 0x14, 0x5a, 0x87, 0xd9, 0x9c, 0x7c, 0x41, 0xea, 0xf4, 0xb6, 0x7b, 0x3e, 0xa1, 0xb9, 0xee, + 0x05, 0x93, 0xaf, 0x60, 0x26, 0x33, 0xa1, 0x90, 0xf2, 0x40, 0x77, 0x4b, 0x37, 0xd4, 0x4b, 0xf8, + 0x63, 0x28, 0xf1, 0x0b, 0x1d, 0x18, 0xb7, 0x6c, 0xe4, 0x96, 0x89, 0xaf, 0xf9, 0xe4, 0x10, 0x24, + 0xe7, 0xeb, 0x7c, 0x3a, 0x75, 0xd9, 0x7c, 0x1a, 0x93, 0x8a, 0xc8, 0x47, 0x98, 0xc5, 0x4b, 0xfa, + 0xea, 0xc3, 0xcb, 0x42, 0x76, 0xbb, 0x4b, 0xb4, 0x09, 0x33, 0x3b, 0x34, 0x70, 0x1f, 0x3d, 0x4b, + 0x0a, 0x94, 0x9a, 0xc9, 0xc4, 0x76, 0x93, 0xf8, 0x39, 0xcc, 0x2e, 0xf8, 0x07, 0x6d, 0x71, 0x6b, + 0xcf, 0x90, 0xa9, 0x8e, 0xe2, 0xb3, 0xf1, 0xbd, 0x63, 0x99, 0xe6, 0xd4, 0xb5, 0x42, 0x9d, 0x6f, + 0x01, 0xaf, 0xb3, 0x5e, 0x37, 0xc3, 0x09, 0x32, 0x48, 0xe2, 0xcb, 0x18, 0xd2, 0x94, 0xd3, 0xf9, + 0xb7, 0x70, 0x10, 0x26, 0xf8, 0xb8, 0x6f, 0x4e, 0x1b, 0x84, 0x59, 0xf8, 0xee, 0x77, 0xc0, 0x32, + 0xa4, 0xf2, 0x02, 0xf3, 0xa5, 0x1e, 0xa3, 0xb6, 0xeb, 0x72, 0x6d, 0x31, 0x1f, 0xcd, 0x4f, 0x04, + 0x4d, 0x67, 0xbe, 0xa8, 0x9f, 0x59, 0x4f, 0x2d, 0xab, 0x42, 0xab, 0xd5, 0x65, 0x8b, 0x45, 0xf4, + 0xb4, 0x0a, 0x8c, 0x12, 0x9d, 0xf8, 0x13, 0x3a, 0x6f, 0xb7, 0xd9, 0x3a, 0xc5, 0x8c, 0x9b, 0xda, + 0xf7, 0x61, 0xbc, 0xa6, 0x17, 0x9e, 0x51, 0x48, 0xee, 0xa0, 0x50, 0xb7, 0x80, 0x7a, 0xd7, 0xbd, + 0x4b, 0x2c, 0xa8, 0x5a, 0x78, 0x8e, 0xd5, 0x8a, 0xdc, 0xd0, 0x19, 0xe3, 0x61, 0x38, 0xb5, 0x0a, + 0x64, 0xbd, 0xdb, 0xa8, 0x42, 0x67, 0xb2, 0xdf, 0x92, 0xab, 0xf3, 0xe7, 0x66, 0x92, 0xcf, 0x72, + 0x12, 0xab, 0xf7, 0xfb, 0xb7, 0x2a, 0x26, 0xbe, 0xeb, 0xbb, 0x9e, 0x3c, 0xce, 0x27, 0x7e, 0x0a, + 0x4f, 0x8f, 0xf3, 0x49, 0x3d, 0xb0, 0xa7, 0xc7, 0xf9, 0x64, 0xbc, 0x9e, 0xb7, 0x84, 0xb2, 0xe2, + 0x77, 0x7a, 0xba, 0x38, 0x23, 0x94, 0x98, 0x8c, 0xe7, 0x80, 0x1e, 0xe8, 0xc9, 0x39, 0xf8, 0xeb, + 0x3e, 0x5d, 0x7c, 0xad, 0xc9, 0xa4, 0x1c, 0x89, 0xe7, 0x80, 0xee, 0x42, 0x91, 0x3f, 0x74, 0x10, + 0xe7, 0x34, 0x8c, 0x43, 0xff, 0xd2, 0xef, 0x2f, 0x74, 0xe9, 0xd4, 0x62, 0x32, 0x13, 0x9c, 0x72, + 0x99, 0xe5, 0xa4, 0x88, 0xeb, 0x32, 0x54, 0x21, 0xce, 0xf7, 0xa6, 0x1c, 0x53, 0xa9, 0x14, 0x70, + 0x73, 0xe7, 0x32, 0x30, 0x6a, 0x4b, 0x39, 0xae, 0x67, 0x87, 0x53, 0x4d, 0xca, 0x48, 0x19, 0x37, + 0x77, 0x3e, 0x13, 0x27, 0x04, 0x45, 0xfc, 0x09, 0xe8, 0xec, 0xf7, 0xb5, 0xe3, 0x8b, 0x5c, 0x5d, + 0x68, 0x64, 0x31, 0x37, 0x8e, 0x43, 0x2a, 0x4a, 0xa5, 0xea, 0x95, 0xa2, 0x8c, 0x47, 0xbd, 0x5f, + 0xcb, 0xb8, 0x6b, 0x61, 0x50, 0xc4, 0xd1, 0x60, 0xdd, 0x5f, 0x18, 0x27, 0x0f, 0xe5, 0xab, 0x31, + 0x39, 0x25, 0xf5, 0x12, 0x90, 0xdb, 0x83, 0x0f, 0xe5, 0x3b, 0x31, 0x2f, 0x5b, 0xf0, 0x2e, 0x5c, + 0x48, 0x5c, 0xe0, 0x30, 0x05, 0xdf, 0xc8, 0xbe, 0xe5, 0x91, 0xa9, 0x9e, 0xfc, 0x3d, 0xfb, 0xe5, + 0xf4, 0x45, 0x8f, 0x44, 0xbf, 0x9f, 0x74, 0xce, 0x5b, 0x83, 0x49, 0x9c, 0x66, 0xe4, 0xf3, 0xf4, + 0x71, 0x6e, 0x18, 0x13, 0x9c, 0x4c, 0x52, 0x94, 0xc4, 0xaa, 0xfb, 0xe3, 0xe3, 0xe2, 0x52, 0x30, + 0x7f, 0xec, 0x7e, 0xce, 0xbc, 0x29, 0x8c, 0xc0, 0xac, 0x55, 0x4c, 0xbc, 0xa1, 0x4f, 0x3e, 0x82, + 0xd3, 0xf1, 0x5d, 0x61, 0x2e, 0x22, 0x83, 0xac, 0x8b, 0xa3, 0xec, 0x74, 0x7c, 0x61, 0xf8, 0xe4, + 0xec, 0xcb, 0x72, 0x29, 0x8a, 0xd9, 0x2f, 0xa6, 0xae, 0xbb, 0x18, 0x6d, 0x38, 0xce, 0x8a, 0xa4, + 0xe9, 0xf6, 0xa4, 0xbd, 0xd3, 0xc0, 0xcf, 0x2d, 0x3b, 0xed, 0xa1, 0xfe, 0xb9, 0x75, 0x4d, 0xcd, + 0xa8, 0xb6, 0xbf, 0x39, 0x72, 0xd6, 0xe0, 0x2a, 0xa6, 0x4a, 0xd9, 0xe4, 0xc9, 0xf1, 0xb2, 0xa9, + 0xf2, 0xeb, 0x9e, 0x4c, 0xb0, 0xd2, 0x82, 0x2b, 0x3d, 0xf3, 0x3e, 0x92, 0x5b, 0x46, 0x88, 0x4b, + 0xef, 0x0c, 0x91, 0x5d, 0x2c, 0x8f, 0xe9, 0xac, 0xf4, 0x89, 0x6a, 0x9d, 0xed, 0x92, 0xc9, 0x51, + 0xad, 0xb3, 0x5d, 0xf3, 0x2f, 0x7e, 0x8e, 0x4f, 0x31, 0x89, 0x35, 0x0a, 0xd3, 0x1f, 0x51, 0x8f, + 0x27, 0x85, 0xee, 0x7a, 0xec, 0x73, 0xc5, 0x3c, 0x14, 0x4d, 0x31, 0xa2, 0x4d, 0x73, 0x49, 0x58, + 0x62, 0x79, 0xc2, 0x7b, 0x0b, 0xe9, 0x12, 0x5a, 0x7d, 0x89, 0x0f, 0xc0, 0x13, 0xd7, 0x3c, 0x07, + 0x5e, 0x5d, 0xfc, 0xc9, 0x7f, 0xbd, 0x54, 0xf8, 0xc9, 0x4f, 0x2f, 0x15, 0xfe, 0xe3, 0x4f, 0x2f, + 0x15, 0xfe, 0xcb, 0x4f, 0x2f, 0x15, 0xbe, 0x9c, 0x3f, 0x5e, 0x6a, 0x62, 0xfe, 0x78, 0xe2, 0x2d, + 0x2e, 0x6e, 0x08, 0xff, 0x7b, 0xf3, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x41, 0xea, 0xbb, + 0x9f, 0xee, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -35148,6 +35422,191 @@ func (m *CreateRegisterChallengeRequest) MarshalToSizedBuffer(dAtA []byte) (int, return len(dAtA) - i, nil } +func (m *IdentityCenterAccount) 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 *IdentityCenterAccount) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IdentityCenterAccount) 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 len(m.Description) > 0 { + i -= len(m.Description) + copy(dAtA[i:], m.Description) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.Description))) + i-- + dAtA[i] = 0x22 + } + if len(m.AccountName) > 0 { + i -= len(m.AccountName) + copy(dAtA[i:], m.AccountName) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.AccountName))) + i-- + dAtA[i] = 0x1a + } + if len(m.ARN) > 0 { + i -= len(m.ARN) + copy(dAtA[i:], m.ARN) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.ARN))) + i-- + dAtA[i] = 0x12 + } + if len(m.ID) > 0 { + i -= len(m.ID) + copy(dAtA[i:], m.ID) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.ID))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *IdentityCenterPermissionSet) 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 *IdentityCenterPermissionSet) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IdentityCenterPermissionSet) 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 len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x12 + } + if len(m.ARN) > 0 { + i -= len(m.ARN) + copy(dAtA[i:], m.ARN) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.ARN))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *IdentityCenterAccountAssignment) 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 *IdentityCenterAccountAssignment) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IdentityCenterAccountAssignment) 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.PermissionSet != nil { + { + size, err := m.PermissionSet.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if m.Account != nil { + { + size, err := m.Account.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + if len(m.DisplayName) > 0 { + i -= len(m.DisplayName) + copy(dAtA[i:], m.DisplayName) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.DisplayName))) + i-- + dAtA[i] = 0x2a + } + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + if len(m.Version) > 0 { + i -= len(m.Version) + copy(dAtA[i:], m.Version) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.Version))) + i-- + dAtA[i] = 0x1a + } + if len(m.SubKind) > 0 { + i -= len(m.SubKind) + copy(dAtA[i:], m.SubKind) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.SubKind))) + i-- + dAtA[i] = 0x12 + } + if len(m.Kind) > 0 { + i -= len(m.Kind) + copy(dAtA[i:], m.Kind) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.Kind))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *PaginatedResource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -35172,6 +35631,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 { @@ -35191,15 +35659,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 } @@ -35434,6 +35893,29 @@ func (m *PaginatedResource_SAMLIdPServiceProvider) MarshalToSizedBuffer(dAtA []b } return len(dAtA) - i, nil } +func (m *PaginatedResource_IdentityCenterAccountAssignment) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PaginatedResource_IdentityCenterAccountAssignment) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.IdentityCenterAccountAssignment != nil { + { + size, err := m.IdentityCenterAccountAssignment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0x82 + } + return len(dAtA) - i, nil +} func (m *ListUnifiedResourcesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -36155,12 +36637,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 + n106, err106 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err106 != nil { + return 0, err106 } - i -= n102 - i = encodeVarintAuthservice(dAtA, i, uint64(n102)) + i -= n106 + i = encodeVarintAuthservice(dAtA, i, uint64(n106)) i-- dAtA[i] = 0xa } @@ -42808,6 +43290,92 @@ func (m *CreateRegisterChallengeRequest) Size() (n int) { return n } +func (m *IdentityCenterAccount) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ID) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.ARN) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.AccountName) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.Description) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *IdentityCenterPermissionSet) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ARN) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.Name) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *IdentityCenterAccountAssignment) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Kind) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.SubKind) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.Version) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = m.Metadata.Size() + n += 1 + l + sovAuthservice(uint64(l)) + l = len(m.DisplayName) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + if m.Account != nil { + l = m.Account.Size() + n += 1 + l + sovAuthservice(uint64(l)) + } + if m.PermissionSet != nil { + l = m.PermissionSet.Size() + n += 1 + l + sovAuthservice(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *PaginatedResource) Size() (n int) { if m == nil { return 0 @@ -42964,6 +43532,18 @@ func (m *PaginatedResource_SAMLIdPServiceProvider) Size() (n int) { } return n } +func (m *PaginatedResource_IdentityCenterAccountAssignment) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.IdentityCenterAccountAssignment != nil { + l = m.IdentityCenterAccountAssignment.Size() + n += 2 + l + sovAuthservice(uint64(l)) + } + return n +} func (m *ListUnifiedResourcesRequest) Size() (n int) { if m == nil { return 0 @@ -63896,99 +64476,834 @@ func (m *CreateAuthenticateChallengeRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ChallengeExtensions == nil { - m.ChallengeExtensions = &v11.ChallengeExtensions{} + if m.ChallengeExtensions == nil { + m.ChallengeExtensions = &v11.ChallengeExtensions{} + } + if err := m.ChallengeExtensions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SSOClientRedirectURL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SSOClientRedirectURL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuthservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthservice + } + 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 *CreatePrivilegeTokenRequest) 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 ErrIntOverflowAuthservice + } + 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: CreatePrivilegeTokenRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreatePrivilegeTokenRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExistingMFAResponse", 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 + } + if m.ExistingMFAResponse == nil { + m.ExistingMFAResponse = &MFAAuthenticateResponse{} + } + if err := m.ExistingMFAResponse.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuthservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthservice + } + 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 *CreateRegisterChallengeRequest) 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 ErrIntOverflowAuthservice + } + 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: CreateRegisterChallengeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CreateRegisterChallengeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceType", wireType) + } + m.DeviceType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DeviceType |= DeviceType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceUsage", wireType) + } + m.DeviceUsage = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DeviceUsage |= DeviceUsage(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExistingMFAResponse", 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 + } + if m.ExistingMFAResponse == nil { + m.ExistingMFAResponse = &MFAAuthenticateResponse{} + } + if err := m.ExistingMFAResponse.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuthservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthservice + } + 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 *IdentityCenterAccount) 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 ErrIntOverflowAuthservice + } + 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: IdentityCenterAccount: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IdentityCenterAccount: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ARN", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ARN = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccountName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccountName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Description = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuthservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthservice + } + 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 *IdentityCenterPermissionSet) 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 ErrIntOverflowAuthservice + } + 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: IdentityCenterPermissionSet: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IdentityCenterPermissionSet: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ARN", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ARN = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuthservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthservice + } + 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 *IdentityCenterAccountAssignment) 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 ErrIntOverflowAuthservice + } + 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: IdentityCenterAccountAssignment: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IdentityCenterAccountAssignment: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SubKind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + 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 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 + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DisplayName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DisplayName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Account", 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 + } + if m.Account == nil { + m.Account = &IdentityCenterAccount{} } - if err := m.ChallengeExtensions.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Account.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SSOClientRedirectURL", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - 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 ErrInvalidLengthAuthservice - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAuthservice - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SSOClientRedirectURL = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAuthservice(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAuthservice - } - 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 *CreatePrivilegeTokenRequest) 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 ErrIntOverflowAuthservice - } - 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: CreatePrivilegeTokenRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CreatePrivilegeTokenRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExistingMFAResponse", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PermissionSet", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -64015,167 +65330,10 @@ func (m *CreatePrivilegeTokenRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.ExistingMFAResponse == nil { - m.ExistingMFAResponse = &MFAAuthenticateResponse{} + if m.PermissionSet == nil { + m.PermissionSet = &IdentityCenterPermissionSet{} } - if err := m.ExistingMFAResponse.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipAuthservice(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthAuthservice - } - 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 *CreateRegisterChallengeRequest) 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 ErrIntOverflowAuthservice - } - 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: CreateRegisterChallengeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CreateRegisterChallengeRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TokenID", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - 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 ErrInvalidLengthAuthservice - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthAuthservice - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TokenID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DeviceType", wireType) - } - m.DeviceType = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.DeviceType |= DeviceType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field DeviceUsage", wireType) - } - m.DeviceUsage = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowAuthservice - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.DeviceUsage |= DeviceUsage(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExistingMFAResponse", 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 - } - if m.ExistingMFAResponse == nil { - m.ExistingMFAResponse = &MFAAuthenticateResponse{} - } - if err := m.ExistingMFAResponse.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.PermissionSet.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -64667,6 +65825,41 @@ func (m *PaginatedResource) Unmarshal(dAtA []byte) error { } } m.RequiresRequest = bool(v != 0) + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IdentityCenterAccountAssignment", 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 := &IdentityCenterAccountAssignment{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Resource = &PaginatedResource_IdentityCenterAccountAssignment{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..e1a9b29a48355 100644 --- a/api/client/proto/event.pb.go +++ b/api/client/proto/event.pb.go @@ -37,6 +37,7 @@ import ( v11 "github.com/gravitational/teleport/api/gen/proto/go/teleport/userloginstate/v1" v2 "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v2" v112 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" + v115 "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1" types "github.com/gravitational/teleport/api/types" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" @@ -186,6 +187,7 @@ type Event struct { // *Event_IdentityCenterAccount // *Event_IdentityCenterPrincipalAssignment // *Event_IdentityCenterAccountAssignment + // *Event_WorkloadIdentity Resource isEvent_Resource `protobuf_oneof:"Resource"` } @@ -716,6 +718,13 @@ func (x *Event) GetIdentityCenterAccountAssignment() *v114.AccountAssignment { return nil } +func (x *Event) GetWorkloadIdentity() *v115.WorkloadIdentity { + if x, ok := x.GetResource().(*Event_WorkloadIdentity); ok { + return x.WorkloadIdentity + } + return nil +} + type isEvent_Resource interface { isEvent_Resource() } @@ -1071,6 +1080,11 @@ type Event_IdentityCenterAccountAssignment struct { IdentityCenterAccountAssignment *v114.AccountAssignment `protobuf:"bytes,74,opt,name=IdentityCenterAccountAssignment,proto3,oneof"` } +type Event_WorkloadIdentity struct { + // WorkloadIdentity is a resource for workload identity. + WorkloadIdentity *v115.WorkloadIdentity `protobuf:"bytes,76,opt,name=WorkloadIdentity,proto3,oneof"` +} + func (*Event_ResourceHeader) isEvent_Resource() {} func (*Event_CertAuthority) isEvent_Resource() {} @@ -1209,6 +1223,8 @@ func (*Event_IdentityCenterPrincipalAssignment) isEvent_Resource() {} func (*Event_IdentityCenterAccountAssignment) isEvent_Resource() {} +func (*Event_WorkloadIdentity) isEvent_Resource() {} + var File_teleport_legacy_client_proto_event_proto protoreflect.FileDescriptor var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ @@ -1267,338 +1283,347 @@ 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, - 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, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, - 0x00, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x12, 0x3e, 0x0a, 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x56, 0x32, - 0x48, 0x00, 0x52, 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x56, 0x32, 0x48, 0x00, - 0x52, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x41, - 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, - 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, 0x32, 0x48, - 0x00, 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x38, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0b, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x55, - 0x73, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x23, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x36, 0x48, 0x00, 0x52, - 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, - 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x06, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x56, - 0x32, 0x48, 0x00, 0x52, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x12, 0x47, 0x0a, 0x10, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x10, 0x54, 0x75, 0x6e, 0x6e, 0x65, - 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0d, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x41, - 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x56, - 0x33, 0x48, 0x00, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, - 0x52, 0x0a, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x08, - 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, - 0x33, 0x48, 0x00, 0x52, 0x08, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x5c, 0x0a, + 0x1a, 0x2b, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 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, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3e, + 0x0a, 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x65, + 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x56, 0x32, 0x48, 0x00, 0x52, + 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3b, + 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0c, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0e, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x38, + 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0b, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x0a, + 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x36, 0x48, 0x00, 0x52, 0x04, 0x52, 0x6f, + 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, + 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, + 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x32, 0x48, 0x00, + 0x52, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, + 0x47, 0x0a, 0x10, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x10, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0d, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, + 0x32, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, + 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x41, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, + 0x48, 0x00, 0x52, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, + 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0a, 0x57, + 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, 0x33, 0x48, 0x00, + 0x52, 0x08, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x17, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, - 0x48, 0x00, 0x52, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x16, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x16, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x56, 0x32, 0x48, 0x00, 0x52, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x6f, 0x63, 0x6b, - 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4c, - 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x50, 0x0a, - 0x13, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x56, 0x34, 0x48, 0x00, 0x52, 0x13, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x56, 0x0a, 0x15, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, - 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, - 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x33, 0x48, 0x00, - 0x52, 0x15, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, - 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0e, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x33, 0x48, - 0x00, 0x52, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x41, - 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x56, 0x33, 0x48, 0x00, 0x52, 0x09, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, - 0x20, 0x0a, 0x03, 0x41, 0x70, 0x70, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x03, 0x41, 0x70, - 0x70, 0x12, 0x41, 0x0a, 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, - 0x48, 0x00, 0x52, 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, - 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x10, 0x4b, 0x75, 0x62, - 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x4a, 0x0a, - 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x56, 0x31, - 0x48, 0x00, 0x52, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x44, 0x0a, + 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x16, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x16, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, + 0x00, 0x52, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, + 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x50, 0x0a, 0x13, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x56, 0x34, 0x48, 0x00, 0x52, 0x13, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x56, 0x0a, 0x15, + 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, + 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x33, 0x48, 0x00, 0x52, 0x15, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, + 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, + 0x74, 0x6f, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, + 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x33, 0x48, 0x00, 0x52, 0x08, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x41, 0x70, 0x70, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, 0x48, + 0x00, 0x52, 0x09, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x03, + 0x41, 0x70, 0x70, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x03, 0x41, 0x70, 0x70, 0x12, 0x41, + 0x0a, 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, + 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x47, 0x0a, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x11, 0x4b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, + 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x56, + 0x33, 0x48, 0x00, 0x52, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x65, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x56, 0x31, 0x48, 0x00, 0x52, + 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0f, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x23, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x31, - 0x48, 0x00, 0x52, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x59, 0x0a, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x24, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x41, 0x4d, 0x4c, - 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x56, 0x31, 0x48, 0x00, 0x52, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x3d, - 0x0a, 0x0e, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, - 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x53, - 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, - 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x56, 0x31, 0x48, 0x00, 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x27, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x49, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x56, 0x31, 0x48, 0x00, 0x52, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x52, 0x75, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, - 0x65, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, - 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x31, 0x48, 0x00, 0x52, - 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x57, 0x0a, 0x16, - 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, - 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x48, - 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x12, 0x59, 0x0a, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, + 0x31, 0x48, 0x00, 0x52, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0e, 0x53, + 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x25, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x53, 0x41, 0x4d, 0x4c, + 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x09, 0x55, 0x73, + 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, + 0x31, 0x48, 0x00, 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2f, + 0x0a, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x56, 0x31, 0x48, 0x00, 0x52, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, + 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x56, 0x31, + 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, + 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, + 0x48, 0x00, 0x52, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x38, 0x0a, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x2b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x61, 0x74, + 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0b, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x57, 0x0a, 0x16, 0x48, 0x65, 0x61, + 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x48, 0x65, 0x61, 0x64, + 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, + 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0e, + 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, + 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x58, 0x0a, 0x0f, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, + 0x52, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x06, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x06, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x48, 0x00, 0x52, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x4c, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x55, - 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x2e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, - 0x00, 0x52, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x58, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x75, 0x64, - 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x38, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, - 0x00, 0x52, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0b, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, - 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x10, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x12, 0x6d, 0x0a, 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, - 0x7e, 0x0a, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, 0x69, - 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x37, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6b, - 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, - 0x73, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, - 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, - 0x55, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x39, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x00, 0x52, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x43, 0x72, 0x6f, 0x77, 0x6e, - 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, - 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x48, - 0x00, 0x52, 0x0a, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x12, 0x4e, 0x0a, - 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x64, 0x62, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x46, 0x0a, - 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x3c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x3d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x48, 0x00, 0x52, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x55, 0x0a, 0x10, 0x53, 0x50, 0x49, - 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, - 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, - 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x56, 0x0a, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, - 0x52, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x5a, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x56, 0x32, 0x18, 0x42, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x53, - 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x56, 0x32, 0x12, - 0x3d, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x18, 0x43, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, - 0x73, 0x6b, 0x48, 0x00, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x56, - 0x0a, 0x15, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, - 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x57, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x56, 0x31, 0x48, 0x00, 0x52, - 0x15, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, - 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x6a, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x68, 0x0a, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x47, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, - 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, - 0x75, 0x74, 0x48, 0x00, 0x52, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x5b, 0x0a, 0x15, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, - 0x48, 0x00, 0x52, 0x15, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, - 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x7f, 0x0a, 0x21, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, - 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x49, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 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, 0x48, 0x00, 0x52, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, - 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 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, 0x18, 0x4a, 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, 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, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x10, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x6d, 0x0a, + 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x75, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x7e, 0x0a, 0x1a, + 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6b, 0x75, 0x62, 0x65, + 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, + 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, 0x00, + 0x52, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, 0x69, 0x74, + 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x55, 0x0a, 0x10, + 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x00, 0x52, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, + 0x52, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, + 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x0a, + 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x12, 0x4e, 0x0a, 0x0e, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x3b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x64, 0x62, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x46, 0x0a, 0x0b, 0x42, 0x6f, + 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x12, 0x62, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x48, + 0x00, 0x52, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x55, 0x0a, 0x10, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, + 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, + 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x56, 0x0a, + 0x10, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x48, 0x00, 0x52, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x5a, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x56, 0x32, 0x18, 0x42, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x32, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x56, 0x32, 0x12, 0x3d, 0x0a, 0x08, + 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x18, 0x43, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x48, + 0x00, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x56, 0x0a, 0x15, 0x44, + 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, + 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x56, 0x31, 0x48, 0x00, 0x52, 0x15, 0x44, 0x79, + 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, + 0x74, 0x6f, 0x70, 0x12, 0x6a, 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x48, 0x00, 0x52, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x68, 0x0a, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x48, + 0x00, 0x52, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x5b, 0x0a, 0x15, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 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, 0x48, 0x00, 0x52, + 0x15, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x7f, 0x0a, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, + 0x6c, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x49, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2f, 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, 0x48, 0x00, 0x52, 0x21, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 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, 0x18, 0x4a, 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, 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, 0x12, 0x5c, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x48, 0x00, 0x52, 0x10, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 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 +1709,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 + (*v115.WorkloadIdentity)(nil), // 68: teleport.workloadidentity.v1.WorkloadIdentity } var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 0, // 0: proto.Event.Type:type_name -> proto.Operation @@ -1756,11 +1782,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.WorkloadIdentity:type_name -> teleport.workloadidentity.v1.WorkloadIdentity + 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 +1865,7 @@ func file_teleport_legacy_client_proto_event_proto_init() { (*Event_IdentityCenterAccount)(nil), (*Event_IdentityCenterPrincipalAssignment)(nil), (*Event_IdentityCenterAccountAssignment)(nil), + (*Event_WorkloadIdentity)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/api/client/proto/identitycenter.go b/api/client/proto/identitycenter.go new file mode 100644 index 0000000000000..ac0886a6b2772 --- /dev/null +++ b/api/client/proto/identitycenter.go @@ -0,0 +1,61 @@ +// 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 proto + +import ( + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" + "github.com/gravitational/teleport/api/types" +) + +// PackICAccountAssignment packs an Identity Center Account Assignment in to its +// wire format. +func PackICAccountAssignment(assignment *identitycenterv1.AccountAssignment) isPaginatedResource_Resource { + return &PaginatedResource_IdentityCenterAccountAssignment{ + IdentityCenterAccountAssignment: &IdentityCenterAccountAssignment{ + Kind: types.KindIdentityCenterAccountAssignment, + Version: assignment.GetVersion(), + Metadata: types.Metadata153ToLegacy(assignment.Metadata), + DisplayName: assignment.GetSpec().GetDisplay(), + Account: &IdentityCenterAccount{ + AccountName: assignment.GetSpec().GetAccountName(), + ID: assignment.GetSpec().GetAccountId(), + }, + PermissionSet: &IdentityCenterPermissionSet{ + ARN: assignment.GetSpec().GetPermissionSet().GetArn(), + Name: assignment.GetSpec().GetPermissionSet().GetName(), + }, + }, + } +} + +// UnpackICAccountAssignment converts a wire-format IdentityCenterAccountAssignment +// resource back into an identitycenterv1.AccountAssignment instance. +func UnpackICAccountAssignment(src *IdentityCenterAccountAssignment) types.ResourceWithLabels { + dst := &identitycenterv1.AccountAssignment{ + Kind: types.KindIdentityCenterAccountAssignment, + Version: src.Version, + Metadata: types.LegacyTo153Metadata(src.Metadata), + Spec: &identitycenterv1.AccountAssignmentSpec{ + AccountId: src.Account.ID, + AccountName: src.Account.AccountName, + Display: src.DisplayName, + PermissionSet: &identitycenterv1.PermissionSetInfo{ + Arn: src.PermissionSet.ARN, + Name: src.PermissionSet.Name, + }, + }, + } + return types.Resource153ToResourceWithLabels(dst) +} 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..360049153b1e0 100644 --- a/api/gen/proto/go/teleport/identitycenter/v1/identitycenter.pb.go +++ b/api/gen/proto/go/teleport/identitycenter/v1/identitycenter.pb.go @@ -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/workloadidentity/v1/resource.pb.go b/api/gen/proto/go/teleport/workloadidentity/v1/resource.pb.go new file mode 100644 index 0000000000000..684bfe1f98bb4 --- /dev/null +++ b/api/gen/proto/go/teleport/workloadidentity/v1/resource.pb.go @@ -0,0 +1,523 @@ +// 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.1 +// protoc (unknown) +// source: teleport/workloadidentity/v1/resource.proto + +package workloadidentityv1pb + +import ( + v1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// WorkloadIdentity represents a single, or group of similar, workload +// identities and configures the structure of workload identity credentials and +// authorization rules. is a resource that represents the configuration of a trust +// domain federation. +type WorkloadIdentity struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The kind of resource represented. + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + // Differentiates variations of the same kind. All resources should + // contain one, even if it is never populated. + SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` + // The version of the resource being represented. + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + // Common metadata that all resources share. + Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + // The configured properties of the WorkloadIdentity + Spec *WorkloadIdentitySpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` +} + +func (x *WorkloadIdentity) Reset() { + *x = WorkloadIdentity{} + mi := &file_teleport_workloadidentity_v1_resource_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WorkloadIdentity) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadIdentity) ProtoMessage() {} + +func (x *WorkloadIdentity) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_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 WorkloadIdentity.ProtoReflect.Descriptor instead. +func (*WorkloadIdentity) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_proto_rawDescGZIP(), []int{0} +} + +func (x *WorkloadIdentity) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *WorkloadIdentity) GetSubKind() string { + if x != nil { + return x.SubKind + } + return "" +} + +func (x *WorkloadIdentity) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *WorkloadIdentity) GetMetadata() *v1.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *WorkloadIdentity) GetSpec() *WorkloadIdentitySpec { + if x != nil { + return x.Spec + } + return nil +} + +// The individual conditions that make up a rule. +type WorkloadIdentityCondition struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the attribute to evaluate the condition against. + Attribute string `protobuf:"bytes,1,opt,name=attribute,proto3" json:"attribute,omitempty"` + // An exact string that the attribute must match. + Equals string `protobuf:"bytes,2,opt,name=equals,proto3" json:"equals,omitempty"` +} + +func (x *WorkloadIdentityCondition) Reset() { + *x = WorkloadIdentityCondition{} + mi := &file_teleport_workloadidentity_v1_resource_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WorkloadIdentityCondition) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadIdentityCondition) ProtoMessage() {} + +func (x *WorkloadIdentityCondition) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_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 WorkloadIdentityCondition.ProtoReflect.Descriptor instead. +func (*WorkloadIdentityCondition) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_proto_rawDescGZIP(), []int{1} +} + +func (x *WorkloadIdentityCondition) GetAttribute() string { + if x != nil { + return x.Attribute + } + return "" +} + +func (x *WorkloadIdentityCondition) GetEquals() string { + if x != nil { + return x.Equals + } + return "" +} + +// An individual rule that is evaluated during the issuance of a WorkloadIdentity. +type WorkloadIdentityRule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The conditions that must be met for this rule to be considered passed. + Conditions []*WorkloadIdentityCondition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"` +} + +func (x *WorkloadIdentityRule) Reset() { + *x = WorkloadIdentityRule{} + mi := &file_teleport_workloadidentity_v1_resource_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WorkloadIdentityRule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadIdentityRule) ProtoMessage() {} + +func (x *WorkloadIdentityRule) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_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 WorkloadIdentityRule.ProtoReflect.Descriptor instead. +func (*WorkloadIdentityRule) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_proto_rawDescGZIP(), []int{2} +} + +func (x *WorkloadIdentityRule) GetConditions() []*WorkloadIdentityCondition { + if x != nil { + return x.Conditions + } + return nil +} + +// The rules which are evaluated before the WorkloadIdentity can be issued. +type WorkloadIdentityRules struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A list of rules used to determine if a WorkloadIdentity can be issued. + // If none are provided, it will be considered a pass. If any are provided, + // then at least one must pass for the rules to be considered passed. + Allow []*WorkloadIdentityRule `protobuf:"bytes,1,rep,name=allow,proto3" json:"allow,omitempty"` +} + +func (x *WorkloadIdentityRules) Reset() { + *x = WorkloadIdentityRules{} + mi := &file_teleport_workloadidentity_v1_resource_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WorkloadIdentityRules) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadIdentityRules) ProtoMessage() {} + +func (x *WorkloadIdentityRules) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_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 WorkloadIdentityRules.ProtoReflect.Descriptor instead. +func (*WorkloadIdentityRules) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_proto_rawDescGZIP(), []int{3} +} + +func (x *WorkloadIdentityRules) GetAllow() []*WorkloadIdentityRule { + if x != nil { + return x.Allow + } + return nil +} + +// Configuration pertaining to the issuance of SPIFFE-compatible workload +// identity credentials. +type WorkloadIdentitySPIFFE struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The path of the SPIFFE ID that will be issued to the workload. + // + // This should be prefixed with a forward-slash ("/"). + // + // This field supports templating using attributes. + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // A freeform text field which is provided to workloads along with a + // credential produced by this WorkloadIdentity. This can be used to provide + // additional context that can be used to select between multiple credentials. + Hint string `protobuf:"bytes,2,opt,name=hint,proto3" json:"hint,omitempty"` +} + +func (x *WorkloadIdentitySPIFFE) Reset() { + *x = WorkloadIdentitySPIFFE{} + mi := &file_teleport_workloadidentity_v1_resource_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WorkloadIdentitySPIFFE) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadIdentitySPIFFE) ProtoMessage() {} + +func (x *WorkloadIdentitySPIFFE) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_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 WorkloadIdentitySPIFFE.ProtoReflect.Descriptor instead. +func (*WorkloadIdentitySPIFFE) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_proto_rawDescGZIP(), []int{4} +} + +func (x *WorkloadIdentitySPIFFE) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *WorkloadIdentitySPIFFE) GetHint() string { + if x != nil { + return x.Hint + } + return "" +} + +// The spec for the WorkloadIdentity resource. +type WorkloadIdentitySpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The rules which are evaluated before the WorkloadIdentity can be issued. + Rules *WorkloadIdentityRules `protobuf:"bytes,1,opt,name=rules,proto3" json:"rules,omitempty"` + // Configuration pertaining to the issuance of SPIFFE-compatible workload + // identity credentials. + Spiffe *WorkloadIdentitySPIFFE `protobuf:"bytes,2,opt,name=spiffe,proto3" json:"spiffe,omitempty"` +} + +func (x *WorkloadIdentitySpec) Reset() { + *x = WorkloadIdentitySpec{} + mi := &file_teleport_workloadidentity_v1_resource_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *WorkloadIdentitySpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkloadIdentitySpec) ProtoMessage() {} + +func (x *WorkloadIdentitySpec) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_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 WorkloadIdentitySpec.ProtoReflect.Descriptor instead. +func (*WorkloadIdentitySpec) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_proto_rawDescGZIP(), []int{5} +} + +func (x *WorkloadIdentitySpec) GetRules() *WorkloadIdentityRules { + if x != nil { + return x.Rules + } + return nil +} + +func (x *WorkloadIdentitySpec) GetSpiffe() *WorkloadIdentitySPIFFE { + if x != nil { + return x.Spiffe + } + return nil +} + +var File_teleport_workloadidentity_v1_resource_proto protoreflect.FileDescriptor + +var file_teleport_workloadidentity_v1_resource_proto_rawDesc = []byte{ + 0x0a, 0x2b, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 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, 0xdd, + 0x01, 0x0a, 0x10, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 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, 0x46, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x51, + 0x0a, 0x19, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x71, 0x75, + 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x71, 0x75, 0x61, 0x6c, + 0x73, 0x22, 0x6f, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x57, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x61, 0x0a, 0x15, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x05, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x3c, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, + 0x69, 0x6e, 0x74, 0x22, 0xaf, 0x01, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x70, 0x65, 0x63, 0x12, 0x49, 0x0a, 0x05, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x4c, 0x0a, 0x06, 0x73, 0x70, 0x69, 0x66, 0x66, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x52, 0x06, 0x73, + 0x70, 0x69, 0x66, 0x66, 0x65, 0x42, 0x66, 0x5a, 0x64, 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, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x76, 0x31, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_workloadidentity_v1_resource_proto_rawDescOnce sync.Once + file_teleport_workloadidentity_v1_resource_proto_rawDescData = file_teleport_workloadidentity_v1_resource_proto_rawDesc +) + +func file_teleport_workloadidentity_v1_resource_proto_rawDescGZIP() []byte { + file_teleport_workloadidentity_v1_resource_proto_rawDescOnce.Do(func() { + file_teleport_workloadidentity_v1_resource_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_workloadidentity_v1_resource_proto_rawDescData) + }) + return file_teleport_workloadidentity_v1_resource_proto_rawDescData +} + +var file_teleport_workloadidentity_v1_resource_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_teleport_workloadidentity_v1_resource_proto_goTypes = []any{ + (*WorkloadIdentity)(nil), // 0: teleport.workloadidentity.v1.WorkloadIdentity + (*WorkloadIdentityCondition)(nil), // 1: teleport.workloadidentity.v1.WorkloadIdentityCondition + (*WorkloadIdentityRule)(nil), // 2: teleport.workloadidentity.v1.WorkloadIdentityRule + (*WorkloadIdentityRules)(nil), // 3: teleport.workloadidentity.v1.WorkloadIdentityRules + (*WorkloadIdentitySPIFFE)(nil), // 4: teleport.workloadidentity.v1.WorkloadIdentitySPIFFE + (*WorkloadIdentitySpec)(nil), // 5: teleport.workloadidentity.v1.WorkloadIdentitySpec + (*v1.Metadata)(nil), // 6: teleport.header.v1.Metadata +} +var file_teleport_workloadidentity_v1_resource_proto_depIdxs = []int32{ + 6, // 0: teleport.workloadidentity.v1.WorkloadIdentity.metadata:type_name -> teleport.header.v1.Metadata + 5, // 1: teleport.workloadidentity.v1.WorkloadIdentity.spec:type_name -> teleport.workloadidentity.v1.WorkloadIdentitySpec + 1, // 2: teleport.workloadidentity.v1.WorkloadIdentityRule.conditions:type_name -> teleport.workloadidentity.v1.WorkloadIdentityCondition + 2, // 3: teleport.workloadidentity.v1.WorkloadIdentityRules.allow:type_name -> teleport.workloadidentity.v1.WorkloadIdentityRule + 3, // 4: teleport.workloadidentity.v1.WorkloadIdentitySpec.rules:type_name -> teleport.workloadidentity.v1.WorkloadIdentityRules + 4, // 5: teleport.workloadidentity.v1.WorkloadIdentitySpec.spiffe:type_name -> teleport.workloadidentity.v1.WorkloadIdentitySPIFFE + 6, // [6:6] is the sub-list for method output_type + 6, // [6:6] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name +} + +func init() { file_teleport_workloadidentity_v1_resource_proto_init() } +func file_teleport_workloadidentity_v1_resource_proto_init() { + if File_teleport_workloadidentity_v1_resource_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_workloadidentity_v1_resource_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_teleport_workloadidentity_v1_resource_proto_goTypes, + DependencyIndexes: file_teleport_workloadidentity_v1_resource_proto_depIdxs, + MessageInfos: file_teleport_workloadidentity_v1_resource_proto_msgTypes, + }.Build() + File_teleport_workloadidentity_v1_resource_proto = out.File + file_teleport_workloadidentity_v1_resource_proto_rawDesc = nil + file_teleport_workloadidentity_v1_resource_proto_goTypes = nil + file_teleport_workloadidentity_v1_resource_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/workloadidentity/v1/resource_service.pb.go b/api/gen/proto/go/teleport/workloadidentity/v1/resource_service.pb.go new file mode 100644 index 0000000000000..c311ba2a64e87 --- /dev/null +++ b/api/gen/proto/go/teleport/workloadidentity/v1/resource_service.pb.go @@ -0,0 +1,580 @@ +// 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.1 +// protoc (unknown) +// source: teleport/workloadidentity/v1/resource_service.proto + +package workloadidentityv1pb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + 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) +) + +// The request for CreateWorkloadIdentity. +type CreateWorkloadIdentityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The workload identity to create. + WorkloadIdentity *WorkloadIdentity `protobuf:"bytes,1,opt,name=workload_identity,json=workloadIdentity,proto3" json:"workload_identity,omitempty"` +} + +func (x *CreateWorkloadIdentityRequest) Reset() { + *x = CreateWorkloadIdentityRequest{} + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateWorkloadIdentityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateWorkloadIdentityRequest) ProtoMessage() {} + +func (x *CreateWorkloadIdentityRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateWorkloadIdentityRequest.ProtoReflect.Descriptor instead. +func (*CreateWorkloadIdentityRequest) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_service_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateWorkloadIdentityRequest) GetWorkloadIdentity() *WorkloadIdentity { + if x != nil { + return x.WorkloadIdentity + } + return nil +} + +// The request for UpdateWorkloadIdentity. +type UpdateWorkloadIdentityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The workload identity to update. + WorkloadIdentity *WorkloadIdentity `protobuf:"bytes,1,opt,name=workload_identity,json=workloadIdentity,proto3" json:"workload_identity,omitempty"` +} + +func (x *UpdateWorkloadIdentityRequest) Reset() { + *x = UpdateWorkloadIdentityRequest{} + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateWorkloadIdentityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateWorkloadIdentityRequest) ProtoMessage() {} + +func (x *UpdateWorkloadIdentityRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateWorkloadIdentityRequest.ProtoReflect.Descriptor instead. +func (*UpdateWorkloadIdentityRequest) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_service_proto_rawDescGZIP(), []int{1} +} + +func (x *UpdateWorkloadIdentityRequest) GetWorkloadIdentity() *WorkloadIdentity { + if x != nil { + return x.WorkloadIdentity + } + return nil +} + +// The request for UpsertWorkloadIdentityRequest. +type UpsertWorkloadIdentityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The workload identity to upsert. + WorkloadIdentity *WorkloadIdentity `protobuf:"bytes,1,opt,name=workload_identity,json=workloadIdentity,proto3" json:"workload_identity,omitempty"` +} + +func (x *UpsertWorkloadIdentityRequest) Reset() { + *x = UpsertWorkloadIdentityRequest{} + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpsertWorkloadIdentityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertWorkloadIdentityRequest) ProtoMessage() {} + +func (x *UpsertWorkloadIdentityRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpsertWorkloadIdentityRequest.ProtoReflect.Descriptor instead. +func (*UpsertWorkloadIdentityRequest) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_service_proto_rawDescGZIP(), []int{2} +} + +func (x *UpsertWorkloadIdentityRequest) GetWorkloadIdentity() *WorkloadIdentity { + if x != nil { + return x.WorkloadIdentity + } + return nil +} + +// The request for GetWorkloadIdentity. +type GetWorkloadIdentityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the workload identity to retrieve. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *GetWorkloadIdentityRequest) Reset() { + *x = GetWorkloadIdentityRequest{} + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetWorkloadIdentityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetWorkloadIdentityRequest) ProtoMessage() {} + +func (x *GetWorkloadIdentityRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetWorkloadIdentityRequest.ProtoReflect.Descriptor instead. +func (*GetWorkloadIdentityRequest) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_service_proto_rawDescGZIP(), []int{3} +} + +func (x *GetWorkloadIdentityRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// The request for DeleteWorkloadIdentity. +type DeleteWorkloadIdentityRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the workload identity to delete. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *DeleteWorkloadIdentityRequest) Reset() { + *x = DeleteWorkloadIdentityRequest{} + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteWorkloadIdentityRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteWorkloadIdentityRequest) ProtoMessage() {} + +func (x *DeleteWorkloadIdentityRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteWorkloadIdentityRequest.ProtoReflect.Descriptor instead. +func (*DeleteWorkloadIdentityRequest) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_service_proto_rawDescGZIP(), []int{4} +} + +func (x *DeleteWorkloadIdentityRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// The request for ListWorkloadIdentities. +type ListWorkloadIdentitiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The maximum number of items to return. + // The server may impose a different page size at its discretion. + PageSize int32 `protobuf:"varint,1,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // The page_token value returned from a previous ListWorkloadIdentities request, if any. + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` +} + +func (x *ListWorkloadIdentitiesRequest) Reset() { + *x = ListWorkloadIdentitiesRequest{} + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListWorkloadIdentitiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadIdentitiesRequest) ProtoMessage() {} + +func (x *ListWorkloadIdentitiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListWorkloadIdentitiesRequest.ProtoReflect.Descriptor instead. +func (*ListWorkloadIdentitiesRequest) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_service_proto_rawDescGZIP(), []int{5} +} + +func (x *ListWorkloadIdentitiesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListWorkloadIdentitiesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// The response for ListWorkloadIdentities. +type ListWorkloadIdentitiesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The page of workload identities that matched the request. + WorkloadIdentities []*WorkloadIdentity `protobuf:"bytes,1,rep,name=workload_identities,json=workloadIdentities,proto3" json:"workload_identities,omitempty"` + // Token to retrieve the next page of results, or empty if there are no + // more results in the list. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *ListWorkloadIdentitiesResponse) Reset() { + *x = ListWorkloadIdentitiesResponse{} + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListWorkloadIdentitiesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListWorkloadIdentitiesResponse) ProtoMessage() {} + +func (x *ListWorkloadIdentitiesResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_workloadidentity_v1_resource_service_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListWorkloadIdentitiesResponse.ProtoReflect.Descriptor instead. +func (*ListWorkloadIdentitiesResponse) Descriptor() ([]byte, []int) { + return file_teleport_workloadidentity_v1_resource_service_proto_rawDescGZIP(), []int{6} +} + +func (x *ListWorkloadIdentitiesResponse) GetWorkloadIdentities() []*WorkloadIdentity { + if x != nil { + return x.WorkloadIdentities + } + return nil +} + +func (x *ListWorkloadIdentitiesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +var File_teleport_workloadidentity_v1_resource_service_proto protoreflect.FileDescriptor + +var file_teleport_workloadidentity_v1_resource_service_proto_rawDesc = []byte{ + 0x0a, 0x33, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1c, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x2e, 0x76, 0x31, 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, 0x2b, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, 0x76, 0x31, 0x2f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7c, 0x0a, + 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5b, + 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x7c, 0x0a, 0x1d, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x7c, 0x0a, 0x1d, 0x55, 0x70, 0x73, + 0x65, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, + 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x30, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, 0x1d, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x5b, + 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa9, 0x01, 0x0a, 0x1e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, + 0x0a, 0x13, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x12, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, + 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0xbf, 0x06, 0x0a, 0x1f, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x16, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x12, 0x85, 0x01, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x3b, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x85, 0x01, 0x0a, 0x16, + 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x12, 0x7f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x38, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x12, 0x6d, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x3b, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x93, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x3b, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x66, 0x5a, 0x64, 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, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2f, 0x76, 0x31, 0x3b, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x76, 0x31, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_workloadidentity_v1_resource_service_proto_rawDescOnce sync.Once + file_teleport_workloadidentity_v1_resource_service_proto_rawDescData = file_teleport_workloadidentity_v1_resource_service_proto_rawDesc +) + +func file_teleport_workloadidentity_v1_resource_service_proto_rawDescGZIP() []byte { + file_teleport_workloadidentity_v1_resource_service_proto_rawDescOnce.Do(func() { + file_teleport_workloadidentity_v1_resource_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_workloadidentity_v1_resource_service_proto_rawDescData) + }) + return file_teleport_workloadidentity_v1_resource_service_proto_rawDescData +} + +var file_teleport_workloadidentity_v1_resource_service_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_teleport_workloadidentity_v1_resource_service_proto_goTypes = []any{ + (*CreateWorkloadIdentityRequest)(nil), // 0: teleport.workloadidentity.v1.CreateWorkloadIdentityRequest + (*UpdateWorkloadIdentityRequest)(nil), // 1: teleport.workloadidentity.v1.UpdateWorkloadIdentityRequest + (*UpsertWorkloadIdentityRequest)(nil), // 2: teleport.workloadidentity.v1.UpsertWorkloadIdentityRequest + (*GetWorkloadIdentityRequest)(nil), // 3: teleport.workloadidentity.v1.GetWorkloadIdentityRequest + (*DeleteWorkloadIdentityRequest)(nil), // 4: teleport.workloadidentity.v1.DeleteWorkloadIdentityRequest + (*ListWorkloadIdentitiesRequest)(nil), // 5: teleport.workloadidentity.v1.ListWorkloadIdentitiesRequest + (*ListWorkloadIdentitiesResponse)(nil), // 6: teleport.workloadidentity.v1.ListWorkloadIdentitiesResponse + (*WorkloadIdentity)(nil), // 7: teleport.workloadidentity.v1.WorkloadIdentity + (*emptypb.Empty)(nil), // 8: google.protobuf.Empty +} +var file_teleport_workloadidentity_v1_resource_service_proto_depIdxs = []int32{ + 7, // 0: teleport.workloadidentity.v1.CreateWorkloadIdentityRequest.workload_identity:type_name -> teleport.workloadidentity.v1.WorkloadIdentity + 7, // 1: teleport.workloadidentity.v1.UpdateWorkloadIdentityRequest.workload_identity:type_name -> teleport.workloadidentity.v1.WorkloadIdentity + 7, // 2: teleport.workloadidentity.v1.UpsertWorkloadIdentityRequest.workload_identity:type_name -> teleport.workloadidentity.v1.WorkloadIdentity + 7, // 3: teleport.workloadidentity.v1.ListWorkloadIdentitiesResponse.workload_identities:type_name -> teleport.workloadidentity.v1.WorkloadIdentity + 0, // 4: teleport.workloadidentity.v1.WorkloadIdentityResourceService.CreateWorkloadIdentity:input_type -> teleport.workloadidentity.v1.CreateWorkloadIdentityRequest + 1, // 5: teleport.workloadidentity.v1.WorkloadIdentityResourceService.UpdateWorkloadIdentity:input_type -> teleport.workloadidentity.v1.UpdateWorkloadIdentityRequest + 2, // 6: teleport.workloadidentity.v1.WorkloadIdentityResourceService.UpsertWorkloadIdentity:input_type -> teleport.workloadidentity.v1.UpsertWorkloadIdentityRequest + 3, // 7: teleport.workloadidentity.v1.WorkloadIdentityResourceService.GetWorkloadIdentity:input_type -> teleport.workloadidentity.v1.GetWorkloadIdentityRequest + 4, // 8: teleport.workloadidentity.v1.WorkloadIdentityResourceService.DeleteWorkloadIdentity:input_type -> teleport.workloadidentity.v1.DeleteWorkloadIdentityRequest + 5, // 9: teleport.workloadidentity.v1.WorkloadIdentityResourceService.ListWorkloadIdentities:input_type -> teleport.workloadidentity.v1.ListWorkloadIdentitiesRequest + 7, // 10: teleport.workloadidentity.v1.WorkloadIdentityResourceService.CreateWorkloadIdentity:output_type -> teleport.workloadidentity.v1.WorkloadIdentity + 7, // 11: teleport.workloadidentity.v1.WorkloadIdentityResourceService.UpdateWorkloadIdentity:output_type -> teleport.workloadidentity.v1.WorkloadIdentity + 7, // 12: teleport.workloadidentity.v1.WorkloadIdentityResourceService.UpsertWorkloadIdentity:output_type -> teleport.workloadidentity.v1.WorkloadIdentity + 7, // 13: teleport.workloadidentity.v1.WorkloadIdentityResourceService.GetWorkloadIdentity:output_type -> teleport.workloadidentity.v1.WorkloadIdentity + 8, // 14: teleport.workloadidentity.v1.WorkloadIdentityResourceService.DeleteWorkloadIdentity:output_type -> google.protobuf.Empty + 6, // 15: teleport.workloadidentity.v1.WorkloadIdentityResourceService.ListWorkloadIdentities:output_type -> teleport.workloadidentity.v1.ListWorkloadIdentitiesResponse + 10, // [10:16] is the sub-list for method output_type + 4, // [4:10] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_teleport_workloadidentity_v1_resource_service_proto_init() } +func file_teleport_workloadidentity_v1_resource_service_proto_init() { + if File_teleport_workloadidentity_v1_resource_service_proto != nil { + return + } + file_teleport_workloadidentity_v1_resource_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_workloadidentity_v1_resource_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 7, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_teleport_workloadidentity_v1_resource_service_proto_goTypes, + DependencyIndexes: file_teleport_workloadidentity_v1_resource_service_proto_depIdxs, + MessageInfos: file_teleport_workloadidentity_v1_resource_service_proto_msgTypes, + }.Build() + File_teleport_workloadidentity_v1_resource_service_proto = out.File + file_teleport_workloadidentity_v1_resource_service_proto_rawDesc = nil + file_teleport_workloadidentity_v1_resource_service_proto_goTypes = nil + file_teleport_workloadidentity_v1_resource_service_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/workloadidentity/v1/resource_service_grpc.pb.go b/api/gen/proto/go/teleport/workloadidentity/v1/resource_service_grpc.pb.go new file mode 100644 index 0000000000000..bd3492fee51ec --- /dev/null +++ b/api/gen/proto/go/teleport/workloadidentity/v1/resource_service_grpc.pb.go @@ -0,0 +1,361 @@ +// 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. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: teleport/workloadidentity/v1/resource_service.proto + +package workloadidentityv1pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + WorkloadIdentityResourceService_CreateWorkloadIdentity_FullMethodName = "/teleport.workloadidentity.v1.WorkloadIdentityResourceService/CreateWorkloadIdentity" + WorkloadIdentityResourceService_UpdateWorkloadIdentity_FullMethodName = "/teleport.workloadidentity.v1.WorkloadIdentityResourceService/UpdateWorkloadIdentity" + WorkloadIdentityResourceService_UpsertWorkloadIdentity_FullMethodName = "/teleport.workloadidentity.v1.WorkloadIdentityResourceService/UpsertWorkloadIdentity" + WorkloadIdentityResourceService_GetWorkloadIdentity_FullMethodName = "/teleport.workloadidentity.v1.WorkloadIdentityResourceService/GetWorkloadIdentity" + WorkloadIdentityResourceService_DeleteWorkloadIdentity_FullMethodName = "/teleport.workloadidentity.v1.WorkloadIdentityResourceService/DeleteWorkloadIdentity" + WorkloadIdentityResourceService_ListWorkloadIdentities_FullMethodName = "/teleport.workloadidentity.v1.WorkloadIdentityResourceService/ListWorkloadIdentities" +) + +// WorkloadIdentityResourceServiceClient is the client API for WorkloadIdentityResourceService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// WorkloadIdentityResourceService provides methods to manage the +// WorkloadIdentity resource. +type WorkloadIdentityResourceServiceClient interface { + // CreateWorkloadIdentity creates a new workload identity, it will refuse to + // create a workload identity if one already exists with the same name. + CreateWorkloadIdentity(ctx context.Context, in *CreateWorkloadIdentityRequest, opts ...grpc.CallOption) (*WorkloadIdentity, error) + // UpdateWorkloadIdentity updates an existing workload identity, it will refuse + // to update a workload identity if one does not already exist with the same name. + // + // ConditionalUpdate semantics are applied, e.g, the update will only succeed + // if the revision of the provided WorkloadIdentity matches the revision of + // the existing WorkloadIdentity. + UpdateWorkloadIdentity(ctx context.Context, in *UpdateWorkloadIdentityRequest, opts ...grpc.CallOption) (*WorkloadIdentity, error) + // UpsertWorkloadIdentity creates or updates a workload identity. You should + // prefer to call Create or Update. + UpsertWorkloadIdentity(ctx context.Context, in *UpsertWorkloadIdentityRequest, opts ...grpc.CallOption) (*WorkloadIdentity, error) + // GetWorkloadIdentity retrieves a workload identity by name. + GetWorkloadIdentity(ctx context.Context, in *GetWorkloadIdentityRequest, opts ...grpc.CallOption) (*WorkloadIdentity, error) + // DeleteWorkloadIdentity deletes a workload identity by name. + DeleteWorkloadIdentity(ctx context.Context, in *DeleteWorkloadIdentityRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // ListWorkloadIdentities of all workload identities, pagination semantics are + // applied. + ListWorkloadIdentities(ctx context.Context, in *ListWorkloadIdentitiesRequest, opts ...grpc.CallOption) (*ListWorkloadIdentitiesResponse, error) +} + +type workloadIdentityResourceServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewWorkloadIdentityResourceServiceClient(cc grpc.ClientConnInterface) WorkloadIdentityResourceServiceClient { + return &workloadIdentityResourceServiceClient{cc} +} + +func (c *workloadIdentityResourceServiceClient) CreateWorkloadIdentity(ctx context.Context, in *CreateWorkloadIdentityRequest, opts ...grpc.CallOption) (*WorkloadIdentity, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(WorkloadIdentity) + err := c.cc.Invoke(ctx, WorkloadIdentityResourceService_CreateWorkloadIdentity_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *workloadIdentityResourceServiceClient) UpdateWorkloadIdentity(ctx context.Context, in *UpdateWorkloadIdentityRequest, opts ...grpc.CallOption) (*WorkloadIdentity, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(WorkloadIdentity) + err := c.cc.Invoke(ctx, WorkloadIdentityResourceService_UpdateWorkloadIdentity_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *workloadIdentityResourceServiceClient) UpsertWorkloadIdentity(ctx context.Context, in *UpsertWorkloadIdentityRequest, opts ...grpc.CallOption) (*WorkloadIdentity, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(WorkloadIdentity) + err := c.cc.Invoke(ctx, WorkloadIdentityResourceService_UpsertWorkloadIdentity_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *workloadIdentityResourceServiceClient) GetWorkloadIdentity(ctx context.Context, in *GetWorkloadIdentityRequest, opts ...grpc.CallOption) (*WorkloadIdentity, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(WorkloadIdentity) + err := c.cc.Invoke(ctx, WorkloadIdentityResourceService_GetWorkloadIdentity_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *workloadIdentityResourceServiceClient) DeleteWorkloadIdentity(ctx context.Context, in *DeleteWorkloadIdentityRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, WorkloadIdentityResourceService_DeleteWorkloadIdentity_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *workloadIdentityResourceServiceClient) ListWorkloadIdentities(ctx context.Context, in *ListWorkloadIdentitiesRequest, opts ...grpc.CallOption) (*ListWorkloadIdentitiesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListWorkloadIdentitiesResponse) + err := c.cc.Invoke(ctx, WorkloadIdentityResourceService_ListWorkloadIdentities_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// WorkloadIdentityResourceServiceServer is the server API for WorkloadIdentityResourceService service. +// All implementations must embed UnimplementedWorkloadIdentityResourceServiceServer +// for forward compatibility. +// +// WorkloadIdentityResourceService provides methods to manage the +// WorkloadIdentity resource. +type WorkloadIdentityResourceServiceServer interface { + // CreateWorkloadIdentity creates a new workload identity, it will refuse to + // create a workload identity if one already exists with the same name. + CreateWorkloadIdentity(context.Context, *CreateWorkloadIdentityRequest) (*WorkloadIdentity, error) + // UpdateWorkloadIdentity updates an existing workload identity, it will refuse + // to update a workload identity if one does not already exist with the same name. + // + // ConditionalUpdate semantics are applied, e.g, the update will only succeed + // if the revision of the provided WorkloadIdentity matches the revision of + // the existing WorkloadIdentity. + UpdateWorkloadIdentity(context.Context, *UpdateWorkloadIdentityRequest) (*WorkloadIdentity, error) + // UpsertWorkloadIdentity creates or updates a workload identity. You should + // prefer to call Create or Update. + UpsertWorkloadIdentity(context.Context, *UpsertWorkloadIdentityRequest) (*WorkloadIdentity, error) + // GetWorkloadIdentity retrieves a workload identity by name. + GetWorkloadIdentity(context.Context, *GetWorkloadIdentityRequest) (*WorkloadIdentity, error) + // DeleteWorkloadIdentity deletes a workload identity by name. + DeleteWorkloadIdentity(context.Context, *DeleteWorkloadIdentityRequest) (*emptypb.Empty, error) + // ListWorkloadIdentities of all workload identities, pagination semantics are + // applied. + ListWorkloadIdentities(context.Context, *ListWorkloadIdentitiesRequest) (*ListWorkloadIdentitiesResponse, error) + mustEmbedUnimplementedWorkloadIdentityResourceServiceServer() +} + +// UnimplementedWorkloadIdentityResourceServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedWorkloadIdentityResourceServiceServer struct{} + +func (UnimplementedWorkloadIdentityResourceServiceServer) CreateWorkloadIdentity(context.Context, *CreateWorkloadIdentityRequest) (*WorkloadIdentity, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateWorkloadIdentity not implemented") +} +func (UnimplementedWorkloadIdentityResourceServiceServer) UpdateWorkloadIdentity(context.Context, *UpdateWorkloadIdentityRequest) (*WorkloadIdentity, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateWorkloadIdentity not implemented") +} +func (UnimplementedWorkloadIdentityResourceServiceServer) UpsertWorkloadIdentity(context.Context, *UpsertWorkloadIdentityRequest) (*WorkloadIdentity, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpsertWorkloadIdentity not implemented") +} +func (UnimplementedWorkloadIdentityResourceServiceServer) GetWorkloadIdentity(context.Context, *GetWorkloadIdentityRequest) (*WorkloadIdentity, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkloadIdentity not implemented") +} +func (UnimplementedWorkloadIdentityResourceServiceServer) DeleteWorkloadIdentity(context.Context, *DeleteWorkloadIdentityRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteWorkloadIdentity not implemented") +} +func (UnimplementedWorkloadIdentityResourceServiceServer) ListWorkloadIdentities(context.Context, *ListWorkloadIdentitiesRequest) (*ListWorkloadIdentitiesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListWorkloadIdentities not implemented") +} +func (UnimplementedWorkloadIdentityResourceServiceServer) mustEmbedUnimplementedWorkloadIdentityResourceServiceServer() { +} +func (UnimplementedWorkloadIdentityResourceServiceServer) testEmbeddedByValue() {} + +// UnsafeWorkloadIdentityResourceServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to WorkloadIdentityResourceServiceServer will +// result in compilation errors. +type UnsafeWorkloadIdentityResourceServiceServer interface { + mustEmbedUnimplementedWorkloadIdentityResourceServiceServer() +} + +func RegisterWorkloadIdentityResourceServiceServer(s grpc.ServiceRegistrar, srv WorkloadIdentityResourceServiceServer) { + // If the following call pancis, it indicates UnimplementedWorkloadIdentityResourceServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&WorkloadIdentityResourceService_ServiceDesc, srv) +} + +func _WorkloadIdentityResourceService_CreateWorkloadIdentity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateWorkloadIdentityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkloadIdentityResourceServiceServer).CreateWorkloadIdentity(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkloadIdentityResourceService_CreateWorkloadIdentity_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkloadIdentityResourceServiceServer).CreateWorkloadIdentity(ctx, req.(*CreateWorkloadIdentityRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _WorkloadIdentityResourceService_UpdateWorkloadIdentity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateWorkloadIdentityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkloadIdentityResourceServiceServer).UpdateWorkloadIdentity(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkloadIdentityResourceService_UpdateWorkloadIdentity_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkloadIdentityResourceServiceServer).UpdateWorkloadIdentity(ctx, req.(*UpdateWorkloadIdentityRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _WorkloadIdentityResourceService_UpsertWorkloadIdentity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpsertWorkloadIdentityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkloadIdentityResourceServiceServer).UpsertWorkloadIdentity(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkloadIdentityResourceService_UpsertWorkloadIdentity_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkloadIdentityResourceServiceServer).UpsertWorkloadIdentity(ctx, req.(*UpsertWorkloadIdentityRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _WorkloadIdentityResourceService_GetWorkloadIdentity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkloadIdentityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkloadIdentityResourceServiceServer).GetWorkloadIdentity(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkloadIdentityResourceService_GetWorkloadIdentity_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkloadIdentityResourceServiceServer).GetWorkloadIdentity(ctx, req.(*GetWorkloadIdentityRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _WorkloadIdentityResourceService_DeleteWorkloadIdentity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteWorkloadIdentityRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkloadIdentityResourceServiceServer).DeleteWorkloadIdentity(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkloadIdentityResourceService_DeleteWorkloadIdentity_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkloadIdentityResourceServiceServer).DeleteWorkloadIdentity(ctx, req.(*DeleteWorkloadIdentityRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _WorkloadIdentityResourceService_ListWorkloadIdentities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListWorkloadIdentitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WorkloadIdentityResourceServiceServer).ListWorkloadIdentities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WorkloadIdentityResourceService_ListWorkloadIdentities_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WorkloadIdentityResourceServiceServer).ListWorkloadIdentities(ctx, req.(*ListWorkloadIdentitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// WorkloadIdentityResourceService_ServiceDesc is the grpc.ServiceDesc for WorkloadIdentityResourceService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var WorkloadIdentityResourceService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "teleport.workloadidentity.v1.WorkloadIdentityResourceService", + HandlerType: (*WorkloadIdentityResourceServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateWorkloadIdentity", + Handler: _WorkloadIdentityResourceService_CreateWorkloadIdentity_Handler, + }, + { + MethodName: "UpdateWorkloadIdentity", + Handler: _WorkloadIdentityResourceService_UpdateWorkloadIdentity_Handler, + }, + { + MethodName: "UpsertWorkloadIdentity", + Handler: _WorkloadIdentityResourceService_UpsertWorkloadIdentity_Handler, + }, + { + MethodName: "GetWorkloadIdentity", + Handler: _WorkloadIdentityResourceService_GetWorkloadIdentity_Handler, + }, + { + MethodName: "DeleteWorkloadIdentity", + Handler: _WorkloadIdentityResourceService_DeleteWorkloadIdentity_Handler, + }, + { + MethodName: "ListWorkloadIdentities", + Handler: _WorkloadIdentityResourceService_ListWorkloadIdentities_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "teleport/workloadidentity/v1/resource_service.proto", +} 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/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index 0cff57b410518..3104777947c46 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -1940,6 +1940,60 @@ message CreateRegisterChallengeRequest { DeviceUsage DeviceUsage = 3 [(gogoproto.jsontag) = "device_usage,omitempty"]; } +// IdentityCenterAccount holds information about an Identity Center account +// within an IdentityCenterAccountAssignment +message IdentityCenterAccount { + // ID is the AWS-assigned account ID + string ID = 1; + + // ARN is the full Amazon Resource Name for the AWS account + string ARN = 2; + + // AccountName is the human-readable name of the account + string AccountName = 3; + + // Description is a free text description of the account + string Description = 4; +} + +// IdentityCenterPermissionSet holds information about an Identity Center +// permission set within an IdentityCenterAccountAssignment +message IdentityCenterPermissionSet { + // ARN is the full Amazon Resource Name for the Permission Set + string ARN = 1; + + // Name is the human readable name for the Permission Set + string Name = 2; +} + +// IdentityCenterAccountAssignment represents a requestable Identity Center +// Account Assignment. This is strictly a wire-format object for use with the +// Unfied resource cache, and the types defined in the `identitycenter` package +// should be used for actual processing. +message IdentityCenterAccountAssignment { + // Kind is the database server resource kind. + string Kind = 1 [(gogoproto.jsontag) = "kind"]; + // SubKind is an optional resource subkind. + string SubKind = 2 [(gogoproto.jsontag) = "sub_kind,omitempty"]; + // Version is the resource version. + string Version = 3 [(gogoproto.jsontag) = "version"]; + // Metadata is the account metadata. + types.Metadata Metadata = 4 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "metadata" + ]; + + // DisplayName is a human-readable name for the Account assignment + string DisplayName = 5; + + // Account is the Identity Center Account this assigment references + IdentityCenterAccount Account = 6; + + // PermissionSet is the Identity Center Permission Set this assignment + // references + IdentityCenterPermissionSet PermissionSet = 7; +} + // PaginatedResource represents one of the supported resources. message PaginatedResource { // Resource is the resource itself. @@ -1968,6 +2022,9 @@ 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"]; + // IdentityCenterAccountAssignment represents a requestable Identity Center + // Account Assignment + IdentityCenterAccountAssignment IdentityCenterAccountAssignment = 16 [(gogoproto.jsontag) = "identity_center_account_assignment,omitempty"]; } // 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..e221a9c25ad14 100644 --- a/api/proto/teleport/legacy/client/proto/event.proto +++ b/api/proto/teleport/legacy/client/proto/event.proto @@ -34,6 +34,7 @@ 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"; +import "teleport/workloadidentity/v1/resource.proto"; option go_package = "github.com/gravitational/teleport/api/client/proto"; @@ -206,5 +207,7 @@ message Event { // IdentityCenterAccountlAssignment is a resource representing a potential // Permission Set grant on a specific AWS account. teleport.identitycenter.v1.AccountAssignment IdentityCenterAccountAssignment = 74; + // WorkloadIdentity is a resource for workload identity. + teleport.workloadidentity.v1.WorkloadIdentity WorkloadIdentity = 76; } } diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 9c744e769ae40..96c3f6e994b9d 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -1617,6 +1617,21 @@ message PortForward { // Addr is a target port forwarding address string Addr = 5 [(gogoproto.jsontag) = "addr"]; + + // KubernetesCluster has information about a kubernetes cluster, if + // applicable. + KubernetesClusterMetadata KubernetesCluster = 6 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + + // KubernetesPod has information about a kubernetes pod, if applicable. + KubernetesPodMetadata KubernetesPod = 7 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // X11Forward is emitted when a user requests X11 protocol forwarding @@ -4679,6 +4694,9 @@ message OneOf { events.UserTaskUpdate UserTaskUpdate = 189; events.UserTaskDelete UserTaskDelete = 190; events.SFTPSummary SFTPSummary = 191; + events.WorkloadIdentityCreate WorkloadIdentityCreate = 194; + events.WorkloadIdentityUpdate WorkloadIdentityUpdate = 195; + events.WorkloadIdentityDelete WorkloadIdentityDelete = 196; } } @@ -7572,3 +7590,108 @@ message UserTaskDelete { (gogoproto.jsontag) = "" ]; } + +// WorkloadIdentityCreate is emitted when a WorkloadIdentity is created. +message WorkloadIdentityCreate { + // 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) = "" + ]; + + // WorkloadIdentityData is a copy of the WorkloadIdentity resource + google.protobuf.Struct WorkloadIdentityData = 5 [ + (gogoproto.jsontag) = "workload_identity_data,omitempty", + (gogoproto.casttype) = "Struct" + ]; +} + +// WorkloadIdentityUpdate is emitted when a WorkloadIdentity is updated. +message WorkloadIdentityUpdate { + // 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) = "" + ]; + + // WorkloadIdentityData is a copy of the WorkloadIdentity resource + google.protobuf.Struct WorkloadIdentityData = 5 [ + (gogoproto.jsontag) = "workload_identity_data,omitempty", + (gogoproto.casttype) = "Struct" + ]; +} + +// WorkloadIdentityDelete is emitted when a WorkloadIdentity is deleted. +message WorkloadIdentityDelete { + // 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) = "" + ]; +} diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 5893f9e95a17f..48c2dae302b1d 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -964,6 +964,30 @@ message CORSPolicy { 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"]; + + // 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 +// 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. @@ -994,6 +1018,9 @@ message AppSpecV3 { 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"]; // 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 diff --git a/api/proto/teleport/workloadidentity/v1/resource.proto b/api/proto/teleport/workloadidentity/v1/resource.proto new file mode 100644 index 0000000000000..6bf73e0f07fab --- /dev/null +++ b/api/proto/teleport/workloadidentity/v1/resource.proto @@ -0,0 +1,85 @@ +// 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. + +syntax = "proto3"; + +package teleport.workloadidentity.v1; + +import "teleport/header/v1/metadata.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1;workloadidentityv1pb"; + +// WorkloadIdentity represents a single, or group of similar, workload +// identities and configures the structure of workload identity credentials and +// authorization rules. is a resource that represents the configuration of a trust +// domain federation. +message WorkloadIdentity { + // The kind of resource represented. + string kind = 1; + // Differentiates variations of the same kind. All resources should + // contain one, even if it is never populated. + string sub_kind = 2; + // The version of the resource being represented. + string version = 3; + // Common metadata that all resources share. + teleport.header.v1.Metadata metadata = 4; + // The configured properties of the WorkloadIdentity + WorkloadIdentitySpec spec = 5; +} + +// The individual conditions that make up a rule. +message WorkloadIdentityCondition { + // The name of the attribute to evaluate the condition against. + string attribute = 1; + // An exact string that the attribute must match. + string equals = 2; +} + +// An individual rule that is evaluated during the issuance of a WorkloadIdentity. +message WorkloadIdentityRule { + // The conditions that must be met for this rule to be considered passed. + repeated WorkloadIdentityCondition conditions = 1; +} + +// The rules which are evaluated before the WorkloadIdentity can be issued. +message WorkloadIdentityRules { + // A list of rules used to determine if a WorkloadIdentity can be issued. + // If none are provided, it will be considered a pass. If any are provided, + // then at least one must pass for the rules to be considered passed. + repeated WorkloadIdentityRule allow = 1; +} + +// Configuration pertaining to the issuance of SPIFFE-compatible workload +// identity credentials. +message WorkloadIdentitySPIFFE { + // The path of the SPIFFE ID that will be issued to the workload. + // + // This should be prefixed with a forward-slash ("/"). + // + // This field supports templating using attributes. + string id = 1; + // A freeform text field which is provided to workloads along with a + // credential produced by this WorkloadIdentity. This can be used to provide + // additional context that can be used to select between multiple credentials. + string hint = 2; +} + +// The spec for the WorkloadIdentity resource. +message WorkloadIdentitySpec { + // The rules which are evaluated before the WorkloadIdentity can be issued. + WorkloadIdentityRules rules = 1; + // Configuration pertaining to the issuance of SPIFFE-compatible workload + // identity credentials. + WorkloadIdentitySPIFFE spiffe = 2; +} diff --git a/api/proto/teleport/workloadidentity/v1/resource_service.proto b/api/proto/teleport/workloadidentity/v1/resource_service.proto new file mode 100644 index 0000000000000..28351aefb6434 --- /dev/null +++ b/api/proto/teleport/workloadidentity/v1/resource_service.proto @@ -0,0 +1,95 @@ +// 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. + +syntax = "proto3"; + +package teleport.workloadidentity.v1; + +import "google/protobuf/empty.proto"; +import "teleport/workloadidentity/v1/resource.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/workloadidentity/v1;workloadidentityv1pb"; + +// WorkloadIdentityResourceService provides methods to manage the +// WorkloadIdentity resource. +service WorkloadIdentityResourceService { + // CreateWorkloadIdentity creates a new workload identity, it will refuse to + // create a workload identity if one already exists with the same name. + rpc CreateWorkloadIdentity(CreateWorkloadIdentityRequest) returns (WorkloadIdentity); + // UpdateWorkloadIdentity updates an existing workload identity, it will refuse + // to update a workload identity if one does not already exist with the same name. + // + // ConditionalUpdate semantics are applied, e.g, the update will only succeed + // if the revision of the provided WorkloadIdentity matches the revision of + // the existing WorkloadIdentity. + rpc UpdateWorkloadIdentity(UpdateWorkloadIdentityRequest) returns (WorkloadIdentity); + // UpsertWorkloadIdentity creates or updates a workload identity. You should + // prefer to call Create or Update. + rpc UpsertWorkloadIdentity(UpsertWorkloadIdentityRequest) returns (WorkloadIdentity); + // GetWorkloadIdentity retrieves a workload identity by name. + rpc GetWorkloadIdentity(GetWorkloadIdentityRequest) returns (WorkloadIdentity); + // DeleteWorkloadIdentity deletes a workload identity by name. + rpc DeleteWorkloadIdentity(DeleteWorkloadIdentityRequest) returns (google.protobuf.Empty); + // ListWorkloadIdentities of all workload identities, pagination semantics are + // applied. + rpc ListWorkloadIdentities(ListWorkloadIdentitiesRequest) returns (ListWorkloadIdentitiesResponse); +} + +// The request for CreateWorkloadIdentity. +message CreateWorkloadIdentityRequest { + // The workload identity to create. + WorkloadIdentity workload_identity = 1; +} + +// The request for UpdateWorkloadIdentity. +message UpdateWorkloadIdentityRequest { + // The workload identity to update. + WorkloadIdentity workload_identity = 1; +} + +// The request for UpsertWorkloadIdentityRequest. +message UpsertWorkloadIdentityRequest { + // The workload identity to upsert. + WorkloadIdentity workload_identity = 1; +} + +// The request for GetWorkloadIdentity. +message GetWorkloadIdentityRequest { + // The name of the workload identity to retrieve. + string name = 1; +} + +// The request for DeleteWorkloadIdentity. +message DeleteWorkloadIdentityRequest { + // The name of the workload identity to delete. + string name = 1; +} + +// The request for ListWorkloadIdentities. +message ListWorkloadIdentitiesRequest { + // The maximum number of items to return. + // The server may impose a different page size at its discretion. + int32 page_size = 1; + // The page_token value returned from a previous ListWorkloadIdentities request, if any. + string page_token = 2; +} + +// The response for ListWorkloadIdentities. +message ListWorkloadIdentitiesResponse { + // The page of workload identities that matched the request. + repeated WorkloadIdentity workload_identities = 1; + // Token to retrieve the next page of results, or empty if there are no + // more results in the list. + string next_page_token = 2; +} diff --git a/api/types/app.go b/api/types/app.go index 7452d35879815..75b6283d2e514 100644 --- a/api/types/app.go +++ b/api/types/app.go @@ -91,6 +91,8 @@ type Application interface { 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. @@ -456,6 +458,23 @@ func (a *AppV3) checkTCPPorts() error { 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 { @@ -509,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/appserver.go b/api/types/appserver.go index b3ce94c684697..f2094e25391af 100644 --- a/api/types/appserver.go +++ b/api/types/appserver.go @@ -86,13 +86,15 @@ func NewAppServerV3FromApp(app *AppV3, hostname, hostID string) (*AppServerV3, e // NewAppServerForAWSOIDCIntegration creates a new AppServer that will be used to grant AWS App Access // using the AWSOIDC credentials. -func NewAppServerForAWSOIDCIntegration(integrationName, hostID, publicAddr string) (*AppServerV3, error) { +func NewAppServerForAWSOIDCIntegration(integrationName, hostID, publicAddr string, labels map[string]string) (*AppServerV3, error) { return NewAppServerV3(Metadata{ - Name: integrationName, + Name: integrationName, + Labels: labels, }, AppServerSpecV3{ HostID: hostID, App: &AppV3{Metadata: Metadata{ - Name: integrationName, + Name: integrationName, + Labels: labels, }, Spec: AppSpecV3{ URI: constants.AWSConsoleURL, Integration: integrationName, diff --git a/api/types/appserver_test.go b/api/types/appserver_test.go index 74a0ab661f7dd..25fa31f6d4d63 100644 --- a/api/types/appserver_test.go +++ b/api/types/appserver_test.go @@ -63,6 +63,7 @@ func TestNewAppServerForAWSOIDCIntegration(t *testing.T) { integratioName string hostID string publicAddr string + labels map[string]string expectedApp *AppServerV3 errCheck require.ErrorAssertionFunc }{ @@ -71,12 +72,14 @@ func TestNewAppServerForAWSOIDCIntegration(t *testing.T) { integratioName: "valid", hostID: "my-host-id", publicAddr: "valid.proxy.example.com", + labels: map[string]string{"account_id": "123456789012"}, expectedApp: &AppServerV3{ Kind: KindAppServer, Version: V3, Metadata: Metadata{ Name: "valid", Namespace: "default", + Labels: map[string]string{"account_id": "123456789012"}, }, Spec: AppServerSpecV3{ Version: api.Version, @@ -87,6 +90,7 @@ func TestNewAppServerForAWSOIDCIntegration(t *testing.T) { Metadata: Metadata{ Name: "valid", Namespace: "default", + Labels: map[string]string{"account_id": "123456789012"}, }, Spec: AppSpecV3{ URI: "https://console.aws.amazon.com", @@ -106,7 +110,7 @@ func TestNewAppServerForAWSOIDCIntegration(t *testing.T) { }, } { t.Run(tt.name, func(t *testing.T) { - app, err := NewAppServerForAWSOIDCIntegration(tt.integratioName, tt.hostID, tt.publicAddr) + app, err := NewAppServerForAWSOIDCIntegration(tt.integratioName, tt.hostID, tt.publicAddr, tt.labels) if tt.errCheck != nil { tt.errCheck(t, err) } diff --git a/api/types/constants.go b/api/types/constants.go index 62125faa1bd7a..f1cf02f8bd888 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -593,6 +593,13 @@ 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" + + // KindWorkloadIdentity is the WorkloadIdentity resource. + KindWorkloadIdentity = "workload_identity" + // MetaNameAccessGraphSettings is the exact name of the singleton resource holding // access graph settings. MetaNameAccessGraphSettings = "access-graph-settings" diff --git a/api/types/derived.gen.go b/api/types/derived.gen.go index 14d2c580f8c41..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.TCPPorts, that.TCPPorts) + 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 } @@ -456,7 +457,15 @@ func deriveTeleportEqual_22(this, that *CORSPolicy) bool { } // deriveTeleportEqual_23 returns whether this and that are equal. -func deriveTeleportEqual_23(this, that []*PortRange) bool { +func deriveTeleportEqual_23(this, that *AppIdentityCenter) bool { + return (this == nil && that == nil) || + this != nil && that != nil && + this.AccountID == that.AccountID && + deriveTeleportEqual_36(this.PermissionSets, that.PermissionSets) +} + +// deriveTeleportEqual_24 returns whether this and that are equal. +func deriveTeleportEqual_24(this, that []*PortRange) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -464,15 +473,15 @@ func deriveTeleportEqual_23(this, that []*PortRange) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_35(this[i], that[i])) { + if !(deriveTeleportEqual_37(this[i], that[i])) { return false } } return true } -// deriveTeleportEqual_24 returns whether this and that are equal. -func deriveTeleportEqual_24(this, that *DatabaseTLS) bool { +// 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 && @@ -481,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 && @@ -493,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 && @@ -541,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 } @@ -553,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 && @@ -569,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 } @@ -578,23 +587,39 @@ 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 *PortRange) 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 + } + if len(this) != len(that) { + return false + } + for i := 0; i < len(this); i++ { + if !(deriveTeleportEqual_41(this[i], that[i])) { + return false + } + } + return true +} + +// 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_36 returns whether this and that are equal. -func deriveTeleportEqual_36(this, that *RotationSchedule) bool { +// 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,18 +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_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.AssignmentID == that.AssignmentID +} diff --git a/api/types/events/events.go b/api/types/events/events.go index 19cc44b5e8981..d3f9f0b085ace 100644 --- a/api/types/events/events.go +++ b/api/types/events/events.go @@ -2352,3 +2352,45 @@ func (m *AutoUpdateVersionUpdate) TrimToMaxSize(_ int) AuditEvent { func (m *AutoUpdateVersionDelete) TrimToMaxSize(_ int) AuditEvent { return m } + +func (m *WorkloadIdentityCreate) TrimToMaxSize(maxSize int) AuditEvent { + size := m.Size() + if size <= maxSize { + return m + } + + out := utils.CloneProtoMsg(m) + out.WorkloadIdentityData = nil + + maxSize = adjustedMaxSize(out, maxSize) + + customFieldsCount := m.WorkloadIdentityData.nonEmptyStrs() + maxFieldsSize := maxSizePerField(maxSize, customFieldsCount) + + out.WorkloadIdentityData = m.WorkloadIdentityData.trimToMaxSize(maxFieldsSize) + + return out +} + +func (m *WorkloadIdentityUpdate) TrimToMaxSize(maxSize int) AuditEvent { + size := m.Size() + if size <= maxSize { + return m + } + + out := utils.CloneProtoMsg(m) + out.WorkloadIdentityData = nil + + maxSize = adjustedMaxSize(out, maxSize) + + customFieldsCount := m.WorkloadIdentityData.nonEmptyStrs() + maxFieldsSize := maxSizePerField(maxSize, customFieldsCount) + + out.WorkloadIdentityData = m.WorkloadIdentityData.trimToMaxSize(maxFieldsSize) + + return out +} + +func (m *WorkloadIdentityDelete) TrimToMaxSize(_ int) AuditEvent { + return m +} diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index 068326ae4aed4..5acf45f077d42 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -2976,10 +2976,15 @@ type PortForward struct { // Status contains operation success or failure status Status `protobuf:"bytes,4,opt,name=Status,proto3,embedded=Status" json:""` // Addr is a target port forwarding address - Addr string `protobuf:"bytes,5,opt,name=Addr,proto3" json:"addr"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Addr string `protobuf:"bytes,5,opt,name=Addr,proto3" json:"addr"` + // KubernetesCluster has information about a kubernetes cluster, if + // applicable. + KubernetesClusterMetadata `protobuf:"bytes,6,opt,name=KubernetesCluster,proto3,embedded=KubernetesCluster" json:""` + // KubernetesPod has information about a kubernetes pod, if applicable. + KubernetesPodMetadata `protobuf:"bytes,7,opt,name=KubernetesPod,proto3,embedded=KubernetesPod" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *PortForward) Reset() { *m = PortForward{} } @@ -7837,6 +7842,9 @@ type OneOf struct { // *OneOf_UserTaskUpdate // *OneOf_UserTaskDelete // *OneOf_SFTPSummary + // *OneOf_WorkloadIdentityCreate + // *OneOf_WorkloadIdentityUpdate + // *OneOf_WorkloadIdentityDelete Event isOneOf_Event `protobuf_oneof:"Event"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -8443,6 +8451,15 @@ type OneOf_UserTaskDelete struct { type OneOf_SFTPSummary struct { SFTPSummary *SFTPSummary `protobuf:"bytes,191,opt,name=SFTPSummary,proto3,oneof" json:"SFTPSummary,omitempty"` } +type OneOf_WorkloadIdentityCreate struct { + WorkloadIdentityCreate *WorkloadIdentityCreate `protobuf:"bytes,194,opt,name=WorkloadIdentityCreate,proto3,oneof" json:"WorkloadIdentityCreate,omitempty"` +} +type OneOf_WorkloadIdentityUpdate struct { + WorkloadIdentityUpdate *WorkloadIdentityUpdate `protobuf:"bytes,195,opt,name=WorkloadIdentityUpdate,proto3,oneof" json:"WorkloadIdentityUpdate,omitempty"` +} +type OneOf_WorkloadIdentityDelete struct { + WorkloadIdentityDelete *WorkloadIdentityDelete `protobuf:"bytes,196,opt,name=WorkloadIdentityDelete,proto3,oneof" json:"WorkloadIdentityDelete,omitempty"` +} func (*OneOf_UserLogin) isOneOf_Event() {} func (*OneOf_UserCreate) isOneOf_Event() {} @@ -8631,6 +8648,9 @@ func (*OneOf_UserTaskCreate) isOneOf_Event() {} func (*OneOf_UserTaskUpdate) isOneOf_Event() {} func (*OneOf_UserTaskDelete) isOneOf_Event() {} func (*OneOf_SFTPSummary) isOneOf_Event() {} +func (*OneOf_WorkloadIdentityCreate) isOneOf_Event() {} +func (*OneOf_WorkloadIdentityUpdate) isOneOf_Event() {} +func (*OneOf_WorkloadIdentityDelete) isOneOf_Event() {} func (m *OneOf) GetEvent() isOneOf_Event { if m != nil { @@ -9948,6 +9968,27 @@ func (m *OneOf) GetSFTPSummary() *SFTPSummary { return nil } +func (m *OneOf) GetWorkloadIdentityCreate() *WorkloadIdentityCreate { + if x, ok := m.GetEvent().(*OneOf_WorkloadIdentityCreate); ok { + return x.WorkloadIdentityCreate + } + return nil +} + +func (m *OneOf) GetWorkloadIdentityUpdate() *WorkloadIdentityUpdate { + if x, ok := m.GetEvent().(*OneOf_WorkloadIdentityUpdate); ok { + return x.WorkloadIdentityUpdate + } + return nil +} + +func (m *OneOf) GetWorkloadIdentityDelete() *WorkloadIdentityDelete { + if x, ok := m.GetEvent().(*OneOf_WorkloadIdentityDelete); ok { + return x.WorkloadIdentityDelete + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*OneOf) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -10138,6 +10179,9 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_UserTaskUpdate)(nil), (*OneOf_UserTaskDelete)(nil), (*OneOf_SFTPSummary)(nil), + (*OneOf_WorkloadIdentityCreate)(nil), + (*OneOf_WorkloadIdentityUpdate)(nil), + (*OneOf_WorkloadIdentityDelete)(nil), } } @@ -14881,6 +14925,154 @@ func (m *UserTaskDelete) XXX_DiscardUnknown() { var xxx_messageInfo_UserTaskDelete proto.InternalMessageInfo +// WorkloadIdentityCreate is emitted when a WorkloadIdentity is created. +type WorkloadIdentityCreate 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:""` + // WorkloadIdentityData is a copy of the WorkloadIdentity resource + WorkloadIdentityData *Struct `protobuf:"bytes,5,opt,name=WorkloadIdentityData,proto3,casttype=Struct" json:"workload_identity_data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *WorkloadIdentityCreate) Reset() { *m = WorkloadIdentityCreate{} } +func (m *WorkloadIdentityCreate) String() string { return proto.CompactTextString(m) } +func (*WorkloadIdentityCreate) ProtoMessage() {} +func (*WorkloadIdentityCreate) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{233} +} +func (m *WorkloadIdentityCreate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WorkloadIdentityCreate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WorkloadIdentityCreate.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 *WorkloadIdentityCreate) XXX_Merge(src proto.Message) { + xxx_messageInfo_WorkloadIdentityCreate.Merge(m, src) +} +func (m *WorkloadIdentityCreate) XXX_Size() int { + return m.Size() +} +func (m *WorkloadIdentityCreate) XXX_DiscardUnknown() { + xxx_messageInfo_WorkloadIdentityCreate.DiscardUnknown(m) +} + +var xxx_messageInfo_WorkloadIdentityCreate proto.InternalMessageInfo + +// WorkloadIdentityUpdate is emitted when a WorkloadIdentity is updated. +type WorkloadIdentityUpdate 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:""` + // WorkloadIdentityData is a copy of the WorkloadIdentity resource + WorkloadIdentityData *Struct `protobuf:"bytes,5,opt,name=WorkloadIdentityData,proto3,casttype=Struct" json:"workload_identity_data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *WorkloadIdentityUpdate) Reset() { *m = WorkloadIdentityUpdate{} } +func (m *WorkloadIdentityUpdate) String() string { return proto.CompactTextString(m) } +func (*WorkloadIdentityUpdate) ProtoMessage() {} +func (*WorkloadIdentityUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{234} +} +func (m *WorkloadIdentityUpdate) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WorkloadIdentityUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WorkloadIdentityUpdate.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 *WorkloadIdentityUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_WorkloadIdentityUpdate.Merge(m, src) +} +func (m *WorkloadIdentityUpdate) XXX_Size() int { + return m.Size() +} +func (m *WorkloadIdentityUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_WorkloadIdentityUpdate.DiscardUnknown(m) +} + +var xxx_messageInfo_WorkloadIdentityUpdate proto.InternalMessageInfo + +// WorkloadIdentityDelete is emitted when a WorkloadIdentity is deleted. +type WorkloadIdentityDelete 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:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *WorkloadIdentityDelete) Reset() { *m = WorkloadIdentityDelete{} } +func (m *WorkloadIdentityDelete) String() string { return proto.CompactTextString(m) } +func (*WorkloadIdentityDelete) ProtoMessage() {} +func (*WorkloadIdentityDelete) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{235} +} +func (m *WorkloadIdentityDelete) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WorkloadIdentityDelete) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_WorkloadIdentityDelete.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 *WorkloadIdentityDelete) XXX_Merge(src proto.Message) { + xxx_messageInfo_WorkloadIdentityDelete.Merge(m, src) +} +func (m *WorkloadIdentityDelete) XXX_Size() int { + return m.Size() +} +func (m *WorkloadIdentityDelete) XXX_DiscardUnknown() { + xxx_messageInfo_WorkloadIdentityDelete.DiscardUnknown(m) +} + +var xxx_messageInfo_WorkloadIdentityDelete proto.InternalMessageInfo + func init() { proto.RegisterEnum("events.UserKind", UserKind_name, UserKind_value) proto.RegisterEnum("events.EventAction", EventAction_name, EventAction_value) @@ -15138,6 +15330,9 @@ func init() { proto.RegisterType((*UserTaskUpdate)(nil), "events.UserTaskUpdate") proto.RegisterType((*UserTaskMetadata)(nil), "events.UserTaskMetadata") proto.RegisterType((*UserTaskDelete)(nil), "events.UserTaskDelete") + proto.RegisterType((*WorkloadIdentityCreate)(nil), "events.WorkloadIdentityCreate") + proto.RegisterType((*WorkloadIdentityUpdate)(nil), "events.WorkloadIdentityUpdate") + proto.RegisterType((*WorkloadIdentityDelete)(nil), "events.WorkloadIdentityDelete") } func init() { @@ -15145,1066 +15340,1073 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 16935 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x69, 0x78, 0x24, 0x49, - 0x76, 0x18, 0x86, 0x3a, 0x50, 0x00, 0x1e, 0x8e, 0x06, 0xa2, 0xaf, 0x9c, 0x9e, 0x9e, 0xc1, 0x4c, - 0xce, 0x6e, 0x6f, 0xf7, 0xec, 0x0c, 0x7a, 0xa7, 0xa7, 0x67, 0x66, 0xe7, 0xda, 0xd9, 0x02, 0x0a, - 0x68, 0x54, 0x37, 0x8e, 0x9a, 0x2c, 0x74, 0xf7, 0xce, 0x92, 0xbb, 0xc5, 0x44, 0x65, 0x00, 0xc8, - 0xe9, 0xaa, 0xcc, 0x62, 0x66, 0x56, 0xa3, 0x31, 0xbe, 0xb8, 0x34, 0x45, 0x91, 0xe2, 0x72, 0xb5, - 0x5e, 0x9a, 0x87, 0x0e, 0x5b, 0x4b, 0x1d, 0x36, 0x45, 0x51, 0x5c, 0x53, 0xa6, 0x49, 0x2e, 0xc9, - 0xb5, 0x24, 0xd3, 0xc7, 0x8a, 0xfc, 0xcc, 0x8f, 0x92, 0x6d, 0x7d, 0xfa, 0x6c, 0x19, 0x2b, 0xd3, - 0xd6, 0x1f, 0x7c, 0xb6, 0x3f, 0xda, 0xde, 0xcf, 0x5a, 0xcb, 0xb2, 0x3f, 0x7d, 0xf1, 0x22, 0x32, - 0x33, 0xf2, 0x2a, 0x9c, 0x23, 0x0c, 0xb6, 0xf1, 0xa7, 0x1b, 0xf5, 0xde, 0x8b, 0x17, 0x91, 0x2f, - 0x5e, 0x44, 0xbc, 0x88, 0x78, 0xf1, 0x1e, 0x5c, 0xf3, 0x68, 0x8b, 0x76, 0x6c, 0xc7, 0xbb, 0xde, - 0xa2, 0xeb, 0x7a, 0x73, 0xeb, 0xba, 0xb7, 0xd5, 0xa1, 0xee, 0x75, 0xfa, 0x90, 0x5a, 0x9e, 0xff, - 0xdf, 0x54, 0xc7, 0xb1, 0x3d, 0x9b, 0x94, 0xf8, 0xaf, 0x4b, 0xe7, 0xd6, 0xed, 0x75, 0x1b, 0x41, - 0xd7, 0xd9, 0x5f, 0x1c, 0x7b, 0xe9, 0xf2, 0xba, 0x6d, 0xaf, 0xb7, 0xe8, 0x75, 0xfc, 0xb5, 0xda, - 0x5d, 0xbb, 0xee, 0x7a, 0x4e, 0xb7, 0xe9, 0x09, 0xec, 0x64, 0x1c, 0xeb, 0x99, 0x6d, 0xea, 0x7a, - 0x7a, 0xbb, 0x23, 0x08, 0x9e, 0x8e, 0x13, 0x6c, 0x3a, 0x7a, 0xa7, 0x43, 0x1d, 0x51, 0xf9, 0xa5, - 0x4f, 0x04, 0xed, 0xd4, 0x9b, 0x4d, 0xea, 0xba, 0x2d, 0xd3, 0xf5, 0xae, 0x3f, 0x7c, 0x49, 0xfa, - 0x25, 0x08, 0x9f, 0x4d, 0xff, 0x20, 0xfc, 0x57, 0x90, 0xbc, 0x98, 0x4e, 0xe2, 0xd7, 0x18, 0xab, - 0x5a, 0xfd, 0x5a, 0x1e, 0x06, 0x17, 0xa9, 0xa7, 0x1b, 0xba, 0xa7, 0x93, 0xcb, 0xd0, 0x5f, 0xb5, - 0x0c, 0xfa, 0x48, 0xc9, 0x3d, 0x93, 0xbb, 0x5a, 0x98, 0x2e, 0xed, 0x6c, 0x4f, 0xe6, 0xa9, 0xa9, - 0x71, 0x20, 0x79, 0x0a, 0x8a, 0x2b, 0x5b, 0x1d, 0xaa, 0xe4, 0x9f, 0xc9, 0x5d, 0x1d, 0x9a, 0x1e, - 0xda, 0xd9, 0x9e, 0xec, 0x47, 0xa1, 0x69, 0x08, 0x26, 0xcf, 0x42, 0xbe, 0x5a, 0x51, 0x0a, 0x88, - 0x9c, 0xd8, 0xd9, 0x9e, 0x1c, 0xed, 0x9a, 0xc6, 0x0b, 0x76, 0xdb, 0xf4, 0x68, 0xbb, 0xe3, 0x6d, - 0x69, 0xf9, 0x6a, 0x85, 0x5c, 0x81, 0xe2, 0x8c, 0x6d, 0x50, 0xa5, 0x88, 0x44, 0x64, 0x67, 0x7b, - 0x72, 0xac, 0x69, 0x1b, 0x54, 0xa2, 0x42, 0x3c, 0xf9, 0x2c, 0x14, 0x57, 0xcc, 0x36, 0x55, 0xfa, - 0x9f, 0xc9, 0x5d, 0x1d, 0xbe, 0x71, 0x69, 0x8a, 0x8b, 0x6f, 0xca, 0x17, 0xdf, 0xd4, 0x8a, 0x2f, - 0xdf, 0xe9, 0xf1, 0x6f, 0x6f, 0x4f, 0xf6, 0xed, 0x6c, 0x4f, 0x16, 0x99, 0xc8, 0xbf, 0xfa, 0x9d, - 0xc9, 0x9c, 0x86, 0x25, 0xc9, 0x5b, 0x30, 0x3c, 0xd3, 0xea, 0xba, 0x1e, 0x75, 0x96, 0xf4, 0x36, - 0x55, 0x4a, 0x58, 0xe1, 0xa5, 0x9d, 0xed, 0xc9, 0x0b, 0x4d, 0x0e, 0x6e, 0x58, 0x7a, 0x5b, 0xae, - 0x58, 0x26, 0x57, 0x7f, 0x2b, 0x07, 0x67, 0xea, 0xd4, 0x75, 0x4d, 0xdb, 0x0a, 0x64, 0xf3, 0x71, - 0x18, 0x12, 0xa0, 0x6a, 0x05, 0xe5, 0x33, 0x34, 0x3d, 0xb0, 0xb3, 0x3d, 0x59, 0x70, 0x4d, 0x43, - 0x0b, 0x31, 0xe4, 0x53, 0x30, 0x70, 0xdf, 0xf4, 0x36, 0x16, 0xe7, 0xca, 0x42, 0x4e, 0x17, 0x76, - 0xb6, 0x27, 0xc9, 0xa6, 0xe9, 0x6d, 0x34, 0xda, 0x6b, 0xba, 0x54, 0xa1, 0x4f, 0x46, 0x16, 0x60, - 0xbc, 0xe6, 0x98, 0x0f, 0x75, 0x8f, 0xde, 0xa1, 0x5b, 0x35, 0xbb, 0x65, 0x36, 0xb7, 0x84, 0x14, - 0x9f, 0xd9, 0xd9, 0x9e, 0xbc, 0xdc, 0xe1, 0xb8, 0xc6, 0x03, 0xba, 0xd5, 0xe8, 0x20, 0x56, 0x62, - 0x92, 0x28, 0xa9, 0xfe, 0x76, 0x09, 0x46, 0xee, 0xba, 0xd4, 0x09, 0xda, 0x7d, 0x05, 0x8a, 0xec, - 0xb7, 0x68, 0x32, 0xca, 0xbc, 0xeb, 0x52, 0x47, 0x96, 0x39, 0xc3, 0x93, 0x6b, 0xd0, 0xbf, 0x60, - 0xaf, 0x9b, 0x96, 0x68, 0xf6, 0xd9, 0x9d, 0xed, 0xc9, 0x33, 0x2d, 0x06, 0x90, 0x28, 0x39, 0x05, - 0xf9, 0x0c, 0x8c, 0x54, 0xdb, 0x4c, 0x87, 0x6c, 0x4b, 0xf7, 0x6c, 0x47, 0xb4, 0x16, 0xa5, 0x6b, - 0x4a, 0x70, 0xa9, 0x60, 0x84, 0x9e, 0xbc, 0x01, 0x50, 0xbe, 0x5f, 0xd7, 0xec, 0x16, 0x2d, 0x6b, - 0x4b, 0x42, 0x19, 0xb0, 0xb4, 0xbe, 0xe9, 0x36, 0x1c, 0xbb, 0x45, 0x1b, 0xba, 0x23, 0x57, 0x2b, - 0x51, 0x93, 0x59, 0x18, 0x2b, 0xe3, 0xa8, 0xd0, 0xe8, 0x0f, 0x77, 0xa9, 0xeb, 0xb9, 0x4a, 0xff, - 0x33, 0x85, 0xab, 0x43, 0xd3, 0x4f, 0xed, 0x6c, 0x4f, 0x3e, 0xc1, 0xc7, 0x4b, 0xc3, 0x11, 0x28, - 0x89, 0x45, 0xac, 0x10, 0x99, 0x86, 0xd1, 0xf2, 0x07, 0x5d, 0x87, 0x56, 0x0d, 0x6a, 0x79, 0xa6, - 0xb7, 0x25, 0x34, 0xe4, 0xf2, 0xce, 0xf6, 0xa4, 0xa2, 0x33, 0x44, 0xc3, 0x14, 0x18, 0x89, 0x49, - 0xb4, 0x08, 0x59, 0x86, 0x89, 0x5b, 0x33, 0xb5, 0x3a, 0x75, 0x1e, 0x9a, 0x4d, 0x5a, 0x6e, 0x36, - 0xed, 0xae, 0xe5, 0x29, 0x03, 0xc8, 0xe7, 0xd9, 0x9d, 0xed, 0xc9, 0xa7, 0xd6, 0x9b, 0x9d, 0x86, - 0xcb, 0xb1, 0x0d, 0x9d, 0xa3, 0x25, 0x66, 0xc9, 0xb2, 0xe4, 0xf3, 0x30, 0xba, 0xe2, 0x30, 0x2d, - 0x34, 0x2a, 0x94, 0xc1, 0x95, 0x41, 0xd4, 0xff, 0x0b, 0x53, 0x62, 0xa6, 0xe2, 0x50, 0xbf, 0x67, - 0x79, 0x63, 0x3d, 0x5e, 0xa0, 0x61, 0x20, 0x4e, 0x6e, 0x6c, 0x84, 0x15, 0xa1, 0xa0, 0xb0, 0x8f, - 0x37, 0x1d, 0x6a, 0x24, 0xb4, 0x6d, 0x08, 0xdb, 0x7c, 0x6d, 0x67, 0x7b, 0xf2, 0xe3, 0x8e, 0xa0, - 0x69, 0xf4, 0x54, 0xbb, 0x4c, 0x56, 0x64, 0x16, 0x06, 0x99, 0x36, 0xdd, 0x31, 0x2d, 0x43, 0x81, - 0x67, 0x72, 0x57, 0xc7, 0x6e, 0x8c, 0xfb, 0xad, 0xf7, 0xe1, 0xd3, 0x17, 0x77, 0xb6, 0x27, 0xcf, - 0x32, 0x1d, 0x6c, 0x3c, 0x30, 0x2d, 0x79, 0x8a, 0x08, 0x8a, 0xb2, 0x51, 0x34, 0x6d, 0x7b, 0x38, - 0x74, 0x87, 0xc3, 0x51, 0xb4, 0x6a, 0x7b, 0xf1, 0x61, 0xeb, 0x93, 0x91, 0x19, 0x18, 0x9d, 0xb6, - 0xbd, 0xaa, 0xe5, 0x7a, 0xba, 0xd5, 0xa4, 0xd5, 0x8a, 0x32, 0x82, 0xe5, 0x50, 0x2d, 0x58, 0x39, - 0x53, 0x60, 0x1a, 0x91, 0x49, 0x29, 0x5a, 0x46, 0xfd, 0x67, 0x45, 0x18, 0x63, 0x7d, 0x22, 0x0d, - 0x9f, 0x32, 0x9b, 0x09, 0x18, 0x84, 0xd5, 0xe2, 0x76, 0xf4, 0x26, 0x15, 0x23, 0x09, 0xbf, 0xc2, - 0xf2, 0x81, 0x12, 0xcf, 0x38, 0x3d, 0xb9, 0x06, 0x83, 0x1c, 0x54, 0xad, 0x88, 0xc1, 0x35, 0xba, - 0xb3, 0x3d, 0x39, 0xe4, 0x22, 0xac, 0x61, 0x1a, 0x5a, 0x80, 0x66, 0xda, 0xcd, 0xff, 0x9e, 0xb7, - 0x5d, 0x8f, 0x31, 0x17, 0x63, 0x0b, 0x3f, 0x43, 0x14, 0xd8, 0x10, 0x28, 0x59, 0xbb, 0xa3, 0x85, - 0xc8, 0xeb, 0x00, 0x1c, 0x52, 0x36, 0x0c, 0x47, 0x0c, 0xb0, 0x27, 0x76, 0xb6, 0x27, 0xcf, 0x0b, - 0x16, 0xba, 0x61, 0xc8, 0xa3, 0x53, 0x22, 0x26, 0x6d, 0x18, 0xe1, 0xbf, 0x16, 0xf4, 0x55, 0xda, - 0xe2, 0xa3, 0x6b, 0xf8, 0xc6, 0x55, 0xbf, 0x13, 0xa3, 0xd2, 0x99, 0x92, 0x49, 0x67, 0x2d, 0xcf, - 0xd9, 0x9a, 0x9e, 0x14, 0x13, 0xf2, 0x45, 0x51, 0x55, 0x0b, 0x71, 0xf2, 0x54, 0x20, 0x97, 0x61, - 0xf3, 0xf4, 0x9c, 0xed, 0x6c, 0xea, 0x8e, 0x41, 0x8d, 0xe9, 0x2d, 0x79, 0x9e, 0x5e, 0xf3, 0xc1, - 0x8d, 0x55, 0x59, 0xf5, 0x64, 0x72, 0xd6, 0xe9, 0x9c, 0x5b, 0xbd, 0xbb, 0x8a, 0x2a, 0x37, 0x90, - 0x90, 0x96, 0xdb, 0x5d, 0x8d, 0xab, 0x59, 0xb4, 0x0c, 0x9b, 0x0a, 0x38, 0xe0, 0x1e, 0x75, 0xd8, - 0x24, 0x8e, 0xa3, 0x4e, 0x4c, 0x05, 0x82, 0xc9, 0x43, 0x8e, 0x49, 0xf2, 0x10, 0x45, 0x2e, 0xbd, - 0x03, 0x13, 0x09, 0x51, 0x90, 0x71, 0x28, 0x3c, 0xa0, 0x5b, 0x5c, 0x5d, 0x34, 0xf6, 0x27, 0x39, - 0x07, 0xfd, 0x0f, 0xf5, 0x56, 0x57, 0x2c, 0xa1, 0x1a, 0xff, 0xf1, 0x46, 0xfe, 0xd3, 0x39, 0xb6, - 0xe2, 0x90, 0x19, 0xdb, 0xb2, 0x68, 0xd3, 0x93, 0x17, 0x9d, 0x57, 0x61, 0x68, 0xc1, 0x6e, 0xea, - 0x2d, 0xec, 0x47, 0xae, 0x77, 0xca, 0xce, 0xf6, 0xe4, 0x39, 0xd6, 0x81, 0x53, 0x2d, 0x86, 0x91, - 0xda, 0x14, 0x92, 0x32, 0x05, 0xd0, 0x68, 0xdb, 0xf6, 0x28, 0x16, 0xcc, 0x87, 0x0a, 0x80, 0x05, - 0x1d, 0x44, 0xc9, 0x0a, 0x10, 0x12, 0x93, 0xeb, 0x30, 0x58, 0x63, 0xeb, 0x6c, 0xd3, 0x6e, 0x09, - 0xe5, 0xc3, 0xa5, 0x00, 0xd7, 0x5e, 0x79, 0xac, 0xfa, 0x44, 0xea, 0x3c, 0x8c, 0xcd, 0xb4, 0x4c, - 0x6a, 0x79, 0x72, 0xab, 0xd9, 0x48, 0x2e, 0xaf, 0x53, 0xcb, 0x93, 0x5b, 0x8d, 0x63, 0x5e, 0x67, - 0x50, 0xb9, 0xd5, 0x01, 0xa9, 0xfa, 0x87, 0x05, 0x78, 0xe2, 0x4e, 0x77, 0x95, 0x3a, 0x16, 0xf5, - 0xa8, 0x2b, 0x16, 0xe4, 0x80, 0xeb, 0x12, 0x4c, 0x24, 0x90, 0x82, 0x3b, 0x2e, 0x94, 0x0f, 0x02, - 0x64, 0x43, 0xac, 0xf1, 0xf2, 0x6c, 0x9b, 0x28, 0x4a, 0xe6, 0xe1, 0x4c, 0x08, 0x64, 0x8d, 0x70, - 0x95, 0x3c, 0x2e, 0x25, 0x4f, 0xef, 0x6c, 0x4f, 0x5e, 0x92, 0xb8, 0xb1, 0x66, 0xcb, 0x1a, 0x1c, - 0x2f, 0x46, 0xee, 0xc0, 0x78, 0x08, 0xba, 0xe5, 0xd8, 0xdd, 0x8e, 0xab, 0x14, 0x90, 0xd5, 0xe4, - 0xce, 0xf6, 0xe4, 0x93, 0x12, 0xab, 0x75, 0x44, 0xca, 0x0b, 0x78, 0xbc, 0x20, 0xf9, 0xb1, 0x9c, - 0xcc, 0x4d, 0x8c, 0xc2, 0x22, 0x8e, 0xc2, 0xd7, 0xfc, 0x51, 0x98, 0x29, 0xa4, 0xa9, 0x78, 0x49, - 0x31, 0x28, 0x63, 0xcd, 0x48, 0x0c, 0xca, 0x44, 0x8d, 0x97, 0x66, 0xe0, 0x7c, 0x2a, 0xaf, 0x7d, - 0x69, 0xf5, 0x3f, 0x2d, 0xc8, 0x5c, 0x6a, 0xb6, 0x11, 0x74, 0xe6, 0xb2, 0xdc, 0x99, 0x35, 0xdb, - 0xc0, 0xa9, 0x3e, 0x17, 0xae, 0x9d, 0x52, 0x63, 0x3b, 0xb6, 0x11, 0x9f, 0xf5, 0x93, 0x65, 0xc9, - 0x17, 0xe1, 0x42, 0x02, 0xc8, 0xa7, 0x6b, 0xae, 0xfd, 0x57, 0x76, 0xb6, 0x27, 0xd5, 0x14, 0xae, - 0xf1, 0xd9, 0x3b, 0x83, 0x0b, 0xd1, 0xe1, 0xa2, 0x24, 0x75, 0xdb, 0xf2, 0x74, 0xd3, 0x12, 0xc6, - 0x25, 0x1f, 0x25, 0x9f, 0xd8, 0xd9, 0x9e, 0x7c, 0x4e, 0xd6, 0x41, 0x9f, 0x26, 0xde, 0xf8, 0x2c, - 0x3e, 0xc4, 0x00, 0x25, 0x05, 0x55, 0x6d, 0xeb, 0xeb, 0xbe, 0xc5, 0x7c, 0x75, 0x67, 0x7b, 0xf2, - 0x63, 0xa9, 0x75, 0x98, 0x8c, 0x4a, 0x5e, 0xa1, 0xb3, 0x38, 0x11, 0x0d, 0x48, 0x88, 0x5b, 0xb2, - 0x0d, 0x8a, 0xdf, 0xd0, 0x8f, 0xfc, 0xd5, 0x9d, 0xed, 0xc9, 0xa7, 0x25, 0xfe, 0x96, 0x6d, 0xd0, - 0x78, 0xf3, 0x53, 0x4a, 0xab, 0xbf, 0x55, 0x80, 0xa7, 0xeb, 0xe5, 0xc5, 0x85, 0xaa, 0xe1, 0x9b, - 0x34, 0x35, 0xc7, 0x7e, 0x68, 0x1a, 0xd2, 0xe8, 0x5d, 0x85, 0x8b, 0x31, 0xd4, 0x2c, 0x5a, 0x51, - 0x81, 0x31, 0x8d, 0xdf, 0xe6, 0x9b, 0x4b, 0x1d, 0x41, 0xd3, 0xe0, 0xa6, 0x56, 0x74, 0xd1, 0xce, - 0x62, 0xc4, 0xfa, 0x28, 0x86, 0xaa, 0x6f, 0xd8, 0x8e, 0xd7, 0xec, 0x7a, 0x42, 0x09, 0xb0, 0x8f, - 0x12, 0x75, 0xb8, 0x82, 0xa8, 0x47, 0x15, 0x3e, 0x1f, 0xf2, 0x93, 0x39, 0x18, 0x2f, 0x7b, 0x9e, - 0x63, 0xae, 0x76, 0x3d, 0xba, 0xa8, 0x77, 0x3a, 0xa6, 0xb5, 0x8e, 0x63, 0x7d, 0xf8, 0xc6, 0x5b, - 0xc1, 0x1a, 0xd9, 0x53, 0x12, 0x53, 0xf1, 0xe2, 0xd2, 0x10, 0xd5, 0x7d, 0x54, 0xa3, 0xcd, 0x71, - 0xf2, 0x10, 0x8d, 0x97, 0x63, 0x43, 0x34, 0x95, 0xd7, 0xbe, 0x86, 0xe8, 0xd7, 0x0a, 0x70, 0x79, - 0xf9, 0x81, 0xa7, 0x6b, 0xd4, 0xb5, 0xbb, 0x4e, 0x93, 0xba, 0x77, 0x3b, 0x86, 0xee, 0xd1, 0x70, - 0xa4, 0x4e, 0x42, 0x7f, 0xd9, 0x30, 0xa8, 0x81, 0xec, 0xfa, 0xf9, 0xb6, 0x4f, 0x67, 0x00, 0x8d, - 0xc3, 0xc9, 0xc7, 0x61, 0x40, 0x94, 0x41, 0xee, 0xfd, 0xd3, 0xc3, 0x3b, 0xdb, 0x93, 0x03, 0x5d, - 0x0e, 0xd2, 0x7c, 0x1c, 0x23, 0xab, 0xd0, 0x16, 0x65, 0x64, 0x85, 0x90, 0xcc, 0xe0, 0x20, 0xcd, - 0xc7, 0x91, 0x77, 0x61, 0x0c, 0xd9, 0x06, 0xed, 0x11, 0x73, 0xdf, 0x39, 0x5f, 0xba, 0x72, 0x63, - 0xf9, 0xd2, 0x84, 0xad, 0x69, 0x38, 0x7e, 0x01, 0x2d, 0xc6, 0x80, 0xdc, 0x87, 0x71, 0xd1, 0x88, - 0x90, 0x69, 0x7f, 0x0f, 0xa6, 0xe7, 0x77, 0xb6, 0x27, 0x27, 0x44, 0xfb, 0x25, 0xb6, 0x09, 0x26, - 0x8c, 0xb1, 0x68, 0x76, 0xc8, 0xb8, 0xb4, 0x1b, 0x63, 0xf1, 0xc5, 0x32, 0xe3, 0x38, 0x13, 0xf5, - 0x3d, 0x18, 0x91, 0x0b, 0x92, 0x0b, 0xb8, 0xb5, 0xe6, 0xe3, 0x04, 0x37, 0xe5, 0xa6, 0x81, 0xfb, - 0xe9, 0x97, 0x60, 0xb8, 0x42, 0xdd, 0xa6, 0x63, 0x76, 0x98, 0xd5, 0x20, 0x94, 0xfc, 0xcc, 0xce, - 0xf6, 0xe4, 0xb0, 0x11, 0x82, 0x35, 0x99, 0x46, 0xfd, 0xbf, 0x73, 0x70, 0x81, 0xf1, 0x2e, 0xbb, - 0xae, 0xb9, 0x6e, 0xb5, 0xe5, 0x65, 0xfb, 0x05, 0x28, 0xd5, 0xb1, 0x3e, 0x51, 0xd3, 0xb9, 0x9d, - 0xed, 0xc9, 0x71, 0xde, 0x02, 0x49, 0x0f, 0x05, 0x4d, 0xb0, 0xaf, 0xcc, 0xef, 0xb2, 0xaf, 0x64, - 0x26, 0xad, 0xa7, 0x3b, 0x9e, 0x69, 0xad, 0xd7, 0x3d, 0xdd, 0xeb, 0xba, 0x11, 0x93, 0x56, 0x60, - 0x1a, 0x2e, 0xa2, 0x22, 0x26, 0x6d, 0xa4, 0x10, 0x79, 0x07, 0x46, 0x66, 0x2d, 0x23, 0x64, 0xc2, - 0x27, 0xc4, 0x27, 0x99, 0xa5, 0x49, 0x11, 0x9e, 0x64, 0x11, 0x29, 0xa0, 0xfe, 0xcd, 0x1c, 0x28, - 0x7c, 0x13, 0xb8, 0x60, 0xba, 0xde, 0x22, 0x6d, 0xaf, 0x4a, 0xb3, 0xd3, 0x9c, 0xbf, 0xab, 0x64, - 0x38, 0x69, 0x2d, 0x42, 0x53, 0x40, 0xec, 0x2a, 0x5b, 0xa6, 0x9b, 0xd8, 0x7e, 0xc4, 0x4a, 0x91, - 0x2a, 0x0c, 0x70, 0xce, 0xdc, 0x96, 0x18, 0xbe, 0xa1, 0xf8, 0x8a, 0x10, 0xaf, 0x9a, 0x2b, 0x43, - 0x9b, 0x13, 0xcb, 0x1b, 0x1a, 0x51, 0x5e, 0xfd, 0x7a, 0x01, 0xc6, 0xe3, 0x85, 0xc8, 0x7d, 0x18, - 0xbc, 0x6d, 0x9b, 0x16, 0x35, 0x96, 0x2d, 0x6c, 0x61, 0xef, 0xc3, 0x11, 0xdf, 0x16, 0x3f, 0xfb, - 0x3e, 0x96, 0x69, 0xc8, 0x16, 0x2c, 0x9e, 0x95, 0x04, 0xcc, 0xc8, 0xe7, 0x61, 0x88, 0xd9, 0x80, - 0x0f, 0x91, 0x73, 0x7e, 0x57, 0xce, 0xcf, 0x08, 0xce, 0xe7, 0x1c, 0x5e, 0x28, 0xc9, 0x3a, 0x64, - 0xc7, 0xf4, 0x4a, 0xa3, 0xba, 0x6b, 0x5b, 0xa2, 0xe7, 0x51, 0xaf, 0x1c, 0x84, 0xc8, 0x7a, 0xc5, - 0x69, 0x98, 0xe9, 0xca, 0x3f, 0x16, 0xbb, 0x41, 0xda, 0xbb, 0x70, 0x59, 0xc5, 0x7b, 0x40, 0x22, - 0x26, 0x16, 0x9c, 0x11, 0x02, 0xdd, 0x30, 0x3b, 0x68, 0xf5, 0xe3, 0xba, 0x36, 0x76, 0xe3, 0xca, - 0x94, 0x7f, 0x28, 0x36, 0x25, 0x1d, 0xa9, 0x3d, 0x7c, 0x69, 0x6a, 0x31, 0x20, 0xc7, 0x9d, 0x29, - 0xea, 0x64, 0x8c, 0x85, 0xdc, 0xdb, 0xed, 0x08, 0xb9, 0xfa, 0xe3, 0x79, 0x78, 0x31, 0xec, 0x22, - 0x8d, 0x3e, 0x34, 0xe9, 0x66, 0xc8, 0x51, 0xec, 0x91, 0xd9, 0x10, 0x73, 0x67, 0x36, 0x74, 0x6b, - 0x9d, 0x1a, 0xe4, 0x1a, 0xf4, 0x6b, 0x76, 0x8b, 0xba, 0x4a, 0x0e, 0xcd, 0x43, 0x9c, 0xbe, 0x1c, - 0x06, 0x90, 0x0f, 0x59, 0x90, 0x82, 0xd8, 0x50, 0x5a, 0x71, 0x74, 0xd3, 0xf3, 0x35, 0xa9, 0x9c, - 0xd4, 0xa4, 0x3d, 0xd4, 0x38, 0xc5, 0x79, 0xf0, 0x35, 0x06, 0x05, 0xef, 0x21, 0x40, 0x16, 0x3c, - 0x27, 0xb9, 0xf4, 0x3a, 0x0c, 0x4b, 0xc4, 0xfb, 0x5a, 0x44, 0xbe, 0x59, 0x94, 0xc7, 0x96, 0xdf, - 0x2c, 0x31, 0xb6, 0xae, 0xb3, 0x31, 0xe1, 0xba, 0xcc, 0x8a, 0xe1, 0x83, 0x4a, 0x68, 0x3e, 0x82, - 0xa2, 0x9a, 0x8f, 0x20, 0xf2, 0x32, 0x0c, 0x72, 0x16, 0xc1, 0x7e, 0x19, 0xf7, 0xda, 0x0e, 0xc2, - 0xa2, 0xa6, 0x40, 0x40, 0x48, 0x7e, 0x39, 0x07, 0x4f, 0xf5, 0x94, 0x04, 0x2a, 0xdf, 0xf0, 0x8d, - 0x57, 0x0e, 0x24, 0xc6, 0xe9, 0x17, 0x77, 0xb6, 0x27, 0xaf, 0x49, 0x9a, 0xe1, 0x48, 0x34, 0x8d, - 0x26, 0x27, 0x92, 0xda, 0xd5, 0xbb, 0x29, 0xcc, 0x58, 0xe5, 0x95, 0xce, 0xe1, 0x51, 0x95, 0xd5, - 0xdc, 0xf2, 0x1b, 0x59, 0x0c, 0x8d, 0x55, 0xf1, 0xbd, 0x6b, 0x3e, 0x49, 0x4a, 0x35, 0x19, 0x5c, - 0x48, 0x13, 0x2e, 0x72, 0x4c, 0x45, 0xdf, 0x5a, 0x5e, 0x5b, 0xb4, 0x2d, 0x6f, 0xc3, 0xaf, 0xa0, - 0x5f, 0x3e, 0xeb, 0xc1, 0x0a, 0x0c, 0x7d, 0xab, 0x61, 0xaf, 0x35, 0xda, 0x8c, 0x2a, 0xa5, 0x8e, - 0x2c, 0x4e, 0x6c, 0x62, 0x17, 0x63, 0xdc, 0x9f, 0xf2, 0x4a, 0xe1, 0x49, 0x9c, 0x3f, 0x2f, 0x24, - 0x27, 0xb8, 0x58, 0x21, 0xb5, 0x0a, 0x23, 0x0b, 0x76, 0xf3, 0x41, 0xa0, 0x2e, 0xaf, 0x43, 0x69, - 0x45, 0x77, 0xd6, 0xa9, 0x87, 0xb2, 0x18, 0xbe, 0x31, 0x31, 0xc5, 0x4f, 0xb7, 0x19, 0x11, 0x47, - 0x4c, 0x8f, 0x89, 0xd9, 0xa7, 0xe4, 0xe1, 0x6f, 0x4d, 0x14, 0x50, 0xbf, 0xd3, 0x0f, 0x23, 0xe2, - 0x24, 0x16, 0x57, 0x0f, 0xf2, 0x46, 0x78, 0xb6, 0x2d, 0xa6, 0xcb, 0xe0, 0x34, 0x2a, 0x38, 0x45, - 0x1b, 0x61, 0xcc, 0xfe, 0x68, 0x7b, 0x32, 0xb7, 0xb3, 0x3d, 0xd9, 0xa7, 0x0d, 0x4a, 0x9b, 0xd8, - 0x70, 0x7d, 0x93, 0x16, 0x74, 0xf9, 0x6c, 0x35, 0x56, 0x96, 0xaf, 0x77, 0xef, 0xc0, 0x80, 0x68, - 0x83, 0xd0, 0xb8, 0x8b, 0xe1, 0xd9, 0x49, 0xe4, 0x44, 0x39, 0x56, 0xda, 0x2f, 0x45, 0xde, 0x82, - 0x12, 0x3f, 0x4b, 0x10, 0x02, 0xb8, 0x90, 0x7e, 0xf6, 0x12, 0x2b, 0x2e, 0xca, 0x90, 0x79, 0x80, - 0xf0, 0x1c, 0x21, 0x38, 0x40, 0x17, 0x1c, 0x92, 0x27, 0x0c, 0x31, 0x2e, 0x52, 0x59, 0xf2, 0x2a, - 0x8c, 0xac, 0x50, 0xa7, 0x6d, 0x5a, 0x7a, 0xab, 0x6e, 0x7e, 0xe0, 0x9f, 0xa1, 0xe3, 0x42, 0xef, - 0x9a, 0x1f, 0xc8, 0x23, 0x37, 0x42, 0x47, 0xbe, 0x90, 0xb6, 0x4f, 0x1f, 0xc0, 0x86, 0x3c, 0xbb, - 0xeb, 0x06, 0x36, 0xd6, 0x9e, 0x94, 0x6d, 0xfb, 0xbb, 0x30, 0x1a, 0xd9, 0xa2, 0x89, 0x43, 0xd2, - 0xa7, 0x92, 0xac, 0xa5, 0xfd, 0x66, 0x8c, 0x6d, 0x94, 0x03, 0xd3, 0xe4, 0xaa, 0x65, 0x7a, 0xa6, - 0xde, 0x9a, 0xb1, 0xdb, 0x6d, 0xdd, 0x32, 0x94, 0xa1, 0x50, 0x93, 0x4d, 0x8e, 0x69, 0x34, 0x39, - 0x4a, 0xd6, 0xe4, 0x68, 0x21, 0x72, 0x07, 0xc6, 0x45, 0x1f, 0x6a, 0xb4, 0x69, 0x3b, 0xcc, 0xf6, - 0xc0, 0x33, 0x50, 0x71, 0x0c, 0xe0, 0x72, 0x5c, 0xc3, 0xf1, 0x91, 0xb2, 0x71, 0x1f, 0x2f, 0x78, - 0xbb, 0x38, 0x38, 0x3c, 0x3e, 0x12, 0x3f, 0xb6, 0x56, 0xff, 0x7a, 0x01, 0x86, 0x05, 0x29, 0x5b, - 0xba, 0x4f, 0x15, 0xfc, 0x30, 0x0a, 0x9e, 0xaa, 0xa8, 0xa5, 0xa3, 0x52, 0x54, 0xf5, 0xcb, 0xf9, - 0x60, 0x36, 0xaa, 0x39, 0xa6, 0x75, 0xb8, 0xd9, 0xe8, 0x0a, 0xc0, 0xcc, 0x46, 0xd7, 0x7a, 0xc0, - 0xaf, 0xe7, 0xf2, 0xe1, 0xf5, 0x5c, 0xd3, 0xd4, 0x24, 0x0c, 0x79, 0x0a, 0x8a, 0x15, 0xc6, 0x9f, - 0xf5, 0xcc, 0xc8, 0xf4, 0xd0, 0xb7, 0x39, 0xa7, 0xdc, 0x8b, 0x1a, 0x82, 0xd9, 0x66, 0x6e, 0x7a, - 0xcb, 0xa3, 0xdc, 0x7c, 0x2e, 0xf0, 0xcd, 0xdc, 0x2a, 0x03, 0x68, 0x1c, 0x4e, 0x6e, 0xc2, 0x44, - 0x85, 0xb6, 0xf4, 0xad, 0x45, 0xb3, 0xd5, 0x32, 0x5d, 0xda, 0xb4, 0x2d, 0xc3, 0x45, 0x21, 0x8b, - 0xea, 0xda, 0xae, 0x96, 0x24, 0x20, 0x2a, 0x94, 0x96, 0xd7, 0xd6, 0x5c, 0xea, 0xa1, 0xf8, 0x0a, - 0xd3, 0xc0, 0x26, 0x67, 0x1b, 0x21, 0x9a, 0xc0, 0xa8, 0xdf, 0xc8, 0xb1, 0xdd, 0x92, 0xfb, 0xc0, - 0xb3, 0x3b, 0x81, 0x96, 0x1f, 0x4a, 0x24, 0xd7, 0x42, 0xbb, 0x22, 0x8f, 0x5f, 0x7b, 0x46, 0x7c, - 0xed, 0x80, 0xb0, 0x2d, 0x42, 0x8b, 0x22, 0xf5, 0xab, 0x0a, 0xbb, 0x7c, 0x95, 0xfa, 0x27, 0x79, - 0xb8, 0x28, 0x5a, 0x3c, 0xd3, 0x32, 0x3b, 0xab, 0xb6, 0xee, 0x18, 0x1a, 0x6d, 0x52, 0xf3, 0x21, - 0x3d, 0x99, 0x03, 0x2f, 0x3a, 0x74, 0x8a, 0x87, 0x18, 0x3a, 0x37, 0x70, 0xe3, 0xc9, 0x24, 0x83, - 0x07, 0xcc, 0xdc, 0xa8, 0x18, 0xdf, 0xd9, 0x9e, 0x1c, 0x31, 0x38, 0x18, 0xaf, 0x18, 0x34, 0x99, - 0x88, 0x29, 0xc9, 0x02, 0xb5, 0xd6, 0xbd, 0x0d, 0x54, 0x92, 0x7e, 0xae, 0x24, 0x2d, 0x84, 0x68, - 0x02, 0xa3, 0xfe, 0x6f, 0x79, 0x38, 0x17, 0x17, 0x79, 0x9d, 0x5a, 0xc6, 0xa9, 0xbc, 0x3f, 0x1c, - 0x79, 0x7f, 0xb7, 0x00, 0x4f, 0x8a, 0x32, 0xf5, 0x0d, 0xdd, 0xa1, 0x46, 0xc5, 0x74, 0x68, 0xd3, - 0xb3, 0x9d, 0xad, 0x13, 0x6c, 0x40, 0x1d, 0x9d, 0xd8, 0x6f, 0x42, 0x49, 0x1c, 0x37, 0xf0, 0x75, - 0x66, 0x2c, 0x68, 0x09, 0x42, 0x13, 0x2b, 0x14, 0x3f, 0xaa, 0x88, 0x75, 0x56, 0x69, 0x2f, 0x9d, - 0xf5, 0x69, 0x18, 0x0d, 0x44, 0x8f, 0x1b, 0xdf, 0x81, 0xd0, 0xda, 0x32, 0x7c, 0x04, 0xee, 0x7d, - 0xb5, 0x28, 0x21, 0xd6, 0xe6, 0x03, 0xaa, 0x15, 0xb4, 0x86, 0x46, 0x45, 0x6d, 0x41, 0x39, 0xd3, - 0xd0, 0x64, 0x22, 0x75, 0xbb, 0x08, 0x97, 0xd2, 0xbb, 0x5d, 0xa3, 0xba, 0x71, 0xda, 0xeb, 0xdf, - 0x97, 0xbd, 0x4e, 0x9e, 0x85, 0x62, 0x4d, 0xf7, 0x36, 0xc4, 0x75, 0x3f, 0xde, 0x41, 0xaf, 0x99, - 0x2d, 0xda, 0xe8, 0xe8, 0xde, 0x86, 0x86, 0x28, 0x69, 0xce, 0x00, 0xe4, 0x98, 0x32, 0x67, 0x48, - 0x8b, 0xfd, 0xf0, 0x33, 0xb9, 0xab, 0xc5, 0xd4, 0xc5, 0xfe, 0x3b, 0xc5, 0xac, 0x79, 0xe5, 0xbe, - 0x63, 0x7a, 0xf4, 0x54, 0xc3, 0x4e, 0x35, 0xec, 0x90, 0x1a, 0xf6, 0x0f, 0xf2, 0x30, 0x1a, 0x6c, - 0x9a, 0xde, 0xa7, 0xcd, 0xe3, 0x59, 0xab, 0xc2, 0xad, 0x4c, 0xe1, 0xd0, 0x5b, 0x99, 0xc3, 0x28, - 0x94, 0x1a, 0x1c, 0xb1, 0x72, 0xd3, 0x00, 0x25, 0xc6, 0x8f, 0x58, 0x83, 0x83, 0xd5, 0x67, 0x61, - 0x60, 0x51, 0x7f, 0x64, 0xb6, 0xbb, 0x6d, 0x61, 0xa5, 0xa3, 0xfb, 0x5a, 0x5b, 0x7f, 0xa4, 0xf9, - 0x70, 0xf5, 0xbf, 0xcd, 0xc1, 0x98, 0x10, 0xaa, 0x60, 0x7e, 0x28, 0xa9, 0x86, 0xd2, 0xc9, 0x1f, - 0x5a, 0x3a, 0x85, 0x83, 0x4b, 0x47, 0xfd, 0x8b, 0x05, 0x50, 0xe6, 0xcc, 0x16, 0x5d, 0x71, 0x74, - 0xcb, 0x5d, 0xa3, 0x8e, 0xd8, 0x4e, 0xcf, 0x32, 0x56, 0x87, 0xfa, 0x40, 0x69, 0x4a, 0xc9, 0x1f, - 0x68, 0x4a, 0xf9, 0x24, 0x0c, 0x89, 0xc6, 0x04, 0xae, 0x93, 0x38, 0x6a, 0x1c, 0x1f, 0xa8, 0x85, - 0x78, 0x46, 0x5c, 0xee, 0x74, 0x1c, 0xfb, 0x21, 0x75, 0xf8, 0xad, 0x98, 0x20, 0xd6, 0x7d, 0xa0, - 0x16, 0xe2, 0x25, 0xce, 0xd4, 0xb7, 0x17, 0x65, 0xce, 0xd4, 0xd1, 0x42, 0x3c, 0xb9, 0x0a, 0x83, - 0x0b, 0x76, 0x53, 0x47, 0x41, 0xf3, 0x69, 0x65, 0x64, 0x67, 0x7b, 0x72, 0xb0, 0x25, 0x60, 0x5a, - 0x80, 0x65, 0x94, 0x15, 0x7b, 0xd3, 0x6a, 0xd9, 0x3a, 0x77, 0xb6, 0x19, 0xe4, 0x94, 0x86, 0x80, - 0x69, 0x01, 0x96, 0x51, 0x32, 0x99, 0xa3, 0x13, 0xd3, 0x60, 0xc8, 0x73, 0x4d, 0xc0, 0xb4, 0x00, - 0xab, 0x7e, 0xa3, 0xc8, 0xb4, 0xd7, 0x35, 0x3f, 0x78, 0xec, 0xd7, 0x85, 0x70, 0xc0, 0xf4, 0x1f, - 0x60, 0xc0, 0x3c, 0x36, 0x07, 0x76, 0xea, 0x3f, 0x1b, 0x00, 0x10, 0xd2, 0x9f, 0x3d, 0xdd, 0x1c, - 0x1e, 0x4e, 0x6b, 0x2a, 0x30, 0x31, 0x6b, 0x6d, 0xe8, 0x56, 0x93, 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, 0xd3, 0x33, 0x1f, 0x52, 0x31, 0x35, 0xe0, 0x4d, 0xb4, 0x19, 0x82, 0x35, - 0x99, 0x86, 0xdc, 0x84, 0x91, 0x9a, 0xee, 0x78, 0x66, 0xd3, 0xec, 0xe8, 0x96, 0xe7, 0x2a, 0x83, - 0x38, 0xa3, 0xa1, 0x85, 0xd1, 0x91, 0xe0, 0x5a, 0x84, 0x8a, 0x7c, 0x01, 0x86, 0x70, 0x6b, 0x8a, - 0xfe, 0xe1, 0x43, 0xbb, 0x5e, 0x54, 0x3e, 0x17, 0xba, 0x23, 0xf2, 0xd3, 0x57, 0xbc, 0x71, 0x8e, - 0xdf, 0x55, 0x06, 0x1c, 0xc9, 0xe7, 0x60, 0x60, 0xd6, 0x32, 0x90, 0x39, 0xec, 0xca, 0x5c, 0x15, - 0xcc, 0x2f, 0x84, 0xcc, 0xed, 0x4e, 0x8c, 0xb7, 0xcf, 0x2e, 0x7d, 0x94, 0x0d, 0x7f, 0x78, 0xa3, - 0x6c, 0xe4, 0x43, 0x38, 0x16, 0x1f, 0x3d, 0xaa, 0x63, 0xf1, 0xb1, 0x03, 0x1e, 0x8b, 0xab, 0x1f, - 0xc0, 0xf0, 0x74, 0x6d, 0x2e, 0x18, 0xbd, 0x4f, 0x40, 0xa1, 0x26, 0x3c, 0x23, 0x8a, 0xdc, 0x9e, - 0xe9, 0x98, 0x86, 0xc6, 0x60, 0xe4, 0x1a, 0x0c, 0xce, 0xa0, 0xbb, 0x9d, 0xb8, 0x45, 0x2c, 0xf2, - 0xf5, 0xaf, 0x89, 0x30, 0xf4, 0xba, 0xf5, 0xd1, 0xe4, 0xe3, 0x30, 0x50, 0x73, 0xec, 0x75, 0x47, - 0x6f, 0x8b, 0x35, 0x18, 0x5d, 0x53, 0x3a, 0x1c, 0xa4, 0xf9, 0x38, 0xf5, 0x67, 0x72, 0xbe, 0xd9, - 0xce, 0x4a, 0xd4, 0xbb, 0x78, 0x34, 0x8f, 0x75, 0x0f, 0xf2, 0x12, 0x2e, 0x07, 0x69, 0x3e, 0x8e, - 0x5c, 0x83, 0xfe, 0x59, 0xc7, 0xb1, 0x1d, 0xd9, 0xa7, 0x9e, 0x32, 0x80, 0x7c, 0xdd, 0x8b, 0x14, - 0xe4, 0x35, 0x18, 0xe6, 0x73, 0x0e, 0x3f, 0xd1, 0x2c, 0xf4, 0xba, 0x29, 0x95, 0x29, 0xd5, 0xdf, - 0x2b, 0x48, 0x36, 0x1b, 0x97, 0xf8, 0x63, 0x78, 0x2b, 0xf0, 0x32, 0x14, 0xa6, 0x6b, 0x73, 0x62, - 0x02, 0x3c, 0xeb, 0x17, 0x95, 0x54, 0x25, 0x56, 0x8e, 0x51, 0x93, 0xcb, 0x50, 0xac, 0x31, 0xf5, - 0x29, 0xa1, 0x7a, 0x0c, 0xee, 0x6c, 0x4f, 0x16, 0x3b, 0x4c, 0x7f, 0x10, 0x8a, 0x58, 0xb6, 0x99, - 0xe1, 0x3b, 0x26, 0x8e, 0x0d, 0xf7, 0x31, 0x97, 0xa1, 0x58, 0x76, 0xd6, 0x1f, 0x8a, 0x59, 0x0b, - 0xb1, 0xba, 0xb3, 0xfe, 0x50, 0x43, 0x28, 0xb9, 0x0e, 0xa0, 0x51, 0xaf, 0xeb, 0x58, 0xf8, 0xdc, - 0x65, 0x08, 0xcf, 0xdf, 0x70, 0x36, 0x74, 0x10, 0xda, 0x68, 0xda, 0x06, 0xd5, 0x24, 0x12, 0xf5, - 0xaf, 0x85, 0x17, 0x3b, 0x15, 0xd3, 0x7d, 0x70, 0xda, 0x85, 0xfb, 0xe8, 0x42, 0x5d, 0x1c, 0x71, - 0x26, 0x3b, 0x69, 0x12, 0xfa, 0xe7, 0x5a, 0xfa, 0xba, 0x8b, 0x7d, 0x28, 0x7c, 0xd7, 0xd6, 0x18, - 0x40, 0xe3, 0xf0, 0x58, 0x3f, 0x0d, 0xee, 0xde, 0x4f, 0x3f, 0xdf, 0x1f, 0x8c, 0xb6, 0x25, 0xea, - 0x6d, 0xda, 0xce, 0x69, 0x57, 0xed, 0xb5, 0xab, 0xae, 0xc0, 0x40, 0xdd, 0x69, 0x4a, 0x47, 0x17, - 0xb8, 0x1f, 0x70, 0x9d, 0x26, 0x3f, 0xb6, 0xf0, 0x91, 0x8c, 0xae, 0xe2, 0x7a, 0x48, 0x37, 0x10, - 0xd2, 0x19, 0xae, 0x27, 0xe8, 0x04, 0x52, 0xd0, 0xd5, 0x6c, 0xc7, 0x13, 0x1d, 0x17, 0xd0, 0x75, - 0x6c, 0xc7, 0xd3, 0x7c, 0x24, 0xf9, 0x24, 0xc0, 0xca, 0x4c, 0xcd, 0x77, 0xee, 0x1f, 0x0a, 0x7d, - 0x0f, 0x85, 0x57, 0xbf, 0x26, 0xa1, 0xc9, 0x0a, 0x0c, 0x2d, 0x77, 0xa8, 0xc3, 0xb7, 0x42, 0xfc, - 0x01, 0xcb, 0x27, 0x62, 0xa2, 0x15, 0xfd, 0x3e, 0x25, 0xfe, 0x0f, 0xc8, 0xf9, 0xfa, 0x62, 0xfb, - 0x3f, 0xb5, 0x90, 0x11, 0x79, 0x0d, 0x4a, 0x65, 0x6e, 0xe7, 0x0d, 0x23, 0xcb, 0x40, 0x64, 0xb8, - 0x05, 0xe5, 0x28, 0xbe, 0x67, 0xd7, 0xf1, 0x6f, 0x4d, 0x90, 0xab, 0xd7, 0x60, 0x3c, 0x5e, 0x0d, - 0x19, 0x86, 0x81, 0x99, 0xe5, 0xa5, 0xa5, 0xd9, 0x99, 0x95, 0xf1, 0x3e, 0x32, 0x08, 0xc5, 0xfa, - 0xec, 0x52, 0x65, 0x3c, 0xa7, 0xfe, 0x8a, 0x34, 0x83, 0x30, 0xd5, 0x3a, 0xbd, 0x1a, 0x3e, 0xd4, - 0x7d, 0xcb, 0x38, 0xde, 0x87, 0xe2, 0x89, 0x41, 0xdb, 0xf4, 0x3c, 0x6a, 0x88, 0x55, 0x02, 0xef, - 0x0b, 0xbd, 0x47, 0x5a, 0x02, 0x4f, 0x5e, 0x80, 0x51, 0x84, 0x89, 0x2b, 0x42, 0xbe, 0x3f, 0x16, - 0x05, 0x9c, 0x47, 0x5a, 0x14, 0xa9, 0xfe, 0x41, 0x78, 0x3b, 0xbc, 0x40, 0xf5, 0x93, 0x7a, 0xa3, - 0xf8, 0x11, 0xe9, 0x2f, 0xf5, 0x5f, 0x14, 0xf9, 0x93, 0x13, 0xfe, 0x3e, 0xf1, 0x38, 0x44, 0x19, - 0x1e, 0xe9, 0x16, 0xf6, 0x71, 0xa4, 0xfb, 0x02, 0x94, 0x16, 0xa9, 0xb7, 0x61, 0xfb, 0x8e, 0x5f, - 0xe8, 0xa1, 0xd7, 0x46, 0x88, 0xec, 0xa1, 0xc7, 0x69, 0xc8, 0x03, 0x20, 0xfe, 0xe3, 0xc3, 0xc0, - 0xf1, 0xdb, 0x3f, 0x42, 0xbe, 0x98, 0xd8, 0xa7, 0xd4, 0xf1, 0x89, 0x32, 0xfa, 0xf4, 0x9f, 0x0b, - 0x1c, 0xcb, 0x25, 0x4f, 0xac, 0x7f, 0xbe, 0x3d, 0x59, 0xe2, 0x34, 0x5a, 0x0a, 0x5b, 0xf2, 0x2e, - 0x0c, 0x2d, 0xce, 0x95, 0xc5, 0x43, 0x44, 0xee, 0x15, 0xf1, 0x44, 0x20, 0x45, 0x1f, 0x11, 0x88, - 0x04, 0xdf, 0xf7, 0xb4, 0xd7, 0xf4, 0xe4, 0x3b, 0xc4, 0x90, 0x0b, 0xd3, 0x16, 0xfe, 0x52, 0x48, - 0x9c, 0x2e, 0x04, 0xda, 0x12, 0x7d, 0x3f, 0x14, 0x97, 0x15, 0xc7, 0xc6, 0xb4, 0x65, 0xf0, 0x10, - 0xa3, 0x7b, 0x19, 0x26, 0xca, 0x9d, 0x4e, 0xcb, 0xa4, 0x06, 0xea, 0x8b, 0xd6, 0x6d, 0x51, 0x57, - 0xb8, 0xfc, 0xe0, 0xe3, 0x13, 0x9d, 0x23, 0x1b, 0xf8, 0xfc, 0xb5, 0xe1, 0x74, 0xa3, 0xfe, 0x99, - 0xc9, 0xb2, 0xea, 0xcf, 0xe5, 0xe1, 0xc2, 0x8c, 0x43, 0x75, 0x8f, 0x2e, 0xce, 0x95, 0xcb, 0x5d, - 0xf4, 0x91, 0x6b, 0xb5, 0xa8, 0xb5, 0x7e, 0x3c, 0xc3, 0xfa, 0x4d, 0x18, 0x0b, 0x1a, 0x50, 0x6f, - 0xda, 0x1d, 0x2a, 0x3f, 0xe4, 0x6a, 0xfa, 0x98, 0x86, 0xcb, 0x50, 0x5a, 0x8c, 0x94, 0xdc, 0x81, - 0xb3, 0x01, 0xa4, 0xdc, 0x6a, 0xd9, 0x9b, 0x1a, 0xed, 0xba, 0xdc, 0x11, 0x77, 0x90, 0x3b, 0xe2, - 0x86, 0x1c, 0x74, 0x86, 0x6f, 0x38, 0x8c, 0x40, 0x4b, 0x2b, 0xa5, 0x7e, 0xbd, 0x00, 0x17, 0xef, - 0xe9, 0x2d, 0xd3, 0x08, 0x45, 0xa3, 0x51, 0xb7, 0x63, 0x5b, 0x2e, 0x3d, 0x41, 0xa3, 0x34, 0x32, - 0x14, 0x8a, 0x47, 0x32, 0x14, 0x92, 0x5d, 0xd4, 0x7f, 0xe8, 0x2e, 0x2a, 0x1d, 0xa8, 0x8b, 0xfe, - 0xd7, 0x1c, 0x8c, 0xfb, 0x0f, 0x0d, 0xe4, 0x47, 0xe3, 0x92, 0x17, 0x3c, 0x1e, 0x21, 0xc6, 0xfc, - 0xae, 0x11, 0x4f, 0xea, 0x30, 0x30, 0xfb, 0xa8, 0x63, 0x3a, 0xd4, 0xdd, 0x83, 0xd3, 0xf8, 0x53, - 0xe2, 0xb8, 0x64, 0x82, 0xf2, 0x22, 0x89, 0x93, 0x12, 0x0e, 0xc6, 0xe7, 0x83, 0xfc, 0xa9, 0xc5, - 0xb4, 0xff, 0x12, 0x9e, 0x3f, 0x1f, 0x14, 0x4f, 0x32, 0x22, 0xef, 0x41, 0x43, 0x52, 0xf2, 0x1c, - 0x14, 0x56, 0x56, 0x16, 0xc4, 0x4c, 0x8a, 0x11, 0x08, 0x3c, 0x4f, 0x7e, 0x1f, 0xc9, 0xb0, 0xea, - 0x3f, 0xce, 0x03, 0x30, 0x55, 0xe0, 0xc3, 0xf5, 0x58, 0x94, 0x70, 0x1a, 0x06, 0x7d, 0x81, 0x0b, - 0x35, 0x0c, 0x5e, 0x09, 0xc4, 0x3b, 0x22, 0x5e, 0x77, 0xf0, 0x22, 0x64, 0xd2, 0x77, 0x24, 0xe7, - 0xf7, 0x00, 0xb8, 0xb3, 0x41, 0x47, 0x72, 0xdf, 0x7d, 0xfc, 0x93, 0x30, 0x24, 0x66, 0x3c, 0x3b, - 0x72, 0xfe, 0xdf, 0xf4, 0x81, 0x5a, 0x88, 0x8f, 0x4d, 0xad, 0xa5, 0x43, 0x2c, 0xc4, 0xbe, 0x78, - 0x79, 0xaf, 0x9c, 0x8a, 0xf7, 0x88, 0xc5, 0xfb, 0x15, 0x21, 0x5e, 0xfe, 0x62, 0xe8, 0xc4, 0x8a, - 0xf7, 0xc8, 0xce, 0xbe, 0xd5, 0x7f, 0x90, 0x03, 0xc2, 0x9a, 0x55, 0xd3, 0x5d, 0x77, 0xd3, 0x76, - 0x0c, 0xee, 0x9c, 0x7e, 0x2c, 0x82, 0x39, 0xba, 0xfb, 0xca, 0xdf, 0x1b, 0x84, 0xb3, 0x11, 0xc7, - 0xdf, 0x13, 0x3e, 0x59, 0x5d, 0x8b, 0x8e, 0xa6, 0x5e, 0xaf, 0x5e, 0x3e, 0x26, 0x5f, 0x88, 0xf6, - 0x47, 0x1e, 0xbc, 0x49, 0x37, 0xa1, 0x2f, 0xc2, 0x88, 0xf8, 0xc1, 0x56, 0x68, 0xff, 0xa6, 0x0b, - 0x47, 0xa9, 0xcb, 0x00, 0x5a, 0x04, 0x4d, 0x5e, 0x81, 0x21, 0x36, 0x60, 0xd6, 0x31, 0x58, 0xc9, - 0x40, 0xf8, 0xa2, 0xc4, 0xf0, 0x81, 0xf2, 0x7a, 0x12, 0x50, 0x4a, 0xef, 0x96, 0x06, 0xf7, 0xf0, - 0x6e, 0xe9, 0x8b, 0x30, 0x5c, 0xb6, 0x2c, 0xdb, 0xc3, 0x4d, 0xba, 0x2b, 0xae, 0x26, 0x32, 0xad, - 0xf2, 0xe7, 0xf0, 0x31, 0x7e, 0x48, 0x9f, 0x6a, 0x96, 0xcb, 0x0c, 0xc9, 0x0d, 0xff, 0x55, 0x0c, - 0x75, 0x84, 0x57, 0x39, 0x5e, 0xcf, 0x38, 0x02, 0x96, 0x7c, 0x14, 0x83, 0x9d, 0x37, 0x5a, 0x73, - 0xec, 0x8e, 0xed, 0x52, 0x83, 0x0b, 0x6a, 0x38, 0x0c, 0x6d, 0xd0, 0x11, 0x08, 0x7c, 0x37, 0x17, - 0x09, 0x1c, 0x12, 0x29, 0x42, 0xd6, 0xe0, 0x9c, 0x7f, 0x51, 0x1c, 0xbc, 0x50, 0xac, 0x56, 0x5c, - 0x65, 0x04, 0x5f, 0x25, 0x91, 0xb8, 0x32, 0x54, 0x2b, 0xd3, 0x4f, 0xfb, 0xd7, 0x22, 0xfe, 0x13, - 0xc7, 0x86, 0x69, 0xc8, 0x5d, 0x9d, 0xca, 0x8f, 0xfc, 0x10, 0x0c, 0x2f, 0xea, 0x8f, 0x2a, 0x5d, - 0x71, 0xf6, 0x32, 0xba, 0xf7, 0xdb, 0x97, 0xb6, 0xfe, 0xa8, 0x61, 0x88, 0x72, 0x31, 0x9b, 0x42, - 0x66, 0x49, 0x1a, 0x70, 0xa1, 0xe6, 0xd8, 0x6d, 0xdb, 0xa3, 0x46, 0xec, 0xb1, 0xdf, 0x99, 0xf0, - 0x75, 0x70, 0x47, 0x50, 0x34, 0x7a, 0xbc, 0xfa, 0xcb, 0x60, 0x43, 0xda, 0x70, 0xa6, 0xec, 0xba, - 0xdd, 0x36, 0x0d, 0x6f, 0xa8, 0xc6, 0x77, 0xfd, 0x8c, 0x4f, 0x08, 0xaf, 0xe5, 0x27, 0x75, 0x2c, - 0xca, 0x2f, 0xa8, 0x1a, 0x9e, 0x29, 0xd7, 0x88, 0xdf, 0x12, 0xe7, 0x7d, 0xbb, 0x38, 0x38, 0x36, - 0x7e, 0x46, 0xbb, 0x98, 0x6c, 0xcc, 0x8a, 0xe9, 0xb5, 0xa8, 0xfa, 0xad, 0x1c, 0x40, 0x28, 0x60, - 0xf2, 0x62, 0x34, 0x22, 0x52, 0x2e, 0xbc, 0xe8, 0x10, 0xd1, 0x12, 0x22, 0x21, 0x90, 0xc8, 0x65, - 0x28, 0x62, 0x44, 0x8d, 0x7c, 0x78, 0xb0, 0xfa, 0xc0, 0xb4, 0x0c, 0x0d, 0xa1, 0x0c, 0x2b, 0x3d, - 0x7d, 0x47, 0x2c, 0x5e, 0xea, 0x73, 0xab, 0xb0, 0x02, 0x67, 0xea, 0xdd, 0x55, 0xbf, 0x6e, 0xe9, - 0x1d, 0x1f, 0x06, 0xf6, 0x70, 0xbb, 0xab, 0xc1, 0xe3, 0xd7, 0x48, 0xd8, 0x94, 0x68, 0x11, 0xf5, - 0x1b, 0xb9, 0xd8, 0x2c, 0x78, 0x8c, 0x8b, 0xde, 0xc7, 0x92, 0x7e, 0x1a, 0xc9, 0x69, 0x49, 0xfd, - 0x4b, 0x79, 0x18, 0xae, 0xd9, 0x8e, 0x27, 0x42, 0x94, 0x9c, 0xec, 0x55, 0x48, 0xda, 0x2b, 0x15, - 0xf7, 0xb1, 0x57, 0xba, 0x0c, 0x45, 0xc9, 0x45, 0x99, 0xdf, 0x8b, 0x18, 0x86, 0xa3, 0x21, 0x54, - 0xfd, 0x91, 0x3c, 0xc0, 0xe7, 0x5e, 0x7a, 0xe9, 0x31, 0x16, 0x90, 0xfa, 0x17, 0x72, 0x70, 0x46, - 0x5c, 0xd4, 0x49, 0xb1, 0xc5, 0x06, 0xfc, 0x2b, 0x56, 0x79, 0x5c, 0x72, 0x90, 0xe6, 0xe3, 0xd8, - 0x12, 0x30, 0xfb, 0xc8, 0xf4, 0xf0, 0xae, 0x42, 0x0a, 0x2e, 0x46, 0x05, 0x4c, 0x5e, 0x02, 0x7c, - 0x3a, 0xf2, 0xa2, 0x7f, 0x05, 0x59, 0x08, 0xd7, 0x3d, 0x56, 0x60, 0x36, 0xf5, 0x1a, 0x52, 0xfd, - 0x8d, 0x22, 0x14, 0x67, 0x1f, 0xd1, 0xe6, 0x09, 0xef, 0x1a, 0xe9, 0x60, 0xb3, 0x78, 0xc8, 0x83, - 0xcd, 0x83, 0xf8, 0x54, 0xbc, 0x13, 0xf6, 0x67, 0x29, 0x5a, 0x7d, 0xac, 0xe7, 0xe3, 0xd5, 0xfb, - 0x3d, 0x7d, 0xf2, 0x5c, 0x72, 0xfe, 0x8b, 0x02, 0x14, 0xea, 0x33, 0xb5, 0x53, 0xbd, 0x39, 0x56, - 0xbd, 0xe9, 0x7d, 0x67, 0xad, 0x06, 0xd7, 0x50, 0x83, 0xa1, 0x97, 0x68, 0xec, 0xc6, 0xe9, 0xbb, - 0x05, 0x18, 0xab, 0xcf, 0xad, 0xd4, 0xa4, 0x93, 0xe0, 0x3b, 0xdc, 0x93, 0x0f, 0x7d, 0xca, 0x78, - 0x97, 0x5e, 0x4e, 0xd8, 0x33, 0x77, 0xab, 0x96, 0xf7, 0xea, 0xcd, 0x7b, 0x7a, 0xab, 0x4b, 0xf1, - 0xe8, 0x85, 0xfb, 0xfd, 0xba, 0xe6, 0x07, 0xf4, 0xeb, 0x18, 0x68, 0xc0, 0x67, 0x40, 0xde, 0x84, - 0xc2, 0x5d, 0xe1, 0x91, 0x91, 0xc5, 0xe7, 0xe5, 0x1b, 0x9c, 0x0f, 0x9b, 0x04, 0x0b, 0x5d, 0xd3, - 0x40, 0x0e, 0xac, 0x14, 0x2b, 0x7c, 0x4b, 0x2c, 0xc0, 0x7b, 0x2a, 0xbc, 0xee, 0x17, 0xbe, 0x55, - 0xad, 0x90, 0x3a, 0x0c, 0xd7, 0xa8, 0xd3, 0x36, 0xb1, 0xa3, 0xfc, 0x39, 0xbb, 0x37, 0x13, 0xb6, - 0x53, 0x19, 0xee, 0x84, 0x85, 0x90, 0x99, 0xcc, 0x85, 0xbc, 0x07, 0xc0, 0x6d, 0x94, 0x3d, 0xc6, - 0xab, 0x7c, 0x0a, 0xed, 0x7e, 0x6e, 0x5a, 0xa6, 0xd8, 0x78, 0x12, 0x33, 0xf2, 0x00, 0xc6, 0x17, - 0x6d, 0xc3, 0x5c, 0x33, 0xb9, 0xeb, 0x25, 0x56, 0x50, 0xda, 0xdd, 0xe1, 0x89, 0x99, 0x92, 0x6d, - 0xa9, 0x5c, 0x5a, 0x35, 0x09, 0xc6, 0xea, 0xdf, 0xee, 0x87, 0x22, 0xeb, 0xf6, 0xd3, 0xf1, 0x7b, - 0x98, 0xf1, 0x5b, 0x86, 0xf1, 0xfb, 0xb6, 0xf3, 0xc0, 0xb4, 0xd6, 0x03, 0xaf, 0x78, 0xb1, 0x37, - 0x45, 0x4f, 0x9e, 0x4d, 0x8e, 0x6b, 0x04, 0x0e, 0xf4, 0x5a, 0x82, 0x7c, 0x97, 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, 0xa8, 0x01, 0x48, 0xf7, 0x4b, 0x10, 0x13, 0x44, 0x64, 0x72, 0x10, - 0xe1, 0xe8, 0x52, 0xae, 0x97, 0x34, 0x89, 0x07, 0x79, 0x35, 0x76, 0x01, 0x4e, 0x22, 0xdc, 0x32, - 0xef, 0xbf, 0x43, 0x07, 0xaa, 0x91, 0xdd, 0x1c, 0xa8, 0xd4, 0xbf, 0x51, 0x80, 0x61, 0xc6, 0xad, - 0xde, 0x6d, 0xb7, 0x75, 0x67, 0xeb, 0x54, 0x91, 0x0f, 0xa3, 0xc8, 0x0d, 0x98, 0x90, 0x1d, 0xe6, - 0x99, 0xe9, 0xea, 0x87, 0x36, 0x0a, 0x8e, 0x7f, 0xe2, 0x04, 0xdc, 0xb6, 0xc4, 0x79, 0xdf, 0x13, - 0x60, 0x3c, 0x5b, 0x70, 0xb5, 0x24, 0x2f, 0xf5, 0x67, 0x73, 0x30, 0x1e, 0x87, 0x06, 0xba, 0x9f, - 0x4b, 0xd5, 0xfd, 0x17, 0x60, 0x48, 0x5c, 0xa1, 0xeb, 0x86, 0xf0, 0xe8, 0x1b, 0xdb, 0xd9, 0x9e, - 0x04, 0x7c, 0xbf, 0xdc, 0x70, 0xa8, 0x6e, 0x68, 0x21, 0x01, 0x79, 0x05, 0x46, 0xf0, 0xc7, 0x7d, - 0xc7, 0xf4, 0x3c, 0xca, 0x3b, 0xa3, 0xc8, 0x6f, 0x05, 0x78, 0x81, 0x4d, 0x8e, 0xd0, 0x22, 0x64, - 0xea, 0xef, 0xe7, 0x61, 0xa8, 0xde, 0x5d, 0x75, 0xb7, 0x5c, 0x8f, 0xb6, 0x4f, 0xb8, 0x0e, 0xf9, - 0x9b, 0xf4, 0x62, 0xea, 0x26, 0xfd, 0x39, 0x7f, 0x68, 0x49, 0xa7, 0xd7, 0xc1, 0xc6, 0xc0, 0xf7, - 0x4a, 0x0c, 0xb5, 0xa8, 0xb4, 0x7f, 0x2d, 0x52, 0xff, 0x56, 0x1e, 0xc6, 0xf9, 0xe5, 0x6d, 0xc5, - 0x74, 0x9b, 0x47, 0xf0, 0xa0, 0xe4, 0xf8, 0x65, 0x7a, 0x38, 0x87, 0x87, 0x3d, 0x3c, 0xd3, 0x51, - 0xbf, 0x94, 0x87, 0xe1, 0x72, 0xd7, 0xdb, 0x28, 0x7b, 0x38, 0xbf, 0x3d, 0x96, 0x7b, 0xe4, 0xbf, - 0x97, 0x83, 0x33, 0xac, 0x21, 0x2b, 0xf6, 0x03, 0x6a, 0x1d, 0xc1, 0xe1, 0xb7, 0x7c, 0x88, 0x9d, - 0x3f, 0xe0, 0x21, 0xb6, 0x2f, 0xcb, 0xc2, 0xfe, 0x64, 0x89, 0x57, 0x36, 0x9a, 0xdd, 0xa2, 0x27, - 0xfb, 0x33, 0x8e, 0xf0, 0xca, 0xc6, 0x17, 0xc8, 0x11, 0x5c, 0x11, 0x7e, 0x7f, 0x09, 0xe4, 0x08, - 0xce, 0x37, 0xbf, 0x3f, 0x04, 0xf2, 0x7b, 0x39, 0x18, 0x9a, 0xb6, 0xbd, 0x13, 0x3e, 0xf0, 0xc5, - 0x57, 0x9c, 0x6c, 0x35, 0xf7, 0xbf, 0xe2, 0x64, 0xeb, 0xa6, 0xfa, 0x0b, 0x79, 0x38, 0x27, 0xe2, - 0xe1, 0x8b, 0x33, 0xb0, 0xd3, 0xe9, 0x58, 0x0c, 0xb6, 0xa4, 0x68, 0x4e, 0xe7, 0x21, 0x21, 0x9a, - 0x5f, 0x2a, 0xc0, 0x39, 0x0c, 0xdf, 0xcb, 0x76, 0x54, 0xdf, 0x07, 0xb6, 0x08, 0x69, 0x46, 0x2f, - 0xe2, 0x17, 0x53, 0x2e, 0xe2, 0xff, 0xf9, 0xf6, 0xe4, 0xab, 0xeb, 0xa6, 0xb7, 0xd1, 0x5d, 0x9d, - 0x6a, 0xda, 0xed, 0xeb, 0xeb, 0x8e, 0xfe, 0xd0, 0xe4, 0x57, 0xd0, 0x7a, 0xeb, 0x7a, 0x98, 0xa6, - 0xa6, 0x63, 0x8a, 0xa4, 0x33, 0x75, 0xdc, 0x29, 0x31, 0xae, 0xfe, 0x15, 0xbe, 0x0b, 0x70, 0xdb, - 0x36, 0x2d, 0xe1, 0xd7, 0xca, 0x0d, 0xdd, 0xfa, 0xce, 0xf6, 0xe4, 0xf9, 0xf7, 0x6d, 0xd3, 0x6a, - 0xc4, 0x9d, 0x5b, 0xf7, 0x5b, 0x5f, 0xc8, 0x5a, 0x93, 0xaa, 0x51, 0xff, 0x9b, 0x1c, 0x3c, 0x11, - 0xd5, 0xe2, 0xef, 0x07, 0xdb, 0xf1, 0xcf, 0xe5, 0xe1, 0xfc, 0x2d, 0x14, 0x4e, 0xe0, 0x4c, 0x74, - 0x3a, 0x6f, 0x89, 0xc1, 0x99, 0x22, 0x9b, 0x53, 0x8b, 0x32, 0x5b, 0x36, 0xa7, 0x93, 0xba, 0x90, - 0xcd, 0x7f, 0x9d, 0x83, 0xb3, 0xcb, 0xd5, 0xca, 0xcc, 0xf7, 0xc9, 0x88, 0x4a, 0x7e, 0xcf, 0x09, - 0x37, 0x38, 0x13, 0xdf, 0x73, 0xc2, 0x4d, 0xcf, 0xaf, 0xe5, 0xe1, 0x6c, 0xbd, 0xbc, 0xb8, 0xf0, - 0xfd, 0x32, 0x83, 0xcf, 0xc8, 0x9e, 0xaf, 0xfe, 0x21, 0x98, 0xb0, 0x05, 0xe4, 0xcf, 0xbc, 0x77, - 0x23, 0xdb, 0x23, 0x36, 0x29, 0x94, 0x13, 0x3e, 0x75, 0x1f, 0x89, 0x50, 0x98, 0xe6, 0x47, 0xa8, - 0x4f, 0xb8, 0xe6, 0xff, 0xe7, 0x25, 0x18, 0xbe, 0xd3, 0x5d, 0xa5, 0xc2, 0x41, 0xea, 0xb1, 0x3e, - 0xf9, 0xbd, 0x01, 0xc3, 0x42, 0x0c, 0x78, 0xc3, 0x21, 0x05, 0x70, 0x14, 0x01, 0x79, 0x78, 0x8c, - 0x2c, 0x99, 0x88, 0x5c, 0x86, 0xe2, 0x3d, 0xea, 0xac, 0xca, 0x6f, 0x9b, 0x1f, 0x52, 0x67, 0x55, - 0x43, 0x28, 0x59, 0x08, 0x9f, 0x6d, 0x94, 0x6b, 0x55, 0x4c, 0x1e, 0x24, 0x2e, 0x0d, 0x31, 0x1b, - 0x52, 0xe0, 0x7b, 0xa9, 0x77, 0x4c, 0x9e, 0x76, 0x48, 0x8e, 0xab, 0x10, 0x2f, 0x49, 0x96, 0x60, - 0x42, 0x76, 0xbe, 0xe3, 0x99, 0x73, 0x06, 0x53, 0xd8, 0xa5, 0xe5, 0xcc, 0x49, 0x16, 0x25, 0xef, - 0xc0, 0x88, 0x0f, 0x44, 0x37, 0xc2, 0xa1, 0x30, 0x5d, 0x43, 0xc0, 0x2a, 0x16, 0x5d, 0x3f, 0x52, - 0x40, 0x66, 0x80, 0x97, 0x18, 0x90, 0xc2, 0x20, 0xe6, 0x96, 0x19, 0x29, 0x40, 0x5e, 0x41, 0x06, - 0xf8, 0xd4, 0x08, 0x1d, 0xa6, 0x86, 0xf1, 0xe1, 0x2f, 0x5e, 0x00, 0x39, 0x02, 0xce, 0x9f, 0x77, - 0x47, 0xc8, 0xc8, 0x32, 0x40, 0xe8, 0xd8, 0x22, 0x82, 0x68, 0xec, 0xdb, 0xe5, 0x46, 0x62, 0x21, - 0xdf, 0xe4, 0x8d, 0x1e, 0xe4, 0x26, 0x4f, 0xfd, 0xb9, 0x02, 0x0c, 0x97, 0x3b, 0x9d, 0x60, 0x28, - 0xbc, 0x08, 0xa5, 0x72, 0xa7, 0x73, 0x57, 0xab, 0xca, 0xe1, 0xf4, 0xf5, 0x4e, 0xa7, 0xd1, 0x75, - 0x4c, 0xd9, 0x2f, 0x99, 0x13, 0x91, 0x19, 0x18, 0x2d, 0x77, 0x3a, 0xb5, 0xee, 0x6a, 0xcb, 0x6c, - 0x4a, 0xd9, 0xc0, 0x78, 0xbe, 0xc4, 0x4e, 0xa7, 0xd1, 0x41, 0x4c, 0x3c, 0x25, 0x5c, 0xb4, 0x0c, - 0xf9, 0x22, 0x86, 0x9e, 0x12, 0xc9, 0xa8, 0x78, 0xba, 0x1b, 0x35, 0x08, 0xa4, 0x1f, 0xb6, 0x6d, - 0x2a, 0x20, 0xe2, 0x09, 0x07, 0x2e, 0xfb, 0x69, 0x22, 0x58, 0x45, 0x89, 0xa4, 0x53, 0x21, 0x4b, - 0xf2, 0x29, 0x18, 0x28, 0x77, 0x3a, 0xd2, 0x6d, 0x15, 0x3a, 0xb6, 0xb1, 0x52, 0xf1, 0x7c, 0x7f, - 0x82, 0x4c, 0x7c, 0x96, 0xb8, 0xdf, 0xb6, 0x1d, 0x0f, 0x87, 0xd4, 0x68, 0xf8, 0x59, 0xfe, 0x85, - 0xb8, 0x2d, 0x47, 0x7b, 0xd1, 0xa2, 0x65, 0x2e, 0xbd, 0x05, 0x63, 0xd1, 0x16, 0xef, 0x2b, 0xeb, - 0xc1, 0xf7, 0x72, 0x28, 0x95, 0x13, 0xee, 0x9c, 0xff, 0x32, 0x14, 0xca, 0x9d, 0x8e, 0x98, 0xd4, - 0xce, 0xa6, 0x74, 0x6a, 0xfc, 0x2d, 0x7f, 0xb9, 0xd3, 0xf1, 0x3f, 0xfd, 0x84, 0xbf, 0xf2, 0x39, - 0xd0, 0xa7, 0xff, 0x1e, 0xff, 0xf4, 0x93, 0xfd, 0x02, 0x47, 0xfd, 0x8d, 0x02, 0x9c, 0x29, 0x77, - 0x3a, 0xa7, 0xd9, 0x12, 0x8e, 0x2a, 0x62, 0xc0, 0x4b, 0x00, 0xd2, 0x1c, 0x3b, 0x10, 0xbc, 0x41, - 0x1c, 0x96, 0xe6, 0x57, 0x25, 0xa7, 0x49, 0x44, 0xbe, 0xfa, 0x0d, 0xee, 0x4b, 0xfd, 0xbe, 0x54, - 0xc0, 0x89, 0xef, 0xa4, 0x47, 0x3f, 0xfb, 0xa8, 0x74, 0x9b, 0xe8, 0x83, 0xd2, 0xbe, 0xfa, 0xe0, - 0xef, 0x46, 0x06, 0x0f, 0x46, 0xdf, 0x3f, 0xed, 0x85, 0xfe, 0x43, 0xd9, 0xd6, 0x63, 0xb2, 0x30, - 0x45, 0x48, 0x26, 0x3f, 0x03, 0x99, 0x08, 0x10, 0xd6, 0x64, 0xa8, 0x86, 0x69, 0x68, 0x31, 0x5a, - 0xbf, 0x0f, 0x07, 0xf6, 0xd5, 0x87, 0xdb, 0x79, 0x0c, 0x02, 0x10, 0x04, 0x18, 0x3b, 0xfc, 0x16, - 0xe5, 0x3a, 0x00, 0x77, 0x5f, 0x08, 0xfc, 0xf3, 0x47, 0x79, 0x2c, 0x21, 0x9e, 0x98, 0x4c, 0xc4, - 0x12, 0x0a, 0x49, 0x02, 0x77, 0xa7, 0x42, 0xaa, 0xbb, 0xd3, 0x35, 0x18, 0xd4, 0xf4, 0xcd, 0x77, - 0xbb, 0xd4, 0xd9, 0x12, 0x36, 0x11, 0x8f, 0xdf, 0xa9, 0x6f, 0x36, 0x7e, 0x98, 0x01, 0xb5, 0x00, - 0x4d, 0xd4, 0x20, 0x8a, 0x84, 0xe4, 0x56, 0xc2, 0x0f, 0xda, 0x83, 0xd8, 0x11, 0x07, 0x51, 0x74, - 0xf2, 0x06, 0x14, 0xca, 0xf7, 0xeb, 0x42, 0xb2, 0x41, 0xd7, 0x96, 0xef, 0xd7, 0x85, 0xbc, 0x32, - 0xcb, 0xde, 0xaf, 0xab, 0x5f, 0xca, 0x03, 0x49, 0x52, 0x92, 0x57, 0x61, 0x08, 0xa1, 0xeb, 0x4c, - 0x67, 0xe4, 0x8c, 0xb6, 0x9b, 0x6e, 0xc3, 0x41, 0x68, 0xc4, 0x42, 0xf4, 0x49, 0xc9, 0xeb, 0x98, - 0x33, 0x5c, 0xe4, 0x54, 0x8c, 0x64, 0xb4, 0xdd, 0x74, 0xfd, 0x2c, 0xdb, 0xb1, 0x94, 0xe1, 0x82, - 0x18, 0x8d, 0xcb, 0xfb, 0xf5, 0x79, 0xdb, 0xf5, 0x84, 0xa8, 0xb9, 0x71, 0xb9, 0xe9, 0x62, 0x2a, - 0xe5, 0x88, 0x71, 0xc9, 0xc9, 0x30, 0x1d, 0xdc, 0xfd, 0x3a, 0x7f, 0x6f, 0x65, 0x68, 0x76, 0xcb, - 0xb7, 0x4a, 0x79, 0x3a, 0xb8, 0x4d, 0xb7, 0xc1, 0xdf, 0x6a, 0x19, 0x98, 0xac, 0x3c, 0x92, 0x0e, - 0x2e, 0x52, 0x4a, 0xfd, 0xe9, 0x41, 0x18, 0xaf, 0xe8, 0x9e, 0xbe, 0xaa, 0xbb, 0x54, 0xda, 0x92, - 0x9f, 0xf1, 0x61, 0xfe, 0xe7, 0x48, 0x72, 0x30, 0x56, 0x53, 0xbe, 0x26, 0x5e, 0x80, 0xbc, 0x19, - 0xf2, 0x0d, 0x92, 0xf5, 0xca, 0xd9, 0xff, 0x56, 0x1b, 0x1d, 0x01, 0xd6, 0x12, 0x84, 0xe4, 0x05, - 0x18, 0xf6, 0x61, 0x6c, 0x17, 0x51, 0x08, 0x75, 0xc6, 0x58, 0x65, 0x9b, 0x08, 0x4d, 0x46, 0x93, - 0xd7, 0x61, 0xc4, 0xff, 0x29, 0xd9, 0xe7, 0x3c, 0x95, 0xe1, 0x6a, 0x62, 0x0b, 0x26, 0x93, 0xca, - 0x45, 0x71, 0x7e, 0xeb, 0x8f, 0x14, 0x8d, 0x65, 0x0b, 0x8c, 0x90, 0x92, 0x1f, 0x86, 0x31, 0xff, - 0xb7, 0xd8, 0x75, 0x70, 0xef, 0xc3, 0x17, 0x82, 0x5c, 0xe8, 0x31, 0xb1, 0x4e, 0x45, 0xc9, 0xf9, - 0xfe, 0xe3, 0x49, 0x3f, 0x01, 0x9e, 0xb1, 0x9a, 0xdc, 0x7e, 0xc4, 0x2a, 0x20, 0x55, 0x98, 0xf0, - 0x21, 0xa1, 0x86, 0x0e, 0x84, 0xdb, 0x4e, 0x63, 0xb5, 0x91, 0xaa, 0xa4, 0xc9, 0x52, 0xa4, 0x05, - 0x97, 0x23, 0x40, 0xc3, 0xdd, 0x30, 0xd7, 0x3c, 0xb1, 0x67, 0x14, 0xc1, 0xb4, 0x45, 0xc6, 0xd3, - 0x80, 0x2b, 0xa7, 0xf1, 0x53, 0x17, 0x47, 0xd3, 0x9c, 0xf5, 0xe4, 0x46, 0xea, 0x70, 0xce, 0xc7, - 0xdf, 0x9a, 0xa9, 0xd5, 0x1c, 0xfb, 0x7d, 0xda, 0xf4, 0xaa, 0x15, 0xb1, 0xe7, 0xc6, 0x20, 0x8b, - 0xc6, 0x6a, 0x63, 0xbd, 0xd9, 0x61, 0x4a, 0xc1, 0x70, 0x51, 0xe6, 0xa9, 0x85, 0xc9, 0x3d, 0x38, - 0x2f, 0xc1, 0xa5, 0xbc, 0xea, 0x10, 0x1e, 0x0a, 0x08, 0xae, 0xe9, 0xa9, 0xd5, 0xd3, 0x8b, 0x93, - 0xb7, 0x60, 0xd4, 0x47, 0xf0, 0xab, 0xc8, 0x61, 0xbc, 0x8a, 0xc4, 0x21, 0x69, 0xac, 0x36, 0xe2, - 0xcf, 0x82, 0xa3, 0xc4, 0xb2, 0x46, 0xad, 0x6c, 0x75, 0xa8, 0x70, 0x0b, 0xf6, 0x35, 0xca, 0xdb, - 0xea, 0xa4, 0x2a, 0x23, 0x23, 0x25, 0xef, 0x84, 0x1a, 0xb5, 0xec, 0x98, 0xeb, 0x26, 0xdf, 0x8e, - 0xfb, 0x2f, 0x81, 0x57, 0x1b, 0x36, 0x02, 0xd3, 0xf4, 0x83, 0x93, 0x5f, 0x2a, 0xc3, 0xd9, 0x14, - 0x1d, 0xdb, 0xd7, 0x8e, 0xf1, 0xcb, 0xf9, 0xb0, 0x11, 0x27, 0x7c, 0xdb, 0x38, 0x0d, 0x83, 0xfe, - 0x97, 0x08, 0xe3, 0x41, 0xc9, 0x1a, 0x9a, 0x71, 0x1e, 0x3e, 0x3e, 0x22, 0x8e, 0x13, 0xbe, 0x95, - 0x3c, 0x0a, 0x71, 0x7c, 0x3b, 0x17, 0x8a, 0xe3, 0x84, 0x6f, 0x2f, 0x7f, 0xaa, 0x18, 0xce, 0x49, - 0xa7, 0x7b, 0xcc, 0xa3, 0x32, 0x93, 0x43, 0x67, 0xda, 0xd2, 0x3e, 0x5e, 0xe4, 0xca, 0xaa, 0x39, - 0x70, 0x30, 0xd5, 0x24, 0x6f, 0xc1, 0x70, 0xcd, 0x76, 0xbd, 0x75, 0x87, 0xba, 0xb5, 0x20, 0x19, - 0x04, 0xbe, 0xe6, 0xee, 0x08, 0x70, 0xa3, 0x13, 0x99, 0xfd, 0x65, 0x72, 0xf5, 0x1f, 0x16, 0x12, - 0xda, 0xc0, 0x0d, 0xd7, 0x13, 0xa9, 0x0d, 0x47, 0x30, 0xd4, 0xc9, 0x8d, 0x70, 0x15, 0xe4, 0x16, - 0x7e, 0xbf, 0x14, 0xe9, 0x72, 0x55, 0x18, 0xf8, 0x51, 0x12, 0xf2, 0x03, 0x70, 0x31, 0x02, 0xa8, - 0xe9, 0x8e, 0xde, 0xa6, 0x5e, 0x98, 0x78, 0x13, 0x63, 0x97, 0xf9, 0xa5, 0x1b, 0x9d, 0x00, 0x2d, - 0x27, 0xf3, 0xcc, 0xe0, 0x20, 0xa9, 0xd6, 0xc0, 0x3e, 0xfc, 0xb4, 0x7f, 0xbe, 0x10, 0x1a, 0x3a, - 0xd1, 0x18, 0xc4, 0x1a, 0x75, 0xbb, 0x2d, 0xef, 0xf1, 0xed, 0xe0, 0x83, 0x65, 0x78, 0x99, 0x87, - 0x33, 0xe5, 0xb5, 0x35, 0xda, 0xf4, 0xfc, 0xd0, 0xea, 0xae, 0x88, 0x3a, 0xc9, 0x37, 0x1e, 0x02, - 0x25, 0x42, 0x65, 0xcb, 0xfd, 0x1a, 0x2f, 0xa6, 0xfe, 0xa3, 0x22, 0x28, 0x81, 0xe1, 0x1f, 0xbc, - 0x57, 0x3c, 0xc6, 0x45, 0xf6, 0x23, 0xd1, 0x2b, 0x26, 0x4c, 0x84, 0xc2, 0x10, 0x0f, 0xc5, 0x44, - 0x2a, 0xf8, 0xc9, 0x38, 0xb3, 0x90, 0x90, 0xef, 0x25, 0x2e, 0x89, 0xbd, 0x04, 0x09, 0xdf, 0x83, - 0x36, 0x5c, 0xce, 0x42, 0x4b, 0x72, 0x25, 0x5f, 0xc9, 0xc1, 0x39, 0xbf, 0x53, 0x96, 0x57, 0x99, - 0x51, 0x3d, 0x63, 0x77, 0xad, 0xe0, 0x15, 0xd5, 0x1b, 0xd9, 0xd5, 0xf1, 0x4e, 0x9a, 0x4a, 0x2b, - 0xcc, 0x5b, 0x12, 0xc4, 0x57, 0x09, 0x14, 0xc2, 0x46, 0x9a, 0x46, 0x13, 0x89, 0xb4, 0xd4, 0x7a, - 0x2f, 0xdd, 0x82, 0x27, 0x32, 0x59, 0xee, 0x66, 0xc4, 0xf6, 0xcb, 0x46, 0xec, 0x7f, 0x97, 0x0b, - 0x27, 0xa2, 0x98, 0x90, 0xc8, 0x14, 0x40, 0x08, 0x12, 0xdb, 0x5a, 0x7c, 0xa4, 0x15, 0x0a, 0x4d, - 0x93, 0x28, 0xc8, 0x32, 0x94, 0x84, 0x58, 0x78, 0x92, 0xeb, 0x4f, 0xee, 0xd2, 0x0b, 0x53, 0xb2, - 0x1c, 0x70, 0xcb, 0x2a, 0xbe, 0x59, 0xb0, 0xb9, 0xf4, 0x3a, 0x0c, 0x1f, 0xf4, 0xbb, 0xbe, 0x52, - 0x00, 0x22, 0xef, 0x41, 0x8f, 0xd1, 0x40, 0x3f, 0xc1, 0x53, 0xd8, 0x55, 0x18, 0x64, 0x9f, 0x80, - 0x69, 0x5f, 0xa4, 0x30, 0xcf, 0x5d, 0x01, 0xd3, 0x02, 0x6c, 0x18, 0x63, 0x6d, 0x20, 0x3d, 0xc6, - 0x9a, 0xfa, 0xb3, 0x05, 0xb8, 0x20, 0x77, 0x48, 0x85, 0x62, 0xe6, 0x88, 0xd3, 0x4e, 0xf9, 0x10, - 0x3b, 0x45, 0x85, 0x12, 0xdf, 0x7a, 0x88, 0x14, 0x1e, 0xfc, 0x58, 0x08, 0x21, 0x9a, 0xc0, 0xa8, - 0xff, 0x73, 0x1e, 0x46, 0x03, 0xf3, 0x4e, 0x77, 0xdc, 0xc7, 0xb8, 0x3b, 0x3e, 0x0d, 0xa3, 0x18, - 0x25, 0xab, 0x4d, 0x2d, 0x1e, 0x49, 0xaa, 0x5f, 0xca, 0xb9, 0xe3, 0x23, 0x44, 0x7a, 0xb5, 0x08, - 0x21, 0xd3, 0x7e, 0x6e, 0xf9, 0x49, 0xb1, 0xcb, 0xb8, 0xd9, 0xc7, 0xe1, 0xea, 0x5f, 0x2e, 0xc0, - 0x88, 0x2f, 0xe5, 0x69, 0xf3, 0xa4, 0xde, 0xf3, 0x1c, 0xaf, 0x90, 0xaf, 0x03, 0xd4, 0x6c, 0xc7, - 0xd3, 0x5b, 0x4b, 0xa1, 0xe6, 0xe3, 0x01, 0x69, 0x07, 0xa1, 0xbc, 0x8c, 0x44, 0x82, 0xeb, 0x57, - 0x68, 0x56, 0xf3, 0x89, 0x89, 0xaf, 0x5f, 0x01, 0x54, 0x93, 0x28, 0xd4, 0xdf, 0xc9, 0xc3, 0x19, - 0xbf, 0x93, 0x66, 0x1f, 0xd1, 0x66, 0xf7, 0x71, 0x9e, 0x9b, 0xa2, 0xd2, 0xee, 0xdf, 0x55, 0xda, - 0xea, 0xff, 0x25, 0x4d, 0x24, 0x33, 0x2d, 0xfb, 0x74, 0x22, 0xf9, 0x57, 0xa1, 0xe3, 0xea, 0x8f, - 0x15, 0xe0, 0x9c, 0x2f, 0xf5, 0xb9, 0xae, 0x85, 0x47, 0x0b, 0x33, 0x7a, 0xab, 0xf5, 0x38, 0xef, - 0xc6, 0x87, 0x7d, 0x41, 0x2c, 0x8b, 0xb0, 0x93, 0x22, 0xd5, 0xe5, 0x9a, 0x00, 0x37, 0x6c, 0xd3, - 0xd0, 0x64, 0x22, 0xf2, 0x0e, 0x8c, 0xf8, 0x3f, 0xcb, 0xce, 0xba, 0xbf, 0x05, 0xc7, 0x8b, 0x82, - 0xa0, 0x90, 0xee, 0x44, 0xa2, 0x6b, 0x44, 0x0a, 0xa8, 0x5f, 0x1a, 0x80, 0x4b, 0xf7, 0x4d, 0xcb, - 0xb0, 0x37, 0x5d, 0x3f, 0x53, 0xea, 0x89, 0x3f, 0x28, 0x3b, 0xee, 0x0c, 0xa9, 0xef, 0xc2, 0xf9, - 0xb8, 0x48, 0x9d, 0x20, 0x7e, 0xbd, 0xe8, 0x9d, 0x4d, 0x4e, 0xd0, 0xf0, 0x73, 0xa6, 0x8a, 0xdb, - 0x36, 0x2d, 0xbd, 0x64, 0x3c, 0xe9, 0xea, 0xc0, 0x5e, 0x92, 0xae, 0x3e, 0x0f, 0xa5, 0x8a, 0xdd, - 0xd6, 0x4d, 0x3f, 0xce, 0x12, 0x8e, 0xe2, 0xa0, 0x5e, 0xc4, 0x68, 0x82, 0x82, 0xf1, 0x17, 0x15, - 0x63, 0x97, 0x0d, 0x85, 0xfc, 0xfd, 0x02, 0xcc, 0x4a, 0xd3, 0x64, 0x22, 0x62, 0xc3, 0xa8, 0xa8, - 0x4e, 0xdc, 0x8d, 0x01, 0x6e, 0x9e, 0x5e, 0xf1, 0x65, 0x94, 0xad, 0x56, 0x53, 0x91, 0x72, 0x7c, - 0x1b, 0xc5, 0x73, 0xc1, 0x8a, 0x8f, 0xe1, 0xb7, 0x64, 0x5a, 0x94, 0xbf, 0x24, 0x04, 0x9c, 0x64, - 0x86, 0x93, 0x42, 0xc0, 0x59, 0x46, 0x26, 0x22, 0xb3, 0x30, 0x81, 0x51, 0xc6, 0x83, 0xad, 0x14, - 0x53, 0x89, 0x11, 0x34, 0x2a, 0xf1, 0xca, 0x85, 0x07, 0x26, 0x67, 0x1f, 0xd7, 0x68, 0x0a, 0xb4, - 0x96, 0x2c, 0x41, 0x9e, 0x80, 0xc2, 0xd2, 0x42, 0x19, 0xef, 0x6a, 0x06, 0x79, 0x86, 0x2f, 0xab, - 0xa5, 0x6b, 0x0c, 0x76, 0xe9, 0xb3, 0x40, 0x92, 0x9f, 0xb3, 0xaf, 0xfb, 0x98, 0xff, 0x52, 0xda, - 0xf2, 0x9d, 0x74, 0x8f, 0x9a, 0xa3, 0x98, 0x08, 0x23, 0xc9, 0xf5, 0xfa, 0x3f, 0xcc, 0xe4, 0x7a, - 0xa5, 0x23, 0x4d, 0xae, 0xa7, 0xfe, 0x6a, 0x0e, 0x26, 0x12, 0x91, 0xf8, 0xc9, 0xcb, 0x00, 0x1c, - 0x22, 0x45, 0x3c, 0xc5, 0x10, 0x42, 0x61, 0x74, 0x7e, 0xb1, 0x3c, 0x86, 0x64, 0xe4, 0x3a, 0x0c, - 0xf2, 0x5f, 0x22, 0x4a, 0x59, 0xb2, 0x48, 0xb7, 0x6b, 0x1a, 0x5a, 0x40, 0x14, 0xd6, 0x82, 0x37, - 0x92, 0x85, 0xd4, 0x22, 0xde, 0x56, 0x27, 0xa8, 0x85, 0x91, 0xa9, 0x3f, 0x9d, 0x87, 0x91, 0xa0, - 0xc1, 0x65, 0xe3, 0xb8, 0x74, 0xae, 0x24, 0x92, 0x1a, 0x14, 0x76, 0x4b, 0x6a, 0x10, 0x9b, 0x6f, - 0x45, 0x16, 0x83, 0xa3, 0x7b, 0x95, 0xf5, 0xd5, 0x3c, 0x9c, 0x09, 0x6a, 0x3d, 0xc6, 0xcb, 0xaf, - 0x8f, 0x90, 0x48, 0xbe, 0x92, 0x03, 0x65, 0xda, 0x6c, 0xb5, 0x4c, 0x6b, 0xbd, 0x6a, 0xad, 0xd9, - 0x4e, 0x1b, 0x27, 0xc4, 0xe3, 0x3b, 0xc2, 0x55, 0xff, 0x74, 0x0e, 0x26, 0x44, 0x83, 0x66, 0x74, - 0xc7, 0x38, 0xbe, 0xf3, 0xb1, 0x78, 0x4b, 0x8e, 0x4f, 0x5f, 0xd4, 0x6f, 0xe6, 0x01, 0x16, 0xec, - 0xe6, 0x83, 0x13, 0xfe, 0xa8, 0xeb, 0x4d, 0x28, 0x71, 0xb7, 0x78, 0xa1, 0xb1, 0x13, 0xe2, 0xf1, - 0x12, 0xfb, 0x34, 0x8e, 0x98, 0x1e, 0x17, 0xf3, 0x71, 0x89, 0x7b, 0xd6, 0x2b, 0x39, 0x4d, 0x14, - 0x61, 0x95, 0x32, 0x3a, 0xb1, 0x60, 0x04, 0x95, 0x32, 0x58, 0xb4, 0xd2, 0x9d, 0xed, 0xc9, 0x62, - 0xcb, 0x6e, 0x3e, 0xd0, 0x90, 0x5e, 0xfd, 0x17, 0x39, 0x2e, 0xbb, 0x13, 0xfe, 0x34, 0xd5, 0xff, - 0xfc, 0xe2, 0x3e, 0x3f, 0xff, 0xcf, 0xe4, 0xe0, 0x9c, 0x46, 0x9b, 0xf6, 0x43, 0xea, 0x6c, 0xcd, - 0xd8, 0x06, 0xbd, 0x45, 0x2d, 0xea, 0x1c, 0xd7, 0x88, 0xfa, 0x5d, 0xcc, 0x02, 0x13, 0x36, 0xe6, - 0xae, 0x4b, 0x8d, 0x93, 0x93, 0xa1, 0x47, 0xfd, 0xf5, 0x01, 0x50, 0x52, 0xad, 0xde, 0x13, 0x6b, - 0xce, 0x65, 0x6e, 0x65, 0x8a, 0x47, 0xb5, 0x95, 0xe9, 0xdf, 0xdf, 0x56, 0xa6, 0xb4, 0xdf, 0xad, - 0xcc, 0xc0, 0x5e, 0xb6, 0x32, 0xed, 0xf8, 0x56, 0x66, 0x10, 0xb7, 0x32, 0x2f, 0xf7, 0xdc, 0xca, - 0xcc, 0x5a, 0xc6, 0x01, 0x37, 0x32, 0x27, 0x36, 0x7b, 0xf4, 0x41, 0x76, 0x60, 0x57, 0xd9, 0xa4, - 0xd8, 0xb4, 0x1d, 0x83, 0x1a, 0x62, 0xe3, 0x85, 0xa7, 0xfe, 0x8e, 0x80, 0x69, 0x01, 0x36, 0x91, - 0x8a, 0x7b, 0x74, 0x2f, 0xa9, 0xb8, 0x8f, 0x60, 0xff, 0xf5, 0xe5, 0x3c, 0x4c, 0xcc, 0x50, 0xc7, - 0xe3, 0xb1, 0x68, 0x8f, 0xc2, 0x25, 0xae, 0x0c, 0x67, 0x24, 0x86, 0x68, 0x91, 0xe7, 0x43, 0x37, - 0xbf, 0x26, 0x75, 0xbc, 0xb8, 0x97, 0x60, 0x9c, 0x9e, 0x55, 0xef, 0xa7, 0xc3, 0x13, 0x63, 0x37, - 0xa8, 0xde, 0x87, 0x73, 0x41, 0x9a, 0xe2, 0x97, 0x16, 0xd0, 0x4b, 0x19, 0xee, 0x8a, 0xfb, 0xcf, - 0x70, 0xa7, 0xfe, 0x4a, 0x0e, 0xae, 0x68, 0xd4, 0xa2, 0x9b, 0xfa, 0x6a, 0x8b, 0x4a, 0xcd, 0x12, - 0x2b, 0x03, 0x9b, 0x35, 0x4c, 0xb7, 0xad, 0x7b, 0xcd, 0x8d, 0x43, 0xc9, 0x68, 0x0e, 0x46, 0xe4, - 0xf9, 0x6b, 0x1f, 0x73, 0x5b, 0xa4, 0x9c, 0xfa, 0xeb, 0x45, 0x18, 0x98, 0xb6, 0xbd, 0xdb, 0xf6, - 0x21, 0x53, 0x2e, 0x86, 0x53, 0x7e, 0x7e, 0x1f, 0x67, 0x3d, 0x9f, 0xc2, 0xca, 0xa5, 0x2c, 0x14, - 0xe8, 0x42, 0xba, 0x6a, 0x27, 0xb2, 0x75, 0xf8, 0x64, 0xfb, 0x4c, 0xb6, 0xf8, 0x2a, 0x0c, 0x61, - 0x08, 0x19, 0xe9, 0x34, 0x16, 0x1d, 0xb4, 0x3d, 0x06, 0x8c, 0xd7, 0x11, 0x92, 0x92, 0x1f, 0x88, - 0x04, 0xcf, 0x2d, 0x1d, 0x3e, 0x39, 0xa3, 0x1c, 0x47, 0xf7, 0x65, 0x7e, 0x91, 0x87, 0x6d, 0x92, - 0x12, 0xd9, 0xe0, 0x29, 0x4a, 0xac, 0x49, 0x01, 0xe1, 0x11, 0x26, 0x4e, 0x9c, 0x81, 0xd1, 0x69, - 0xdb, 0x93, 0x9c, 0x81, 0x87, 0xc2, 0xb7, 0xa4, 0x4c, 0xf2, 0xe9, 0x9e, 0xc0, 0xd1, 0x32, 0xea, - 0x77, 0x8b, 0x30, 0xe2, 0xff, 0x3c, 0x26, 0xdd, 0x79, 0x11, 0x4a, 0xf3, 0xb6, 0x94, 0xcb, 0x03, - 0x1d, 0x88, 0x37, 0x6c, 0x37, 0xe6, 0x19, 0x2d, 0x88, 0x98, 0xd4, 0x97, 0x6c, 0x43, 0x76, 0x7f, - 0x47, 0xa9, 0x5b, 0xb6, 0x91, 0x78, 0x83, 0x1c, 0x10, 0x92, 0x2b, 0x50, 0xc4, 0x97, 0x03, 0xd2, - 0x41, 0x7e, 0xec, 0xb5, 0x00, 0xe2, 0x25, 0xad, 0x2c, 0xed, 0x57, 0x2b, 0x07, 0x0e, 0xaa, 0x95, - 0x83, 0x47, 0xab, 0x95, 0xef, 0xc1, 0x08, 0xd6, 0xe4, 0xa7, 0x02, 0xdc, 0x7d, 0x61, 0x7d, 0x42, - 0xac, 0x7d, 0xa3, 0xbc, 0xdd, 0x22, 0x21, 0x20, 0x2e, 0x79, 0x11, 0x56, 0x31, 0xdd, 0x85, 0x43, - 0x6c, 0xa7, 0xff, 0x61, 0x0e, 0x06, 0xee, 0x5a, 0x0f, 0x2c, 0x7b, 0xf3, 0x70, 0x1a, 0xf7, 0x32, - 0x0c, 0x0b, 0x36, 0xd2, 0xea, 0x82, 0xcf, 0xca, 0xbb, 0x1c, 0xdc, 0x40, 0x4e, 0x9a, 0x4c, 0x45, - 0xde, 0x0a, 0x0a, 0xe1, 0xe3, 0xa0, 0x42, 0x98, 0x0d, 0xc7, 0x2f, 0xd4, 0x8c, 0x26, 0xf0, 0x90, - 0xc9, 0xc9, 0x65, 0x28, 0x56, 0x58, 0x53, 0xa5, 0x40, 0xbe, 0xac, 0x29, 0x1a, 0x42, 0xd5, 0x2f, - 0x17, 0x61, 0x2c, 0x76, 0xf0, 0xf5, 0x3c, 0x0c, 0x89, 0x83, 0x27, 0xd3, 0xcf, 0x28, 0x82, 0x8f, - 0x87, 0x02, 0xa0, 0x36, 0xc8, 0xff, 0xac, 0x1a, 0xe4, 0x33, 0x30, 0x60, 0xbb, 0xb8, 0x28, 0xe2, - 0xb7, 0x8c, 0x85, 0x43, 0x68, 0xb9, 0xce, 0xda, 0xce, 0x07, 0x87, 0x20, 0x91, 0x35, 0xd2, 0x76, - 0xf1, 0xd3, 0x6e, 0xc2, 0x90, 0xee, 0xba, 0xd4, 0x6b, 0x78, 0xfa, 0xba, 0x9c, 0x64, 0x24, 0x00, - 0xca, 0xa3, 0x03, 0x81, 0x2b, 0xfa, 0x3a, 0xf9, 0x2c, 0x8c, 0x36, 0x1d, 0x8a, 0xcb, 0xa6, 0xde, - 0x62, 0xad, 0x94, 0xcc, 0xda, 0x08, 0x42, 0xbe, 0x3f, 0x09, 0x11, 0x55, 0x83, 0xdc, 0x83, 0x51, - 0xf1, 0x39, 0xdc, 0x73, 0x1f, 0x07, 0xda, 0x58, 0xb8, 0x8c, 0x71, 0x91, 0x70, 0xdf, 0x7d, 0xf1, - 0x80, 0x43, 0x26, 0x97, 0xf9, 0x1a, 0x12, 0x29, 0x59, 0x06, 0xb2, 0x49, 0x57, 0x1b, 0x7a, 0xd7, - 0xdb, 0x60, 0x75, 0xf1, 0x18, 0xf9, 0x22, 0xb7, 0x26, 0xbe, 0x7a, 0x48, 0x62, 0xe5, 0xc7, 0x20, - 0x9b, 0x74, 0xb5, 0x1c, 0x41, 0x92, 0xfb, 0x70, 0x3e, 0x59, 0x84, 0x7d, 0x32, 0xbf, 0x1c, 0x78, - 0x6e, 0x67, 0x7b, 0x72, 0x32, 0x95, 0x40, 0x62, 0x7b, 0x36, 0xc1, 0xb6, 0x6a, 0xdc, 0x2e, 0x0e, - 0x0e, 0x8c, 0x0f, 0x6a, 0x63, 0xac, 0xac, 0x6f, 0x42, 0x9a, 0x86, 0xfa, 0x07, 0x39, 0x66, 0x2a, - 0xb2, 0x0f, 0xc2, 0xe4, 0xe2, 0x4c, 0xd7, 0xdb, 0xfb, 0xd4, 0xf5, 0x76, 0x98, 0x06, 0xb4, 0xe4, - 0xf6, 0x98, 0x5d, 0x35, 0x81, 0x25, 0x53, 0x50, 0x32, 0xe4, 0x53, 0xb3, 0x0b, 0xd1, 0x4e, 0xf0, - 0xeb, 0xd1, 0x04, 0x15, 0xb9, 0x0a, 0x45, 0xb6, 0x64, 0xc5, 0xb7, 0xcc, 0xb2, 0x75, 0xa1, 0x21, - 0x85, 0xfa, 0x23, 0x79, 0x18, 0x91, 0xbe, 0xe6, 0xc6, 0xa1, 0x3e, 0xe7, 0x8d, 0xbd, 0x35, 0xd3, - 0x77, 0x7a, 0xc1, 0xbd, 0x94, 0xdf, 0xe4, 0x9b, 0x81, 0x28, 0xf6, 0x74, 0x21, 0x25, 0x04, 0xf3, - 0xaa, 0xf8, 0xd0, 0xd2, 0xde, 0xb7, 0x8f, 0x8c, 0xfe, 0x76, 0x71, 0x30, 0x3f, 0x5e, 0xb8, 0x5d, - 0x1c, 0x2c, 0x8e, 0xf7, 0x63, 0x30, 0x2f, 0x8c, 0x9f, 0xcd, 0xf7, 0xe6, 0xd6, 0x9a, 0xb9, 0x7e, - 0xc2, 0xdf, 0x8e, 0x1c, 0x6d, 0xa0, 0xb3, 0x98, 0x6c, 0x4e, 0xf8, 0x43, 0x92, 0x0f, 0x55, 0x36, - 0xa7, 0x69, 0x43, 0x85, 0x6c, 0xfe, 0x51, 0x0e, 0x94, 0x54, 0xd9, 0x94, 0x8f, 0xc9, 0x0f, 0xe2, - 0xe8, 0x92, 0x87, 0xfe, 0x71, 0x1e, 0x26, 0xaa, 0x96, 0x47, 0xd7, 0xf9, 0x8e, 0xf1, 0x84, 0x4f, - 0x15, 0x77, 0x60, 0x58, 0xfa, 0x18, 0xd1, 0xe7, 0x4f, 0x06, 0xfb, 0xf1, 0x10, 0x95, 0xc1, 0x49, - 0x2e, 0x7d, 0x74, 0x2f, 0x71, 0xe2, 0x42, 0x3e, 0xe1, 0x73, 0xce, 0xc9, 0x10, 0xf2, 0x09, 0x9f, - 0xbc, 0x3e, 0xa2, 0x42, 0xfe, 0x3f, 0x72, 0x70, 0x36, 0xa5, 0x72, 0x72, 0x05, 0x06, 0xea, 0xdd, - 0x55, 0x8c, 0xdd, 0x95, 0x0b, 0x3d, 0x86, 0xdd, 0xee, 0x2a, 0x86, 0xed, 0xd2, 0x7c, 0x24, 0x59, - 0xc1, 0xc7, 0xf5, 0xcb, 0xd5, 0xca, 0x8c, 0x90, 0xaa, 0x2a, 0x85, 0x09, 0x60, 0xe0, 0xb4, 0x2f, - 0x0b, 0x1e, 0xe0, 0xdb, 0xa6, 0xd1, 0x8c, 0x3d, 0xc0, 0x67, 0x65, 0xc8, 0x0f, 0xc2, 0x50, 0xf9, - 0x83, 0xae, 0x43, 0x91, 0x2f, 0x97, 0xf8, 0xc7, 0x02, 0xbe, 0x3e, 0x22, 0x8d, 0x33, 0x8f, 0x25, - 0xc0, 0x28, 0xe2, 0xbc, 0x43, 0x86, 0xea, 0x4f, 0xe7, 0xe0, 0x52, 0x76, 0xeb, 0xc8, 0xa7, 0x60, - 0x80, 0xed, 0xcc, 0xcb, 0xda, 0x92, 0xf8, 0x74, 0x9e, 0x68, 0xd7, 0x6e, 0xd1, 0x86, 0xee, 0xc8, - 0xc6, 0xbe, 0x4f, 0x46, 0xde, 0x86, 0xe1, 0xaa, 0xeb, 0x76, 0xa9, 0x53, 0x7f, 0xf9, 0xae, 0x56, - 0x15, 0x7b, 0x42, 0xdc, 0x73, 0x98, 0x08, 0x6e, 0xb8, 0x2f, 0xc7, 0xa2, 0x73, 0xc9, 0xf4, 0xea, - 0x4f, 0xe4, 0xe0, 0x72, 0xaf, 0xaf, 0x22, 0x2f, 0xc3, 0xe0, 0x0a, 0xb5, 0x74, 0xcb, 0xab, 0x56, - 0x44, 0x93, 0x70, 0x8b, 0xe5, 0x21, 0x2c, 0xba, 0x53, 0x08, 0x08, 0x59, 0x21, 0x7e, 0xae, 0x18, - 0x38, 0x32, 0xf0, 0x33, 0x50, 0x84, 0xc5, 0x0a, 0xf9, 0x84, 0xea, 0x1f, 0xe6, 0x61, 0xa4, 0xd6, - 0xea, 0xae, 0x9b, 0xd2, 0xc2, 0x71, 0x60, 0x7b, 0xdb, 0xb7, 0x7e, 0xf3, 0xfb, 0xb3, 0x7e, 0xd9, - 0x70, 0x73, 0x0e, 0x38, 0xdc, 0xfc, 0x72, 0xe4, 0x2d, 0x28, 0x75, 0xf0, 0x3b, 0xe2, 0x27, 0xb1, - 0xfc, 0xeb, 0xb2, 0x4e, 0x62, 0x79, 0x19, 0x36, 0xbe, 0x9a, 0x87, 0x18, 0x5f, 0x61, 0x59, 0x49, - 0xa0, 0xe1, 0x22, 0x71, 0x2a, 0xd0, 0x23, 0x11, 0x68, 0xb8, 0x20, 0x9c, 0x0a, 0xf4, 0x10, 0x02, - 0xfd, 0xf5, 0x3c, 0x8c, 0x45, 0xab, 0x24, 0x9f, 0x82, 0x61, 0x5e, 0x0d, 0x3f, 0x17, 0xca, 0x49, - 0x4e, 0xc5, 0x21, 0x58, 0x03, 0xfe, 0x43, 0x1c, 0x70, 0x9d, 0xd9, 0xd0, 0xdd, 0x46, 0x78, 0x42, - 0xc3, 0xef, 0x6f, 0x07, 0xb9, 0x27, 0x54, 0x0c, 0xa5, 0x8d, 0x6d, 0xe8, 0xee, 0x4c, 0xf8, 0x9b, - 0xcc, 0x02, 0x71, 0x68, 0xd7, 0xa5, 0x51, 0x06, 0x45, 0x64, 0x20, 0xb2, 0x9c, 0xc7, 0xb1, 0xda, - 0x04, 0x87, 0xc9, 0x6c, 0xbe, 0x10, 0x34, 0x1b, 0x95, 0xa1, 0x7f, 0x0f, 0x29, 0xd8, 0x25, 0xfa, - 0xf4, 0x63, 0x4e, 0x4e, 0x50, 0xd1, 0x3d, 0x9d, 0x6f, 0xca, 0xfd, 0x0e, 0x50, 0x7f, 0xb4, 0x03, - 0xfd, 0xcb, 0x16, 0x5d, 0x5e, 0x23, 0x2f, 0xc1, 0x10, 0x53, 0x98, 0x05, 0x9b, 0xf5, 0x65, 0x4e, - 0xf8, 0x4f, 0x48, 0x9a, 0x84, 0x88, 0xf9, 0x3e, 0x2d, 0xa4, 0x22, 0x37, 0x01, 0xc2, 0x27, 0x66, - 0x42, 0xfb, 0x88, 0x5c, 0x86, 0x63, 0xe6, 0xfb, 0x34, 0x89, 0xce, 0x2f, 0x25, 0x1e, 0xe8, 0x14, - 0x92, 0xa5, 0x38, 0xc6, 0x2f, 0x25, 0xc6, 0xc7, 0x02, 0x10, 0xf6, 0xab, 0xa6, 0xbb, 0xee, 0xa6, - 0xed, 0x18, 0x33, 0x1b, 0xba, 0xb5, 0x4e, 0xe3, 0xbb, 0xa7, 0x24, 0xc5, 0x7c, 0x9f, 0x96, 0x52, - 0x8e, 0xbc, 0x01, 0x23, 0xb2, 0x43, 0x69, 0xdc, 0xe9, 0x43, 0xc6, 0xcd, 0xf7, 0x69, 0x11, 0x5a, - 0xf2, 0x1a, 0x0c, 0x8b, 0xdf, 0xb7, 0x6d, 0x71, 0xa3, 0x2c, 0xc5, 0x22, 0x92, 0x50, 0xf3, 0x7d, - 0x9a, 0x4c, 0x29, 0x55, 0x5a, 0x73, 0x4c, 0xcb, 0x13, 0x6f, 0x94, 0xe3, 0x95, 0x22, 0x4e, 0xaa, - 0x14, 0x7f, 0x93, 0xb7, 0x61, 0x34, 0x08, 0xf2, 0xf4, 0x3e, 0x6d, 0x7a, 0xe2, 0xf0, 0xfb, 0x7c, - 0xac, 0x30, 0x47, 0xce, 0xf7, 0x69, 0x51, 0x6a, 0x72, 0x15, 0x4a, 0x1a, 0x75, 0xcd, 0x0f, 0xfc, - 0xeb, 0xe2, 0x31, 0x69, 0x9c, 0x9b, 0x1f, 0x30, 0x29, 0x09, 0x3c, 0xeb, 0x9d, 0xf0, 0x7e, 0x5a, - 0x1c, 0x55, 0x93, 0x58, 0x2d, 0xb3, 0x96, 0xc1, 0x7a, 0x47, 0x72, 0x4e, 0xf8, 0x6c, 0x18, 0xfa, - 0x4a, 0x64, 0x7e, 0x1d, 0x8e, 0xc7, 0x18, 0x90, 0xb1, 0xf3, 0x7d, 0x5a, 0x8c, 0x5e, 0x92, 0x6a, - 0xc5, 0x74, 0x1f, 0x88, 0x90, 0xa5, 0x71, 0xa9, 0x32, 0x94, 0x24, 0x55, 0xf6, 0x53, 0xaa, 0x7a, - 0x89, 0x7a, 0x9b, 0xb6, 0xf3, 0x40, 0x04, 0x28, 0x8d, 0x57, 0x2d, 0xb0, 0x52, 0xd5, 0x02, 0x22, - 0x57, 0xcd, 0x06, 0xdc, 0x58, 0x7a, 0xd5, 0xba, 0xa7, 0xcb, 0x55, 0xf3, 0x93, 0x38, 0xbf, 0x93, - 0x16, 0xa8, 0xfe, 0x90, 0x27, 0xe0, 0x4f, 0x76, 0x28, 0xe2, 0xa4, 0x0e, 0xc5, 0xdf, 0xac, 0x52, - 0x29, 0xc9, 0xba, 0xc8, 0xb0, 0x1f, 0x54, 0x2a, 0xa1, 0x58, 0xa5, 0x72, 0x3a, 0xf6, 0x9b, 0x72, - 0xee, 0x71, 0x65, 0x22, 0xda, 0x41, 0x21, 0x86, 0x75, 0x90, 0x94, 0xa3, 0x7c, 0x12, 0xf3, 0x1a, - 0x2b, 0x04, 0xc9, 0x87, 0x83, 0x16, 0xce, 0xd4, 0xe6, 0xfb, 0x34, 0xcc, 0x78, 0xac, 0xf2, 0x8c, - 0xd9, 0xca, 0x59, 0xa4, 0x18, 0xf1, 0x29, 0x18, 0x6c, 0xbe, 0x4f, 0xe3, 0xd9, 0xb4, 0x5f, 0x92, - 0xb2, 0x0a, 0x2a, 0xe7, 0xa2, 0x53, 0x44, 0x80, 0x60, 0x53, 0x44, 0x98, 0x7b, 0x70, 0x2e, 0x99, - 0x3b, 0x4f, 0x39, 0x1f, 0x5d, 0x6a, 0xe2, 0xf8, 0xf9, 0x3e, 0x2d, 0x99, 0x6f, 0xef, 0xb5, 0x48, - 0x3a, 0x39, 0xe5, 0x42, 0x2c, 0x00, 0x58, 0x88, 0x62, 0xe2, 0x92, 0x13, 0xcf, 0x2d, 0xc7, 0xd2, - 0xef, 0x8b, 0xc9, 0xea, 0x62, 0x74, 0xe3, 0x92, 0x42, 0x32, 0xdf, 0xa7, 0xa5, 0x95, 0x24, 0x33, - 0x89, 0xa4, 0x6e, 0x8a, 0x12, 0xf5, 0x8d, 0x89, 0xa1, 0xe7, 0xfb, 0xb4, 0x44, 0x1a, 0xb8, 0x9b, - 0x72, 0x36, 0x35, 0xe5, 0x89, 0x68, 0x27, 0x86, 0x18, 0xd6, 0x89, 0x52, 0xd6, 0xb5, 0x9b, 0x72, - 0x86, 0x2d, 0xe5, 0x52, 0xb2, 0x54, 0x38, 0x73, 0x4a, 0x99, 0xb8, 0xb4, 0xf4, 0xa4, 0x41, 0xca, - 0x93, 0x22, 0x75, 0xb0, 0x28, 0x9f, 0x46, 0x33, 0xdf, 0xa7, 0xa5, 0x27, 0x1c, 0xd2, 0xd2, 0xb3, - 0xed, 0x28, 0x97, 0x7b, 0xf1, 0x0c, 0x5a, 0x97, 0x9e, 0xa9, 0x47, 0xef, 0x91, 0xfb, 0x44, 0x79, - 0x2a, 0x1a, 0xc2, 0x38, 0x93, 0x70, 0xbe, 0x4f, 0xeb, 0x91, 0x41, 0xe5, 0x6e, 0x46, 0x22, 0x12, - 0xe5, 0xe9, 0x68, 0xe6, 0xf0, 0x54, 0xa2, 0xf9, 0x3e, 0x2d, 0x23, 0x8d, 0xc9, 0xdd, 0x8c, 0x3c, - 0x15, 0xca, 0x64, 0x4f, 0xb6, 0x81, 0x3c, 0x32, 0xb2, 0x5c, 0x2c, 0xa7, 0xa6, 0x78, 0x50, 0x9e, - 0x89, 0xaa, 0x6e, 0x0a, 0x09, 0x53, 0xdd, 0xb4, 0xe4, 0x10, 0xcb, 0xa9, 0x39, 0x09, 0x94, 0x67, - 0x7b, 0x30, 0x0c, 0xda, 0x98, 0x9a, 0xcd, 0x60, 0x39, 0x35, 0x29, 0x80, 0xa2, 0x46, 0x19, 0xa6, - 0x90, 0x30, 0x86, 0x69, 0xe9, 0x04, 0x96, 0x53, 0x63, 0xc7, 0x2b, 0xcf, 0xf5, 0x60, 0x18, 0xb6, - 0x30, 0x2d, 0xea, 0xfc, 0x6b, 0x91, 0xe0, 0xed, 0xca, 0xc7, 0xa2, 0xf3, 0x86, 0x84, 0x62, 0xf3, - 0x86, 0x1c, 0xe6, 0x7d, 0x26, 0x11, 0x59, 0x56, 0xf9, 0x78, 0x74, 0x98, 0xc7, 0xd0, 0x6c, 0x98, - 0xc7, 0x63, 0xd1, 0xce, 0x24, 0x22, 0x6c, 0x2a, 0x57, 0xb2, 0x98, 0x20, 0x3a, 0xca, 0x84, 0xc7, - 0xe4, 0xac, 0xa6, 0x84, 0x78, 0x54, 0x3e, 0x11, 0xf5, 0xeb, 0x4e, 0x10, 0xcc, 0xf7, 0x69, 0x29, - 0x81, 0x21, 0xb5, 0xf4, 0x78, 0x46, 0xca, 0xd5, 0xe8, 0xb0, 0x4d, 0xa3, 0x61, 0xc3, 0x36, 0x35, - 0x16, 0xd2, 0x42, 0xda, 0xe3, 0x13, 0xe5, 0x5a, 0xd4, 0x30, 0x4b, 0x52, 0x30, 0xc3, 0x2c, 0xe5, - 0xd1, 0x8a, 0x96, 0x1e, 0x63, 0x47, 0x79, 0xbe, 0x67, 0x0b, 0x91, 0x26, 0xa5, 0x85, 0x3c, 0xe4, - 0x4c, 0x68, 0x3b, 0xdd, 0xed, 0xb4, 0x6c, 0xdd, 0x50, 0x3e, 0x99, 0x6a, 0x3b, 0x71, 0xa4, 0x64, - 0x3b, 0x71, 0x00, 0x5b, 0xe5, 0xe5, 0x37, 0x0e, 0xca, 0x0b, 0xd1, 0x55, 0x5e, 0xc6, 0xb1, 0x55, - 0x3e, 0xf2, 0x1e, 0x62, 0x26, 0xf1, 0x1e, 0x40, 0x79, 0x31, 0xaa, 0x00, 0x31, 0x34, 0x53, 0x80, - 0xf8, 0x0b, 0x82, 0x2f, 0x66, 0x7b, 0xd0, 0x2b, 0x53, 0xc8, 0xed, 0x19, 0x9f, 0x5b, 0x16, 0xdd, - 0x7c, 0x9f, 0x96, 0xed, 0x85, 0x5f, 0x4d, 0x71, 0x88, 0x57, 0xae, 0x47, 0x15, 0x2c, 0x41, 0xc0, - 0x14, 0x2c, 0xe9, 0x46, 0x5f, 0x4d, 0xf1, 0x68, 0x57, 0x3e, 0x95, 0xc9, 0x2a, 0xf8, 0xe6, 0x14, - 0x3f, 0xf8, 0x9b, 0xb2, 0x4b, 0xba, 0xf2, 0x52, 0x74, 0xb1, 0x0b, 0x31, 0x6c, 0xb1, 0x93, 0x5c, - 0xd7, 0x6f, 0xca, 0xce, 0xd8, 0xca, 0x8d, 0x64, 0xa9, 0x70, 0x89, 0x94, 0x9c, 0xb6, 0xb5, 0x74, - 0x1f, 0x66, 0xe5, 0xe5, 0xa8, 0xd6, 0xa5, 0xd1, 0x30, 0xad, 0x4b, 0xf5, 0x7f, 0x9e, 0x4b, 0xba, - 0x22, 0x2b, 0x37, 0xe3, 0x9b, 0xec, 0x28, 0x9e, 0x59, 0x3e, 0x09, 0xf7, 0xe5, 0xcf, 0xc6, 0x83, - 0xed, 0x29, 0xaf, 0xc4, 0xae, 0x7d, 0x23, 0x58, 0x66, 0xdf, 0xc6, 0x82, 0xf3, 0x7d, 0x36, 0x1e, - 0x9f, 0x4e, 0x79, 0x35, 0x9d, 0x43, 0xa0, 0x2b, 0xf1, 0x78, 0x76, 0x9f, 0x8d, 0x87, 0x74, 0x53, - 0x5e, 0x4b, 0xe7, 0x10, 0x48, 0x37, 0x1e, 0x02, 0xee, 0x25, 0x29, 0xc8, 0xbc, 0xf2, 0xe9, 0xa8, - 0xe9, 0x18, 0x20, 0x98, 0xe9, 0x18, 0x86, 0xa2, 0x7f, 0x49, 0x0a, 0xce, 0xae, 0xbc, 0x9e, 0x28, - 0x12, 0x34, 0x56, 0x0a, 0xe1, 0xfe, 0x92, 0x14, 0xd4, 0x5c, 0x79, 0x23, 0x51, 0x24, 0x68, 0x9d, - 0x14, 0xfa, 0xdc, 0xe8, 0xf5, 0x7e, 0x55, 0x79, 0x33, 0x7a, 0x18, 0x9c, 0x4d, 0x39, 0xdf, 0xa7, - 0xf5, 0x7a, 0x07, 0xfb, 0xc5, 0x6c, 0xc7, 0x6e, 0xe5, 0xad, 0xe8, 0x10, 0xce, 0xa2, 0x63, 0x43, - 0x38, 0xd3, 0x39, 0xfc, 0xed, 0x58, 0x2c, 0x0b, 0xe5, 0xed, 0xe8, 0x14, 0x17, 0x41, 0xb2, 0x29, - 0x2e, 0x1e, 0xf9, 0x22, 0x12, 0xa4, 0x41, 0xf9, 0x4c, 0x74, 0x8a, 0x93, 0x71, 0x6c, 0x8a, 0x8b, - 0x04, 0x74, 0x98, 0x49, 0xc4, 0x0e, 0x50, 0xde, 0x89, 0x4e, 0x71, 0x31, 0x34, 0x9b, 0xe2, 0xe2, - 0xd1, 0x06, 0xde, 0x8e, 0x3d, 0xa1, 0x57, 0x3e, 0x9b, 0xde, 0x7e, 0x44, 0xca, 0xed, 0xe7, 0x0f, - 0xee, 0xb5, 0xf4, 0xb7, 0xe0, 0x4a, 0x39, 0x3a, 0x7e, 0xd3, 0x68, 0xd8, 0xf8, 0x4d, 0x7d, 0x47, - 0x1e, 0xdf, 0x38, 0x08, 0xad, 0x9a, 0xee, 0xb1, 0x71, 0x08, 0x4d, 0x91, 0x14, 0x70, 0x64, 0x8f, - 0xcc, 0x37, 0x42, 0x33, 0x19, 0x7b, 0x64, 0x7f, 0x1b, 0x14, 0xa3, 0x67, 0xb3, 0x6b, 0xc2, 0xcf, - 0x58, 0xa9, 0x44, 0x67, 0xd7, 0x04, 0x01, 0x9b, 0x5d, 0x93, 0xde, 0xc9, 0x73, 0x30, 0x2e, 0xb4, - 0x88, 0xbb, 0x4f, 0x9b, 0xd6, 0xba, 0x32, 0x1b, 0x7b, 0x6f, 0x19, 0xc3, 0xb3, 0xd9, 0x29, 0x0e, - 0xc3, 0xf5, 0x9a, 0xc3, 0x66, 0x5a, 0x66, 0x67, 0xd5, 0xd6, 0x1d, 0xa3, 0x4e, 0x2d, 0x43, 0x99, - 0x8b, 0xad, 0xd7, 0x29, 0x34, 0xb8, 0x5e, 0xa7, 0xc0, 0x31, 0x44, 0x5c, 0x0c, 0xae, 0xd1, 0x26, - 0x35, 0x1f, 0x52, 0xe5, 0x16, 0xb2, 0x9d, 0xcc, 0x62, 0x2b, 0xc8, 0xe6, 0xfb, 0xb4, 0x2c, 0x0e, - 0xcc, 0x56, 0x5f, 0xdc, 0xaa, 0xbf, 0xbb, 0x10, 0x84, 0x1f, 0xa8, 0x39, 0xb4, 0xa3, 0x3b, 0x54, - 0x99, 0x8f, 0xda, 0xea, 0xa9, 0x44, 0xcc, 0x56, 0x4f, 0x45, 0x24, 0xd9, 0xfa, 0x63, 0xa1, 0xda, - 0x8b, 0x6d, 0x38, 0x22, 0xd2, 0x4b, 0xb3, 0xd9, 0x29, 0x8a, 0x60, 0x02, 0x5a, 0xb0, 0xad, 0x75, - 0x3c, 0xa9, 0xb8, 0x1d, 0x9d, 0x9d, 0xb2, 0x29, 0xd9, 0xec, 0x94, 0x8d, 0x65, 0xaa, 0x1e, 0xc5, - 0xf2, 0x31, 0x78, 0x27, 0xaa, 0xea, 0x29, 0x24, 0x4c, 0xd5, 0x53, 0xc0, 0x49, 0x86, 0x1a, 0x75, - 0xa9, 0xa7, 0x2c, 0xf4, 0x62, 0x88, 0x24, 0x49, 0x86, 0x08, 0x4e, 0x32, 0x9c, 0xa3, 0x5e, 0x73, - 0x43, 0x59, 0xec, 0xc5, 0x10, 0x49, 0x92, 0x0c, 0x11, 0xcc, 0x36, 0x9b, 0x51, 0xf0, 0x74, 0xb7, - 0xf5, 0xc0, 0xef, 0xb3, 0xa5, 0xe8, 0x66, 0x33, 0x93, 0x90, 0x6d, 0x36, 0x33, 0x91, 0xe4, 0x27, - 0xf6, 0xec, 0x07, 0xaf, 0x2c, 0x63, 0x85, 0x53, 0xa1, 0x5d, 0xb0, 0x97, 0x52, 0xf3, 0x7d, 0xda, - 0x5e, 0xfd, 0xec, 0x3f, 0x19, 0x38, 0x8d, 0x2a, 0x35, 0xac, 0xea, 0x4c, 0x70, 0x56, 0xc1, 0xc1, - 0xf3, 0x7d, 0x5a, 0xe0, 0x56, 0xfa, 0x1a, 0x0c, 0xe3, 0x47, 0x55, 0x2d, 0xd3, 0xab, 0x4c, 0x2b, - 0xef, 0x46, 0xb7, 0x4c, 0x12, 0x8a, 0x6d, 0x99, 0xa4, 0x9f, 0x6c, 0x12, 0xc7, 0x9f, 0x7c, 0x8a, - 0xa9, 0x4c, 0x2b, 0x5a, 0x74, 0x12, 0x8f, 0x20, 0xd9, 0x24, 0x1e, 0x01, 0x04, 0xf5, 0x56, 0x1c, - 0xbb, 0x53, 0x99, 0x56, 0xea, 0x29, 0xf5, 0x72, 0x54, 0x50, 0x2f, 0xff, 0x19, 0xd4, 0x5b, 0xdf, - 0xe8, 0x7a, 0x15, 0xf6, 0x8d, 0x2b, 0x29, 0xf5, 0xfa, 0xc8, 0xa0, 0x5e, 0x1f, 0xc0, 0xa6, 0x42, - 0x04, 0xd4, 0x1c, 0x9b, 0x4d, 0xda, 0x77, 0xcc, 0x56, 0x4b, 0xb9, 0x1b, 0x9d, 0x0a, 0xe3, 0x78, - 0x36, 0x15, 0xc6, 0x61, 0xcc, 0xf4, 0xe4, 0xad, 0xa2, 0xab, 0xdd, 0x75, 0xe5, 0x5e, 0xd4, 0xf4, - 0x0c, 0x31, 0xcc, 0xf4, 0x0c, 0x7f, 0xe1, 0xee, 0x82, 0xfd, 0xd2, 0xe8, 0x9a, 0x43, 0xdd, 0x0d, - 0xe5, 0x7e, 0x6c, 0x77, 0x21, 0xe1, 0x70, 0x77, 0x21, 0xfd, 0x26, 0xeb, 0xf0, 0x64, 0x64, 0xa1, - 0xf1, 0x2f, 0x6d, 0xea, 0x54, 0x77, 0x9a, 0x1b, 0xca, 0xe7, 0x90, 0xd5, 0x73, 0xa9, 0x4b, 0x55, - 0x94, 0x74, 0xbe, 0x4f, 0xeb, 0xc5, 0x09, 0xb7, 0xe5, 0xef, 0x2e, 0xf0, 0x48, 0xb0, 0x5a, 0x6d, - 0xc6, 0xdf, 0x84, 0xbe, 0x17, 0xdb, 0x96, 0x27, 0x49, 0x70, 0x5b, 0x9e, 0x04, 0x93, 0x0e, 0x3c, - 0x1d, 0xdb, 0xaa, 0x2d, 0xea, 0x2d, 0xb6, 0x2f, 0xa1, 0x46, 0x4d, 0x6f, 0x3e, 0xa0, 0x9e, 0xf2, - 0x79, 0xe4, 0x7d, 0x25, 0x63, 0xc3, 0x17, 0xa3, 0x9e, 0xef, 0xd3, 0x76, 0xe1, 0x47, 0x54, 0x28, - 0xd6, 0xe7, 0x56, 0x6a, 0xca, 0x0f, 0x44, 0xcf, 0x37, 0x19, 0x6c, 0xbe, 0x4f, 0x43, 0x1c, 0xb3, - 0xd2, 0xee, 0x76, 0xd6, 0x1d, 0xdd, 0xa0, 0xdc, 0xd0, 0x42, 0xdb, 0x4d, 0x18, 0xa0, 0x3f, 0x18, - 0xb5, 0xd2, 0xb2, 0xe8, 0x98, 0x95, 0x96, 0x85, 0x63, 0x8a, 0x1a, 0x49, 0x7a, 0xa2, 0x7c, 0x21, - 0xaa, 0xa8, 0x11, 0x24, 0x53, 0xd4, 0x68, 0x8a, 0x94, 0xcf, 0xc1, 0x85, 0x60, 0x3f, 0x2f, 0xd6, - 0x5f, 0xde, 0x69, 0xca, 0x17, 0x91, 0xcf, 0xd3, 0x89, 0xcb, 0x80, 0x08, 0xd5, 0x7c, 0x9f, 0x96, - 0x51, 0x9e, 0xad, 0xb8, 0x89, 0xa4, 0x60, 0xc2, 0xbc, 0xf8, 0xa1, 0xe8, 0x8a, 0x9b, 0x41, 0xc6, - 0x56, 0xdc, 0x0c, 0x54, 0x2a, 0x73, 0x21, 0x54, 0x7d, 0x17, 0xe6, 0x81, 0x4c, 0xb3, 0x38, 0xa4, - 0x32, 0x17, 0x96, 0xda, 0xea, 0x2e, 0xcc, 0x03, 0x6b, 0x2d, 0x8b, 0x03, 0xb9, 0x0a, 0xa5, 0x7a, - 0x7d, 0x51, 0xeb, 0x5a, 0x4a, 0x33, 0xe6, 0x2d, 0x8b, 0xd0, 0xf9, 0x3e, 0x4d, 0xe0, 0x99, 0x19, - 0x34, 0xdb, 0xd2, 0x5d, 0xcf, 0x6c, 0xba, 0x38, 0x62, 0xfc, 0x11, 0x62, 0x44, 0xcd, 0xa0, 0x34, - 0x1a, 0x66, 0x06, 0xa5, 0xc1, 0x99, 0xbd, 0x38, 0xa3, 0xbb, 0xae, 0x6e, 0x19, 0x8e, 0x3e, 0x8d, - 0xcb, 0x04, 0x8d, 0xbd, 0xc6, 0x8a, 0x60, 0x99, 0xbd, 0x18, 0x85, 0xe0, 0xe1, 0xbb, 0x0f, 0xf1, - 0xcd, 0x9c, 0xb5, 0xd8, 0xe1, 0x7b, 0x0c, 0x8f, 0x87, 0xef, 0x31, 0x18, 0xda, 0x9d, 0x3e, 0x4c, - 0xa3, 0xeb, 0x26, 0x13, 0x91, 0xb2, 0x1e, 0xb3, 0x3b, 0xe3, 0x04, 0x68, 0x77, 0xc6, 0x81, 0x91, - 0x26, 0xf9, 0xcb, 0xed, 0x46, 0x46, 0x93, 0xc2, 0x55, 0x36, 0x51, 0x86, 0xad, 0xdf, 0xe1, 0xe0, - 0xa8, 0x6c, 0x59, 0x7a, 0xdb, 0xae, 0x4c, 0xfb, 0x52, 0x37, 0xa3, 0xeb, 0x77, 0x26, 0x21, 0x5b, - 0xbf, 0x33, 0x91, 0x6c, 0x76, 0xf5, 0x37, 0x5a, 0x1b, 0xba, 0x43, 0x8d, 0x8a, 0xe9, 0xe0, 0xc9, - 0xe2, 0x16, 0xdf, 0x1a, 0xbe, 0x1f, 0x9d, 0x5d, 0x7b, 0x90, 0xb2, 0xd9, 0xb5, 0x07, 0x9a, 0x19, - 0x79, 0xe9, 0x68, 0x8d, 0xea, 0x86, 0xf2, 0x20, 0x6a, 0xe4, 0x65, 0x53, 0x32, 0x23, 0x2f, 0x1b, - 0x9b, 0xfd, 0x39, 0xf7, 0x1d, 0xd3, 0xa3, 0x4a, 0x6b, 0x2f, 0x9f, 0x83, 0xa4, 0xd9, 0x9f, 0x83, - 0x68, 0xb6, 0x21, 0x8c, 0x77, 0x48, 0x3b, 0xba, 0x21, 0x4c, 0x76, 0x43, 0xbc, 0x04, 0xb3, 0x58, - 0xc4, 0xa3, 0x3c, 0xc5, 0x8a, 0x5a, 0x2c, 0x02, 0xcc, 0x2c, 0x96, 0xf0, 0xd9, 0x5e, 0xe4, 0x29, - 0x96, 0x62, 0x47, 0xd7, 0x50, 0x19, 0xc7, 0xd6, 0xd0, 0xc8, 0xb3, 0xad, 0xd7, 0x22, 0xef, 0x0c, - 0x94, 0x4e, 0xd4, 0xea, 0x90, 0x50, 0xcc, 0xea, 0x90, 0x5f, 0x24, 0xcc, 0xc0, 0x19, 0xbc, 0x05, - 0xd7, 0xba, 0xc1, 0x3d, 0xce, 0x0f, 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, 0xfb, 0x70, 0x59, 0x40, 0xc5, 0x8b, 0xeb, 0x9a, 0x63, 0x3f, 0x34, 0x8d, 0x60, 0x41, 0xf0, - 0xa2, 0x7e, 0x6c, 0xbd, 0x68, 0xe7, 0xfb, 0xb4, 0x9e, 0xbc, 0xb2, 0xeb, 0x12, 0xeb, 0x43, 0x77, - 0x2f, 0x75, 0x05, 0x8b, 0x44, 0x4f, 0x5e, 0xd9, 0x75, 0x09, 0xb9, 0x3f, 0xdc, 0x4b, 0x5d, 0x41, - 0x27, 0xf4, 0xe4, 0x45, 0x5c, 0x98, 0xec, 0x85, 0x2f, 0xb7, 0x5a, 0xca, 0x26, 0x56, 0xf7, 0x89, - 0xbd, 0x54, 0x57, 0x46, 0x83, 0x73, 0x37, 0x8e, 0x6c, 0x96, 0x5e, 0xee, 0x50, 0xab, 0x1e, 0x59, - 0x80, 0x1e, 0x45, 0x67, 0xe9, 0x04, 0x01, 0x9b, 0xa5, 0x13, 0x40, 0x36, 0xa0, 0xe4, 0xe7, 0x2a, - 0xca, 0x56, 0x74, 0x40, 0xc9, 0x38, 0x36, 0xa0, 0x22, 0x4f, 0x5b, 0x96, 0xe1, 0xec, 0xf2, 0x03, - 0x4f, 0xf7, 0x2d, 0x48, 0x57, 0x74, 0xe5, 0x07, 0xb1, 0x4b, 0xa6, 0x24, 0x09, 0x5e, 0x32, 0x25, - 0xc1, 0x6c, 0x8c, 0x30, 0x70, 0x7d, 0xcb, 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, - 0xdd, 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, 0x2d, 0x99, 0x8f, 0x18, 0x29, 0x3f, 0x92, 0xcb, 0x62, - 0x14, 0x0c, 0x8f, 0x44, 0xa1, 0x28, 0x23, 0x8d, 0x3e, 0x34, 0xe9, 0xa6, 0xf2, 0xa5, 0x4c, 0x46, - 0x9c, 0x20, 0xca, 0x88, 0xc3, 0xc8, 0x7b, 0x70, 0x21, 0x84, 0x2d, 0xd2, 0xf6, 0x6a, 0x30, 0x33, - 0xfd, 0x68, 0x2e, 0x6a, 0x06, 0xa7, 0x93, 0x31, 0x33, 0x38, 0x1d, 0x93, 0xc6, 0x5a, 0x88, 0xee, - 0xdf, 0xde, 0x85, 0x75, 0x20, 0xc1, 0x0c, 0x06, 0x69, 0xac, 0x85, 0x34, 0x7f, 0x6c, 0x17, 0xd6, - 0x81, 0x4c, 0x33, 0x18, 0x90, 0x9f, 0xcc, 0xc1, 0x95, 0x74, 0x54, 0xb9, 0xd5, 0x9a, 0xb3, 0x9d, - 0x10, 0xa7, 0xfc, 0xa9, 0x5c, 0xf4, 0xa0, 0x61, 0x6f, 0xc5, 0xe6, 0xfb, 0xb4, 0x3d, 0x56, 0x40, - 0x3e, 0x03, 0xa3, 0xe5, 0xae, 0x61, 0x7a, 0x78, 0xf1, 0xc6, 0x0c, 0xe7, 0x1f, 0xcf, 0xc5, 0xb6, - 0x38, 0x32, 0x16, 0xb7, 0x38, 0x32, 0x80, 0xdc, 0x86, 0x89, 0x3a, 0x6d, 0x76, 0x1d, 0xd3, 0xdb, - 0xd2, 0x68, 0xc7, 0x76, 0x3c, 0xc6, 0xe3, 0x4f, 0xe7, 0xa2, 0x93, 0x58, 0x82, 0x82, 0x4d, 0x62, - 0x09, 0x20, 0xb9, 0x97, 0xb8, 0x95, 0x17, 0x9d, 0xf9, 0x13, 0xb9, 0x9e, 0xd7, 0xf2, 0x41, 0x5f, - 0xa6, 0x17, 0x27, 0xb5, 0xd8, 0x2d, 0xba, 0xe0, 0xfa, 0x93, 0xb9, 0x1e, 0xd7, 0xe8, 0xd2, 0x0c, - 0x97, 0x04, 0x33, 0x8e, 0x29, 0x69, 0xe4, 0x95, 0x3f, 0x93, 0xeb, 0x71, 0xed, 0x1d, 0x72, 0x4c, - 0xcb, 0x40, 0xff, 0x0a, 0xf7, 0x14, 0x11, 0x8c, 0x7e, 0x2a, 0x97, 0x74, 0x15, 0x09, 0xca, 0x4b, - 0x84, 0xac, 0xd8, 0x5d, 0x37, 0x50, 0xfa, 0x2f, 0xe7, 0x92, 0xbe, 0x79, 0x61, 0xb1, 0xf0, 0x17, - 0xa1, 0x70, 0x69, 0xf6, 0x91, 0x47, 0x1d, 0x4b, 0x6f, 0x61, 0x77, 0xd6, 0x3d, 0xdb, 0xd1, 0xd7, - 0xe9, 0xac, 0xa5, 0xaf, 0xb6, 0xa8, 0xf2, 0xd3, 0xb9, 0xa8, 0x05, 0x9b, 0x4d, 0xca, 0x2c, 0xd8, - 0x6c, 0x2c, 0xd9, 0x80, 0x27, 0xd3, 0xb0, 0x15, 0xd3, 0xc5, 0x7a, 0xbe, 0x92, 0x8b, 0x9a, 0xb0, - 0x3d, 0x68, 0x99, 0x09, 0xdb, 0x03, 0x4d, 0x6e, 0xc0, 0xd0, 0xb4, 0xed, 0x4f, 0xbf, 0x7f, 0x36, - 0xe6, 0x0c, 0x19, 0x60, 0xe6, 0xfb, 0xb4, 0x90, 0x4c, 0x94, 0x11, 0x83, 0xfa, 0xab, 0xc9, 0x32, - 0xe1, 0xe5, 0x53, 0xf0, 0x43, 0x94, 0x11, 0xe2, 0xfe, 0x77, 0x92, 0x65, 0xc2, 0x3b, 0xae, 0xe0, - 0x07, 0x9b, 0x49, 0x78, 0x8d, 0x8b, 0x73, 0x65, 0x66, 0xb7, 0xcd, 0x6c, 0xe8, 0xad, 0x16, 0xb5, - 0xd6, 0xa9, 0xf2, 0xb5, 0xd8, 0x4c, 0x92, 0x4e, 0xc6, 0x66, 0x92, 0x74, 0x0c, 0xf9, 0x41, 0xb8, - 0x78, 0x4f, 0x6f, 0x99, 0x46, 0x88, 0xf3, 0x93, 0x8a, 0x2b, 0x3f, 0x93, 0x8b, 0xee, 0xa6, 0x33, - 0xe8, 0xd8, 0x6e, 0x3a, 0x03, 0x45, 0x16, 0x81, 0xe0, 0x32, 0x1a, 0xcc, 0x16, 0x6c, 0x7d, 0x56, - 0xfe, 0xdd, 0x5c, 0xd4, 0x4e, 0x4d, 0x92, 0x30, 0x3b, 0x35, 0x09, 0x25, 0x8d, 0xec, 0xd4, 0x20, - 0xca, 0xcf, 0xe6, 0xa2, 0xa7, 0x35, 0x59, 0x84, 0xf3, 0x7d, 0x5a, 0x76, 0x7e, 0x91, 0x5b, 0x30, - 0x5e, 0xaf, 0x55, 0xe7, 0xe6, 0x66, 0xeb, 0xf7, 0xaa, 0x15, 0x7c, 0xe8, 0x60, 0x28, 0x3f, 0x17, - 0x5b, 0xb1, 0xe2, 0x04, 0x6c, 0xc5, 0x8a, 0xc3, 0xc8, 0x9b, 0x30, 0xc2, 0xda, 0xcf, 0x06, 0x0c, - 0x7e, 0xf2, 0xcf, 0xe7, 0xa2, 0xe6, 0x94, 0x8c, 0x64, 0xe6, 0x94, 0xfc, 0x9b, 0xd4, 0xe1, 0x1c, - 0x93, 0x62, 0xcd, 0xa1, 0x6b, 0xd4, 0xa1, 0x56, 0xd3, 0x1f, 0xd3, 0xbf, 0x90, 0x8b, 0x5a, 0x19, - 0x69, 0x44, 0xcc, 0xca, 0x48, 0x83, 0x93, 0x07, 0x70, 0x39, 0x7e, 0x12, 0x24, 0x3f, 0x3b, 0x55, - 0xfe, 0x5c, 0x2e, 0x66, 0x0c, 0xf7, 0x20, 0x46, 0x63, 0xb8, 0x07, 0x9e, 0x58, 0xf0, 0x94, 0x38, - 0x56, 0x11, 0x0e, 0x97, 0xf1, 0xda, 0xfe, 0x3c, 0xaf, 0xed, 0xe3, 0xa1, 0x43, 0x60, 0x0f, 0xea, - 0xf9, 0x3e, 0xad, 0x37, 0x3b, 0xa6, 0x67, 0xc9, 0x04, 0x18, 0xca, 0x5f, 0xc8, 0xa5, 0x7b, 0xa4, - 0x44, 0xdc, 0x94, 0xd3, 0x32, 0x67, 0xbc, 0x97, 0x95, 0xbe, 0x41, 0xf9, 0x8b, 0xb1, 0xf1, 0x96, - 0x4e, 0xc6, 0xc6, 0x5b, 0x46, 0xfe, 0x87, 0xdb, 0x30, 0xc1, 0x95, 0xba, 0xa6, 0xe3, 0x30, 0xb4, - 0xd6, 0xa9, 0xa1, 0xfc, 0x7b, 0xb1, 0xd5, 0x2e, 0x41, 0x81, 0xae, 0x3d, 0x71, 0x20, 0x9b, 0xba, - 0xeb, 0x1d, 0xdd, 0xb2, 0xf0, 0x98, 0x55, 0xf9, 0xf7, 0x63, 0x53, 0x77, 0x88, 0x42, 0xc7, 0xdd, - 0xe0, 0x17, 0xd3, 0x84, 0x5e, 0xa9, 0x8f, 0x94, 0xbf, 0x14, 0xd3, 0x84, 0x5e, 0xc4, 0x4c, 0x13, - 0x7a, 0xe6, 0x51, 0xba, 0x97, 0xf1, 0x04, 0x5c, 0xf9, 0x7a, 0x6c, 0x45, 0x4e, 0xa5, 0x62, 0x2b, - 0x72, 0xfa, 0x0b, 0xf2, 0x7b, 0x19, 0xcf, 0xa7, 0x95, 0x5f, 0xec, 0xcd, 0x37, 0x5c, 0xe9, 0xd3, - 0x5f, 0x5f, 0xdf, 0xcb, 0x78, 0x7a, 0xac, 0xfc, 0xe5, 0xde, 0x7c, 0x43, 0xc7, 0xbe, 0xf4, 0x97, - 0xcb, 0x8d, 0xec, 0x67, 0xbb, 0xca, 0x5f, 0x89, 0x4f, 0x5d, 0x19, 0x84, 0x38, 0x75, 0x65, 0xbd, - 0xfd, 0x5d, 0x85, 0x27, 0xb8, 0x86, 0xdc, 0x72, 0xf4, 0xce, 0x46, 0x9d, 0x7a, 0x9e, 0x69, 0xad, - 0xfb, 0x3b, 0xb1, 0xbf, 0x9a, 0x8b, 0x1d, 0x8f, 0x65, 0x51, 0xe2, 0xf1, 0x58, 0x16, 0x92, 0x29, - 0x6f, 0xe2, 0x81, 0xae, 0xf2, 0xd7, 0x62, 0xca, 0x9b, 0xa0, 0x60, 0xca, 0x9b, 0x7c, 0xd7, 0x7b, - 0x3b, 0xe5, 0x1d, 0xaa, 0xf2, 0x1f, 0x64, 0xf3, 0x0a, 0xda, 0x97, 0xf2, 0x7c, 0xf5, 0x76, 0xca, - 0x73, 0x4b, 0xe5, 0x3f, 0xcc, 0xe6, 0x15, 0xfa, 0x20, 0x25, 0x5f, 0x69, 0xbe, 0x07, 0x17, 0xf8, - 0x6c, 0x3e, 0x47, 0x0d, 0x1a, 0xf9, 0xd0, 0x5f, 0x8a, 0x8d, 0xfd, 0x74, 0x32, 0x3c, 0x72, 0x4f, - 0xc5, 0xa4, 0xb1, 0x16, 0x6d, 0xfd, 0xeb, 0xbb, 0xb0, 0x0e, 0x37, 0x04, 0xe9, 0x18, 0xb6, 0xde, - 0xc8, 0x8f, 0xdf, 0x94, 0x5f, 0x8e, 0xad, 0x37, 0x32, 0x12, 0xdd, 0x39, 0xe4, 0x97, 0x72, 0x6f, - 0x46, 0x1f, 0x7a, 0x29, 0x7f, 0x23, 0xb5, 0x70, 0xd0, 0x01, 0xd1, 0x57, 0x61, 0x6f, 0x46, 0x1f, - 0x35, 0x29, 0xbf, 0x92, 0x5a, 0x38, 0xf8, 0x80, 0xe8, 0x0b, 0x28, 0xb6, 0x45, 0xea, 0x7a, 0x36, - 0x67, 0x15, 0x99, 0x1e, 0xfe, 0x66, 0x7c, 0x8b, 0x94, 0x4a, 0x86, 0x5b, 0xa4, 0x54, 0x4c, 0x1a, - 0x6b, 0xf1, 0x79, 0xbf, 0xba, 0x0b, 0x6b, 0x69, 0x63, 0x97, 0x8a, 0x49, 0x63, 0x2d, 0x3e, 0xfe, - 0x1b, 0xbb, 0xb0, 0x96, 0x36, 0x76, 0xa9, 0x18, 0x66, 0x8e, 0x85, 0x98, 0x7b, 0xd4, 0x71, 0x43, - 0xf5, 0xfb, 0x8f, 0x62, 0xe6, 0x58, 0x06, 0x1d, 0x33, 0xc7, 0x32, 0x50, 0xa9, 0xdc, 0x85, 0x50, - 0x7e, 0x6d, 0x37, 0xee, 0xe1, 0xbd, 0x4c, 0x06, 0x2a, 0x95, 0xbb, 0x90, 0xcb, 0xdf, 0xda, 0x8d, - 0x7b, 0x78, 0x31, 0x93, 0x81, 0x62, 0x46, 0x51, 0xdd, 0xd3, 0x3d, 0xb3, 0x39, 0x6f, 0xbb, 0x9e, - 0xb4, 0xc8, 0xff, 0xc7, 0x31, 0xa3, 0x28, 0x8d, 0x88, 0x19, 0x45, 0x69, 0xf0, 0x24, 0x53, 0x21, - 0x8d, 0x5f, 0xef, 0xc9, 0x34, 0xb4, 0xb4, 0xd2, 0xe0, 0x49, 0xa6, 0x42, 0x08, 0xff, 0x49, 0x4f, - 0xa6, 0xa1, 0xa7, 0x7c, 0x1a, 0x9c, 0x59, 0xa6, 0x33, 0x8e, 0xbd, 0x69, 0xdd, 0xa6, 0x9b, 0xb4, - 0x25, 0x3e, 0xfd, 0x37, 0x62, 0x96, 0x69, 0x9c, 0x00, 0x6f, 0x51, 0x62, 0xb0, 0x28, 0x23, 0xf1, - 0xb9, 0xbf, 0x99, 0xc9, 0x28, 0x3c, 0x26, 0x8a, 0xc3, 0xa2, 0x8c, 0xc4, 0x27, 0xfe, 0x56, 0x26, - 0xa3, 0xf0, 0x98, 0x28, 0x0e, 0x23, 0x65, 0x18, 0xc3, 0xb7, 0x12, 0xba, 0xeb, 0x7b, 0x7e, 0xfe, - 0x6e, 0x2e, 0x7a, 0xeb, 0x15, 0x45, 0xcf, 0xf7, 0x69, 0xb1, 0x02, 0x32, 0x0b, 0xf1, 0x49, 0xdf, - 0xca, 0x60, 0x11, 0xfa, 0x3b, 0x46, 0x21, 0x32, 0x0b, 0xf1, 0x31, 0xff, 0x69, 0x06, 0x8b, 0xd0, - 0xe1, 0x31, 0x0a, 0x21, 0x9f, 0x86, 0xe1, 0xfa, 0xdc, 0x4a, 0xcd, 0x4f, 0xcf, 0xf7, 0xb7, 0x73, - 0xb1, 0x57, 0x45, 0x21, 0x0e, 0x5f, 0x15, 0x85, 0x3f, 0xa7, 0x07, 0xa0, 0x1f, 0x8f, 0x52, 0x6f, - 0x97, 0x06, 0xbf, 0x99, 0x1b, 0xff, 0xed, 0xdc, 0xed, 0xd2, 0xe0, 0x6f, 0xe7, 0xc6, 0x7f, 0x87, - 0xfd, 0xff, 0x3b, 0xb9, 0xf1, 0xdf, 0xcd, 0x69, 0x4f, 0x84, 0xc3, 0xa2, 0xbc, 0x4e, 0x2d, 0xaf, - 0xd6, 0xd2, 0xc5, 0xa0, 0x4e, 0x45, 0xf1, 0x9f, 0xa9, 0x28, 0x91, 0x0a, 0xeb, 0xeb, 0x39, 0x18, - 0xa9, 0x7b, 0x0e, 0xd5, 0xdb, 0x22, 0xb2, 0xdc, 0x25, 0x18, 0xe4, 0xce, 0xcf, 0xfe, 0x4b, 0x6d, - 0x2d, 0xf8, 0x4d, 0xae, 0xc0, 0xd8, 0x82, 0xee, 0x7a, 0xd8, 0xc4, 0xaa, 0x65, 0xd0, 0x47, 0xf8, - 0xf0, 0xaf, 0xa0, 0xc5, 0xa0, 0x64, 0x81, 0xd3, 0xf1, 0x72, 0x18, 0x4c, 0xb4, 0xb0, 0x6b, 0x40, - 0xb5, 0xc1, 0x6f, 0x6f, 0x4f, 0xf6, 0x61, 0xfc, 0xb4, 0x58, 0x59, 0xf5, 0x0f, 0x72, 0x90, 0x70, - 0xcb, 0x3e, 0x78, 0x04, 0x85, 0x65, 0x38, 0x13, 0x0b, 0x60, 0x2b, 0x5e, 0x2f, 0xee, 0x31, 0xbe, - 0x6d, 0xbc, 0x34, 0xf9, 0x44, 0xf0, 0x6a, 0xee, 0xae, 0xb6, 0x20, 0x82, 0xe5, 0x61, 0x9a, 0x87, - 0xae, 0xd3, 0xd2, 0x24, 0x94, 0x08, 0x86, 0xf4, 0xbd, 0xf1, 0x30, 0x3a, 0x27, 0xb9, 0x22, 0xc2, - 0x39, 0xe4, 0xc2, 0x10, 0x7b, 0xb1, 0xa4, 0xf2, 0x3c, 0x7c, 0xc3, 0x67, 0x60, 0xa4, 0xda, 0xee, - 0x50, 0xc7, 0xb5, 0x2d, 0xdd, 0xb3, 0x1d, 0xf1, 0x1a, 0x1e, 0xc3, 0xaf, 0x99, 0x12, 0x5c, 0x0e, - 0x09, 0x26, 0xd3, 0x93, 0x6b, 0x7e, 0xa6, 0xba, 0x02, 0xc6, 0x45, 0xc5, 0x27, 0xad, 0xf1, 0x44, - 0xe5, 0x9c, 0x82, 0x91, 0xde, 0x75, 0x75, 0x7c, 0x5f, 0x19, 0x90, 0x76, 0x19, 0x40, 0x26, 0x45, - 0x0a, 0xf2, 0x02, 0x94, 0xf0, 0x3e, 0xca, 0xc5, 0x0c, 0x94, 0x22, 0xf0, 0x5f, 0x0b, 0x21, 0x72, - 0x98, 0x35, 0x4e, 0x43, 0xee, 0xc0, 0x78, 0x78, 0xd9, 0x7e, 0xcb, 0xb1, 0xbb, 0x1d, 0x3f, 0xe7, - 0x0c, 0x26, 0x78, 0x7f, 0x10, 0xe0, 0x1a, 0xeb, 0x88, 0x94, 0x58, 0x24, 0x0a, 0x92, 0x79, 0x38, - 0x13, 0xc2, 0x98, 0x88, 0xfc, 0x5c, 0x57, 0x98, 0x67, 0x54, 0xe2, 0xc5, 0xc4, 0x19, 0xc9, 0x33, - 0x1a, 0x2b, 0x46, 0xaa, 0x30, 0xe0, 0x47, 0xfd, 0x1b, 0xdc, 0x55, 0x49, 0xcf, 0x8a, 0xa8, 0x7f, - 0x03, 0x72, 0xbc, 0x3f, 0xbf, 0x3c, 0x99, 0x83, 0x31, 0xcd, 0xee, 0x7a, 0x74, 0xc5, 0x16, 0xbb, - 0x54, 0x11, 0x5d, 0x12, 0xdb, 0xe4, 0x30, 0x4c, 0xc3, 0xb3, 0xfd, 0xfc, 0xf8, 0x72, 0x9e, 0xf6, - 0x68, 0x29, 0xb2, 0x04, 0x13, 0x09, 0xb7, 0x04, 0x39, 0x6b, 0xbd, 0xf4, 0x79, 0x49, 0x66, 0xc9, - 0xa2, 0xe4, 0xc7, 0x73, 0x50, 0x5a, 0x71, 0x74, 0xd3, 0x73, 0xc5, 0xd3, 0xcc, 0xf3, 0x53, 0x9b, - 0x8e, 0xde, 0x61, 0xfa, 0x31, 0x85, 0x81, 0x6f, 0xef, 0xe9, 0xad, 0x2e, 0x75, 0xa7, 0xef, 0xb3, - 0xaf, 0xfb, 0xef, 0xb7, 0x27, 0xdf, 0x5c, 0xc7, 0xc3, 0xcf, 0xa9, 0xa6, 0xdd, 0xbe, 0xbe, 0xee, - 0xe8, 0x0f, 0x4d, 0x0f, 0x4d, 0x4c, 0xbd, 0x75, 0xdd, 0xa3, 0x2d, 0x3c, 0x63, 0xbd, 0xae, 0x77, - 0xcc, 0xeb, 0x18, 0x60, 0xfd, 0x7a, 0xc0, 0x89, 0xd7, 0xc0, 0x54, 0xc0, 0xc3, 0xbf, 0x64, 0x15, - 0xe0, 0x38, 0xb2, 0x04, 0x20, 0x3e, 0xb5, 0xdc, 0xe9, 0x88, 0x77, 0x9e, 0xd2, 0xc9, 0xa4, 0x8f, - 0xe1, 0x8a, 0x1d, 0x08, 0x4c, 0xef, 0x48, 0x41, 0x85, 0x35, 0x89, 0x03, 0xd3, 0x82, 0x15, 0xd1, - 0x22, 0x5f, 0x4c, 0xa3, 0xa1, 0xc4, 0xfd, 0xc6, 0xa6, 0x08, 0x29, 0x5e, 0x8c, 0xac, 0xc2, 0x19, - 0xc1, 0x37, 0x48, 0x41, 0x32, 0x16, 0x9d, 0x15, 0x62, 0x68, 0xae, 0xb4, 0x41, 0x1b, 0x0d, 0x01, - 0x96, 0xeb, 0x88, 0x95, 0x20, 0xd3, 0x61, 0xca, 0xe4, 0x25, 0xbd, 0x4d, 0x5d, 0xe5, 0x0c, 0x6a, - 0xec, 0xe5, 0x9d, 0xed, 0x49, 0xc5, 0x2f, 0x8f, 0x01, 0x30, 0x65, 0xd1, 0x45, 0x8b, 0xc8, 0x3c, - 0xb8, 0xd6, 0x8f, 0xa7, 0xf0, 0x88, 0xeb, 0x7c, 0xb4, 0x08, 0x99, 0x81, 0xd1, 0xe0, 0x99, 0xc9, - 0xdd, 0xbb, 0xd5, 0x0a, 0x3e, 0x24, 0x15, 0x31, 0x50, 0x63, 0x49, 0x42, 0x64, 0x26, 0x91, 0x32, - 0x52, 0x6c, 0x0e, 0xfe, 0xb2, 0x34, 0x16, 0x9b, 0xa3, 0x93, 0x12, 0x9b, 0xa3, 0x46, 0xde, 0x86, - 0xe1, 0xf2, 0xfd, 0xba, 0x88, 0x39, 0xe2, 0x2a, 0x67, 0xc3, 0x8c, 0x53, 0xfa, 0xa6, 0xdb, 0xf0, - 0xe3, 0x93, 0xc8, 0x4d, 0x97, 0xe9, 0xc9, 0x2c, 0x8c, 0x45, 0x3c, 0xd5, 0x5c, 0xe5, 0x1c, 0x72, - 0xc0, 0x96, 0xeb, 0x88, 0x69, 0x38, 0x02, 0x25, 0x0f, 0xaf, 0x68, 0x21, 0xa6, 0x35, 0x15, 0xd3, - 0xc5, 0xec, 0x3d, 0x1a, 0xc5, 0xf0, 0x26, 0xf8, 0x2c, 0x75, 0x90, 0x6b, 0x8d, 0x21, 0x50, 0x0d, - 0x87, 0xe3, 0xe4, 0x1e, 0x8d, 0x15, 0x23, 0xef, 0x03, 0xc1, 0x7c, 0x3f, 0xd4, 0xf0, 0x2f, 0x2e, - 0xab, 0x15, 0x57, 0xb9, 0x80, 0x01, 0xc0, 0x49, 0x3c, 0x9c, 0x42, 0xb5, 0x32, 0x7d, 0x45, 0x4c, - 0x1f, 0x4f, 0xeb, 0xbc, 0x54, 0xc3, 0x0f, 0xa5, 0xd0, 0x30, 0x23, 0xc9, 0x90, 0x53, 0xb8, 0x92, - 0x4d, 0xb8, 0x58, 0x73, 0xe8, 0x43, 0xd3, 0xee, 0xba, 0xfe, 0xf2, 0xe1, 0xcf, 0x5b, 0x17, 0x77, - 0x9d, 0xb7, 0x9e, 0x15, 0x15, 0x9f, 0xef, 0x38, 0xf4, 0x61, 0xc3, 0x0f, 0xfb, 0x1c, 0x89, 0x5a, - 0x9a, 0xc5, 0x1d, 0x53, 0x3a, 0x7f, 0xd0, 0x75, 0xa8, 0x80, 0x9b, 0xd4, 0x55, 0x94, 0x70, 0xaa, - 0xe5, 0x91, 0x6a, 0xcc, 0x00, 0x17, 0x49, 0xe9, 0x1c, 0x2d, 0x46, 0x34, 0x20, 0xb7, 0x66, 0xfc, - 0x4b, 0xec, 0x72, 0x93, 0x27, 0xbe, 0x55, 0x9e, 0x40, 0x66, 0x2a, 0x13, 0xcb, 0x7a, 0x33, 0x08, - 0x01, 0xdf, 0xd0, 0x05, 0x5e, 0x16, 0x4b, 0xb2, 0x34, 0x59, 0x80, 0xf1, 0x9a, 0x83, 0x47, 0x6a, - 0x77, 0xe8, 0x56, 0xcd, 0x6e, 0x99, 0xcd, 0x2d, 0x7c, 0x1d, 0x2b, 0xa6, 0xca, 0x0e, 0xc7, 0x35, - 0x1e, 0xd0, 0xad, 0x46, 0x07, 0xb1, 0xf2, 0xb2, 0x12, 0x2f, 0x29, 0x87, 0x64, 0x7e, 0x72, 0x6f, - 0x21, 0x99, 0x29, 0x8c, 0x8b, 0x2b, 0xf0, 0x47, 0x1e, 0xb5, 0xd8, 0x52, 0xef, 0x8a, 0x97, 0xb0, - 0x4a, 0xec, 0xca, 0x3c, 0xc0, 0xf3, 0xa9, 0x43, 0x8c, 0x32, 0x1a, 0x80, 0xe5, 0x86, 0xc5, 0x8b, - 0x24, 0xe3, 0x16, 0x3f, 0x75, 0x80, 0xb8, 0xc5, 0xff, 0x7b, 0x41, 0x9e, 0x7f, 0xc9, 0x65, 0x28, - 0x4a, 0x69, 0x85, 0x30, 0x28, 0x2b, 0x86, 0x60, 0x2f, 0x8a, 0x58, 0xd3, 0x43, 0xc2, 0x76, 0x09, - 0xa2, 0xef, 0x60, 0x1e, 0xc9, 0x30, 0x50, 0xa7, 0x16, 0x12, 0x60, 0x0e, 0xbf, 0xee, 0x6a, 0xcb, - 0x6c, 0x62, 0x60, 0xfe, 0x82, 0x14, 0x6e, 0x03, 0xa1, 0x3c, 0x2e, 0xbf, 0x44, 0x42, 0x6e, 0xc0, - 0xb0, 0x7f, 0x94, 0x1b, 0x06, 0x25, 0xc6, 0x78, 0xed, 0x62, 0xb6, 0x16, 0xe1, 0xe0, 0x25, 0x22, - 0xf2, 0x06, 0x40, 0x38, 0x1d, 0x08, 0x4b, 0x0b, 0x97, 0x0a, 0x79, 0xf6, 0x90, 0x97, 0x8a, 0x90, - 0x9a, 0x4d, 0x9c, 0xb2, 0x3a, 0xfa, 0x59, 0x4b, 0x71, 0xe2, 0x8c, 0xe8, 0xb0, 0xac, 0x20, 0xd1, - 0x22, 0x64, 0x19, 0x26, 0x12, 0x1a, 0x28, 0x42, 0x18, 0x63, 0xe6, 0xfa, 0x14, 0xf5, 0x95, 0x17, - 0xe6, 0x44, 0x59, 0xf2, 0x1c, 0x14, 0xee, 0x6a, 0x55, 0x11, 0x46, 0x95, 0x47, 0xe0, 0x8d, 0xc4, - 0x58, 0x62, 0x58, 0xf2, 0x3a, 0x00, 0x4f, 0x53, 0x52, 0xb3, 0x1d, 0x0f, 0x2d, 0x8a, 0xd1, 0xe9, - 0x27, 0xd8, 0x58, 0xe6, 0x69, 0x4c, 0x1a, 0x6c, 0x19, 0x93, 0x3f, 0x3a, 0x24, 0x56, 0x7f, 0x34, - 0x9f, 0x58, 0xd6, 0x98, 0xe0, 0x45, 0x2b, 0xa4, 0xce, 0x47, 0xc1, 0xfb, 0x4d, 0xe7, 0x82, 0x97, - 0x88, 0xc8, 0x55, 0x18, 0xac, 0xb1, 0x49, 0xa5, 0x69, 0xb7, 0x84, 0x2a, 0x60, 0x2c, 0xad, 0x8e, - 0x80, 0x69, 0x01, 0x96, 0xdc, 0x90, 0xf2, 0xf4, 0x4a, 0x41, 0xcd, 0xfd, 0x3c, 0xbd, 0xf1, 0xe8, - 0xde, 0x98, 0xb1, 0xf7, 0x46, 0x2c, 0xef, 0x97, 0x28, 0x93, 0xb2, 0xa4, 0x86, 0x79, 0xbe, 0x02, - 0x83, 0xb6, 0x7f, 0x37, 0x83, 0x56, 0xfd, 0x3b, 0xb9, 0xe4, 0x10, 0x25, 0x37, 0x93, 0xf1, 0x85, - 0x71, 0xfd, 0x0a, 0x80, 0x72, 0xad, 0x41, 0xa4, 0xe1, 0x48, 0xa4, 0xe0, 0xfc, 0x81, 0x23, 0x05, - 0x17, 0xf6, 0x19, 0x29, 0x58, 0xfd, 0x7f, 0x8b, 0x3d, 0xbd, 0xbd, 0x8f, 0x25, 0xa2, 0xdc, 0xeb, - 0x6c, 0x53, 0xc6, 0x6a, 0x2f, 0xbb, 0x89, 0xad, 0x05, 0x77, 0x66, 0x6d, 0xe8, 0x7c, 0x54, 0xba, - 0x5a, 0x94, 0x92, 0xbc, 0x03, 0x23, 0xfe, 0x07, 0x60, 0x04, 0x6a, 0x29, 0x72, 0x72, 0xb0, 0x20, - 0xc6, 0x62, 0x35, 0x47, 0x0a, 0x90, 0x57, 0x60, 0x08, 0xcd, 0xa1, 0x8e, 0xde, 0xf4, 0xc3, 0x93, - 0xf3, 0x78, 0xe6, 0x3e, 0x50, 0x8e, 0x9a, 0x16, 0x50, 0x92, 0x2f, 0x40, 0x49, 0xe4, 0xe8, 0xe0, - 0x29, 0xec, 0xaf, 0xef, 0xc1, 0x3d, 0x7e, 0x4a, 0xce, 0xcf, 0xc1, 0x37, 0x38, 0x08, 0x88, 0x6c, - 0x70, 0x78, 0x6a, 0x8e, 0x15, 0x38, 0x5b, 0x73, 0xa8, 0x81, 0x0f, 0x31, 0x66, 0x1f, 0x75, 0x1c, - 0x91, 0x3d, 0x85, 0x4f, 0x10, 0xb8, 0xbe, 0x75, 0x7c, 0x34, 0x5b, 0x79, 0x05, 0x5e, 0x8e, 0x91, - 0x9c, 0x52, 0x9c, 0x19, 0x3d, 0xbc, 0x25, 0x77, 0xe8, 0xd6, 0xa6, 0xed, 0x18, 0x3c, 0xc1, 0x88, - 0x98, 0xfa, 0x85, 0xa0, 0x1f, 0x08, 0x94, 0x6c, 0xf4, 0x44, 0x0b, 0x5d, 0x7a, 0x1d, 0x86, 0x0f, - 0x9a, 0xe3, 0xe2, 0xd7, 0xf2, 0x19, 0xef, 0xa6, 0x1e, 0xdf, 0x34, 0x83, 0x41, 0xee, 0xeb, 0xfe, - 0x8c, 0xdc, 0xd7, 0xdf, 0xcd, 0x67, 0x3c, 0x0a, 0x7b, 0xac, 0x73, 0xd4, 0x06, 0xc2, 0x88, 0xe6, - 0xa8, 0x0d, 0xd3, 0x03, 0x9b, 0x86, 0x26, 0x13, 0xc5, 0xb2, 0x59, 0x97, 0x76, 0xcd, 0x66, 0xfd, - 0x4b, 0x85, 0x5e, 0x8f, 0xe6, 0x4e, 0x65, 0xbf, 0x1f, 0xd9, 0xdf, 0x80, 0xe1, 0x40, 0xb2, 0xd5, - 0x0a, 0xda, 0x4b, 0xa3, 0x41, 0x46, 0x1d, 0x0e, 0xc6, 0x32, 0x12, 0x11, 0xb9, 0xc6, 0xdb, 0x5a, - 0x37, 0x3f, 0xe0, 0xb9, 0x1d, 0x46, 0x45, 0xd4, 0x7e, 0xdd, 0xd3, 0x1b, 0xae, 0xf9, 0x01, 0xd5, - 0x02, 0xb4, 0xfa, 0x9f, 0xe5, 0x53, 0x5f, 0x1e, 0x9e, 0xf6, 0xd1, 0x3e, 0xfa, 0x28, 0x45, 0x88, - 0xfc, 0xcd, 0xe4, 0xa9, 0x10, 0xf7, 0x21, 0xc4, 0x3f, 0xc9, 0xa7, 0xbe, 0x30, 0x3d, 0x15, 0xe2, - 0x7e, 0x66, 0x8b, 0x17, 0x60, 0x48, 0xb3, 0x37, 0xdd, 0x19, 0xdc, 0x13, 0xf1, 0xb9, 0x02, 0x27, - 0x6a, 0xc7, 0xde, 0x74, 0x1b, 0xb8, 0xdb, 0xd1, 0x42, 0x02, 0xf5, 0x7b, 0xf9, 0x1e, 0x6f, 0x70, - 0x4f, 0x05, 0xff, 0x61, 0x2e, 0x91, 0xbf, 0x99, 0x8f, 0xbc, 0xf1, 0x7d, 0x7c, 0x85, 0x7d, 0x1d, - 0xa0, 0xde, 0xdc, 0xa0, 0x6d, 0x5d, 0xca, 0x8f, 0x85, 0x47, 0x16, 0x2e, 0x42, 0x45, 0x5e, 0xe5, - 0x90, 0x44, 0xfd, 0x66, 0x3e, 0xf6, 0xc8, 0xf9, 0x54, 0x76, 0x7b, 0x96, 0x5d, 0xa0, 0x75, 0xe2, - 0xdd, 0xf6, 0xa9, 0xe4, 0xf6, 0x2a, 0xb9, 0x9f, 0xc8, 0xc7, 0x9e, 0xb8, 0x3f, 0xb6, 0xb2, 0x63, - 0x03, 0x30, 0xf9, 0xf4, 0xfe, 0xb1, 0xd5, 0xa4, 0x17, 0x60, 0x48, 0xc8, 0x21, 0x58, 0x2a, 0xf8, - 0xbc, 0xcf, 0x81, 0x78, 0x40, 0x1b, 0x10, 0xa8, 0x7f, 0x2a, 0x0f, 0xd1, 0xd0, 0x03, 0x8f, 0xa9, - 0x0e, 0xfd, 0x66, 0x3e, 0x1a, 0x74, 0xe1, 0xf1, 0xd5, 0x9f, 0x29, 0x80, 0x7a, 0x77, 0xb5, 0x29, - 0x62, 0xf6, 0xf6, 0x4b, 0x27, 0xfc, 0x01, 0x54, 0x93, 0x28, 0xd4, 0xff, 0x2f, 0x9f, 0x1a, 0x09, - 0xe2, 0xf1, 0x15, 0xe0, 0xcb, 0x78, 0x2a, 0xde, 0xb4, 0xc2, 0x89, 0x1c, 0x0f, 0x21, 0xd9, 0xf8, - 0x4b, 0x24, 0x55, 0xf4, 0x09, 0xc9, 0xa7, 0x53, 0xcc, 0x35, 0x4c, 0xf9, 0x10, 0x9a, 0x6b, 0xf2, - 0x61, 0xbe, 0x64, 0xb8, 0xfd, 0x7e, 0x7e, 0xb7, 0xc0, 0x19, 0x8f, 0xf3, 0xaa, 0x3a, 0x50, 0xd3, - 0xb7, 0x30, 0xc0, 0x23, 0xeb, 0x89, 0x11, 0x9e, 0xf2, 0xaf, 0xc3, 0x41, 0xf2, 0xb5, 0x9d, 0xa0, - 0x52, 0xff, 0x69, 0x7f, 0x7a, 0xd4, 0x86, 0xc7, 0x57, 0x84, 0x97, 0xa1, 0x58, 0xd3, 0xbd, 0x0d, - 0xa1, 0xc9, 0x78, 0x1b, 0xd8, 0xd1, 0xbd, 0x0d, 0x0d, 0xa1, 0xe4, 0x1a, 0x0c, 0x6a, 0xfa, 0x26, - 0x3f, 0xf3, 0x2c, 0x85, 0xe9, 0x18, 0x1d, 0x7d, 0xb3, 0xc1, 0xcf, 0x3d, 0x03, 0x34, 0x51, 0x83, - 0x74, 0xa0, 0xfc, 0xe4, 0x1b, 0x73, 0xd1, 0xf1, 0x74, 0xa0, 0x41, 0x12, 0xd0, 0xcb, 0x50, 0x9c, - 0xb6, 0x8d, 0x2d, 0xbc, 0xf9, 0x1a, 0xe1, 0x95, 0xad, 0xda, 0xc6, 0x96, 0x86, 0x50, 0xf2, 0x93, - 0x39, 0x18, 0x98, 0xa7, 0xba, 0xc1, 0x46, 0xc8, 0x50, 0x2f, 0x87, 0x95, 0xcf, 0x1d, 0x8d, 0xc3, - 0xca, 0xc4, 0x06, 0xaf, 0x4c, 0x56, 0x14, 0x51, 0x3f, 0xb9, 0x05, 0x83, 0x33, 0xba, 0x47, 0xd7, - 0x6d, 0x67, 0x0b, 0x5d, 0x70, 0xc6, 0x42, 0xcf, 0xff, 0x88, 0xfe, 0xf8, 0x44, 0xfc, 0x66, 0xac, - 0x29, 0x7e, 0x69, 0x41, 0x61, 0x26, 0x16, 0x7e, 0x33, 0x27, 0x52, 0x5f, 0xa3, 0x58, 0xf8, 0x15, - 0x9e, 0x26, 0x30, 0xe1, 0xb1, 0xf2, 0x48, 0xfa, 0xb1, 0x32, 0x5a, 0x8f, 0xe8, 0xa6, 0x87, 0x49, - 0x38, 0x47, 0x71, 0xd1, 0xe7, 0xd6, 0x23, 0x42, 0x31, 0x07, 0xa7, 0x26, 0x91, 0xa8, 0xdf, 0xe9, - 0x87, 0xd4, 0x37, 0xde, 0xa7, 0x4a, 0x7e, 0xaa, 0xe4, 0xa1, 0x92, 0x57, 0x12, 0x4a, 0x7e, 0x29, - 0x19, 0x35, 0xe0, 0x23, 0xaa, 0xe1, 0x3f, 0x5f, 0x4c, 0xc4, 0x1c, 0x79, 0xbc, 0x77, 0x97, 0xa1, - 0xf4, 0xfa, 0x77, 0x95, 0x5e, 0x30, 0x20, 0x4a, 0xbb, 0x0e, 0x88, 0x81, 0xbd, 0x0e, 0x88, 0xc1, - 0xcc, 0x01, 0x11, 0x2a, 0xc8, 0x50, 0xa6, 0x82, 0x54, 0xc5, 0xa0, 0x81, 0xde, 0xa9, 0x4f, 0x2e, - 0xef, 0x6c, 0x4f, 0x8e, 0xb1, 0xd1, 0x94, 0x9a, 0xf3, 0x04, 0x59, 0xa8, 0x7f, 0x50, 0xec, 0x11, - 0x28, 0xe8, 0x58, 0x74, 0xe4, 0x65, 0x28, 0x94, 0x3b, 0x1d, 0xa1, 0x1f, 0x67, 0xa5, 0x18, 0x45, - 0x19, 0xa5, 0x18, 0x35, 0x79, 0x03, 0x0a, 0xe5, 0xfb, 0xf5, 0x78, 0xba, 0x93, 0xf2, 0xfd, 0xba, - 0xf8, 0x92, 0xcc, 0xb2, 0xf7, 0xeb, 0xe4, 0xad, 0x30, 0xee, 0xe8, 0x46, 0xd7, 0x7a, 0x20, 0x36, - 0x8a, 0xc2, 0x53, 0xd7, 0xf7, 0xe4, 0x69, 0x32, 0x14, 0xdb, 0x2e, 0xc6, 0x68, 0x63, 0xda, 0x54, - 0xda, 0xbb, 0x36, 0x0d, 0xec, 0xaa, 0x4d, 0x83, 0x7b, 0xd5, 0xa6, 0xa1, 0x3d, 0x68, 0x13, 0xec, - 0xaa, 0x4d, 0xc3, 0x87, 0xd7, 0xa6, 0x0e, 0x5c, 0x4a, 0x06, 0x77, 0x0b, 0x34, 0x42, 0x03, 0x92, - 0xc4, 0x0a, 0xc7, 0x12, 0xbc, 0xfa, 0xef, 0x72, 0x6c, 0x63, 0x13, 0xd1, 0x0d, 0x97, 0xe1, 0x65, - 0xd7, 0xb6, 0x64, 0x69, 0xf5, 0xd7, 0xf2, 0xd9, 0x31, 0xe9, 0x4e, 0xe6, 0x14, 0xf7, 0x43, 0xa9, - 0x52, 0x2a, 0x46, 0x63, 0x04, 0x64, 0x4b, 0x39, 0xc6, 0x36, 0x4d, 0x66, 0xdf, 0xc8, 0x67, 0x05, - 0xca, 0x3b, 0x94, 0xc4, 0x3e, 0x9e, 0x74, 0x86, 0x43, 0x17, 0x7f, 0x37, 0xea, 0x05, 0x37, 0x07, - 0x23, 0xb2, 0x10, 0x85, 0x94, 0xf6, 0x22, 0xe0, 0x48, 0x39, 0xf2, 0x56, 0x90, 0x95, 0x46, 0xf2, - 0x8f, 0x41, 0x4f, 0x37, 0x7f, 0xcc, 0xc6, 0xdc, 0x63, 0x64, 0x72, 0xf2, 0x02, 0x94, 0xe6, 0x30, - 0xcc, 0xbb, 0x3c, 0xd8, 0x79, 0xe0, 0x77, 0xd9, 0x6b, 0x85, 0xd3, 0xa8, 0x7f, 0x27, 0x07, 0x67, - 0xef, 0x74, 0x57, 0xa9, 0x70, 0xb4, 0x0b, 0xda, 0xf0, 0x3e, 0x00, 0x03, 0x0b, 0x87, 0x99, 0x1c, - 0x3a, 0xcc, 0x7c, 0x52, 0x0e, 0xa8, 0x17, 0x2b, 0x30, 0x15, 0x52, 0x73, 0x67, 0x99, 0xa7, 0x7c, - 0x9f, 0xd3, 0x07, 0xdd, 0x55, 0xda, 0x48, 0x78, 0xcd, 0x48, 0xdc, 0x2f, 0xbd, 0xcd, 0xbd, 0xf9, - 0x0f, 0xea, 0xa0, 0xf2, 0xab, 0xf9, 0xcc, 0x18, 0x86, 0x27, 0x36, 0xd9, 0xe6, 0x0f, 0xa4, 0xf6, - 0x4a, 0x3c, 0xe9, 0x66, 0x0a, 0x49, 0x8c, 0x63, 0x1a, 0x97, 0x74, 0x81, 0x9d, 0xf0, 0x14, 0xb0, - 0x1f, 0xaa, 0xc0, 0xfe, 0x7e, 0x2e, 0x33, 0xd6, 0xe4, 0x49, 0x15, 0x98, 0xfa, 0xbf, 0x14, 0xfc, - 0x10, 0x97, 0x87, 0xfa, 0x84, 0x17, 0x60, 0x48, 0xbc, 0xf4, 0x8f, 0xfa, 0x09, 0x8b, 0x63, 0x43, - 0x3c, 0x86, 0x0e, 0x08, 0x98, 0x49, 0x21, 0x39, 0x31, 0x4b, 0x7e, 0xc2, 0x92, 0x03, 0xb3, 0x26, - 0x91, 0x30, 0xa3, 0x61, 0xf6, 0x91, 0xe9, 0xa1, 0x05, 0xc2, 0xfa, 0xb2, 0xc0, 0x8d, 0x06, 0xfa, - 0xc8, 0xf4, 0xb8, 0xfd, 0x11, 0xa0, 0x99, 0x41, 0x50, 0x0f, 0x13, 0xdc, 0x0b, 0x83, 0xc0, 0x15, - 0x79, 0xfe, 0xc5, 0xeb, 0xb6, 0x17, 0x60, 0x48, 0x38, 0xdf, 0x0a, 0x97, 0x16, 0xd1, 0x5a, 0xe1, - 0xae, 0x8b, 0xad, 0x0d, 0x08, 0x18, 0x47, 0x8d, 0xae, 0x87, 0x4e, 0x7c, 0xc8, 0xd1, 0x41, 0x88, - 0x26, 0x30, 0xe4, 0x06, 0x8c, 0xd5, 0x3d, 0xdd, 0x32, 0x74, 0xc7, 0x58, 0xee, 0x7a, 0x9d, 0xae, - 0x27, 0x1b, 0xc0, 0xae, 0x67, 0xd8, 0x5d, 0x4f, 0x8b, 0x51, 0x90, 0x4f, 0xc1, 0xa8, 0x0f, 0x99, - 0x75, 0x1c, 0xdb, 0x91, 0xad, 0x1c, 0xd7, 0x33, 0xa8, 0xe3, 0x68, 0x51, 0x02, 0xf2, 0x69, 0x18, - 0xad, 0x5a, 0x0f, 0xed, 0x26, 0x7f, 0xed, 0xae, 0x2d, 0x08, 0x9b, 0x07, 0x5f, 0x8c, 0x99, 0x01, - 0xa2, 0xd1, 0x75, 0x5a, 0x5a, 0x94, 0x50, 0xdd, 0xc9, 0x27, 0x23, 0x81, 0x3e, 0xbe, 0x1b, 0xa4, - 0x6b, 0x51, 0xc7, 0x3d, 0xf4, 0x56, 0x45, 0xe3, 0x53, 0xf6, 0x1b, 0xe6, 0x36, 0xe8, 0x0d, 0x18, - 0xbc, 0x43, 0xb7, 0xb8, 0x8f, 0x69, 0x29, 0x74, 0x4b, 0x7e, 0x20, 0x60, 0xf2, 0xe9, 0xae, 0x4f, - 0xa7, 0x7e, 0x2b, 0x9f, 0x8c, 0x71, 0xfa, 0xf8, 0x0a, 0xfb, 0x53, 0x30, 0x80, 0xa2, 0xac, 0xfa, - 0xd7, 0x0b, 0x28, 0x40, 0x14, 0x77, 0xd4, 0xdb, 0xd9, 0x27, 0x53, 0x7f, 0xb1, 0x14, 0x0f, 0x7c, - 0xfb, 0xf8, 0x4a, 0xef, 0x4d, 0x18, 0x9e, 0xb1, 0x2d, 0xd7, 0x74, 0x3d, 0x6a, 0x35, 0x7d, 0x85, - 0x45, 0xc7, 0xff, 0x66, 0x08, 0x96, 0x6d, 0x40, 0x89, 0xfa, 0x20, 0xca, 0x4b, 0x5e, 0x85, 0x21, - 0x14, 0x39, 0xda, 0x9c, 0x7c, 0xc2, 0xc3, 0x9b, 0x89, 0x55, 0x06, 0x8c, 0x5b, 0x9c, 0x21, 0x29, - 0xb9, 0x0b, 0x83, 0x33, 0x1b, 0x66, 0xcb, 0x70, 0xa8, 0x85, 0xbe, 0xc9, 0x52, 0x7c, 0x91, 0x68, - 0x5f, 0x4e, 0xe1, 0xbf, 0x48, 0xcb, 0x9b, 0xd3, 0x14, 0xc5, 0x22, 0x8f, 0xc5, 0x04, 0xec, 0xd2, - 0xcf, 0xe6, 0x01, 0xc2, 0x02, 0xe4, 0x19, 0xc8, 0x07, 0xb9, 0xa3, 0xd1, 0x25, 0x26, 0xa2, 0x41, - 0x79, 0x5c, 0x2a, 0xc4, 0xd8, 0xce, 0xef, 0x3a, 0xb6, 0xef, 0x42, 0x89, 0x9f, 0xae, 0xa1, 0xd7, - 0xba, 0x14, 0x8b, 0x33, 0xb3, 0xc1, 0x53, 0x48, 0xcf, 0x6d, 0x69, 0xb4, 0x3c, 0x23, 0x1e, 0xe0, - 0x9c, 0xd9, 0xa5, 0x26, 0xf4, 0xe3, 0x5f, 0xe4, 0x0a, 0x14, 0x57, 0xfc, 0xbc, 0xb3, 0xa3, 0x7c, - 0x96, 0x8e, 0xc9, 0x0f, 0xf1, 0xac, 0x9b, 0x66, 0x6c, 0xcb, 0x63, 0x55, 0x63, 0xab, 0x47, 0x84, - 0x5c, 0x04, 0x2c, 0x22, 0x17, 0x01, 0x53, 0xff, 0xab, 0x7c, 0x4a, 0x48, 0xe6, 0xc7, 0x77, 0x98, - 0xbc, 0x0e, 0x80, 0x2f, 0xcf, 0x99, 0x3c, 0xfd, 0xe7, 0x20, 0x38, 0x4a, 0x90, 0x11, 0xaa, 0x6d, - 0x64, 0xdb, 0x11, 0x12, 0xab, 0x7f, 0x2f, 0x97, 0x88, 0xe3, 0x7b, 0x28, 0x39, 0xca, 0x56, 0x59, - 0xfe, 0x80, 0x66, 0xac, 0xdf, 0x17, 0x85, 0xfd, 0xf5, 0x45, 0xf4, 0x5b, 0x8e, 0xc0, 0x32, 0x3d, - 0xce, 0x6f, 0xf9, 0x4e, 0x3e, 0x2d, 0xaa, 0xf1, 0xc9, 0x54, 0xf1, 0x9b, 0x81, 0x51, 0x5a, 0x8c, - 0xc5, 0x91, 0x47, 0x68, 0x3c, 0x37, 0xb6, 0x30, 0x53, 0xbf, 0x08, 0x67, 0x62, 0xb1, 0x7e, 0x45, - 0x9a, 0xe2, 0x2b, 0xbd, 0x83, 0x06, 0x67, 0xc7, 0x2c, 0x88, 0x90, 0xa9, 0xff, 0x7f, 0xae, 0x77, - 0xa4, 0xe7, 0x63, 0x57, 0x9d, 0x14, 0x01, 0x14, 0xfe, 0xd5, 0x08, 0xe0, 0x08, 0xb6, 0xc1, 0x27, - 0x5b, 0x00, 0x1f, 0x91, 0xc9, 0xe3, 0xc3, 0x16, 0xc0, 0x2f, 0xe6, 0x76, 0x0d, 0xd4, 0x7d, 0xdc, - 0x32, 0x50, 0xff, 0xc7, 0x5c, 0x6a, 0x40, 0xed, 0x43, 0xb5, 0xeb, 0x2d, 0x28, 0x71, 0x17, 0x1e, - 0xd1, 0x2a, 0x29, 0x05, 0x19, 0x83, 0x66, 0x25, 0xed, 0xe7, 0x58, 0xb2, 0x00, 0x03, 0xbc, 0x0d, - 0x86, 0xe8, 0x8d, 0x8f, 0xf5, 0x88, 0xea, 0x6d, 0x64, 0x4d, 0x8e, 0x02, 0xad, 0xfe, 0xdd, 0x5c, - 0x22, 0xbe, 0xf7, 0x31, 0x7e, 0x5b, 0x38, 0x55, 0x17, 0xf6, 0x3e, 0x55, 0xab, 0xff, 0x24, 0x9f, - 0x1e, 0x5e, 0xfc, 0x18, 0x3f, 0xe4, 0x28, 0x8e, 0xd3, 0x0e, 0xb6, 0x6e, 0xad, 0xc0, 0x58, 0x54, - 0x16, 0x62, 0xd9, 0x7a, 0x3a, 0x3d, 0xc8, 0x7a, 0x46, 0x2b, 0x62, 0x3c, 0xd4, 0x6f, 0xe7, 0x92, - 0x91, 0xd1, 0x8f, 0x7d, 0x7e, 0x3a, 0x98, 0xb6, 0x44, 0x3f, 0xe5, 0x23, 0xb2, 0xd6, 0x1c, 0xc5, - 0xa7, 0x7c, 0x44, 0x56, 0x8d, 0x83, 0x7d, 0xca, 0x2f, 0xe7, 0xb3, 0x02, 0xcb, 0x1f, 0xfb, 0x07, - 0x7d, 0x5e, 0x16, 0x32, 0x6f, 0x99, 0xf8, 0xb4, 0x67, 0xb2, 0x22, 0xb9, 0x67, 0xf0, 0x4c, 0xf0, - 0x39, 0xd8, 0x18, 0x4f, 0x15, 0xd6, 0x47, 0x44, 0x91, 0x4f, 0x86, 0xb0, 0x3e, 0x22, 0x43, 0xe5, - 0xa3, 0x27, 0xac, 0xdf, 0xce, 0xef, 0x35, 0x9b, 0xc1, 0xa9, 0xf0, 0x12, 0xc2, 0xfb, 0x6a, 0x3e, - 0x99, 0x65, 0xe3, 0xd8, 0xc5, 0x34, 0x07, 0x25, 0x91, 0xef, 0x23, 0x53, 0x38, 0x1c, 0x9f, 0x65, - 0xd1, 0x88, 0xef, 0xb8, 0x09, 0xe2, 0x22, 0x67, 0x6f, 0x22, 0xe1, 0xb4, 0xea, 0xf7, 0x72, 0xb1, - 0x94, 0x14, 0xc7, 0x72, 0x84, 0x70, 0xa0, 0x25, 0x89, 0xbc, 0xed, 0x1f, 0x66, 0x16, 0x63, 0x21, - 0xc1, 0x83, 0xef, 0xa9, 0x50, 0x4f, 0x37, 0x5b, 0xf1, 0xf2, 0x22, 0xfe, 0xc0, 0xb7, 0xf2, 0x30, - 0x91, 0x20, 0x25, 0x57, 0x22, 0x11, 0x7f, 0xf0, 0x58, 0x32, 0xe6, 0xa8, 0xce, 0x63, 0xff, 0xec, - 0xe3, 0x24, 0xf5, 0x0a, 0x14, 0x2b, 0xfa, 0x16, 0xff, 0xb6, 0x7e, 0xce, 0xd2, 0xd0, 0xb7, 0xe4, - 0x13, 0x37, 0xc4, 0x93, 0x55, 0x38, 0xcf, 0xef, 0x43, 0x4c, 0xdb, 0x5a, 0x31, 0xdb, 0xb4, 0x6a, - 0x2d, 0x9a, 0xad, 0x96, 0xe9, 0x8a, 0x4b, 0xbd, 0x17, 0x76, 0xb6, 0x27, 0xaf, 0x7a, 0xb6, 0xa7, - 0xb7, 0x1a, 0xd4, 0x27, 0x6b, 0x78, 0x66, 0x9b, 0x36, 0x4c, 0xab, 0xd1, 0x46, 0x4a, 0x89, 0x65, - 0x3a, 0x2b, 0x52, 0xe5, 0xd1, 0xdf, 0xeb, 0x4d, 0xdd, 0xb2, 0xa8, 0x51, 0xb5, 0xa6, 0xb7, 0x3c, - 0xca, 0x2f, 0x03, 0x0b, 0xfc, 0x48, 0x90, 0xbf, 0x43, 0xe7, 0x68, 0xc6, 0x78, 0x95, 0x11, 0x68, - 0x29, 0x85, 0xd4, 0xdf, 0x29, 0xa6, 0x64, 0x23, 0x39, 0x41, 0xea, 0xe3, 0xf7, 0x74, 0x71, 0x97, - 0x9e, 0xbe, 0x0e, 0x03, 0x22, 0xbc, 0xae, 0xb8, 0x60, 0x40, 0xc7, 0xf9, 0x87, 0x1c, 0x24, 0xdf, - 0xd0, 0x08, 0x2a, 0xd2, 0x82, 0x4b, 0x2b, 0xac, 0x9b, 0xd2, 0x3b, 0xb3, 0x74, 0x80, 0xce, 0xec, - 0xc1, 0x8f, 0xbc, 0x07, 0x17, 0x11, 0x9b, 0xd2, 0xad, 0x03, 0x58, 0x15, 0x86, 0xd2, 0xe2, 0x55, - 0xa5, 0x77, 0x6e, 0x56, 0x79, 0xf2, 0x79, 0x18, 0x09, 0x06, 0x88, 0x49, 0x5d, 0x71, 0x73, 0xd1, - 0x63, 0x9c, 0xf1, 0x38, 0x75, 0x0c, 0x8c, 0xee, 0x6a, 0xd1, 0x58, 0x67, 0x11, 0x5e, 0xea, 0xff, - 0x90, 0xeb, 0x95, 0x15, 0xe5, 0xd8, 0x67, 0xe5, 0xb7, 0x61, 0xc0, 0xe0, 0x1f, 0x25, 0x74, 0xaa, - 0x77, 0xde, 0x14, 0x4e, 0xaa, 0xf9, 0x65, 0xd4, 0x7f, 0x9c, 0xeb, 0x99, 0x8c, 0xe5, 0xa4, 0x7f, - 0xde, 0x57, 0x0b, 0x19, 0x9f, 0x27, 0x26, 0xd1, 0x6b, 0x30, 0x6e, 0x86, 0xd1, 0xe2, 0x1b, 0x61, - 0xa8, 0x2b, 0xed, 0x8c, 0x04, 0xc7, 0xd1, 0x75, 0x13, 0x02, 0x87, 0x2d, 0xc7, 0xf7, 0x46, 0x73, - 0x1b, 0x5d, 0xc7, 0xe4, 0xe3, 0x52, 0x3b, 0xe7, 0xc6, 0x5c, 0xd5, 0xdc, 0xbb, 0x8e, 0xc9, 0x2a, - 0xd0, 0xbd, 0x0d, 0x6a, 0xe9, 0x8d, 0x4d, 0xdb, 0x79, 0x80, 0xc1, 0x50, 0xf9, 0xe0, 0xd4, 0xce, - 0x70, 0xf8, 0x7d, 0x1f, 0x4c, 0x9e, 0x83, 0xd1, 0xf5, 0x56, 0x97, 0x06, 0xe1, 0x27, 0xf9, 0x5d, - 0x9f, 0x36, 0xc2, 0x80, 0xc1, 0x0d, 0xc9, 0x53, 0x00, 0x48, 0xe4, 0x61, 0xaa, 0x1c, 0xbc, 0xd8, - 0xd3, 0x86, 0x18, 0x64, 0x45, 0x74, 0xd7, 0x25, 0xae, 0xd5, 0x5c, 0x48, 0x8d, 0x96, 0x6d, 0xad, - 0x37, 0x3c, 0xea, 0xb4, 0xb1, 0xa1, 0xe8, 0xcc, 0xa0, 0x5d, 0x40, 0x0a, 0xbc, 0x3a, 0x71, 0x17, - 0x6c, 0x6b, 0x7d, 0x85, 0x3a, 0x6d, 0xd6, 0xd4, 0x17, 0x80, 0x88, 0xa6, 0x3a, 0x78, 0xe8, 0xc1, - 0x3f, 0x0e, 0xbd, 0x19, 0x34, 0xf1, 0x11, 0xfc, 0x34, 0x04, 0x3f, 0x6c, 0x12, 0x86, 0x79, 0x0c, - 0x3e, 0x2e, 0x34, 0x74, 0x61, 0xd0, 0x80, 0x83, 0x50, 0x5e, 0x17, 0x40, 0x78, 0x57, 0x70, 0x0f, - 0x72, 0x4d, 0xfc, 0x52, 0xbf, 0x5c, 0x48, 0xcb, 0x1f, 0x73, 0x28, 0x45, 0x0b, 0xa7, 0xd5, 0xfc, - 0xbe, 0xa6, 0xd5, 0x33, 0x56, 0xb7, 0xdd, 0xd0, 0x3b, 0x9d, 0xc6, 0x9a, 0xd9, 0xc2, 0x27, 0x5c, - 0xb8, 0xf0, 0x69, 0xa3, 0x56, 0xb7, 0x5d, 0xee, 0x74, 0xe6, 0x38, 0x90, 0x3c, 0x0f, 0x13, 0x8c, - 0x0e, 0x3b, 0x29, 0xa0, 0x2c, 0x22, 0x25, 0x63, 0x80, 0x41, 0x6c, 0x7d, 0xda, 0x27, 0x60, 0x50, - 0xf0, 0xe4, 0x6b, 0x55, 0xbf, 0x36, 0xc0, 0x99, 0xb9, 0xac, 0xe7, 0x02, 0x36, 0x7c, 0x72, 0xed, - 0xd7, 0x86, 0xfc, 0xf2, 0x18, 0xaa, 0xd9, 0xea, 0xb6, 0x79, 0xf4, 0xad, 0x01, 0x44, 0x06, 0xbf, - 0xc9, 0x15, 0x18, 0x63, 0x5c, 0x02, 0x81, 0xf1, 0xe8, 0xb6, 0xfd, 0x5a, 0x0c, 0x4a, 0x6e, 0xc0, - 0xb9, 0x08, 0x84, 0xdb, 0xa0, 0xfc, 0x49, 0x42, 0xbf, 0x96, 0x8a, 0x53, 0xbf, 0x59, 0x88, 0x66, - 0xb5, 0x39, 0x86, 0x8e, 0xb8, 0x08, 0x03, 0xb6, 0xb3, 0xde, 0xe8, 0x3a, 0x2d, 0x31, 0xf6, 0x4a, - 0xb6, 0xb3, 0x7e, 0xd7, 0x69, 0x91, 0xf3, 0x50, 0x62, 0xbd, 0x63, 0x1a, 0x62, 0x88, 0xf5, 0xeb, - 0x9d, 0x4e, 0xd5, 0x20, 0x65, 0xde, 0x21, 0x18, 0x19, 0xb5, 0xd1, 0xc4, 0xad, 0x3d, 0x77, 0x4a, - 0xe8, 0xe7, 0x2b, 0x5e, 0x02, 0x89, 0xfd, 0x84, 0xf1, 0x52, 0xf9, 0x41, 0x40, 0x8c, 0x85, 0x81, - 0xdb, 0x12, 0x83, 0xf7, 0x49, 0x9c, 0x85, 0x40, 0x86, 0x2c, 0xf8, 0x26, 0xc6, 0x20, 0x15, 0x20, - 0x21, 0x55, 0xdb, 0x36, 0xcc, 0x35, 0x93, 0xf2, 0x17, 0x24, 0xfd, 0xfc, 0xe2, 0x37, 0x89, 0xd5, - 0xc6, 0x7d, 0x26, 0x8b, 0x02, 0x42, 0xde, 0xe4, 0x4a, 0xc8, 0xe9, 0x70, 0xed, 0xe3, 0x7d, 0xcb, - 0xed, 0xb4, 0x18, 0x0a, 0x35, 0x13, 0xcb, 0xe3, 0x42, 0xa8, 0xfe, 0xd5, 0x62, 0x32, 0xb5, 0xd1, - 0xb1, 0xd8, 0x35, 0xf3, 0x00, 0x22, 0x73, 0x59, 0x78, 0xb9, 0x16, 0x78, 0xb7, 0x87, 0x98, 0x0c, - 0x1e, 0x52, 0x59, 0x72, 0x0d, 0x06, 0xf9, 0x17, 0x55, 0x2b, 0xc2, 0xde, 0x41, 0x17, 0x31, 0xb7, - 0x63, 0xae, 0xad, 0xa1, 0x3f, 0x59, 0x80, 0x26, 0x57, 0x60, 0xa0, 0xb2, 0x54, 0xaf, 0x97, 0x97, - 0xfc, 0x9b, 0x62, 0x7c, 0xcb, 0x62, 0x58, 0x6e, 0xc3, 0xd5, 0x2d, 0x57, 0xf3, 0x91, 0xe4, 0x39, - 0x28, 0x55, 0x6b, 0x48, 0xc6, 0x5f, 0x68, 0x0e, 0xef, 0x6c, 0x4f, 0x0e, 0x98, 0x1d, 0x4e, 0x25, - 0x50, 0x58, 0xef, 0xbd, 0x6a, 0x45, 0x72, 0x97, 0xe0, 0xf5, 0x3e, 0x34, 0x0d, 0xbc, 0x76, 0xd6, - 0x02, 0x34, 0x79, 0x05, 0x46, 0xea, 0xd4, 0x31, 0xf5, 0xd6, 0x52, 0x17, 0xb7, 0x8a, 0x52, 0xc4, - 0x47, 0x17, 0xe1, 0x0d, 0x0b, 0x11, 0x5a, 0x84, 0x8c, 0x5c, 0x86, 0xe2, 0xbc, 0x69, 0xf9, 0xcf, - 0x25, 0xd0, 0x9f, 0x7e, 0xc3, 0xb4, 0x3c, 0x0d, 0xa1, 0xe4, 0x39, 0x28, 0xdc, 0x5e, 0xa9, 0x0a, - 0x4f, 0x30, 0xe4, 0xf5, 0xbe, 0x17, 0x89, 0x1e, 0x79, 0x7b, 0xa5, 0x4a, 0x5e, 0x81, 0x21, 0xb6, - 0x88, 0x51, 0xab, 0x49, 0x5d, 0x65, 0x18, 0x3f, 0x86, 0x87, 0x2c, 0xf4, 0x81, 0xb2, 0x4f, 0x47, - 0x40, 0xa9, 0xfe, 0x9f, 0xf9, 0xf4, 0xdc, 0x53, 0xc7, 0x30, 0xd4, 0x0f, 0x78, 0x8b, 0x1c, 0x53, - 0xb0, 0xe2, 0x21, 0x14, 0x6c, 0x0d, 0xce, 0x94, 0x8d, 0xb6, 0x69, 0x95, 0xf1, 0xa7, 0xbb, 0x38, - 0x57, 0xc6, 0xa9, 0x43, 0x7a, 0x0a, 0x18, 0x43, 0x8b, 0xef, 0xe1, 0x71, 0x89, 0x19, 0xaa, 0xa1, - 0x73, 0x5c, 0xa3, 0xbd, 0xa6, 0x37, 0x9a, 0x3c, 0x6d, 0x93, 0x16, 0x67, 0xaa, 0xfe, 0x4c, 0x7e, - 0x97, 0x74, 0x59, 0x8f, 0xa3, 0xf4, 0xd5, 0xaf, 0xe5, 0x7b, 0x67, 0x2c, 0x7b, 0x2c, 0x85, 0xf2, - 0x27, 0xf9, 0x94, 0xfc, 0x61, 0x87, 0x92, 0xc4, 0x35, 0x18, 0xe4, 0x6c, 0x02, 0x37, 0x5e, 0x9c, - 0xcd, 0xb8, 0xb2, 0xe2, 0x2c, 0xea, 0xa3, 0xc9, 0x12, 0x9c, 0x2b, 0xaf, 0xad, 0xd1, 0xa6, 0x17, - 0x46, 0xa8, 0x5e, 0x0a, 0x03, 0xbe, 0xf2, 0x88, 0xbc, 0x02, 0x1f, 0x46, 0xb8, 0xc6, 0xc0, 0x26, - 0xa9, 0xe5, 0xc8, 0x0a, 0x5c, 0x88, 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, 0xab, 0x20, 0xa7, 0x59, 0x7b, 0x7c, 0x1d, 0xae, 0x6e, 0x46, 0xdc, 0xac, 0xf7, - 0x3a, 0x64, 0x5e, 0x11, 0xd1, 0x4a, 0x8c, 0xae, 0xe3, 0x7b, 0x24, 0x06, 0xd1, 0x12, 0x10, 0x28, - 0xaf, 0x43, 0x01, 0x25, 0xa9, 0x42, 0xb1, 0xec, 0xac, 0x73, 0xf3, 0x76, 0xb7, 0x07, 0x5c, 0xba, - 0xb3, 0xee, 0xa6, 0x3f, 0xe0, 0x62, 0x2c, 0xd4, 0x3f, 0x9b, 0xef, 0x91, 0x19, 0xed, 0xb1, 0x9c, - 0x44, 0xfe, 0x7c, 0x3e, 0x2b, 0xc7, 0xd9, 0x49, 0x75, 0x1d, 0xfb, 0x90, 0x85, 0x73, 0xb2, 0xfd, - 0xea, 0x8e, 0x50, 0x38, 0x7f, 0x94, 0xcf, 0x4a, 0xd8, 0x76, 0x2a, 0x9c, 0x83, 0x4d, 0x90, 0xa9, - 0x22, 0x7d, 0x8c, 0x6d, 0x6e, 0x59, 0x15, 0xfa, 0x0f, 0xe8, 0x3e, 0x95, 0x26, 0xd2, 0xd3, 0x21, - 0x7c, 0x28, 0x2d, 0xfd, 0xfb, 0xf9, 0xcc, 0xc4, 0x84, 0xa7, 0x32, 0x3d, 0x4a, 0x99, 0x9e, 0x0e, - 0xfd, 0x43, 0x0d, 0xfd, 0x54, 0x99, 0x9e, 0x8e, 0xfd, 0x43, 0xe9, 0xe9, 0x1f, 0xe6, 0xd3, 0x53, - 0x6f, 0x1e, 0x83, 0x92, 0x1e, 0x85, 0x87, 0xa3, 0xdf, 0x0d, 0xc5, 0x43, 0x75, 0x43, 0xff, 0x21, - 0xac, 0xa8, 0xa4, 0x40, 0x8f, 0x6d, 0xd4, 0x7f, 0xbf, 0x0a, 0xf4, 0x08, 0x86, 0xfc, 0xe3, 0x2c, - 0xd0, 0x9f, 0x2a, 0x24, 0xd3, 0xcd, 0x3e, 0xae, 0x6b, 0x92, 0x73, 0xc0, 0x35, 0xc9, 0x2f, 0x47, - 0xde, 0x81, 0x33, 0xa1, 0x2c, 0xe5, 0x28, 0x63, 0x78, 0x7d, 0xd4, 0x64, 0xa8, 0xc6, 0xfb, 0x0c, - 0x27, 0xc2, 0xe1, 0xc4, 0xa9, 0xd5, 0xef, 0x15, 0x92, 0x39, 0x7b, 0x4f, 0x7b, 0xe3, 0x80, 0xbd, - 0x71, 0x17, 0x2e, 0xcc, 0x74, 0x1d, 0x87, 0x5a, 0x5e, 0x7a, 0xa7, 0xe0, 0xe1, 0x7d, 0x93, 0x53, - 0x34, 0x92, 0x9d, 0x93, 0x51, 0x98, 0xb1, 0x15, 0xaf, 0x1b, 0xe2, 0x6c, 0x07, 0x42, 0xb6, 0x5d, - 0x4e, 0x91, 0xc6, 0x36, 0xbd, 0xb0, 0xfa, 0xfb, 0xf9, 0x64, 0x96, 0xe5, 0xd3, 0xae, 0x3f, 0x58, - 0xd7, 0xab, 0x5f, 0x2e, 0xc4, 0x33, 0x4d, 0x9f, 0x2e, 0x10, 0x07, 0xef, 0x0e, 0x5f, 0x92, 0x38, - 0x6e, 0xa4, 0xaf, 0xf0, 0xe1, 0x59, 0x5f, 0xe1, 0xe3, 0xd5, 0x5f, 0x2d, 0xc6, 0xb3, 0x76, 0x9f, - 0x76, 0xc7, 0xf1, 0x75, 0x07, 0x59, 0x86, 0x73, 0x62, 0x6e, 0xf3, 0x41, 0x98, 0x6e, 0x42, 0xcc, - 0x5f, 0x3c, 0x6b, 0x9d, 0x98, 0x16, 0xbb, 0x2e, 0x75, 0x1a, 0x9e, 0xee, 0x3e, 0x68, 0x60, 0x7e, - 0x0a, 0x2d, 0xb5, 0x20, 0x63, 0x28, 0x66, 0xb5, 0x28, 0xc3, 0xc1, 0x90, 0xa1, 0x3f, 0x21, 0x26, - 0x18, 0xa6, 0x15, 0x54, 0x7f, 0x33, 0x07, 0xe3, 0xf1, 0xcf, 0x21, 0x53, 0x30, 0xc8, 0x7e, 0x07, - 0xcf, 0xee, 0xa5, 0x74, 0xda, 0x9c, 0x23, 0xbf, 0x92, 0xf7, 0x69, 0xc8, 0xab, 0x30, 0x84, 0xde, - 0x0f, 0x58, 0x20, 0x1f, 0x46, 0x3b, 0x08, 0x0b, 0x60, 0x8e, 0x57, 0x5e, 0x2c, 0x24, 0x25, 0x6f, - 0xc2, 0x70, 0x35, 0x74, 0xf3, 0x12, 0x77, 0x5e, 0xe8, 0x5d, 0x2a, 0x95, 0x0c, 0x09, 0x34, 0x99, - 0x5a, 0xfd, 0x76, 0x3e, 0x9e, 0x5d, 0xfe, 0x54, 0xd5, 0x0f, 0xa6, 0xea, 0xcf, 0x2f, 0x72, 0x55, - 0xbf, 0x63, 0x5a, 0x06, 0x79, 0x02, 0xce, 0xdf, 0xad, 0xcf, 0x6a, 0x8d, 0x3b, 0xd5, 0xa5, 0x4a, - 0xe3, 0xee, 0x52, 0xbd, 0x36, 0x3b, 0x53, 0x9d, 0xab, 0xce, 0x56, 0xc6, 0xfb, 0xc8, 0x59, 0x38, - 0x13, 0xa2, 0xe6, 0xef, 0x2e, 0x96, 0x97, 0xc6, 0x73, 0x64, 0x02, 0x46, 0x43, 0xe0, 0xf4, 0xf2, - 0xca, 0x78, 0xfe, 0xf9, 0x4f, 0xc0, 0x30, 0xba, 0xb7, 0xf1, 0xeb, 0x78, 0x32, 0x02, 0x83, 0xcb, - 0xd3, 0xf5, 0x59, 0xed, 0x1e, 0x32, 0x01, 0x28, 0x55, 0x66, 0x97, 0x18, 0xc3, 0xdc, 0xf3, 0xff, - 0x4f, 0x0e, 0xa0, 0x3e, 0xb7, 0x52, 0x13, 0x84, 0xc3, 0x30, 0x50, 0x5d, 0xba, 0x57, 0x5e, 0xa8, - 0x32, 0xba, 0x41, 0x28, 0x2e, 0xd7, 0x66, 0x59, 0x0d, 0x43, 0xd0, 0x3f, 0xb3, 0xb0, 0x5c, 0x9f, - 0x1d, 0xcf, 0x33, 0xa0, 0x36, 0x5b, 0xae, 0x8c, 0x17, 0x18, 0xf0, 0xbe, 0x56, 0x5d, 0x99, 0x1d, - 0x2f, 0xb2, 0x3f, 0x17, 0xea, 0x2b, 0xe5, 0x95, 0xf1, 0x7e, 0xf6, 0xe7, 0x1c, 0xfe, 0x59, 0x62, - 0xcc, 0xea, 0xb3, 0x2b, 0xf8, 0x63, 0x80, 0x35, 0x61, 0xce, 0xff, 0x35, 0xc8, 0x50, 0x8c, 0x75, - 0xa5, 0xaa, 0x8d, 0x0f, 0xb1, 0x1f, 0x8c, 0x25, 0xfb, 0x01, 0xac, 0x71, 0xda, 0xec, 0xe2, 0xf2, - 0xbd, 0xd9, 0xf1, 0x61, 0xc6, 0x6b, 0xf1, 0x0e, 0x03, 0x8f, 0xb0, 0x3f, 0xb5, 0x45, 0xf6, 0xe7, - 0x28, 0xe3, 0xa4, 0xcd, 0x96, 0x17, 0x6a, 0xe5, 0x95, 0xf9, 0xf1, 0x31, 0xd6, 0x1e, 0xe4, 0x79, - 0x86, 0x97, 0x5c, 0x2a, 0x2f, 0xce, 0x8e, 0x8f, 0x0b, 0x9a, 0xca, 0x42, 0x75, 0xe9, 0xce, 0xf8, - 0x04, 0x36, 0xe4, 0xbd, 0x45, 0xfc, 0x41, 0x58, 0x01, 0xfc, 0xeb, 0xec, 0xf3, 0x3f, 0x08, 0xa5, - 0xe5, 0x3a, 0x8e, 0x82, 0x8b, 0x70, 0x76, 0xb9, 0xde, 0x58, 0x79, 0xaf, 0x36, 0x1b, 0x93, 0xf7, - 0x04, 0x8c, 0xfa, 0x88, 0x85, 0xea, 0xd2, 0xdd, 0xcf, 0x71, 0x69, 0xfb, 0xa0, 0xc5, 0xf2, 0xcc, - 0x72, 0x7d, 0x3c, 0xcf, 0x7a, 0xc5, 0x07, 0xdd, 0xaf, 0x2e, 0x55, 0x96, 0xef, 0xd7, 0xc7, 0x0b, - 0xcf, 0x3f, 0x84, 0x11, 0x9e, 0xa7, 0x73, 0xd9, 0x31, 0xd7, 0x4d, 0x8b, 0x3c, 0x05, 0x4f, 0x54, - 0x66, 0xef, 0x55, 0x67, 0x66, 0x1b, 0xcb, 0x5a, 0xf5, 0x56, 0x75, 0x29, 0x56, 0xd3, 0x79, 0x98, - 0x88, 0xa2, 0xcb, 0xb5, 0xea, 0x78, 0x8e, 0x5c, 0x00, 0x12, 0x05, 0xdf, 0x2e, 0x2f, 0xce, 0x8d, - 0xe7, 0x89, 0x02, 0xe7, 0xa2, 0xf0, 0xea, 0xd2, 0xca, 0xdd, 0xa5, 0xd9, 0xf1, 0xc2, 0xf3, 0x7f, - 0x25, 0x07, 0xe7, 0x53, 0x63, 0x39, 0x13, 0x15, 0x9e, 0x9e, 0x5d, 0x28, 0xd7, 0x57, 0xaa, 0x33, - 0xf5, 0xd9, 0xb2, 0x36, 0x33, 0xdf, 0x98, 0x29, 0xaf, 0xcc, 0xde, 0x5a, 0xd6, 0xde, 0x6b, 0xdc, - 0x9a, 0x5d, 0x9a, 0xd5, 0xca, 0x0b, 0xe3, 0x7d, 0xe4, 0x39, 0x98, 0xcc, 0xa0, 0xa9, 0xcf, 0xce, - 0xdc, 0xd5, 0xaa, 0x2b, 0xef, 0x8d, 0xe7, 0xc8, 0xb3, 0xf0, 0x54, 0x26, 0x11, 0xfb, 0x3d, 0x9e, - 0x27, 0x4f, 0xc3, 0xa5, 0x2c, 0x92, 0x77, 0x17, 0xc6, 0x0b, 0xcf, 0xff, 0x42, 0x0e, 0x48, 0x32, - 0x18, 0x2f, 0x79, 0x06, 0x2e, 0x33, 0xbd, 0x68, 0x64, 0x37, 0xf0, 0x59, 0x78, 0x2a, 0x95, 0x42, - 0x6a, 0xde, 0x24, 0x3c, 0x99, 0x41, 0x22, 0x1a, 0x77, 0x19, 0x94, 0x74, 0x02, 0x6c, 0xda, 0x6f, - 0xe4, 0xe0, 0x7c, 0xaa, 0x07, 0x0c, 0xb9, 0x0a, 0x1f, 0x2b, 0x57, 0x16, 0x59, 0xdf, 0xcc, 0xac, - 0x54, 0x97, 0x97, 0xea, 0x8d, 0xc5, 0xb9, 0x72, 0x83, 0x69, 0xdf, 0xdd, 0x7a, 0xac, 0x37, 0xaf, - 0x80, 0xda, 0x83, 0x72, 0x66, 0xbe, 0xbc, 0x74, 0x8b, 0x0d, 0x3f, 0xf2, 0x31, 0x78, 0x26, 0x93, - 0x6e, 0x76, 0xa9, 0x3c, 0xbd, 0x30, 0x5b, 0x19, 0xcf, 0x93, 0x8f, 0xc3, 0xb3, 0x99, 0x54, 0x95, - 0x6a, 0x9d, 0x93, 0x15, 0xa6, 0x2b, 0xdf, 0xfe, 0x9f, 0x9e, 0xee, 0xfb, 0xf6, 0x1f, 0x3f, 0x9d, - 0xfb, 0xa3, 0x3f, 0x7e, 0x3a, 0xf7, 0x4f, 0xfe, 0xf8, 0xe9, 0xdc, 0xe7, 0x6f, 0xec, 0x27, 0xc8, - 0x32, 0x9f, 0xb6, 0x56, 0x4b, 0x78, 0x1b, 0xfd, 0xf2, 0xbf, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x95, - 0xe6, 0x93, 0xbe, 0xac, 0x81, 0x01, 0x00, + // 17055 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x78, 0x24, 0x49, + 0x72, 0x18, 0x86, 0x7e, 0xa0, 0x01, 0x04, 0x9e, 0x93, 0xf3, 0xaa, 0x99, 0x9d, 0x5d, 0xec, 0xd6, + 0xde, 0xcd, 0xcd, 0xec, 0xed, 0x62, 0x6e, 0x67, 0x67, 0x77, 0x6f, 0x5f, 0xb7, 0xd7, 0x40, 0x03, + 0x83, 0x9e, 0xc1, 0xa3, 0xb7, 0x1a, 0x33, 0x73, 0x7b, 0xe4, 0x5d, 0xb3, 0xd0, 0x95, 0x03, 0xd4, + 0x4e, 0x77, 0x55, 0xb3, 0xaa, 0x7a, 0x30, 0x58, 0xf9, 0xc1, 0x93, 0x29, 0x8a, 0x14, 0x8f, 0xa7, + 0xf3, 0xd1, 0xe4, 0x51, 0x94, 0x6c, 0x1f, 0xf5, 0xb0, 0x29, 0x8a, 0xe2, 0x99, 0x32, 0x4d, 0xf2, + 0x48, 0x9e, 0xf5, 0x38, 0xd9, 0x3e, 0x91, 0x9f, 0xf9, 0x91, 0xb2, 0xad, 0x4f, 0x9f, 0x2d, 0xe3, + 0x64, 0xda, 0xfa, 0x83, 0xcf, 0xf6, 0x47, 0xdb, 0xfc, 0xac, 0xb3, 0x2c, 0xfb, 0xd3, 0x97, 0x91, + 0x59, 0x55, 0x59, 0xaf, 0xc6, 0x73, 0x85, 0xc5, 0x0e, 0xfe, 0xcc, 0xa0, 0x23, 0x22, 0x23, 0xb3, + 0x22, 0x23, 0x33, 0x23, 0x33, 0x23, 0x23, 0xe0, 0xaa, 0x47, 0x5b, 0xb4, 0x63, 0x3b, 0xde, 0xb5, + 0x16, 0x5d, 0xd3, 0x9b, 0x9b, 0xd7, 0xbc, 0xcd, 0x0e, 0x75, 0xaf, 0xd1, 0x87, 0xd4, 0xf2, 0xfc, + 0xff, 0xa6, 0x3a, 0x8e, 0xed, 0xd9, 0xa4, 0xc4, 0x7f, 0x5d, 0x3c, 0xb3, 0x66, 0xaf, 0xd9, 0x08, + 0xba, 0xc6, 0xfe, 0xe2, 0xd8, 0x8b, 0x97, 0xd6, 0x6c, 0x7b, 0xad, 0x45, 0xaf, 0xe1, 0xaf, 0xd5, + 0xee, 0xfd, 0x6b, 0xae, 0xe7, 0x74, 0x9b, 0x9e, 0xc0, 0x4e, 0xc6, 0xb1, 0x9e, 0xd9, 0xa6, 0xae, + 0xa7, 0xb7, 0x3b, 0x82, 0xe0, 0xa9, 0x38, 0xc1, 0x86, 0xa3, 0x77, 0x3a, 0xd4, 0x11, 0x95, 0x5f, + 0xfc, 0x44, 0xd0, 0x4e, 0xbd, 0xd9, 0xa4, 0xae, 0xdb, 0x32, 0x5d, 0xef, 0xda, 0xc3, 0x17, 0xa5, + 0x5f, 0x82, 0xf0, 0x99, 0xf4, 0x0f, 0xc2, 0x7f, 0x05, 0xc9, 0x0b, 0xe9, 0x24, 0x7e, 0x8d, 0xb1, + 0xaa, 0xd5, 0xaf, 0xe5, 0x61, 0x70, 0x91, 0x7a, 0xba, 0xa1, 0x7b, 0x3a, 0xb9, 0x04, 0xfd, 0x55, + 0xcb, 0xa0, 0x8f, 0x94, 0xdc, 0xd3, 0xb9, 0x2b, 0x85, 0xe9, 0xd2, 0xf6, 0xd6, 0x64, 0x9e, 0x9a, + 0x1a, 0x07, 0x92, 0x27, 0xa1, 0xb8, 0xb2, 0xd9, 0xa1, 0x4a, 0xfe, 0xe9, 0xdc, 0x95, 0xa1, 0xe9, + 0xa1, 0xed, 0xad, 0xc9, 0x7e, 0x14, 0x9a, 0x86, 0x60, 0xf2, 0x0c, 0xe4, 0xab, 0x15, 0xa5, 0x80, + 0xc8, 0x53, 0xdb, 0x5b, 0x93, 0xa3, 0x5d, 0xd3, 0x78, 0xde, 0x6e, 0x9b, 0x1e, 0x6d, 0x77, 0xbc, + 0x4d, 0x2d, 0x5f, 0xad, 0x90, 0xcb, 0x50, 0x9c, 0xb1, 0x0d, 0xaa, 0x14, 0x91, 0x88, 0x6c, 0x6f, + 0x4d, 0x8e, 0x35, 0x6d, 0x83, 0x4a, 0x54, 0x88, 0x27, 0x9f, 0x85, 0xe2, 0x8a, 0xd9, 0xa6, 0x4a, + 0xff, 0xd3, 0xb9, 0x2b, 0xc3, 0xd7, 0x2f, 0x4e, 0x71, 0xf1, 0x4d, 0xf9, 0xe2, 0x9b, 0x5a, 0xf1, + 0xe5, 0x3b, 0x3d, 0xf1, 0xdd, 0xad, 0xc9, 0xbe, 0xed, 0xad, 0xc9, 0x22, 0x13, 0xf9, 0x57, 0xbf, + 0x37, 0x99, 0xd3, 0xb0, 0x24, 0x79, 0x13, 0x86, 0x67, 0x5a, 0x5d, 0xd7, 0xa3, 0xce, 0x92, 0xde, + 0xa6, 0x4a, 0x09, 0x2b, 0xbc, 0xb8, 0xbd, 0x35, 0x79, 0xae, 0xc9, 0xc1, 0x0d, 0x4b, 0x6f, 0xcb, + 0x15, 0xcb, 0xe4, 0xea, 0x6f, 0xe6, 0x60, 0xbc, 0x4e, 0x5d, 0xd7, 0xb4, 0xad, 0x40, 0x36, 0x1f, + 0x87, 0x21, 0x01, 0xaa, 0x56, 0x50, 0x3e, 0x43, 0xd3, 0x03, 0xdb, 0x5b, 0x93, 0x05, 0xd7, 0x34, + 0xb4, 0x10, 0x43, 0x3e, 0x05, 0x03, 0xf7, 0x4c, 0x6f, 0x7d, 0x71, 0xae, 0x2c, 0xe4, 0x74, 0x6e, + 0x7b, 0x6b, 0x92, 0x6c, 0x98, 0xde, 0x7a, 0xa3, 0x7d, 0x5f, 0x97, 0x2a, 0xf4, 0xc9, 0xc8, 0x02, + 0x4c, 0xd4, 0x1c, 0xf3, 0xa1, 0xee, 0xd1, 0xdb, 0x74, 0xb3, 0x66, 0xb7, 0xcc, 0xe6, 0xa6, 0x90, + 0xe2, 0xd3, 0xdb, 0x5b, 0x93, 0x97, 0x3a, 0x1c, 0xd7, 0x78, 0x40, 0x37, 0x1b, 0x1d, 0xc4, 0x4a, + 0x4c, 0x12, 0x25, 0xd5, 0xdf, 0x2a, 0xc1, 0xc8, 0x1d, 0x97, 0x3a, 0x41, 0xbb, 0x2f, 0x43, 0x91, + 0xfd, 0x16, 0x4d, 0x46, 0x99, 0x77, 0x5d, 0xea, 0xc8, 0x32, 0x67, 0x78, 0x72, 0x15, 0xfa, 0x17, + 0xec, 0x35, 0xd3, 0x12, 0xcd, 0x3e, 0xbd, 0xbd, 0x35, 0x39, 0xde, 0x62, 0x00, 0x89, 0x92, 0x53, + 0x90, 0xcf, 0xc0, 0x48, 0xb5, 0xcd, 0x74, 0xc8, 0xb6, 0x74, 0xcf, 0x76, 0x44, 0x6b, 0x51, 0xba, + 0xa6, 0x04, 0x97, 0x0a, 0x46, 0xe8, 0xc9, 0xeb, 0x00, 0xe5, 0x7b, 0x75, 0xcd, 0x6e, 0xd1, 0xb2, + 0xb6, 0x24, 0x94, 0x01, 0x4b, 0xeb, 0x1b, 0x6e, 0xc3, 0xb1, 0x5b, 0xb4, 0xa1, 0x3b, 0x72, 0xb5, + 0x12, 0x35, 0x99, 0x85, 0xb1, 0x32, 0x8e, 0x0a, 0x8d, 0xfe, 0x70, 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, 0x5e, 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, 0x7f, 0xbf, 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, 0xcd, + 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, 0xb3, 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, 0x11, 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, 0x9b, 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, 0x91, 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, 0xad, 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, 0x3b, 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, 0xcc, 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, 0x14, 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, 0xcb, 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, 0xad, 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, 0x4b, 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, 0xb0, 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, 0x48, 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, 0xbd, 0x00, 0xc3, 0x82, 0x94, + 0x2d, 0xdd, 0x27, 0x0a, 0x7e, 0x10, 0x05, 0x4f, 0x55, 0xd4, 0xd2, 0x61, 0x29, 0xaa, 0xfa, 0xe5, + 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, 0x33, 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, 0x8f, + 0xf3, 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, 0x93, 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, 0xcc, 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, 0x2f, 0x15, 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, 0x37, 0x8b, 0x4c, 0x7b, 0x5d, 0xf3, 0xfd, 0xc7, 0x7e, 0x5d, 0x08, 0x07, 0x4c, + 0xff, 0x3e, 0x06, 0xcc, 0x63, 0x73, 0x60, 0xa7, 0xfe, 0xf3, 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, 0xc0, 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, 0x3a, 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, 0x4e, 0x41, 0xb2, 0xd9, 0xb8, 0xc4, 0x1f, 0xc3, 0x5b, 0x81, 0x97, 0xa0, 0x30, 0x5d, 0x9b, + 0x13, 0x13, 0xe0, 0x69, 0xbf, 0xa8, 0xa4, 0x2a, 0xb1, 0x72, 0x8c, 0x9a, 0x5c, 0x82, 0x62, 0x8d, + 0xa9, 0x4f, 0x09, 0xd5, 0x63, 0x70, 0x7b, 0x6b, 0xb2, 0xd8, 0x61, 0xfa, 0x83, 0x50, 0xc4, 0xb2, + 0xcd, 0x0c, 0xdf, 0x31, 0x71, 0x6c, 0xb8, 0x8f, 0xb9, 0x04, 0xc5, 0xb2, 0xb3, 0xf6, 0x50, 0xcc, + 0x5a, 0x88, 0xd5, 0x9d, 0xb5, 0x87, 0x1a, 0x42, 0xc9, 0x35, 0x00, 0x8d, 0x7a, 0x5d, 0xc7, 0xc2, + 0xe7, 0x2e, 0x43, 0x78, 0xfe, 0x86, 0xb3, 0xa1, 0x83, 0xd0, 0x46, 0xd3, 0x36, 0xa8, 0x26, 0x91, + 0xa8, 0x7f, 0x2d, 0xbc, 0xd8, 0xa9, 0x98, 0xee, 0x83, 0x93, 0x2e, 0xdc, 0x43, 0x17, 0xea, 0xe2, + 0x88, 0x33, 0xd9, 0x49, 0x93, 0xd0, 0x3f, 0xd7, 0xd2, 0xd7, 0x5c, 0xec, 0x43, 0xe1, 0xbb, 0x76, + 0x9f, 0x01, 0x34, 0x0e, 0x8f, 0xf5, 0xd3, 0xe0, 0xce, 0xfd, 0xf4, 0xf5, 0xfe, 0x60, 0xb4, 0x2d, + 0x51, 0x6f, 0xc3, 0x76, 0x4e, 0xba, 0x6a, 0xb7, 0x5d, 0x75, 0x19, 0x06, 0xea, 0x4e, 0x53, 0x3a, + 0xba, 0xc0, 0xfd, 0x80, 0xeb, 0x34, 0xf9, 0xb1, 0x85, 0x8f, 0x64, 0x74, 0x15, 0xd7, 0x43, 0xba, + 0x81, 0x90, 0xce, 0x70, 0x3d, 0x41, 0x27, 0x90, 0x82, 0xae, 0x66, 0x3b, 0x9e, 0xe8, 0xb8, 0x80, + 0xae, 0x63, 0x3b, 0x9e, 0xe6, 0x23, 0xc9, 0x27, 0x01, 0x56, 0x66, 0x6a, 0xbe, 0x73, 0xff, 0x50, + 0xe8, 0x7b, 0x28, 0xbc, 0xfa, 0x35, 0x09, 0x4d, 0x56, 0x60, 0x68, 0xb9, 0x43, 0x1d, 0xbe, 0x15, + 0xe2, 0x0f, 0x58, 0x3e, 0x11, 0x13, 0xad, 0xe8, 0xf7, 0x29, 0xf1, 0x7f, 0x40, 0xce, 0xd7, 0x17, + 0xdb, 0xff, 0xa9, 0x85, 0x8c, 0xc8, 0xab, 0x50, 0x2a, 0x73, 0x3b, 0x6f, 0x18, 0x59, 0x06, 0x22, + 0xc3, 0x2d, 0x28, 0x47, 0xf1, 0x3d, 0xbb, 0x8e, 0x7f, 0x6b, 0x82, 0x5c, 0xbd, 0x0a, 0x13, 0xf1, + 0x6a, 0xc8, 0x30, 0x0c, 0xcc, 0x2c, 0x2f, 0x2d, 0xcd, 0xce, 0xac, 0x4c, 0xf4, 0x91, 0x41, 0x28, + 0xd6, 0x67, 0x97, 0x2a, 0x13, 0x39, 0xf5, 0x97, 0xa5, 0x19, 0x84, 0xa9, 0xd6, 0xc9, 0xd5, 0xf0, + 0x81, 0xee, 0x5b, 0x26, 0xf0, 0x3e, 0x14, 0x4f, 0x0c, 0xda, 0xa6, 0xe7, 0x51, 0x43, 0xac, 0x12, + 0x78, 0x5f, 0xe8, 0x3d, 0xd2, 0x12, 0x78, 0xf2, 0x3c, 0x8c, 0x22, 0x4c, 0x5c, 0x11, 0xf2, 0xfd, + 0xb1, 0x28, 0xe0, 0x3c, 0xd2, 0xa2, 0x48, 0xf5, 0xf7, 0xc2, 0xdb, 0xe1, 0x05, 0xaa, 0x1f, 0xd7, + 0x1b, 0xc5, 0x0f, 0x49, 0x7f, 0xa9, 0xff, 0xb2, 0xc8, 0x9f, 0x9c, 0xf0, 0xf7, 0x89, 0x47, 0x21, + 0xca, 0xf0, 0x48, 0xb7, 0xb0, 0x87, 0x23, 0xdd, 0xe7, 0xa1, 0xb4, 0x48, 0xbd, 0x75, 0xdb, 0x77, + 0xfc, 0x42, 0x0f, 0xbd, 0x36, 0x42, 0x64, 0x0f, 0x3d, 0x4e, 0x43, 0x1e, 0x00, 0xf1, 0x1f, 0x1f, + 0x06, 0x8e, 0xdf, 0xfe, 0x11, 0xf2, 0xf9, 0xc4, 0x3e, 0xa5, 0x8e, 0x4f, 0x94, 0xd1, 0xa7, 0xff, + 0x4c, 0xe0, 0x58, 0x2e, 0x79, 0x62, 0xfd, 0x8b, 0xad, 0xc9, 0x12, 0xa7, 0xd1, 0x52, 0xd8, 0x92, + 0x77, 0x60, 0x68, 0x71, 0xae, 0x2c, 0x1e, 0x22, 0x72, 0xaf, 0x88, 0x0b, 0x81, 0x14, 0x7d, 0x44, + 0x20, 0x12, 0x7c, 0xdf, 0xd3, 0xbe, 0xaf, 0x27, 0xdf, 0x21, 0x86, 0x5c, 0x98, 0xb6, 0xf0, 0x97, + 0x42, 0xe2, 0x74, 0x21, 0xd0, 0x96, 0xe8, 0xfb, 0xa1, 0xb8, 0xac, 0x38, 0x36, 0xa6, 0x2d, 0x83, + 0x07, 0x18, 0xdd, 0xcb, 0x70, 0xaa, 0xdc, 0xe9, 0xb4, 0x4c, 0x6a, 0xa0, 0xbe, 0x68, 0xdd, 0x16, + 0x75, 0x85, 0xcb, 0x0f, 0x3e, 0x3e, 0xd1, 0x39, 0xb2, 0x81, 0xcf, 0x5f, 0x1b, 0x4e, 0x37, 0xea, + 0x9f, 0x99, 0x2c, 0xab, 0xfe, 0x6c, 0x1e, 0xce, 0xcd, 0x38, 0x54, 0xf7, 0xe8, 0xe2, 0x5c, 0xb9, + 0xdc, 0x45, 0x1f, 0xb9, 0x56, 0x8b, 0x5a, 0x6b, 0x47, 0x33, 0xac, 0xdf, 0x80, 0xb1, 0xa0, 0x01, + 0xf5, 0xa6, 0xdd, 0xa1, 0xf2, 0x43, 0xae, 0xa6, 0x8f, 0x69, 0xb8, 0x0c, 0xa5, 0xc5, 0x48, 0xc9, + 0x6d, 0x38, 0x1d, 0x40, 0xca, 0xad, 0x96, 0xbd, 0xa1, 0xd1, 0xae, 0xcb, 0x1d, 0x71, 0x07, 0xb9, + 0x23, 0x6e, 0xc8, 0x41, 0x67, 0xf8, 0x86, 0xc3, 0x08, 0xb4, 0xb4, 0x52, 0xea, 0x37, 0x0a, 0x70, + 0xfe, 0xae, 0xde, 0x32, 0x8d, 0x50, 0x34, 0x1a, 0x75, 0x3b, 0xb6, 0xe5, 0xd2, 0x63, 0x34, 0x4a, + 0x23, 0x43, 0xa1, 0x78, 0x28, 0x43, 0x21, 0xd9, 0x45, 0xfd, 0x07, 0xee, 0xa2, 0xd2, 0xbe, 0xba, + 0xe8, 0x7f, 0xcd, 0xc1, 0x84, 0xff, 0xd0, 0x40, 0x7e, 0x34, 0x2e, 0x79, 0xc1, 0xe3, 0x11, 0x62, + 0xcc, 0xef, 0x1a, 0xf1, 0xa4, 0x0e, 0x03, 0xb3, 0x8f, 0x3a, 0xa6, 0x43, 0xdd, 0x5d, 0x38, 0x8d, + 0x3f, 0x29, 0x8e, 0x4b, 0x4e, 0x51, 0x5e, 0x24, 0x71, 0x52, 0xc2, 0xc1, 0xf8, 0x7c, 0x90, 0x3f, + 0xb5, 0x98, 0xf6, 0x5f, 0xc2, 0xf3, 0xe7, 0x83, 0xe2, 0x49, 0x46, 0xe4, 0x3d, 0x68, 0x48, 0x4a, + 0x9e, 0x85, 0xc2, 0xca, 0xca, 0x82, 0x98, 0x49, 0x31, 0x02, 0x81, 0xe7, 0xc9, 0xef, 0x23, 0x19, + 0x56, 0xfd, 0x27, 0x79, 0x00, 0xa6, 0x0a, 0x7c, 0xb8, 0x1e, 0x89, 0x12, 0x4e, 0xc3, 0xa0, 0x2f, + 0x70, 0xa1, 0x86, 0xc1, 0x2b, 0x81, 0x78, 0x47, 0xc4, 0xeb, 0x0e, 0x5e, 0x84, 0x4c, 0xfa, 0x8e, + 0xe4, 0xfc, 0x1e, 0x00, 0x77, 0x36, 0xe8, 0x48, 0xee, 0xbb, 0x8f, 0x7f, 0x12, 0x86, 0xc4, 0x8c, + 0x67, 0x47, 0xce, 0xff, 0x9b, 0x3e, 0x50, 0x0b, 0xf1, 0xb1, 0xa9, 0xb5, 0x74, 0x80, 0x85, 0xd8, + 0x17, 0x2f, 0xef, 0x95, 0x13, 0xf1, 0x1e, 0xb2, 0x78, 0xbf, 0x22, 0xc4, 0xcb, 0x5f, 0x0c, 0x1d, + 0x5b, 0xf1, 0x1e, 0xda, 0xd9, 0xb7, 0xfa, 0x0f, 0x73, 0x40, 0x58, 0xb3, 0x6a, 0xba, 0xeb, 0x6e, + 0xd8, 0x8e, 0xc1, 0x9d, 0xd3, 0x8f, 0x44, 0x30, 0x87, 0x77, 0x5f, 0xf9, 0x9d, 0x41, 0x38, 0x1d, + 0x71, 0xfc, 0x3d, 0xe6, 0x93, 0xd5, 0xd5, 0xe8, 0x68, 0xea, 0xf5, 0xea, 0xe5, 0x63, 0xf2, 0x85, + 0x68, 0x7f, 0xe4, 0xc1, 0x9b, 0x74, 0x13, 0xfa, 0x02, 0x8c, 0x88, 0x1f, 0x6c, 0x85, 0xf6, 0x6f, + 0xba, 0x70, 0x94, 0xba, 0x0c, 0xa0, 0x45, 0xd0, 0xe4, 0x65, 0x18, 0x62, 0x03, 0x66, 0x0d, 0x83, + 0x95, 0x0c, 0x84, 0x2f, 0x4a, 0x0c, 0x1f, 0x28, 0xaf, 0x27, 0x01, 0xa5, 0xf4, 0x6e, 0x69, 0x70, + 0x17, 0xef, 0x96, 0xbe, 0x08, 0xc3, 0x65, 0xcb, 0xb2, 0x3d, 0xdc, 0xa4, 0xbb, 0xe2, 0x6a, 0x22, + 0xd3, 0x2a, 0x7f, 0x16, 0x1f, 0xe3, 0x87, 0xf4, 0xa9, 0x66, 0xb9, 0xcc, 0x90, 0x5c, 0xf7, 0x5f, + 0xc5, 0x50, 0x47, 0x78, 0x95, 0xe3, 0xf5, 0x8c, 0x23, 0x60, 0xc9, 0x47, 0x31, 0xd8, 0x79, 0xa3, + 0x35, 0xc7, 0xee, 0xd8, 0x2e, 0x35, 0xb8, 0xa0, 0x86, 0xc3, 0xd0, 0x06, 0x1d, 0x81, 0xc0, 0x77, + 0x73, 0x91, 0xc0, 0x21, 0x91, 0x22, 0xe4, 0x3e, 0x9c, 0xf1, 0x2f, 0x8a, 0x83, 0x17, 0x8a, 0xd5, + 0x8a, 0xab, 0x8c, 0xe0, 0xab, 0x24, 0x12, 0x57, 0x86, 0x6a, 0x65, 0xfa, 0x29, 0xff, 0x5a, 0xc4, + 0x7f, 0xe2, 0xd8, 0x30, 0x0d, 0xb9, 0xab, 0x53, 0xf9, 0x91, 0x1f, 0x82, 0xe1, 0x45, 0xfd, 0x51, + 0xa5, 0x2b, 0xce, 0x5e, 0x46, 0x77, 0x7f, 0xfb, 0xd2, 0xd6, 0x1f, 0x35, 0x0c, 0x51, 0x2e, 0x66, + 0x53, 0xc8, 0x2c, 0x49, 0x03, 0xce, 0xd5, 0x1c, 0xbb, 0x6d, 0x7b, 0xd4, 0x88, 0x3d, 0xf6, 0x1b, + 0x0f, 0x5f, 0x07, 0x77, 0x04, 0x45, 0xa3, 0xc7, 0xab, 0xbf, 0x0c, 0x36, 0xa4, 0x0d, 0xe3, 0x65, + 0xd7, 0xed, 0xb6, 0x69, 0x78, 0x43, 0x35, 0xb1, 0xe3, 0x67, 0x7c, 0x42, 0x78, 0x2d, 0x3f, 0xa1, + 0x63, 0x51, 0x7e, 0x41, 0xd5, 0xf0, 0x4c, 0xb9, 0x46, 0xfc, 0x96, 0x38, 0xef, 0x5b, 0xc5, 0xc1, + 0xb1, 0x89, 0x71, 0xed, 0x7c, 0xb2, 0x31, 0x2b, 0xa6, 0xd7, 0xa2, 0xea, 0xb7, 0x73, 0x00, 0xa1, + 0x80, 0xc9, 0x0b, 0xd1, 0x88, 0x48, 0xb9, 0xf0, 0xa2, 0x43, 0x44, 0x4b, 0x88, 0x84, 0x40, 0x22, + 0x97, 0xa0, 0x88, 0x11, 0x35, 0xf2, 0xe1, 0xc1, 0xea, 0x03, 0xd3, 0x32, 0x34, 0x84, 0x32, 0xac, + 0xf4, 0xf4, 0x1d, 0xb1, 0x78, 0xa9, 0xcf, 0xad, 0xc2, 0x0a, 0x8c, 0xd7, 0xbb, 0xab, 0x7e, 0xdd, + 0xd2, 0x3b, 0x3e, 0x0c, 0xec, 0xe1, 0x76, 0x57, 0x83, 0xc7, 0xaf, 0x91, 0xb0, 0x29, 0xd1, 0x22, + 0xea, 0x37, 0x73, 0xb1, 0x59, 0xf0, 0x08, 0x17, 0xbd, 0x8f, 0x25, 0xfd, 0x34, 0x92, 0xd3, 0x92, + 0xfa, 0x87, 0x05, 0x18, 0xae, 0xd9, 0x8e, 0x27, 0x42, 0x94, 0x1c, 0xef, 0x55, 0x48, 0xda, 0x2b, + 0x15, 0xf7, 0xb0, 0x57, 0xba, 0x04, 0x45, 0xc9, 0x45, 0x99, 0xdf, 0x8b, 0x18, 0x86, 0xa3, 0x21, + 0xf4, 0x03, 0x7e, 0x72, 0x91, 0xbc, 0x04, 0x1d, 0x38, 0xb0, 0xab, 0xc1, 0x8f, 0xe4, 0x01, 0x3e, + 0xf7, 0xe2, 0x8b, 0x8f, 0x71, 0x97, 0xaa, 0x7f, 0x31, 0x07, 0xe3, 0xe2, 0x6a, 0x51, 0x8a, 0x86, + 0x36, 0xe0, 0x5f, 0x0a, 0xcb, 0x33, 0x09, 0x07, 0x69, 0x3e, 0x8e, 0x2d, 0x5a, 0xb3, 0x8f, 0x4c, + 0x0f, 0x6f, 0x57, 0xa4, 0x70, 0x68, 0x54, 0xc0, 0xe4, 0x45, 0xcb, 0xa7, 0x23, 0x2f, 0xf8, 0x97, + 0xa6, 0x85, 0x70, 0xa5, 0x66, 0x05, 0x66, 0x53, 0x2f, 0x4e, 0xd5, 0x5f, 0x2f, 0x42, 0x71, 0xf6, + 0x11, 0x6d, 0x1e, 0xf3, 0xae, 0x91, 0x8e, 0x62, 0x8b, 0x07, 0x3c, 0x8a, 0xdd, 0x8f, 0x17, 0xc8, + 0xdb, 0x61, 0x7f, 0x96, 0xa2, 0xd5, 0xc7, 0x7a, 0x3e, 0x5e, 0xbd, 0xdf, 0xd3, 0xc7, 0xcf, 0x89, + 0xe8, 0xbf, 0x28, 0x40, 0xa1, 0x3e, 0x53, 0x3b, 0xd1, 0x9b, 0x23, 0xd5, 0x9b, 0xde, 0xb7, 0xec, + 0x6a, 0x70, 0x71, 0x36, 0x18, 0xfa, 0xb5, 0xc6, 0xee, 0xc8, 0xfe, 0xa4, 0x00, 0x63, 0xf5, 0xb9, + 0x95, 0x9a, 0x74, 0x76, 0x7d, 0x9b, 0xfb, 0x1e, 0xa2, 0x17, 0x1c, 0xef, 0xd2, 0x4b, 0x09, 0x0b, + 0xec, 0x4e, 0xd5, 0xf2, 0x5e, 0xb9, 0x71, 0x57, 0x6f, 0x75, 0x29, 0x1e, 0x16, 0x71, 0x4f, 0x65, + 0xd7, 0x7c, 0x9f, 0x7e, 0x03, 0x43, 0x23, 0xf8, 0x0c, 0xc8, 0x1b, 0x50, 0xb8, 0x23, 0x7c, 0x48, + 0xb2, 0xf8, 0xbc, 0x74, 0x9d, 0xf3, 0x61, 0x93, 0x60, 0xa1, 0x6b, 0x1a, 0xc8, 0x81, 0x95, 0x62, + 0x85, 0x6f, 0x0a, 0x93, 0x61, 0x57, 0x85, 0xd7, 0xfc, 0xc2, 0x37, 0xab, 0x15, 0x52, 0x87, 0xe1, + 0x1a, 0x75, 0xda, 0x26, 0x76, 0x94, 0x3f, 0x67, 0xf7, 0x66, 0xc2, 0xf6, 0x56, 0xc3, 0x9d, 0xb0, + 0x10, 0x32, 0x93, 0xb9, 0x90, 0x77, 0x01, 0xb8, 0x55, 0xb5, 0xcb, 0x08, 0x9b, 0x4f, 0xe2, 0x4e, + 0x85, 0x1b, 0xc3, 0x29, 0x56, 0xa9, 0xc4, 0x8c, 0x3c, 0x80, 0x89, 0x45, 0xdb, 0x30, 0xef, 0x9b, + 0xdc, 0x59, 0x14, 0x2b, 0x28, 0xed, 0xec, 0xa2, 0xc5, 0x8c, 0xdf, 0xb6, 0x54, 0x2e, 0xad, 0x9a, + 0x04, 0x63, 0xf5, 0x6f, 0xf7, 0x43, 0x91, 0x75, 0xfb, 0xc9, 0xf8, 0x3d, 0xc8, 0xf8, 0x2d, 0xc3, + 0xc4, 0x3d, 0xdb, 0x79, 0x60, 0x5a, 0x6b, 0x81, 0x1f, 0xbf, 0xd8, 0x4d, 0xa3, 0xef, 0xd1, 0x06, + 0xc7, 0x35, 0x02, 0x97, 0x7f, 0x2d, 0x41, 0xbe, 0xc3, 0x08, 0x7e, 0x0d, 0x80, 0xbf, 0xce, 0x47, + 0x9a, 0xc1, 0x30, 0x9c, 0x07, 0x7f, 0xbb, 0x8f, 0x4f, 0x03, 0xe4, 0x70, 0x1e, 0x21, 0x31, 0xb9, + 0xea, 0x7b, 0x6f, 0x0c, 0xe1, 0x4b, 0x01, 0x3c, 0x36, 0x40, 0xef, 0x0d, 0xd9, 0x08, 0xe0, 0x7e, + 0x1c, 0x35, 0x00, 0xe9, 0x46, 0x0c, 0x62, 0x82, 0x88, 0x4c, 0x0e, 0x22, 0x80, 0x5e, 0xca, 0x85, + 0x98, 0x26, 0xf1, 0x20, 0xaf, 0xc4, 0xae, 0xec, 0x49, 0x84, 0x5b, 0xe6, 0x8d, 0x7d, 0xe8, 0xf2, + 0x35, 0xb2, 0x93, 0xcb, 0x97, 0xfa, 0x37, 0x0a, 0x30, 0xcc, 0xb8, 0xd5, 0xbb, 0xed, 0xb6, 0xee, + 0x6c, 0x9e, 0x28, 0xf2, 0x41, 0x14, 0xb9, 0x01, 0xa7, 0x64, 0x17, 0x7f, 0x66, 0xba, 0xfa, 0xc1, + 0x98, 0x82, 0x03, 0xab, 0x38, 0x01, 0xb7, 0x2d, 0x71, 0xde, 0xf7, 0x04, 0x18, 0x4f, 0x43, 0x5c, + 0x2d, 0xc9, 0x4b, 0xfd, 0x99, 0x1c, 0x4c, 0xc4, 0xa1, 0x81, 0xee, 0xe7, 0x52, 0x75, 0xff, 0x79, + 0x18, 0x12, 0x97, 0xfe, 0xba, 0x21, 0x7c, 0x10, 0xc7, 0xb6, 0xb7, 0x26, 0x01, 0x5f, 0x5c, 0x37, + 0x1c, 0xaa, 0x1b, 0x5a, 0x48, 0x40, 0x5e, 0x86, 0x11, 0xfc, 0x71, 0xcf, 0x31, 0x3d, 0x8f, 0xf2, + 0xce, 0x28, 0xf2, 0x7b, 0x0c, 0x5e, 0x60, 0x83, 0x23, 0xb4, 0x08, 0x99, 0xfa, 0xbb, 0x79, 0x18, + 0xaa, 0x77, 0x57, 0xdd, 0x4d, 0xd7, 0xa3, 0xed, 0x63, 0xae, 0x43, 0xfe, 0xb1, 0x42, 0x31, 0xf5, + 0x58, 0xe1, 0x59, 0x7f, 0x68, 0x49, 0xe7, 0xed, 0xc1, 0xc6, 0xc0, 0xf7, 0xa3, 0x0c, 0xb5, 0xa8, + 0xb4, 0x77, 0x2d, 0x52, 0xff, 0x56, 0x1e, 0x26, 0xf8, 0x75, 0x73, 0xc5, 0x74, 0x9b, 0x87, 0xf0, + 0x04, 0xe6, 0xe8, 0x65, 0x7a, 0x30, 0x17, 0x8d, 0x5d, 0x3c, 0x2c, 0x52, 0xbf, 0x94, 0x87, 0xe1, + 0x72, 0xd7, 0x5b, 0x2f, 0x7b, 0x38, 0xbf, 0x3d, 0x96, 0x7b, 0xe4, 0x7f, 0x90, 0x83, 0x71, 0xd6, + 0x90, 0x15, 0xfb, 0x01, 0xb5, 0x0e, 0xe1, 0xb8, 0x5e, 0x3e, 0x76, 0xcf, 0xef, 0xf3, 0xd8, 0xdd, + 0x97, 0x65, 0x61, 0x6f, 0xb2, 0xc4, 0x4b, 0x26, 0xcd, 0x6e, 0xd1, 0xe3, 0xfd, 0x19, 0x87, 0x78, + 0xc9, 0xe4, 0x0b, 0xe4, 0x10, 0x2e, 0x35, 0x3f, 0x5a, 0x02, 0x39, 0x84, 0x13, 0xd9, 0x8f, 0x86, + 0x40, 0xbe, 0x93, 0x83, 0xa1, 0x69, 0xdb, 0x3b, 0xe6, 0x03, 0x5f, 0x7c, 0xc5, 0xf1, 0x56, 0x73, + 0xff, 0x2b, 0x8e, 0xb7, 0x6e, 0xaa, 0x3f, 0x97, 0x87, 0x33, 0x22, 0x82, 0xbf, 0x38, 0x03, 0x3b, + 0x99, 0x8e, 0xc5, 0x60, 0x4b, 0x8a, 0xe6, 0x64, 0x1e, 0x12, 0xa2, 0xf9, 0xc5, 0x02, 0x9c, 0xc1, + 0x80, 0xc3, 0x6c, 0x47, 0xf5, 0x11, 0xb0, 0x45, 0x48, 0x33, 0xea, 0x3a, 0xb0, 0x98, 0xe2, 0x3a, + 0xf0, 0x2f, 0xb6, 0x26, 0x5f, 0x59, 0x33, 0xbd, 0xf5, 0xee, 0xea, 0x54, 0xd3, 0x6e, 0x5f, 0x5b, + 0x73, 0xf4, 0x87, 0x26, 0xbf, 0x34, 0xd7, 0x5b, 0xd7, 0xc2, 0xc4, 0x3a, 0x1d, 0x53, 0xa4, 0xc9, + 0xa9, 0xe3, 0x4e, 0x89, 0x71, 0xf5, 0x9d, 0x0e, 0x5c, 0x80, 0x5b, 0xb6, 0x69, 0x09, 0x4f, 0x5c, + 0x6e, 0xe8, 0xd6, 0xb7, 0xb7, 0x26, 0xcf, 0xbe, 0x67, 0x9b, 0x56, 0x23, 0xee, 0x8e, 0xbb, 0xd7, + 0xfa, 0x42, 0xd6, 0x9a, 0x54, 0x8d, 0xfa, 0xdf, 0xe4, 0xe0, 0x42, 0x54, 0x8b, 0x3f, 0x0a, 0xb6, + 0xe3, 0x5f, 0xc8, 0xc3, 0xd9, 0x9b, 0x28, 0x9c, 0xc0, 0xfd, 0xe9, 0x64, 0xde, 0x12, 0x83, 0x33, + 0x45, 0x36, 0x27, 0x16, 0x65, 0xb6, 0x6c, 0x4e, 0x26, 0x75, 0x21, 0x9b, 0xff, 0x3a, 0x07, 0xa7, + 0x97, 0xab, 0x95, 0x99, 0x8f, 0xc8, 0x88, 0x4a, 0x7e, 0xcf, 0x31, 0x37, 0x38, 0x13, 0xdf, 0x73, + 0xcc, 0x4d, 0xcf, 0xaf, 0xe5, 0xe1, 0x74, 0xbd, 0xbc, 0xb8, 0xf0, 0x51, 0x99, 0xc1, 0x67, 0x64, + 0x5f, 0x5d, 0xff, 0x10, 0x4c, 0xd8, 0x02, 0xf2, 0x67, 0xde, 0xbd, 0x9e, 0xed, 0xc3, 0x9b, 0x14, + 0xca, 0x31, 0x9f, 0xba, 0x0f, 0x45, 0x28, 0x4c, 0xf3, 0x23, 0xd4, 0xc7, 0x5c, 0xf3, 0xff, 0x7e, + 0x09, 0x86, 0x6f, 0x77, 0x57, 0xa9, 0x70, 0xe9, 0x7a, 0xac, 0x4f, 0x7e, 0xaf, 0xc3, 0xb0, 0x10, + 0x03, 0xde, 0x70, 0x48, 0x21, 0x27, 0x45, 0x08, 0x21, 0x1e, 0xd5, 0x4b, 0x26, 0x22, 0x97, 0xa0, + 0x78, 0x97, 0x3a, 0xab, 0xf2, 0x6b, 0xec, 0x87, 0xd4, 0x59, 0xd5, 0x10, 0x4a, 0x16, 0xc2, 0x87, + 0x26, 0xe5, 0x5a, 0x15, 0xd3, 0x1d, 0x89, 0x4b, 0x43, 0xcc, 0xdf, 0x14, 0x78, 0x8b, 0xea, 0x1d, + 0x93, 0x27, 0x4a, 0x92, 0x23, 0x41, 0xc4, 0x4b, 0x92, 0x25, 0x38, 0x25, 0xbb, 0x0b, 0xf2, 0x5c, + 0x3f, 0x83, 0x29, 0xec, 0xd2, 0xb2, 0xfc, 0x24, 0x8b, 0x92, 0xb7, 0x61, 0xc4, 0x07, 0xa2, 0xe3, + 0xe3, 0x50, 0x98, 0x60, 0x22, 0x60, 0x15, 0xcb, 0x07, 0x10, 0x29, 0x20, 0x33, 0xc0, 0x4b, 0x0c, + 0x48, 0x61, 0x10, 0x73, 0x24, 0x8d, 0x14, 0x20, 0x2f, 0x23, 0x03, 0x7c, 0x1c, 0x85, 0x0e, 0x53, + 0xc3, 0xf8, 0x54, 0x19, 0x2f, 0x80, 0x1c, 0x01, 0xe7, 0x0f, 0xd2, 0x23, 0x64, 0x64, 0x19, 0x20, + 0x74, 0x6c, 0x11, 0x61, 0x3f, 0xf6, 0xec, 0x72, 0x23, 0xb1, 0x90, 0x6f, 0xf2, 0x46, 0xf7, 0x73, + 0x93, 0xa7, 0xfe, 0x6c, 0x01, 0x86, 0xcb, 0x9d, 0x4e, 0x30, 0x14, 0x5e, 0x80, 0x52, 0xb9, 0xd3, + 0xb9, 0xa3, 0x55, 0xe5, 0x04, 0x00, 0x7a, 0xa7, 0xd3, 0xe8, 0x3a, 0xa6, 0xec, 0x49, 0xcd, 0x89, + 0xc8, 0x0c, 0x8c, 0x96, 0x3b, 0x9d, 0x5a, 0x77, 0xb5, 0x65, 0x36, 0xa5, 0xfc, 0x65, 0x3c, 0xc3, + 0x63, 0xa7, 0xd3, 0xe8, 0x20, 0x26, 0x9e, 0xc4, 0x2e, 0x5a, 0x86, 0x7c, 0x11, 0x83, 0x65, 0x89, + 0xf4, 0x59, 0x3c, 0x41, 0x8f, 0x1a, 0x84, 0xfe, 0x0f, 0xdb, 0x36, 0x15, 0x10, 0xf1, 0x14, 0x09, + 0x97, 0xfc, 0xc4, 0x16, 0xac, 0xa2, 0x44, 0x9a, 0xac, 0x90, 0x25, 0xf9, 0x14, 0x0c, 0x94, 0x3b, + 0x1d, 0xe9, 0xb6, 0x0a, 0x1d, 0xdb, 0x58, 0xa9, 0x78, 0x86, 0x42, 0x41, 0x26, 0x3e, 0x4b, 0xdc, + 0x6f, 0xdb, 0x8e, 0x87, 0x43, 0x6a, 0x34, 0xfc, 0x2c, 0xff, 0x42, 0xdc, 0x96, 0xe3, 0xd3, 0x68, + 0xd1, 0x32, 0x17, 0xdf, 0x84, 0xb1, 0x68, 0x8b, 0xf7, 0x94, 0xa7, 0xe1, 0xfb, 0x39, 0x94, 0xca, + 0x31, 0x7f, 0x4e, 0xf0, 0x12, 0x14, 0xca, 0x9d, 0x8e, 0x98, 0xd4, 0x4e, 0xa7, 0x74, 0x6a, 0x3c, + 0xfa, 0x40, 0xb9, 0xd3, 0xf1, 0x3f, 0xfd, 0x98, 0xbf, 0x4b, 0xda, 0xd7, 0xa7, 0x7f, 0x87, 0x7f, + 0xfa, 0xf1, 0x7e, 0x33, 0xa4, 0xfe, 0x7a, 0x01, 0xc6, 0xcb, 0x9d, 0xce, 0x49, 0x7e, 0x87, 0xc3, + 0x8a, 0x71, 0xf0, 0x22, 0x80, 0x34, 0xc7, 0x0e, 0x04, 0xaf, 0x26, 0x87, 0xa5, 0xf9, 0x55, 0xc9, + 0x69, 0x12, 0x91, 0xaf, 0x7e, 0x83, 0x7b, 0x52, 0xbf, 0x2f, 0x15, 0x70, 0xe2, 0x3b, 0xee, 0xf1, + 0xda, 0x3e, 0x2c, 0xdd, 0x26, 0xfa, 0xa0, 0xb4, 0xa7, 0x3e, 0xf8, 0xbb, 0x91, 0xc1, 0x83, 0xf9, + 0x02, 0x4e, 0x7a, 0xa1, 0xff, 0x40, 0xb6, 0xf5, 0x98, 0x2c, 0x4c, 0x11, 0x44, 0xca, 0xcf, 0x99, + 0x26, 0x42, 0x9a, 0x35, 0x19, 0xaa, 0x61, 0x1a, 0x5a, 0x8c, 0xd6, 0xef, 0xc3, 0x81, 0x3d, 0xf5, + 0xe1, 0x56, 0x1e, 0xc3, 0x16, 0x04, 0x21, 0xd1, 0x0e, 0xbe, 0x45, 0xb9, 0x06, 0xc0, 0xdd, 0x17, + 0x02, 0xff, 0xfc, 0x51, 0x1e, 0xfd, 0x88, 0xa7, 0x52, 0x13, 0xd1, 0x8f, 0x42, 0x92, 0xc0, 0xdd, + 0xa9, 0x90, 0xea, 0xee, 0x74, 0x15, 0x06, 0x35, 0x7d, 0xe3, 0x9d, 0x2e, 0x75, 0x36, 0x85, 0x4d, + 0xc4, 0x23, 0x8e, 0xea, 0x1b, 0x8d, 0x1f, 0x66, 0x40, 0x2d, 0x40, 0x13, 0x35, 0x88, 0x7b, 0x21, + 0xb9, 0x95, 0xf0, 0x83, 0xf6, 0x20, 0xda, 0xc5, 0x7e, 0x14, 0x9d, 0xbc, 0x0e, 0x85, 0xf2, 0xbd, + 0xba, 0x90, 0x6c, 0xd0, 0xb5, 0xe5, 0x7b, 0x75, 0x21, 0xaf, 0xcc, 0xb2, 0xf7, 0xea, 0xea, 0x97, + 0xf2, 0x40, 0x92, 0x94, 0xe4, 0x15, 0x18, 0x42, 0xe8, 0x1a, 0xd3, 0x19, 0x39, 0x07, 0xef, 0x86, + 0xdb, 0x70, 0x10, 0x1a, 0xb1, 0x10, 0x7d, 0x52, 0xf2, 0x1a, 0x66, 0x39, 0x17, 0x59, 0x20, 0x23, + 0x39, 0x78, 0x37, 0x5c, 0x3f, 0x2f, 0x78, 0x2c, 0xc9, 0xb9, 0x20, 0x46, 0xe3, 0xf2, 0x5e, 0x7d, + 0xde, 0x76, 0x3d, 0x21, 0x6a, 0x6e, 0x5c, 0x6e, 0xb8, 0x98, 0xfc, 0x39, 0x62, 0x5c, 0x72, 0x32, + 0x4c, 0x60, 0x77, 0xaf, 0xce, 0x5f, 0x88, 0x19, 0x9a, 0xdd, 0xf2, 0xad, 0x52, 0x9e, 0xc0, 0x6e, + 0xc3, 0x6d, 0xf0, 0xd7, 0x65, 0x06, 0xa6, 0x57, 0x8f, 0x24, 0xb0, 0x8b, 0x94, 0x52, 0x7f, 0x6a, + 0x10, 0x26, 0x2a, 0xba, 0xa7, 0xaf, 0xea, 0x2e, 0x95, 0xb6, 0xe4, 0xe3, 0x3e, 0xcc, 0xff, 0x1c, + 0x49, 0x0e, 0xc6, 0x6a, 0xca, 0xd7, 0xc4, 0x0b, 0x90, 0x37, 0x42, 0xbe, 0x41, 0x7a, 0x61, 0x39, + 0x5f, 0xe1, 0x6a, 0xa3, 0x23, 0xc0, 0x5a, 0x82, 0x90, 0x3c, 0x0f, 0xc3, 0x3e, 0x8c, 0xed, 0x22, + 0x0a, 0xa1, 0xce, 0x18, 0xab, 0x6c, 0x13, 0xa1, 0xc9, 0x68, 0xf2, 0x1a, 0x8c, 0xf8, 0x3f, 0x25, + 0xfb, 0x9c, 0x27, 0x5f, 0x5c, 0x4d, 0x6c, 0xc1, 0x64, 0x52, 0xb9, 0x28, 0xce, 0x6f, 0xfd, 0x91, + 0xa2, 0xb1, 0xfc, 0x86, 0x11, 0x52, 0xf2, 0xc3, 0x30, 0xe6, 0xff, 0x16, 0xbb, 0x0e, 0xee, 0x7d, + 0xf8, 0x7c, 0x90, 0xbd, 0x3d, 0x26, 0xd6, 0xa9, 0x28, 0x39, 0xdf, 0x7f, 0x3c, 0xe1, 0xa7, 0xec, + 0x33, 0x56, 0x93, 0xdb, 0x8f, 0x58, 0x05, 0xa4, 0x0a, 0xa7, 0x7c, 0x48, 0xa8, 0xa1, 0x03, 0xe1, + 0xb6, 0xd3, 0x58, 0x6d, 0xa4, 0x2a, 0x69, 0xb2, 0x14, 0x69, 0xc1, 0xa5, 0x08, 0xd0, 0x70, 0xd7, + 0xcd, 0xfb, 0x9e, 0xd8, 0x33, 0x8a, 0xf0, 0xdf, 0x22, 0x47, 0x6b, 0xc0, 0x95, 0xd3, 0xf8, 0xc9, + 0x96, 0xa3, 0x89, 0xd9, 0x7a, 0x72, 0x23, 0x75, 0x38, 0xe3, 0xe3, 0x6f, 0xce, 0xd4, 0x6a, 0x8e, + 0xfd, 0x1e, 0x6d, 0x7a, 0xd5, 0x8a, 0xd8, 0x73, 0x63, 0x58, 0x48, 0x63, 0xb5, 0xb1, 0xd6, 0xec, + 0x30, 0xa5, 0x60, 0xb8, 0x28, 0xf3, 0xd4, 0xc2, 0xe4, 0x2e, 0x9c, 0x95, 0xe0, 0x52, 0x26, 0x78, + 0x08, 0x0f, 0x05, 0x04, 0xd7, 0xf4, 0x64, 0xf0, 0xe9, 0xc5, 0xc9, 0x9b, 0x30, 0xea, 0x23, 0xf8, + 0x55, 0xe4, 0x30, 0x5e, 0x45, 0xe2, 0x90, 0x34, 0x56, 0x1b, 0xf1, 0x87, 0xcc, 0x51, 0x62, 0x59, + 0xa3, 0x56, 0x36, 0x3b, 0x54, 0xb8, 0x05, 0xfb, 0x1a, 0xe5, 0x6d, 0x76, 0x52, 0x95, 0x91, 0x91, + 0x92, 0xb7, 0x43, 0x8d, 0x5a, 0x76, 0xcc, 0x35, 0x93, 0x6f, 0xc7, 0xfd, 0xb7, 0xcb, 0xab, 0x0d, + 0x1b, 0x81, 0x69, 0xfa, 0xc1, 0xc9, 0x2f, 0x96, 0xe1, 0x74, 0x8a, 0x8e, 0xed, 0x69, 0xc7, 0xf8, + 0xe5, 0x7c, 0xd8, 0x88, 0x63, 0xbe, 0x6d, 0x9c, 0x86, 0x41, 0xff, 0x4b, 0x84, 0xf1, 0xa0, 0x64, + 0x0d, 0xcd, 0x38, 0x0f, 0x1f, 0x1f, 0x11, 0xc7, 0x31, 0xdf, 0x4a, 0x1e, 0x86, 0x38, 0xbe, 0x9b, + 0x0b, 0xc5, 0x71, 0xcc, 0xb7, 0x97, 0x3f, 0x59, 0x0c, 0xe7, 0xa4, 0x93, 0x3d, 0xe6, 0x61, 0x99, + 0xc9, 0xa1, 0x33, 0x6d, 0x69, 0x0f, 0x6f, 0x88, 0x65, 0xd5, 0x1c, 0xd8, 0x9f, 0x6a, 0x92, 0x37, + 0x61, 0xb8, 0x66, 0xbb, 0xde, 0x9a, 0x43, 0xdd, 0x5a, 0x90, 0xbe, 0x02, 0xdf, 0x9f, 0x77, 0x04, + 0xb8, 0xd1, 0x89, 0xcc, 0xfe, 0x32, 0xb9, 0xfa, 0x8f, 0x0a, 0x09, 0x6d, 0xe0, 0x86, 0xeb, 0xb1, + 0xd4, 0x86, 0x43, 0x18, 0xea, 0xe4, 0x7a, 0xb8, 0x0a, 0x72, 0x0b, 0xbf, 0x5f, 0x8a, 0xcd, 0xb9, + 0x2a, 0x0c, 0xfc, 0x28, 0x09, 0xf9, 0x01, 0x38, 0x1f, 0x01, 0xd4, 0x74, 0x47, 0x6f, 0x53, 0x2f, + 0x4c, 0x15, 0x8a, 0xd1, 0xd6, 0xfc, 0xd2, 0x8d, 0x4e, 0x80, 0x96, 0xd3, 0x8f, 0x66, 0x70, 0x90, + 0x54, 0x6b, 0x60, 0x0f, 0x7e, 0xda, 0x5f, 0x2f, 0x84, 0x86, 0x4e, 0x34, 0x6a, 0xb2, 0x46, 0xdd, + 0x6e, 0xcb, 0x7b, 0x7c, 0x3b, 0x78, 0x7f, 0x39, 0x69, 0xe6, 0x61, 0xbc, 0x7c, 0xff, 0x3e, 0x6d, + 0x7a, 0x7e, 0x30, 0x78, 0x57, 0xc4, 0xc9, 0xe4, 0x1b, 0x0f, 0x81, 0x12, 0xc1, 0xbd, 0xe5, 0x7e, + 0x8d, 0x17, 0x53, 0xff, 0x71, 0x11, 0x94, 0xc0, 0xf0, 0x0f, 0xde, 0x2b, 0x1e, 0xe1, 0x22, 0xfb, + 0xa1, 0xe8, 0x15, 0x13, 0x4e, 0x85, 0xc2, 0x10, 0x0f, 0xc5, 0x44, 0xf2, 0xfa, 0xc9, 0x38, 0xb3, + 0x90, 0x90, 0xef, 0x25, 0x2e, 0x8a, 0xbd, 0x04, 0x09, 0xdf, 0x83, 0x36, 0x5c, 0xce, 0x42, 0x4b, + 0x72, 0x25, 0x5f, 0xc9, 0xc1, 0x19, 0xbf, 0x53, 0x96, 0x57, 0x99, 0x51, 0x3d, 0x63, 0x77, 0xad, + 0xe0, 0x15, 0xd5, 0xeb, 0xd9, 0xd5, 0xf1, 0x4e, 0x9a, 0x4a, 0x2b, 0xcc, 0x5b, 0x12, 0x44, 0x84, + 0x09, 0x14, 0xc2, 0x46, 0x9a, 0x46, 0x13, 0x89, 0xb4, 0xd4, 0x7a, 0x2f, 0xde, 0x84, 0x0b, 0x99, + 0x2c, 0x77, 0x32, 0x62, 0xfb, 0x65, 0x23, 0xf6, 0xbf, 0xcb, 0x85, 0x13, 0x51, 0x4c, 0x48, 0x64, + 0x0a, 0x20, 0x04, 0x89, 0x6d, 0x2d, 0x3e, 0xd2, 0x0a, 0x85, 0xa6, 0x49, 0x14, 0x64, 0x19, 0x4a, + 0x42, 0x2c, 0x3c, 0x2d, 0xf7, 0x27, 0x77, 0xe8, 0x85, 0x29, 0x59, 0x0e, 0xb8, 0x65, 0x15, 0xdf, + 0x2c, 0xd8, 0x5c, 0x7c, 0x0d, 0x86, 0xf7, 0xfb, 0x5d, 0x5f, 0x29, 0x00, 0x91, 0xf7, 0xa0, 0x47, + 0x68, 0xa0, 0x1f, 0xe3, 0x29, 0xec, 0x0a, 0x0c, 0xb2, 0x4f, 0xc0, 0x44, 0x35, 0x52, 0x60, 0xea, + 0xae, 0x80, 0x69, 0x01, 0x36, 0x8c, 0x0a, 0x37, 0x90, 0x1e, 0x15, 0x4e, 0xfd, 0x99, 0x02, 0x9c, + 0x93, 0x3b, 0xa4, 0x42, 0x31, 0xd7, 0xc5, 0x49, 0xa7, 0x7c, 0x80, 0x9d, 0xa2, 0x42, 0x89, 0x6f, + 0x3d, 0x44, 0xd2, 0x11, 0x7e, 0x2c, 0x84, 0x10, 0x4d, 0x60, 0xd4, 0xff, 0x39, 0x0f, 0xa3, 0x81, + 0x79, 0xa7, 0x3b, 0xee, 0x63, 0xdc, 0x1d, 0x9f, 0x86, 0x51, 0x8c, 0xeb, 0xd5, 0xa6, 0x16, 0x8f, + 0x7d, 0xd5, 0x2f, 0x65, 0x09, 0xf2, 0x11, 0x22, 0x21, 0x5c, 0x84, 0x90, 0x69, 0x3f, 0xb7, 0xfc, + 0xa4, 0x68, 0x6b, 0xdc, 0xec, 0xe3, 0x70, 0xf5, 0x2f, 0x17, 0x60, 0xc4, 0x97, 0xf2, 0xb4, 0x79, + 0x5c, 0xef, 0x79, 0x8e, 0x56, 0xc8, 0xd7, 0x00, 0x6a, 0xb6, 0xe3, 0xe9, 0xad, 0xa5, 0x50, 0xf3, + 0xf1, 0x80, 0xb4, 0x83, 0x50, 0x5e, 0x46, 0x22, 0xc1, 0xf5, 0x2b, 0x34, 0xab, 0xf9, 0xc4, 0xc4, + 0xd7, 0xaf, 0x00, 0xaa, 0x49, 0x14, 0xea, 0x6f, 0xe7, 0x61, 0xdc, 0xef, 0xa4, 0xd9, 0x47, 0xb4, + 0xd9, 0x7d, 0x9c, 0xe7, 0xa6, 0xa8, 0xb4, 0xfb, 0x77, 0x94, 0xb6, 0xfa, 0x7f, 0x49, 0x13, 0xc9, + 0x4c, 0xcb, 0x3e, 0x99, 0x48, 0xfe, 0x75, 0xe8, 0xb8, 0xfa, 0xa3, 0x05, 0x38, 0xe3, 0x4b, 0x7d, + 0xae, 0x6b, 0xe1, 0xd1, 0xc2, 0x8c, 0xde, 0x6a, 0x3d, 0xce, 0xbb, 0xf1, 0x61, 0x5f, 0x10, 0xcb, + 0x22, 0x50, 0xa6, 0x48, 0xce, 0x79, 0x5f, 0x80, 0x1b, 0xb6, 0x69, 0x68, 0x32, 0x11, 0x79, 0x1b, + 0x46, 0xfc, 0x9f, 0x65, 0x67, 0xcd, 0xdf, 0x82, 0xe3, 0x45, 0x41, 0x50, 0x48, 0x77, 0x22, 0xd1, + 0x35, 0x22, 0x05, 0xd4, 0x2f, 0x0d, 0xc0, 0xc5, 0x7b, 0xa6, 0x65, 0xd8, 0x1b, 0xae, 0x9f, 0xdb, + 0xf5, 0xd8, 0x1f, 0x94, 0x1d, 0x75, 0x4e, 0xd7, 0x77, 0xe0, 0x6c, 0x5c, 0xa4, 0x4e, 0x10, 0x71, + 0x5f, 0xf4, 0xce, 0x06, 0x27, 0x68, 0xf8, 0x59, 0x5e, 0xc5, 0x6d, 0x9b, 0x96, 0x5e, 0x32, 0x9e, + 0x26, 0x76, 0x60, 0x37, 0x69, 0x62, 0x9f, 0x83, 0x52, 0xc5, 0x6e, 0xeb, 0xa6, 0x1f, 0x67, 0x09, + 0x47, 0x71, 0x50, 0x2f, 0x62, 0x34, 0x41, 0xc1, 0xf8, 0x8b, 0x8a, 0xb1, 0xcb, 0x86, 0x42, 0xfe, + 0x7e, 0x01, 0x66, 0xa5, 0x69, 0x32, 0x11, 0xb1, 0x61, 0x54, 0x54, 0x27, 0xee, 0xc6, 0x00, 0x37, + 0x4f, 0x2f, 0xfb, 0x32, 0xca, 0x56, 0xab, 0xa9, 0x48, 0x39, 0xbe, 0x8d, 0xe2, 0xd9, 0x6b, 0xc5, + 0xc7, 0xf0, 0x5b, 0x32, 0x2d, 0xca, 0x5f, 0x12, 0x02, 0x4e, 0x32, 0xc3, 0x49, 0x21, 0xe0, 0x2c, + 0x23, 0x13, 0x91, 0x59, 0x38, 0x85, 0x71, 0xd1, 0x83, 0xad, 0x14, 0x53, 0x89, 0x11, 0x34, 0x2a, + 0xf1, 0xca, 0x85, 0x87, 0x52, 0x67, 0x1f, 0xd7, 0x68, 0x0a, 0xb4, 0x96, 0x2c, 0x41, 0x2e, 0x40, + 0x61, 0x69, 0xa1, 0x8c, 0x77, 0x35, 0x83, 0x3c, 0x27, 0x99, 0xd5, 0xd2, 0x35, 0x06, 0xbb, 0xf8, + 0x59, 0x20, 0xc9, 0xcf, 0xd9, 0xd3, 0x7d, 0xcc, 0x7f, 0x29, 0x6d, 0xf9, 0x8e, 0xbb, 0x47, 0xcd, + 0x61, 0x4c, 0x84, 0x91, 0x74, 0x80, 0xfd, 0x1f, 0x64, 0x3a, 0xc0, 0xd2, 0xa1, 0xa6, 0x03, 0x54, + 0x7f, 0x25, 0x07, 0xa7, 0x12, 0xb9, 0x03, 0xc8, 0x4b, 0x00, 0x1c, 0x22, 0xc5, 0x68, 0xc5, 0x10, + 0x42, 0x61, 0x3e, 0x01, 0xb1, 0x3c, 0x86, 0x64, 0xe4, 0x1a, 0x0c, 0xf2, 0x5f, 0x22, 0x4a, 0x59, + 0xb2, 0x48, 0xb7, 0x6b, 0x1a, 0x5a, 0x40, 0x14, 0xd6, 0x82, 0x37, 0x92, 0x85, 0xd4, 0x22, 0xde, + 0x66, 0x27, 0xa8, 0x85, 0x91, 0xa9, 0x3f, 0x95, 0x87, 0x91, 0xa0, 0xc1, 0x65, 0xe3, 0xa8, 0x74, + 0xae, 0x24, 0xd2, 0x30, 0x14, 0x76, 0x4a, 0xc3, 0x10, 0x9b, 0x6f, 0x45, 0xde, 0x85, 0xc3, 0x7b, + 0x95, 0xf5, 0xd5, 0x3c, 0x8c, 0x07, 0xb5, 0x1e, 0xe1, 0xe5, 0xd7, 0x87, 0x48, 0x24, 0x5f, 0xc9, + 0x81, 0x32, 0x6d, 0xb6, 0x5a, 0xa6, 0xb5, 0x56, 0xb5, 0xee, 0xdb, 0x4e, 0x1b, 0x27, 0xc4, 0xa3, + 0x3b, 0xc2, 0x55, 0xff, 0x6c, 0x0e, 0x4e, 0x89, 0x06, 0xcd, 0xe8, 0x8e, 0x71, 0x74, 0xe7, 0x63, + 0xf1, 0x96, 0x1c, 0x9d, 0xbe, 0xa8, 0xdf, 0xca, 0x03, 0x2c, 0xd8, 0xcd, 0x07, 0xc7, 0xfc, 0x51, + 0xd7, 0x1b, 0x50, 0xe2, 0x6e, 0xf1, 0x42, 0x63, 0x4f, 0x89, 0xc7, 0x4b, 0xec, 0xd3, 0x38, 0x62, + 0x7a, 0x42, 0xcc, 0xc7, 0x25, 0xee, 0x59, 0xaf, 0xe4, 0x34, 0x51, 0x84, 0x55, 0xca, 0xe8, 0xc4, + 0x82, 0x11, 0x54, 0xca, 0x60, 0xd1, 0x4a, 0xb7, 0xb7, 0x26, 0x8b, 0x2d, 0xbb, 0xf9, 0x40, 0x43, + 0x7a, 0xf5, 0x5f, 0xe6, 0xb8, 0xec, 0x8e, 0xf9, 0xd3, 0x54, 0xff, 0xf3, 0x8b, 0x7b, 0xfc, 0xfc, + 0x3f, 0x97, 0x83, 0x33, 0x1a, 0x6d, 0xda, 0x0f, 0xa9, 0xb3, 0x39, 0x63, 0x1b, 0xf4, 0x26, 0xb5, + 0xa8, 0x73, 0x54, 0x23, 0xea, 0x77, 0x30, 0x6f, 0x4d, 0xd8, 0x98, 0x3b, 0x2e, 0x35, 0x8e, 0x4f, + 0x4e, 0x21, 0xf5, 0xd7, 0x06, 0x40, 0x49, 0xb5, 0x7a, 0x8f, 0xad, 0x39, 0x97, 0xb9, 0x95, 0x29, + 0x1e, 0xd6, 0x56, 0xa6, 0x7f, 0x6f, 0x5b, 0x99, 0xd2, 0x5e, 0xb7, 0x32, 0x03, 0xbb, 0xd9, 0xca, + 0xb4, 0xe3, 0x5b, 0x99, 0x41, 0xdc, 0xca, 0xbc, 0xd4, 0x73, 0x2b, 0x33, 0x6b, 0x19, 0xfb, 0xdc, + 0xc8, 0x1c, 0xdb, 0x7c, 0xd7, 0xfb, 0xd9, 0x81, 0x5d, 0x61, 0x93, 0x62, 0xd3, 0x76, 0x0c, 0x6a, + 0x88, 0x8d, 0x17, 0x9e, 0xfa, 0x3b, 0x02, 0xa6, 0x05, 0xd8, 0x44, 0xf2, 0xf0, 0xd1, 0xdd, 0x24, + 0x0f, 0x3f, 0x84, 0xfd, 0xd7, 0x97, 0xf3, 0x70, 0x6a, 0x86, 0x3a, 0x1e, 0x8f, 0x45, 0x7b, 0x18, + 0x2e, 0x71, 0x65, 0x18, 0x97, 0x18, 0xa2, 0x45, 0x9e, 0x0f, 0xdd, 0xfc, 0x9a, 0xd4, 0xf1, 0xe2, + 0x5e, 0x82, 0x71, 0x7a, 0x56, 0xbd, 0x9f, 0xc0, 0x4f, 0x8c, 0xdd, 0xa0, 0x7a, 0x1f, 0xce, 0x05, + 0x69, 0x8a, 0x5f, 0x5a, 0x40, 0x2f, 0xe5, 0xe4, 0x2b, 0xee, 0x3d, 0x27, 0x9f, 0xfa, 0xcb, 0x39, + 0xb8, 0xac, 0x51, 0x8b, 0x6e, 0xe8, 0xab, 0x2d, 0x2a, 0x35, 0x4b, 0xac, 0x0c, 0x6c, 0xd6, 0x30, + 0xdd, 0xb6, 0xee, 0x35, 0xd7, 0x0f, 0x24, 0xa3, 0x39, 0x18, 0x91, 0xe7, 0xaf, 0x3d, 0xcc, 0x6d, + 0x91, 0x72, 0xea, 0xaf, 0x15, 0x61, 0x60, 0xda, 0xf6, 0x6e, 0xd9, 0x07, 0x4c, 0x12, 0x19, 0x4e, + 0xf9, 0xf9, 0x3d, 0x9c, 0xf5, 0x7c, 0x0a, 0x2b, 0x97, 0xf2, 0x66, 0xa0, 0x0b, 0xe9, 0xaa, 0x9d, + 0xc8, 0x2f, 0xe2, 0x93, 0xed, 0x31, 0x3d, 0xe4, 0x2b, 0x30, 0x84, 0x21, 0x64, 0xa4, 0xd3, 0x58, + 0x74, 0xd0, 0xf6, 0x18, 0x30, 0x5e, 0x47, 0x48, 0x4a, 0x7e, 0x20, 0x12, 0x3c, 0xb7, 0x74, 0xf0, + 0x74, 0x92, 0x72, 0x1c, 0xdd, 0x97, 0xf8, 0x45, 0x1e, 0xb6, 0x49, 0x4a, 0xbd, 0x83, 0xa7, 0x28, + 0xb1, 0x26, 0x05, 0x84, 0x87, 0x98, 0xea, 0x71, 0x06, 0x46, 0xa7, 0x6d, 0x4f, 0x72, 0x06, 0x1e, + 0x0a, 0xdf, 0x92, 0x32, 0xc9, 0xa7, 0x7b, 0x02, 0x47, 0xcb, 0xa8, 0x7f, 0x52, 0x84, 0x11, 0xff, + 0xe7, 0x11, 0xe9, 0xce, 0x0b, 0x50, 0x9a, 0xb7, 0xa5, 0xec, 0x23, 0xe8, 0x40, 0xbc, 0x6e, 0xbb, + 0x31, 0xcf, 0x68, 0x41, 0xc4, 0xa4, 0xbe, 0x64, 0x1b, 0xb2, 0xfb, 0x3b, 0x4a, 0xdd, 0xb2, 0x8d, + 0xc4, 0x1b, 0xe4, 0x80, 0x90, 0x5c, 0x86, 0x22, 0xbe, 0x1c, 0x90, 0x0e, 0xf2, 0x63, 0xaf, 0x05, + 0x10, 0x2f, 0x69, 0x65, 0x69, 0xaf, 0x5a, 0x39, 0xb0, 0x5f, 0xad, 0x1c, 0x3c, 0x5c, 0xad, 0x7c, + 0x17, 0x46, 0xb0, 0x26, 0x3f, 0x79, 0xe1, 0xce, 0x0b, 0xeb, 0x05, 0xb1, 0xf6, 0x8d, 0xf2, 0x76, + 0x8b, 0x14, 0x86, 0xb8, 0xe4, 0x45, 0x58, 0xc5, 0x74, 0x17, 0x0e, 0xb0, 0x9d, 0xfe, 0x47, 0x39, + 0x18, 0xb8, 0x63, 0x3d, 0xb0, 0xec, 0x8d, 0x83, 0x69, 0xdc, 0x4b, 0x30, 0x2c, 0xd8, 0x48, 0xab, + 0x0b, 0x3e, 0x2b, 0xef, 0x72, 0x70, 0x03, 0x39, 0x69, 0x32, 0x15, 0x79, 0x33, 0x28, 0x84, 0x8f, + 0x83, 0x0a, 0x61, 0xfe, 0x1e, 0xbf, 0x50, 0x33, 0x9a, 0xc0, 0x43, 0x26, 0x27, 0x97, 0xa0, 0x58, + 0x61, 0x4d, 0x95, 0x02, 0xf9, 0xb2, 0xa6, 0x68, 0x08, 0x55, 0xbf, 0x5c, 0x84, 0xb1, 0xd8, 0xc1, + 0xd7, 0x73, 0x30, 0x24, 0x0e, 0x9e, 0x4c, 0x3f, 0xa3, 0x08, 0x3e, 0x1e, 0x0a, 0x80, 0xda, 0x20, + 0xff, 0xb3, 0x6a, 0x90, 0xcf, 0xc0, 0x80, 0xed, 0xe2, 0xa2, 0x88, 0xdf, 0x32, 0x16, 0x0e, 0xa1, + 0xe5, 0x3a, 0x6b, 0x3b, 0x1f, 0x1c, 0x82, 0x44, 0xd6, 0x48, 0xdb, 0xc5, 0x4f, 0xbb, 0x01, 0x43, + 0xba, 0xeb, 0x52, 0xaf, 0xe1, 0xe9, 0x6b, 0x72, 0x92, 0x91, 0x00, 0x28, 0x8f, 0x0e, 0x04, 0xae, + 0xe8, 0x6b, 0xe4, 0xb3, 0x30, 0xda, 0x74, 0x28, 0x2e, 0x9b, 0x7a, 0x8b, 0xb5, 0x52, 0x32, 0x6b, + 0x23, 0x08, 0xf9, 0xfe, 0x24, 0x44, 0x54, 0x0d, 0x72, 0x17, 0x46, 0xc5, 0xe7, 0x70, 0xcf, 0x7d, + 0x1c, 0x68, 0x63, 0xe1, 0x32, 0xc6, 0x45, 0xc2, 0x7d, 0xf7, 0xc5, 0x03, 0x0e, 0x99, 0x5c, 0xe6, + 0x6b, 0x48, 0xa4, 0x64, 0x19, 0xc8, 0x06, 0x5d, 0x6d, 0xe8, 0x5d, 0x6f, 0x9d, 0xd5, 0xc5, 0x63, + 0xe4, 0x8b, 0x6c, 0xa0, 0xf8, 0xea, 0x21, 0x89, 0x95, 0x1f, 0x83, 0x6c, 0xd0, 0xd5, 0x72, 0x04, + 0x49, 0xee, 0xc1, 0xd9, 0x64, 0x11, 0xf6, 0xc9, 0xfc, 0x72, 0xe0, 0xd9, 0xed, 0xad, 0xc9, 0xc9, + 0x54, 0x02, 0x89, 0xed, 0xe9, 0x04, 0xdb, 0xaa, 0x71, 0xab, 0x38, 0x38, 0x30, 0x31, 0xa8, 0x8d, + 0xb1, 0xb2, 0xbe, 0x09, 0x69, 0x1a, 0xea, 0xef, 0xe5, 0x98, 0xa9, 0xc8, 0x3e, 0x08, 0xd3, 0xa1, + 0x33, 0x5d, 0x6f, 0xef, 0x51, 0xd7, 0xdb, 0x61, 0xe2, 0xd2, 0x92, 0xdb, 0x63, 0x76, 0xd5, 0x04, + 0x96, 0x4c, 0x41, 0xc9, 0x90, 0x4f, 0xcd, 0xce, 0x45, 0x3b, 0xc1, 0xaf, 0x47, 0x13, 0x54, 0xe4, + 0x0a, 0x14, 0xd9, 0x92, 0x15, 0xdf, 0x32, 0xcb, 0xd6, 0x85, 0x86, 0x14, 0xea, 0x8f, 0xe4, 0x61, + 0x44, 0xfa, 0x9a, 0xeb, 0x07, 0xfa, 0x9c, 0xd7, 0x77, 0xd7, 0x4c, 0xdf, 0xe9, 0x05, 0xf7, 0x52, + 0x7e, 0x93, 0x6f, 0x04, 0xa2, 0xd8, 0xd5, 0x85, 0x94, 0x10, 0xcc, 0x2b, 0xe2, 0x43, 0x4b, 0xbb, + 0xdf, 0x3e, 0x32, 0xfa, 0x5b, 0xc5, 0xc1, 0xfc, 0x44, 0xe1, 0x56, 0x71, 0xb0, 0x38, 0xd1, 0x8f, + 0xc1, 0xbc, 0x30, 0x7e, 0x36, 0xdf, 0x9b, 0x5b, 0xf7, 0xcd, 0xb5, 0x63, 0xfe, 0x76, 0xe4, 0x70, + 0x03, 0x9d, 0xc5, 0x64, 0x73, 0xcc, 0x1f, 0x92, 0x7c, 0xa0, 0xb2, 0x39, 0x49, 0x74, 0x2a, 0x64, + 0xf3, 0x8f, 0x73, 0xa0, 0xa4, 0xca, 0xa6, 0x7c, 0x44, 0x7e, 0x10, 0x87, 0x97, 0xee, 0xf4, 0x8f, + 0xf2, 0x70, 0xaa, 0x6a, 0x79, 0x74, 0x8d, 0xef, 0x18, 0x8f, 0xf9, 0x54, 0x71, 0x1b, 0x86, 0xa5, + 0x8f, 0x11, 0x7d, 0xfe, 0x44, 0xb0, 0x1f, 0x0f, 0x51, 0x19, 0x9c, 0xe4, 0xd2, 0x87, 0xf7, 0x12, + 0x27, 0x2e, 0xe4, 0x63, 0x3e, 0xe7, 0x1c, 0x0f, 0x21, 0x1f, 0xf3, 0xc9, 0xeb, 0x43, 0x2a, 0xe4, + 0xff, 0x23, 0x07, 0xa7, 0x53, 0x2a, 0x27, 0x97, 0x61, 0xa0, 0xde, 0x5d, 0xc5, 0xd8, 0x5d, 0xb9, + 0xd0, 0x63, 0xd8, 0xed, 0xae, 0x62, 0xd8, 0x2e, 0xcd, 0x47, 0x92, 0x15, 0x7c, 0x5c, 0xbf, 0x5c, + 0xad, 0xcc, 0x08, 0xa9, 0xaa, 0x52, 0x98, 0x00, 0x06, 0x4e, 0xfb, 0xb2, 0xe0, 0x01, 0xbe, 0x6d, + 0x1a, 0xcd, 0xd8, 0x03, 0x7c, 0x56, 0x86, 0xfc, 0x20, 0x0c, 0x95, 0xdf, 0xef, 0x3a, 0x14, 0xf9, + 0x72, 0x89, 0x7f, 0x2c, 0xe0, 0xeb, 0x23, 0xd2, 0x38, 0xf3, 0x58, 0x02, 0x8c, 0x22, 0xce, 0x3b, + 0x64, 0xa8, 0xfe, 0x54, 0x0e, 0x2e, 0x66, 0xb7, 0x8e, 0x7c, 0x0a, 0x06, 0xd8, 0xce, 0xbc, 0xac, + 0x2d, 0x89, 0x4f, 0xe7, 0xa9, 0x81, 0xed, 0x16, 0x6d, 0xe8, 0x8e, 0x6c, 0xec, 0xfb, 0x64, 0xe4, + 0x2d, 0x18, 0xae, 0xba, 0x6e, 0x97, 0x3a, 0xf5, 0x97, 0xee, 0x68, 0x55, 0xb1, 0x27, 0xc4, 0x3d, + 0x87, 0x89, 0xe0, 0x86, 0xfb, 0x52, 0x2c, 0x3a, 0x97, 0x4c, 0xaf, 0xfe, 0x78, 0x0e, 0x2e, 0xf5, + 0xfa, 0x2a, 0xf2, 0x12, 0x0c, 0xae, 0x50, 0x4b, 0xb7, 0xbc, 0x6a, 0x45, 0x34, 0x09, 0xb7, 0x58, + 0x1e, 0xc2, 0xa2, 0x3b, 0x85, 0x80, 0x90, 0x15, 0xe2, 0xe7, 0x8a, 0x81, 0x23, 0x03, 0x3f, 0x03, + 0x45, 0x58, 0xac, 0x90, 0x4f, 0xa8, 0xfe, 0x7e, 0x1e, 0x46, 0x6a, 0xad, 0xee, 0x9a, 0x29, 0x2d, + 0x1c, 0xfb, 0xb6, 0xb7, 0x7d, 0xeb, 0x37, 0xbf, 0x37, 0xeb, 0x97, 0x0d, 0x37, 0x67, 0x9f, 0xc3, + 0xcd, 0x2f, 0x47, 0xde, 0x84, 0x52, 0x07, 0xbf, 0x23, 0x7e, 0x12, 0xcb, 0xbf, 0x2e, 0xeb, 0x24, + 0x96, 0x97, 0x61, 0xe3, 0xab, 0x79, 0x80, 0xf1, 0x15, 0x96, 0x95, 0x04, 0x1a, 0x2e, 0x12, 0x27, + 0x02, 0x3d, 0x14, 0x81, 0x86, 0x0b, 0xc2, 0x89, 0x40, 0x0f, 0x20, 0xd0, 0x5f, 0xcb, 0xc3, 0x58, + 0xb4, 0x4a, 0xf2, 0x29, 0x18, 0xe6, 0xd5, 0xf0, 0x73, 0xa1, 0x9c, 0xe4, 0x54, 0x1c, 0x82, 0x35, + 0xe0, 0x3f, 0xc4, 0x01, 0xd7, 0xf8, 0xba, 0xee, 0x36, 0xc2, 0x13, 0x1a, 0x7e, 0x7f, 0x3b, 0xc8, + 0x3d, 0xa1, 0x62, 0x28, 0x6d, 0x6c, 0x5d, 0x77, 0x67, 0xc2, 0xdf, 0x64, 0x16, 0x88, 0x43, 0xbb, + 0x2e, 0x8d, 0x32, 0x28, 0x22, 0x03, 0x91, 0x97, 0x3d, 0x8e, 0xd5, 0x4e, 0x71, 0x98, 0xcc, 0xe6, + 0x0b, 0x41, 0xb3, 0x51, 0x19, 0xfa, 0x77, 0x91, 0x34, 0x5e, 0xa2, 0x4f, 0x3f, 0xe6, 0xe4, 0x04, + 0x15, 0xdd, 0xd3, 0xf9, 0xa6, 0xdc, 0xef, 0x00, 0xf5, 0xa7, 0x1d, 0xe8, 0x5f, 0xb6, 0xe8, 0xf2, + 0x7d, 0xf2, 0x22, 0x0c, 0x31, 0x85, 0x59, 0xb0, 0x59, 0x5f, 0xe6, 0x84, 0xff, 0x84, 0xa4, 0x49, + 0x88, 0x98, 0xef, 0xd3, 0x42, 0x2a, 0x72, 0x03, 0x20, 0x7c, 0x62, 0x26, 0xb4, 0x8f, 0xc8, 0x65, + 0x38, 0x66, 0xbe, 0x4f, 0x93, 0xe8, 0xfc, 0x52, 0xe2, 0x81, 0x4e, 0x21, 0x59, 0x8a, 0x63, 0xfc, + 0x52, 0x62, 0x7c, 0x2c, 0x00, 0x61, 0xbf, 0x6a, 0xba, 0xeb, 0x6e, 0xd8, 0x8e, 0x31, 0xb3, 0xae, + 0x5b, 0x6b, 0x34, 0xbe, 0x7b, 0x4a, 0x52, 0xcc, 0xf7, 0x69, 0x29, 0xe5, 0xc8, 0xeb, 0x30, 0x22, + 0x3b, 0x94, 0xc6, 0x9d, 0x3e, 0x64, 0xdc, 0x7c, 0x9f, 0x16, 0xa1, 0x25, 0xaf, 0xc2, 0xb0, 0xf8, + 0x7d, 0xcb, 0x16, 0x37, 0xca, 0x52, 0x2c, 0x22, 0x09, 0x35, 0xdf, 0xa7, 0xc9, 0x94, 0x52, 0xa5, + 0x35, 0xc7, 0xb4, 0x3c, 0xf1, 0x46, 0x39, 0x5e, 0x29, 0xe2, 0xa4, 0x4a, 0xf1, 0x37, 0x79, 0x0b, + 0x46, 0x83, 0x20, 0x4f, 0xef, 0xd1, 0xa6, 0x27, 0x0e, 0xbf, 0xcf, 0xc6, 0x0a, 0x73, 0xe4, 0x7c, + 0x9f, 0x16, 0xa5, 0x26, 0x57, 0xa0, 0xa4, 0x51, 0xd7, 0x7c, 0xdf, 0xbf, 0x2e, 0x1e, 0x93, 0xc6, + 0xb9, 0xf9, 0x3e, 0x93, 0x92, 0xc0, 0xb3, 0xde, 0x09, 0xef, 0xa7, 0xc5, 0x51, 0x35, 0x89, 0xd5, + 0x32, 0x6b, 0x19, 0xac, 0x77, 0x24, 0xe7, 0x84, 0xcf, 0x86, 0xa1, 0xaf, 0x44, 0xe6, 0xd7, 0xe1, + 0x78, 0x8c, 0x01, 0x19, 0x3b, 0xdf, 0xa7, 0xc5, 0xe8, 0x25, 0xa9, 0x56, 0x4c, 0xf7, 0x81, 0x08, + 0x59, 0x1a, 0x97, 0x2a, 0x43, 0x49, 0x52, 0x65, 0x3f, 0xa5, 0xaa, 0x97, 0xa8, 0xb7, 0x61, 0x3b, + 0x0f, 0x44, 0x80, 0xd2, 0x78, 0xd5, 0x02, 0x2b, 0x55, 0x2d, 0x20, 0x72, 0xd5, 0x6c, 0xc0, 0x8d, + 0xa5, 0x57, 0xad, 0x7b, 0xba, 0x5c, 0x35, 0x3f, 0x89, 0xf3, 0x3b, 0x69, 0x81, 0xea, 0x0f, 0xa9, + 0x32, 0x9e, 0xda, 0xa1, 0x88, 0x93, 0x3a, 0x14, 0x7f, 0xb3, 0x4a, 0xa5, 0xb4, 0xf0, 0xca, 0x44, + 0xb4, 0x52, 0x09, 0xc5, 0x2a, 0x95, 0x13, 0xc8, 0xdf, 0x90, 0x73, 0x8f, 0x2b, 0xa7, 0xa2, 0x1d, + 0x14, 0x62, 0x58, 0x07, 0x49, 0x39, 0xca, 0x27, 0x31, 0xaf, 0xb1, 0x42, 0x90, 0x7c, 0x38, 0x68, + 0xe1, 0x4c, 0x6d, 0xbe, 0x4f, 0xc3, 0x8c, 0xc7, 0x2a, 0xcf, 0x98, 0xad, 0x9c, 0x46, 0x8a, 0x11, + 0x9f, 0x82, 0xc1, 0xe6, 0xfb, 0x34, 0x9e, 0x4d, 0xfb, 0x45, 0x29, 0xab, 0xa0, 0x72, 0x26, 0x3a, + 0x45, 0x04, 0x08, 0x36, 0x45, 0x84, 0xb9, 0x07, 0xe7, 0x92, 0xb9, 0xf3, 0x94, 0xb3, 0xd1, 0xa5, + 0x26, 0x8e, 0x9f, 0xef, 0xd3, 0x92, 0xf9, 0xf6, 0x5e, 0x8d, 0xa4, 0x93, 0x53, 0xce, 0xc5, 0x02, + 0x80, 0x85, 0x28, 0x26, 0x2e, 0x39, 0xf1, 0xdc, 0x32, 0x9c, 0xe6, 0xd9, 0x68, 0x45, 0x08, 0x2f, + 0x31, 0x59, 0x9d, 0x8f, 0x6e, 0x5c, 0x52, 0x48, 0xe6, 0xfb, 0xb4, 0xb4, 0x92, 0x64, 0x26, 0x91, + 0xd4, 0x4d, 0x51, 0xa2, 0xbe, 0x31, 0x31, 0xf4, 0x7c, 0x9f, 0x96, 0x48, 0x03, 0x77, 0x43, 0xce, + 0xa6, 0xa6, 0x5c, 0x88, 0x76, 0x62, 0x88, 0x61, 0x9d, 0x28, 0x65, 0x5d, 0xbb, 0x21, 0x67, 0xd8, + 0x52, 0x2e, 0x26, 0x4b, 0x85, 0x33, 0xa7, 0x94, 0x89, 0x4b, 0x4b, 0x4f, 0x1a, 0xa4, 0x3c, 0x21, + 0x52, 0x07, 0x8b, 0xf2, 0x69, 0x34, 0xf3, 0x7d, 0x5a, 0x7a, 0xc2, 0x21, 0x2d, 0x3d, 0xdb, 0x8e, + 0x72, 0xa9, 0x17, 0xcf, 0xa0, 0x75, 0xe9, 0x99, 0x7a, 0xf4, 0x1e, 0xb9, 0x4f, 0x94, 0x27, 0xa3, + 0x21, 0x8c, 0x33, 0x09, 0xe7, 0xfb, 0xb4, 0x1e, 0x19, 0x54, 0xee, 0x64, 0x24, 0x22, 0x51, 0x9e, + 0x8a, 0x66, 0x0e, 0x4f, 0x25, 0x9a, 0xef, 0xd3, 0x32, 0xd2, 0x98, 0xdc, 0xc9, 0xc8, 0x53, 0xa1, + 0x4c, 0xf6, 0x64, 0x1b, 0xc8, 0x23, 0x23, 0xcb, 0xc5, 0x72, 0x6a, 0x8a, 0x07, 0xe5, 0xe9, 0xa8, + 0xea, 0xa6, 0x90, 0x30, 0xd5, 0x4d, 0x4b, 0x0e, 0xb1, 0x9c, 0x9a, 0x93, 0x40, 0x79, 0xa6, 0x07, + 0xc3, 0xa0, 0x8d, 0xa9, 0xd9, 0x0c, 0x96, 0x53, 0x93, 0x02, 0x28, 0x6a, 0x94, 0x61, 0x0a, 0x09, + 0x63, 0x98, 0x96, 0x4e, 0x60, 0x39, 0x35, 0x76, 0xbc, 0xf2, 0x6c, 0x0f, 0x86, 0x61, 0x0b, 0xd3, + 0xa2, 0xce, 0xbf, 0x1a, 0x09, 0xde, 0xae, 0x7c, 0x2c, 0x3a, 0x6f, 0x48, 0x28, 0x36, 0x6f, 0xc8, + 0x61, 0xde, 0x67, 0x12, 0x91, 0x65, 0x95, 0x8f, 0x47, 0x87, 0x79, 0x0c, 0xcd, 0x86, 0x79, 0x3c, + 0x16, 0xed, 0x4c, 0x22, 0xc2, 0xa6, 0x72, 0x39, 0x8b, 0x09, 0xa2, 0xa3, 0x4c, 0x78, 0x4c, 0xce, + 0x6a, 0x4a, 0x88, 0x47, 0xe5, 0x13, 0x51, 0xbf, 0xee, 0x04, 0xc1, 0x7c, 0x9f, 0x96, 0x12, 0x18, + 0x52, 0x4b, 0x8f, 0x67, 0xa4, 0x5c, 0x89, 0x0e, 0xdb, 0x34, 0x1a, 0x36, 0x6c, 0x53, 0x63, 0x21, + 0x2d, 0xa4, 0x3d, 0x3e, 0x51, 0xae, 0x46, 0x0d, 0xb3, 0x24, 0x05, 0x33, 0xcc, 0x52, 0x1e, 0xad, + 0x68, 0xe9, 0x31, 0x76, 0x94, 0xe7, 0x7a, 0xb6, 0x10, 0x69, 0x52, 0x5a, 0xc8, 0x43, 0xce, 0x84, + 0xb6, 0xd3, 0x9d, 0x4e, 0xcb, 0xd6, 0x0d, 0xe5, 0x93, 0xa9, 0xb6, 0x13, 0x47, 0x4a, 0xb6, 0x13, + 0x07, 0xb0, 0x55, 0x5e, 0x7e, 0xe3, 0xa0, 0x3c, 0x1f, 0x5d, 0xe5, 0x65, 0x1c, 0x5b, 0xe5, 0x23, + 0xef, 0x21, 0x66, 0x12, 0xef, 0x01, 0x94, 0x17, 0xa2, 0x0a, 0x10, 0x43, 0x33, 0x05, 0x88, 0xbf, + 0x20, 0xf8, 0x62, 0xb6, 0x07, 0xbd, 0x32, 0x85, 0xdc, 0x9e, 0xf6, 0xb9, 0x65, 0xd1, 0xcd, 0xf7, + 0x69, 0xd9, 0x5e, 0xf8, 0xd5, 0x14, 0x87, 0x78, 0xe5, 0x5a, 0x54, 0xc1, 0x12, 0x04, 0x4c, 0xc1, + 0x92, 0x6e, 0xf4, 0xd5, 0x14, 0x8f, 0x76, 0xe5, 0x53, 0x99, 0xac, 0x82, 0x6f, 0x4e, 0xf1, 0x83, + 0xbf, 0x21, 0xbb, 0xa4, 0x2b, 0x2f, 0x46, 0x17, 0xbb, 0x10, 0xc3, 0x16, 0x3b, 0xc9, 0x75, 0xfd, + 0x86, 0xec, 0x8c, 0xad, 0x5c, 0x4f, 0x96, 0x0a, 0x97, 0x48, 0xc9, 0x69, 0x5b, 0x4b, 0xf7, 0x61, + 0x56, 0x5e, 0x8a, 0x6a, 0x5d, 0x1a, 0x0d, 0xd3, 0xba, 0x54, 0xff, 0xe7, 0xb9, 0xa4, 0x2b, 0xb2, + 0x72, 0x23, 0xbe, 0xc9, 0x8e, 0xe2, 0x99, 0xe5, 0x93, 0x70, 0x5f, 0xfe, 0x6c, 0x3c, 0xd8, 0x9e, + 0xf2, 0x72, 0xec, 0xda, 0x37, 0x82, 0x65, 0xf6, 0x6d, 0x2c, 0x38, 0xdf, 0x67, 0xe3, 0xf1, 0xe9, + 0x94, 0x57, 0xd2, 0x39, 0x04, 0xba, 0x12, 0x8f, 0x67, 0xf7, 0xd9, 0x78, 0x48, 0x37, 0xe5, 0xd5, + 0x74, 0x0e, 0x81, 0x74, 0xe3, 0x21, 0xe0, 0x5e, 0x94, 0x82, 0xcc, 0x2b, 0x9f, 0x8e, 0x9a, 0x8e, + 0x01, 0x82, 0x99, 0x8e, 0x61, 0x28, 0xfa, 0x17, 0xa5, 0xe0, 0xec, 0xca, 0x6b, 0x89, 0x22, 0x41, + 0x63, 0xa5, 0x10, 0xee, 0x2f, 0x4a, 0x41, 0xcd, 0x95, 0xd7, 0x13, 0x45, 0x82, 0xd6, 0x49, 0xa1, + 0xcf, 0x8d, 0x5e, 0xef, 0x57, 0x95, 0x37, 0xa2, 0x87, 0xc1, 0xd9, 0x94, 0xf3, 0x7d, 0x5a, 0xaf, + 0x77, 0xb0, 0x5f, 0xcc, 0x76, 0xec, 0x56, 0xde, 0x8c, 0x0e, 0xe1, 0x2c, 0x3a, 0x36, 0x84, 0x33, + 0x9d, 0xc3, 0xdf, 0x8a, 0xc5, 0xb2, 0x50, 0xde, 0x8a, 0x4e, 0x71, 0x11, 0x24, 0x9b, 0xe2, 0xe2, + 0x91, 0x2f, 0x22, 0x41, 0x1a, 0x94, 0xcf, 0x44, 0xa7, 0x38, 0x19, 0xc7, 0xa6, 0xb8, 0x48, 0x40, + 0x87, 0x99, 0x44, 0xec, 0x00, 0xe5, 0xed, 0xe8, 0x14, 0x17, 0x43, 0xb3, 0x29, 0x2e, 0x1e, 0x6d, + 0xe0, 0xad, 0xd8, 0x13, 0x7a, 0xe5, 0xb3, 0xe9, 0xed, 0x47, 0xa4, 0xdc, 0x7e, 0xfe, 0xe0, 0x5e, + 0x4b, 0x7f, 0x0b, 0xae, 0x94, 0xa3, 0xe3, 0x37, 0x8d, 0x86, 0x8d, 0xdf, 0xd4, 0x77, 0xe4, 0xf1, + 0x8d, 0x83, 0xd0, 0xaa, 0xe9, 0x1e, 0x1b, 0x87, 0xd0, 0x14, 0x49, 0x01, 0x47, 0xf6, 0xc8, 0x7c, + 0x23, 0x34, 0x93, 0xb1, 0x47, 0xf6, 0xb7, 0x41, 0x31, 0x7a, 0x36, 0xbb, 0x26, 0xfc, 0x8c, 0x95, + 0x4a, 0x74, 0x76, 0x4d, 0x10, 0xb0, 0xd9, 0x35, 0xe9, 0x9d, 0x3c, 0x07, 0x13, 0x42, 0x8b, 0xb8, + 0xfb, 0xb4, 0x69, 0xad, 0x29, 0xb3, 0xb1, 0xf7, 0x96, 0x31, 0x3c, 0x9b, 0x9d, 0xe2, 0x30, 0x5c, + 0xaf, 0x39, 0x6c, 0xa6, 0x65, 0x76, 0x56, 0x6d, 0xdd, 0x31, 0xea, 0xd4, 0x32, 0x94, 0xb9, 0xd8, + 0x7a, 0x9d, 0x42, 0x83, 0xeb, 0x75, 0x0a, 0x1c, 0x43, 0xc4, 0xc5, 0xe0, 0x1a, 0x6d, 0x52, 0xf3, + 0x21, 0x55, 0x6e, 0x22, 0xdb, 0xc9, 0x2c, 0xb6, 0x82, 0x6c, 0xbe, 0x4f, 0xcb, 0xe2, 0xc0, 0x6c, + 0xf5, 0xc5, 0xcd, 0xfa, 0x3b, 0x0b, 0x41, 0xf8, 0x81, 0x9a, 0x43, 0x3b, 0xba, 0x43, 0x95, 0xf9, + 0xa8, 0xad, 0x9e, 0x4a, 0xc4, 0x6c, 0xf5, 0x54, 0x44, 0x92, 0xad, 0x3f, 0x16, 0xaa, 0xbd, 0xd8, + 0x86, 0x23, 0x22, 0xbd, 0x34, 0x9b, 0x9d, 0xa2, 0x08, 0x26, 0xa0, 0x05, 0xdb, 0x5a, 0xc3, 0x93, + 0x8a, 0x5b, 0xd1, 0xd9, 0x29, 0x9b, 0x92, 0xcd, 0x4e, 0xd9, 0x58, 0xa6, 0xea, 0x51, 0x2c, 0x1f, + 0x83, 0xb7, 0xa3, 0xaa, 0x9e, 0x42, 0xc2, 0x54, 0x3d, 0x05, 0x9c, 0x64, 0xa8, 0x51, 0x97, 0x7a, + 0xca, 0x42, 0x2f, 0x86, 0x48, 0x92, 0x64, 0x88, 0xe0, 0x24, 0xc3, 0x39, 0xea, 0x35, 0xd7, 0x95, + 0xc5, 0x5e, 0x0c, 0x91, 0x24, 0xc9, 0x10, 0xc1, 0x6c, 0xb3, 0x19, 0x05, 0x4f, 0x77, 0x5b, 0x0f, + 0xfc, 0x3e, 0x5b, 0x8a, 0x6e, 0x36, 0x33, 0x09, 0xd9, 0x66, 0x33, 0x13, 0x49, 0x7e, 0x7c, 0xd7, + 0x7e, 0xf0, 0xca, 0x32, 0x56, 0x38, 0x15, 0xda, 0x05, 0xbb, 0x29, 0x35, 0xdf, 0xa7, 0xed, 0xd6, + 0xcf, 0xfe, 0x93, 0x81, 0xd3, 0xa8, 0x52, 0xc3, 0xaa, 0xc6, 0x83, 0xb3, 0x0a, 0x0e, 0x9e, 0xef, + 0xd3, 0x02, 0xb7, 0xd2, 0x57, 0x61, 0x18, 0x3f, 0xaa, 0x6a, 0x99, 0x5e, 0x65, 0x5a, 0x79, 0x27, + 0xba, 0x65, 0x92, 0x50, 0x6c, 0xcb, 0x24, 0xfd, 0x64, 0x93, 0x38, 0xfe, 0xe4, 0x53, 0x4c, 0x65, + 0x5a, 0xd1, 0xa2, 0x93, 0x78, 0x04, 0xc9, 0x26, 0xf1, 0x08, 0x20, 0xa8, 0xb7, 0xe2, 0xd8, 0x9d, + 0xca, 0xb4, 0x52, 0x4f, 0xa9, 0x97, 0xa3, 0x82, 0x7a, 0xf9, 0xcf, 0xa0, 0xde, 0xfa, 0x7a, 0xd7, + 0xab, 0xb0, 0x6f, 0x5c, 0x49, 0xa9, 0xd7, 0x47, 0x06, 0xf5, 0xfa, 0x00, 0x36, 0x15, 0x22, 0xa0, + 0xe6, 0xd8, 0x6c, 0xd2, 0xbe, 0x6d, 0xb6, 0x5a, 0xca, 0x9d, 0xe8, 0x54, 0x18, 0xc7, 0xb3, 0xa9, + 0x30, 0x0e, 0x63, 0xa6, 0x27, 0x6f, 0x15, 0x5d, 0xed, 0xae, 0x29, 0x77, 0xa3, 0xa6, 0x67, 0x88, + 0x61, 0xa6, 0x67, 0xf8, 0x0b, 0x77, 0x17, 0xec, 0x97, 0x46, 0xef, 0x3b, 0xd4, 0x5d, 0x57, 0xee, + 0xc5, 0x76, 0x17, 0x12, 0x0e, 0x77, 0x17, 0xd2, 0x6f, 0xb2, 0x06, 0x4f, 0x44, 0x16, 0x1a, 0xff, + 0xd2, 0xa6, 0x4e, 0x75, 0xa7, 0xb9, 0xae, 0x7c, 0x0e, 0x59, 0x3d, 0x9b, 0xba, 0x54, 0x45, 0x49, + 0xe7, 0xfb, 0xb4, 0x5e, 0x9c, 0x70, 0x5b, 0xfe, 0xce, 0x02, 0x8f, 0x04, 0xab, 0xd5, 0x66, 0xfc, + 0x4d, 0xe8, 0xbb, 0xb1, 0x6d, 0x79, 0x92, 0x04, 0xb7, 0xe5, 0x49, 0x30, 0xe9, 0xc0, 0x53, 0xb1, + 0xad, 0xda, 0xa2, 0xde, 0x62, 0xfb, 0x12, 0x6a, 0xd4, 0xf4, 0xe6, 0x03, 0xea, 0x29, 0x9f, 0x47, + 0xde, 0x97, 0x33, 0x36, 0x7c, 0x31, 0xea, 0xf9, 0x3e, 0x6d, 0x07, 0x7e, 0x44, 0x85, 0x62, 0x7d, + 0x6e, 0xa5, 0xa6, 0xfc, 0x40, 0xf4, 0x7c, 0x93, 0xc1, 0xe6, 0xfb, 0x34, 0xc4, 0x31, 0x2b, 0xed, + 0x4e, 0x67, 0xcd, 0xd1, 0x0d, 0xca, 0x0d, 0x2d, 0xb4, 0xdd, 0x84, 0x01, 0xfa, 0x83, 0x51, 0x2b, + 0x2d, 0x8b, 0x8e, 0x59, 0x69, 0x59, 0x38, 0xa6, 0xa8, 0x91, 0xa4, 0x27, 0xca, 0x17, 0xa2, 0x8a, + 0x1a, 0x41, 0x32, 0x45, 0x8d, 0xa6, 0x48, 0xf9, 0x1c, 0x9c, 0x0b, 0xf6, 0xf3, 0x62, 0xfd, 0xe5, + 0x9d, 0xa6, 0x7c, 0x11, 0xf9, 0x3c, 0x95, 0xb8, 0x0c, 0x88, 0x50, 0xcd, 0xf7, 0x69, 0x19, 0xe5, + 0xd9, 0x8a, 0x9b, 0x48, 0x0a, 0x26, 0xcc, 0x8b, 0x1f, 0x8a, 0xae, 0xb8, 0x19, 0x64, 0x6c, 0xc5, + 0xcd, 0x40, 0xa5, 0x32, 0x17, 0x42, 0xd5, 0x77, 0x60, 0x1e, 0xc8, 0x34, 0x8b, 0x43, 0x2a, 0x73, + 0x61, 0xa9, 0xad, 0xee, 0xc0, 0x3c, 0xb0, 0xd6, 0xb2, 0x38, 0x90, 0x2b, 0x50, 0xaa, 0xd7, 0x17, + 0xb5, 0xae, 0xa5, 0x34, 0x63, 0xde, 0xb2, 0x08, 0x9d, 0xef, 0xd3, 0x04, 0x9e, 0x99, 0x41, 0xb3, + 0x2d, 0xdd, 0xf5, 0xcc, 0xa6, 0x8b, 0x23, 0xc6, 0x1f, 0x21, 0x46, 0xd4, 0x0c, 0x4a, 0xa3, 0x61, + 0x66, 0x50, 0x1a, 0x9c, 0xd9, 0x8b, 0x33, 0xba, 0xeb, 0xea, 0x96, 0xe1, 0xe8, 0xd3, 0xb8, 0x4c, + 0xd0, 0xd8, 0x6b, 0xac, 0x08, 0x96, 0xd9, 0x8b, 0x51, 0x08, 0x1e, 0xbe, 0xfb, 0x10, 0xdf, 0xcc, + 0xb9, 0x1f, 0x3b, 0x7c, 0x8f, 0xe1, 0xf1, 0xf0, 0x3d, 0x06, 0x43, 0xbb, 0xd3, 0x87, 0x69, 0x74, + 0xcd, 0x64, 0x22, 0x52, 0xd6, 0x62, 0x76, 0x67, 0x9c, 0x00, 0xed, 0xce, 0x38, 0x30, 0xd2, 0x24, + 0x7f, 0xb9, 0x5d, 0xcf, 0x68, 0x52, 0xb8, 0xca, 0x26, 0xca, 0xb0, 0xf5, 0x3b, 0x1c, 0x1c, 0x95, + 0x4d, 0x4b, 0x6f, 0xdb, 0x95, 0x69, 0x5f, 0xea, 0x66, 0x74, 0xfd, 0xce, 0x24, 0x64, 0xeb, 0x77, + 0x26, 0x92, 0xcd, 0xae, 0xfe, 0x46, 0x6b, 0x5d, 0x77, 0xa8, 0x51, 0x31, 0x1d, 0x3c, 0x59, 0xdc, + 0xe4, 0x5b, 0xc3, 0xf7, 0xa2, 0xb3, 0x6b, 0x0f, 0x52, 0x36, 0xbb, 0xf6, 0x40, 0x33, 0x23, 0x2f, + 0x1d, 0xad, 0x51, 0xdd, 0x50, 0x1e, 0x44, 0x8d, 0xbc, 0x6c, 0x4a, 0x66, 0xe4, 0x65, 0x63, 0xb3, + 0x3f, 0xe7, 0x9e, 0x63, 0x7a, 0x54, 0x69, 0xed, 0xe6, 0x73, 0x90, 0x34, 0xfb, 0x73, 0x10, 0xcd, + 0x36, 0x84, 0xf1, 0x0e, 0x69, 0x47, 0x37, 0x84, 0xc9, 0x6e, 0x88, 0x97, 0x60, 0x16, 0x8b, 0x78, + 0x94, 0xa7, 0x58, 0x51, 0x8b, 0x45, 0x80, 0x99, 0xc5, 0x12, 0x3e, 0xdb, 0x8b, 0x3c, 0xc5, 0x52, + 0xec, 0xe8, 0x1a, 0x2a, 0xe3, 0xd8, 0x1a, 0x1a, 0x79, 0xb6, 0xf5, 0x6a, 0xe4, 0x9d, 0x81, 0xd2, + 0x89, 0x5a, 0x1d, 0x12, 0x8a, 0x59, 0x1d, 0xf2, 0x8b, 0x84, 0x19, 0x18, 0xc7, 0x5b, 0x70, 0xad, + 0x1b, 0xdc, 0xe3, 0xfc, 0x70, 0xf4, 0x33, 0x63, 0x68, 0xf6, 0x99, 0x31, 0x50, 0x84, 0x89, 0x98, + 0xb6, 0x9c, 0x0c, 0x26, 0xe1, 0xf9, 0x60, 0x0c, 0x44, 0x16, 0x80, 0xd4, 0xcb, 0x8b, 0x0b, 0x55, + 0xa3, 0x26, 0x5f, 0x91, 0xb9, 0xd1, 0x13, 0xd8, 0x24, 0xc5, 0x7c, 0x9f, 0x96, 0x52, 0x8e, 0xbc, + 0x07, 0x97, 0x04, 0x54, 0xbc, 0xb8, 0xae, 0x39, 0xf6, 0x43, 0xd3, 0x08, 0x16, 0x04, 0x2f, 0xea, + 0xc7, 0xd6, 0x8b, 0x76, 0xbe, 0x4f, 0xeb, 0xc9, 0x2b, 0xbb, 0x2e, 0xb1, 0x3e, 0x74, 0x77, 0x53, + 0x57, 0xb0, 0x48, 0xf4, 0xe4, 0x95, 0x5d, 0x97, 0x90, 0xfb, 0xc3, 0xdd, 0xd4, 0x15, 0x74, 0x42, + 0x4f, 0x5e, 0xc4, 0x85, 0xc9, 0x5e, 0xf8, 0x72, 0xab, 0xa5, 0x6c, 0x60, 0x75, 0x9f, 0xd8, 0x4d, + 0x75, 0x65, 0x34, 0x38, 0x77, 0xe2, 0xc8, 0x66, 0xe9, 0xe5, 0x0e, 0xb5, 0xea, 0x91, 0x05, 0xe8, + 0x51, 0x74, 0x96, 0x4e, 0x10, 0xb0, 0x59, 0x3a, 0x01, 0x64, 0x03, 0x4a, 0x7e, 0xae, 0xa2, 0x6c, + 0x46, 0x07, 0x94, 0x8c, 0x63, 0x03, 0x2a, 0xf2, 0xb4, 0x65, 0x19, 0x4e, 0x2f, 0x3f, 0xf0, 0x74, + 0xdf, 0x82, 0x74, 0x45, 0x57, 0xbe, 0x1f, 0xbb, 0x64, 0x4a, 0x92, 0xe0, 0x25, 0x53, 0x12, 0xcc, + 0xc6, 0x08, 0x03, 0xd7, 0x37, 0xad, 0xe6, 0x9c, 0x6e, 0xb6, 0xba, 0x0e, 0x55, 0xfe, 0x54, 0x74, + 0x8c, 0xc4, 0xd0, 0x6c, 0x8c, 0xc4, 0x40, 0x6c, 0x81, 0x66, 0xa0, 0xb2, 0xeb, 0x9a, 0x6b, 0x96, + 0xd8, 0x57, 0x76, 0x5b, 0x9e, 0xf2, 0x6f, 0x44, 0x17, 0xe8, 0x34, 0x1a, 0xb6, 0x40, 0xa7, 0xc1, + 0xf1, 0xd4, 0x89, 0xf5, 0x02, 0x5b, 0x3c, 0xe4, 0xbb, 0xca, 0x7f, 0x33, 0x76, 0xea, 0x94, 0x42, + 0x83, 0xa7, 0x4e, 0x29, 0x70, 0xb6, 0x3e, 0x72, 0x9b, 0x6c, 0xc1, 0x0c, 0xee, 0xaa, 0xff, 0xad, + 0xe8, 0xfa, 0x18, 0xc7, 0xb3, 0xf5, 0x31, 0x0e, 0x8b, 0xf2, 0x11, 0x5d, 0xf0, 0x6f, 0x67, 0xf1, + 0x09, 0xe4, 0x9f, 0x28, 0x43, 0x6e, 0xca, 0x7c, 0xc4, 0x48, 0xf9, 0x91, 0x5c, 0x16, 0xa3, 0x60, + 0x78, 0x24, 0x0a, 0x45, 0x19, 0x69, 0xf4, 0xa1, 0x49, 0x37, 0x94, 0x2f, 0x65, 0x32, 0xe2, 0x04, + 0x51, 0x46, 0x1c, 0x46, 0xde, 0x85, 0x73, 0x21, 0x6c, 0x91, 0xb6, 0x57, 0x83, 0x99, 0xe9, 0x4f, + 0xe7, 0xa2, 0x66, 0x70, 0x3a, 0x19, 0x33, 0x83, 0xd3, 0x31, 0x69, 0xac, 0x85, 0xe8, 0xfe, 0x9d, + 0x1d, 0x58, 0x07, 0x12, 0xcc, 0x60, 0x90, 0xc6, 0x5a, 0x48, 0xf3, 0x47, 0x77, 0x60, 0x1d, 0xc8, + 0x34, 0x83, 0x01, 0xf9, 0x89, 0x1c, 0x5c, 0x4e, 0x47, 0x95, 0x5b, 0xad, 0x39, 0xdb, 0x09, 0x71, + 0xca, 0x9f, 0xc9, 0x45, 0x0f, 0x1a, 0x76, 0x57, 0x6c, 0xbe, 0x4f, 0xdb, 0x65, 0x05, 0xe4, 0x33, + 0x30, 0x5a, 0xee, 0x1a, 0xa6, 0x87, 0x17, 0x6f, 0xcc, 0x70, 0xfe, 0xb1, 0x5c, 0x6c, 0x8b, 0x23, + 0x63, 0x71, 0x8b, 0x23, 0x03, 0xc8, 0x2d, 0x38, 0x55, 0xa7, 0xcd, 0xae, 0x63, 0x7a, 0x9b, 0x1a, + 0xed, 0xd8, 0x8e, 0xc7, 0x78, 0xfc, 0xd9, 0x5c, 0x74, 0x12, 0x4b, 0x50, 0xb0, 0x49, 0x2c, 0x01, + 0x24, 0x77, 0x13, 0xb7, 0xf2, 0xa2, 0x33, 0x7f, 0x3c, 0xd7, 0xf3, 0x5a, 0x3e, 0xe8, 0xcb, 0xf4, + 0xe2, 0xa4, 0x16, 0xbb, 0x45, 0x17, 0x5c, 0x7f, 0x22, 0xd7, 0xe3, 0x1a, 0x5d, 0x9a, 0xe1, 0x92, + 0x60, 0xc6, 0x31, 0x25, 0x8d, 0xbc, 0xf2, 0xe7, 0x72, 0x3d, 0xae, 0xbd, 0x43, 0x8e, 0x69, 0x19, + 0xe8, 0x5f, 0xe6, 0x9e, 0x22, 0x82, 0xd1, 0x4f, 0xe6, 0x92, 0xae, 0x22, 0x41, 0x79, 0x89, 0x90, + 0x15, 0xbb, 0xe3, 0x06, 0x4a, 0xff, 0xe5, 0x5c, 0xd2, 0x37, 0x2f, 0x2c, 0x16, 0xfe, 0x22, 0x14, + 0x2e, 0xce, 0x3e, 0xf2, 0xa8, 0x63, 0xe9, 0x2d, 0xec, 0xce, 0xba, 0x67, 0x3b, 0xfa, 0x1a, 0x9d, + 0xb5, 0xf4, 0xd5, 0x16, 0x55, 0x7e, 0x2a, 0x17, 0xb5, 0x60, 0xb3, 0x49, 0x99, 0x05, 0x9b, 0x8d, + 0x25, 0xeb, 0xf0, 0x44, 0x1a, 0xb6, 0x62, 0xba, 0x58, 0xcf, 0x57, 0x72, 0x51, 0x13, 0xb6, 0x07, + 0x2d, 0x33, 0x61, 0x7b, 0xa0, 0xc9, 0x75, 0x18, 0x9a, 0xb6, 0xfd, 0xe9, 0xf7, 0xcf, 0xc7, 0x9c, + 0x21, 0x03, 0xcc, 0x7c, 0x9f, 0x16, 0x92, 0x89, 0x32, 0x62, 0x50, 0x7f, 0x35, 0x59, 0x26, 0xbc, + 0x7c, 0x0a, 0x7e, 0x88, 0x32, 0x42, 0xdc, 0xff, 0x6e, 0xb2, 0x4c, 0x78, 0xc7, 0x15, 0xfc, 0x60, + 0x33, 0x09, 0xaf, 0x71, 0x71, 0xae, 0xcc, 0xec, 0xb6, 0x99, 0x75, 0xbd, 0xd5, 0xa2, 0xd6, 0x1a, + 0x55, 0xbe, 0x16, 0x9b, 0x49, 0xd2, 0xc9, 0xd8, 0x4c, 0x92, 0x8e, 0x21, 0x3f, 0x08, 0xe7, 0xef, + 0xea, 0x2d, 0xd3, 0x08, 0x71, 0x7e, 0x52, 0x71, 0xe5, 0xa7, 0x73, 0xd1, 0xdd, 0x74, 0x06, 0x1d, + 0xdb, 0x4d, 0x67, 0xa0, 0xc8, 0x22, 0x10, 0x5c, 0x46, 0x83, 0xd9, 0x82, 0xad, 0xcf, 0xca, 0xbf, + 0x97, 0x8b, 0xda, 0xa9, 0x49, 0x12, 0x66, 0xa7, 0x26, 0xa1, 0xa4, 0x91, 0x9d, 0x1a, 0x44, 0xf9, + 0x99, 0x5c, 0xf4, 0xb4, 0x26, 0x8b, 0x70, 0xbe, 0x4f, 0xcb, 0xce, 0x2f, 0x72, 0x13, 0x26, 0xea, + 0xb5, 0xea, 0xdc, 0xdc, 0x6c, 0xfd, 0x6e, 0xb5, 0x82, 0x0f, 0x1d, 0x0c, 0xe5, 0x67, 0x63, 0x2b, + 0x56, 0x9c, 0x80, 0xad, 0x58, 0x71, 0x18, 0x79, 0x03, 0x46, 0x58, 0xfb, 0xd9, 0x80, 0xc1, 0x4f, + 0xfe, 0x7a, 0x2e, 0x6a, 0x4e, 0xc9, 0x48, 0x66, 0x4e, 0xc9, 0xbf, 0x49, 0x1d, 0xce, 0x30, 0x29, + 0xd6, 0x1c, 0x7a, 0x9f, 0x3a, 0xd4, 0x6a, 0xfa, 0x63, 0xfa, 0xe7, 0x72, 0x51, 0x2b, 0x23, 0x8d, + 0x88, 0x59, 0x19, 0x69, 0x70, 0xf2, 0x00, 0x2e, 0xc5, 0x4f, 0x82, 0xe4, 0x67, 0xa7, 0xca, 0x5f, + 0xc8, 0xc5, 0x8c, 0xe1, 0x1e, 0xc4, 0x68, 0x0c, 0xf7, 0xc0, 0x13, 0x0b, 0x9e, 0x14, 0xc7, 0x2a, + 0xc2, 0xe1, 0x32, 0x5e, 0xdb, 0xcf, 0xf3, 0xda, 0x3e, 0x1e, 0x3a, 0x04, 0xf6, 0xa0, 0x9e, 0xef, + 0xd3, 0x7a, 0xb3, 0x63, 0x7a, 0x96, 0x4c, 0x80, 0xa1, 0xfc, 0xc5, 0x5c, 0xba, 0x47, 0x4a, 0xc4, + 0x4d, 0x39, 0x2d, 0x73, 0xc6, 0xbb, 0x59, 0xe9, 0x1b, 0x94, 0xbf, 0x14, 0x1b, 0x6f, 0xe9, 0x64, + 0x6c, 0xbc, 0x65, 0xe4, 0x7f, 0xb8, 0x05, 0xa7, 0xb8, 0x52, 0xd7, 0x74, 0x1c, 0x86, 0xd6, 0x1a, + 0x35, 0x94, 0x7f, 0x3f, 0xb6, 0xda, 0x25, 0x28, 0xd0, 0xb5, 0x27, 0x0e, 0x64, 0x53, 0x77, 0xbd, + 0xa3, 0x5b, 0x16, 0x1e, 0xb3, 0x2a, 0xff, 0x41, 0x6c, 0xea, 0x0e, 0x51, 0xe8, 0xb8, 0x1b, 0xfc, + 0x62, 0x9a, 0xd0, 0x2b, 0xf5, 0x91, 0xf2, 0x1f, 0xc6, 0x34, 0xa1, 0x17, 0x31, 0xd3, 0x84, 0x9e, + 0x79, 0x94, 0xee, 0x66, 0x3c, 0x01, 0x57, 0xbe, 0x11, 0x5b, 0x91, 0x53, 0xa9, 0xd8, 0x8a, 0x9c, + 0xfe, 0x82, 0xfc, 0x6e, 0xc6, 0xf3, 0x69, 0xe5, 0x17, 0x7a, 0xf3, 0x0d, 0x57, 0xfa, 0xf4, 0xd7, + 0xd7, 0x77, 0x33, 0x9e, 0x1e, 0x2b, 0x7f, 0xb9, 0x37, 0xdf, 0xd0, 0xb1, 0x2f, 0xfd, 0xe5, 0x72, + 0x23, 0xfb, 0xd9, 0xae, 0xf2, 0x57, 0xe2, 0x53, 0x57, 0x06, 0x21, 0x4e, 0x5d, 0x59, 0x6f, 0x7f, + 0x57, 0xe1, 0x02, 0xd7, 0x90, 0x9b, 0x8e, 0xde, 0x59, 0xaf, 0x53, 0xcf, 0x33, 0xad, 0x35, 0x7f, + 0x27, 0xf6, 0x57, 0x73, 0xb1, 0xe3, 0xb1, 0x2c, 0x4a, 0x3c, 0x1e, 0xcb, 0x42, 0x32, 0xe5, 0x4d, + 0x3c, 0xd0, 0x55, 0xfe, 0x5a, 0x4c, 0x79, 0x13, 0x14, 0x4c, 0x79, 0x93, 0xef, 0x7a, 0x6f, 0xa5, + 0xbc, 0x43, 0x55, 0xfe, 0xa3, 0x6c, 0x5e, 0x41, 0xfb, 0x52, 0x9e, 0xaf, 0xde, 0x4a, 0x79, 0x6e, + 0xa9, 0xfc, 0xc7, 0xd9, 0xbc, 0x42, 0x1f, 0xa4, 0xe4, 0x2b, 0xcd, 0x77, 0xe1, 0x1c, 0x9f, 0xcd, + 0xe7, 0xa8, 0x41, 0x23, 0x1f, 0xfa, 0x8b, 0xb1, 0xb1, 0x9f, 0x4e, 0x86, 0x47, 0xee, 0xa9, 0x98, + 0x34, 0xd6, 0xa2, 0xad, 0x7f, 0x7d, 0x07, 0xd6, 0xe1, 0x86, 0x20, 0x1d, 0xc3, 0xd6, 0x1b, 0xf9, + 0xf1, 0x9b, 0xf2, 0x4b, 0xb1, 0xf5, 0x46, 0x46, 0xa2, 0x3b, 0x87, 0xfc, 0x52, 0xee, 0x8d, 0xe8, + 0x43, 0x2f, 0xe5, 0x6f, 0xa4, 0x16, 0x0e, 0x3a, 0x20, 0xfa, 0x2a, 0xec, 0x8d, 0xe8, 0xa3, 0x26, + 0xe5, 0x97, 0x53, 0x0b, 0x07, 0x1f, 0x10, 0x7d, 0x01, 0xc5, 0xb6, 0x48, 0x5d, 0xcf, 0xe6, 0xac, + 0x22, 0xd3, 0xc3, 0xdf, 0x8c, 0x6f, 0x91, 0x52, 0xc9, 0x70, 0x8b, 0x94, 0x8a, 0x49, 0x63, 0x2d, + 0x3e, 0xef, 0x57, 0x76, 0x60, 0x2d, 0x6d, 0xec, 0x52, 0x31, 0x69, 0xac, 0xc5, 0xc7, 0x7f, 0x73, + 0x07, 0xd6, 0xd2, 0xc6, 0x2e, 0x15, 0xc3, 0xcc, 0xb1, 0x10, 0x73, 0x97, 0x3a, 0x6e, 0xa8, 0x7e, + 0xff, 0x49, 0xcc, 0x1c, 0xcb, 0xa0, 0x63, 0xe6, 0x58, 0x06, 0x2a, 0x95, 0xbb, 0x10, 0xca, 0xaf, + 0xee, 0xc4, 0x3d, 0xbc, 0x97, 0xc9, 0x40, 0xa5, 0x72, 0x17, 0x72, 0xf9, 0x5b, 0x3b, 0x71, 0x0f, + 0x2f, 0x66, 0x32, 0x50, 0xcc, 0x28, 0xaa, 0x7b, 0xba, 0x67, 0x36, 0xe7, 0x6d, 0xd7, 0x93, 0x16, + 0xf9, 0xff, 0x34, 0x66, 0x14, 0xa5, 0x11, 0x31, 0xa3, 0x28, 0x0d, 0x9e, 0x64, 0x2a, 0xa4, 0xf1, + 0x6b, 0x3d, 0x99, 0x86, 0x96, 0x56, 0x1a, 0x3c, 0xc9, 0x54, 0x08, 0xe1, 0x3f, 0xeb, 0xc9, 0x34, + 0xf4, 0x94, 0x4f, 0x83, 0x33, 0xcb, 0x74, 0xc6, 0xb1, 0x37, 0xac, 0x5b, 0x74, 0x83, 0xb6, 0xc4, + 0xa7, 0xff, 0x7a, 0xcc, 0x32, 0x8d, 0x13, 0xe0, 0x2d, 0x4a, 0x0c, 0x16, 0x65, 0x24, 0x3e, 0xf7, + 0x37, 0x32, 0x19, 0x85, 0xc7, 0x44, 0x71, 0x58, 0x94, 0x91, 0xf8, 0xc4, 0xdf, 0xcc, 0x64, 0x14, + 0x1e, 0x13, 0xc5, 0x61, 0xa4, 0x0c, 0x63, 0xf8, 0x56, 0x42, 0x77, 0x7d, 0xcf, 0xcf, 0xdf, 0xc9, + 0x45, 0x6f, 0xbd, 0xa2, 0xe8, 0xf9, 0x3e, 0x2d, 0x56, 0x40, 0x66, 0x21, 0x3e, 0xe9, 0xdb, 0x19, + 0x2c, 0x42, 0x7f, 0xc7, 0x28, 0x44, 0x66, 0x21, 0x3e, 0xe6, 0x3f, 0xcf, 0x60, 0x11, 0x3a, 0x3c, + 0x46, 0x21, 0xe4, 0xd3, 0x30, 0x5c, 0x9f, 0x5b, 0xa9, 0xf9, 0xe9, 0xf9, 0xfe, 0x76, 0x2e, 0xf6, + 0xaa, 0x28, 0xc4, 0xe1, 0xab, 0xa2, 0xf0, 0x27, 0x9b, 0x51, 0xee, 0xd9, 0xce, 0x83, 0x96, 0xad, + 0x1b, 0x7e, 0x44, 0x46, 0x21, 0x8a, 0xbf, 0x17, 0x9b, 0x51, 0xd2, 0xc9, 0xd8, 0x8c, 0x92, 0x8e, + 0x49, 0x63, 0x2d, 0x44, 0xf4, 0x9d, 0x1d, 0x58, 0x87, 0xf3, 0x60, 0x3a, 0x26, 0x8d, 0xb5, 0x10, + 0xdd, 0xdf, 0xdf, 0x81, 0x75, 0x38, 0x0f, 0xa6, 0x63, 0xa6, 0x07, 0xa0, 0x1f, 0xcf, 0x96, 0x6f, + 0x95, 0x06, 0xbf, 0x95, 0x9b, 0xf8, 0xad, 0xdc, 0xad, 0xd2, 0xe0, 0x6f, 0xe5, 0x26, 0x7e, 0x9b, + 0xfd, 0xff, 0xdb, 0xb9, 0x89, 0xdf, 0xc9, 0x69, 0x17, 0xc2, 0x79, 0xa2, 0xbc, 0x46, 0x2d, 0xaf, + 0xd6, 0xd2, 0xc5, 0x2c, 0x97, 0x8a, 0xe2, 0x3f, 0x53, 0x51, 0x22, 0x37, 0xd8, 0x37, 0x72, 0x30, + 0x52, 0xf7, 0x1c, 0xaa, 0xb7, 0x45, 0xa8, 0xbd, 0x8b, 0x30, 0xc8, 0xbd, 0xc1, 0xfd, 0xa7, 0xeb, + 0x5a, 0xf0, 0x9b, 0x5c, 0x86, 0xb1, 0x05, 0xdd, 0xf5, 0xb0, 0x89, 0x55, 0xcb, 0xa0, 0x8f, 0xf0, + 0x25, 0x64, 0x41, 0x8b, 0x41, 0xc9, 0x02, 0xa7, 0xe3, 0xe5, 0x30, 0xba, 0x6a, 0x61, 0xc7, 0x08, + 0x73, 0x83, 0xdf, 0xdd, 0x9a, 0xec, 0xc3, 0x80, 0x72, 0xb1, 0xb2, 0xea, 0xef, 0xe5, 0x20, 0xe1, + 0xa7, 0xbe, 0xff, 0x90, 0x12, 0xcb, 0x30, 0x1e, 0x8b, 0xe8, 0x2b, 0x9e, 0x73, 0xee, 0x32, 0xe0, + 0x6f, 0xbc, 0x34, 0xf9, 0x44, 0xf0, 0x8c, 0xf0, 0x8e, 0xb6, 0x20, 0xa2, 0x07, 0x62, 0xde, 0x8b, + 0xae, 0xd3, 0xd2, 0x24, 0x94, 0x88, 0x0e, 0xf5, 0xfd, 0x89, 0x30, 0x5c, 0x29, 0xb9, 0x2c, 0xe2, + 0x5b, 0xe4, 0xc2, 0x98, 0x83, 0xb1, 0x2c, 0xfb, 0x3c, 0x9e, 0xc5, 0x67, 0x60, 0xa4, 0xda, 0xee, + 0x50, 0xc7, 0xb5, 0x2d, 0xdd, 0xb3, 0x1d, 0x11, 0x1e, 0x00, 0xe3, 0xd1, 0x99, 0x12, 0x5c, 0x8e, + 0x91, 0x26, 0xd3, 0x93, 0xab, 0x7e, 0xea, 0xbe, 0x02, 0x06, 0x8a, 0xc5, 0x37, 0xbe, 0xf1, 0xcc, + 0xed, 0x9c, 0x82, 0x91, 0xde, 0x71, 0x75, 0x7c, 0x70, 0x1a, 0x90, 0x76, 0x19, 0x40, 0x26, 0x45, + 0x0a, 0xf2, 0x3c, 0x94, 0xf0, 0x82, 0xce, 0xc5, 0x94, 0x9c, 0x22, 0x12, 0x62, 0x0b, 0x21, 0x72, + 0xdc, 0x39, 0x4e, 0x43, 0x6e, 0xc3, 0x44, 0xe8, 0x7d, 0x70, 0xd3, 0xb1, 0xbb, 0x1d, 0x3f, 0x09, + 0x0f, 0x66, 0xbc, 0x7f, 0x10, 0xe0, 0x1a, 0x6b, 0x88, 0x94, 0x58, 0x24, 0x0a, 0x92, 0x79, 0x18, + 0x0f, 0x61, 0x4c, 0x44, 0x7e, 0xf2, 0x2f, 0x4c, 0xbc, 0x2a, 0xf1, 0x62, 0xe2, 0x8c, 0x24, 0x5e, + 0x8d, 0x15, 0x23, 0x55, 0x18, 0xf0, 0xc3, 0x20, 0x0e, 0xee, 0xa8, 0xa4, 0xa7, 0x45, 0x18, 0xc4, + 0x01, 0x39, 0x00, 0xa2, 0x5f, 0x9e, 0xcc, 0xc1, 0x98, 0x66, 0x77, 0x3d, 0xba, 0x62, 0x8b, 0x6d, + 0xbb, 0x08, 0xb7, 0x89, 0x6d, 0x72, 0x18, 0xa6, 0xe1, 0xd9, 0x8d, 0x26, 0xc7, 0xc9, 0x89, 0xeb, + 0xa3, 0xa5, 0xc8, 0x12, 0x9c, 0x4a, 0xf8, 0x69, 0xc8, 0x69, 0xfc, 0xa5, 0xcf, 0x4b, 0x32, 0x4b, + 0x16, 0x25, 0x3f, 0x96, 0x83, 0xd2, 0x8a, 0xa3, 0x9b, 0x9e, 0x2b, 0xde, 0xaa, 0x9e, 0x9d, 0xda, + 0x70, 0xf4, 0x0e, 0xd3, 0x8f, 0x29, 0x8c, 0x04, 0x7c, 0x57, 0x6f, 0x75, 0xa9, 0x3b, 0x7d, 0x8f, + 0x7d, 0xdd, 0x7f, 0xbf, 0x35, 0xf9, 0xc6, 0x1a, 0x9e, 0x06, 0x4f, 0x35, 0xed, 0xf6, 0xb5, 0x35, + 0x47, 0x7f, 0x68, 0x7a, 0x68, 0x73, 0xeb, 0xad, 0x6b, 0x1e, 0x6d, 0xe1, 0xa1, 0xf3, 0x35, 0xbd, + 0x63, 0x5e, 0xc3, 0x88, 0xf3, 0xd7, 0x02, 0x4e, 0xbc, 0x06, 0xa6, 0x02, 0x1e, 0xfe, 0x25, 0xab, + 0x00, 0xc7, 0x91, 0x25, 0x00, 0xf1, 0xa9, 0xe5, 0x4e, 0x47, 0x3c, 0x7c, 0x95, 0x8e, 0x6a, 0x7d, + 0x0c, 0x57, 0xec, 0x40, 0x60, 0x7a, 0x47, 0x8a, 0xb2, 0xac, 0x49, 0x1c, 0x98, 0x16, 0xac, 0x88, + 0x16, 0xf9, 0x62, 0x1a, 0x0d, 0x25, 0xee, 0x37, 0x36, 0x45, 0x48, 0xf1, 0x62, 0x64, 0x15, 0xc6, + 0x05, 0xdf, 0x20, 0x27, 0xcb, 0x58, 0x74, 0x56, 0x88, 0xa1, 0xb9, 0xd2, 0x06, 0x6d, 0x34, 0x04, + 0x58, 0xae, 0x23, 0x56, 0x82, 0x4c, 0x87, 0x39, 0xa4, 0x97, 0xf4, 0x36, 0x75, 0x95, 0x71, 0xd4, + 0xd8, 0x4b, 0xdb, 0x5b, 0x93, 0x8a, 0x5f, 0x1e, 0x23, 0x82, 0xca, 0xa2, 0x8b, 0x16, 0x91, 0x79, + 0x70, 0xad, 0x9f, 0x48, 0xe1, 0x11, 0xd7, 0xf9, 0x68, 0x11, 0x32, 0x03, 0xa3, 0xc1, 0xbb, 0x9b, + 0x3b, 0x77, 0xaa, 0x15, 0x7c, 0x59, 0x2b, 0x82, 0xc2, 0xc6, 0xb2, 0xa6, 0xc8, 0x4c, 0x22, 0x65, + 0xa4, 0x60, 0x25, 0xfc, 0xa9, 0x6d, 0x2c, 0x58, 0x49, 0x27, 0x25, 0x58, 0x49, 0x8d, 0xbc, 0x05, + 0xc3, 0xe5, 0x7b, 0x75, 0x11, 0x84, 0xc5, 0x55, 0x4e, 0x87, 0x29, 0xb8, 0xf4, 0x0d, 0xb7, 0xe1, + 0x07, 0x6c, 0x91, 0x9b, 0x2e, 0xd3, 0x93, 0x59, 0x18, 0x8b, 0xb8, 0xee, 0xb9, 0xca, 0x19, 0xe4, + 0x80, 0x2d, 0xd7, 0x11, 0xd3, 0x70, 0x04, 0x4a, 0x1e, 0x5e, 0xd1, 0x42, 0x4c, 0x6b, 0x2a, 0xa6, + 0x8b, 0xe9, 0x8c, 0x34, 0x8a, 0xf1, 0x5e, 0xf0, 0x9d, 0xee, 0x20, 0xd7, 0x1a, 0x43, 0xa0, 0x1a, + 0x0e, 0xc7, 0xc9, 0x3d, 0x1a, 0x2b, 0x46, 0xde, 0x03, 0x82, 0x09, 0x90, 0xa8, 0xe1, 0xdf, 0xe4, + 0x56, 0x2b, 0xae, 0x72, 0x0e, 0x23, 0xa2, 0x93, 0x78, 0x7c, 0x89, 0x6a, 0x65, 0xfa, 0xb2, 0x98, + 0x3e, 0x9e, 0xd2, 0x79, 0xa9, 0x86, 0x1f, 0x5b, 0xa2, 0x61, 0x46, 0xb2, 0x43, 0xa7, 0x70, 0x25, + 0x1b, 0x70, 0xbe, 0xe6, 0xd0, 0x87, 0xa6, 0xdd, 0x75, 0xfd, 0xe5, 0xc3, 0x9f, 0xb7, 0xce, 0xef, + 0x38, 0x6f, 0x3d, 0x23, 0x2a, 0x3e, 0xdb, 0x71, 0xe8, 0xc3, 0x86, 0x1f, 0x07, 0x3b, 0x12, 0xc6, + 0x35, 0x8b, 0x3b, 0xe6, 0xb8, 0x7e, 0xbf, 0xeb, 0x50, 0x01, 0x37, 0xa9, 0xab, 0x28, 0xe1, 0x54, + 0xcb, 0x43, 0xf7, 0x98, 0x01, 0x2e, 0x92, 0xe3, 0x3a, 0x5a, 0x8c, 0x68, 0x40, 0x6e, 0xce, 0xf8, + 0xb7, 0xfa, 0xe5, 0x26, 0xcf, 0x04, 0xac, 0x5c, 0x40, 0x66, 0x2a, 0x13, 0xcb, 0x5a, 0x33, 0x88, + 0x89, 0xdf, 0xd0, 0x05, 0x5e, 0x16, 0x4b, 0xb2, 0x34, 0x59, 0x80, 0x89, 0x9a, 0x83, 0x67, 0x8c, + 0xb7, 0xe9, 0x66, 0xcd, 0x6e, 0x99, 0xcd, 0x4d, 0x7c, 0x2e, 0x2c, 0xa6, 0xca, 0x0e, 0xc7, 0x35, + 0x1e, 0xd0, 0xcd, 0x46, 0x07, 0xb1, 0xf2, 0xb2, 0x12, 0x2f, 0x29, 0xc7, 0xa8, 0x7e, 0x62, 0x77, + 0x31, 0xaa, 0x29, 0x4c, 0x08, 0x9f, 0x80, 0x47, 0x1e, 0xb5, 0xd8, 0x52, 0xef, 0x8a, 0xa7, 0xc1, + 0x4a, 0xcc, 0x87, 0x20, 0xc0, 0xf3, 0xa9, 0x43, 0x8c, 0x32, 0x1a, 0x80, 0xe5, 0x86, 0xc5, 0x8b, + 0x24, 0x03, 0x39, 0x3f, 0xb9, 0x8f, 0x40, 0xce, 0xff, 0x7b, 0x41, 0x9e, 0x7f, 0xc9, 0x25, 0x28, + 0x4a, 0x79, 0x96, 0x30, 0x4a, 0x2d, 0xc6, 0xa4, 0x2f, 0x8a, 0xe0, 0xdb, 0x43, 0xc2, 0x76, 0x09, + 0xc2, 0x11, 0x61, 0x62, 0xcd, 0x30, 0x72, 0xa9, 0x16, 0x12, 0x60, 0x52, 0xc3, 0xee, 0x6a, 0xcb, + 0x6c, 0x62, 0xa6, 0x82, 0x82, 0x14, 0x7f, 0x04, 0xa1, 0x3c, 0x51, 0x81, 0x44, 0x42, 0xae, 0xc3, + 0xb0, 0x7f, 0xb6, 0x1d, 0x46, 0x69, 0xc6, 0x00, 0xf6, 0x62, 0xb6, 0x16, 0xf1, 0xf1, 0x25, 0x22, + 0xf2, 0x3a, 0x40, 0x38, 0x1d, 0x08, 0x4b, 0x0b, 0x97, 0x0a, 0x79, 0xf6, 0x90, 0x97, 0x8a, 0x90, + 0x9a, 0x4d, 0x9c, 0xb2, 0x3a, 0xfa, 0x69, 0x5c, 0x71, 0xe2, 0x8c, 0xe8, 0xb0, 0xac, 0x20, 0xd1, + 0x22, 0x64, 0x19, 0x4e, 0x25, 0x34, 0x50, 0xc4, 0x74, 0xc6, 0x54, 0xfe, 0x29, 0xea, 0x2b, 0x2f, + 0xcc, 0x89, 0xb2, 0xe4, 0x59, 0x28, 0xdc, 0xd1, 0xaa, 0x22, 0xae, 0x2c, 0x0f, 0x49, 0x1c, 0x09, + 0x3a, 0xc5, 0xb0, 0xe4, 0x35, 0x00, 0x9e, 0xb7, 0xa5, 0x66, 0x3b, 0x1e, 0x5a, 0x14, 0xa3, 0xd3, + 0x17, 0xd8, 0x58, 0xe6, 0x79, 0x5d, 0x1a, 0x6c, 0x19, 0x93, 0x3f, 0x3a, 0x24, 0x56, 0xff, 0x74, + 0x3e, 0xb1, 0xac, 0x31, 0xc1, 0x8b, 0x56, 0x48, 0x9d, 0x8f, 0x82, 0xf7, 0x9b, 0xce, 0x05, 0x2f, + 0x11, 0x91, 0x2b, 0x30, 0x58, 0x63, 0x93, 0x4a, 0xd3, 0x6e, 0x09, 0x55, 0xc0, 0xe0, 0x62, 0x1d, + 0x01, 0xd3, 0x02, 0x2c, 0xb9, 0x2e, 0x25, 0x2e, 0x96, 0xa2, 0xbc, 0xfb, 0x89, 0x8b, 0xe3, 0xe1, + 0xce, 0x31, 0x85, 0xf1, 0xf5, 0x58, 0x22, 0x34, 0x51, 0x26, 0x65, 0x49, 0x0d, 0x13, 0x9f, 0x05, + 0x06, 0x6d, 0xff, 0x4e, 0x06, 0xad, 0xfa, 0x77, 0x72, 0xc9, 0x21, 0x4a, 0x6e, 0x24, 0x03, 0x2e, + 0xe3, 0xfa, 0x15, 0x00, 0xe5, 0x5a, 0x83, 0xd0, 0xcb, 0x91, 0xd0, 0xc9, 0xf9, 0x7d, 0x87, 0x4e, + 0x2e, 0xec, 0x31, 0x74, 0xb2, 0xfa, 0xff, 0x16, 0x7b, 0xba, 0xbf, 0x1f, 0x49, 0x88, 0xbd, 0xd7, + 0xd8, 0xa6, 0x8c, 0xd5, 0x5e, 0x76, 0x13, 0x5b, 0x0b, 0xee, 0xdd, 0xdb, 0xd0, 0xf9, 0xa8, 0x74, + 0xb5, 0x28, 0x25, 0x79, 0x1b, 0x46, 0xfc, 0x0f, 0xc0, 0x90, 0xdc, 0x52, 0x28, 0xe9, 0x60, 0x41, + 0x8c, 0x05, 0xaf, 0x8e, 0x14, 0x20, 0x2f, 0xc3, 0x10, 0x9a, 0x43, 0x1d, 0xbd, 0xe9, 0xc7, 0x6b, + 0xe7, 0x01, 0xde, 0x7d, 0xa0, 0x1c, 0x46, 0x2e, 0xa0, 0x24, 0x5f, 0x80, 0x92, 0x48, 0x5a, 0xc2, + 0x73, 0xfa, 0x5f, 0xdb, 0xc5, 0x7b, 0x81, 0x29, 0x39, 0x61, 0x09, 0xdf, 0xe0, 0x20, 0x20, 0xb2, + 0xc1, 0xe1, 0xb9, 0x4a, 0x56, 0xe0, 0x74, 0xcd, 0xa1, 0x06, 0xbe, 0x4c, 0x99, 0x7d, 0xd4, 0x71, + 0x44, 0x3a, 0x19, 0x3e, 0x41, 0xe0, 0xfa, 0xd6, 0xf1, 0xd1, 0x6c, 0xe5, 0x15, 0x78, 0x39, 0x68, + 0x74, 0x4a, 0x71, 0x66, 0xf4, 0xf0, 0x96, 0xdc, 0xa6, 0x9b, 0x1b, 0xb6, 0x63, 0xf0, 0x8c, 0x2b, + 0x62, 0xea, 0x17, 0x82, 0x7e, 0x20, 0x50, 0xb2, 0xd1, 0x13, 0x2d, 0x74, 0xf1, 0x35, 0x18, 0xde, + 0x6f, 0xd2, 0x8f, 0x5f, 0xcd, 0x67, 0x3c, 0x24, 0x7b, 0x7c, 0xf3, 0x2e, 0x06, 0xc9, 0xc0, 0xfb, + 0x33, 0x92, 0x81, 0xff, 0x49, 0x3e, 0xe3, 0x95, 0xdc, 0x63, 0x9d, 0xb4, 0x37, 0x10, 0x46, 0x34, + 0x69, 0x6f, 0x98, 0x2f, 0xd9, 0x34, 0x34, 0x99, 0x28, 0x96, 0xde, 0xbb, 0xb4, 0x63, 0x7a, 0xef, + 0x5f, 0x2c, 0xf4, 0x7a, 0x45, 0x78, 0x22, 0xfb, 0xbd, 0xc8, 0xfe, 0x3a, 0x0c, 0x07, 0x92, 0xad, + 0x56, 0xd0, 0x5e, 0x1a, 0x0d, 0x52, 0x0c, 0x71, 0x30, 0x96, 0x91, 0x88, 0xc8, 0x55, 0xde, 0xd6, + 0xba, 0xf9, 0x3e, 0x4f, 0x76, 0x31, 0x2a, 0xd2, 0x18, 0xe8, 0x9e, 0xde, 0x70, 0xcd, 0xf7, 0xa9, + 0x16, 0xa0, 0xd5, 0xbf, 0x97, 0x4f, 0x7d, 0x8a, 0x79, 0xd2, 0x47, 0x7b, 0xe8, 0xa3, 0x14, 0x21, + 0xf2, 0x47, 0xa4, 0x27, 0x42, 0xdc, 0x83, 0x10, 0xff, 0x38, 0x9f, 0xfa, 0xe4, 0xf6, 0x44, 0x88, + 0x7b, 0x99, 0x2d, 0x9e, 0x87, 0x21, 0xcd, 0xde, 0x70, 0x67, 0x70, 0x4f, 0xc4, 0xe7, 0x0a, 0x9c, + 0xa8, 0x1d, 0x7b, 0xc3, 0x6d, 0xe0, 0x6e, 0x47, 0x0b, 0x09, 0xd4, 0xef, 0xe7, 0x7b, 0x3c, 0x4a, + 0x3e, 0x11, 0xfc, 0x07, 0xb9, 0x44, 0xfe, 0x46, 0x3e, 0xf2, 0xe8, 0xf9, 0xf1, 0x15, 0xf6, 0x35, + 0x80, 0x7a, 0x73, 0x9d, 0xb6, 0x75, 0x29, 0x61, 0x18, 0x1e, 0x59, 0xb8, 0x08, 0x15, 0x89, 0xa6, + 0x43, 0x12, 0xf5, 0x5b, 0xf9, 0xd8, 0xab, 0xef, 0x13, 0xd9, 0xed, 0x5a, 0x76, 0x81, 0xd6, 0x89, + 0x87, 0xec, 0x27, 0x92, 0xdb, 0xad, 0xe4, 0x7e, 0x3c, 0x1f, 0x7b, 0xf3, 0xff, 0xd8, 0xca, 0x8e, + 0x0d, 0xc0, 0x64, 0x2c, 0x82, 0xc7, 0x56, 0x93, 0x9e, 0x87, 0x21, 0x21, 0x87, 0x60, 0xa9, 0xe0, + 0xf3, 0x3e, 0x07, 0xe2, 0x01, 0x6d, 0x40, 0xa0, 0xfe, 0x99, 0x3c, 0x44, 0x63, 0x31, 0x3c, 0xa6, + 0x3a, 0xf4, 0x1b, 0xf9, 0x68, 0x14, 0x8a, 0xc7, 0x57, 0x7f, 0xa6, 0x00, 0xea, 0xdd, 0xd5, 0xa6, + 0x08, 0x62, 0xdc, 0x2f, 0x9d, 0xf0, 0x07, 0x50, 0x4d, 0xa2, 0x50, 0xff, 0xbf, 0x7c, 0x6a, 0x68, + 0x8c, 0xc7, 0x57, 0x80, 0x2f, 0xe1, 0xa9, 0x78, 0xd3, 0x0a, 0x27, 0x72, 0x3c, 0x84, 0x64, 0xe3, + 0x2f, 0x91, 0x65, 0xd2, 0x27, 0x24, 0x9f, 0x4e, 0x31, 0xd7, 0x30, 0x07, 0x46, 0x68, 0xae, 0xc9, + 0x87, 0xf9, 0x92, 0xe1, 0xf6, 0xbb, 0xf9, 0x9d, 0x22, 0x89, 0x3c, 0xce, 0xab, 0xea, 0x40, 0x4d, + 0xdf, 0xc4, 0x88, 0x97, 0xac, 0x27, 0x46, 0x78, 0x0e, 0xc4, 0x0e, 0x07, 0xc9, 0xd7, 0x76, 0x82, + 0x4a, 0xfd, 0x67, 0xfd, 0xe9, 0x61, 0x2c, 0x1e, 0x5f, 0x11, 0x5e, 0x82, 0x62, 0x4d, 0xf7, 0xd6, + 0x85, 0x26, 0xe3, 0x6d, 0x60, 0x47, 0xf7, 0xd6, 0x35, 0x84, 0x92, 0xab, 0x30, 0xa8, 0xe9, 0x1b, + 0xfc, 0xcc, 0xb3, 0x14, 0xe6, 0xa7, 0x74, 0xf4, 0x8d, 0x06, 0x3f, 0xf7, 0x0c, 0xd0, 0x44, 0x0d, + 0xf2, 0xa3, 0xf2, 0x93, 0x6f, 0x4c, 0xce, 0xc7, 0xf3, 0xa3, 0x06, 0x59, 0x51, 0x2f, 0x41, 0x71, + 0xda, 0x36, 0x36, 0xf1, 0xe6, 0x6b, 0x84, 0x57, 0xb6, 0x6a, 0x1b, 0x9b, 0x1a, 0x42, 0xc9, 0x4f, + 0xe4, 0x60, 0x60, 0x9e, 0xea, 0x06, 0x1b, 0x21, 0x43, 0xbd, 0x1c, 0x56, 0x3e, 0x77, 0x38, 0x0e, + 0x2b, 0xa7, 0xd6, 0x79, 0x65, 0xb2, 0xa2, 0x88, 0xfa, 0xc9, 0x4d, 0x18, 0x9c, 0xd1, 0x3d, 0xba, + 0x66, 0x3b, 0x9b, 0xe8, 0x82, 0x33, 0x16, 0x3e, 0x85, 0x88, 0xe8, 0x8f, 0x4f, 0xc4, 0x6f, 0xc6, + 0x9a, 0xe2, 0x97, 0x16, 0x14, 0x66, 0x62, 0xe1, 0x37, 0x73, 0x22, 0x17, 0x38, 0x8a, 0x85, 0x5f, + 0xe1, 0x69, 0x02, 0x13, 0x1e, 0x2b, 0x8f, 0xa4, 0x1f, 0x2b, 0xa3, 0xf5, 0x88, 0x6e, 0x7a, 0x98, + 0x95, 0x74, 0x14, 0x17, 0x7d, 0x6e, 0x3d, 0x22, 0x14, 0x93, 0x92, 0x6a, 0x12, 0x89, 0xfa, 0xbd, + 0x7e, 0x48, 0x7d, 0xf4, 0x7e, 0xa2, 0xe4, 0x27, 0x4a, 0x1e, 0x2a, 0x79, 0x25, 0xa1, 0xe4, 0x17, + 0x93, 0x61, 0x14, 0x3e, 0xa4, 0x1a, 0xfe, 0xf5, 0x62, 0x22, 0x08, 0xcb, 0xe3, 0xbd, 0xbb, 0x0c, + 0xa5, 0xd7, 0xbf, 0xa3, 0xf4, 0x82, 0x01, 0x51, 0xda, 0x71, 0x40, 0x0c, 0xec, 0x76, 0x40, 0x0c, + 0x66, 0x0e, 0x88, 0x50, 0x41, 0x86, 0x32, 0x15, 0xa4, 0x2a, 0x06, 0x0d, 0xf4, 0xce, 0x05, 0x73, + 0x69, 0x7b, 0x6b, 0x72, 0x8c, 0x8d, 0xa6, 0xd4, 0x24, 0x30, 0xc8, 0x42, 0xfd, 0xbd, 0x62, 0x8f, + 0xc8, 0x49, 0x47, 0xa2, 0x23, 0x2f, 0x41, 0xa1, 0xdc, 0xe9, 0x08, 0xfd, 0x38, 0x2d, 0x05, 0x6d, + 0xca, 0x28, 0xc5, 0xa8, 0xc9, 0xeb, 0x50, 0x28, 0xdf, 0xab, 0xc7, 0xf3, 0xbf, 0x94, 0xef, 0xd5, + 0xc5, 0x97, 0x64, 0x96, 0xbd, 0x57, 0x27, 0x6f, 0x86, 0x81, 0x58, 0xd7, 0xbb, 0xd6, 0x03, 0xb1, + 0x51, 0x14, 0x9e, 0xba, 0xbe, 0x27, 0x4f, 0x93, 0xa1, 0xd8, 0x76, 0x31, 0x46, 0x1b, 0xd3, 0xa6, + 0xd2, 0xee, 0xb5, 0x69, 0x60, 0x47, 0x6d, 0x1a, 0xdc, 0xad, 0x36, 0x0d, 0xed, 0x42, 0x9b, 0x60, + 0x47, 0x6d, 0x1a, 0x3e, 0xb8, 0x36, 0x75, 0xe0, 0x62, 0x32, 0xda, 0x5d, 0xa0, 0x11, 0x1a, 0x90, + 0x24, 0x56, 0x38, 0x96, 0xe0, 0xd5, 0x7f, 0x97, 0x63, 0x1b, 0x1b, 0x88, 0x6e, 0xb8, 0x0c, 0x2f, + 0xbb, 0xb6, 0x25, 0x4b, 0xab, 0xbf, 0x9a, 0xcf, 0x0e, 0xd2, 0x77, 0x3c, 0xa7, 0xb8, 0x1f, 0x4a, + 0x95, 0x52, 0x31, 0x1a, 0x34, 0x21, 0x5b, 0xca, 0x31, 0xb6, 0x69, 0x32, 0xfb, 0x66, 0x3e, 0x2b, + 0x72, 0xe0, 0x81, 0x24, 0xf6, 0xf1, 0xa4, 0x33, 0x1c, 0xba, 0xf8, 0xbb, 0x51, 0x2f, 0xb8, 0x39, + 0x18, 0x91, 0x85, 0x28, 0xa4, 0xb4, 0x1b, 0x01, 0x47, 0xca, 0x91, 0x37, 0x83, 0x34, 0x3d, 0x92, + 0x7f, 0x0c, 0x7a, 0xba, 0xf9, 0x63, 0x36, 0xe6, 0x1e, 0x23, 0x93, 0x93, 0xe7, 0xa1, 0x34, 0x87, + 0x71, 0xef, 0xe5, 0xc1, 0xce, 0x23, 0xe1, 0xcb, 0x5e, 0x2b, 0x9c, 0x46, 0xfd, 0x3b, 0x39, 0x38, + 0x7d, 0xbb, 0xbb, 0x4a, 0x85, 0xa3, 0x5d, 0xd0, 0x86, 0xf7, 0x00, 0x18, 0x58, 0x38, 0xcc, 0xe4, + 0xd0, 0x61, 0xe6, 0x93, 0x72, 0x84, 0xc1, 0x58, 0x81, 0xa9, 0x90, 0x9a, 0x3b, 0xcb, 0x3c, 0xe9, + 0xfb, 0x9c, 0x3e, 0xe8, 0xae, 0xd2, 0x46, 0xc2, 0x6b, 0x46, 0xe2, 0x7e, 0xf1, 0x2d, 0xee, 0xcd, + 0xbf, 0x5f, 0x07, 0x95, 0x5f, 0xc9, 0x67, 0x06, 0x75, 0x3c, 0xb6, 0xd9, 0x47, 0x7f, 0x20, 0xb5, + 0x57, 0xe2, 0x59, 0x48, 0x53, 0x48, 0x62, 0x1c, 0xd3, 0xb8, 0xa4, 0x0b, 0xec, 0x98, 0xe7, 0xc4, + 0xfd, 0x40, 0x05, 0xf6, 0x87, 0xb9, 0xcc, 0xe0, 0x9b, 0xc7, 0x55, 0x60, 0xea, 0xff, 0x52, 0xf0, + 0x63, 0x7e, 0x1e, 0xe8, 0x13, 0x9e, 0x87, 0x21, 0x11, 0xfa, 0x20, 0xea, 0x27, 0x2c, 0x8e, 0x0d, + 0xf1, 0x18, 0x3a, 0x20, 0x60, 0x26, 0x85, 0xe4, 0xc4, 0x2c, 0xf9, 0x09, 0x4b, 0x0e, 0xcc, 0x9a, + 0x44, 0xc2, 0x8c, 0x86, 0xd9, 0x47, 0xa6, 0x87, 0x16, 0x08, 0xeb, 0xcb, 0x02, 0x37, 0x1a, 0xe8, + 0x23, 0xd3, 0xe3, 0xf6, 0x47, 0x80, 0x66, 0x06, 0x41, 0x3d, 0xcc, 0xf8, 0x2f, 0x0c, 0x02, 0x6e, + 0xaa, 0x68, 0x02, 0xc3, 0x5a, 0x2b, 0x9c, 0x6f, 0x85, 0x4b, 0x8b, 0x68, 0xad, 0x70, 0xd7, 0xc5, + 0xd6, 0x06, 0x04, 0x8c, 0xa3, 0x46, 0xd7, 0x42, 0x27, 0x3e, 0xe4, 0xe8, 0x20, 0x44, 0x13, 0x18, + 0x72, 0x1d, 0xc6, 0xea, 0x9e, 0x6e, 0x19, 0xba, 0x63, 0x2c, 0x77, 0xbd, 0x4e, 0xd7, 0x93, 0x0d, + 0x60, 0xd7, 0x33, 0xec, 0xae, 0xa7, 0xc5, 0x28, 0xc8, 0xa7, 0x60, 0xd4, 0x87, 0xcc, 0x3a, 0x8e, + 0xed, 0xc8, 0x56, 0x8e, 0xeb, 0x19, 0xd4, 0x71, 0xb4, 0x28, 0x01, 0xf9, 0x34, 0x8c, 0x56, 0xad, + 0x87, 0x76, 0x93, 0x3f, 0xff, 0xd7, 0x16, 0x84, 0xcd, 0x83, 0x2f, 0xc6, 0xcc, 0x00, 0xd1, 0xe8, + 0x3a, 0x2d, 0x2d, 0x4a, 0xa8, 0x6e, 0xe7, 0x93, 0xa1, 0x51, 0x1f, 0xdf, 0x0d, 0xd2, 0xd5, 0xa8, + 0xe3, 0x1e, 0x7a, 0xab, 0xa2, 0xf1, 0x29, 0xfb, 0x0d, 0x73, 0x1b, 0xf4, 0x3a, 0x0c, 0xde, 0xa6, + 0x9b, 0xdc, 0xc7, 0xb4, 0x14, 0xba, 0x25, 0x3f, 0x10, 0x30, 0xf9, 0x74, 0xd7, 0xa7, 0x53, 0xbf, + 0x9d, 0x4f, 0x06, 0x7d, 0x7d, 0x7c, 0x85, 0xfd, 0x29, 0x18, 0x40, 0x51, 0x56, 0xfd, 0xeb, 0x05, + 0x14, 0x20, 0x8a, 0x3b, 0xea, 0xed, 0xec, 0x93, 0xa9, 0xbf, 0x50, 0x8a, 0x47, 0x02, 0x7e, 0x7c, + 0xa5, 0xf7, 0x06, 0x0c, 0xcf, 0xd8, 0x96, 0x6b, 0xba, 0x1e, 0xb5, 0x9a, 0xbe, 0xc2, 0xa2, 0xe3, + 0x7f, 0x33, 0x04, 0xcb, 0x36, 0xa0, 0x44, 0xbd, 0x1f, 0xe5, 0x25, 0xaf, 0xc0, 0x10, 0x8a, 0x1c, + 0x6d, 0x4e, 0x3e, 0xe1, 0xe1, 0xcd, 0xc4, 0x2a, 0x03, 0xc6, 0x2d, 0xce, 0x90, 0x94, 0xdc, 0x81, + 0xc1, 0x99, 0x75, 0xb3, 0x65, 0x38, 0xd4, 0x42, 0xdf, 0x64, 0x29, 0xe0, 0x4a, 0xb4, 0x2f, 0xa7, + 0xf0, 0x5f, 0xa4, 0xe5, 0xcd, 0x69, 0x8a, 0x62, 0x91, 0xc7, 0x62, 0x02, 0x76, 0xf1, 0x67, 0xf2, + 0x00, 0x61, 0x01, 0xf2, 0x34, 0xe4, 0x83, 0x64, 0xda, 0xe8, 0x12, 0x13, 0xd1, 0xa0, 0x3c, 0x2e, + 0x15, 0x62, 0x6c, 0xe7, 0x77, 0x1c, 0xdb, 0x77, 0xa0, 0xc4, 0x4f, 0xd7, 0xd0, 0x6b, 0x5d, 0x0a, + 0x4e, 0x9a, 0xd9, 0xe0, 0x29, 0xa4, 0xe7, 0xb6, 0x34, 0x5a, 0x9e, 0x11, 0x0f, 0x70, 0xce, 0xec, + 0x62, 0x13, 0xfa, 0xf1, 0x2f, 0x72, 0x19, 0x8a, 0x2b, 0x7e, 0x22, 0xde, 0x51, 0x3e, 0x4b, 0xc7, + 0xe4, 0x87, 0x78, 0xd6, 0x4d, 0x33, 0xb6, 0xe5, 0xb1, 0xaa, 0xb1, 0xd5, 0x23, 0x42, 0x2e, 0x02, + 0x16, 0x91, 0x8b, 0x80, 0xa9, 0xff, 0x55, 0x3e, 0x25, 0x46, 0xf5, 0xe3, 0x3b, 0x4c, 0x5e, 0x03, + 0xc0, 0x97, 0xe7, 0x4c, 0x9e, 0xfe, 0x73, 0x10, 0x1c, 0x25, 0xc8, 0x08, 0xd5, 0x36, 0xb2, 0xed, + 0x08, 0x89, 0xd5, 0x7f, 0x90, 0x4b, 0x04, 0x36, 0x3e, 0x90, 0x1c, 0x65, 0xab, 0x2c, 0xbf, 0x4f, + 0x33, 0xd6, 0xef, 0x8b, 0xc2, 0xde, 0xfa, 0x22, 0xfa, 0x2d, 0x87, 0x60, 0x99, 0x1e, 0xe5, 0xb7, + 0x7c, 0x2f, 0x9f, 0x16, 0xe6, 0xf9, 0x78, 0xaa, 0xf8, 0x8d, 0xc0, 0x28, 0x2d, 0xc6, 0x02, 0xeb, + 0x23, 0x34, 0x9e, 0x2c, 0x5c, 0x98, 0xa9, 0x5f, 0x84, 0xf1, 0x58, 0xf0, 0x63, 0x91, 0xb7, 0xf9, + 0x72, 0xef, 0x28, 0xca, 0xd9, 0x31, 0x0b, 0x22, 0x64, 0xea, 0xff, 0x9f, 0xeb, 0x1d, 0xfa, 0xfa, + 0xc8, 0x55, 0x27, 0x45, 0x00, 0x85, 0x7f, 0x3d, 0x02, 0x38, 0x84, 0x6d, 0xf0, 0xf1, 0x16, 0xc0, + 0x87, 0x64, 0xf2, 0xf8, 0xa0, 0x05, 0xf0, 0x0b, 0xb9, 0x1d, 0x23, 0x97, 0x1f, 0xb5, 0x0c, 0xd4, + 0xff, 0x31, 0x97, 0x1a, 0x61, 0xfc, 0x40, 0xed, 0x7a, 0x13, 0x4a, 0xdc, 0x85, 0x47, 0xb4, 0x4a, + 0xca, 0xc9, 0xc6, 0xa0, 0x19, 0xe5, 0x45, 0x19, 0xb2, 0x00, 0x03, 0xbc, 0x0d, 0x86, 0xe8, 0x8d, + 0x8f, 0xf5, 0x08, 0x73, 0x6e, 0x64, 0x4d, 0x8e, 0x02, 0xad, 0xfe, 0xdd, 0x5c, 0x22, 0xe0, 0xf9, + 0x11, 0x7e, 0x5b, 0x38, 0x55, 0x17, 0x76, 0x3f, 0x55, 0xab, 0xff, 0x34, 0x9f, 0x1e, 0x6f, 0xfd, + 0x08, 0x3f, 0xe4, 0x30, 0x8e, 0xd3, 0xf6, 0xb7, 0x6e, 0xad, 0xc0, 0x58, 0x54, 0x16, 0x62, 0xd9, + 0x7a, 0x2a, 0x3d, 0xea, 0x7c, 0x46, 0x2b, 0x62, 0x3c, 0xd4, 0xef, 0xe6, 0x92, 0xa1, 0xe2, 0x8f, + 0x7c, 0x7e, 0xda, 0x9f, 0xb6, 0x44, 0x3f, 0xe5, 0x43, 0xb2, 0xd6, 0x1c, 0xc6, 0xa7, 0x7c, 0x48, + 0x56, 0x8d, 0xfd, 0x7d, 0xca, 0x2f, 0xe5, 0xb3, 0x22, 0xed, 0x1f, 0xf9, 0x07, 0x7d, 0x5e, 0x16, + 0x32, 0x6f, 0x99, 0xf8, 0xb4, 0xa7, 0xb3, 0x42, 0xdb, 0x67, 0xf0, 0x4c, 0xf0, 0xd9, 0xdf, 0x18, + 0x4f, 0x15, 0xd6, 0x87, 0x44, 0x91, 0x8f, 0x87, 0xb0, 0x3e, 0x24, 0x43, 0xe5, 0xc3, 0x27, 0xac, + 0xdf, 0xca, 0xef, 0x36, 0xbd, 0xc3, 0x89, 0xf0, 0x12, 0xc2, 0xfb, 0x6a, 0x3e, 0x99, 0x76, 0xe4, + 0xc8, 0xc5, 0x34, 0x07, 0x25, 0x91, 0x00, 0x25, 0x53, 0x38, 0x1c, 0x9f, 0x65, 0xd1, 0x88, 0xef, + 0xb8, 0x01, 0xe2, 0x22, 0x67, 0x77, 0x22, 0xe1, 0xb4, 0xea, 0xf7, 0x73, 0xb1, 0x1c, 0x1d, 0x47, + 0x72, 0x84, 0xb0, 0xaf, 0x25, 0x89, 0xbc, 0xe5, 0x1f, 0x66, 0x16, 0x63, 0x31, 0xd2, 0x83, 0xef, + 0xa9, 0x50, 0x4f, 0x37, 0x5b, 0xf1, 0xf2, 0x22, 0xfe, 0xc0, 0xb7, 0xf3, 0x70, 0x2a, 0x41, 0x4a, + 0x2e, 0x47, 0x22, 0xfe, 0xe0, 0xb1, 0x64, 0xcc, 0x51, 0x9d, 0xc7, 0xfe, 0xd9, 0xc3, 0x49, 0xea, + 0x65, 0x28, 0x56, 0xf4, 0x4d, 0xfe, 0x6d, 0xfd, 0x9c, 0xa5, 0xa1, 0x6f, 0xca, 0x27, 0x6e, 0x88, + 0x27, 0xab, 0x70, 0x96, 0xdf, 0x87, 0x98, 0xb6, 0xb5, 0x62, 0xb6, 0x69, 0xd5, 0x5a, 0x34, 0x5b, + 0x2d, 0xd3, 0x15, 0x97, 0x7a, 0xcf, 0x6f, 0x6f, 0x4d, 0x5e, 0xf1, 0x6c, 0x4f, 0x6f, 0x35, 0xa8, + 0x4f, 0xd6, 0xf0, 0xcc, 0x36, 0x6d, 0x98, 0x56, 0xa3, 0x8d, 0x94, 0x12, 0xcb, 0x74, 0x56, 0xa4, + 0xca, 0xc3, 0xe1, 0xd7, 0x9b, 0xba, 0x65, 0x51, 0xa3, 0x6a, 0x4d, 0x6f, 0x7a, 0x94, 0x5f, 0x06, + 0x16, 0xf8, 0x91, 0x20, 0x7f, 0x87, 0xce, 0xd1, 0x8c, 0xf1, 0x2a, 0x23, 0xd0, 0x52, 0x0a, 0xa9, + 0xbf, 0x5d, 0x4c, 0x49, 0xcf, 0x72, 0x8c, 0xd4, 0xc7, 0xef, 0xe9, 0xe2, 0x0e, 0x3d, 0x7d, 0x0d, + 0x06, 0x44, 0xbc, 0x61, 0x71, 0xc1, 0x80, 0x8e, 0xf3, 0x0f, 0x39, 0x48, 0xbe, 0xa1, 0x11, 0x54, + 0xa4, 0x05, 0x17, 0x57, 0x58, 0x37, 0xa5, 0x77, 0x66, 0x69, 0x1f, 0x9d, 0xd9, 0x83, 0x1f, 0x79, + 0x17, 0xce, 0x23, 0x36, 0xa5, 0x5b, 0x07, 0xb0, 0x2a, 0x0c, 0xa5, 0xc5, 0xab, 0x4a, 0xef, 0xdc, + 0xac, 0xf2, 0xe4, 0xf3, 0x30, 0x12, 0x0c, 0x10, 0x93, 0xba, 0xe2, 0xe6, 0xa2, 0xc7, 0x38, 0xe3, + 0x71, 0xea, 0x18, 0x18, 0xdd, 0xd5, 0xa2, 0xb1, 0xce, 0x22, 0xbc, 0xd4, 0xff, 0x21, 0xd7, 0x2b, + 0x4d, 0xcc, 0x91, 0xcf, 0xca, 0x6f, 0xc1, 0x80, 0xc1, 0x3f, 0x4a, 0xe8, 0x54, 0xef, 0x44, 0x32, + 0x9c, 0x54, 0xf3, 0xcb, 0xa8, 0xff, 0x24, 0xd7, 0x33, 0x3b, 0xcd, 0x71, 0xff, 0xbc, 0xaf, 0x16, + 0x32, 0x3e, 0x4f, 0x4c, 0xa2, 0x57, 0x61, 0xc2, 0x0c, 0xc3, 0xe7, 0x37, 0xc2, 0x50, 0x57, 0xda, + 0xb8, 0x04, 0xc7, 0xd1, 0x75, 0x03, 0x02, 0x87, 0x2d, 0xc7, 0xf7, 0x46, 0x73, 0x1b, 0x5d, 0xc7, + 0xe4, 0xe3, 0x52, 0x3b, 0xe3, 0xc6, 0x5c, 0xd5, 0xdc, 0x3b, 0x8e, 0xc9, 0x2a, 0xd0, 0xbd, 0x75, + 0x6a, 0xe9, 0x8d, 0x0d, 0xdb, 0x79, 0x80, 0xc1, 0x50, 0xf9, 0xe0, 0xd4, 0xc6, 0x39, 0xfc, 0x9e, + 0x0f, 0x26, 0xcf, 0xc2, 0xe8, 0x5a, 0xab, 0x4b, 0x83, 0xf0, 0x93, 0xfc, 0xae, 0x4f, 0x1b, 0x61, + 0xc0, 0xe0, 0x86, 0xe4, 0x49, 0x00, 0x24, 0xf2, 0x30, 0x77, 0x10, 0x5e, 0xec, 0x69, 0x43, 0x0c, + 0xb2, 0x22, 0xba, 0xeb, 0x22, 0xd7, 0x6a, 0x2e, 0xa4, 0x46, 0xcb, 0xb6, 0xd6, 0x1a, 0x1e, 0x75, + 0xda, 0xd8, 0x50, 0x74, 0x66, 0xd0, 0xce, 0x21, 0x05, 0x5e, 0x9d, 0xb8, 0x0b, 0xb6, 0xb5, 0xb6, + 0x42, 0x9d, 0x36, 0x6b, 0xea, 0xf3, 0x40, 0x44, 0x53, 0x1d, 0x3c, 0xf4, 0xe0, 0x1f, 0x87, 0xde, + 0x0c, 0x9a, 0xf8, 0x08, 0x7e, 0x1a, 0x82, 0x1f, 0x36, 0x09, 0xc3, 0x3c, 0x06, 0x1f, 0x17, 0x1a, + 0xba, 0x30, 0x68, 0xc0, 0x41, 0x28, 0xaf, 0x73, 0x20, 0xbc, 0x2b, 0xb8, 0x07, 0xb9, 0x26, 0x7e, + 0xa9, 0x5f, 0x2e, 0xa4, 0x25, 0xd4, 0x39, 0x90, 0xa2, 0x85, 0xd3, 0x6a, 0x7e, 0x4f, 0xd3, 0xea, + 0xb8, 0xd5, 0x6d, 0x37, 0xf4, 0x4e, 0xa7, 0x71, 0xdf, 0x6c, 0xe1, 0x13, 0x2e, 0x5c, 0xf8, 0xb4, + 0x51, 0xab, 0xdb, 0x2e, 0x77, 0x3a, 0x73, 0x1c, 0x48, 0x9e, 0x83, 0x53, 0x8c, 0x0e, 0x3b, 0x29, + 0xa0, 0x2c, 0x22, 0x25, 0x63, 0x80, 0x41, 0x6c, 0x7d, 0xda, 0x0b, 0x30, 0x28, 0x78, 0xf2, 0xb5, + 0xaa, 0x5f, 0x1b, 0xe0, 0xcc, 0x5c, 0xd6, 0x73, 0x01, 0x1b, 0x3e, 0xb9, 0xf6, 0x6b, 0x43, 0x7e, + 0x79, 0x0c, 0xd5, 0x6c, 0x75, 0xdb, 0x3c, 0xfa, 0xd6, 0x00, 0x22, 0x83, 0xdf, 0xe4, 0x32, 0x8c, + 0x31, 0x2e, 0x81, 0xc0, 0x78, 0x74, 0xdb, 0x7e, 0x2d, 0x06, 0x25, 0xd7, 0xe1, 0x4c, 0x04, 0xc2, + 0x6d, 0x50, 0xfe, 0x24, 0xa1, 0x5f, 0x4b, 0xc5, 0xa9, 0xdf, 0x2a, 0x44, 0xd3, 0xfc, 0x1c, 0x41, + 0x47, 0x9c, 0x87, 0x01, 0xdb, 0x59, 0x6b, 0x74, 0x9d, 0x96, 0x18, 0x7b, 0x25, 0xdb, 0x59, 0xbb, + 0xe3, 0xb4, 0xc8, 0x59, 0x28, 0xb1, 0xde, 0x31, 0x0d, 0x31, 0xc4, 0xfa, 0xf5, 0x4e, 0xa7, 0x6a, + 0x90, 0x32, 0xef, 0x10, 0x8c, 0x8c, 0xda, 0x68, 0xe2, 0xd6, 0x9e, 0x3b, 0x25, 0xf4, 0xf3, 0x15, + 0x2f, 0x81, 0xc4, 0x7e, 0xc2, 0x78, 0xa9, 0xfc, 0x20, 0x20, 0xc6, 0xc2, 0xc0, 0x6d, 0x89, 0xc1, + 0xfb, 0x24, 0xce, 0x42, 0x20, 0x43, 0x16, 0x7c, 0x13, 0x63, 0x90, 0x0a, 0x90, 0x90, 0xaa, 0x6d, + 0x1b, 0xe6, 0x7d, 0x93, 0xf2, 0x17, 0x24, 0xfd, 0xfc, 0xe2, 0x37, 0x89, 0xd5, 0x26, 0x7c, 0x26, + 0x8b, 0x02, 0x42, 0xde, 0xe0, 0x4a, 0xc8, 0xe9, 0x70, 0xed, 0xe3, 0x7d, 0xcb, 0xed, 0xb4, 0x18, + 0x0a, 0x35, 0x13, 0xcb, 0xe3, 0x42, 0xa8, 0xfe, 0xd5, 0x62, 0x32, 0xd7, 0xd3, 0x91, 0xd8, 0x35, + 0xf3, 0x00, 0x22, 0x95, 0x5b, 0x78, 0xb9, 0x16, 0x78, 0xb7, 0x87, 0x98, 0x0c, 0x1e, 0x52, 0x59, + 0x72, 0x15, 0x06, 0xf9, 0x17, 0x55, 0x2b, 0xc2, 0xde, 0x41, 0x17, 0x31, 0xb7, 0x63, 0xde, 0xbf, + 0x8f, 0xfe, 0x64, 0x01, 0x9a, 0x5c, 0x86, 0x81, 0xca, 0x52, 0xbd, 0x5e, 0x5e, 0xf2, 0x6f, 0x8a, + 0xf1, 0x2d, 0x8b, 0x61, 0xb9, 0x0d, 0x57, 0xb7, 0x5c, 0xcd, 0x47, 0x92, 0x67, 0xa1, 0x54, 0xad, + 0x21, 0x19, 0x7f, 0xa1, 0x39, 0xbc, 0xbd, 0x35, 0x39, 0x60, 0x76, 0x38, 0x95, 0x40, 0x61, 0xbd, + 0x77, 0xab, 0x15, 0xc9, 0x5d, 0x82, 0xd7, 0xfb, 0xd0, 0x34, 0xf0, 0xda, 0x59, 0x0b, 0xd0, 0xe4, + 0x65, 0x18, 0xa9, 0x53, 0xc7, 0xd4, 0x5b, 0x4b, 0x5d, 0xdc, 0x2a, 0x4a, 0x11, 0x1f, 0x5d, 0x84, + 0x37, 0x2c, 0x44, 0x68, 0x11, 0x32, 0x72, 0x09, 0x8a, 0xf3, 0xa6, 0xe5, 0x3f, 0x97, 0x40, 0x7f, + 0xfa, 0x75, 0xd3, 0xf2, 0x34, 0x84, 0x92, 0x67, 0xa1, 0x70, 0x6b, 0xa5, 0x2a, 0x3c, 0xc1, 0x90, + 0xd7, 0x7b, 0x5e, 0x24, 0x7a, 0xe4, 0xad, 0x95, 0x2a, 0x79, 0x19, 0x86, 0xd8, 0x22, 0x46, 0xad, + 0x26, 0x75, 0x95, 0x61, 0xfc, 0x18, 0x1e, 0xb2, 0xd0, 0x07, 0xca, 0x3e, 0x1d, 0x01, 0xa5, 0xfa, + 0x7f, 0xe6, 0xd3, 0x93, 0x71, 0x1d, 0xc1, 0x50, 0xdf, 0xe7, 0x2d, 0x72, 0x4c, 0xc1, 0x8a, 0x07, + 0x50, 0xb0, 0xfb, 0x30, 0x5e, 0x36, 0xda, 0xa6, 0x55, 0xc6, 0x9f, 0xee, 0xe2, 0x5c, 0x19, 0xa7, + 0x0e, 0xe9, 0x29, 0x60, 0x0c, 0x2d, 0xbe, 0x87, 0xc7, 0x25, 0x66, 0xa8, 0x86, 0xce, 0x71, 0x8d, + 0xf6, 0x7d, 0xbd, 0xd1, 0xe4, 0x79, 0xac, 0xb4, 0x38, 0x53, 0xf5, 0xa7, 0xf3, 0x3b, 0xe4, 0x0f, + 0x7b, 0x1c, 0xa5, 0xaf, 0x7e, 0x2d, 0xdf, 0x3b, 0x85, 0xdb, 0x63, 0x29, 0x94, 0x3f, 0xce, 0xa7, + 0x24, 0x54, 0x3b, 0x90, 0x24, 0xae, 0xc2, 0x20, 0x67, 0x13, 0xb8, 0xf1, 0xe2, 0x6c, 0xc6, 0x95, + 0x15, 0x67, 0x51, 0x1f, 0x4d, 0x96, 0xe0, 0x4c, 0xf9, 0xfe, 0x7d, 0xda, 0xf4, 0xc2, 0x08, 0xd5, + 0x4b, 0x61, 0xc0, 0x57, 0x1e, 0x91, 0x57, 0xe0, 0xc3, 0x08, 0xd7, 0x18, 0xd8, 0x24, 0xb5, 0x1c, + 0x59, 0x81, 0x73, 0x71, 0x78, 0x9d, 0x6f, 0x01, 0x8a, 0x52, 0x90, 0xde, 0x04, 0x47, 0xfe, 0x9f, + 0x96, 0x51, 0x36, 0xad, 0x95, 0x38, 0x55, 0xf7, 0xf7, 0x6a, 0x25, 0xce, 0xdb, 0xa9, 0xe5, 0xd4, + 0x6f, 0x17, 0xe4, 0xbc, 0x73, 0x8f, 0xaf, 0xc3, 0xd5, 0x8d, 0x88, 0x9b, 0xf5, 0x6e, 0x87, 0xcc, + 0xcb, 0x22, 0x5a, 0x89, 0xd1, 0x75, 0x7c, 0x8f, 0xc4, 0x20, 0x5a, 0x02, 0x02, 0xe5, 0x75, 0x28, + 0xa0, 0x24, 0x55, 0x28, 0x96, 0x9d, 0x35, 0x6e, 0xde, 0xee, 0xf4, 0x80, 0x4b, 0x77, 0xd6, 0xdc, + 0xf4, 0x07, 0x5c, 0x8c, 0x85, 0xfa, 0xe7, 0xf3, 0x3d, 0x52, 0xc5, 0x3d, 0x96, 0x93, 0xc8, 0xcf, + 0xe7, 0xb3, 0x92, 0xbe, 0x1d, 0x57, 0xd7, 0xb1, 0x0f, 0x58, 0x38, 0xc7, 0xdb, 0xaf, 0xee, 0x10, + 0x85, 0xf3, 0x07, 0xf9, 0xac, 0x0c, 0x76, 0x27, 0xc2, 0xd9, 0xdf, 0x04, 0x99, 0x2a, 0xd2, 0xc7, + 0xd8, 0xe6, 0x96, 0x55, 0xa1, 0x7f, 0x9f, 0xee, 0x53, 0x69, 0x22, 0x3d, 0x19, 0xc2, 0x07, 0xd2, + 0xd2, 0x3f, 0xcc, 0x67, 0x66, 0x6a, 0x3c, 0x91, 0xe9, 0x61, 0xca, 0xf4, 0x64, 0xe8, 0x1f, 0x68, + 0xe8, 0xa7, 0xca, 0xf4, 0x64, 0xec, 0x1f, 0x48, 0x4f, 0x7f, 0x3f, 0x9f, 0x9e, 0x8b, 0xf4, 0x08, + 0x94, 0xf4, 0x30, 0x3c, 0x1c, 0xfd, 0x6e, 0x28, 0x1e, 0xa8, 0x1b, 0xfa, 0x0f, 0x60, 0x45, 0x25, + 0x05, 0x7a, 0x64, 0xa3, 0xfe, 0xa3, 0x2a, 0xd0, 0x43, 0x18, 0xf2, 0x8f, 0xb3, 0x40, 0x7f, 0xb2, + 0x90, 0xcc, 0xbf, 0xfb, 0xb8, 0xae, 0x49, 0xce, 0x3e, 0xd7, 0x24, 0xbf, 0x1c, 0x79, 0x1b, 0xc6, + 0x43, 0x59, 0xca, 0x51, 0xc6, 0xf0, 0xfa, 0xa8, 0xc9, 0x50, 0x8d, 0xf7, 0x18, 0x4e, 0x84, 0xc3, + 0x89, 0x53, 0xab, 0xdf, 0x2f, 0x24, 0x93, 0x18, 0x9f, 0xf4, 0xc6, 0x3e, 0x7b, 0xe3, 0x0e, 0x9c, + 0x9b, 0xe9, 0x3a, 0x0e, 0xb5, 0xbc, 0xf4, 0x4e, 0xc1, 0xc3, 0xfb, 0x26, 0xa7, 0x68, 0x24, 0x3b, + 0x27, 0xa3, 0x30, 0x63, 0x2b, 0x5e, 0x37, 0xc4, 0xd9, 0x0e, 0x84, 0x6c, 0xbb, 0x9c, 0x22, 0x8d, + 0x6d, 0x7a, 0x61, 0xf5, 0x77, 0xf3, 0xc9, 0xb4, 0xd3, 0x27, 0x5d, 0xbf, 0xbf, 0xae, 0x57, 0xbf, + 0x5c, 0x88, 0xa7, 0xde, 0x3e, 0x59, 0x20, 0xf6, 0xdf, 0x1d, 0xbe, 0x24, 0x71, 0xdc, 0x48, 0x5f, + 0xe1, 0xc3, 0xb3, 0xbe, 0xc2, 0xc7, 0xab, 0xbf, 0x52, 0x8c, 0xa7, 0x31, 0x3f, 0xe9, 0x8e, 0xa3, + 0xeb, 0x0e, 0xb2, 0x0c, 0x67, 0xc4, 0xdc, 0xe6, 0x83, 0x30, 0xdd, 0x84, 0x98, 0xbf, 0x78, 0xd6, + 0x3a, 0x31, 0x2d, 0x76, 0x5d, 0xea, 0x34, 0x3c, 0xdd, 0x7d, 0xd0, 0xc0, 0xfc, 0x14, 0x5a, 0x6a, + 0x41, 0xc6, 0x50, 0xcc, 0x6a, 0x51, 0x86, 0x83, 0x21, 0x43, 0x7f, 0x42, 0x4c, 0x30, 0x4c, 0x2b, + 0xa8, 0xfe, 0x46, 0x0e, 0x26, 0xe2, 0x9f, 0x43, 0xa6, 0x60, 0x90, 0xfd, 0x0e, 0x9e, 0xdd, 0x4b, + 0xe9, 0xb4, 0x39, 0x47, 0x7e, 0x25, 0xef, 0xd3, 0x90, 0x57, 0x60, 0x08, 0xbd, 0x1f, 0xb0, 0x40, + 0x3e, 0x8c, 0x76, 0x10, 0x16, 0xc0, 0x1c, 0xaf, 0xbc, 0x58, 0x48, 0x4a, 0xde, 0x80, 0xe1, 0x6a, + 0xe8, 0xe6, 0x25, 0xee, 0xbc, 0xd0, 0xbb, 0x54, 0x2a, 0x19, 0x12, 0x68, 0x32, 0xb5, 0xfa, 0xdd, + 0x7c, 0x3c, 0xdd, 0xfe, 0x89, 0xaa, 0xef, 0xd3, 0x34, 0xfd, 0x7a, 0x01, 0xb2, 0x72, 0xff, 0x9f, + 0x6c, 0xf0, 0xff, 0x14, 0x9c, 0x89, 0xcb, 0xa6, 0xc2, 0xa4, 0xd1, 0xdf, 0xfb, 0x1a, 0x6d, 0x6a, + 0x7b, 0x6b, 0xf2, 0xe9, 0x0d, 0x51, 0x30, 0x4c, 0x13, 0xcc, 0x2a, 0x4b, 0xbd, 0x58, 0x4b, 0xad, + 0x24, 0xb5, 0x67, 0x3e, 0x24, 0x0f, 0x84, 0x1e, 0xf3, 0x9e, 0xf9, 0xf9, 0x7c, 0xb2, 0x67, 0x4e, + 0x0e, 0xc5, 0x38, 0xc5, 0x73, 0x8b, 0x7c, 0xed, 0xbc, 0x6d, 0x5a, 0x06, 0xb9, 0x00, 0x67, 0xef, + 0xd4, 0x67, 0xb5, 0xc6, 0xed, 0xea, 0x52, 0xa5, 0x71, 0x67, 0xa9, 0x5e, 0x9b, 0x9d, 0xa9, 0xce, + 0x55, 0x67, 0x2b, 0x13, 0x7d, 0xe4, 0x34, 0x8c, 0x87, 0xa8, 0xf9, 0x3b, 0x8b, 0xe5, 0xa5, 0x89, + 0x1c, 0x39, 0x05, 0xa3, 0x21, 0x70, 0x7a, 0x79, 0x65, 0x22, 0xff, 0xdc, 0x27, 0x60, 0x18, 0xfd, + 0x65, 0xb9, 0x7f, 0x0f, 0x19, 0x81, 0xc1, 0xe5, 0xe9, 0xfa, 0xac, 0x76, 0x17, 0x99, 0x00, 0x94, + 0x2a, 0xb3, 0x4b, 0x8c, 0x61, 0xee, 0xb9, 0xff, 0x27, 0x07, 0x50, 0x9f, 0x5b, 0xa9, 0x09, 0xc2, + 0x61, 0x18, 0xa8, 0x2e, 0xdd, 0x2d, 0x2f, 0x54, 0x19, 0xdd, 0x20, 0x14, 0x97, 0x6b, 0xb3, 0xac, + 0x86, 0x21, 0xe8, 0x9f, 0x59, 0x58, 0xae, 0xcf, 0x4e, 0xe4, 0x19, 0x50, 0x9b, 0x2d, 0x57, 0x26, + 0x0a, 0x0c, 0x78, 0x4f, 0xab, 0xae, 0xcc, 0x4e, 0x14, 0xd9, 0x9f, 0x0b, 0xf5, 0x95, 0xf2, 0xca, + 0x44, 0x3f, 0xfb, 0x73, 0x0e, 0xff, 0x2c, 0x31, 0x66, 0xf5, 0xd9, 0x15, 0xfc, 0x31, 0xc0, 0x9a, + 0x30, 0xe7, 0xff, 0x1a, 0x64, 0x28, 0xc6, 0xba, 0x52, 0xd5, 0x26, 0x86, 0xd8, 0x0f, 0xc6, 0x92, + 0xfd, 0x00, 0xd6, 0x38, 0x6d, 0x76, 0x71, 0xf9, 0xee, 0xec, 0xc4, 0x30, 0xe3, 0xb5, 0x78, 0x9b, + 0x81, 0x47, 0xd8, 0x9f, 0xda, 0x22, 0xfb, 0x73, 0x94, 0x71, 0xd2, 0x66, 0xcb, 0x0b, 0xb5, 0xf2, + 0xca, 0xfc, 0xc4, 0x18, 0x6b, 0x0f, 0xf2, 0x1c, 0xe7, 0x25, 0x97, 0xca, 0x8b, 0xb3, 0x13, 0x13, + 0x82, 0xa6, 0xb2, 0x50, 0x5d, 0xba, 0x3d, 0x71, 0x0a, 0x1b, 0xf2, 0xee, 0x22, 0xfe, 0x20, 0xac, + 0x00, 0xfe, 0x75, 0xfa, 0xb9, 0x1f, 0x84, 0xd2, 0x72, 0x1d, 0x97, 0xd5, 0xf3, 0x70, 0x7a, 0xb9, + 0xde, 0x58, 0x79, 0xb7, 0x36, 0x1b, 0x93, 0xf7, 0x29, 0x18, 0xf5, 0x11, 0x0b, 0xd5, 0xa5, 0x3b, + 0x9f, 0xe3, 0xd2, 0xf6, 0x41, 0x8b, 0xe5, 0x99, 0xe5, 0xfa, 0x44, 0x9e, 0xf5, 0x8a, 0x0f, 0xba, + 0x57, 0x5d, 0xaa, 0x2c, 0xdf, 0xab, 0x4f, 0x14, 0x9e, 0x7b, 0x08, 0x23, 0x3c, 0xf1, 0xef, 0xb2, + 0x63, 0xae, 0x99, 0x16, 0x79, 0x12, 0x2e, 0x54, 0x66, 0xef, 0x56, 0x67, 0x66, 0x1b, 0xcb, 0x5a, + 0xf5, 0x66, 0x75, 0x29, 0x56, 0xd3, 0x59, 0x38, 0x15, 0x45, 0x97, 0x6b, 0xd5, 0x89, 0x1c, 0x39, + 0x07, 0x24, 0x0a, 0xbe, 0x55, 0x5e, 0x9c, 0x9b, 0xc8, 0x13, 0x05, 0xce, 0x44, 0xe1, 0xd5, 0xa5, + 0x95, 0x3b, 0x4b, 0xb3, 0x13, 0x85, 0xe7, 0xfe, 0x4a, 0x0e, 0xce, 0xa6, 0x06, 0x87, 0x27, 0x2a, + 0x3c, 0x35, 0xbb, 0x50, 0xae, 0xaf, 0x54, 0x67, 0xea, 0xb3, 0x65, 0x6d, 0x66, 0xbe, 0x31, 0x53, + 0x5e, 0x99, 0xbd, 0xb9, 0xac, 0xbd, 0xdb, 0xb8, 0x39, 0xbb, 0x34, 0xab, 0x95, 0x17, 0x26, 0xfa, + 0xc8, 0xb3, 0x30, 0x99, 0x41, 0x53, 0x9f, 0x9d, 0xb9, 0xa3, 0x55, 0x57, 0xde, 0x9d, 0xc8, 0x91, + 0x67, 0xe0, 0xc9, 0x4c, 0x22, 0xf6, 0x7b, 0x22, 0x4f, 0x9e, 0x82, 0x8b, 0x59, 0x24, 0xef, 0x2c, + 0x4c, 0x14, 0x9e, 0xfb, 0xb9, 0x1c, 0x90, 0x64, 0x74, 0x6f, 0xf2, 0x34, 0x5c, 0x62, 0x7a, 0xd1, + 0xc8, 0x6e, 0xe0, 0x33, 0xf0, 0x64, 0x2a, 0x85, 0xd4, 0xbc, 0x49, 0x78, 0x22, 0x83, 0x44, 0x34, + 0xee, 0x12, 0x28, 0xe9, 0x04, 0xd8, 0xb4, 0x5f, 0xcf, 0xc1, 0xd9, 0x54, 0x97, 0x3a, 0x72, 0x05, + 0x3e, 0x56, 0xae, 0x2c, 0xb2, 0xbe, 0x99, 0x59, 0xa9, 0x2e, 0x2f, 0xd5, 0x1b, 0x8b, 0x73, 0xe5, + 0x06, 0xd3, 0xbe, 0x3b, 0xf5, 0x58, 0x6f, 0x5e, 0x06, 0xb5, 0x07, 0xe5, 0xcc, 0x7c, 0x79, 0xe9, + 0x26, 0x1b, 0x7e, 0xe4, 0x63, 0xf0, 0x74, 0x26, 0xdd, 0xec, 0x52, 0x79, 0x7a, 0x61, 0xb6, 0x32, + 0x91, 0x27, 0x1f, 0x87, 0x67, 0x32, 0xa9, 0x2a, 0xd5, 0x3a, 0x27, 0x2b, 0x4c, 0x57, 0xbe, 0xfb, + 0x3f, 0x3d, 0xd5, 0xf7, 0xdd, 0x3f, 0x7a, 0x2a, 0xf7, 0x07, 0x7f, 0xf4, 0x54, 0xee, 0x9f, 0xfe, + 0xd1, 0x53, 0xb9, 0xcf, 0x5f, 0xdf, 0x4b, 0xd4, 0x76, 0x3e, 0x6d, 0xad, 0x96, 0x70, 0xf6, 0x7f, + 0xe9, 0x5f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x58, 0xa5, 0xed, 0xc0, 0x87, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -20033,35 +20235,8 @@ func (m *PortForward) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Addr) > 0 { - i -= len(m.Addr) - copy(dAtA[i:], m.Addr) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Addr))) - i-- - dAtA[i] = 0x2a - } - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a { - size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.KubernetesPodMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -20069,9 +20244,9 @@ func (m *PortForward) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintEvents(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x3a { - size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.KubernetesClusterMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -20079,33 +20254,13 @@ func (m *PortForward) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintEvents(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *X11Forward) 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 *X11Forward) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *X11Forward) 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) + dAtA[i] = 0x32 + if len(m.Addr) > 0 { + i -= len(m.Addr) + copy(dAtA[i:], m.Addr) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Addr))) + i-- + dAtA[i] = 0x2a } { size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) @@ -20150,55 +20305,7 @@ func (m *X11Forward) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *CommandMetadata) 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 *CommandMetadata) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommandMetadata) 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 len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0x1a - } - if len(m.ExitCode) > 0 { - i -= len(m.ExitCode) - copy(dAtA[i:], m.ExitCode) - i = encodeVarintEvents(dAtA, i, uint64(len(m.ExitCode))) - i-- - dAtA[i] = 0x12 - } - if len(m.Command) > 0 { - i -= len(m.Command) - copy(dAtA[i:], m.Command) - i = encodeVarintEvents(dAtA, i, uint64(len(m.Command))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Exec) Marshal() (dAtA []byte, err error) { +func (m *X11Forward) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -20208,12 +20315,12 @@ func (m *Exec) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Exec) MarshalTo(dAtA []byte) (int, error) { +func (m *X11Forward) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Exec) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *X11Forward) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -20223,47 +20330,162 @@ func (m *Exec) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } { - size, err := m.KubernetesPodMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - { - size, err := m.KubernetesClusterMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - { - size, err := m.CommandMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - { - size, err := m.ServerMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size, err := m.SessionMetadata.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.UserMetadata.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 *CommandMetadata) 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 *CommandMetadata) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandMetadata) 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 len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x1a + } + if len(m.ExitCode) > 0 { + i -= len(m.ExitCode) + copy(dAtA[i:], m.ExitCode) + i = encodeVarintEvents(dAtA, i, uint64(len(m.ExitCode))) + i-- + dAtA[i] = 0x12 + } + if len(m.Command) > 0 { + i -= len(m.Command) + copy(dAtA[i:], m.Command) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Command))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Exec) 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 *Exec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Exec) 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) + } + { + size, err := m.KubernetesPodMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + { + size, err := m.KubernetesClusterMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + { + size, err := m.CommandMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + { + size, err := m.ServerMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.SessionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -20431,63 +20653,63 @@ func (m *SFTPAttributes) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.ModificationTime != nil { - n154, err154 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ModificationTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ModificationTime):]) - if err154 != nil { - return 0, err154 - } - i -= n154 - i = encodeVarintEvents(dAtA, i, uint64(n154)) - i-- - dAtA[i] = 0x32 - } - if m.AccessTime != nil { - n155, err155 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AccessTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AccessTime):]) - if err155 != nil { - return 0, err155 - } - i -= n155 - i = encodeVarintEvents(dAtA, i, uint64(n155)) - i-- - dAtA[i] = 0x2a - } - if m.Permissions != nil { - n156, err156 := github_com_gogo_protobuf_types.StdUInt32MarshalTo(*m.Permissions, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdUInt32(*m.Permissions):]) + n156, err156 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ModificationTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ModificationTime):]) if err156 != nil { return 0, err156 } i -= n156 i = encodeVarintEvents(dAtA, i, uint64(n156)) i-- - dAtA[i] = 0x22 + dAtA[i] = 0x32 } - if m.GID != nil { - n157, err157 := github_com_gogo_protobuf_types.StdUInt32MarshalTo(*m.GID, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdUInt32(*m.GID):]) + if m.AccessTime != nil { + n157, err157 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AccessTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AccessTime):]) if err157 != nil { return 0, err157 } i -= n157 i = encodeVarintEvents(dAtA, i, uint64(n157)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x2a } - if m.UID != nil { - n158, err158 := github_com_gogo_protobuf_types.StdUInt32MarshalTo(*m.UID, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdUInt32(*m.UID):]) + if m.Permissions != nil { + n158, err158 := github_com_gogo_protobuf_types.StdUInt32MarshalTo(*m.Permissions, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdUInt32(*m.Permissions):]) if err158 != nil { return 0, err158 } i -= n158 i = encodeVarintEvents(dAtA, i, uint64(n158)) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x22 } - if m.FileSize != nil { - n159, err159 := github_com_gogo_protobuf_types.StdUInt64MarshalTo(*m.FileSize, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdUInt64(*m.FileSize):]) + if m.GID != nil { + n159, err159 := github_com_gogo_protobuf_types.StdUInt32MarshalTo(*m.GID, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdUInt32(*m.GID):]) if err159 != nil { return 0, err159 } i -= n159 i = encodeVarintEvents(dAtA, i, uint64(n159)) i-- + dAtA[i] = 0x1a + } + if m.UID != nil { + n160, err160 := github_com_gogo_protobuf_types.StdUInt32MarshalTo(*m.UID, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdUInt32(*m.UID):]) + if err160 != nil { + return 0, err160 + } + i -= n160 + i = encodeVarintEvents(dAtA, i, uint64(n160)) + i-- + dAtA[i] = 0x12 + } + if m.FileSize != nil { + n161, err161 := github_com_gogo_protobuf_types.StdUInt64MarshalTo(*m.FileSize, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdUInt64(*m.FileSize):]) + if err161 != nil { + return 0, err161 + } + i -= n161 + i = encodeVarintEvents(dAtA, i, uint64(n161)) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -24565,20 +24787,20 @@ func (m *DatabaseSessionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n358, err358 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) - if err358 != nil { - return 0, err358 + n360, err360 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) + if err360 != nil { + return 0, err360 } - i -= n358 - i = encodeVarintEvents(dAtA, i, uint64(n358)) + i -= n360 + i = encodeVarintEvents(dAtA, i, uint64(n360)) i-- dAtA[i] = 0x32 - n359, err359 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) - if err359 != nil { - return 0, err359 + n361, err361 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err361 != nil { + return 0, err361 } - i -= n359 - i = encodeVarintEvents(dAtA, i, uint64(n359)) + i -= n361 + i = encodeVarintEvents(dAtA, i, uint64(n361)) i-- dAtA[i] = 0x2a { @@ -25245,20 +25467,20 @@ func (m *WindowsDesktopSessionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error i-- dAtA[i] = 0x5a } - n392, err392 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) - if err392 != nil { - return 0, err392 + n394, err394 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) + if err394 != nil { + return 0, err394 } - i -= n392 - i = encodeVarintEvents(dAtA, i, uint64(n392)) + i -= n394 + i = encodeVarintEvents(dAtA, i, uint64(n394)) i-- dAtA[i] = 0x52 - n393, err393 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) - if err393 != nil { - return 0, err393 + n395, err395 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err395 != nil { + return 0, err395 } - i -= n393 - i = encodeVarintEvents(dAtA, i, uint64(n393)) + i -= n395 + i = encodeVarintEvents(dAtA, i, uint64(n395)) i-- dAtA[i] = 0x4a if len(m.DesktopLabels) > 0 { @@ -25592,12 +25814,12 @@ func (m *InstanceJoin) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x52 - n407, err407 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.TokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.TokenExpires):]) - if err407 != nil { - return 0, err407 + n409, err409 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.TokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.TokenExpires):]) + if err409 != nil { + return 0, err409 } - i -= n407 - i = encodeVarintEvents(dAtA, i, uint64(n407)) + i -= n409 + i = encodeVarintEvents(dAtA, i, uint64(n409)) i-- dAtA[i] = 0x4a if m.Attributes != nil { @@ -31178,6 +31400,75 @@ func (m *OneOf_SFTPSummary) MarshalToSizedBuffer(dAtA []byte) (int, error) { } return len(dAtA) - i, nil } +func (m *OneOf_WorkloadIdentityCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_WorkloadIdentityCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.WorkloadIdentityCreate != nil { + { + size, err := m.WorkloadIdentityCreate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xc + i-- + dAtA[i] = 0x92 + } + return len(dAtA) - i, nil +} +func (m *OneOf_WorkloadIdentityUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_WorkloadIdentityUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.WorkloadIdentityUpdate != nil { + { + size, err := m.WorkloadIdentityUpdate.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xc + i-- + dAtA[i] = 0x9a + } + return len(dAtA) - i, nil +} +func (m *OneOf_WorkloadIdentityDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_WorkloadIdentityDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.WorkloadIdentityDelete != nil { + { + size, err := m.WorkloadIdentityDelete.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xc + i-- + dAtA[i] = 0xa2 + } + return len(dAtA) - i, nil +} func (m *StreamStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -31202,12 +31493,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n655, err655 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err655 != nil { - return 0, err655 + n660, err660 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err660 != nil { + return 0, err660 } - i -= n655 - i = encodeVarintEvents(dAtA, i, uint64(n655)) + i -= n660 + i = encodeVarintEvents(dAtA, i, uint64(n660)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -31366,12 +31657,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n659, err659 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err659 != nil { - return 0, err659 + n664, err664 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err664 != nil { + return 0, err664 } - i -= n659 - i = encodeVarintEvents(dAtA, i, uint64(n659)) + i -= n664 + i = encodeVarintEvents(dAtA, i, uint64(n664)) i-- dAtA[i] = 0x1 i-- @@ -31519,12 +31810,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n663, err663 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err663 != nil { - return 0, err663 + n668, err668 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err668 != nil { + return 0, err668 } - i -= n663 - i = encodeVarintEvents(dAtA, i, uint64(n663)) + i -= n668 + i = encodeVarintEvents(dAtA, i, uint64(n668)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -38152,6 +38443,231 @@ func (m *UserTaskDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *WorkloadIdentityCreate) 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 *WorkloadIdentityCreate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkloadIdentityCreate) 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.WorkloadIdentityData != nil { + { + size, err := m.WorkloadIdentityData.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 *WorkloadIdentityUpdate) 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 *WorkloadIdentityUpdate) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkloadIdentityUpdate) 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.WorkloadIdentityData != nil { + { + size, err := m.WorkloadIdentityData.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 *WorkloadIdentityDelete) 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 *WorkloadIdentityDelete) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkloadIdentityDelete) 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) + } + { + 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 @@ -39692,6 +40208,10 @@ func (m *PortForward) Size() (n int) { if l > 0 { n += 1 + l + sovEvents(uint64(l)) } + l = m.KubernetesClusterMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.KubernetesPodMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -44286,6 +44806,42 @@ func (m *OneOf_SFTPSummary) Size() (n int) { } return n } +func (m *OneOf_WorkloadIdentityCreate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.WorkloadIdentityCreate != nil { + l = m.WorkloadIdentityCreate.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_WorkloadIdentityUpdate) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.WorkloadIdentityUpdate != nil { + l = m.WorkloadIdentityUpdate.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_WorkloadIdentityDelete) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.WorkloadIdentityDelete != nil { + l = m.WorkloadIdentityDelete.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *StreamStatus) Size() (n int) { if m == nil { return 0 @@ -46772,6 +47328,74 @@ func (m *UserTaskDelete) Size() (n int) { return n } +func (m *WorkloadIdentityCreate) 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)) + if m.WorkloadIdentityData != nil { + l = m.WorkloadIdentityData.Size() + n += 1 + l + sovEvents(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *WorkloadIdentityUpdate) 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)) + if m.WorkloadIdentityData != nil { + l = m.WorkloadIdentityData.Size() + n += 1 + l + sovEvents(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *WorkloadIdentityDelete) 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)) + 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 } @@ -58763,60 +59387,126 @@ func (m *PortForward) Unmarshal(dAtA []byte) error { } m.Addr = 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 *X11Forward) 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: X11Forward: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: X11Forward: 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 KubernetesClusterMetadata", 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.KubernetesClusterMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesPodMetadata", 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.KubernetesPodMetadata.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 *X11Forward) 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: X11Forward: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: X11Forward: 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 { @@ -85370,62 +86060,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 194: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UploadID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityCreate", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -85435,46 +86074,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 := &WorkloadIdentityCreate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - case 3: + m.Event = &OneOf_WorkloadIdentityCreate{v} + iNdEx = postIndex + case 195: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastUploadTime", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -85501,64 +86124,15 @@ 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 := &WorkloadIdentityUpdate{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Event = &OneOf_WorkloadIdentityUpdate{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 *SessionUpload) 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: SessionUpload: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SessionUpload: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 196: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -85585,15 +86159,68 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &WorkloadIdentityDelete{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Event = &OneOf_WorkloadIdentityDelete{v} iNdEx = postIndex - case 2: + 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: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", 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 @@ -85603,30 +86230,48 @@ 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.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.UploadID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + 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 + } + } + 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 @@ -85636,23 +86281,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 @@ -85676,7 +86322,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 { @@ -85699,17 +86345,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 @@ -85719,29 +86365,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 @@ -85751,27 +86398,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 { @@ -85799,11 +86447,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 { @@ -85831,11 +86530,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 { @@ -85863,11 +86562,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 { @@ -85895,11 +86594,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 { @@ -85927,13 +86626,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 @@ -85943,28 +86642,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 { @@ -85992,11 +86690,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 { @@ -86024,11 +86722,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 { @@ -86055,15 +86753,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 @@ -86073,31 +86771,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 { @@ -86125,11 +86819,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 { @@ -86156,18 +86850,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 @@ -86177,27 +86868,131 @@ 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 { + 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.TeleportCluster = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RouteToDatabase", 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.RouteToDatabase == nil { + m.RouteToDatabase = &RouteToDatabase{} + } + if err := m.RouteToDatabase.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseNames", 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.DatabaseNames = append(m.DatabaseNames, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 16: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseUsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -100844,13 +101639,548 @@ func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + 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 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 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 + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AdminActionsMFA", wireType) + } + m.AdminActionsMFA = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AdminActionsMFA |= AdminActionsMFAStatus(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 *ClusterNetworkingConfigUpdate) 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: ClusterNetworkingConfigUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterNetworkingConfigUpdate: 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 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 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:]) + 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 *SessionRecordingConfigUpdate) 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: SessionRecordingConfigUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SessionRecordingConfigUpdate: 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 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 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 - case 2: + 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 *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 Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -100877,15 +102207,15 @@ func (m *AuthPreferenceUpdate) 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 3: + 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 ChangeID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -100895,30 +102225,61 @@ func (m *AuthPreferenceUpdate) 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.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 ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceSource", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -100928,30 +102289,29 @@ func (m *AuthPreferenceUpdate) 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.AffectedResourceSource = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AdminActionsMFA", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceType", wireType) } - m.AdminActionsMFA = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -100961,11 +102321,24 @@ func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.AdminActionsMFA |= AdminActionsMFAStatus(b&0x7F) << shift + 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:]) @@ -100988,7 +102361,7 @@ func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *SpannerRPC) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101011,10 +102384,10 @@ func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ClusterNetworkingConfigUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: SpannerRPC: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ClusterNetworkingConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SpannerRPC: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101052,7 +102425,7 @@ func (m *ClusterNetworkingConfigUpdate) 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 UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101079,13 +102452,13 @@ func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + 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 UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101112,13 +102485,13 @@ func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + 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 ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101145,7 +102518,108 @@ func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + 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 @@ -101171,7 +102645,7 @@ func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SessionRecordingConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101194,10 +102668,10 @@ func (m *SessionRecordingConfigUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SessionRecordingConfigUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AccessGraphSettingsUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SessionRecordingConfigUpdate: 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: @@ -101354,7 +102828,7 @@ func (m *SessionRecordingConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { +func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101377,10 +102851,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: SPIFFEFederationCreate: 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: SPIFFEFederationCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101418,9 +102892,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 ResourceMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101430,29 +102904,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.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 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 @@ -101462,29 +102937,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 @@ -101494,55 +102970,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 @@ -101566,7 +103011,7 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } return nil } -func (m *SpannerRPC) Unmarshal(dAtA []byte) error { +func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101589,10 +103034,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: SPIFFEFederationDelete: 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: SPIFFEFederationDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101630,7 +103075,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 { @@ -101657,13 +103102,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 { @@ -101690,111 +103135,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) - } - 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) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101821,10 +103168,7 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Args == nil { - m.Args = &Struct{} - } - if err := m.Args.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -101850,7 +103194,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 { @@ -101873,10 +103217,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: @@ -101914,7 +103258,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 { @@ -101941,7 +103285,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 @@ -102011,6 +103355,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:]) @@ -102033,7 +103410,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 { @@ -102056,10 +103433,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: @@ -102097,7 +103474,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 { @@ -102124,7 +103501,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 @@ -102194,6 +103571,39 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", 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.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -102216,7 +103626,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102239,10 +103649,10 @@ func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SPIFFEFederationDelete: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SPIFFEFederationDelete: 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: @@ -102377,6 +103787,39 @@ func (m *SPIFFEFederationDelete) 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:]) @@ -102399,7 +103842,7 @@ func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102422,10 +103865,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: AutoUpdateVersionCreate: 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: AutoUpdateVersionCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102615,7 +104058,7 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102638,10 +104081,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: AutoUpdateVersionUpdate: 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: AutoUpdateVersionUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102831,7 +104274,7 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102854,10 +104297,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: AutoUpdateVersionDelete: 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: AutoUpdateVersionDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103047,7 +104490,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103070,10 +104513,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: StaticHostUserCreate: 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: StaticHostUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103111,7 +104554,7 @@ func (m *AutoUpdateVersionCreate) 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 { @@ -103138,13 +104581,13 @@ func (m *AutoUpdateVersionCreate) 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 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 { @@ -103171,13 +104614,13 @@ func (m *AutoUpdateVersionCreate) 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 { @@ -103204,13 +104647,13 @@ func (m *AutoUpdateVersionCreate) 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 Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103237,7 +104680,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103263,7 +104706,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103286,10 +104729,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: StaticHostUserUpdate: 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: StaticHostUserUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103360,7 +104803,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 { @@ -103387,13 +104830,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 { @@ -103420,13 +104863,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 { @@ -103453,7 +104896,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 @@ -103479,7 +104922,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103502,10 +104945,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: StaticHostUserDelete: 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: StaticHostUserDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103543,7 +104986,7 @@ func (m *AutoUpdateVersionDelete) 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 { @@ -103570,13 +105013,13 @@ func (m *AutoUpdateVersionDelete) 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 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 { @@ -103603,13 +105046,13 @@ func (m *AutoUpdateVersionDelete) 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 { @@ -103636,13 +105079,13 @@ func (m *AutoUpdateVersionDelete) 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 Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103669,7 +105112,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -103695,7 +105138,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { +func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103718,10 +105161,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: CrownJewelCreate: 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: CrownJewelCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103792,7 +105235,7 @@ func (m *StaticHostUserCreate) 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 { @@ -103819,13 +105262,13 @@ func (m *StaticHostUserCreate) 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 { @@ -103852,13 +105295,13 @@ func (m *StaticHostUserCreate) 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 { @@ -103885,10 +105328,42 @@ func (m *StaticHostUserCreate) 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:]) @@ -103911,7 +105386,7 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { +func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103934,10 +105409,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: CrownJewelUpdate: 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: CrownJewelUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104008,7 +105483,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 { @@ -104035,13 +105510,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 { @@ -104068,13 +105543,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 { @@ -104101,10 +105576,74 @@ 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 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:]) @@ -104127,7 +105666,7 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { +func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104150,10 +105689,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: CrownJewelDelete: 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: CrownJewelDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104224,7 +105763,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 { @@ -104251,13 +105790,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 { @@ -104284,13 +105823,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 { @@ -104317,7 +105856,7 @@ 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 @@ -104343,7 +105882,7 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { +func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104366,10 +105905,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: UserTaskCreate: 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: UserTaskCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104440,7 +105979,7 @@ func (m *CrownJewelCreate) 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 { @@ -104467,13 +106006,13 @@ func (m *CrownJewelCreate) 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 { @@ -104500,13 +106039,13 @@ func (m *CrownJewelCreate) 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 { @@ -104533,15 +106072,15 @@ func (m *CrownJewelCreate) 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 case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelQuery", 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 @@ -104551,23 +106090,24 @@ func (m *CrownJewelCreate) 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.CrownJewelQuery = string(dAtA[iNdEx:postIndex]) + if err := m.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -104591,7 +106131,7 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { +func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104614,10 +106154,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: UserTaskUpdate: 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: UserTaskUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104687,6 +106227,39 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", 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.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) } @@ -104719,7 +106292,7 @@ func (m *CrownJewelUpdate) 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) } @@ -104752,9 +106325,9 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104781,13 +106354,13 @@ 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.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentCrownJewelQuery", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CurrentUserTaskState", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -104815,11 +106388,11 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.CurrentCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + m.CurrentUserTaskState = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedCrownJewelQuery", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UpdatedUserTaskState", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -104847,7 +106420,7 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.UpdatedCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + m.UpdatedUserTaskState = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -104871,7 +106444,7 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { +func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104894,17 +106467,17 @@ 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: UserTaskMetadata: 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: 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 Metadata", 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 @@ -104914,30 +106487,29 @@ func (m *CrownJewelDelete) 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.TaskType = string(dAtA[iNdEx:postIndex]) 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 IssueType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -104947,96 +106519,29 @@ func (m *CrownJewelDelete) 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.IssueType = string(dAtA[iNdEx:postIndex]) 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 - 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 Integration", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105046,24 +106551,23 @@ func (m *CrownJewelDelete) 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 { - return err - } + m.Integration = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -105087,7 +106591,7 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { +func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105110,10 +106614,10 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserTaskCreate: wiretype end group for non-group") + return fmt.Errorf("proto: UserTaskDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserTaskCreate: 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: @@ -105277,40 +106781,7 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", 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.UserTaskMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -105336,7 +106807,7 @@ func (m *UserTaskCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { +func (m *WorkloadIdentityCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105359,10 +106830,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: WorkloadIdentityCreate: 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: WorkloadIdentityCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105400,7 +106871,7 @@ func (m *UserTaskUpdate) 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 { @@ -105427,13 +106898,13 @@ func (m *UserTaskUpdate) 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 { @@ -105460,13 +106931,13 @@ 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.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 { @@ -105493,13 +106964,13 @@ 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: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityData", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105526,13 +106997,67 @@ func (m *UserTaskUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.WorkloadIdentityData == nil { + m.WorkloadIdentityData = &Struct{} + } + if err := m.WorkloadIdentityData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } 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 *WorkloadIdentityUpdate) 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: WorkloadIdentityUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WorkloadIdentityUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserTaskMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -105559,15 +107084,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.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 7: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentUserTaskState", 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 @@ -105577,29 +107102,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.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 8: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedUserTaskState", 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 @@ -105609,80 +107135,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.UserMetadata.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 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskType", 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 @@ -105692,29 +107168,30 @@ 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.ConnectionMetadata.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 IssueType", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkloadIdentityData", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -105724,55 +107201,27 @@ 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.IssueType = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Integration", wireType) + if m.WorkloadIdentityData == nil { + m.WorkloadIdentityData = &Struct{} } - 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.WorkloadIdentityData.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.Integration = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -105796,7 +107245,7 @@ func (m *UserTaskMetadata) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { +func (m *WorkloadIdentityDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -105819,10 +107268,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: WorkloadIdentityDelete: 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: WorkloadIdentityDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -105859,39 +107308,6 @@ 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) - } - 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) } @@ -105924,7 +107340,7 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } @@ -105957,7 +107373,7 @@ func (m *UserTaskDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index 6e856b3c5f2b2..8f3c73e7ceb24 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -790,6 +790,18 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_AutoUpdateVersionDelete{ AutoUpdateVersionDelete: e, } + case *WorkloadIdentityCreate: + out.Event = &OneOf_WorkloadIdentityCreate{ + WorkloadIdentityCreate: e, + } + case *WorkloadIdentityUpdate: + out.Event = &OneOf_WorkloadIdentityUpdate{ + WorkloadIdentityUpdate: e, + } + case *WorkloadIdentityDelete: + out.Event = &OneOf_WorkloadIdentityDelete{ + WorkloadIdentityDelete: 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/resource.go b/api/types/resource.go index ec87a72c97a8c..a2703e54cc619 100644 --- a/api/types/resource.go +++ b/api/types/resource.go @@ -509,7 +509,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 +686,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..a09c39451cd3d 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. @@ -89,9 +90,9 @@ func (r *legacyToResource153Adapter) GetKind() string { return r.inner.GetKind() } -func (r *legacyToResource153Adapter) GetMetadata() *headerv1.Metadata { - md := r.inner.GetMetadata() - +// LegacyTo153Metadata converts a legacy [Metadata] object an RFD153-style +// [headerv1.Metadata] block +func LegacyTo153Metadata(md Metadata) *headerv1.Metadata { var expires *timestamppb.Timestamp if md.Expires != nil { expires = timestamppb.New(*md.Expires) @@ -107,6 +108,10 @@ func (r *legacyToResource153Adapter) GetMetadata() *headerv1.Metadata { } } +func (r *legacyToResource153Adapter) GetMetadata() *headerv1.Metadata { + return LegacyTo153Metadata(r.inner.GetMetadata()) +} + func (r *legacyToResource153Adapter) GetSubKind() string { return r.inner.GetSubKind() } @@ -116,7 +121,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 +136,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 } @@ -162,9 +170,9 @@ func (r *resource153ToLegacyAdapter) GetKind() string { return r.inner.GetKind() } -func (r *resource153ToLegacyAdapter) GetMetadata() Metadata { - md := r.inner.GetMetadata() - +// Metadata153ToLegacy converts RFD153-style resource metadata to legacy +// metadata. +func Metadata153ToLegacy(md *headerv1.Metadata) Metadata { // use zero time.time{} for zero *timestamppb.Timestamp, instead of 01/01/1970. expires := md.Expires.AsTime() if md.Expires == nil { @@ -181,6 +189,10 @@ func (r *resource153ToLegacyAdapter) GetMetadata() Metadata { } } +func (r *resource153ToLegacyAdapter) GetMetadata() Metadata { + return Metadata153ToLegacy(r.inner.GetMetadata()) +} + func (r *resource153ToLegacyAdapter) GetName() string { return r.inner.GetMetadata().Name } @@ -212,3 +224,127 @@ func (r *resource153ToLegacyAdapter) SetRevision(rev string) { func (r *resource153ToLegacyAdapter) SetSubKind(subKind string) { panic("interface Resource153 does not implement SetSubKind") } + +// Resource153ToResourceWithLabels wraps a [Resource153]-style resource in +// the legacy [Resource] and [ResourceWithLabels] interfaces. +// +// The same caveats that apply to [Resource153ToLegacy] apply. +func Resource153ToResourceWithLabels(r Resource153) ResourceWithLabels { + return &resource153ToResourceWithLabelsAdapter{ + resource153ToLegacyAdapter{ + inner: r, + }, + } +} + +// resource153ToResourceWithLabelsAdapter wraps a new-style resource in a +// type implementing the legacy resource interfaces +type resource153ToResourceWithLabelsAdapter struct { + resource153ToLegacyAdapter +} + +// Origin implements ResourceWithLabels for the adapter. +func (r *resource153ToResourceWithLabelsAdapter) Origin() string { + m := r.inner.GetMetadata() + if m == nil { + return "" + } + return m.Labels[OriginLabel] +} + +// SetOrigin implements ResourceWithLabels for the adapter. +func (r *resource153ToResourceWithLabelsAdapter) SetOrigin(origin string) { + m := r.inner.GetMetadata() + if m == nil { + return + } + m.Labels[OriginLabel] = origin +} + +// GetLabel implements ResourceWithLabels for the adapter. +func (r *resource153ToResourceWithLabelsAdapter) 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 *resource153ToResourceWithLabelsAdapter) GetAllLabels() map[string]string { + m := r.inner.GetMetadata() + if m == nil { + return nil + } + return m.Labels +} + +// GetStaticLabels implements ResourceWithLabels for the adapter. +func (r *resource153ToResourceWithLabelsAdapter) GetStaticLabels() map[string]string { + return r.GetAllLabels() +} + +// SetStaticLabels implements ResourceWithLabels for the adapter. +func (r *resource153ToResourceWithLabelsAdapter) 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 *resource153ToResourceWithLabelsAdapter) 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) +} + +// 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{ + resource153ToResourceWithLabelsAdapter: resource153ToResourceWithLabelsAdapter{ + resource153ToLegacyAdapter{ + inner: r, + }, + }, + } +} + +// resource153ToUnifiedResourceAdapter wraps a [resource153ToLegacyAdapter] to +// provide an implementation of [UnifiedResource] +type resource153ToUnifiedResourceAdapter struct { + resource153ToResourceWithLabelsAdapter +} + +// 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 Resource153ToUnifiedResource(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/role.go b/api/types/role.go index 1529a4c81cc20..3e1034ef1b8d9 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -279,6 +279,10 @@ type Role interface { GetSPIFFEConditions(rct RoleConditionType) []*SPIFFERoleCondition // SetSPIFFEConditions sets the allow or deny SPIFFERoleCondition. SetSPIFFEConditions(rct RoleConditionType, cond []*SPIFFERoleCondition) + + // GetIdentityCenterAccountAssignments fetches the allow or deny Account + // Assignments for the role + GetIdentityCenterAccountAssignments(RoleConditionType) []IdentityCenterAccountAssignment } // NewRole constructs new standard V7 role. @@ -2025,6 +2029,15 @@ func (r *RoleV6) MatchSearch(values []string) bool { return MatchSearch(fieldVals, values, nil) } +// 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{ @@ -2250,3 +2263,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/types.pb.go b/api/types/types.pb.go index 567e90de124bf..6a6d20a0beab2 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{54, 0} + return fileDescriptor_9198ee693835762e, []int{56, 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{77, 0} + return fileDescriptor_9198ee693835762e, []int{79, 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{255, 0} + return fileDescriptor_9198ee693835762e, []int{257, 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{255, 1} + return fileDescriptor_9198ee693835762e, []int{257, 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{336, 0} + return fileDescriptor_9198ee693835762e, []int{338, 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{337, 0} + return fileDescriptor_9198ee693835762e, []int{339, 0} } type KeepAlive struct { @@ -3429,6 +3429,99 @@ func (m *CORSPolicy) XXX_DiscardUnknown() { var xxx_messageInfo_CORSPolicy proto.InternalMessageInfo +// IdentityCenterPermissionSet defines a permission set that is available on an +// IdentityCenter account app +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"` + // 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:"-"` +} + +func (m *IdentityCenterPermissionSet) Reset() { *m = IdentityCenterPermissionSet{} } +func (m *IdentityCenterPermissionSet) String() string { return proto.CompactTextString(m) } +func (*IdentityCenterPermissionSet) ProtoMessage() {} +func (*IdentityCenterPermissionSet) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{43} +} +func (m *IdentityCenterPermissionSet) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IdentityCenterPermissionSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IdentityCenterPermissionSet.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 *IdentityCenterPermissionSet) XXX_Merge(src proto.Message) { + xxx_messageInfo_IdentityCenterPermissionSet.Merge(m, src) +} +func (m *IdentityCenterPermissionSet) XXX_Size() int { + return m.Size() +} +func (m *IdentityCenterPermissionSet) XXX_DiscardUnknown() { + xxx_messageInfo_IdentityCenterPermissionSet.DiscardUnknown(m) +} + +var xxx_messageInfo_IdentityCenterPermissionSet proto.InternalMessageInfo + +// AppIdentityCenter encapsulates information about an AWS Identity Center +// account application. +type AppIdentityCenter struct { + // Account ID is the AWS-assigned ID of the account + AccountID string `protobuf:"bytes,1,opt,name=AccountID,proto3" json:"account_id,omitempty"` + // PermissionSets lists the available permission sets on the given account + PermissionSets []*IdentityCenterPermissionSet `protobuf:"bytes,2,rep,name=PermissionSets,proto3" json:"permission_sets,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AppIdentityCenter) Reset() { *m = AppIdentityCenter{} } +func (m *AppIdentityCenter) String() string { return proto.CompactTextString(m) } +func (*AppIdentityCenter) ProtoMessage() {} +func (*AppIdentityCenter) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{44} +} +func (m *AppIdentityCenter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AppIdentityCenter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AppIdentityCenter.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 *AppIdentityCenter) XXX_Merge(src proto.Message) { + xxx_messageInfo_AppIdentityCenter.Merge(m, src) +} +func (m *AppIdentityCenter) XXX_Size() int { + return m.Size() +} +func (m *AppIdentityCenter) XXX_DiscardUnknown() { + xxx_messageInfo_AppIdentityCenter.DiscardUnknown(m) +} + +var xxx_messageInfo_AppIdentityCenter proto.InternalMessageInfo + // AppSpecV3 is the AppV3 resource spec. type AppSpecV3 struct { // URI is the web app endpoint. @@ -3456,6 +3549,9 @@ type AppSpecV3 struct { RequiredAppNames []string `protobuf:"bytes,10,rep,name=RequiredAppNames,proto3" json:"required_app_names,omitempty"` // CORSPolicy defines the Cross-Origin Resource Sharing settings for the app. 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"` // 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 @@ -3470,7 +3566,7 @@ func (m *AppSpecV3) Reset() { *m = AppSpecV3{} } func (m *AppSpecV3) String() string { return proto.CompactTextString(m) } func (*AppSpecV3) ProtoMessage() {} func (*AppSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{43} + return fileDescriptor_9198ee693835762e, []int{45} } func (m *AppSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3522,7 +3618,7 @@ type AppServerOrSAMLIdPServiceProviderV1 struct { func (m *AppServerOrSAMLIdPServiceProviderV1) Reset() { *m = AppServerOrSAMLIdPServiceProviderV1{} } func (*AppServerOrSAMLIdPServiceProviderV1) ProtoMessage() {} func (*AppServerOrSAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{44} + return fileDescriptor_9198ee693835762e, []int{46} } func (m *AppServerOrSAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3617,7 +3713,7 @@ func (m *Rewrite) Reset() { *m = Rewrite{} } func (m *Rewrite) String() string { return proto.CompactTextString(m) } func (*Rewrite) ProtoMessage() {} func (*Rewrite) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{45} + return fileDescriptor_9198ee693835762e, []int{47} } func (m *Rewrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3661,7 +3757,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{46} + return fileDescriptor_9198ee693835762e, []int{48} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3709,7 +3805,7 @@ 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{47} + return fileDescriptor_9198ee693835762e, []int{49} } func (m *PortRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3756,7 +3852,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{48} + return fileDescriptor_9198ee693835762e, []int{50} } func (m *CommandLabelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3798,7 +3894,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{49} + return fileDescriptor_9198ee693835762e, []int{51} } func (m *AppAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3844,7 +3940,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{50} + return fileDescriptor_9198ee693835762e, []int{52} } func (m *SSHKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3890,7 +3986,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{51} + return fileDescriptor_9198ee693835762e, []int{53} } func (m *TLSKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3936,7 +4032,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{52} + return fileDescriptor_9198ee693835762e, []int{54} } func (m *JWTKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3985,7 +4081,7 @@ type CertAuthorityV2 struct { func (m *CertAuthorityV2) Reset() { *m = CertAuthorityV2{} } func (*CertAuthorityV2) ProtoMessage() {} func (*CertAuthorityV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{53} + return fileDescriptor_9198ee693835762e, []int{55} } func (m *CertAuthorityV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4046,7 +4142,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{54} + return fileDescriptor_9198ee693835762e, []int{56} } func (m *CertAuthoritySpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4092,7 +4188,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{55} + return fileDescriptor_9198ee693835762e, []int{57} } func (m *CAKeySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4137,7 +4233,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{56} + return fileDescriptor_9198ee693835762e, []int{58} } func (m *RoleMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4185,7 +4281,7 @@ type ProvisionTokenV1 struct { func (m *ProvisionTokenV1) Reset() { *m = ProvisionTokenV1{} } func (*ProvisionTokenV1) ProtoMessage() {} func (*ProvisionTokenV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{57} + return fileDescriptor_9198ee693835762e, []int{59} } func (m *ProvisionTokenV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4235,7 +4331,7 @@ type ProvisionTokenV2 struct { func (m *ProvisionTokenV2) Reset() { *m = ProvisionTokenV2{} } func (*ProvisionTokenV2) ProtoMessage() {} func (*ProvisionTokenV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{58} + return fileDescriptor_9198ee693835762e, []int{60} } func (m *ProvisionTokenV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4277,7 +4373,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{59} + return fileDescriptor_9198ee693835762e, []int{61} } func (m *ProvisionTokenV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4329,7 +4425,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{60} + return fileDescriptor_9198ee693835762e, []int{62} } func (m *TokenRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4413,7 +4509,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{61} + return fileDescriptor_9198ee693835762e, []int{63} } func (m *ProvisionTokenSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4465,7 +4561,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{62} + return fileDescriptor_9198ee693835762e, []int{64} } func (m *ProvisionTokenSpecV2TPM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4521,7 +4617,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{62, 0} + return fileDescriptor_9198ee693835762e, []int{64, 0} } func (m *ProvisionTokenSpecV2TPM_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4590,7 +4686,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{63} + return fileDescriptor_9198ee693835762e, []int{65} } func (m *ProvisionTokenSpecV2GitHub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4652,7 +4748,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{63, 0} + return fileDescriptor_9198ee693835762e, []int{65, 0} } func (m *ProvisionTokenSpecV2GitHub_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4700,7 +4796,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{64} + return fileDescriptor_9198ee693835762e, []int{66} } func (m *ProvisionTokenSpecV2GitLab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4802,7 +4898,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{64, 0} + return fileDescriptor_9198ee693835762e, []int{66, 0} } func (m *ProvisionTokenSpecV2GitLab_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4847,7 +4943,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{65} + return fileDescriptor_9198ee693835762e, []int{67} } func (m *ProvisionTokenSpecV2CircleCI) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4888,7 +4984,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{65, 0} + return fileDescriptor_9198ee693835762e, []int{67, 0} } func (m *ProvisionTokenSpecV2CircleCI_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4935,7 +5031,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{66} + return fileDescriptor_9198ee693835762e, []int{68} } func (m *ProvisionTokenSpecV2Spacelift) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4986,7 +5082,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{66, 0} + return fileDescriptor_9198ee693835762e, []int{68, 0} } func (m *ProvisionTokenSpecV2Spacelift_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5038,7 +5134,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{67} + return fileDescriptor_9198ee693835762e, []int{69} } func (m *ProvisionTokenSpecV2Kubernetes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5085,7 +5181,7 @@ func (m *ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) String() string { } func (*ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{67, 0} + return fileDescriptor_9198ee693835762e, []int{69, 0} } func (m *ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5129,7 +5225,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{67, 1} + return fileDescriptor_9198ee693835762e, []int{69, 1} } func (m *ProvisionTokenSpecV2Kubernetes_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5173,7 +5269,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{68} + return fileDescriptor_9198ee693835762e, []int{70} } func (m *ProvisionTokenSpecV2Azure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5219,7 +5315,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{68, 0} + return fileDescriptor_9198ee693835762e, []int{70, 0} } func (m *ProvisionTokenSpecV2Azure_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5263,7 +5359,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{69} + return fileDescriptor_9198ee693835762e, []int{71} } func (m *ProvisionTokenSpecV2GCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5312,7 +5408,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{69, 0} + return fileDescriptor_9198ee693835762e, []int{71, 0} } func (m *ProvisionTokenSpecV2GCP_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5369,7 +5465,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{70} + return fileDescriptor_9198ee693835762e, []int{72} } func (m *ProvisionTokenSpecV2TerraformCloud) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5434,7 +5530,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{70, 0} + return fileDescriptor_9198ee693835762e, []int{72, 0} } func (m *ProvisionTokenSpecV2TerraformCloud_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5486,7 +5582,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{71} + return fileDescriptor_9198ee693835762e, []int{73} } func (m *ProvisionTokenSpecV2Bitbucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5544,7 +5640,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{71, 0} + return fileDescriptor_9198ee693835762e, []int{73, 0} } func (m *ProvisionTokenSpecV2Bitbucket_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5593,7 +5689,7 @@ type StaticTokensV2 struct { func (m *StaticTokensV2) Reset() { *m = StaticTokensV2{} } func (*StaticTokensV2) ProtoMessage() {} func (*StaticTokensV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{72} + return fileDescriptor_9198ee693835762e, []int{74} } func (m *StaticTokensV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5636,7 +5732,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{73} + return fileDescriptor_9198ee693835762e, []int{75} } func (m *StaticTokensSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5685,7 +5781,7 @@ type ClusterNameV2 struct { func (m *ClusterNameV2) Reset() { *m = ClusterNameV2{} } func (*ClusterNameV2) ProtoMessage() {} func (*ClusterNameV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{74} + return fileDescriptor_9198ee693835762e, []int{76} } func (m *ClusterNameV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5731,7 +5827,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{75} + return fileDescriptor_9198ee693835762e, []int{77} } func (m *ClusterNameSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5781,7 +5877,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{76} + return fileDescriptor_9198ee693835762e, []int{78} } func (m *ClusterAuditConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5851,7 +5947,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{77} + return fileDescriptor_9198ee693835762e, []int{79} } func (m *ClusterAuditConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5902,7 +5998,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{78} + return fileDescriptor_9198ee693835762e, []int{80} } func (m *ClusterNetworkingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5981,7 +6077,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{79} + return fileDescriptor_9198ee693835762e, []int{81} } func (m *ClusterNetworkingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6026,7 +6122,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{80} + return fileDescriptor_9198ee693835762e, []int{82} } func (m *TunnelStrategyV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6111,7 +6207,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{81} + return fileDescriptor_9198ee693835762e, []int{83} } func (m *AgentMeshTunnelStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6152,7 +6248,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{82} + return fileDescriptor_9198ee693835762e, []int{84} } func (m *ProxyPeeringTunnelStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6203,7 +6299,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{83} + return fileDescriptor_9198ee693835762e, []int{85} } func (m *SessionRecordingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6249,7 +6345,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{84} + return fileDescriptor_9198ee693835762e, []int{86} } func (m *SessionRecordingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6299,7 +6395,7 @@ type AuthPreferenceV2 struct { func (m *AuthPreferenceV2) Reset() { *m = AuthPreferenceV2{} } func (*AuthPreferenceV2) ProtoMessage() {} func (*AuthPreferenceV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{85} + return fileDescriptor_9198ee693835762e, []int{87} } func (m *AuthPreferenceV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6392,7 +6488,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{86} + return fileDescriptor_9198ee693835762e, []int{88} } func (m *AuthPreferenceSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6443,7 +6539,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{87} + return fileDescriptor_9198ee693835762e, []int{89} } func (m *U2F) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6511,7 +6607,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{88} + return fileDescriptor_9198ee693835762e, []int{90} } func (m *Webauthn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6582,7 +6678,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{89} + return fileDescriptor_9198ee693835762e, []int{91} } func (m *DeviceTrust) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6629,7 +6725,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{90} + return fileDescriptor_9198ee693835762e, []int{92} } func (m *HardwareKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6676,7 +6772,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{91} + return fileDescriptor_9198ee693835762e, []int{93} } func (m *HardwareKeySerialNumberValidation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6726,7 +6822,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{92} + return fileDescriptor_9198ee693835762e, []int{94} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6766,7 +6862,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{93} + return fileDescriptor_9198ee693835762e, []int{95} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6814,7 +6910,7 @@ type UserTokenV3 struct { func (m *UserTokenV3) Reset() { *m = UserTokenV3{} } func (*UserTokenV3) ProtoMessage() {} func (*UserTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{94} + return fileDescriptor_9198ee693835762e, []int{96} } func (m *UserTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6861,7 +6957,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{95} + return fileDescriptor_9198ee693835762e, []int{97} } func (m *UserTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6909,7 +7005,7 @@ type UserTokenSecretsV3 struct { func (m *UserTokenSecretsV3) Reset() { *m = UserTokenSecretsV3{} } func (*UserTokenSecretsV3) ProtoMessage() {} func (*UserTokenSecretsV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{96} + return fileDescriptor_9198ee693835762e, []int{98} } func (m *UserTokenSecretsV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6954,7 +7050,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{97} + return fileDescriptor_9198ee693835762e, []int{99} } func (m *UserTokenSecretsSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7003,7 +7099,7 @@ type AccessRequestV3 struct { func (m *AccessRequestV3) Reset() { *m = AccessRequestV3{} } func (*AccessRequestV3) ProtoMessage() {} func (*AccessRequestV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{98} + return fileDescriptor_9198ee693835762e, []int{100} } func (m *AccessRequestV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7055,7 +7151,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{99} + return fileDescriptor_9198ee693835762e, []int{101} } func (m *AccessReviewThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7100,7 +7196,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{100} + return fileDescriptor_9198ee693835762e, []int{102} } func (m *PromotedAccessList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7161,7 +7257,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{101} + return fileDescriptor_9198ee693835762e, []int{103} } func (m *AccessReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7206,7 +7302,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{102} + return fileDescriptor_9198ee693835762e, []int{104} } func (m *AccessReviewSubmission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7249,7 +7345,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{103} + return fileDescriptor_9198ee693835762e, []int{105} } func (m *ThresholdIndexSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7292,7 +7388,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{104} + return fileDescriptor_9198ee693835762e, []int{106} } func (m *ThresholdIndexSets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7395,7 +7491,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{105} + return fileDescriptor_9198ee693835762e, []int{107} } func (m *AccessRequestSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7452,7 +7548,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{106} + return fileDescriptor_9198ee693835762e, []int{108} } func (m *AccessRequestFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7508,7 +7604,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{107} + return fileDescriptor_9198ee693835762e, []int{109} } func (m *AccessCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7566,7 +7662,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{108} + return fileDescriptor_9198ee693835762e, []int{110} } func (m *AccessCapabilitiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7610,7 +7706,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{109} + return fileDescriptor_9198ee693835762e, []int{111} } func (m *RequestKubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7662,7 +7758,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{110} + return fileDescriptor_9198ee693835762e, []int{112} } func (m *ResourceID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7711,7 +7807,7 @@ type PluginDataV3 struct { func (m *PluginDataV3) Reset() { *m = PluginDataV3{} } func (*PluginDataV3) ProtoMessage() {} func (*PluginDataV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{111} + return fileDescriptor_9198ee693835762e, []int{113} } func (m *PluginDataV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7754,7 +7850,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{112} + return fileDescriptor_9198ee693835762e, []int{114} } func (m *PluginDataEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7796,7 +7892,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{113} + return fileDescriptor_9198ee693835762e, []int{115} } func (m *PluginDataSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7843,7 +7939,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{114} + return fileDescriptor_9198ee693835762e, []int{116} } func (m *PluginDataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7894,7 +7990,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{115} + return fileDescriptor_9198ee693835762e, []int{117} } func (m *PluginDataUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7938,7 +8034,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{116} + return fileDescriptor_9198ee693835762e, []int{118} } func (m *RoleFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7988,7 +8084,7 @@ type RoleV6 struct { func (m *RoleV6) Reset() { *m = RoleV6{} } func (*RoleV6) ProtoMessage() {} func (*RoleV6) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{117} + return fileDescriptor_9198ee693835762e, []int{119} } func (m *RoleV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8035,7 +8131,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{118} + return fileDescriptor_9198ee693835762e, []int{120} } func (m *RoleSpecV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8168,7 +8264,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{119} + return fileDescriptor_9198ee693835762e, []int{121} } func (m *RoleOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8214,7 +8310,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{120} + return fileDescriptor_9198ee693835762e, []int{122} } func (m *RecordSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8266,7 +8362,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{121} + return fileDescriptor_9198ee693835762e, []int{123} } func (m *CertExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8402,7 +8498,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{122} + return fileDescriptor_9198ee693835762e, []int{124} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8445,7 +8541,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{123} + return fileDescriptor_9198ee693835762e, []int{125} } func (m *IdentityCenterAccountAssignment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8521,7 +8617,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{124} + return fileDescriptor_9198ee693835762e, []int{126} } func (m *SPIFFERoleCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8565,7 +8661,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{125} + return fileDescriptor_9198ee693835762e, []int{127} } func (m *DatabasePermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8615,7 +8711,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{126} + return fileDescriptor_9198ee693835762e, []int{128} } func (m *KubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8668,7 +8764,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{127} + return fileDescriptor_9198ee693835762e, []int{129} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8716,7 +8812,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{128} + return fileDescriptor_9198ee693835762e, []int{130} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8792,7 +8888,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{129} + return fileDescriptor_9198ee693835762e, []int{131} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8838,7 +8934,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{130} + return fileDescriptor_9198ee693835762e, []int{132} } func (m *AccessRequestConditionsReason) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8891,7 +8987,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{131} + return fileDescriptor_9198ee693835762e, []int{133} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8933,7 +9029,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{132} + return fileDescriptor_9198ee693835762e, []int{134} } func (m *AccessRequestAllowedPromotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8976,7 +9072,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{133} + return fileDescriptor_9198ee693835762e, []int{135} } func (m *AccessRequestAllowedPromotions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9022,7 +9118,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{134} + return fileDescriptor_9198ee693835762e, []int{136} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9068,7 +9164,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{135} + return fileDescriptor_9198ee693835762e, []int{137} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9117,7 +9213,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{136} + return fileDescriptor_9198ee693835762e, []int{138} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9165,7 +9261,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{137} + return fileDescriptor_9198ee693835762e, []int{139} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9207,7 +9303,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{138} + return fileDescriptor_9198ee693835762e, []int{140} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9249,7 +9345,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{139} + return fileDescriptor_9198ee693835762e, []int{141} } func (m *UserFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9300,7 +9396,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{140} + return fileDescriptor_9198ee693835762e, []int{142} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9349,7 +9445,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{141} + return fileDescriptor_9198ee693835762e, []int{143} } func (m *UserStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9423,7 +9519,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{142} + return fileDescriptor_9198ee693835762e, []int{144} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9470,7 +9566,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{143} + return fileDescriptor_9198ee693835762e, []int{145} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9518,7 +9614,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{144} + return fileDescriptor_9198ee693835762e, []int{146} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9563,7 +9659,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{145} + return fileDescriptor_9198ee693835762e, []int{147} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9612,7 +9708,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{146} + return fileDescriptor_9198ee693835762e, []int{148} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9669,7 +9765,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{147} + return fileDescriptor_9198ee693835762e, []int{149} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9779,7 +9875,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{148} + return fileDescriptor_9198ee693835762e, []int{150} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9825,7 +9921,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{149} + return fileDescriptor_9198ee693835762e, []int{151} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9907,7 +10003,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{150} + return fileDescriptor_9198ee693835762e, []int{152} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9953,7 +10049,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{151} + return fileDescriptor_9198ee693835762e, []int{153} } func (m *SSOMFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9996,7 +10092,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{152} + return fileDescriptor_9198ee693835762e, []int{154} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10042,7 +10138,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{153} + return fileDescriptor_9198ee693835762e, []int{155} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10084,7 +10180,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{154} + return fileDescriptor_9198ee693835762e, []int{156} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10134,7 +10230,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{155} + return fileDescriptor_9198ee693835762e, []int{157} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10181,7 +10277,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{156} + return fileDescriptor_9198ee693835762e, []int{158} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10230,7 +10326,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{157} + return fileDescriptor_9198ee693835762e, []int{159} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10278,7 +10374,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{158} + return fileDescriptor_9198ee693835762e, []int{160} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10326,7 +10422,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{159} + return fileDescriptor_9198ee693835762e, []int{161} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10377,7 +10473,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{160} + return fileDescriptor_9198ee693835762e, []int{162} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10425,7 +10521,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{161} + return fileDescriptor_9198ee693835762e, []int{163} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10471,7 +10567,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{162} + return fileDescriptor_9198ee693835762e, []int{164} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10520,7 +10616,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{163} + return fileDescriptor_9198ee693835762e, []int{165} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10562,7 +10658,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{164} + return fileDescriptor_9198ee693835762e, []int{166} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10611,7 +10707,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{165} + return fileDescriptor_9198ee693835762e, []int{167} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10696,7 +10792,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{166} + return fileDescriptor_9198ee693835762e, []int{168} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10741,7 +10837,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{167} + return fileDescriptor_9198ee693835762e, []int{169} } func (m *DeviceWebToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10783,7 +10879,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{168} + return fileDescriptor_9198ee693835762e, []int{170} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10854,7 +10950,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{169} + return fileDescriptor_9198ee693835762e, []int{171} } func (m *SAMLSessionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10903,7 +10999,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{170} + return fileDescriptor_9198ee693835762e, []int{172} } func (m *SAMLAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10950,7 +11046,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{171} + return fileDescriptor_9198ee693835762e, []int{173} } func (m *SAMLAttributeValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11001,7 +11097,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{172} + return fileDescriptor_9198ee693835762e, []int{174} } func (m *SAMLNameID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11050,7 +11146,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{173} + return fileDescriptor_9198ee693835762e, []int{175} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11094,7 +11190,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{174} + return fileDescriptor_9198ee693835762e, []int{176} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11144,7 +11240,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{175} + return fileDescriptor_9198ee693835762e, []int{177} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11193,7 +11289,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{176} + return fileDescriptor_9198ee693835762e, []int{178} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11244,7 +11340,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{177} + return fileDescriptor_9198ee693835762e, []int{179} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11292,7 +11388,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{178} + return fileDescriptor_9198ee693835762e, []int{180} } func (m *KubeAzure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11338,7 +11434,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{179} + return fileDescriptor_9198ee693835762e, []int{181} } func (m *KubeAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11384,7 +11480,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{180} + return fileDescriptor_9198ee693835762e, []int{182} } func (m *KubeGCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11426,7 +11522,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{181} + return fileDescriptor_9198ee693835762e, []int{183} } func (m *KubernetesClusterV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11475,7 +11571,7 @@ type KubernetesServerV3 struct { func (m *KubernetesServerV3) Reset() { *m = KubernetesServerV3{} } func (*KubernetesServerV3) ProtoMessage() {} func (*KubernetesServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{182} + return fileDescriptor_9198ee693835762e, []int{184} } func (m *KubernetesServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11527,7 +11623,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{183} + return fileDescriptor_9198ee693835762e, []int{185} } func (m *KubernetesServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11579,7 +11675,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{184} + return fileDescriptor_9198ee693835762e, []int{186} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11623,7 +11719,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{185} + return fileDescriptor_9198ee693835762e, []int{187} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11667,7 +11763,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{186} + return fileDescriptor_9198ee693835762e, []int{188} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11711,7 +11807,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{187} + return fileDescriptor_9198ee693835762e, []int{189} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11755,7 +11851,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{188} + return fileDescriptor_9198ee693835762e, []int{190} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11799,7 +11895,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{189} + return fileDescriptor_9198ee693835762e, []int{191} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11841,7 +11937,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{190} + return fileDescriptor_9198ee693835762e, []int{192} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11885,7 +11981,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{191} + return fileDescriptor_9198ee693835762e, []int{193} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11927,7 +12023,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{192} + return fileDescriptor_9198ee693835762e, []int{194} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11971,7 +12067,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{193} + return fileDescriptor_9198ee693835762e, []int{195} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12013,7 +12109,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{194} + return fileDescriptor_9198ee693835762e, []int{196} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12064,7 +12160,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{195} + return fileDescriptor_9198ee693835762e, []int{197} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12106,7 +12202,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{196} + return fileDescriptor_9198ee693835762e, []int{198} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12194,7 +12290,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{197} + return fileDescriptor_9198ee693835762e, []int{199} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12236,7 +12332,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{198} + return fileDescriptor_9198ee693835762e, []int{200} } func (m *MaxAge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12281,7 +12377,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{199} + return fileDescriptor_9198ee693835762e, []int{201} } func (m *SSOClientRedirectSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12338,7 +12434,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{200} + return fileDescriptor_9198ee693835762e, []int{202} } func (m *OIDCConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12440,7 +12536,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{201} + return fileDescriptor_9198ee693835762e, []int{203} } func (m *OIDCAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12491,7 +12587,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{202} + return fileDescriptor_9198ee693835762e, []int{204} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12533,7 +12629,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{203} + return fileDescriptor_9198ee693835762e, []int{205} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12615,7 +12711,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{204} + return fileDescriptor_9198ee693835762e, []int{206} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12674,7 +12770,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{205} + return fileDescriptor_9198ee693835762e, []int{207} } func (m *SAMLConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12770,7 +12866,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{206} + return fileDescriptor_9198ee693835762e, []int{208} } func (m *SAMLAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12816,7 +12912,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{207} + return fileDescriptor_9198ee693835762e, []int{209} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12861,7 +12957,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{208} + return fileDescriptor_9198ee693835762e, []int{210} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12912,7 +13008,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{209} + return fileDescriptor_9198ee693835762e, []int{211} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12954,7 +13050,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{210} + return fileDescriptor_9198ee693835762e, []int{212} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13017,7 +13113,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{211} + return fileDescriptor_9198ee693835762e, []int{213} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13110,7 +13206,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{212} + return fileDescriptor_9198ee693835762e, []int{214} } func (m *GithubAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13154,7 +13250,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{213} + return fileDescriptor_9198ee693835762e, []int{215} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13210,7 +13306,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{214} + return fileDescriptor_9198ee693835762e, []int{216} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13295,7 +13391,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{215} + return fileDescriptor_9198ee693835762e, []int{217} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13339,7 +13435,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{216} + return fileDescriptor_9198ee693835762e, []int{218} } func (m *GithubTokenInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13385,7 +13481,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{217} + return fileDescriptor_9198ee693835762e, []int{219} } func (m *GithubClaims) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13437,7 +13533,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{218} + return fileDescriptor_9198ee693835762e, []int{220} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13483,7 +13579,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{219} + return fileDescriptor_9198ee693835762e, []int{221} } func (m *TeamRolesMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13533,7 +13629,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{220} + return fileDescriptor_9198ee693835762e, []int{222} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13575,7 +13671,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{221} + return fileDescriptor_9198ee693835762e, []int{223} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13631,7 +13727,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{222} + return fileDescriptor_9198ee693835762e, []int{224} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13685,7 +13781,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{223} + return fileDescriptor_9198ee693835762e, []int{225} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13735,7 +13831,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{224} + return fileDescriptor_9198ee693835762e, []int{226} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13796,7 +13892,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{225} + return fileDescriptor_9198ee693835762e, []int{227} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13840,7 +13936,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{226} + return fileDescriptor_9198ee693835762e, []int{228} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13883,7 +13979,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{227} + return fileDescriptor_9198ee693835762e, []int{229} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13936,7 +14032,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{228} + return fileDescriptor_9198ee693835762e, []int{230} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13980,7 +14076,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{229} + return fileDescriptor_9198ee693835762e, []int{231} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14028,7 +14124,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{230} + return fileDescriptor_9198ee693835762e, []int{232} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14072,7 +14168,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{231} + return fileDescriptor_9198ee693835762e, []int{233} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14116,7 +14212,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{232} + return fileDescriptor_9198ee693835762e, []int{234} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14169,7 +14265,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{233} + return fileDescriptor_9198ee693835762e, []int{235} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14213,7 +14309,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{234} + return fileDescriptor_9198ee693835762e, []int{236} } func (m *DynamicWindowsDesktopV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14264,7 +14360,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{235} + return fileDescriptor_9198ee693835762e, []int{237} } func (m *DynamicWindowsDesktopSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14305,7 +14401,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{236} + return fileDescriptor_9198ee693835762e, []int{238} } func (m *Resolution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14388,7 +14484,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{237} + return fileDescriptor_9198ee693835762e, []int{239} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14442,7 +14538,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{238} + return fileDescriptor_9198ee693835762e, []int{240} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14487,7 +14583,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{239} + return fileDescriptor_9198ee693835762e, []int{241} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14531,7 +14627,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{240} + return fileDescriptor_9198ee693835762e, []int{242} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14571,7 +14667,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{241} + return fileDescriptor_9198ee693835762e, []int{243} } func (m *NullableSessionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14617,7 +14713,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{242} + return fileDescriptor_9198ee693835762e, []int{244} } func (m *SessionTrackerFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14661,7 +14757,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{243} + return fileDescriptor_9198ee693835762e, []int{245} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14759,7 +14855,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{244} + return fileDescriptor_9198ee693835762e, []int{246} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14806,7 +14902,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{245} + return fileDescriptor_9198ee693835762e, []int{247} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14854,7 +14950,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{246} + return fileDescriptor_9198ee693835762e, []int{248} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14898,7 +14994,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{247} + return fileDescriptor_9198ee693835762e, []int{249} } func (m *UIConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14944,7 +15040,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{248} + return fileDescriptor_9198ee693835762e, []int{250} } func (m *UIConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14995,7 +15091,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{249} + return fileDescriptor_9198ee693835762e, []int{251} } func (m *InstallerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15037,7 +15133,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{250} + return fileDescriptor_9198ee693835762e, []int{252} } func (m *InstallerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15079,7 +15175,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{251} + return fileDescriptor_9198ee693835762e, []int{253} } func (m *InstallerV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15123,7 +15219,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{252} + return fileDescriptor_9198ee693835762e, []int{254} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15169,7 +15265,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{253} + return fileDescriptor_9198ee693835762e, []int{255} } func (m *ConnectionDiagnosticV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15219,7 +15315,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{254} + return fileDescriptor_9198ee693835762e, []int{256} } func (m *ConnectionDiagnosticSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15265,7 +15361,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{255} + return fileDescriptor_9198ee693835762e, []int{257} } func (m *ConnectionDiagnosticTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15308,7 +15404,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{256} + return fileDescriptor_9198ee693835762e, []int{258} } func (m *DatabaseServiceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15352,7 +15448,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{257} + return fileDescriptor_9198ee693835762e, []int{259} } func (m *DatabaseServiceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15394,7 +15490,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{258} + return fileDescriptor_9198ee693835762e, []int{260} } func (m *DatabaseResourceMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15438,7 +15534,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{259} + return fileDescriptor_9198ee693835762e, []int{261} } func (m *ResourceMatcherAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15480,7 +15576,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{260} + return fileDescriptor_9198ee693835762e, []int{262} } func (m *ClusterAlert) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15526,7 +15622,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{261} + return fileDescriptor_9198ee693835762e, []int{263} } func (m *ClusterAlertSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15579,7 +15675,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{262} + return fileDescriptor_9198ee693835762e, []int{264} } func (m *GetClusterAlertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15629,7 +15725,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{263} + return fileDescriptor_9198ee693835762e, []int{265} } func (m *AlertAcknowledgement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15681,7 +15777,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{264} + return fileDescriptor_9198ee693835762e, []int{266} } func (m *Release) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15739,7 +15835,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{265} + return fileDescriptor_9198ee693835762e, []int{267} } func (m *Asset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15792,7 +15888,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{266} + return fileDescriptor_9198ee693835762e, []int{268} } func (m *PluginV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15859,7 +15955,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{267} + return fileDescriptor_9198ee693835762e, []int{269} } func (m *PluginSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16125,7 +16221,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{268} + return fileDescriptor_9198ee693835762e, []int{270} } func (m *PluginSlackAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16166,7 +16262,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{269} + return fileDescriptor_9198ee693835762e, []int{271} } func (m *PluginGitlabSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16213,7 +16309,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{270} + return fileDescriptor_9198ee693835762e, []int{272} } func (m *PluginOpsgenieAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16261,7 +16357,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{271} + return fileDescriptor_9198ee693835762e, []int{273} } func (m *PluginServiceNowSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16307,7 +16403,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{272} + return fileDescriptor_9198ee693835762e, []int{274} } func (m *PluginPagerDutySettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16353,7 +16449,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{273} + return fileDescriptor_9198ee693835762e, []int{275} } func (m *PluginJiraSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16393,7 +16489,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{274} + return fileDescriptor_9198ee693835762e, []int{276} } func (m *PluginOpenAISettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16444,7 +16540,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{275} + return fileDescriptor_9198ee693835762e, []int{277} } func (m *PluginMattermostSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16486,7 +16582,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{276} + return fileDescriptor_9198ee693835762e, []int{278} } func (m *PluginJamfSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16538,7 +16634,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{277} + return fileDescriptor_9198ee693835762e, []int{279} } func (m *PluginOktaSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16585,7 +16681,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{278} + return fileDescriptor_9198ee693835762e, []int{280} } func (m *PluginOktaCredentialsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16669,7 +16765,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{279} + return fileDescriptor_9198ee693835762e, []int{281} } func (m *PluginOktaSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16710,7 +16806,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{280} + return fileDescriptor_9198ee693835762e, []int{282} } func (m *DiscordChannels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16754,7 +16850,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{281} + return fileDescriptor_9198ee693835762e, []int{283} } func (m *PluginDiscordSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16799,7 +16895,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{282} + return fileDescriptor_9198ee693835762e, []int{284} } func (m *PluginEntraIDSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16853,7 +16949,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{283} + return fileDescriptor_9198ee693835762e, []int{285} } func (m *PluginEntraIDSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16898,7 +16994,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{284} + return fileDescriptor_9198ee693835762e, []int{286} } func (m *PluginEntraIDAccessGraphSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16944,7 +17040,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{285} + return fileDescriptor_9198ee693835762e, []int{287} } func (m *PluginEntraIDAppSSOSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16990,7 +17086,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{286} + return fileDescriptor_9198ee693835762e, []int{288} } func (m *PluginSCIMSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17034,7 +17130,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{287} + return fileDescriptor_9198ee693835762e, []int{289} } func (m *PluginDatadogAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17089,7 +17185,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{288} + return fileDescriptor_9198ee693835762e, []int{290} } func (m *PluginAWSICSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17136,7 +17232,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{289} + return fileDescriptor_9198ee693835762e, []int{291} } func (m *AWSICProvisioningSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17178,7 +17274,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{290} + return fileDescriptor_9198ee693835762e, []int{292} } func (m *PluginAWSICStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17223,7 +17319,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{291} + return fileDescriptor_9198ee693835762e, []int{293} } func (m *AWSICGroupImportStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17274,7 +17370,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{292} + return fileDescriptor_9198ee693835762e, []int{294} } func (m *PluginEmailSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17362,7 +17458,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{293} + return fileDescriptor_9198ee693835762e, []int{295} } func (m *MailgunSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17409,7 +17505,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{294} + return fileDescriptor_9198ee693835762e, []int{296} } func (m *SMTPSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17459,7 +17555,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{295} + return fileDescriptor_9198ee693835762e, []int{297} } func (m *PluginMSTeamsSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17504,7 +17600,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{296} + return fileDescriptor_9198ee693835762e, []int{298} } func (m *PluginBootstrapCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17604,7 +17700,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{297} + return fileDescriptor_9198ee693835762e, []int{299} } func (m *PluginIdSecretCredential) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17647,7 +17743,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{298} + return fileDescriptor_9198ee693835762e, []int{300} } func (m *PluginOAuth2AuthorizationCodeCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17706,7 +17802,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{299} + return fileDescriptor_9198ee693835762e, []int{301} } func (m *PluginStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17821,7 +17917,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{300} + return fileDescriptor_9198ee693835762e, []int{302} } func (m *PluginGitlabStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17865,7 +17961,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{301} + return fileDescriptor_9198ee693835762e, []int{303} } func (m *PluginEntraIDStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17919,7 +18015,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{302} + return fileDescriptor_9198ee693835762e, []int{304} } func (m *PluginOktaStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17967,7 +18063,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{303} + return fileDescriptor_9198ee693835762e, []int{305} } func (m *PluginOktaStatusDetailsSSO) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18024,7 +18120,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{304} + return fileDescriptor_9198ee693835762e, []int{306} } func (m *PluginOktaStatusDetailsAppGroupSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18078,7 +18174,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{305} + return fileDescriptor_9198ee693835762e, []int{307} } func (m *PluginOktaStatusDetailsUsersSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18121,7 +18217,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{306} + return fileDescriptor_9198ee693835762e, []int{308} } func (m *PluginOktaStatusDetailsSCIM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18183,7 +18279,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{307} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *PluginOktaStatusDetailsAccessListsSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18231,7 +18327,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{308} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *PluginCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18342,7 +18438,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{309} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *PluginOAuth2AccessTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18383,7 +18479,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{310} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *PluginBearerTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18425,7 +18521,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{311} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *PluginStaticCredentialsRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18467,7 +18563,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{312} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *PluginListV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18510,7 +18606,7 @@ type PluginStaticCredentialsV1 struct { func (m *PluginStaticCredentialsV1) Reset() { *m = PluginStaticCredentialsV1{} } func (*PluginStaticCredentialsV1) ProtoMessage() {} func (*PluginStaticCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{313} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *PluginStaticCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18556,7 +18652,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{314} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *PluginStaticCredentialsSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18658,7 +18754,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{315} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *PluginStaticCredentialsBasicAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18704,7 +18800,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{316} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *PluginStaticCredentialsOAuthClientSecret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18747,7 +18843,7 @@ type SAMLIdPServiceProviderV1 struct { func (m *SAMLIdPServiceProviderV1) Reset() { *m = SAMLIdPServiceProviderV1{} } func (*SAMLIdPServiceProviderV1) ProtoMessage() {} func (*SAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{317} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18818,7 +18914,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{318} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18865,7 +18961,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{319} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18907,7 +19003,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{320} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18949,7 +19045,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{321} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18999,7 +19095,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{322} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19041,7 +19137,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{323} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19087,7 +19183,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{324} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19129,7 +19225,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{325} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19175,7 +19271,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{326} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19222,7 +19318,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{327} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19265,7 +19361,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{328} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19308,7 +19404,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{329} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19350,7 +19446,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{330} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19394,7 +19490,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{331} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19438,7 +19534,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{332} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19481,7 +19577,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{333} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19529,7 +19625,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{334} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19572,7 +19668,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{335} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19626,7 +19722,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{336} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19670,7 +19766,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{337} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19715,7 +19811,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{338} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19760,7 +19856,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{339} + return fileDescriptor_9198ee693835762e, []int{341} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19867,7 +19963,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{340} + return fileDescriptor_9198ee693835762e, []int{342} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19913,7 +20009,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{341} + return fileDescriptor_9198ee693835762e, []int{343} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19974,7 +20070,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{342} + return fileDescriptor_9198ee693835762e, []int{344} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20031,7 +20127,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{343} + return fileDescriptor_9198ee693835762e, []int{345} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20081,7 +20177,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{344} + return fileDescriptor_9198ee693835762e, []int{346} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20122,7 +20218,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{345} + return fileDescriptor_9198ee693835762e, []int{347} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20172,7 +20268,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{346} + return fileDescriptor_9198ee693835762e, []int{348} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20214,7 +20310,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{347} + return fileDescriptor_9198ee693835762e, []int{349} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20271,7 +20367,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{348} + return fileDescriptor_9198ee693835762e, []int{350} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20336,7 +20432,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{349} + return fileDescriptor_9198ee693835762e, []int{351} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20393,7 +20489,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{350} + return fileDescriptor_9198ee693835762e, []int{352} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20457,7 +20553,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{351} + return fileDescriptor_9198ee693835762e, []int{353} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20502,7 +20598,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{352} + return fileDescriptor_9198ee693835762e, []int{354} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20564,7 +20660,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{353} + return fileDescriptor_9198ee693835762e, []int{355} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20607,7 +20703,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{354} + return fileDescriptor_9198ee693835762e, []int{356} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20650,7 +20746,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{355} + return fileDescriptor_9198ee693835762e, []int{357} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20704,7 +20800,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{356} + return fileDescriptor_9198ee693835762e, []int{358} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20759,7 +20855,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{357} + return fileDescriptor_9198ee693835762e, []int{359} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20805,7 +20901,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{358} + return fileDescriptor_9198ee693835762e, []int{360} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20847,7 +20943,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{359} + return fileDescriptor_9198ee693835762e, []int{361} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20891,7 +20987,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{360} + return fileDescriptor_9198ee693835762e, []int{362} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20937,7 +21033,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{361} + return fileDescriptor_9198ee693835762e, []int{363} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21048,6 +21144,8 @@ func init() { proto.RegisterType((*AppV3List)(nil), "types.AppV3List") proto.RegisterType((*AppV3)(nil), "types.AppV3") proto.RegisterType((*CORSPolicy)(nil), "types.CORSPolicy") + proto.RegisterType((*IdentityCenterPermissionSet)(nil), "types.IdentityCenterPermissionSet") + proto.RegisterType((*AppIdentityCenter)(nil), "types.AppIdentityCenter") proto.RegisterType((*AppSpecV3)(nil), "types.AppSpecV3") proto.RegisterMapType((map[string]CommandLabelV2)(nil), "types.AppSpecV3.DynamicLabelsEntry") proto.RegisterType((*AppServerOrSAMLIdPServiceProviderV1)(nil), "types.AppServerOrSAMLIdPServiceProviderV1") @@ -21398,1105 +21496,1112 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 29721 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x70, 0x1c, 0x49, - 0x76, 0x20, 0x86, 0x4f, 0x77, 0xe3, 0xa3, 0xf1, 0xf0, 0xd5, 0x48, 0x80, 0x24, 0x88, 0x19, 0xb2, - 0x39, 0x35, 0x33, 0x1c, 0x72, 0x76, 0x86, 0x5c, 0x82, 0x3b, 0xdc, 0x9d, 0x9d, 0xaf, 0x6d, 0x74, - 0x83, 0x44, 0x93, 0x00, 0x88, 0xad, 0x06, 0x88, 0x1d, 0xed, 0x47, 0x6d, 0xa1, 0x3b, 0x01, 0xd4, - 0xa0, 0xbb, 0xab, 0xb7, 0xaa, 0x9a, 0x20, 0x76, 0xef, 0x7e, 0x27, 0x9d, 0xa4, 0xd3, 0x4f, 0x21, - 0xeb, 0xeb, 0x2c, 0x9d, 0xf6, 0x1c, 0x3a, 0x59, 0x21, 0xfb, 0x6c, 0xc5, 0x39, 0x4e, 0x61, 0x4b, - 0x56, 0xf8, 0x6c, 0x85, 0x65, 0xe9, 0x42, 0x21, 0xcb, 0x0a, 0xc7, 0x49, 0x61, 0xcb, 0x5f, 0xeb, - 0x0b, 0xc8, 0xb2, 0xfc, 0x87, 0x03, 0x11, 0x8e, 0x90, 0x7c, 0x11, 0x8e, 0xf0, 0x5e, 0xe8, 0xce, - 0x91, 0x2f, 0x33, 0xab, 0x32, 0xab, 0xaa, 0x1b, 0x8d, 0x19, 0x8e, 0x4e, 0xdc, 0xd0, 0x3f, 0x24, - 0xfa, 0xe5, 0x7b, 0x2f, 0xb3, 0xf2, 0xf3, 0xe5, 0xcb, 0xf7, 0x01, 0x2f, 0x06, 0xb4, 0x49, 0x3b, - 0xae, 0x17, 0xdc, 0x6c, 0xd2, 0x3d, 0xbb, 0x7e, 0x74, 0x33, 0x38, 0xea, 0x50, 0x9f, 0xff, 0x7b, - 0xa3, 0xe3, 0xb9, 0x81, 0x4b, 0x86, 0xf1, 0xc7, 0xc2, 0xdc, 0x9e, 0xbb, 0xe7, 0x22, 0xe4, 0x26, - 0xfb, 0x8b, 0x17, 0x2e, 0x5c, 0xde, 0x73, 0xdd, 0xbd, 0x26, 0xbd, 0x89, 0xbf, 0x76, 0xba, 0xbb, - 0x37, 0x1b, 0x5d, 0xcf, 0x0e, 0x1c, 0xb7, 0x2d, 0xca, 0x8b, 0xf1, 0xf2, 0xc0, 0x69, 0x51, 0x3f, - 0xb0, 0x5b, 0x9d, 0x5e, 0x0c, 0x0e, 0x3d, 0xbb, 0xd3, 0xa1, 0x9e, 0xa8, 0x7d, 0xe1, 0x7a, 0xd8, - 0x40, 0x3b, 0x08, 0x18, 0x25, 0x63, 0x7e, 0xf3, 0xf1, 0x2d, 0xf5, 0xa7, 0x40, 0xbd, 0xd3, 0xe3, - 0x5b, 0xbc, 0xae, 0x1f, 0xd0, 0x86, 0xd5, 0xa0, 0x8f, 0x9d, 0x3a, 0xb5, 0x3c, 0xfa, 0x8d, 0xae, - 0xe3, 0xd1, 0x16, 0x6d, 0x07, 0x82, 0xee, 0x8d, 0x74, 0x3a, 0xd9, 0x90, 0x58, 0x8b, 0x8c, 0x5f, - 0xc8, 0xc1, 0xd8, 0x03, 0x4a, 0x3b, 0xa5, 0xa6, 0xf3, 0x98, 0x92, 0x97, 0x60, 0x68, 0xdd, 0x6e, - 0xd1, 0xf9, 0xcc, 0x95, 0xcc, 0xb5, 0xb1, 0xa5, 0xe9, 0x93, 0xe3, 0xe2, 0xb8, 0x4f, 0xbd, 0xc7, - 0xd4, 0xb3, 0xda, 0x76, 0x8b, 0x9a, 0x58, 0x48, 0x3e, 0x05, 0x63, 0xec, 0x7f, 0xbf, 0x63, 0xd7, - 0xe9, 0x7c, 0x16, 0x31, 0x27, 0x4f, 0x8e, 0x8b, 0x63, 0x6d, 0x09, 0x34, 0xa3, 0x72, 0x52, 0x85, - 0xd1, 0xe5, 0x27, 0x1d, 0xc7, 0xa3, 0xfe, 0xfc, 0xd0, 0x95, 0xcc, 0xb5, 0xf1, 0xc5, 0x85, 0x1b, - 0xbc, 0x8f, 0x6e, 0xc8, 0x3e, 0xba, 0xb1, 0x29, 0x3b, 0x71, 0x69, 0xf6, 0xf7, 0x8e, 0x8b, 0xcf, - 0x9d, 0x1c, 0x17, 0x47, 0x29, 0x27, 0xf9, 0xa9, 0x3f, 0x2e, 0x66, 0x4c, 0x49, 0x4f, 0xde, 0x81, - 0xa1, 0xcd, 0xa3, 0x0e, 0x9d, 0x1f, 0xbb, 0x92, 0xb9, 0x36, 0xb5, 0x78, 0xf9, 0x06, 0x1f, 0xd6, - 0xb0, 0xf1, 0xd1, 0x5f, 0x0c, 0x6b, 0x29, 0x7f, 0x72, 0x5c, 0x1c, 0x62, 0x28, 0x26, 0x52, 0x91, - 0x37, 0x60, 0x64, 0xc5, 0xf5, 0x83, 0x6a, 0x65, 0x1e, 0xb0, 0xc9, 0xe7, 0x4e, 0x8e, 0x8b, 0x33, - 0xfb, 0xae, 0x1f, 0x58, 0x4e, 0xe3, 0x75, 0xb7, 0xe5, 0x04, 0xb4, 0xd5, 0x09, 0x8e, 0x4c, 0x81, - 0x64, 0x3c, 0x81, 0x49, 0x8d, 0x1f, 0x19, 0x87, 0xd1, 0xad, 0xf5, 0x07, 0xeb, 0x0f, 0xb7, 0xd7, - 0x0b, 0xcf, 0x91, 0x3c, 0x0c, 0xad, 0x3f, 0xac, 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, 0xe1, 0x76, 0xcd, 0xaa, 0x2c, 0xd7, 0x1e, 0x6c, 0x3e, 0xdc, - 0x28, 0x0c, 0x91, 0x29, 0x80, 0x07, 0x5b, 0x4b, 0xcb, 0xe6, 0xfa, 0xf2, 0xe6, 0x72, 0xad, 0x30, - 0x4c, 0xe6, 0xa0, 0x20, 0x49, 0xac, 0xda, 0xb2, 0xf9, 0xa8, 0x5a, 0x5e, 0x2e, 0x8c, 0xdc, 0x1f, - 0xca, 0xe7, 0x0a, 0x43, 0xe6, 0xe8, 0x2a, 0xb5, 0x7d, 0x5a, 0xad, 0x18, 0xff, 0x5e, 0x0e, 0xf2, - 0x6b, 0x34, 0xb0, 0x1b, 0x76, 0x60, 0x93, 0x17, 0xb4, 0xf1, 0xc1, 0x4f, 0x54, 0x06, 0xe6, 0xa5, - 0xe4, 0xc0, 0x0c, 0x9f, 0x1c, 0x17, 0x33, 0x6f, 0xa8, 0x03, 0xf2, 0x36, 0x8c, 0x57, 0xa8, 0x5f, - 0xf7, 0x9c, 0x0e, 0x9b, 0x6c, 0xf3, 0x39, 0x44, 0xbb, 0x78, 0x72, 0x5c, 0x3c, 0xd7, 0x88, 0xc0, - 0x4a, 0x87, 0xa8, 0xd8, 0xa4, 0x0a, 0x23, 0xab, 0xf6, 0x0e, 0x6d, 0xfa, 0xf3, 0xc3, 0x57, 0x72, - 0xd7, 0xc6, 0x17, 0x9f, 0x17, 0x83, 0x20, 0x1b, 0x78, 0x83, 0x97, 0x2e, 0xb7, 0x03, 0xef, 0x68, - 0x69, 0xee, 0xe4, 0xb8, 0x58, 0x68, 0x22, 0x40, 0xed, 0x60, 0x8e, 0x42, 0x6a, 0xd1, 0xc4, 0x18, - 0x39, 0x75, 0x62, 0x5c, 0xfa, 0xbd, 0xe3, 0x62, 0x86, 0x0d, 0x98, 0x98, 0x18, 0x11, 0x3f, 0x7d, - 0x8a, 0x2c, 0x42, 0xde, 0xa4, 0x8f, 0x1d, 0x9f, 0x7d, 0x59, 0x1e, 0xbf, 0xec, 0xfc, 0xc9, 0x71, - 0x91, 0x78, 0x02, 0xa6, 0x34, 0x23, 0xc4, 0x5b, 0x78, 0x0b, 0xc6, 0x95, 0x56, 0x93, 0x02, 0xe4, - 0x0e, 0xe8, 0x11, 0xef, 0x61, 0x93, 0xfd, 0x49, 0xe6, 0x60, 0xf8, 0xb1, 0xdd, 0xec, 0x8a, 0x2e, - 0x35, 0xf9, 0x8f, 0xcf, 0x67, 0x3f, 0x97, 0xb9, 0x3f, 0x94, 0x1f, 0x2d, 0xe4, 0xcd, 0x6c, 0xb5, - 0x62, 0xfc, 0xdd, 0x21, 0xc8, 0x9b, 0x2e, 0x5f, 0xc0, 0xe4, 0x3a, 0x0c, 0xd7, 0x02, 0x3b, 0x90, - 0xc3, 0x34, 0x7b, 0x72, 0x5c, 0x9c, 0x66, 0x8b, 0x9b, 0x2a, 0xf5, 0x73, 0x0c, 0x86, 0xba, 0xb1, - 0x6f, 0xfb, 0x72, 0xb8, 0x10, 0xb5, 0xc3, 0x00, 0x2a, 0x2a, 0x62, 0x90, 0xab, 0x30, 0xb4, 0xe6, - 0x36, 0xa8, 0x18, 0x31, 0x72, 0x72, 0x5c, 0x9c, 0x6a, 0xb9, 0x0d, 0x15, 0x11, 0xcb, 0xc9, 0xeb, - 0x30, 0x56, 0xee, 0x7a, 0x1e, 0x6d, 0xb3, 0xb9, 0x3e, 0x84, 0xc8, 0x53, 0x27, 0xc7, 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, - 0x3d, 0xcf, 0xae, 0xd3, 0x0d, 0xea, 0x39, 0x6e, 0x03, 0xc7, 0x37, 0xb7, 0x74, 0xf5, 0xe4, 0xb8, - 0x78, 0x7e, 0x8f, 0x81, 0xad, 0x0e, 0xc2, 0x23, 0xea, 0xef, 0x1e, 0x17, 0xf3, 0x15, 0xb1, 0xd5, - 0x9a, 0x2a, 0x29, 0xf9, 0x3a, 0x1b, 0x1c, 0x3f, 0xc0, 0xae, 0xa5, 0x8d, 0xf9, 0xd1, 0x53, 0x9b, - 0x68, 0x88, 0x26, 0x9e, 0x6f, 0xda, 0x7e, 0x60, 0x79, 0x9c, 0x2e, 0xd6, 0x4e, 0x95, 0x25, 0x79, - 0x08, 0xf9, 0x5a, 0x7d, 0x9f, 0x36, 0xba, 0x4d, 0x8a, 0x53, 0x66, 0x7c, 0xf1, 0x82, 0x98, 0xd4, - 0x72, 0x3c, 0x65, 0xf1, 0xd2, 0x82, 0xe0, 0x4d, 0x7c, 0x01, 0x51, 0xe7, 0x93, 0xc4, 0xfa, 0x7c, - 0xfe, 0xdb, 0xbf, 0x58, 0x7c, 0xee, 0xfb, 0xff, 0xf9, 0x95, 0xe7, 0x8c, 0xff, 0x2c, 0x0b, 0x85, - 0x38, 0x13, 0xb2, 0x0b, 0x93, 0x5b, 0x9d, 0x86, 0x1d, 0xd0, 0x72, 0xd3, 0xa1, 0xed, 0xc0, 0xc7, - 0x49, 0xd2, 0xff, 0x9b, 0x5e, 0x16, 0xf5, 0xce, 0x77, 0x91, 0xd0, 0xaa, 0x73, 0xca, 0xd8, 0x57, - 0xe9, 0x6c, 0xa3, 0x7a, 0x6a, 0xb8, 0x81, 0xfb, 0x38, 0xc3, 0xce, 0x56, 0x0f, 0xdf, 0xfa, 0x7b, - 0xd4, 0x23, 0xd8, 0x8a, 0x09, 0xd4, 0x6e, 0xec, 0x1c, 0xe1, 0xcc, 0x1c, 0x7c, 0x02, 0x31, 0x92, - 0x94, 0x09, 0xc4, 0xc0, 0xc6, 0xff, 0x91, 0x81, 0x29, 0x93, 0xfa, 0x6e, 0xd7, 0xab, 0xd3, 0x15, - 0x6a, 0x37, 0xa8, 0xc7, 0xa6, 0xff, 0x03, 0xa7, 0xdd, 0x10, 0x6b, 0x0a, 0xa7, 0xff, 0x81, 0xd3, - 0x56, 0xb7, 0x6e, 0x2c, 0x27, 0x9f, 0x86, 0xd1, 0x5a, 0x77, 0x07, 0x51, 0xb3, 0xd1, 0x0e, 0xe0, - 0x77, 0x77, 0xac, 0x18, 0xba, 0x44, 0x23, 0x37, 0x61, 0xf4, 0x11, 0xf5, 0xfc, 0x68, 0x37, 0xc4, - 0xa3, 0xe1, 0x31, 0x07, 0xa9, 0x04, 0x02, 0x8b, 0xdc, 0x8b, 0x76, 0x64, 0x71, 0xa8, 0x4d, 0xc7, - 0xf6, 0xc1, 0x68, 0xaa, 0xb4, 0x04, 0x44, 0x9d, 0x2a, 0x12, 0xcb, 0xf8, 0xe9, 0x2c, 0x14, 0x2a, - 0x76, 0x60, 0xef, 0xd8, 0xbe, 0xe8, 0xcf, 0x47, 0xb7, 0xd9, 0x1e, 0xaf, 0x7c, 0x28, 0xee, 0xf1, - 0xac, 0xe5, 0x1f, 0xf9, 0xf3, 0x5e, 0x89, 0x7f, 0xde, 0x38, 0x3b, 0x61, 0xc5, 0xe7, 0x45, 0x1f, - 0xf5, 0xee, 0xe9, 0x1f, 0x55, 0x10, 0x1f, 0x95, 0x97, 0x1f, 0x15, 0x7d, 0x0a, 0x79, 0x17, 0x86, - 0x6a, 0x1d, 0x5a, 0x17, 0x9b, 0x88, 0x3c, 0x17, 0xf4, 0x8f, 0x63, 0x08, 0x8f, 0x6e, 0x2f, 0x4d, - 0x08, 0x36, 0x43, 0x7e, 0x87, 0xd6, 0x4d, 0x24, 0x53, 0x16, 0xcd, 0x3f, 0xc9, 0xc1, 0x5c, 0x1a, - 0x99, 0xfa, 0x1d, 0x23, 0x7d, 0xbe, 0xe3, 0x1a, 0xe4, 0xd9, 0x11, 0xce, 0x8e, 0x45, 0xdc, 0x2e, - 0xc6, 0x96, 0x26, 0x58, 0x93, 0xf7, 0x05, 0xcc, 0x0c, 0x4b, 0xc9, 0x4b, 0xa1, 0x44, 0x90, 0x8f, - 0xf8, 0x09, 0x89, 0x40, 0xca, 0x01, 0x6c, 0xac, 0xe5, 0x12, 0x46, 0xc1, 0x21, 0xea, 0x16, 0x09, - 0x8e, 0xc6, 0xda, 0x13, 0x10, 0xed, 0x98, 0x91, 0x87, 0xc2, 0x32, 0xe4, 0xe5, 0x67, 0xcd, 0x4f, - 0x20, 0xa3, 0x99, 0x58, 0x27, 0x3d, 0xba, 0xcd, 0x07, 0xb3, 0x21, 0x7e, 0xab, 0x6c, 0x24, 0x0e, - 0xb9, 0x0d, 0xf9, 0x0d, 0xcf, 0x7d, 0x72, 0x54, 0xad, 0xf8, 0xf3, 0x93, 0x57, 0x72, 0xd7, 0xc6, - 0x96, 0x2e, 0x9c, 0x1c, 0x17, 0x67, 0x3b, 0x0c, 0x66, 0x39, 0x0d, 0xf5, 0xa4, 0x0d, 0x11, 0xef, - 0x0f, 0xe5, 0x33, 0x85, 0xec, 0xfd, 0xa1, 0x7c, 0xb6, 0x90, 0xe3, 0xe2, 0xc5, 0xfd, 0xa1, 0xfc, - 0x50, 0x61, 0xf8, 0xfe, 0x50, 0x7e, 0x18, 0x05, 0x8e, 0xb1, 0x02, 0xdc, 0x1f, 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, 0xb4, 0x5d, 0x33, 0x27, 0x2b, 0x47, 0x6d, 0xbb, 0xe5, 0xd4, - 0xf9, 0xd1, 0x69, 0xe6, 0xee, 0x95, 0x37, 0x8c, 0x12, 0x4c, 0x45, 0xdf, 0xb2, 0xea, 0xf8, 0x01, - 0xb9, 0x09, 0x63, 0x12, 0xc2, 0x36, 0xba, 0x5c, 0xea, 0x57, 0x9b, 0x11, 0x8e, 0xf1, 0xbb, 0x59, - 0x80, 0xa8, 0xe4, 0x19, 0x5d, 0x0b, 0x9f, 0xd5, 0xd6, 0xc2, 0xb9, 0xf8, 0x5a, 0xe8, 0xb9, 0x0a, - 0xc8, 0xfb, 0x30, 0xc2, 0xc4, 0x82, 0xae, 0x14, 0x89, 0x2e, 0xc4, 0x49, 0xb1, 0xf0, 0xd1, 0xed, - 0xa5, 0x29, 0x41, 0x3c, 0xe2, 0x23, 0xc4, 0x14, 0x64, 0xca, 0x32, 0xfa, 0x85, 0xd1, 0x68, 0x30, - 0xc4, 0x02, 0xba, 0x06, 0xe1, 0x80, 0x8a, 0x0e, 0xc5, 0x95, 0xd1, 0x91, 0x83, 0x1c, 0x96, 0x92, - 0x8b, 0xc0, 0x06, 0x5c, 0x74, 0xea, 0xe8, 0xc9, 0x71, 0x31, 0xd7, 0xf5, 0x1c, 0x9c, 0x04, 0xe4, - 0x26, 0x88, 0x69, 0x20, 0x3a, 0x90, 0xcd, 0xbe, 0x99, 0xba, 0x6d, 0xd5, 0xa9, 0x17, 0x44, 0x3d, - 0x3e, 0x9f, 0x91, 0xb3, 0x85, 0x74, 0x40, 0x9f, 0x2a, 0xf3, 0x43, 0x38, 0x0d, 0xae, 0xa5, 0xf6, - 0xca, 0x0d, 0x0d, 0x95, 0x8b, 0x91, 0x57, 0xe4, 0xa9, 0xd4, 0xe0, 0x65, 0x56, 0x42, 0xa4, 0xd4, - 0x2b, 0x20, 0xb7, 0x81, 0xcd, 0x50, 0xd1, 0xfb, 0x20, 0xea, 0x29, 0x6d, 0xd7, 0x96, 0xce, 0x09, - 0x4e, 0x93, 0xf6, 0xa1, 0x4a, 0xce, 0xb0, 0xc9, 0xdb, 0xc0, 0xa6, 0xb0, 0xe8, 0x77, 0x22, 0x88, - 0xee, 0x95, 0x37, 0xca, 0x4d, 0xb7, 0xdb, 0xa8, 0x7d, 0x71, 0x35, 0x22, 0xde, 0xab, 0x77, 0x54, - 0xe2, 0x7b, 0xe5, 0x0d, 0xf2, 0x36, 0x0c, 0x97, 0xbe, 0xd9, 0xf5, 0xa8, 0x90, 0x4f, 0x26, 0x64, - 0x9d, 0x0c, 0xb6, 0x74, 0x41, 0x10, 0x4e, 0xdb, 0xec, 0xa7, 0x2a, 0xd7, 0x61, 0x39, 0xab, 0x79, - 0x73, 0xb5, 0x26, 0x64, 0x0f, 0x12, 0xeb, 0x96, 0xcd, 0x55, 0xa5, 0xd9, 0x81, 0xf6, 0xd5, 0x8c, - 0x8a, 0xdc, 0x84, 0x6c, 0xa9, 0x82, 0x37, 0xa2, 0xf1, 0xc5, 0x31, 0x59, 0x6d, 0x65, 0x69, 0x4e, - 0x90, 0x4c, 0xd8, 0xea, 0x32, 0xc8, 0x96, 0x2a, 0x64, 0x09, 0x86, 0xd7, 0x8e, 0x6a, 0x5f, 0x5c, - 0x15, 0x9b, 0xd9, 0xac, 0x9c, 0xd7, 0x0c, 0xf6, 0x10, 0x97, 0xbd, 0x1f, 0xb5, 0xb8, 0x75, 0xe4, - 0x7f, 0xa3, 0xa9, 0xb6, 0x18, 0xd1, 0xc8, 0x06, 0x8c, 0x95, 0x1a, 0x2d, 0xa7, 0xbd, 0xe5, 0x53, - 0x6f, 0x7e, 0x1c, 0xf9, 0xcc, 0xc7, 0xda, 0x1d, 0x96, 0x2f, 0xcd, 0x9f, 0x1c, 0x17, 0xe7, 0x6c, - 0xf6, 0xd3, 0xea, 0xfa, 0xd4, 0x53, 0xb8, 0x45, 0x4c, 0xc8, 0x06, 0xc0, 0x9a, 0xdb, 0xde, 0x73, - 0x4b, 0x41, 0xd3, 0xf6, 0x63, 0xdb, 0x63, 0x54, 0x10, 0x8a, 0x0f, 0xe7, 0x5a, 0x0c, 0x66, 0xd9, - 0x0c, 0xa8, 0x30, 0x54, 0x78, 0x90, 0xbb, 0x30, 0xf2, 0xd0, 0xb3, 0xeb, 0x4d, 0x3a, 0x3f, 0x89, - 0xdc, 0xe6, 0x04, 0x37, 0x0e, 0x94, 0x5f, 0x3a, 0x2f, 0x18, 0x16, 0x5c, 0x04, 0xab, 0xd7, 0x14, - 0x8e, 0xb8, 0xb0, 0x0d, 0x24, 0x39, 0x27, 0x53, 0x2e, 0x09, 0x9f, 0x52, 0x2f, 0x09, 0xd1, 0xa2, - 0x2f, 0xbb, 0xad, 0x96, 0xdd, 0x6e, 0x20, 0xed, 0xa3, 0x45, 0xe5, 0xee, 0x60, 0x7c, 0x03, 0x66, - 0x12, 0x9d, 0x75, 0xca, 0xfd, 0xee, 0x3d, 0x98, 0xae, 0xd0, 0x5d, 0xbb, 0xdb, 0x0c, 0xc2, 0x93, - 0x84, 0x2f, 0x51, 0xbc, 0x69, 0x35, 0x78, 0x91, 0x25, 0x8f, 0x0f, 0x33, 0x8e, 0x6c, 0xbc, 0x0b, - 0x93, 0xda, 0xe7, 0xb3, 0xab, 0x42, 0xa9, 0xdb, 0x70, 0x02, 0x1c, 0xc8, 0x4c, 0x74, 0x55, 0xb0, - 0x19, 0x10, 0x87, 0xcb, 0x8c, 0x10, 0x8c, 0x7f, 0x5f, 0x95, 0x56, 0xc4, 0x4e, 0xc4, 0xae, 0xd5, - 0x62, 0x3f, 0xc8, 0x44, 0xb2, 0x53, 0x62, 0x3f, 0x08, 0x77, 0x83, 0xeb, 0x7c, 0x6d, 0x66, 0x13, - 0x6b, 0x73, 0x5c, 0x8c, 0x44, 0xce, 0x3e, 0xf4, 0xf9, 0x8a, 0x0c, 0x67, 0x6a, 0xee, 0xa3, 0xcf, - 0xd4, 0xf7, 0x61, 0x62, 0xcd, 0x6e, 0xdb, 0x7b, 0xb4, 0xc1, 0xbe, 0x80, 0xef, 0x3d, 0x63, 0x4b, - 0xcf, 0x9f, 0x1c, 0x17, 0x2f, 0xb4, 0x38, 0x1c, 0xbf, 0x52, 0x9d, 0x44, 0x1a, 0x01, 0xb9, 0x25, - 0x57, 0xf6, 0x70, 0xca, 0xca, 0x9e, 0x14, 0xb5, 0x0f, 0xe3, 0xca, 0x16, 0xeb, 0xd9, 0xf8, 0xad, - 0x31, 0xfc, 0x46, 0xf2, 0x3a, 0x8c, 0x98, 0x74, 0x8f, 0x1d, 0x35, 0x99, 0x68, 0x90, 0x3c, 0x84, - 0xa8, 0x1d, 0xc3, 0x71, 0x50, 0xce, 0xa0, 0x0d, 0x7f, 0xdf, 0xd9, 0x0d, 0x44, 0xef, 0x84, 0x72, - 0x86, 0x00, 0x2b, 0x72, 0x86, 0x80, 0xe8, 0xd7, 0x59, 0x0e, 0x63, 0xbb, 0x9f, 0x59, 0xa9, 0x89, - 0x4e, 0x93, 0x3d, 0x6c, 0x56, 0x94, 0x6d, 0xc4, 0xd3, 0xa4, 0x04, 0x86, 0x4d, 0xee, 0xc0, 0x58, - 0xa9, 0x5e, 0x77, 0xbb, 0xca, 0x9d, 0x91, 0xaf, 0x5b, 0x0e, 0xd4, 0x55, 0x24, 0x11, 0x2a, 0xa9, - 0xc1, 0xf8, 0x32, 0xbb, 0x68, 0x39, 0x65, 0xbb, 0xbe, 0x2f, 0x3b, 0x49, 0xee, 0x61, 0x4a, 0x49, - 0xb4, 0x72, 0x29, 0x02, 0xeb, 0x0c, 0xa8, 0x2a, 0x19, 0x14, 0x5c, 0xb2, 0x09, 0xe3, 0x35, 0x5a, - 0xf7, 0x68, 0x50, 0x0b, 0x5c, 0x8f, 0xc6, 0xb6, 0x64, 0xa5, 0x64, 0xe9, 0xb2, 0xbc, 0xeb, 0xf9, - 0x08, 0xb4, 0x7c, 0x06, 0x55, 0xb9, 0x2a, 0xc8, 0x5c, 0x68, 0x6f, 0xb9, 0xde, 0x51, 0x65, 0x49, - 0x6c, 0xd3, 0xd1, 0x99, 0xce, 0xc1, 0xaa, 0xd0, 0xce, 0x20, 0x8d, 0x1d, 0x5d, 0x68, 0xe7, 0x58, - 0x38, 0x52, 0x95, 0x1a, 0xca, 0x56, 0x62, 0xd3, 0x9e, 0x8e, 0x7a, 0x19, 0xc1, 0xca, 0x48, 0x35, - 0x7c, 0x94, 0xcc, 0xb4, 0x91, 0x12, 0x58, 0xa4, 0x03, 0x44, 0x8e, 0x1a, 0x17, 0x74, 0x9b, 0xd4, - 0xf7, 0xc5, 0x5e, 0x7e, 0x31, 0x36, 0xf8, 0x11, 0xc2, 0xd2, 0x2b, 0x82, 0xf9, 0x25, 0x39, 0x0d, - 0xc4, 0x3d, 0x8d, 0x15, 0x2a, 0xf5, 0xa4, 0xf0, 0x26, 0x6f, 0x01, 0x2c, 0x3f, 0x09, 0xa8, 0xd7, - 0xb6, 0x9b, 0xa1, 0x1e, 0x0c, 0x55, 0x3f, 0x54, 0x40, 0xf5, 0x81, 0x56, 0x90, 0x49, 0x19, 0x26, - 0x4b, 0xbe, 0xdf, 0x6d, 0x51, 0xd3, 0x6d, 0xd2, 0x92, 0xb9, 0x8e, 0xfb, 0xfe, 0xd8, 0xd2, 0xa5, - 0x93, 0xe3, 0xe2, 0x45, 0x1b, 0x0b, 0x2c, 0xcf, 0x6d, 0x52, 0xcb, 0xf6, 0xd4, 0xd9, 0xad, 0xd3, - 0x90, 0x87, 0x00, 0x0f, 0x3b, 0xb4, 0x5d, 0xa3, 0xb6, 0x57, 0xdf, 0x8f, 0x6d, 0xf3, 0x51, 0xc1, - 0xd2, 0x0b, 0xe2, 0x0b, 0xe7, 0xdc, 0x0e, 0x6d, 0xfb, 0x08, 0x53, 0x5b, 0x15, 0x61, 0x92, 0x6d, - 0x98, 0xae, 0x96, 0xd6, 0x36, 0xdc, 0xa6, 0x53, 0x3f, 0x12, 0x92, 0xd3, 0x14, 0x6a, 0x07, 0xcf, - 0x0b, 0xae, 0xb1, 0x52, 0xbe, 0x3d, 0x39, 0x76, 0xcb, 0xea, 0x20, 0xd4, 0x12, 0xf2, 0x53, 0x9c, - 0x0b, 0xf9, 0x80, 0xcd, 0x41, 0x9f, 0x09, 0x83, 0x9b, 0xf6, 0x9e, 0x3f, 0x3f, 0xad, 0x69, 0xbb, - 0x4a, 0xdb, 0xb5, 0x1b, 0x4a, 0x29, 0x17, 0x53, 0x16, 0xf8, 0x44, 0x44, 0xa8, 0x15, 0xd8, 0x7b, - 0xbe, 0x3e, 0x11, 0x43, 0x6c, 0x72, 0x1f, 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, 0x0f, 0x0a, 0xf1, 0x86, 0x9c, 0x51, 0x81, 0x35, 0x59, 0x98, 0x52, 0xbe, 0x7e, 0xf9, 0x89, - 0xe3, 0x07, 0xbe, 0xf1, 0x2d, 0x6d, 0x05, 0xb2, 0xdd, 0xe1, 0x01, 0x3d, 0xda, 0xf0, 0xe8, 0xae, - 0xf3, 0x44, 0x6c, 0x66, 0xb8, 0x3b, 0x1c, 0xd0, 0x23, 0xab, 0x83, 0x50, 0x75, 0x77, 0x08, 0x51, - 0xc9, 0x67, 0x20, 0xff, 0x60, 0xad, 0xf6, 0x80, 0x1e, 0x55, 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, 0x55, 0x18, 0xad, 0x96, 0xd6, - 0x4a, 0xdd, 0x60, 0x1f, 0xf7, 0xe0, 0x3c, 0x97, 0xcf, 0xd9, 0x6c, 0xb5, 0xbb, 0xc1, 0xbe, 0x29, - 0x0b, 0xc9, 0x4d, 0xbc, 0xf7, 0xb4, 0x69, 0xc0, 0xd5, 0xb0, 0xe2, 0xd0, 0xf5, 0x39, 0x28, 0x76, - 0xed, 0x61, 0x20, 0xf2, 0x1a, 0x0c, 0x3f, 0xda, 0x28, 0x57, 0x2b, 0xe2, 0xe2, 0x8c, 0x27, 0xd1, - 0xe3, 0x4e, 0x5d, 0x6f, 0x09, 0x47, 0x21, 0xcb, 0x30, 0x55, 0xa3, 0xf5, 0xae, 0xe7, 0x04, 0x47, - 0xf7, 0x3c, 0xb7, 0xdb, 0xf1, 0xe7, 0x47, 0xb1, 0x0e, 0x5c, 0xe9, 0xbe, 0x28, 0xb1, 0xf6, 0xb0, - 0x48, 0xa1, 0x8e, 0x11, 0x19, 0xbf, 0x9d, 0x89, 0xb6, 0x49, 0x72, 0x55, 0x13, 0x6b, 0x50, 0x77, - 0xc3, 0xc4, 0x1a, 0x55, 0x77, 0x83, 0x02, 0x8e, 0x09, 0xa4, 0xdc, 0xf5, 0x03, 0xb7, 0xb5, 0xdc, - 0x6e, 0x74, 0x5c, 0xa7, 0x1d, 0x20, 0x15, 0xef, 0x7c, 0xe3, 0xe4, 0xb8, 0x78, 0xb9, 0x8e, 0xa5, - 0x16, 0x15, 0xc5, 0x56, 0x8c, 0x4b, 0x0a, 0xf5, 0xc7, 0x18, 0x0f, 0xe3, 0xf7, 0xb3, 0xda, 0xf1, - 0xc6, 0x9a, 0x67, 0xd2, 0x4e, 0xd3, 0xa9, 0xe3, 0x8d, 0x1e, 0x3f, 0x34, 0x9c, 0x55, 0xd8, 0x3c, - 0x2f, 0x2a, 0xe5, 0x3d, 0xa4, 0xf3, 0x4e, 0xa1, 0x26, 0x5f, 0x80, 0x09, 0x26, 0x69, 0x88, 0x9f, - 0xfe, 0x7c, 0x16, 0x3b, 0xfb, 0x05, 0xd4, 0xc2, 0xf9, 0xd4, 0x0b, 0xd9, 0x68, 0x22, 0x8a, 0x4a, - 0x41, 0x1a, 0x30, 0xbf, 0xe9, 0xd9, 0x6d, 0xdf, 0x09, 0x96, 0xdb, 0x75, 0xef, 0x08, 0x25, 0xa3, - 0xe5, 0xb6, 0xbd, 0xd3, 0xa4, 0x0d, 0xfc, 0xdc, 0xfc, 0xd2, 0xb5, 0x93, 0xe3, 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, 0xb5, 0x99, 0x2a, 0x81, - 0xf1, 0xff, 0x64, 0xa2, 0x03, 0x98, 0xbc, 0x03, 0xe3, 0x62, 0xc5, 0x28, 0xf3, 0x02, 0x77, 0x50, - 0xb9, 0xbc, 0x62, 0x23, 0xab, 0xa2, 0xb3, 0x7b, 0x7f, 0xa9, 0xbc, 0xaa, 0xcc, 0x0d, 0xbc, 0xf7, - 0xdb, 0xf5, 0x66, 0x9c, 0x4a, 0xa2, 0xb1, 0x49, 0xb0, 0xb9, 0x5a, 0xd3, 0x7b, 0x05, 0x27, 0x41, - 0xd0, 0xf4, 0x53, 0xba, 0x41, 0x41, 0xfe, 0xf8, 0x1f, 0xfe, 0x3f, 0x65, 0xd2, 0xce, 0x79, 0xb2, - 0x04, 0x93, 0xdb, 0xae, 0x77, 0x80, 0xe3, 0xab, 0x74, 0x02, 0x8e, 0xfc, 0xa1, 0x2c, 0x88, 0x7f, - 0x90, 0x4e, 0xa2, 0xb6, 0x4d, 0xe9, 0x0d, 0xbd, 0x6d, 0x31, 0x0e, 0x1a, 0x01, 0x1b, 0x87, 0x90, - 0x63, 0xb8, 0x3a, 0x70, 0x1c, 0xa2, 0x26, 0x68, 0x53, 0x58, 0x45, 0x37, 0xfe, 0xcb, 0x8c, 0x7a, - 0x9e, 0xb3, 0x4e, 0xae, 0xb8, 0x2d, 0xdb, 0x69, 0x2b, 0x9f, 0xc3, 0x1f, 0x96, 0x10, 0x1a, 0x6f, - 0x89, 0x82, 0x4c, 0x6e, 0x43, 0x9e, 0xff, 0x0a, 0xf7, 0x5a, 0xd4, 0x6a, 0x09, 0x42, 0xfd, 0xa0, - 0x90, 0x88, 0x89, 0x91, 0xc9, 0x9d, 0x75, 0x64, 0x7e, 0x2b, 0xa3, 0x1e, 0xc5, 0x1f, 0xf5, 0xb0, - 0x89, 0x1d, 0x32, 0xd9, 0xb3, 0x1c, 0x32, 0x1f, 0xfb, 0x13, 0xbe, 0x3f, 0x03, 0xe3, 0x8a, 0x96, - 0x82, 0x7d, 0xc3, 0x86, 0xe7, 0x7e, 0x48, 0xeb, 0x81, 0xfe, 0x0d, 0x1d, 0x0e, 0x8c, 0x7d, 0x43, - 0x88, 0xfa, 0x31, 0xbe, 0xc1, 0xf8, 0xf3, 0x8c, 0xb8, 0x23, 0x0d, 0xbc, 0xcd, 0xeb, 0x5b, 0x72, - 0xf6, 0x2c, 0x47, 0xe4, 0x17, 0x60, 0xd8, 0xa4, 0x0d, 0xc7, 0x17, 0xf7, 0x9b, 0x19, 0xf5, 0x3e, - 0x86, 0x05, 0x91, 0xdc, 0xe4, 0xb1, 0x9f, 0xea, 0xf9, 0x86, 0xe5, 0x4c, 0x90, 0xad, 0xfa, 0x77, - 0x9b, 0xf4, 0x89, 0xc3, 0x17, 0xa3, 0x38, 0x6a, 0xf1, 0x78, 0x73, 0x7c, 0x6b, 0x97, 0x95, 0x08, - 0x89, 0x5a, 0x5d, 0x78, 0x1a, 0x8d, 0xf1, 0x01, 0x40, 0x54, 0x25, 0x79, 0x00, 0x05, 0x31, 0x1b, - 0x9c, 0xf6, 0x1e, 0x17, 0xa4, 0x44, 0x1f, 0x14, 0x4f, 0x8e, 0x8b, 0xcf, 0xd7, 0xc3, 0x32, 0x21, - 0x75, 0x2a, 0x7c, 0x13, 0x84, 0xc6, 0x7f, 0x98, 0x85, 0x6c, 0x09, 0x07, 0xe4, 0x01, 0x3d, 0x0a, - 0xec, 0x9d, 0xbb, 0x4e, 0x53, 0x5b, 0x4c, 0x07, 0x08, 0xb5, 0x76, 0x1d, 0x4d, 0x5d, 0xa1, 0x20, - 0xb3, 0xc5, 0xf4, 0xc0, 0xdb, 0x79, 0x13, 0x09, 0x95, 0xc5, 0x74, 0xe0, 0xed, 0xbc, 0x19, 0x27, - 0x0b, 0x11, 0x89, 0x01, 0x23, 0x7c, 0x61, 0x89, 0x39, 0x08, 0x27, 0xc7, 0xc5, 0x11, 0xbe, 0xfe, - 0x4c, 0x51, 0x42, 0x2e, 0x42, 0xae, 0xb6, 0xb1, 0x2e, 0x76, 0x40, 0x54, 0x0b, 0xfa, 0x9d, 0xb6, - 0xc9, 0x60, 0xac, 0xce, 0xd5, 0x4a, 0x69, 0x03, 0x15, 0x01, 0xc3, 0x51, 0x9d, 0xcd, 0x86, 0xdd, - 0x89, 0xab, 0x02, 0x42, 0x44, 0xf2, 0x2e, 0x8c, 0x3f, 0xa8, 0x94, 0x57, 0x5c, 0x9f, 0xef, 0x5e, - 0x23, 0xd1, 0xe4, 0x3f, 0x68, 0xd4, 0x2d, 0xd4, 0xc4, 0xc7, 0x8f, 0x01, 0x05, 0xdf, 0xf8, 0xe1, - 0x2c, 0x8c, 0x2b, 0x7a, 0x32, 0xf2, 0x19, 0xf1, 0x40, 0x9a, 0xd1, 0x6e, 0x00, 0x0a, 0x06, 0x2b, - 0xe5, 0x4a, 0x95, 0x96, 0xdb, 0xa0, 0xe2, 0xb9, 0x34, 0x52, 0x60, 0x64, 0x07, 0x51, 0x60, 0xbc, - 0x05, 0xc0, 0xe7, 0x00, 0x36, 0x59, 0x11, 0x27, 0x14, 0x3b, 0x09, 0x75, 0x5c, 0x22, 0x64, 0xf2, - 0x08, 0x66, 0x37, 0xbd, 0xae, 0x1f, 0xd4, 0x8e, 0xfc, 0x80, 0xb6, 0x18, 0xb7, 0x0d, 0xd7, 0x6d, - 0x8a, 0xf9, 0xf7, 0xf2, 0xc9, 0x71, 0xf1, 0x0a, 0x1a, 0x77, 0x58, 0x3e, 0x96, 0x63, 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, 0xb4, 0x32, 0xf9, 0xb8, 0xa5, 0x93, 0x18, 0x9f, 0x51, - 0x15, 0x72, 0x83, 0x2e, 0x6c, 0xe3, 0x6f, 0x67, 0xa2, 0x6d, 0xe4, 0xd1, 0x2d, 0xf2, 0x36, 0x8c, - 0xf0, 0xc7, 0x3b, 0xf1, 0xc6, 0x79, 0x2e, 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, - 0x56, 0x9a, 0x12, 0xdd, 0xf8, 0x9d, 0x21, 0x98, 0xd2, 0xd1, 0xd4, 0x17, 0xbe, 0xcc, 0x40, 0x2f, - 0x7c, 0x5f, 0x80, 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, 0x0d, 0x18, 0x61, 0xf2, 0x7d, 0xa8, - 0x82, 0xc1, 0x56, 0x32, 0xd1, 0x3f, 0x66, 0xa2, 0xc2, 0x91, 0xc8, 0x36, 0xe4, 0x57, 0x6d, 0x3f, - 0xa8, 0x51, 0xda, 0x1e, 0xe0, 0xed, 0xbe, 0x28, 0xba, 0x6a, 0x16, 0x1f, 0xc6, 0x7d, 0x4a, 0xdb, - 0xb1, 0xc7, 0xd7, 0x90, 0x19, 0xf9, 0x2a, 0x40, 0xd9, 0x6d, 0x07, 0x9e, 0xdb, 0x5c, 0x75, 0xf7, - 0xe6, 0x47, 0xf0, 0xee, 0x7b, 0x39, 0x36, 0x00, 0x11, 0x02, 0xbf, 0xfe, 0x86, 0x0a, 0x9e, 0x3a, - 0x2f, 0xb0, 0x9a, 0xee, 0x9e, 0xba, 0x0e, 0x22, 0x7c, 0x72, 0x17, 0x0a, 0x52, 0xb1, 0xb0, 0xd5, - 0xd9, 0xf3, 0x70, 0x82, 0x8c, 0x46, 0x92, 0x07, 0x7d, 0x12, 0x58, 0x5d, 0x01, 0x57, 0x77, 0xca, - 0x38, 0x0d, 0xf9, 0x0a, 0x5c, 0x88, 0xc3, 0xe4, 0x28, 0xe7, 0x23, 0x99, 0x5c, 0x65, 0x97, 0x32, - 0xef, 0x7b, 0xb1, 0x30, 0xbe, 0x9b, 0x85, 0x0b, 0x3d, 0x3e, 0x96, 0xad, 0x07, 0x3c, 0xae, 0x95, - 0xf5, 0x10, 0x3b, 0xa5, 0xb9, 0xcd, 0xd1, 0x15, 0xc8, 0x8a, 0x03, 0x6e, 0x68, 0xa9, 0x70, 0x72, - 0x5c, 0x9c, 0xd0, 0xc6, 0x31, 0x5b, 0xad, 0x90, 0xfb, 0x30, 0xc4, 0x86, 0x68, 0x80, 0xa7, 0x73, - 0xa9, 0x53, 0x9a, 0x0a, 0x1c, 0x75, 0xfa, 0xe0, 0xd0, 0x21, 0x0f, 0xf2, 0x19, 0xc8, 0x6d, 0x6e, - 0xae, 0xe2, 0xdc, 0xc9, 0xe1, 0xb7, 0x4f, 0x06, 0x41, 0x53, 0x9b, 0xaa, 0x93, 0x8c, 0xf6, 0x46, - 0x68, 0x69, 0xc1, 0xd0, 0xc9, 0x97, 0x62, 0x26, 0x3d, 0xaf, 0xf5, 0x1f, 0xe8, 0xc1, 0x2d, 0x7c, - 0x3e, 0x86, 0x61, 0x8d, 0xf1, 0xf3, 0xd9, 0x68, 0x0d, 0xdf, 0x75, 0x9a, 0x01, 0xf5, 0xc8, 0x02, - 0x5f, 0x92, 0x91, 0x70, 0x66, 0x86, 0xbf, 0xc9, 0x7c, 0xb4, 0xbe, 0x39, 0xab, 0x70, 0x21, 0xbf, - 0xa6, 0x2c, 0xe4, 0x1c, 0x2e, 0xe4, 0xa9, 0x9e, 0x4b, 0xf6, 0xb5, 0x94, 0x79, 0x89, 0x0b, 0x31, - 0x65, 0xee, 0xbd, 0x0c, 0x93, 0xeb, 0xee, 0xf2, 0x93, 0x20, 0x44, 0x64, 0x0b, 0x30, 0x6f, 0xea, - 0x40, 0xc6, 0xf1, 0x61, 0xb3, 0x41, 0xbd, 0xcd, 0x7d, 0xbb, 0xad, 0xbd, 0x5d, 0x9b, 0x09, 0x38, - 0xc3, 0x5d, 0xa7, 0x87, 0x3a, 0xee, 0x28, 0xc7, 0x8d, 0xc3, 0x8d, 0x1f, 0xc8, 0xca, 0xce, 0x78, - 0xb4, 0xf8, 0x8c, 0xbe, 0x91, 0xbe, 0xa9, 0xbd, 0x91, 0xce, 0x86, 0xda, 0xdd, 0xf0, 0xc1, 0x7f, - 0xf1, 0x14, 0x3b, 0x81, 0xff, 0x79, 0x18, 0x26, 0x54, 0x74, 0xd6, 0x0f, 0xa5, 0x46, 0xc3, 0x53, - 0xfb, 0xc1, 0x6e, 0x34, 0x3c, 0x13, 0xa1, 0x9a, 0x59, 0x40, 0xae, 0xaf, 0x59, 0xc0, 0xd7, 0x60, - 0xac, 0xdc, 0x6a, 0x68, 0x8f, 0x95, 0x46, 0x4a, 0xf3, 0x6e, 0x84, 0x48, 0x7c, 0x2d, 0x84, 0x4a, - 0xcb, 0x7a, 0xab, 0x91, 0x7c, 0xa2, 0x8c, 0x58, 0x6a, 0x16, 0x05, 0xc3, 0x1f, 0xc7, 0xa2, 0xe0, - 0x0e, 0x8c, 0x6d, 0xf9, 0x74, 0xb3, 0xdb, 0x6e, 0xd3, 0x26, 0x4e, 0xab, 0x3c, 0x97, 0xf5, 0xbb, - 0x3e, 0xb5, 0x02, 0x84, 0xaa, 0x0d, 0x08, 0x51, 0xd5, 0x01, 0x1e, 0xed, 0x33, 0xc0, 0xb7, 0x21, - 0xbf, 0x41, 0xa9, 0x87, 0x7d, 0x3a, 0x1e, 0x89, 0x74, 0x1d, 0x4a, 0x3d, 0x8b, 0x75, 0xac, 0x66, - 0x69, 0x20, 0x10, 0x35, 0xf3, 0x84, 0x89, 0x01, 0xcd, 0x13, 0xc8, 0x8b, 0x30, 0xd1, 0xe9, 0xee, - 0x34, 0x9d, 0x3a, 0xf2, 0x15, 0x76, 0x0d, 0xe6, 0x38, 0x87, 0x31, 0xb6, 0x3e, 0xf9, 0x12, 0x4c, - 0xe2, 0x1d, 0x27, 0x9c, 0x72, 0x53, 0xda, 0xab, 0x9e, 0x56, 0xc6, 0x25, 0x9d, 0x3a, 0x03, 0x59, - 0x29, 0xe6, 0x37, 0x3a, 0xa3, 0x85, 0x1a, 0x4c, 0xe9, 0x23, 0xf9, 0x14, 0x1e, 0xf7, 0x42, 0x53, - 0x8b, 0x7c, 0x61, 0xec, 0xfe, 0x50, 0x1e, 0x0a, 0xe3, 0xdc, 0xc8, 0xc2, 0x84, 0x8d, 0xf0, 0x9b, - 0x4c, 0xf2, 0xa0, 0xbb, 0x43, 0xbd, 0x36, 0x0d, 0xa8, 0x2f, 0x2e, 0x01, 0xbe, 0x39, 0x54, 0xea, - 0x74, 0x7c, 0xe3, 0x3f, 0xcd, 0xc2, 0x68, 0x69, 0xbb, 0x56, 0x6d, 0xef, 0xba, 0xf8, 0x44, 0x17, - 0xbe, 0xcc, 0xa8, 0x4f, 0x74, 0xe1, 0xcb, 0x8c, 0xfa, 0x1e, 0x73, 0x33, 0xe5, 0x1a, 0x87, 0x56, - 0xbc, 0xca, 0x35, 0x4e, 0xbb, 0x80, 0x46, 0x8f, 0x54, 0xb9, 0x01, 0x1e, 0xa9, 0x42, 0x3d, 0xe2, - 0xd0, 0xe9, 0x7a, 0xc4, 0xb7, 0x61, 0xbc, 0xda, 0x0e, 0xe8, 0x9e, 0x17, 0xcd, 0xf4, 0xf0, 0x4a, - 0x19, 0x82, 0x55, 0xd1, 0x5e, 0xc1, 0x66, 0xd3, 0x88, 0xeb, 0x2e, 0x43, 0x9d, 0x25, 0x4e, 0x23, - 0xae, 0xe2, 0x8c, 0xe9, 0x03, 0x24, 0xa2, 0x51, 0x89, 0xcd, 0x11, 0x69, 0x08, 0xc0, 0x85, 0xcf, - 0xa9, 0x48, 0x79, 0xcf, 0x3a, 0x76, 0x69, 0x26, 0xdd, 0x10, 0xc0, 0xf8, 0x91, 0x2c, 0x8c, 0x97, - 0x3a, 0x9d, 0x67, 0xdc, 0x1c, 0xeb, 0x73, 0xda, 0xf6, 0x2a, 0xef, 0x42, 0xe1, 0x77, 0x0d, 0x64, - 0x89, 0xf5, 0x2b, 0x59, 0x98, 0x8e, 0x51, 0xa8, 0xad, 0xcf, 0x0c, 0x68, 0x84, 0x95, 0x1d, 0xd0, - 0x08, 0x2b, 0x37, 0x98, 0x11, 0xd6, 0xd0, 0xc7, 0xd9, 0x32, 0x5f, 0x85, 0x5c, 0xa9, 0xd3, 0x89, - 0x3f, 0xe6, 0x76, 0x3a, 0x8f, 0x6e, 0xf3, 0xfb, 0xac, 0xdd, 0xe9, 0x98, 0x0c, 0x43, 0xdb, 0xc7, - 0x46, 0x06, 0xdc, 0xc7, 0x8c, 0x37, 0x60, 0x0c, 0x79, 0xa1, 0xe9, 0xd3, 0x15, 0xc0, 0xc5, 0x2c, - 0xac, 0x9e, 0xb4, 0xba, 0xc4, 0x32, 0xff, 0x97, 0x19, 0x18, 0xc6, 0xdf, 0xcf, 0xe8, 0x1c, 0x5b, - 0xd4, 0xe6, 0x58, 0x41, 0x99, 0x63, 0x83, 0xcc, 0xae, 0x7f, 0x94, 0x03, 0x28, 0x3f, 0x34, 0x6b, - 0x5c, 0xed, 0x41, 0xee, 0xc2, 0xb4, 0xdd, 0x6c, 0xba, 0x87, 0xb4, 0x61, 0xb9, 0x9e, 0xb3, 0xe7, - 0xb4, 0x79, 0xcf, 0xc9, 0x17, 0x46, 0xbd, 0x48, 0x7d, 0x77, 0x10, 0x45, 0x0f, 0x79, 0x89, 0xca, - 0xa7, 0x45, 0x83, 0x7d, 0xb7, 0x21, 0x2f, 0x70, 0x1a, 0x1f, 0x51, 0x94, 0xc2, 0x67, 0x8d, 0x97, - 0xa8, 0x7c, 0xf6, 0xf1, 0x42, 0x2a, 0xe5, 0x47, 0x8d, 0x8f, 0x28, 0x4a, 0xe1, 0xc3, 0x6f, 0xb1, - 0x3e, 0x59, 0x85, 0x19, 0x84, 0x58, 0x75, 0x8f, 0x36, 0x68, 0x3b, 0x70, 0xec, 0xa6, 0x2f, 0xae, - 0xfc, 0xa8, 0x1c, 0x4a, 0x14, 0xaa, 0x57, 0x1e, 0x2c, 0x2c, 0x47, 0x65, 0xe4, 0x06, 0x8c, 0xb6, - 0xec, 0x27, 0x96, 0xbd, 0xc7, 0xdf, 0xda, 0x27, 0xf9, 0x15, 0x51, 0x80, 0xd4, 0x0d, 0xbb, 0x65, - 0x3f, 0x29, 0xed, 0x51, 0xf6, 0x15, 0xf4, 0x49, 0xc7, 0xf5, 0x95, 0xaf, 0x18, 0x89, 0xbe, 0x22, - 0x56, 0xa4, 0x7e, 0x85, 0x28, 0x12, 0x5f, 0x61, 0xfc, 0xe6, 0x08, 0x4e, 0x6d, 0xb1, 0x09, 0x08, - 0xf3, 0xb0, 0x4c, 0x8a, 0x79, 0xd8, 0x5b, 0xa0, 0x1c, 0x71, 0xaa, 0x6a, 0x4f, 0x39, 0xe0, 0xd5, - 0x6b, 0x61, 0x84, 0x4c, 0x0e, 0xe2, 0x86, 0x62, 0x39, 0x5c, 0x39, 0x2f, 0xc5, 0xe7, 0xd5, 0x53, - 0xb1, 0x11, 0x5b, 0x01, 0x52, 0x6d, 0xe3, 0x6b, 0x16, 0xad, 0x1d, 0x38, 0x9d, 0x47, 0xd4, 0x73, - 0x76, 0x8f, 0xc4, 0xb8, 0xa0, 0x10, 0xe5, 0x88, 0x52, 0xcb, 0x3f, 0x70, 0x3a, 0xec, 0xde, 0xe8, - 0xec, 0x1e, 0x99, 0x29, 0x34, 0xe4, 0x7d, 0x18, 0x35, 0xe9, 0xa1, 0xe7, 0x04, 0xd2, 0xfc, 0x61, - 0x2a, 0xd4, 0x72, 0x20, 0x94, 0x0f, 0x91, 0xc7, 0x7f, 0xa8, 0x8b, 0x55, 0x94, 0x93, 0x45, 0x7e, - 0x4a, 0x71, 0x33, 0x87, 0xc9, 0xe8, 0x6b, 0x4b, 0xdb, 0xb5, 0x5e, 0x87, 0x14, 0xb9, 0x0e, 0xc3, - 0x78, 0xd4, 0x09, 0x01, 0x0e, 0xdd, 0x06, 0x50, 0xe0, 0x51, 0xcf, 0x61, 0xc4, 0x20, 0x97, 0x01, - 0xc2, 0xe7, 0x22, 0x7f, 0x3e, 0x8f, 0xa2, 0x95, 0x02, 0x89, 0x9f, 0xd3, 0x63, 0x67, 0x3a, 0xa7, - 0x57, 0xa1, 0x60, 0x72, 0x0f, 0xa4, 0x46, 0xa9, 0x83, 0x6f, 0x12, 0xfe, 0x3c, 0xe0, 0x04, 0xbb, - 0x72, 0x72, 0x5c, 0x7c, 0x41, 0x78, 0x27, 0x35, 0x2c, 0xbb, 0xc3, 0x9f, 0x32, 0xb4, 0xd9, 0x1d, - 0xa7, 0x24, 0x6f, 0xc1, 0x10, 0xdb, 0x11, 0x84, 0x49, 0x99, 0xd4, 0xed, 0x46, 0x9b, 0x04, 0xbf, - 0x69, 0xd7, 0x5d, 0x6d, 0xaa, 0x22, 0x09, 0x59, 0x86, 0xfc, 0x66, 0x79, 0x63, 0xc3, 0xf5, 0x02, - 0x2e, 0x3e, 0x46, 0xfb, 0x11, 0x83, 0x99, 0x76, 0x7b, 0x8f, 0xf2, 0x1d, 0x3c, 0xa8, 0x77, 0xac, - 0x0e, 0x43, 0x53, 0x77, 0x70, 0x49, 0xfa, 0xc9, 0x59, 0x7b, 0xfd, 0x4a, 0x16, 0x5e, 0x0a, 0xcf, - 0xd2, 0x87, 0x5e, 0xad, 0xb4, 0xb6, 0x5a, 0x6d, 0x6c, 0x88, 0xab, 0xe7, 0x86, 0xe7, 0x3e, 0x76, - 0x1a, 0xd4, 0x7b, 0x74, 0xeb, 0x94, 0x93, 0x60, 0x95, 0xaf, 0x42, 0xae, 0xb7, 0xce, 0x6a, 0x76, - 0x31, 0x8a, 0xc8, 0x22, 0x4c, 0x77, 0x3a, 0x9d, 0x84, 0x1a, 0x7b, 0xe5, 0x39, 0x33, 0x62, 0x40, - 0xfe, 0x76, 0x06, 0xce, 0xa7, 0x37, 0x44, 0xa8, 0x23, 0x8a, 0xf2, 0xda, 0xd3, 0xa3, 0xb5, 0x4b, - 0xaf, 0x9e, 0x1c, 0x17, 0x5f, 0xf2, 0xed, 0x56, 0xd3, 0x72, 0x1a, 0xbc, 0x36, 0xa7, 0x4e, 0xad, - 0x8e, 0x40, 0xd0, 0xea, 0xed, 0x51, 0xd3, 0xe7, 0x41, 0x1e, 0x08, 0xf3, 0x99, 0x25, 0x80, 0xbc, - 0x54, 0x0d, 0x1a, 0xbf, 0x9e, 0x01, 0x65, 0x85, 0xe4, 0x4d, 0xda, 0x70, 0x3c, 0x5a, 0x0f, 0xc4, - 0xa1, 0x20, 0xbc, 0x7a, 0x38, 0x2c, 0x66, 0x06, 0x85, 0x30, 0xf2, 0x1e, 0x8c, 0x8a, 0xcd, 0x0b, - 0xf7, 0xff, 0x68, 0x65, 0x09, 0xa5, 0x23, 0x77, 0xff, 0x4a, 0x6c, 0x7c, 0x92, 0x88, 0x5d, 0xae, - 0xee, 0x6f, 0x6f, 0x96, 0x9b, 0xb6, 0xd3, 0xf2, 0xc5, 0x21, 0x8a, 0xdd, 0xfa, 0xe1, 0x61, 0x60, - 0xd5, 0x11, 0xaa, 0x5e, 0xae, 0x42, 0x54, 0xe3, 0x9e, 0xd4, 0x79, 0x9e, 0x62, 0xcb, 0x57, 0x84, - 0xe1, 0x47, 0x91, 0xee, 0x63, 0x69, 0xec, 0xe4, 0xb8, 0xc8, 0xa7, 0x8b, 0xc9, 0xe1, 0xc6, 0x97, - 0x61, 0x2c, 0x9c, 0xba, 0x8c, 0x17, 0xfb, 0x81, 0xbc, 0x26, 0x39, 0x2f, 0x36, 0x89, 0x4d, 0x84, - 0x32, 0x01, 0x61, 0xb9, 0xdd, 0x40, 0x84, 0x2c, 0x22, 0x60, 0xf7, 0xd0, 0x76, 0x03, 0x67, 0xba, - 0xfa, 0x75, 0x02, 0xcd, 0xf8, 0xb1, 0x0c, 0x4c, 0xe9, 0x93, 0x95, 0xdc, 0x80, 0x11, 0xe1, 0xae, - 0x93, 0x41, 0x05, 0x12, 0xe3, 0x31, 0xc2, 0x1d, 0x75, 0x34, 0xf7, 0x1c, 0x81, 0xc5, 0x64, 0x0c, - 0xc1, 0x41, 0x1c, 0xb0, 0x28, 0x63, 0xd4, 0x39, 0xc8, 0x94, 0x65, 0xc4, 0x60, 0x17, 0x0c, 0xbf, - 0xdb, 0x0c, 0xd4, 0x77, 0x05, 0x0f, 0x21, 0xa6, 0x28, 0x31, 0xca, 0x30, 0xc2, 0xf7, 0xbb, 0x98, - 0x81, 0x52, 0xe6, 0x0c, 0x06, 0x4a, 0xc6, 0x71, 0x06, 0xa0, 0x56, 0x5b, 0x79, 0x40, 0x8f, 0x36, - 0x6c, 0xc7, 0xc3, 0x87, 0x30, 0x3c, 0x5b, 0x1e, 0x88, 0x95, 0x3b, 0x21, 0x1e, 0xc2, 0xf8, 0x39, - 0x74, 0x40, 0x8f, 0xb4, 0x87, 0x30, 0x89, 0x8a, 0x07, 0x98, 0xe7, 0x3c, 0xb6, 0x03, 0xca, 0x08, - 0xb3, 0x48, 0xc8, 0x0f, 0x30, 0x0e, 0x8d, 0x51, 0x2a, 0xc8, 0xe4, 0xab, 0x30, 0x15, 0xfd, 0x0a, - 0x9f, 0xf3, 0xa6, 0xc2, 0xdd, 0x41, 0x2f, 0x5c, 0xba, 0x7c, 0x72, 0x5c, 0x5c, 0x50, 0xb8, 0xc6, - 0x1f, 0xfa, 0x62, 0xcc, 0x8c, 0x5f, 0xca, 0xe0, 0x23, 0xb6, 0xfc, 0xc0, 0xab, 0x30, 0x14, 0x9a, - 0x5d, 0x4e, 0x88, 0x9d, 0x51, 0x7f, 0xb2, 0xc0, 0x72, 0xf2, 0x12, 0xe4, 0xa2, 0x2f, 0xc1, 0xf3, - 0x44, 0xff, 0x02, 0x56, 0x4a, 0xee, 0xc1, 0xe8, 0x40, 0x6d, 0xc6, 0x89, 0x95, 0xd2, 0x56, 0x49, - 0x8d, 0xa3, 0x70, 0x7f, 0x7b, 0xf3, 0x7b, 0x77, 0x14, 0x7e, 0x32, 0x0b, 0xd3, 0xac, 0x5f, 0x4b, - 0xdd, 0x60, 0xdf, 0xf5, 0x9c, 0xe0, 0xe8, 0x99, 0xd5, 0xc0, 0xbd, 0xa3, 0x89, 0xef, 0x0b, 0xf2, - 0x08, 0x53, 0xbf, 0x6d, 0x20, 0x45, 0xdc, 0x7f, 0x3b, 0x0c, 0xb3, 0x29, 0x54, 0xe4, 0x75, 0x4d, - 0x49, 0x3e, 0x2f, 0xdd, 0x71, 0xbf, 0x7b, 0x5c, 0x9c, 0x90, 0xe8, 0x9b, 0x91, 0x7b, 0xee, 0xa2, - 0x6e, 0x11, 0xc2, 0x7b, 0x0a, 0x75, 0xe6, 0xaa, 0x45, 0x88, 0x6e, 0x07, 0x72, 0x1d, 0x86, 0x4d, - 0xb7, 0x49, 0xa5, 0x15, 0x14, 0x4a, 0x41, 0x1e, 0x03, 0x68, 0xaf, 0xbe, 0x0c, 0x40, 0x56, 0x60, - 0x94, 0xfd, 0xb1, 0x66, 0x77, 0xc4, 0x7b, 0x06, 0x09, 0x2f, 0x90, 0x08, 0xed, 0x38, 0xed, 0x3d, - 0xf5, 0x0e, 0xd9, 0xa4, 0x56, 0xcb, 0xee, 0x68, 0xe2, 0x1a, 0x47, 0xd4, 0xee, 0xa2, 0xf9, 0xde, - 0x77, 0xd1, 0xcc, 0xa9, 0x77, 0xd1, 0x5d, 0x80, 0x9a, 0xb3, 0xd7, 0x76, 0xda, 0x7b, 0xa5, 0xe6, - 0x9e, 0x70, 0x6a, 0xbe, 0xde, 0x7b, 0x14, 0x6e, 0x44, 0xc8, 0x38, 0x71, 0x9f, 0xc7, 0x47, 0x47, - 0x0e, 0xb3, 0xec, 0xe6, 0x9e, 0xe6, 0x7c, 0xa1, 0x70, 0x26, 0xeb, 0x00, 0xa5, 0x7a, 0xe0, 0x3c, - 0x66, 0x53, 0xd8, 0x17, 0xb2, 0x95, 0x6c, 0x72, 0xb9, 0xf4, 0x80, 0x1e, 0xd5, 0x68, 0x10, 0x3d, - 0xdf, 0xd8, 0x88, 0xca, 0x56, 0x82, 0x66, 0x59, 0x1f, 0x71, 0x20, 0x1d, 0x38, 0x57, 0x6a, 0x34, - 0x1c, 0xf6, 0x0d, 0x76, 0x73, 0x93, 0xbb, 0xa3, 0x23, 0xeb, 0x89, 0x74, 0xd6, 0xd7, 0x05, 0xeb, - 0x17, 0xed, 0x90, 0xca, 0x92, 0x5e, 0xec, 0xb1, 0x6a, 0xd2, 0x19, 0x1b, 0x35, 0x98, 0xd2, 0x3f, - 0x5e, 0x77, 0xc6, 0x9e, 0x80, 0xbc, 0x59, 0x2b, 0x59, 0xb5, 0x95, 0xd2, 0xad, 0x42, 0x86, 0x14, - 0x60, 0x42, 0xfc, 0x5a, 0xb4, 0x16, 0xdf, 0xbc, 0x53, 0xc8, 0x6a, 0x90, 0x37, 0x6f, 0x2d, 0x16, - 0x72, 0x0b, 0xd9, 0xf9, 0x4c, 0xcc, 0x0f, 0x6a, 0xb4, 0x90, 0xe7, 0x8a, 0x3a, 0xe3, 0x57, 0x33, - 0x90, 0x97, 0x6d, 0x27, 0x77, 0x20, 0x57, 0xab, 0xad, 0xc4, 0x3c, 0x97, 0xa2, 0x53, 0x86, 0xef, - 0xa7, 0xbe, 0xaf, 0x9a, 0xa7, 0x32, 0x02, 0x46, 0xb7, 0xb9, 0x5a, 0x13, 0x92, 0x87, 0xa4, 0x8b, - 0x36, 0x6f, 0x4e, 0x97, 0xe2, 0xce, 0x71, 0x07, 0x72, 0xf7, 0xb7, 0x37, 0xc5, 0xcd, 0x47, 0xd2, - 0x45, 0xfb, 0x29, 0xa7, 0xfb, 0xf0, 0x50, 0xdd, 0xe5, 0x19, 0x81, 0x61, 0xc2, 0xb8, 0x32, 0x91, - 0xf9, 0xa1, 0xdb, 0x72, 0x43, 0x0f, 0x64, 0x71, 0xe8, 0x32, 0x88, 0x29, 0x4a, 0x98, 0x00, 0xb2, - 0xea, 0xd6, 0xed, 0xa6, 0x38, 0xbd, 0x51, 0x00, 0x69, 0x32, 0x80, 0xc9, 0xe1, 0xc6, 0x6f, 0x67, - 0xa0, 0x80, 0x62, 0x1a, 0x9a, 0x97, 0xba, 0x07, 0xb4, 0xfd, 0xe8, 0x16, 0x79, 0x43, 0x2e, 0xb9, - 0x4c, 0xa8, 0x14, 0x19, 0xc6, 0x25, 0x17, 0x7b, 0x55, 0x11, 0xcb, 0x4e, 0x71, 0xf2, 0xce, 0x0e, - 0xee, 0x1c, 0x7a, 0x8a, 0x93, 0x77, 0x11, 0x86, 0xb1, 0x39, 0x62, 0x73, 0xc4, 0x96, 0x07, 0x0c, - 0x60, 0x72, 0xb8, 0xb2, 0x37, 0xfd, 0x74, 0x36, 0xf1, 0x0d, 0x8b, 0xdf, 0x53, 0x0e, 0x96, 0xfa, - 0xc7, 0x0d, 0xb4, 0x5f, 0x7f, 0x00, 0x73, 0xf1, 0x2e, 0x41, 0x85, 0x55, 0x09, 0xa6, 0x75, 0xb8, - 0xd4, 0x5d, 0x5d, 0x48, 0xad, 0xeb, 0xd1, 0xa2, 0x19, 0xc7, 0x37, 0xfe, 0xf7, 0x0c, 0x8c, 0xe1, - 0x9f, 0x66, 0xb7, 0x89, 0x66, 0x3e, 0xa5, 0xed, 0x9a, 0x50, 0x4e, 0xab, 0xc2, 0x9c, 0x7d, 0xe8, - 0x5b, 0x42, 0x7f, 0xad, 0xed, 0x31, 0x21, 0xb2, 0x20, 0xe5, 0x5a, 0x67, 0xa9, 0xc0, 0x09, 0x49, - 0xb9, 0x7a, 0xda, 0x8f, 0x91, 0x0a, 0x64, 0x34, 0x0e, 0xdc, 0xae, 0xb1, 0xe9, 0xa7, 0xbe, 0xbb, - 0x23, 0x9d, 0xdb, 0xd4, 0x8d, 0x03, 0x39, 0x1a, 0x3e, 0xbb, 0x6f, 0xd7, 0x4a, 0xe6, 0xba, 0xf6, - 0xec, 0xce, 0xda, 0xa8, 0xd9, 0xb2, 0x0b, 0x24, 0xe3, 0xe7, 0xc7, 0xe3, 0x1d, 0x28, 0x0e, 0xbc, - 0x33, 0xae, 0x8d, 0xb7, 0x61, 0xb8, 0xd4, 0x6c, 0xba, 0x87, 0x62, 0x97, 0x90, 0xf7, 0xd5, 0xb0, - 0xff, 0xf8, 0x79, 0x86, 0x2a, 0x20, 0xcd, 0x69, 0x8c, 0x01, 0x48, 0x19, 0xc6, 0x4a, 0xdb, 0xb5, - 0x6a, 0xb5, 0xb2, 0xb9, 0xc9, 0x1d, 0x64, 0x72, 0x4b, 0xaf, 0xc8, 0xfe, 0x71, 0x9c, 0x86, 0x15, - 0x7f, 0xf9, 0x8d, 0xe4, 0xf7, 0x88, 0x8e, 0xbc, 0x0b, 0x70, 0xdf, 0x75, 0xda, 0x5c, 0xe5, 0x25, - 0x3e, 0xfe, 0xd2, 0xc9, 0x71, 0x71, 0xfc, 0x43, 0xd7, 0x69, 0x0b, 0x1d, 0x19, 0x6b, 0x7b, 0x84, - 0x64, 0x2a, 0x7f, 0xb3, 0x9e, 0x5e, 0x72, 0xb9, 0xe9, 0xce, 0x70, 0xd4, 0xd3, 0x3b, 0x6e, 0xc2, - 0x6a, 0x47, 0xa2, 0x91, 0x16, 0x4c, 0xd7, 0xba, 0x7b, 0x7b, 0x94, 0xed, 0xec, 0x42, 0xc9, 0x33, - 0x22, 0x2e, 0xd0, 0x61, 0x58, 0x12, 0x7e, 0x1f, 0x61, 0x57, 0x20, 0x7f, 0xe9, 0x75, 0x36, 0x91, - 0xbf, 0x73, 0x5c, 0x14, 0x2f, 0xca, 0x4c, 0x54, 0xf3, 0x25, 0x7d, 0x52, 0xc5, 0x13, 0xe7, 0x4d, - 0x1e, 0xc2, 0xc8, 0x3d, 0x27, 0x58, 0xe9, 0xee, 0x08, 0x87, 0x8f, 0x17, 0xfb, 0x2c, 0x1a, 0x8e, - 0xc8, 0x9f, 0x34, 0xf6, 0x9c, 0x60, 0xbf, 0xab, 0x9a, 0xdc, 0x0b, 0x36, 0x64, 0x1b, 0xf2, 0x65, - 0xc7, 0xab, 0x37, 0x69, 0xb9, 0x2a, 0xce, 0xfe, 0x97, 0xfa, 0xb0, 0x94, 0xa8, 0xbc, 0x5f, 0xea, - 0xf8, 0xab, 0xee, 0xa8, 0xb2, 0x80, 0xc4, 0x20, 0xff, 0x76, 0x06, 0x9e, 0x0f, 0x5b, 0x5f, 0xda, - 0xa3, 0xed, 0x60, 0xcd, 0x0e, 0xea, 0xfb, 0xd4, 0x13, 0xbd, 0x34, 0xd6, 0xaf, 0x97, 0x3e, 0x9f, - 0xe8, 0xa5, 0x6b, 0x51, 0x2f, 0xd9, 0x8c, 0x99, 0xd5, 0xe2, 0xdc, 0x92, 0x7d, 0xd6, 0xaf, 0x56, - 0x62, 0x01, 0x44, 0x6f, 0x54, 0xc2, 0x61, 0xf0, 0x95, 0x3e, 0x1f, 0x1c, 0x21, 0x0b, 0x43, 0xff, - 0xf0, 0xb7, 0x66, 0xa9, 0x16, 0x42, 0xc9, 0x03, 0xe9, 0x5d, 0xc5, 0xa5, 0x92, 0x2b, 0x7d, 0x78, - 0x73, 0x8f, 0xab, 0xd9, 0x3e, 0x7e, 0x94, 0x7c, 0xb4, 0x57, 0xed, 0x1d, 0x21, 0x88, 0x9c, 0x32, - 0xda, 0xab, 0x76, 0x34, 0xda, 0x4d, 0x3b, 0x3e, 0xda, 0xab, 0xf6, 0x0e, 0x29, 0x73, 0x97, 0x50, - 0xee, 0x3f, 0x78, 0xb9, 0x1f, 0xb7, 0xf2, 0x06, 0x3f, 0x99, 0x53, 0x5c, 0x43, 0xbf, 0x0c, 0x63, - 0xb5, 0x8e, 0x5d, 0xa7, 0x4d, 0x67, 0x37, 0x10, 0x8f, 0x96, 0x2f, 0xf7, 0x61, 0x15, 0xe2, 0x8a, - 0x07, 0x2f, 0xf9, 0x53, 0xbd, 0x26, 0x85, 0x38, 0xac, 0x85, 0x9b, 0x1b, 0x6b, 0xf3, 0xd3, 0xa7, - 0xb6, 0x70, 0x73, 0x63, 0x4d, 0xc8, 0x1c, 0x9d, 0x96, 0x26, 0x73, 0x6c, 0xac, 0x91, 0x0e, 0x4c, - 0x6d, 0x52, 0xcf, 0xb3, 0x77, 0x5d, 0xaf, 0xc5, 0x95, 0x8a, 0xdc, 0x27, 0xe5, 0x7a, 0x3f, 0x7e, - 0x1a, 0x01, 0xd7, 0x26, 0x07, 0x12, 0x66, 0xc5, 0x35, 0x91, 0x31, 0xfe, 0xac, 0x4f, 0x96, 0x9c, - 0x60, 0xa7, 0x5b, 0x3f, 0xa0, 0xc1, 0xfc, 0xcc, 0xa9, 0x7d, 0x12, 0xe2, 0xf2, 0x3e, 0xd9, 0x91, - 0x3f, 0xd5, 0x3e, 0x09, 0x71, 0x8c, 0xdf, 0xc8, 0xc1, 0x85, 0x1e, 0x5d, 0x40, 0xd6, 0xe5, 0x96, - 0x9b, 0xd1, 0x54, 0xcb, 0x3d, 0xd0, 0x6f, 0x9c, 0xba, 0x0b, 0xaf, 0x42, 0x61, 0xf9, 0x01, 0xca, - 0xea, 0x5c, 0xe9, 0x5f, 0x2e, 0xc9, 0xc3, 0x0a, 0xd5, 0x9f, 0xf4, 0x00, 0x6d, 0xf8, 0xe4, 0x63, - 0x41, 0x5d, 0x73, 0x56, 0x4d, 0x50, 0x2e, 0xfc, 0x40, 0x16, 0x86, 0xf0, 0xe0, 0x8c, 0x85, 0xe8, - 0xc9, 0x9c, 0x29, 0x44, 0xcf, 0x17, 0x60, 0x62, 0xf9, 0x01, 0xbf, 0x49, 0xaf, 0xd8, 0xfe, 0xbe, - 0xd8, 0xd6, 0xf1, 0x49, 0x9c, 0x1e, 0x58, 0xe2, 0xe2, 0xbd, 0x6f, 0x6b, 0x32, 0xab, 0x46, 0x41, - 0xb6, 0x60, 0x96, 0xb7, 0xcd, 0xd9, 0x75, 0xea, 0x3c, 0xd2, 0x87, 0x63, 0x37, 0xc5, 0x1e, 0xff, - 0xd2, 0xc9, 0x71, 0xb1, 0x48, 0x0f, 0xd0, 0x3a, 0x51, 0x94, 0x5b, 0x3e, 0x22, 0xa8, 0x66, 0x8a, - 0x29, 0xf4, 0x6a, 0xf8, 0x01, 0x73, 0x0c, 0x2b, 0x64, 0xb5, 0xb1, 0xba, 0x19, 0x2e, 0x47, 0x32, - 0xfe, 0x6c, 0x18, 0x16, 0x7a, 0x6f, 0xcf, 0xe4, 0x8b, 0xfa, 0x00, 0x5e, 0x3d, 0x75, 0x43, 0x3f, - 0x7d, 0x0c, 0xbf, 0x04, 0x73, 0xcb, 0xed, 0x80, 0x7a, 0x1d, 0xcf, 0x91, 0x01, 0x27, 0x56, 0x5c, - 0x5f, 0x5a, 0x83, 0xa2, 0x59, 0x26, 0x0d, 0xcb, 0x85, 0x46, 0x15, 0x6d, 0x53, 0x15, 0x56, 0xa9, - 0x1c, 0xc8, 0x32, 0x4c, 0x29, 0xf0, 0x66, 0x77, 0x4f, 0x08, 0x24, 0xfc, 0xed, 0x45, 0xe1, 0xd9, - 0xec, 0xaa, 0xa6, 0x72, 0x31, 0x22, 0xb4, 0x38, 0x65, 0x57, 0xc6, 0xfa, 0xfd, 0xed, 0x07, 0x35, - 0x31, 0x9c, 0xdc, 0xe2, 0x14, 0xa1, 0xd6, 0x87, 0x87, 0x07, 0xda, 0xfe, 0x1a, 0x21, 0x2f, 0xfc, - 0x52, 0x4e, 0xcc, 0xa8, 0x97, 0x20, 0x57, 0xeb, 0xee, 0x88, 0x99, 0xc4, 0x2f, 0x2d, 0xda, 0x01, - 0xc7, 0x4a, 0xc9, 0xe7, 0x00, 0x4c, 0xda, 0x71, 0x7d, 0x27, 0x70, 0xbd, 0x23, 0xd5, 0xe5, 0xc9, - 0x0b, 0xa1, 0xba, 0x55, 0xb6, 0x84, 0x92, 0x15, 0x98, 0x8e, 0x7e, 0x3d, 0x3c, 0x6c, 0x0b, 0x0d, - 0xf2, 0x18, 0xd7, 0xae, 0x44, 0xe4, 0x96, 0xcb, 0xca, 0xd4, 0x23, 0x3b, 0x46, 0x46, 0x16, 0x21, - 0xbf, 0xed, 0x7a, 0x07, 0xbb, 0x6c, 0x8c, 0x87, 0x22, 0xa1, 0xe2, 0x50, 0xc0, 0xd4, 0xc3, 0x53, - 0xe2, 0xb1, 0xe5, 0xb2, 0xdc, 0x7e, 0xec, 0x78, 0x6e, 0xbb, 0x45, 0xdb, 0x81, 0x6a, 0x69, 0x40, - 0x23, 0xb0, 0xe6, 0x6c, 0x1a, 0x81, 0xc9, 0x75, 0x18, 0x2e, 0xd5, 0x03, 0xd7, 0x13, 0x66, 0x06, - 0x7c, 0xa6, 0x30, 0x80, 0x36, 0x53, 0x18, 0x80, 0x75, 0xa2, 0x49, 0x77, 0xc5, 0x93, 0x0b, 0x76, - 0xa2, 0x47, 0x77, 0x35, 0x4f, 0x5a, 0xba, 0xcb, 0x84, 0x22, 0x93, 0xee, 0xa2, 0xe2, 0x43, 0x0b, - 0x40, 0xb5, 0x9b, 0x50, 0x99, 0x09, 0x34, 0xe3, 0xf7, 0xc6, 0x7a, 0x4e, 0x79, 0x76, 0x0a, 0x9d, - 0x6d, 0xca, 0xaf, 0xda, 0x03, 0x4c, 0xf9, 0xd7, 0x43, 0x5b, 0x6f, 0xd5, 0x7d, 0x1c, 0x21, 0xea, - 0x31, 0xc8, 0x71, 0x16, 0x7e, 0x39, 0x7f, 0x96, 0x49, 0x24, 0x3a, 0x29, 0x3b, 0x68, 0x27, 0xe5, - 0x06, 0xea, 0x24, 0xb2, 0x04, 0x93, 0x61, 0x08, 0xb3, 0x0d, 0x3b, 0xd0, 0xb6, 0xb5, 0x30, 0xee, - 0x9c, 0xd5, 0xb1, 0x03, 0x75, 0x5b, 0xd3, 0x49, 0xc8, 0x3b, 0x30, 0x2e, 0x1c, 0x1e, 0x90, 0xc3, - 0x70, 0x64, 0x72, 0x2a, 0xbd, 0x23, 0x62, 0xf4, 0x2a, 0x3a, 0x5b, 0xcd, 0x1b, 0x4e, 0x87, 0x36, - 0x9d, 0x36, 0xad, 0xe1, 0x13, 0x85, 0x98, 0x31, 0xb8, 0x9a, 0x3b, 0xa2, 0xc4, 0xe2, 0xaf, 0x17, - 0x9a, 0xfe, 0x50, 0x23, 0x8a, 0x4f, 0xd6, 0xd1, 0x33, 0x4d, 0x56, 0x6e, 0xf1, 0xe5, 0xad, 0xba, - 0x7b, 0x8e, 0xb4, 0x71, 0x95, 0x16, 0x5f, 0x9e, 0xd5, 0x64, 0xd0, 0x98, 0xc5, 0x17, 0x47, 0x65, - 0x37, 0x1c, 0xf6, 0xa3, 0x5a, 0x11, 0xcf, 0x7b, 0x78, 0xc3, 0x41, 0x22, 0xdd, 0xb0, 0x98, 0x23, - 0xc9, 0x6a, 0x96, 0x5b, 0xb6, 0xd3, 0x14, 0x5e, 0xc2, 0x51, 0x35, 0x94, 0x41, 0xe3, 0xd5, 0x20, - 0x2a, 0xa9, 0xc3, 0x84, 0x49, 0x77, 0x37, 0x3c, 0x37, 0xa0, 0xf5, 0x80, 0x36, 0x84, 0x54, 0x27, - 0x2f, 0x36, 0x4b, 0xae, 0xcb, 0x25, 0xd6, 0xa5, 0x37, 0x7e, 0xef, 0xb8, 0x98, 0xf9, 0xce, 0x71, - 0x11, 0x18, 0x88, 0x5b, 0xad, 0x9f, 0x1c, 0x17, 0x2f, 0xb0, 0xf1, 0xef, 0x48, 0x62, 0xf5, 0x74, - 0x52, 0x99, 0x92, 0x6f, 0xb1, 0xfd, 0x3a, 0xec, 0x92, 0xa8, 0xb2, 0x89, 0x1e, 0x95, 0xbd, 0x99, - 0x5a, 0x59, 0x51, 0xe9, 0xed, 0xd4, 0x4a, 0x53, 0x2b, 0x21, 0xef, 0xc2, 0x78, 0xb9, 0x5a, 0x76, - 0xdb, 0xbb, 0xce, 0x5e, 0x6d, 0xa5, 0x84, 0xa2, 0xa1, 0xf0, 0x58, 0xa8, 0x3b, 0x56, 0x1d, 0xe1, - 0x96, 0xbf, 0x6f, 0x6b, 0x8e, 0x6b, 0x11, 0x3e, 0xb9, 0x07, 0x53, 0xf2, 0xa7, 0x49, 0x77, 0xb7, - 0xcc, 0x2a, 0x4a, 0x84, 0xd2, 0x4d, 0x24, 0xe4, 0xc0, 0x3a, 0xa2, 0xeb, 0xa9, 0x37, 0x85, 0x18, - 0x19, 0x9b, 0x8c, 0x15, 0xda, 0x69, 0xba, 0x47, 0xac, 0x79, 0x9b, 0x0e, 0xf5, 0x50, 0x06, 0x14, - 0x93, 0xb1, 0x11, 0x96, 0x58, 0x81, 0xa3, 0x6d, 0xb7, 0x31, 0x22, 0xb2, 0x0e, 0x33, 0x62, 0x8a, - 0x3f, 0x72, 0x7c, 0x67, 0xc7, 0x69, 0x3a, 0xc1, 0x11, 0x4a, 0x7f, 0x42, 0x80, 0x91, 0xeb, 0xe2, - 0x71, 0x58, 0xaa, 0x30, 0x4b, 0x92, 0x1a, 0xbf, 0x9a, 0x85, 0x17, 0xfa, 0xdd, 0x84, 0x48, 0x4d, - 0xdf, 0xcc, 0xae, 0x0d, 0x70, 0x7b, 0x3a, 0x7d, 0x3b, 0x5b, 0x86, 0xa9, 0x87, 0xde, 0x9e, 0xdd, - 0x76, 0xbe, 0x89, 0x37, 0xdc, 0xd0, 0xf0, 0x0d, 0x3b, 0xc3, 0x55, 0x4a, 0xf4, 0xd9, 0x1e, 0x23, - 0x5a, 0x78, 0x2c, 0xb6, 0xb9, 0x8f, 0xea, 0x42, 0x75, 0x07, 0xc6, 0xca, 0x6e, 0x3b, 0xa0, 0x4f, - 0x82, 0x98, 0xc3, 0x30, 0x07, 0xc6, 0xdd, 0xc7, 0x24, 0xaa, 0xf1, 0xaf, 0xb3, 0x70, 0xa9, 0xef, - 0x55, 0x80, 0x6c, 0xea, 0xbd, 0x76, 0x7d, 0x90, 0xfb, 0xc3, 0xe9, 0xdd, 0xb6, 0x98, 0xb0, 0xd1, - 0x3a, 0xd5, 0x43, 0x61, 0xe1, 0xbf, 0xcf, 0x88, 0x4e, 0xfa, 0x34, 0x8c, 0x62, 0x55, 0x61, 0x17, - 0x71, 0x2d, 0x19, 0xee, 0xc2, 0x8e, 0xae, 0x25, 0xe3, 0x68, 0xe4, 0x36, 0xe4, 0xcb, 0x76, 0xb3, - 0xa9, 0xb8, 0x53, 0xa3, 0x34, 0x5f, 0x47, 0x58, 0xcc, 0xa4, 0x4f, 0x22, 0x32, 0xd9, 0x87, 0xff, - 0xad, 0x9c, 0x15, 0xb8, 0x59, 0x0a, 0xb2, 0xd8, 0x71, 0xa1, 0x20, 0x63, 0x10, 0xc6, 0xba, 0x1b, - 0x3a, 0x6c, 0xf2, 0x20, 0x8c, 0x0c, 0xa0, 0x05, 0x61, 0x64, 0x00, 0xe3, 0xd7, 0x72, 0x70, 0xb9, - 0xff, 0x7d, 0x96, 0x6c, 0xe9, 0x43, 0xf0, 0xda, 0x40, 0xb7, 0xe0, 0xd3, 0xc7, 0x40, 0x86, 0x34, - 0xe5, 0x1d, 0x72, 0x2d, 0xe9, 0x48, 0xf0, 0xdd, 0xe3, 0xa2, 0x62, 0x27, 0x7a, 0xdf, 0x75, 0xda, - 0xca, 0x9b, 0xc9, 0x37, 0x34, 0xc9, 0x90, 0xbf, 0xd9, 0xdf, 0x19, 0xac, 0x65, 0x11, 0x1d, 0xdf, - 0x57, 0x06, 0x95, 0x28, 0x3f, 0x0f, 0x85, 0x38, 0x29, 0xb9, 0x0a, 0x43, 0xd8, 0x00, 0xc5, 0x1b, - 0x22, 0xc6, 0x01, 0xcb, 0x17, 0xd6, 0xc4, 0xdc, 0x41, 0x0f, 0x73, 0xb4, 0x02, 0xd0, 0x75, 0x83, - 0xc2, 0xc3, 0x9c, 0x1b, 0x11, 0x24, 0xf5, 0x83, 0x31, 0x22, 0xe3, 0x2f, 0x32, 0x70, 0xb1, 0xa7, - 0xa6, 0x80, 0x6c, 0xe8, 0x03, 0xf6, 0xca, 0x69, 0xaa, 0x85, 0x53, 0xc7, 0x6a, 0xe1, 0xc7, 0xe5, - 0xdc, 0x7f, 0x0f, 0x26, 0x6a, 0xdd, 0x9d, 0xf8, 0xfd, 0x8c, 0xc7, 0x7f, 0x50, 0xe0, 0xea, 0x09, - 0xa6, 0xe2, 0xb3, 0xef, 0x97, 0x66, 0x0e, 0xc2, 0x2a, 0x47, 0xb1, 0x50, 0x0b, 0x5d, 0x20, 0x93, - 0x1e, 0xf6, 0x3a, 0x91, 0xf1, 0x2b, 0xd9, 0xf4, 0x8b, 0xee, 0xbd, 0xf2, 0xc6, 0x59, 0x2e, 0xba, - 0xf7, 0xca, 0x1b, 0xa7, 0x7f, 0xfb, 0x3f, 0x95, 0xdf, 0x8e, 0x0f, 0xb3, 0x62, 0xc7, 0x93, 0x8a, - 0x4e, 0xf1, 0x30, 0x2b, 0x77, 0x47, 0x5f, 0x7f, 0x98, 0x95, 0xc8, 0xe4, 0x4d, 0x18, 0x5b, 0x75, - 0xb9, 0xf3, 0xbb, 0xfc, 0x62, 0xee, 0x23, 0x28, 0x81, 0xea, 0xf6, 0x18, 0x62, 0xb2, 0xbb, 0x85, - 0x3e, 0xf0, 0xd2, 0x10, 0x0f, 0xef, 0x16, 0xb1, 0xe9, 0xa2, 0xab, 0x03, 0x75, 0x32, 0xe3, 0x3f, - 0x19, 0x06, 0xe3, 0x74, 0x65, 0x06, 0xf9, 0x40, 0xef, 0xbb, 0x1b, 0x03, 0xab, 0x41, 0x06, 0xda, - 0x72, 0x4b, 0xdd, 0x86, 0x43, 0xdb, 0x75, 0xdd, 0x73, 0x5d, 0xc0, 0xd4, 0x2d, 0x50, 0xe2, 0x7d, - 0x14, 0x47, 0xb2, 0x85, 0xff, 0x3a, 0x17, 0x2d, 0xb5, 0xd8, 0xd1, 0x98, 0xf9, 0x08, 0x47, 0x23, - 0x79, 0x00, 0x05, 0x15, 0xa2, 0xbc, 0xd0, 0xa2, 0xe4, 0xa2, 0x31, 0x8a, 0x35, 0x2a, 0x41, 0xa8, - 0x9f, 0xaf, 0xb9, 0xc1, 0xcf, 0xd7, 0x48, 0x7c, 0xc7, 0xfa, 0x87, 0x92, 0xe2, 0x7b, 0xdc, 0x59, - 0x54, 0x41, 0x97, 0x9e, 0xee, 0xbe, 0x38, 0xb4, 0x86, 0x75, 0x4f, 0xf7, 0x94, 0x83, 0x4b, 0x45, - 0x97, 0xce, 0xfa, 0xf8, 0x53, 0xf1, 0x55, 0x0d, 0x9d, 0xf5, 0x39, 0x7d, 0x9a, 0xb3, 0x7e, 0x48, - 0xc2, 0x0e, 0x40, 0xb3, 0xdb, 0xe6, 0xd1, 0x7e, 0x47, 0xa3, 0x03, 0xd0, 0xeb, 0xb6, 0xad, 0x78, - 0xc4, 0xdf, 0x10, 0xd1, 0xf8, 0x27, 0x43, 0xe9, 0xc2, 0x41, 0xa8, 0xef, 0x3a, 0x8b, 0x70, 0x10, - 0x12, 0x7d, 0x32, 0x33, 0x75, 0x0b, 0x66, 0xab, 0x68, 0xa9, 0x1a, 0x1c, 0x49, 0xf3, 0xae, 0x2d, - 0x73, 0x55, 0x0c, 0x31, 0xea, 0x8d, 0x1c, 0x51, 0x1c, 0x9a, 0x88, 0x59, 0x5d, 0x4f, 0xd3, 0x1b, - 0xa5, 0xd0, 0x2f, 0xfc, 0xba, 0x54, 0x8b, 0xa9, 0x83, 0xb0, 0xb5, 0x15, 0xce, 0xe5, 0xd8, 0x20, - 0x74, 0xbb, 0xda, 0x30, 0xea, 0x24, 0x7c, 0xef, 0x95, 0x2a, 0x07, 0x64, 0xa2, 0xc8, 0x8a, 0x8a, - 0xa2, 0x22, 0xc6, 0x25, 0x46, 0x44, 0xf6, 0xe0, 0x62, 0x24, 0x4a, 0x2b, 0x37, 0x05, 0xe4, 0xc8, - 0x3f, 0xf8, 0xfa, 0xc9, 0x71, 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, 0x84, - 0xbb, 0x71, 0x84, 0x6c, 0xfc, 0x78, 0x16, 0xa6, 0xf8, 0x59, 0xcd, 0x5f, 0xe7, 0x9e, 0xd9, 0x97, - 0xcf, 0xb7, 0xb5, 0x97, 0x4f, 0x19, 0x19, 0x4b, 0xfd, 0xb4, 0x81, 0xde, 0x3d, 0xf7, 0x81, 0x24, - 0x69, 0x88, 0x09, 0x13, 0x2a, 0xb4, 0xff, 0x93, 0xe7, 0xad, 0x28, 0x88, 0x9a, 0x10, 0x95, 0xf0, - 0xdd, 0xd9, 0x37, 0x35, 0x1e, 0xc6, 0x8f, 0x65, 0x61, 0x52, 0xb1, 0x53, 0x79, 0x66, 0x3b, 0xfe, - 0xf3, 0x5a, 0xc7, 0xcf, 0x87, 0xbe, 0x56, 0xe1, 0x97, 0x0d, 0xd4, 0xef, 0x5d, 0x98, 0x49, 0x90, - 0xc4, 0xcd, 0x7d, 0x32, 0x83, 0x98, 0xfb, 0xbc, 0x9e, 0x8c, 0xc8, 0xc4, 0x03, 0x9b, 0x87, 0xf1, - 0x39, 0xd4, 0x10, 0x50, 0x3f, 0x99, 0x85, 0x39, 0xf1, 0x0b, 0x43, 0x18, 0x72, 0x61, 0xf5, 0x99, - 0x1d, 0x8b, 0x92, 0x36, 0x16, 0x45, 0x7d, 0x2c, 0x94, 0x0f, 0xec, 0x3d, 0x24, 0xc6, 0x0f, 0x01, - 0xcc, 0xf7, 0x22, 0x18, 0xd8, 0xa5, 0x39, 0x72, 0x18, 0xcb, 0x0e, 0xe0, 0x30, 0xb6, 0x0a, 0x05, - 0xac, 0x4a, 0x04, 0x29, 0xf3, 0xb7, 0xcc, 0xaa, 0xe8, 0x24, 0xd4, 0x2f, 0xf0, 0x38, 0x93, 0x22, - 0x68, 0x9a, 0x1f, 0xd3, 0x79, 0x24, 0x28, 0xc9, 0x2f, 0x65, 0x60, 0x0a, 0x81, 0xcb, 0x8f, 0x69, - 0x3b, 0x40, 0x66, 0x43, 0xc2, 0xbf, 0x29, 0x7c, 0x18, 0xad, 0x05, 0x9e, 0xd3, 0xde, 0x13, 0x2f, - 0xa3, 0x3b, 0xe2, 0x65, 0xf4, 0x1d, 0xfe, 0xa2, 0x7b, 0xa3, 0xee, 0xb6, 0x6e, 0xee, 0x79, 0xf6, - 0x63, 0x87, 0x9b, 0x60, 0xd9, 0xcd, 0x9b, 0x51, 0x3e, 0x8e, 0x8e, 0x13, 0xcb, 0x94, 0x21, 0x58, - 0xe1, 0xab, 0x33, 0x6f, 0x28, 0xc5, 0x6a, 0xe3, 0xaa, 0x19, 0xbd, 0x45, 0xe4, 0xfb, 0xe0, 0x02, - 0x0f, 0x1d, 0xc4, 0x6e, 0xf8, 0x4e, 0xbb, 0xeb, 0x76, 0xfd, 0x25, 0xbb, 0x7e, 0xc0, 0xc4, 0x7c, - 0xee, 0xa3, 0x89, 0x5f, 0x5e, 0x0f, 0x0b, 0xad, 0x1d, 0x5e, 0xaa, 0xf9, 0xa4, 0xa7, 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, 0x29, 0xdb, 0x1d, 0xbb, 0xee, 0x04, 0x3c, 0x96, 0x61, 0x8e, - 0x0b, 0x74, 0x1e, 0xb5, 0x1b, 0x56, 0xcb, 0x7e, 0x62, 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, 0x2b, 0x99, 0x6b, 0x19, 0x85, 0x55, 0x80, 0x65, - 0x16, 0x9a, 0x4a, 0xc7, 0x59, 0x29, 0x74, 0x6c, 0xe6, 0x6d, 0x7b, 0x4e, 0x40, 0xd5, 0x2f, 0x1c, - 0xc7, 0x66, 0x61, 0xff, 0xa3, 0x61, 0x79, 0xaf, 0x4f, 0x4c, 0x50, 0x46, 0xdc, 0x94, 0x8f, 0x9c, - 0x48, 0x70, 0x4b, 0xff, 0xca, 0x04, 0x65, 0xc8, 0x4d, 0xfd, 0xce, 0x49, 0xfc, 0x4e, 0x85, 0x5b, - 0x8f, 0x0f, 0x4d, 0x50, 0x92, 0x75, 0xd6, 0x69, 0x01, 0x93, 0x9b, 0xdc, 0xb6, 0xb0, 0xe0, 0x9e, - 0xc2, 0xa6, 0xbd, 0x2c, 0xcc, 0x10, 0x0b, 0x9e, 0x2c, 0xb6, 0x52, 0xec, 0xb9, 0xe3, 0xc4, 0xe4, - 0x6f, 0xc0, 0xf4, 0x96, 0x4f, 0xef, 0x56, 0x37, 0x6a, 0x32, 0xd2, 0x10, 0x2a, 0x17, 0xa7, 0x16, - 0x6f, 0x9d, 0xb2, 0xe9, 0xdc, 0x50, 0x69, 0x30, 0xbd, 0x05, 0x1f, 0xb7, 0xae, 0x4f, 0xad, 0x5d, - 0xa7, 0xe3, 0x87, 0x61, 0xdb, 0xd4, 0x71, 0x8b, 0x55, 0x65, 0xac, 0xc0, 0x4c, 0x82, 0x0d, 0x99, - 0x02, 0x60, 0x40, 0x6b, 0x6b, 0xbd, 0xb6, 0xbc, 0x59, 0x78, 0x8e, 0x14, 0x60, 0x02, 0x7f, 0x2f, - 0xaf, 0x97, 0x96, 0x56, 0x97, 0x2b, 0x85, 0x0c, 0x99, 0x81, 0x49, 0x84, 0x54, 0xaa, 0x35, 0x0e, - 0xca, 0xf2, 0xe0, 0xe6, 0x66, 0x81, 0x2f, 0xdd, 0x80, 0x2d, 0x00, 0x3c, 0x53, 0x8c, 0xbf, 0x9f, - 0x85, 0x8b, 0xf2, 0x58, 0xa1, 0x01, 0x13, 0x1c, 0x9d, 0xf6, 0xde, 0x33, 0x7e, 0x3a, 0xdc, 0xd5, - 0x4e, 0x87, 0x97, 0x63, 0x27, 0x75, 0xec, 0x2b, 0xfb, 0x1c, 0x11, 0xbf, 0x35, 0x06, 0x97, 0xfa, - 0x52, 0x91, 0x2f, 0xb2, 0xd3, 0xdc, 0xa1, 0xed, 0xa0, 0xda, 0x68, 0xd2, 0x4d, 0xa7, 0x45, 0xdd, - 0x6e, 0x20, 0x3c, 0x06, 0x5e, 0x42, 0x7d, 0x1e, 0x16, 0x5a, 0x4e, 0xa3, 0x49, 0xad, 0x80, 0x17, - 0x6b, 0xd3, 0x2d, 0x49, 0xcd, 0x58, 0x86, 0xa9, 0x76, 0xaa, 0xed, 0x80, 0x7a, 0x8f, 0xd1, 0x2a, - 0x31, 0x64, 0x79, 0x40, 0x69, 0xc7, 0xb2, 0x59, 0xa9, 0xe5, 0x88, 0x62, 0x9d, 0x65, 0x82, 0x9a, - 0xdc, 0x55, 0x58, 0x96, 0xd9, 0xed, 0x7f, 0xcd, 0x7e, 0x22, 0xcc, 0xa4, 0x44, 0xe4, 0xca, 0x90, - 0x25, 0x77, 0xa3, 0x6e, 0xd9, 0x4f, 0xcc, 0x24, 0x09, 0xf9, 0x2a, 0x9c, 0x13, 0x07, 0x90, 0x08, - 0x83, 0x21, 0xbf, 0x98, 0x07, 0xd9, 0x78, 0xf5, 0xe4, 0xb8, 0x78, 0x41, 0xc6, 0xfc, 0x94, 0x81, - 0x4f, 0xd2, 0xbe, 0x3a, 0x9d, 0x0b, 0xd9, 0x64, 0x07, 0x72, 0xac, 0x3b, 0xd6, 0xa8, 0xef, 0x4b, - 0xff, 0x3e, 0x71, 0x33, 0x56, 0x3b, 0xd3, 0x6a, 0xf1, 0x72, 0xb3, 0x27, 0x25, 0x59, 0x81, 0xa9, - 0x6d, 0xba, 0xa3, 0x8e, 0xcf, 0x48, 0xb8, 0x55, 0x15, 0x0e, 0xe9, 0x4e, 0xef, 0xc1, 0x89, 0xd1, - 0x11, 0x07, 0xdf, 0x07, 0x9e, 0x1c, 0xad, 0x3a, 0x7e, 0x40, 0xdb, 0xd4, 0xc3, 0xf0, 0x4a, 0xa3, - 0xb8, 0x19, 0xcc, 0x47, 0x12, 0xb2, 0x5e, 0xbe, 0xf4, 0xe2, 0xc9, 0x71, 0xf1, 0x12, 0x77, 0x94, - 0x6d, 0x0a, 0xb8, 0x15, 0x4b, 0x54, 0x93, 0xe4, 0x4a, 0xbe, 0x0e, 0xd3, 0xa6, 0xdb, 0x0d, 0x9c, - 0xf6, 0x5e, 0x2d, 0xf0, 0xec, 0x80, 0xee, 0xf1, 0x03, 0x29, 0x8a, 0xe3, 0x14, 0x2b, 0x15, 0x4f, - 0xcb, 0x1c, 0x68, 0xf9, 0x02, 0xaa, 0x9d, 0x08, 0x3a, 0x01, 0xf9, 0x1a, 0x4c, 0xf1, 0x00, 0x08, - 0x61, 0x05, 0x63, 0x5a, 0x90, 0x7d, 0xbd, 0xf0, 0xd1, 0x2d, 0x61, 0xd5, 0x82, 0xd0, 0xb4, 0x0a, - 0x62, 0xdc, 0xc8, 0x97, 0x45, 0x67, 0x6d, 0x38, 0xed, 0xbd, 0x70, 0x1a, 0x03, 0xf6, 0xfc, 0x1b, - 0x51, 0x97, 0x74, 0x58, 0x73, 0xe5, 0x34, 0xee, 0x61, 0xa2, 0x97, 0xe4, 0x43, 0x02, 0xb8, 0x54, - 0xf2, 0x7d, 0xc7, 0x0f, 0x84, 0x5f, 0xcd, 0xf2, 0x13, 0x5a, 0xef, 0x32, 0x64, 0x76, 0xbd, 0xa5, - 0x1e, 0xb7, 0xeb, 0x1e, 0x5e, 0xba, 0x71, 0x72, 0x5c, 0x7c, 0xcd, 0x46, 0x44, 0x4b, 0xb8, 0xe2, - 0x58, 0x54, 0xa2, 0x5a, 0x87, 0x1c, 0x57, 0xf9, 0x86, 0xfe, 0x4c, 0xc9, 0xd7, 0xe0, 0x7c, 0xd9, - 0xf6, 0x69, 0xb5, 0xed, 0xd3, 0xb6, 0xef, 0x04, 0xce, 0x63, 0x2a, 0x3a, 0x15, 0x0f, 0xbf, 0x3c, - 0xa6, 0xf4, 0x31, 0xea, 0xb6, 0xcf, 0x16, 0x66, 0x88, 0x62, 0x89, 0x41, 0x51, 0xaa, 0xe9, 0xc1, - 0x85, 0x98, 0x30, 0x55, 0xab, 0xad, 0x54, 0x1c, 0x3b, 0x5c, 0x57, 0x93, 0xd8, 0x5f, 0xaf, 0xa1, - 0x6a, 0xcf, 0xdf, 0xb7, 0x1a, 0x8e, 0x1d, 0x2e, 0xa8, 0x1e, 0x9d, 0x15, 0xe3, 0x60, 0x1c, 0x67, - 0xa0, 0x10, 0x1f, 0x4a, 0xf2, 0x25, 0x18, 0xe3, 0xf6, 0x6d, 0xd4, 0xdf, 0x17, 0xf1, 0x00, 0xa4, - 0xb9, 0x54, 0x08, 0xd7, 0x89, 0x84, 0x13, 0x1d, 0xb7, 0x9e, 0xa3, 0xaa, 0xb5, 0x0c, 0x3a, 0xd1, - 0x49, 0x22, 0xd2, 0x80, 0x09, 0x3e, 0x5a, 0x14, 0x83, 0xb8, 0x09, 0x33, 0xe7, 0x17, 0xd5, 0xd5, - 0x21, 0x8a, 0x62, 0xfc, 0xf1, 0xd5, 0x50, 0xcc, 0x09, 0x8e, 0xa0, 0x55, 0xa1, 0x71, 0x5d, 0x02, - 0xc8, 0x4b, 0x42, 0xe3, 0x22, 0x5c, 0xe8, 0xd1, 0x66, 0xe3, 0x31, 0x5a, 0x12, 0xf4, 0xa8, 0x91, - 0x7c, 0x09, 0xe6, 0x90, 0xb0, 0xec, 0xb6, 0xdb, 0xb4, 0x1e, 0xe0, 0x76, 0x24, 0xb5, 0xef, 0x39, - 0x6e, 0xe9, 0xc2, 0xbf, 0xb7, 0x1e, 0x22, 0x58, 0x71, 0x25, 0x7c, 0x2a, 0x07, 0xe3, 0xe7, 0xb2, - 0x30, 0x2f, 0x76, 0x38, 0x93, 0xd6, 0x5d, 0xaf, 0xf1, 0xec, 0x9f, 0xa8, 0xcb, 0xda, 0x89, 0xfa, - 0x52, 0x18, 0x00, 0x26, 0xed, 0x23, 0xfb, 0x1c, 0xa8, 0xbf, 0x92, 0x81, 0x17, 0xfa, 0x11, 0xb1, - 0xde, 0x09, 0x83, 0xd6, 0x8d, 0x25, 0x82, 0xd3, 0x75, 0x60, 0x16, 0x07, 0xb4, 0xbc, 0x4f, 0xeb, - 0x07, 0xfe, 0x8a, 0xeb, 0x07, 0xe8, 0x69, 0x91, 0xed, 0xf1, 0xd6, 0xfd, 0x7a, 0xea, 0x5b, 0xf7, - 0x79, 0x3e, 0xcb, 0xea, 0xc8, 0x83, 0x87, 0xd5, 0x3b, 0xa0, 0x47, 0xbe, 0x99, 0xc6, 0x1a, 0x2d, - 0xe6, 0x4b, 0xdd, 0x60, 0x7f, 0xc3, 0xa3, 0xbb, 0xd4, 0xa3, 0xed, 0x3a, 0xfd, 0x1e, 0xb3, 0x98, - 0xd7, 0x3f, 0x6e, 0x20, 0x0d, 0xc6, 0x3f, 0x9d, 0x84, 0xb9, 0x34, 0x32, 0xd6, 0x2f, 0xca, 0xa5, - 0x39, 0x9e, 0x71, 0xf0, 0x07, 0x33, 0x30, 0x51, 0xa3, 0x75, 0xb7, 0xdd, 0xb8, 0x8b, 0x16, 0x45, - 0xa2, 0x77, 0x2c, 0x2e, 0x34, 0x30, 0xb8, 0xb5, 0x1b, 0x33, 0x35, 0xfa, 0xee, 0x71, 0xf1, 0x0b, - 0x83, 0xdd, 0x55, 0xeb, 0x2e, 0x06, 0x71, 0x09, 0x30, 0x22, 0x7e, 0x58, 0x05, 0x3e, 0x0e, 0x6a, - 0x95, 0x92, 0x25, 0x98, 0x14, 0xcb, 0xd5, 0x55, 0x63, 0x16, 0xf2, 0x18, 0x39, 0xb2, 0x20, 0xa1, - 0xba, 0xd6, 0x48, 0xc8, 0x6d, 0xc8, 0x6d, 0x2d, 0xde, 0x15, 0x63, 0x20, 0x73, 0x0a, 0x6c, 0x2d, - 0xde, 0x45, 0x75, 0x18, 0xbb, 0x62, 0x4c, 0x76, 0x17, 0x35, 0x23, 0x9f, 0xad, 0xc5, 0xbb, 0xe4, - 0x6f, 0xc1, 0xb9, 0x8a, 0xe3, 0x8b, 0x2a, 0xb8, 0xef, 0x46, 0x03, 0x3d, 0x16, 0x47, 0x7a, 0xcc, - 0xde, 0xcf, 0xa6, 0xce, 0xde, 0x17, 0x1b, 0x21, 0x13, 0x8b, 0x3b, 0x86, 0x34, 0xe2, 0xb1, 0x19, - 0xd3, 0xeb, 0x21, 0x1f, 0xc2, 0x14, 0x2a, 0xb3, 0xd1, 0x9d, 0x05, 0xa3, 0x6a, 0x8f, 0xf6, 0xa8, - 0xf9, 0xd3, 0xa9, 0x35, 0x2f, 0xf0, 0xd8, 0x0c, 0xe8, 0x14, 0x83, 0x11, 0xb8, 0xb5, 0x5b, 0xbf, - 0xc6, 0x99, 0xdc, 0x87, 0x69, 0x21, 0x7e, 0x3d, 0xdc, 0xdd, 0xdc, 0xa7, 0x15, 0xfb, 0x48, 0xd8, - 0xe7, 0xe0, 0x8d, 0x4e, 0xc8, 0x6c, 0x96, 0xbb, 0x6b, 0x05, 0xfb, 0xd4, 0x6a, 0xd8, 0x9a, 0xa0, - 0x12, 0x23, 0x24, 0xdf, 0x82, 0xf1, 0x55, 0xb7, 0xce, 0x24, 0x6f, 0xdc, 0x19, 0xb8, 0xc9, 0xce, - 0x07, 0x98, 0xd3, 0x8e, 0x83, 0x63, 0xe2, 0xd4, 0x77, 0x8f, 0x8b, 0x6f, 0x9f, 0x75, 0xd2, 0x28, - 0x15, 0x98, 0x6a, 0x6d, 0xa4, 0x0c, 0xf9, 0x6d, 0xba, 0xc3, 0xbe, 0x36, 0x9e, 0xef, 0x4a, 0x82, - 0x85, 0x45, 0x9e, 0xf8, 0xa5, 0x59, 0xe4, 0x09, 0x18, 0xf1, 0x60, 0x06, 0xfb, 0x67, 0xc3, 0xf6, - 0xfd, 0x43, 0xd7, 0x6b, 0x60, 0x62, 0x83, 0x5e, 0xd6, 0x40, 0x8b, 0xa9, 0x9d, 0xff, 0x02, 0xef, - 0xfc, 0x8e, 0xc2, 0x41, 0x15, 0x20, 0x13, 0xec, 0xc9, 0xd7, 0x61, 0x4a, 0x04, 0x14, 0x58, 0xbb, - 0x5b, 0xc2, 0x55, 0x39, 0xa1, 0xf9, 0x7d, 0xea, 0x85, 0x5c, 0x4a, 0x15, 0xf1, 0x09, 0xa4, 0x06, - 0xca, 0x6a, 0xed, 0xda, 0xba, 0xd2, 0x5f, 0x25, 0x21, 0x1b, 0x30, 0x5e, 0xc1, 0xac, 0xab, 0xe8, - 0x9b, 0x26, 0xec, 0xc2, 0xc3, 0x84, 0x3d, 0x51, 0x09, 0xd7, 0xc5, 0x88, 0x04, 0xad, 0xe8, 0xe9, - 0xa6, 0xdb, 0xea, 0x86, 0x88, 0xe4, 0x0e, 0xe4, 0xaa, 0x95, 0x0d, 0x61, 0x16, 0x2e, 0xdd, 0xbd, - 0xaa, 0x8d, 0x0d, 0x99, 0xde, 0x04, 0xed, 0xe7, 0x9c, 0x86, 0x66, 0x54, 0x5e, 0xad, 0x6c, 0x90, - 0x5d, 0x98, 0xc4, 0x0e, 0x58, 0xa1, 0x36, 0xef, 0xdb, 0xe9, 0x1e, 0x7d, 0x7b, 0x23, 0xb5, 0x6f, - 0xe7, 0x79, 0xdf, 0xee, 0x0b, 0x6a, 0x2d, 0x5f, 0x83, 0xca, 0x96, 0x89, 0xb4, 0x22, 0x87, 0x8c, - 0xcc, 0x32, 0xb0, 0xb9, 0x8a, 0xf6, 0x41, 0x42, 0xa4, 0x95, 0x29, 0x67, 0xc2, 0xb4, 0x07, 0x3d, - 0xbd, 0x4e, 0x92, 0x7c, 0xc8, 0xe7, 0x61, 0xe8, 0xe1, 0x41, 0x60, 0x0b, 0x03, 0x70, 0xd9, 0x8f, - 0x0c, 0x24, 0x3f, 0x1f, 0xb5, 0x90, 0xee, 0x81, 0x16, 0xbd, 0x0b, 0x69, 0xd8, 0x50, 0xac, 0xd8, - 0x5e, 0xe3, 0xd0, 0xf6, 0xd0, 0x41, 0x78, 0x56, 0x63, 0xa1, 0x94, 0xf0, 0xa1, 0xd8, 0x17, 0x80, - 0x98, 0xd7, 0xb0, 0xca, 0x82, 0x7c, 0x1f, 0x5c, 0xf4, 0x9d, 0xbd, 0xb6, 0x1d, 0x74, 0x3d, 0x6a, - 0xd9, 0xcd, 0x3d, 0xd7, 0x73, 0x82, 0xfd, 0x96, 0xe5, 0x77, 0x9d, 0x80, 0xce, 0xcf, 0x69, 0x19, - 0x67, 0x6b, 0x12, 0xaf, 0x24, 0xd1, 0x6a, 0x0c, 0xcb, 0xbc, 0xe0, 0xa7, 0x17, 0x90, 0x2f, 0xc3, - 0xa4, 0xba, 0x25, 0xfb, 0xf3, 0xe7, 0xae, 0xe4, 0xae, 0x4d, 0x85, 0x17, 0x8f, 0xf8, 0x06, 0x2e, - 0x23, 0xb5, 0x2a, 0x27, 0x84, 0xaf, 0x47, 0x6a, 0x55, 0x78, 0x85, 0x39, 0xdc, 0x48, 0x61, 0xd6, - 0x9c, 0x11, 0x33, 0x56, 0xf4, 0xf2, 0xda, 0xdd, 0x92, 0x39, 0xba, 0x51, 0x7d, 0x54, 0x6b, 0xba, - 0x81, 0xf1, 0x9f, 0x67, 0x70, 0x13, 0x27, 0xaf, 0x61, 0xd0, 0xa1, 0xf0, 0xf5, 0x0c, 0xf5, 0xb7, - 0x76, 0x27, 0x16, 0xe6, 0x9b, 0xa3, 0x90, 0xd7, 0x61, 0xe4, 0xae, 0x5d, 0xa7, 0x81, 0x7c, 0xaf, - 0x47, 0xe4, 0x5d, 0x84, 0xa8, 0xca, 0x5e, 0x8e, 0xc3, 0xe4, 0x4b, 0x3e, 0xb9, 0x4b, 0x51, 0x32, - 0xe3, 0x72, 0x49, 0x3e, 0xd7, 0xa3, 0x7c, 0x29, 0x16, 0x85, 0x92, 0xed, 0x38, 0x66, 0x15, 0x9f, - 0xca, 0xc1, 0xf8, 0xb3, 0x4c, 0xb4, 0x2b, 0x91, 0x57, 0x61, 0xc8, 0xdc, 0x08, 0xdb, 0xcf, 0x9d, - 0x7e, 0x63, 0xcd, 0x47, 0x04, 0xf2, 0x65, 0x38, 0xa7, 0xf0, 0x49, 0x98, 0xe8, 0xbf, 0x82, 0x3e, - 0xa9, 0x4a, 0x4b, 0xd2, 0xed, 0xf4, 0xd3, 0x79, 0xa0, 0x30, 0x1d, 0x15, 0x54, 0x68, 0xdb, 0xe1, - 0xbc, 0x95, 0x8f, 0x55, 0x79, 0x37, 0x10, 0x21, 0xfe, 0xb1, 0x69, 0x1c, 0xb8, 0x4b, 0xaa, 0xf1, - 0x9b, 0x19, 0x6d, 0xb7, 0x09, 0xb3, 0xbf, 0x66, 0x4e, 0xc9, 0xfe, 0xfa, 0x16, 0x40, 0xa9, 0x1b, - 0xb8, 0xcb, 0x6d, 0xcf, 0x6d, 0x72, 0x2d, 0x8a, 0x88, 0x74, 0x8f, 0xba, 0x61, 0x8a, 0x60, 0xcd, - 0x73, 0x2e, 0x44, 0x4e, 0xf5, 0x66, 0xc8, 0x7d, 0x54, 0x6f, 0x06, 0xe3, 0xf7, 0x33, 0xda, 0x1a, - 0x65, 0x52, 0xa2, 0x98, 0x8a, 0xaa, 0xc5, 0x58, 0xc7, 0x79, 0x6c, 0xf9, 0x4d, 0x57, 0x0b, 0x52, - 0x21, 0xd0, 0xc8, 0xff, 0x3f, 0x03, 0xe7, 0xb9, 0x5b, 0xc0, 0x7a, 0xb7, 0xb5, 0x43, 0xbd, 0x47, - 0x76, 0xd3, 0x69, 0x70, 0xc7, 0x6b, 0x2e, 0x00, 0x5f, 0x4b, 0x2e, 0xf8, 0x74, 0x7c, 0x7e, 0x51, - 0xe5, 0x6e, 0x0a, 0x56, 0x1b, 0x0b, 0xad, 0xc7, 0x61, 0xa9, 0x7a, 0x51, 0x4d, 0xa7, 0x37, 0x7e, - 0x35, 0x03, 0x2f, 0x9e, 0x5a, 0x0b, 0xb9, 0x09, 0xa3, 0x32, 0xc5, 0x40, 0x06, 0x3b, 0x1e, 0xed, - 0x6c, 0x93, 0xe9, 0x05, 0x24, 0x16, 0xf9, 0x0a, 0x9c, 0x53, 0x59, 0x6d, 0x7a, 0xb6, 0xa3, 0x06, - 0xf2, 0x4f, 0x69, 0x75, 0xc0, 0x50, 0xe2, 0xd2, 0x5a, 0x3a, 0x13, 0xe3, 0xff, 0xcd, 0x28, 0xf9, - 0xa0, 0x9f, 0x51, 0x19, 0xfe, 0x8e, 0x26, 0xc3, 0xcb, 0x70, 0x8f, 0xe1, 0x57, 0xb1, 0xb2, 0xd4, - 0x7b, 0xd7, 0xb4, 0x62, 0x2f, 0x8e, 0x80, 0x1f, 0xc9, 0xc2, 0xf8, 0x96, 0x4f, 0x3d, 0xfe, 0x90, - 0xfb, 0xbd, 0x15, 0xd6, 0x2f, 0xfc, 0xae, 0x81, 0x02, 0xaf, 0xfd, 0x49, 0x06, 0x15, 0xfc, 0x2a, - 0x05, 0xeb, 0x0d, 0x25, 0x07, 0x1c, 0xf6, 0x06, 0x66, 0x7f, 0x43, 0x28, 0x8f, 0xf7, 0xb5, 0xaa, - 0xa7, 0x83, 0xc4, 0x9c, 0xa0, 0xab, 0xe4, 0x0b, 0x30, 0xbc, 0x85, 0xea, 0x4a, 0x3d, 0xc8, 0x46, - 0xc8, 0x1f, 0x0b, 0xf9, 0x26, 0xdd, 0xf5, 0xf5, 0x18, 0x65, 0x9c, 0x90, 0xd4, 0x60, 0xb4, 0xec, - 0x51, 0xcc, 0xee, 0x3c, 0x34, 0xb8, 0x8b, 0x78, 0x9d, 0x93, 0xc4, 0x5d, 0xc4, 0x05, 0x27, 0xe3, - 0x67, 0xb3, 0x40, 0xa2, 0x6f, 0xc4, 0x54, 0x46, 0xfe, 0x33, 0x3b, 0xe8, 0xef, 0x6b, 0x83, 0x7e, - 0x29, 0x31, 0xe8, 0xfc, 0xf3, 0x06, 0x1a, 0xfb, 0xdf, 0xce, 0xc0, 0xf9, 0x74, 0x42, 0xf2, 0x12, - 0x8c, 0x3c, 0xdc, 0xdc, 0x90, 0x71, 0x5a, 0xc4, 0xa7, 0xb8, 0x1d, 0xd4, 0x15, 0x98, 0xa2, 0x88, - 0xbc, 0x01, 0x23, 0x5f, 0x34, 0xcb, 0xec, 0x1c, 0x52, 0x82, 0xe5, 0x7f, 0xc3, 0xb3, 0xea, 0xfa, - 0x51, 0x24, 0x90, 0xd4, 0xb1, 0xcd, 0x3d, 0xb5, 0xb1, 0xfd, 0xc9, 0x2c, 0x4c, 0x97, 0xea, 0x75, - 0xea, 0xfb, 0x4c, 0xda, 0xa1, 0x7e, 0xf0, 0xcc, 0x0e, 0x6c, 0x7a, 0x04, 0x16, 0xed, 0xdb, 0x06, - 0x1a, 0xd5, 0xdf, 0xcd, 0xc0, 0x39, 0x49, 0xf5, 0xd8, 0xa1, 0x87, 0x9b, 0xfb, 0x1e, 0xf5, 0xf7, - 0xdd, 0x66, 0x63, 0xe0, 0x8c, 0x1c, 0x4c, 0xd0, 0xc3, 0x30, 0xdb, 0xea, 0xab, 0xfe, 0x2e, 0x42, - 0x34, 0x41, 0x8f, 0x87, 0xe2, 0xbe, 0x09, 0xa3, 0xa5, 0x4e, 0xc7, 0x73, 0x1f, 0xf3, 0x65, 0x2f, - 0xa2, 0x10, 0xda, 0x1c, 0xa4, 0x79, 0xd8, 0x73, 0x10, 0x6b, 0x46, 0x85, 0xb6, 0x79, 0x7c, 0xbd, - 0x49, 0xde, 0x8c, 0x06, 0x6d, 0xab, 0xb2, 0x38, 0x96, 0x1b, 0x35, 0x20, 0x1b, 0x9e, 0xdb, 0x72, - 0x03, 0xda, 0xe0, 0xdf, 0x83, 0x81, 0x09, 0x4e, 0x0d, 0xa4, 0xb5, 0xe9, 0x04, 0x4d, 0x2d, 0x90, - 0x56, 0xc0, 0x00, 0x26, 0x87, 0x1b, 0xff, 0xf7, 0x30, 0x4c, 0xa8, 0xbd, 0x43, 0x0c, 0x1e, 0x66, - 0xdf, 0xf5, 0xd4, 0xe8, 0x18, 0x36, 0x42, 0x4c, 0x51, 0x12, 0x85, 0x96, 0xc9, 0x9e, 0x1a, 0x5a, - 0x66, 0x1b, 0x26, 0x37, 0x3c, 0x17, 0xc3, 0x25, 0xf2, 0xac, 0xff, 0x7c, 0x2b, 0x9c, 0x55, 0xee, - 0x9d, 0x6c, 0x20, 0xf1, 0x3d, 0x14, 0x25, 0xfb, 0x8e, 0xc0, 0xc6, 0xe4, 0x73, 0x9a, 0xd6, 0x45, - 0xe3, 0xc3, 0x4d, 0x2d, 0x6c, 0x5f, 0xc4, 0x3c, 0x0d, 0x4d, 0x2d, 0x18, 0x44, 0x37, 0xb5, 0x60, - 0x10, 0x75, 0xad, 0x0d, 0x3f, 0xad, 0xb5, 0x46, 0x7e, 0x36, 0x03, 0xe3, 0xa5, 0x76, 0x5b, 0x84, - 0xac, 0x39, 0xc5, 0x5b, 0xff, 0x2b, 0xc2, 0xda, 0xe2, 0xed, 0x8f, 0x64, 0x6d, 0x81, 0x72, 0x8b, - 0x8f, 0x92, 0x6a, 0x54, 0xa1, 0x7a, 0x5b, 0x53, 0xda, 0x41, 0xde, 0x86, 0x42, 0x38, 0xc9, 0xab, - 0xed, 0x06, 0x7d, 0x42, 0x79, 0x9a, 0xb2, 0x49, 0x11, 0xed, 0x58, 0x95, 0x4c, 0xe3, 0x88, 0x64, - 0x13, 0xc0, 0x0e, 0x67, 0x57, 0x2c, 0xdf, 0x62, 0x72, 0xfa, 0x09, 0xe9, 0x19, 0x7f, 0xe3, 0x83, - 0x96, 0x2a, 0x3d, 0x47, 0x7c, 0x48, 0x0b, 0xa6, 0x79, 0xb2, 0xc3, 0x5a, 0x60, 0x7b, 0x01, 0x06, - 0xf5, 0x87, 0x53, 0xc7, 0xe1, 0x55, 0xa1, 0x3f, 0x7b, 0x5e, 0xa4, 0x50, 0xf4, 0x19, 0xad, 0x95, - 0x12, 0xe1, 0x3f, 0xce, 0x9b, 0xc7, 0x96, 0x36, 0x2f, 0x24, 0xdb, 0xcb, 0x27, 0xfd, 0x4f, 0x66, - 0xe0, 0xbc, 0x3a, 0xe9, 0x6b, 0xdd, 0x9d, 0x96, 0x83, 0x97, 0x42, 0x72, 0x03, 0xc6, 0xc4, 0x9c, - 0x0c, 0x2f, 0x51, 0xc9, 0xdc, 0x04, 0x11, 0x0a, 0x59, 0x66, 0xd3, 0x90, 0xf1, 0x10, 0x52, 0xf7, - 0x6c, 0x6c, 0x9f, 0x62, 0x45, 0x51, 0x22, 0x5d, 0x0f, 0x7f, 0xeb, 0xf3, 0x93, 0x41, 0x8c, 0xf7, - 0x60, 0x46, 0x1f, 0x89, 0x1a, 0x0d, 0xc8, 0x75, 0x18, 0x95, 0xc3, 0x97, 0x49, 0x1f, 0x3e, 0x59, - 0x6e, 0x6c, 0x03, 0x49, 0xd0, 0xfb, 0x68, 0x16, 0xc5, 0xee, 0xa7, 0xdc, 0x6c, 0x4f, 0x3e, 0x4a, - 0x26, 0x10, 0x97, 0x66, 0x45, 0xfb, 0xc6, 0x35, 0xb7, 0x04, 0x46, 0x6a, 0xfc, 0xd9, 0x14, 0xcc, - 0xa6, 0xec, 0xb9, 0xa7, 0xc8, 0x44, 0x45, 0x7d, 0x83, 0x18, 0x0b, 0x83, 0x7d, 0xc8, 0x6d, 0xe1, - 0x3d, 0x18, 0x3e, 0x75, 0x3b, 0xe0, 0x4e, 0x29, 0xb1, 0x5d, 0x80, 0x93, 0x7d, 0x22, 0x72, 0x91, - 0x1a, 0x8f, 0x67, 0xf8, 0xa9, 0xc5, 0xe3, 0x59, 0x82, 0x49, 0xf1, 0x55, 0x62, 0xbb, 0x52, 0x8c, - 0xa3, 0x3d, 0x5e, 0x60, 0x25, 0xb6, 0x2d, 0x9d, 0x84, 0xf3, 0xf0, 0xdd, 0xe6, 0x63, 0x2a, 0x78, - 0x8c, 0xaa, 0x3c, 0xb0, 0x20, 0x95, 0x87, 0x42, 0x42, 0xfe, 0x23, 0x4c, 0xb4, 0x86, 0x10, 0x75, - 0xcf, 0xca, 0xf7, 0xdb, 0xb3, 0x1a, 0x4f, 0x67, 0xcf, 0xba, 0x24, 0xdb, 0x98, 0xbe, 0x77, 0xa5, - 0x34, 0x8b, 0xfc, 0x72, 0x06, 0x66, 0x78, 0x50, 0x18, 0xb5, 0xb1, 0x7d, 0x03, 0x7d, 0xd4, 0x9f, - 0x4e, 0x63, 0x5f, 0x10, 0x09, 0x86, 0xd2, 0xdb, 0x9a, 0x6c, 0x14, 0xf9, 0x3e, 0x80, 0x70, 0x45, - 0xf1, 0xf8, 0xae, 0xe3, 0x8b, 0x2f, 0xa4, 0xec, 0x02, 0x21, 0x52, 0x94, 0x0c, 0x21, 0x08, 0xe9, - 0xb4, 0xf4, 0x7a, 0x21, 0x94, 0xfc, 0x2d, 0x98, 0x63, 0xeb, 0x25, 0x84, 0x88, 0x10, 0x56, 0xf3, - 0xe3, 0x58, 0xcb, 0x67, 0x7a, 0xcb, 0x44, 0x37, 0xd2, 0xc8, 0x78, 0x34, 0xe0, 0x28, 0xd3, 0x71, - 0xa0, 0x46, 0xbb, 0x48, 0xad, 0x08, 0x23, 0xc3, 0x61, 0xeb, 0x79, 0xc2, 0x82, 0x1e, 0xfb, 0xdb, - 0x45, 0xb9, 0x16, 0xf8, 0xfe, 0xe6, 0xeb, 0x3e, 0xca, 0x08, 0x22, 0x5f, 0x04, 0x12, 0x46, 0x53, - 0xe1, 0x30, 0x2a, 0x93, 0x19, 0x70, 0x75, 0x73, 0x14, 0x95, 0xc5, 0x93, 0xc5, 0xea, 0x24, 0x49, - 0x12, 0x13, 0x0a, 0x73, 0xe2, 0xa3, 0x19, 0x54, 0x66, 0x41, 0xf3, 0xe7, 0xa7, 0xb4, 0x00, 0x61, - 0x51, 0x49, 0x94, 0x12, 0x59, 0x49, 0xa5, 0xa6, 0xa9, 0x9c, 0xd2, 0xd8, 0x91, 0x3b, 0x30, 0x86, - 0x8e, 0xc2, 0x2b, 0xd2, 0xd8, 0x4b, 0x18, 0x9e, 0xa0, 0x4b, 0xb1, 0xb5, 0xaf, 0x9b, 0x6c, 0x45, - 0xa8, 0xec, 0x3a, 0x50, 0xf1, 0x8e, 0xcc, 0x6e, 0x1b, 0x95, 0xc2, 0x42, 0xdf, 0xd1, 0xf0, 0x8e, - 0x2c, 0xaf, 0xab, 0x7b, 0x92, 0x23, 0x12, 0xf9, 0x3a, 0x8c, 0xaf, 0xd9, 0x4f, 0xa4, 0x4e, 0x58, - 0x28, 0x7e, 0xfb, 0xed, 0x40, 0x86, 0xfc, 0x9a, 0x96, 0xfd, 0xc4, 0x6a, 0x74, 0xe3, 0xb1, 0x88, - 0x71, 0x1b, 0x52, 0x59, 0x92, 0xaf, 0x02, 0x28, 0x9a, 0x6a, 0x72, 0x6a, 0x05, 0x2f, 0xca, 0xb0, - 0x77, 0xa9, 0x1a, 0x6c, 0xe4, 0xaf, 0x30, 0x8c, 0x49, 0x0e, 0x73, 0x9f, 0x9c, 0xe4, 0x70, 0xee, - 0x93, 0x93, 0x1c, 0x16, 0x76, 0xe0, 0x62, 0xcf, 0xa5, 0x93, 0x12, 0xea, 0xf8, 0xa6, 0x1e, 0xea, - 0xf8, 0x62, 0xaf, 0x23, 0xd6, 0xd7, 0xf3, 0x5f, 0xcc, 0x16, 0xe6, 0x7a, 0x4b, 0x27, 0xdf, 0xc9, - 0xc6, 0x8e, 0x5c, 0x71, 0xb1, 0xe0, 0xf9, 0x92, 0x7a, 0xc9, 0x24, 0x59, 0x4c, 0x91, 0xcb, 0x0f, - 0xe5, 0x6c, 0x74, 0xa1, 0x61, 0x87, 0xb2, 0x7a, 0xa8, 0xe3, 0xf1, 0xfc, 0x71, 0x4f, 0xdf, 0x77, - 0x60, 0x8a, 0x67, 0xb5, 0x7c, 0x40, 0x8f, 0x0e, 0x5d, 0xaf, 0x21, 0x53, 0xc7, 0xa3, 0x0c, 0x9e, - 0x48, 0x49, 0x1d, 0xc3, 0x25, 0x15, 0xe9, 0x7b, 0x3a, 0x8c, 0xb5, 0x5f, 0x4c, 0xdd, 0xc5, 0x18, - 0x42, 0x3f, 0xb7, 0x54, 0xf2, 0x66, 0x28, 0xa8, 0x51, 0x4f, 0xcd, 0x82, 0xe1, 0x49, 0x60, 0x8a, - 0xbc, 0x46, 0x3d, 0xe3, 0x9f, 0xe7, 0x80, 0xf0, 0x9a, 0xca, 0x76, 0xc7, 0x46, 0xcf, 0x6c, 0x07, - 0x63, 0x2d, 0x15, 0x04, 0x8e, 0xbd, 0xd3, 0xa4, 0x6a, 0xa0, 0x32, 0x61, 0x5c, 0x1b, 0x96, 0x59, - 0xf1, 0x8b, 0x4e, 0x82, 0xb0, 0xc7, 0x56, 0x97, 0xfd, 0x38, 0x5b, 0xdd, 0xd7, 0xe1, 0xf9, 0x52, - 0x07, 0xd3, 0xe3, 0xca, 0x5a, 0xee, 0xba, 0x9e, 0xdc, 0xa4, 0x34, 0x9f, 0x3f, 0x3b, 0x44, 0x4b, - 0xb4, 0xb4, 0x1f, 0x0b, 0x45, 0x4e, 0x61, 0xf3, 0xb2, 0x13, 0xa8, 0x31, 0x24, 0xa4, 0x9c, 0xd2, - 0xc1, 0x92, 0x14, 0x39, 0x85, 0x93, 0x48, 0x1e, 0x8e, 0x27, 0xe5, 0x14, 0xcc, 0xfb, 0x14, 0xf1, - 0x70, 0x3c, 0xda, 0x43, 0xd6, 0x09, 0x49, 0xc8, 0x3b, 0x30, 0x5e, 0xea, 0x06, 0xae, 0x60, 0x2c, - 0xac, 0xc2, 0x23, 0xfb, 0x6d, 0xd1, 0x14, 0xed, 0xea, 0x13, 0xa1, 0x1b, 0x7f, 0x9a, 0x83, 0x8b, - 0xc9, 0xe1, 0x15, 0xa5, 0xe1, 0xfa, 0xc8, 0x9c, 0xb2, 0x3e, 0xd2, 0x66, 0x43, 0x36, 0xca, 0x4a, - 0xf0, 0x34, 0x66, 0x03, 0xcf, 0xb2, 0xfb, 0x11, 0x67, 0x43, 0x0d, 0xc6, 0xd5, 0xf3, 0x6e, 0xe8, - 0xa3, 0x9e, 0x77, 0x2a, 0x17, 0x76, 0xa9, 0xe7, 0xa1, 0x33, 0x86, 0xa3, 0xa7, 0xa3, 0x78, 0xd4, - 0x0c, 0x8e, 0x41, 0xfe, 0x7f, 0x70, 0x85, 0xef, 0x49, 0xf1, 0x8f, 0x5d, 0x3a, 0x92, 0x1c, 0xc5, - 0xc0, 0x2d, 0x9e, 0x1c, 0x17, 0x6f, 0x70, 0x55, 0x89, 0x95, 0xe8, 0x36, 0x6b, 0xe7, 0xc8, 0x92, - 0x2d, 0x53, 0x2a, 0x39, 0x95, 0xb7, 0x51, 0x86, 0x8b, 0xa2, 0x34, 0x72, 0xda, 0x96, 0x85, 0x6c, - 0x90, 0x0f, 0x22, 0x6d, 0x17, 0x0e, 0x72, 0x4c, 0x91, 0x85, 0xe5, 0x98, 0x9f, 0x57, 0xc9, 0x9d, - 0xfa, 0x46, 0x9a, 0xcf, 0x0d, 0x8f, 0xda, 0xcd, 0xc1, 0xba, 0xbb, 0x8d, 0xd4, 0xa9, 0x65, 0x53, - 0x75, 0x6a, 0x52, 0x29, 0x93, 0x4b, 0x55, 0xca, 0x54, 0x60, 0xba, 0xd6, 0xdd, 0x91, 0x75, 0xc7, - 0xfd, 0x35, 0xfd, 0xee, 0x4e, 0x5a, 0xaf, 0xc4, 0x49, 0x8c, 0x1f, 0xcd, 0xc2, 0xc4, 0x46, 0xb3, - 0xbb, 0xe7, 0xb4, 0x2b, 0x76, 0x60, 0x3f, 0xb3, 0x6a, 0xbe, 0xb7, 0x34, 0x35, 0x5f, 0xe8, 0x5a, - 0x16, 0x7e, 0xd8, 0x40, 0x3a, 0xbe, 0x9f, 0xc9, 0xc0, 0x74, 0x44, 0xc2, 0x0f, 0xeb, 0x15, 0x18, - 0x62, 0x3f, 0xc4, 0xe5, 0xf7, 0x4a, 0x82, 0x31, 0x4f, 0xd8, 0x17, 0xfe, 0x25, 0x14, 0x6f, 0x7a, - 0x36, 0x2c, 0xe4, 0xb0, 0xf0, 0x59, 0x18, 0x8b, 0xd8, 0x9e, 0x25, 0x51, 0xdf, 0xaf, 0x65, 0xa0, - 0x10, 0xff, 0x12, 0xf2, 0x00, 0x46, 0x19, 0x27, 0x87, 0xca, 0x7b, 0xf9, 0xcb, 0x3d, 0xbe, 0xf9, - 0x86, 0x40, 0xe3, 0xcd, 0xc3, 0xce, 0xa7, 0x1c, 0x62, 0x4a, 0x0e, 0x0b, 0x26, 0x4c, 0xa8, 0x58, - 0x29, 0xad, 0x7b, 0x5d, 0x97, 0x50, 0xce, 0xa7, 0xf7, 0x83, 0x96, 0x5e, 0x50, 0x6b, 0xb5, 0x10, - 0x3e, 0xae, 0x6a, 0x93, 0x2b, 0x75, 0x55, 0xe1, 0xa4, 0x59, 0x8c, 0xb2, 0x14, 0xa8, 0xf3, 0x2c, - 0x65, 0x42, 0x87, 0x78, 0xe4, 0x75, 0x18, 0xe1, 0xf5, 0xa9, 0x69, 0xb6, 0x3a, 0x08, 0x51, 0xe5, - 0x64, 0x8e, 0x63, 0xfc, 0x83, 0x1c, 0x9c, 0x8f, 0x9a, 0xb7, 0xd5, 0x69, 0xd8, 0x01, 0xdd, 0xb0, - 0x3d, 0xbb, 0xe5, 0x9f, 0xb2, 0x02, 0xae, 0x25, 0x9a, 0x86, 0x69, 0x97, 0x64, 0xd3, 0x94, 0x06, - 0x19, 0xb1, 0x06, 0xa1, 0x0e, 0x94, 0x37, 0x48, 0x36, 0x83, 0x3c, 0x80, 0x5c, 0x8d, 0x06, 0x62, - 0xef, 0xbd, 0x9a, 0xe8, 0x55, 0xb5, 0x5d, 0x37, 0x6a, 0x34, 0xe0, 0x83, 0xc8, 0xe3, 0x42, 0x69, - 0xc1, 0xf9, 0x18, 0x17, 0xb2, 0x0d, 0x23, 0xcb, 0x4f, 0x3a, 0xb4, 0x1e, 0x88, 0x34, 0x93, 0xd7, - 0xfb, 0xf3, 0xe3, 0xb8, 0x4a, 0x96, 0x49, 0x8a, 0x00, 0xb5, 0xb3, 0x38, 0xca, 0xc2, 0x1d, 0xc8, - 0xcb, 0xca, 0xcf, 0x32, 0x73, 0x17, 0xde, 0x82, 0x71, 0xa5, 0x92, 0x33, 0x4d, 0xfa, 0x5f, 0x60, - 0xfb, 0xaa, 0xdb, 0x94, 0x99, 0x29, 0x97, 0x13, 0xb2, 0xa2, 0x92, 0xb9, 0x88, 0xcb, 0x8a, 0xd6, - 0x81, 0x28, 0xea, 0x23, 0x34, 0x56, 0x61, 0xba, 0x76, 0xe0, 0x74, 0xa2, 0x40, 0xb1, 0xda, 0x89, - 0x8c, 0x69, 0x68, 0xc4, 0xc5, 0x3d, 0x7e, 0x22, 0xc7, 0xe9, 0x8c, 0xbf, 0xc8, 0xc0, 0x08, 0xfb, - 0xeb, 0xd1, 0x9d, 0x67, 0x74, 0xcb, 0xbc, 0xad, 0x6d, 0x99, 0x33, 0x4a, 0xac, 0x76, 0xdc, 0x38, - 0xee, 0x9c, 0xb2, 0x59, 0x1e, 0x8b, 0x01, 0xe2, 0xc8, 0xe4, 0x1e, 0x8c, 0x0a, 0x93, 0x22, 0x61, - 0xfb, 0xad, 0x06, 0x7f, 0x97, 0xc6, 0x46, 0xe1, 0x0d, 0xdf, 0xed, 0xc4, 0x55, 0x22, 0x92, 0x9a, - 0xc9, 0xf5, 0x32, 0x64, 0xaf, 0x96, 0xcf, 0xd8, 0x45, 0x67, 0x3d, 0x1e, 0xba, 0x5c, 0xc9, 0x40, - 0xde, 0xc3, 0xb7, 0xbe, 0x24, 0x5e, 0x43, 0x72, 0xfd, 0x98, 0x9c, 0x97, 0xe9, 0x5e, 0x53, 0x1f, - 0x4a, 0xfe, 0xe8, 0x1c, 0x0f, 0xf8, 0x2d, 0x1b, 0xf6, 0x2e, 0x4c, 0xdc, 0x75, 0xbd, 0x43, 0xdb, - 0xe3, 0x61, 0x5c, 0x85, 0xf9, 0x01, 0xbb, 0x7f, 0x4e, 0xee, 0x72, 0x38, 0x0f, 0x04, 0xfb, 0xdd, - 0xe3, 0xe2, 0xd0, 0x92, 0xeb, 0x36, 0x4d, 0x0d, 0x9d, 0x3c, 0x84, 0xc9, 0x35, 0xfb, 0x89, 0x72, - 0x73, 0xe6, 0xde, 0x37, 0xd7, 0xd9, 0x04, 0x66, 0x57, 0xef, 0xd3, 0xed, 0xbb, 0x74, 0x7a, 0xe2, - 0xc0, 0xd4, 0x86, 0xeb, 0x05, 0xa2, 0x12, 0xa7, 0xbd, 0x27, 0x3e, 0x36, 0x69, 0xa1, 0x76, 0x33, - 0xd5, 0x42, 0xed, 0x62, 0xc7, 0xf5, 0x02, 0x6b, 0x37, 0x24, 0xd7, 0x02, 0xaa, 0x69, 0x8c, 0xc9, - 0xbb, 0x30, 0xa3, 0xc4, 0x9a, 0xbc, 0xeb, 0x7a, 0x2d, 0x5b, 0x4a, 0xf6, 0xa8, 0x4c, 0x46, 0xa3, - 0x95, 0x5d, 0x04, 0x9b, 0x49, 0x4c, 0xf2, 0xe5, 0x34, 0x7f, 0xa6, 0xe1, 0xc8, 0xc4, 0x2d, 0xc5, - 0x9f, 0xa9, 0x97, 0x89, 0x5b, 0xd2, 0xb3, 0x69, 0xaf, 0x9f, 0x09, 0x6c, 0x7e, 0xe9, 0x96, 0xb8, - 0xc3, 0x9f, 0x6e, 0xe2, 0x1a, 0x8e, 0x5b, 0x0f, 0x53, 0xd7, 0x45, 0xc8, 0x2d, 0x6d, 0xdc, 0xc5, - 0x27, 0x10, 0x69, 0xad, 0xd3, 0xde, 0xb7, 0xdb, 0x75, 0x94, 0xb8, 0x85, 0xd9, 0xb9, 0xba, 0x23, - 0x2f, 0x6d, 0xdc, 0x25, 0x36, 0xcc, 0x6e, 0x50, 0xaf, 0xe5, 0x04, 0x5f, 0xba, 0x75, 0x4b, 0x19, - 0xa8, 0x3c, 0x36, 0xed, 0xa6, 0x68, 0x5a, 0xb1, 0x83, 0x28, 0xd6, 0x93, 0x5b, 0xb7, 0x52, 0x87, - 0x23, 0x6c, 0x58, 0x1a, 0x2f, 0xb6, 0x33, 0xae, 0xd9, 0x4f, 0x22, 0x6f, 0x01, 0x5f, 0x78, 0x86, - 0x5e, 0x92, 0x13, 0x2b, 0xf2, 0x34, 0xd0, 0x76, 0x46, 0x9d, 0x88, 0x5d, 0x98, 0xa2, 0xe9, 0xe5, - 0x0b, 0x9f, 0x9a, 0x05, 0xa9, 0x17, 0x92, 0xee, 0xc3, 0xaa, 0xd4, 0xaf, 0xa0, 0x93, 0xad, 0xf0, - 0xda, 0xc7, 0xaf, 0x4d, 0x22, 0x99, 0xe9, 0x4d, 0xf5, 0xda, 0xc7, 0xb5, 0x31, 0xda, 0x67, 0x4d, - 0x87, 0xba, 0x02, 0xee, 0x3e, 0x61, 0xea, 0x5c, 0x92, 0xb7, 0xc9, 0x89, 0xb3, 0xdf, 0x26, 0x29, - 0x0c, 0xad, 0xba, 0xf5, 0x03, 0x11, 0x05, 0xee, 0x8b, 0x6c, 0xb9, 0x37, 0xdd, 0xfa, 0xc1, 0xd3, - 0x33, 0xed, 0x45, 0xf6, 0x64, 0x9d, 0x35, 0x95, 0xcd, 0x02, 0xd1, 0x27, 0xc2, 0x5c, 0x74, 0x2e, - 0xbc, 0x4e, 0x29, 0x65, 0x5c, 0xf0, 0xe1, 0x93, 0x46, 0x76, 0xad, 0xa9, 0x93, 0x13, 0x0a, 0x85, - 0x0a, 0xf5, 0x0f, 0x02, 0xb7, 0x53, 0x6e, 0x3a, 0x9d, 0x1d, 0xd7, 0xf6, 0x64, 0xcc, 0xe0, 0xe4, - 0xfa, 0x7e, 0x35, 0x75, 0x7d, 0xcf, 0x34, 0x38, 0xbd, 0x55, 0x97, 0x0c, 0xcc, 0x04, 0x4b, 0xf2, - 0x65, 0x98, 0x62, 0x93, 0x7b, 0xf9, 0x49, 0x40, 0xdb, 0x7c, 0xe4, 0x67, 0x50, 0x74, 0x98, 0x53, - 0x92, 0x64, 0x84, 0x85, 0x7c, 0x4e, 0xe1, 0x62, 0xa7, 0x21, 0x81, 0x16, 0x41, 0x4f, 0x63, 0x45, - 0x1a, 0x30, 0xbf, 0x66, 0x3f, 0x51, 0x52, 0xb0, 0x2a, 0x93, 0x94, 0xe0, 0x04, 0xbb, 0x76, 0x72, - 0x5c, 0x7c, 0x99, 0x4d, 0xb0, 0x28, 0x8c, 0x75, 0x8f, 0xf9, 0xda, 0x93, 0x13, 0xf9, 0x16, 0x5c, - 0x10, 0x9f, 0x55, 0xc1, 0xb4, 0x54, 0xae, 0x77, 0x54, 0xdb, 0xb7, 0xd1, 0x51, 0x68, 0xf6, 0x6c, - 0x1b, 0xa2, 0xec, 0xb0, 0x86, 0xe4, 0x63, 0xf9, 0x9c, 0x91, 0xd9, 0xab, 0x06, 0xf2, 0x21, 0x4c, - 0xf1, 0x77, 0x9f, 0x15, 0xd7, 0x0f, 0x50, 0x2b, 0x30, 0x77, 0x36, 0xfb, 0x77, 0xfe, 0x98, 0xc4, - 0x3d, 0x46, 0x62, 0x5a, 0x84, 0x18, 0x67, 0xf2, 0x36, 0x8c, 0x6f, 0x38, 0x6d, 0x1e, 0xe3, 0xb2, - 0xba, 0x81, 0xfa, 0x4b, 0x71, 0xfe, 0x74, 0x9c, 0xb6, 0x25, 0xaf, 0xe6, 0x9d, 0x70, 0xbb, 0x50, - 0xb1, 0xc9, 0x36, 0x8c, 0xd7, 0x6a, 0x2b, 0x77, 0x1d, 0x76, 0x00, 0x76, 0x8e, 0xe6, 0xcf, 0xf7, - 0x68, 0xe5, 0x4b, 0xa9, 0xad, 0x9c, 0xf4, 0xfd, 0x7d, 0x6b, 0xd7, 0x69, 0x52, 0xab, 0xee, 0x76, - 0x8e, 0x4c, 0x95, 0x53, 0x8a, 0x4d, 0xf8, 0x85, 0xa7, 0x6c, 0x13, 0x5e, 0x85, 0x69, 0xc5, 0x4a, - 0x13, 0x2d, 0x34, 0xe7, 0xa3, 0xc0, 0x48, 0xaa, 0x0d, 0x78, 0xdc, 0x07, 0x32, 0x4e, 0x27, 0x8d, - 0xc1, 0x2f, 0x9e, 0xd5, 0x18, 0xdc, 0x81, 0x19, 0x3e, 0x18, 0x62, 0x1e, 0xe0, 0x48, 0x2f, 0xf4, - 0xe8, 0xc3, 0xeb, 0xa9, 0x7d, 0x38, 0x2b, 0x46, 0x5a, 0x4e, 0x32, 0x7c, 0xe7, 0x4c, 0x72, 0x25, - 0xbb, 0x40, 0x04, 0xd0, 0x0e, 0xec, 0x1d, 0xdb, 0xa7, 0x58, 0xd7, 0xf3, 0x3d, 0xea, 0x7a, 0x39, - 0xb5, 0xae, 0x29, 0x59, 0xd7, 0x0e, 0xaf, 0x26, 0x85, 0x23, 0x69, 0xcb, 0x7a, 0xe4, 0xfc, 0xc2, - 0x8e, 0x7d, 0x41, 0x53, 0xa6, 0x26, 0x11, 0x78, 0x8c, 0xa1, 0xf8, 0xa4, 0x8d, 0xf7, 0x7b, 0x0a, - 0x67, 0xf2, 0x04, 0xce, 0x27, 0x5b, 0x81, 0x75, 0x5e, 0xc2, 0x3a, 0x2f, 0x69, 0x75, 0xc6, 0x91, - 0xf8, 0xbc, 0xd1, 0x3f, 0x2b, 0x5e, 0x6b, 0x0f, 0xfe, 0xe4, 0x87, 0x32, 0x70, 0x61, 0xed, 0x6e, - 0x09, 0x73, 0x49, 0x3a, 0x3c, 0xe4, 0x59, 0xe8, 0x3b, 0x7a, 0x59, 0x28, 0xdc, 0xe3, 0x8f, 0x00, - 0x52, 0xe2, 0xc0, 0xad, 0x82, 0xc9, 0x88, 0x2f, 0xb5, 0x76, 0x6d, 0x9e, 0xa2, 0x52, 0xb0, 0x48, - 0x71, 0x30, 0xfd, 0xf6, 0x1f, 0x17, 0x33, 0x66, 0xaf, 0xaa, 0x48, 0x13, 0x16, 0xf4, 0x6e, 0x91, - 0xe6, 0xfa, 0xfb, 0xb4, 0xd9, 0x9c, 0x2f, 0xe2, 0x8c, 0x7e, 0xfd, 0xe4, 0xb8, 0x78, 0x2d, 0xd1, - 0xbb, 0xa1, 0x0b, 0x00, 0xc3, 0x54, 0x3e, 0xb8, 0x0f, 0xbf, 0xfb, 0x43, 0xf9, 0xc9, 0xc2, 0x54, - 0x8a, 0xb1, 0xba, 0xf1, 0x5b, 0xd9, 0xd8, 0x49, 0x45, 0xaa, 0x30, 0x2a, 0x26, 0xa0, 0x10, 0xdd, - 0x93, 0xd3, 0xec, 0x52, 0xea, 0x34, 0x1b, 0x15, 0x73, 0xd9, 0x94, 0xf4, 0xe4, 0x90, 0xb1, 0xc2, + // 29833 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, 0xc3, 0xe6, + 0xd4, 0xcc, 0x70, 0xc8, 0xd9, 0x19, 0x72, 0x09, 0xee, 0x70, 0x77, 0x76, 0x5e, 0xdb, 0xe8, 0x06, + 0x89, 0x26, 0x01, 0x10, 0x5b, 0x0d, 0x10, 0x3b, 0xda, 0x47, 0x6d, 0xa1, 0x3b, 0x01, 0xd4, 0xa0, + 0xbb, 0xab, 0xb7, 0xaa, 0x9a, 0x20, 0x76, 0x4f, 0x3e, 0x3d, 0x4f, 0x56, 0xc8, 0x7a, 0x9d, 0xa5, + 0xd3, 0x9e, 0x43, 0x27, 0x2b, 0x64, 0x9f, 0xad, 0x38, 0x87, 0x14, 0xb6, 0x64, 0xd9, 0x67, 0x2b, + 0x2c, 0x4b, 0x17, 0x0a, 0x59, 0x56, 0x38, 0x4e, 0x0a, 0x5b, 0x7e, 0xad, 0x2f, 0x20, 0xcb, 0xf2, + 0x0f, 0x07, 0x22, 0x1c, 0x21, 0xf9, 0x22, 0x1c, 0xe1, 0xbd, 0xd0, 0x9d, 0x23, 0xbf, 0xcc, 0xac, + 0xca, 0xac, 0xaa, 0x6e, 0x34, 0x66, 0x38, 0x3a, 0x71, 0x42, 0x7f, 0x48, 0xf4, 0x97, 0xdf, 0xf7, + 0x65, 0x56, 0x3e, 0xbf, 0xfc, 0xf2, 0x7b, 0xc0, 0x0b, 0x01, 0x6d, 0xd2, 0x8e, 0xeb, 0x05, 0x37, + 0x9a, 0x74, 0xcf, 0xae, 0x1f, 0xdd, 0x08, 0x8e, 0x3a, 0xd4, 0xe7, 0xff, 0x5e, 0xef, 0x78, 0x6e, + 0xe0, 0x92, 0x61, 0xfc, 0xb1, 0x30, 0xb7, 0xe7, 0xee, 0xb9, 0x08, 0xb9, 0xc1, 0xfe, 0xe2, 0x85, + 0x0b, 0x97, 0xf6, 0x5c, 0x77, 0xaf, 0x49, 0x6f, 0xe0, 0xaf, 0x9d, 0xee, 0xee, 0x8d, 0x46, 0xd7, + 0xb3, 0x03, 0xc7, 0x6d, 0x8b, 0xf2, 0x62, 0xbc, 0x3c, 0x70, 0x5a, 0xd4, 0x0f, 0xec, 0x56, 0xa7, + 0x17, 0x83, 0x43, 0xcf, 0xee, 0x74, 0xa8, 0x27, 0x6a, 0x5f, 0xb8, 0x16, 0x36, 0xd0, 0x0e, 0x02, + 0x46, 0xc9, 0x98, 0xdf, 0x78, 0x74, 0x53, 0xfd, 0x29, 0x50, 0x6f, 0xf7, 0xf8, 0x16, 0xaf, 0xeb, + 0x07, 0xb4, 0x61, 0x35, 0xe8, 0x23, 0xa7, 0x4e, 0x2d, 0x8f, 0x7e, 0xa3, 0xeb, 0x78, 0xb4, 0x45, + 0xdb, 0x81, 0xa0, 0x7b, 0x3d, 0x9d, 0x4e, 0x36, 0x24, 0xd6, 0x22, 0xe3, 0x17, 0x72, 0x30, 0x76, + 0x9f, 0xd2, 0x4e, 0xa9, 0xe9, 0x3c, 0xa2, 0xe4, 0x45, 0x18, 0x5a, 0xb7, 0x5b, 0x74, 0x3e, 0x73, + 0x39, 0x73, 0x75, 0x6c, 0x69, 0xfa, 0xe4, 0xb8, 0x38, 0xee, 0x53, 0xef, 0x11, 0xf5, 0xac, 0xb6, + 0xdd, 0xa2, 0x26, 0x16, 0x92, 0x4f, 0xc1, 0x18, 0xfb, 0xdf, 0xef, 0xd8, 0x75, 0x3a, 0x9f, 0x45, + 0xcc, 0xc9, 0x93, 0xe3, 0xe2, 0x58, 0x5b, 0x02, 0xcd, 0xa8, 0x9c, 0x54, 0x61, 0x74, 0xf9, 0x71, + 0xc7, 0xf1, 0xa8, 0x3f, 0x3f, 0x74, 0x39, 0x73, 0x75, 0x7c, 0x71, 0xe1, 0x3a, 0xef, 0xa3, 0xeb, + 0xb2, 0x8f, 0xae, 0x6f, 0xca, 0x4e, 0x5c, 0x9a, 0xfd, 0xfd, 0xe3, 0xe2, 0x33, 0x27, 0xc7, 0xc5, + 0x51, 0xca, 0x49, 0x7e, 0xea, 0x4f, 0x8a, 0x19, 0x53, 0xd2, 0x93, 0xb7, 0x61, 0x68, 0xf3, 0xa8, + 0x43, 0xe7, 0xc7, 0x2e, 0x67, 0xae, 0x4e, 0x2d, 0x5e, 0xba, 0xce, 0x87, 0x35, 0x6c, 0x7c, 0xf4, + 0x17, 0xc3, 0x5a, 0xca, 0x9f, 0x1c, 0x17, 0x87, 0x18, 0x8a, 0x89, 0x54, 0xe4, 0x75, 0x18, 0x59, + 0x71, 0xfd, 0xa0, 0x5a, 0x99, 0x07, 0x6c, 0xf2, 0xb9, 0x93, 0xe3, 0xe2, 0xcc, 0xbe, 0xeb, 0x07, + 0x96, 0xd3, 0x78, 0xcd, 0x6d, 0x39, 0x01, 0x6d, 0x75, 0x82, 0x23, 0x53, 0x20, 0x19, 0x8f, 0x61, + 0x52, 0xe3, 0x47, 0xc6, 0x61, 0x74, 0x6b, 0xfd, 0xfe, 0xfa, 0x83, 0xed, 0xf5, 0xc2, 0x33, 0x24, + 0x0f, 0x43, 0xeb, 0x0f, 0x2a, 0xcb, 0x85, 0x0c, 0x19, 0x85, 0x5c, 0x69, 0x63, 0xa3, 0x90, 0x25, + 0x13, 0x90, 0xaf, 0x94, 0x36, 0x4b, 0x4b, 0xa5, 0xda, 0x72, 0x21, 0x47, 0x66, 0x61, 0x7a, 0xbb, + 0xba, 0x5e, 0x79, 0xb0, 0x5d, 0xb3, 0x2a, 0xcb, 0xb5, 0xfb, 0x9b, 0x0f, 0x36, 0x0a, 0x43, 0x64, + 0x0a, 0xe0, 0xfe, 0xd6, 0xd2, 0xb2, 0xb9, 0xbe, 0xbc, 0xb9, 0x5c, 0x2b, 0x0c, 0x93, 0x39, 0x28, + 0x48, 0x12, 0xab, 0xb6, 0x6c, 0x3e, 0xac, 0x96, 0x97, 0x0b, 0x23, 0xf7, 0x86, 0xf2, 0xb9, 0xc2, + 0x90, 0x39, 0xba, 0x4a, 0x6d, 0x9f, 0x56, 0x2b, 0xc6, 0xbf, 0x97, 0x83, 0xfc, 0x1a, 0x0d, 0xec, + 0x86, 0x1d, 0xd8, 0xe4, 0x39, 0x6d, 0x7c, 0xf0, 0x13, 0x95, 0x81, 0x79, 0x31, 0x39, 0x30, 0xc3, + 0x27, 0xc7, 0xc5, 0xcc, 0xeb, 0xea, 0x80, 0xbc, 0x05, 0xe3, 0x15, 0xea, 0xd7, 0x3d, 0xa7, 0xc3, + 0x26, 0xdb, 0x7c, 0x0e, 0xd1, 0x2e, 0x9e, 0x1c, 0x17, 0xcf, 0x35, 0x22, 0xb0, 0xd2, 0x21, 0x2a, + 0x36, 0xa9, 0xc2, 0xc8, 0xaa, 0xbd, 0x43, 0x9b, 0xfe, 0xfc, 0xf0, 0xe5, 0xdc, 0xd5, 0xf1, 0xc5, + 0x67, 0xc5, 0x20, 0xc8, 0x06, 0x5e, 0xe7, 0xa5, 0xcb, 0xed, 0xc0, 0x3b, 0x5a, 0x9a, 0x3b, 0x39, + 0x2e, 0x16, 0x9a, 0x08, 0x50, 0x3b, 0x98, 0xa3, 0x90, 0x5a, 0x34, 0x31, 0x46, 0x4e, 0x9d, 0x18, + 0xcf, 0xff, 0xfe, 0x71, 0x31, 0xc3, 0x06, 0x4c, 0x4c, 0x8c, 0x88, 0x9f, 0x3e, 0x45, 0x16, 0x21, + 0x6f, 0xd2, 0x47, 0x8e, 0xcf, 0xbe, 0x2c, 0x8f, 0x5f, 0x76, 0xfe, 0xe4, 0xb8, 0x48, 0x3c, 0x01, + 0x53, 0x9a, 0x11, 0xe2, 0x2d, 0xbc, 0x09, 0xe3, 0x4a, 0xab, 0x49, 0x01, 0x72, 0x07, 0xf4, 0x88, + 0xf7, 0xb0, 0xc9, 0xfe, 0x24, 0x73, 0x30, 0xfc, 0xc8, 0x6e, 0x76, 0x45, 0x97, 0x9a, 0xfc, 0xc7, + 0xe7, 0xb3, 0x9f, 0xcb, 0xdc, 0x1b, 0xca, 0x8f, 0x16, 0xf2, 0x66, 0xb6, 0x5a, 0x31, 0xfe, 0xee, + 0x10, 0xe4, 0x4d, 0x97, 0x2f, 0x60, 0x72, 0x0d, 0x86, 0x6b, 0x81, 0x1d, 0xc8, 0x61, 0x9a, 0x3d, + 0x39, 0x2e, 0x4e, 0xb3, 0xc5, 0x4d, 0x95, 0xfa, 0x39, 0x06, 0x43, 0xdd, 0xd8, 0xb7, 0x7d, 0x39, + 0x5c, 0x88, 0xda, 0x61, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x15, 0x18, 0x5a, 0x73, 0x1b, 0x54, 0x8c, + 0x18, 0x39, 0x39, 0x2e, 0x4e, 0xb5, 0xdc, 0x86, 0x8a, 0x88, 0xe5, 0xe4, 0x35, 0x18, 0x2b, 0x77, + 0x3d, 0x8f, 0xb6, 0xd9, 0x5c, 0x1f, 0x42, 0xe4, 0xa9, 0x93, 0xe3, 0x22, 0xd4, 0x39, 0xd0, 0x72, + 0x1a, 0x66, 0x84, 0xc0, 0x86, 0xa1, 0x16, 0xd8, 0x5e, 0x40, 0x1b, 0xf3, 0xc3, 0x03, 0x0d, 0x03, + 0x5b, 0x9f, 0x33, 0x3e, 0x27, 0x89, 0x0f, 0x83, 0xe0, 0x44, 0x56, 0x60, 0xfc, 0xae, 0x67, 0xd7, + 0xe9, 0x06, 0xf5, 0x1c, 0xb7, 0x81, 0xe3, 0x9b, 0x5b, 0xba, 0x72, 0x72, 0x5c, 0x3c, 0xbf, 0xc7, + 0xc0, 0x56, 0x07, 0xe1, 0x11, 0xf5, 0x77, 0x8f, 0x8b, 0xf9, 0x8a, 0xd8, 0x6a, 0x4d, 0x95, 0x94, + 0x7c, 0x9d, 0x0d, 0x8e, 0x1f, 0x60, 0xd7, 0xd2, 0xc6, 0xfc, 0xe8, 0xa9, 0x4d, 0x34, 0x44, 0x13, + 0xcf, 0x37, 0x6d, 0x3f, 0xb0, 0x3c, 0x4e, 0x17, 0x6b, 0xa7, 0xca, 0x92, 0x3c, 0x80, 0x7c, 0xad, + 0xbe, 0x4f, 0x1b, 0xdd, 0x26, 0xc5, 0x29, 0x33, 0xbe, 0x78, 0x41, 0x4c, 0x6a, 0x39, 0x9e, 0xb2, + 0x78, 0x69, 0x41, 0xf0, 0x26, 0xbe, 0x80, 0xa8, 0xf3, 0x49, 0x62, 0x7d, 0x3e, 0xff, 0xed, 0x5f, + 0x2c, 0x3e, 0xf3, 0x7d, 0xff, 0xec, 0xf2, 0x33, 0xc6, 0x7f, 0x9e, 0x85, 0x42, 0x9c, 0x09, 0xd9, + 0x85, 0xc9, 0xad, 0x4e, 0xc3, 0x0e, 0x68, 0xb9, 0xe9, 0xd0, 0x76, 0xe0, 0xe3, 0x24, 0xe9, 0xff, + 0x4d, 0x2f, 0x89, 0x7a, 0xe7, 0xbb, 0x48, 0x68, 0xd5, 0x39, 0x65, 0xec, 0xab, 0x74, 0xb6, 0x51, + 0x3d, 0x35, 0xdc, 0xc0, 0x7d, 0x9c, 0x61, 0x67, 0xab, 0x87, 0x6f, 0xfd, 0x3d, 0xea, 0x11, 0x6c, + 0xc5, 0x04, 0x6a, 0x37, 0x76, 0x8e, 0x70, 0x66, 0x0e, 0x3e, 0x81, 0x18, 0x49, 0xca, 0x04, 0x62, + 0x60, 0xe3, 0xff, 0xcc, 0xc0, 0x94, 0x49, 0x7d, 0xb7, 0xeb, 0xd5, 0xe9, 0x0a, 0xb5, 0x1b, 0xd4, + 0x63, 0xd3, 0xff, 0xbe, 0xd3, 0x6e, 0x88, 0x35, 0x85, 0xd3, 0xff, 0xc0, 0x69, 0xab, 0x5b, 0x37, + 0x96, 0x93, 0x4f, 0xc3, 0x68, 0xad, 0xbb, 0x83, 0xa8, 0xd9, 0x68, 0x07, 0xf0, 0xbb, 0x3b, 0x56, + 0x0c, 0x5d, 0xa2, 0x91, 0x1b, 0x30, 0xfa, 0x90, 0x7a, 0x7e, 0xb4, 0x1b, 0xe2, 0xd1, 0xf0, 0x88, + 0x83, 0x54, 0x02, 0x81, 0x45, 0xee, 0x46, 0x3b, 0xb2, 0x38, 0xd4, 0xa6, 0x63, 0xfb, 0x60, 0x34, + 0x55, 0x5a, 0x02, 0xa2, 0x4e, 0x15, 0x89, 0x65, 0xfc, 0x74, 0x16, 0x0a, 0x15, 0x3b, 0xb0, 0x77, + 0x6c, 0x5f, 0xf4, 0xe7, 0xc3, 0x5b, 0x6c, 0x8f, 0x57, 0x3e, 0x14, 0xf7, 0x78, 0xd6, 0xf2, 0x0f, + 0xfd, 0x79, 0x2f, 0xc7, 0x3f, 0x6f, 0x9c, 0x9d, 0xb0, 0xe2, 0xf3, 0xa2, 0x8f, 0x7a, 0xe7, 0xf4, + 0x8f, 0x2a, 0x88, 0x8f, 0xca, 0xcb, 0x8f, 0x8a, 0x3e, 0x85, 0xbc, 0x03, 0x43, 0xb5, 0x0e, 0xad, + 0x8b, 0x4d, 0x44, 0x9e, 0x0b, 0xfa, 0xc7, 0x31, 0x84, 0x87, 0xb7, 0x96, 0x26, 0x04, 0x9b, 0x21, + 0xbf, 0x43, 0xeb, 0x26, 0x92, 0x29, 0x8b, 0xe6, 0x1f, 0xe7, 0x60, 0x2e, 0x8d, 0x4c, 0xfd, 0x8e, + 0x91, 0x3e, 0xdf, 0x71, 0x15, 0xf2, 0xec, 0x08, 0x67, 0xc7, 0x22, 0x6e, 0x17, 0x63, 0x4b, 0x13, + 0xac, 0xc9, 0xfb, 0x02, 0x66, 0x86, 0xa5, 0xe4, 0xc5, 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, 0xf2, 0xb3, 0xe6, 0x27, 0x90, 0xd1, 0x4c, + 0xac, 0x93, 0x1e, 0xde, 0xe2, 0x83, 0xd9, 0x10, 0xbf, 0x55, 0x36, 0x12, 0x87, 0xdc, 0x82, 0xfc, + 0x86, 0xe7, 0x3e, 0x3e, 0xaa, 0x56, 0xfc, 0xf9, 0xc9, 0xcb, 0xb9, 0xab, 0x63, 0x4b, 0x17, 0x4e, + 0x8e, 0x8b, 0xb3, 0x1d, 0x06, 0xb3, 0x9c, 0x86, 0x7a, 0xd2, 0x86, 0x88, 0xf7, 0x86, 0xf2, 0x99, + 0x42, 0xf6, 0xde, 0x50, 0x3e, 0x5b, 0xc8, 0x71, 0xf1, 0xe2, 0xde, 0x50, 0x7e, 0xa8, 0x30, 0x7c, + 0x6f, 0x28, 0x3f, 0x8c, 0x02, 0xc7, 0x58, 0x01, 0xee, 0x0d, 0xe5, 0xc7, 0x0b, 0x13, 0xda, 0x69, + 0x8f, 0x0c, 0x02, 0xb7, 0xee, 0x36, 0xcd, 0xdc, 0x96, 0x59, 0x35, 0x47, 0xca, 0xa5, 0x32, 0xf5, + 0x02, 0x33, 0x57, 0xda, 0xae, 0x99, 0x93, 0x95, 0xa3, 0xb6, 0xdd, 0x72, 0xea, 0xfc, 0xe8, 0x34, + 0x73, 0x77, 0xcb, 0x1b, 0x46, 0x09, 0xa6, 0xa2, 0x6f, 0x59, 0x75, 0xfc, 0x80, 0xdc, 0x80, 0x31, + 0x09, 0x61, 0x1b, 0x5d, 0x2e, 0xf5, 0xab, 0xcd, 0x08, 0xc7, 0xf8, 0xbd, 0x2c, 0x40, 0x54, 0xf2, + 0x94, 0xae, 0x85, 0xcf, 0x6a, 0x6b, 0xe1, 0x5c, 0x7c, 0x2d, 0xf4, 0x5c, 0x05, 0xe4, 0x3d, 0x18, + 0x61, 0x62, 0x41, 0x57, 0x8a, 0x44, 0x17, 0xe2, 0xa4, 0x58, 0xf8, 0xf0, 0xd6, 0xd2, 0x94, 0x20, + 0x1e, 0xf1, 0x11, 0x62, 0x0a, 0x32, 0x65, 0x19, 0xfd, 0xc2, 0x68, 0x34, 0x18, 0x62, 0x01, 0x5d, + 0x85, 0x70, 0x40, 0x45, 0x87, 0xe2, 0xca, 0xe8, 0xc8, 0x41, 0x0e, 0x4b, 0xc9, 0x45, 0x60, 0x03, + 0x2e, 0x3a, 0x75, 0xf4, 0xe4, 0xb8, 0x98, 0xeb, 0x7a, 0x0e, 0x4e, 0x02, 0x72, 0x03, 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, 0x53, 0x7b, 0xe5, 0xba, 0x86, + 0xca, 0xc5, 0xc8, 0xcb, 0xf2, 0x54, 0x6a, 0xf0, 0x32, 0x2b, 0x21, 0x52, 0xea, 0x15, 0x90, 0x5b, + 0xc0, 0x66, 0xa8, 0xe8, 0x7d, 0x10, 0xf5, 0x94, 0xb6, 0x6b, 0x4b, 0xe7, 0x04, 0xa7, 0x49, 0xfb, + 0x50, 0x25, 0x67, 0xd8, 0xe4, 0x2d, 0x60, 0x53, 0x58, 0xf4, 0x3b, 0x11, 0x44, 0x77, 0xcb, 0x1b, + 0xe5, 0xa6, 0xdb, 0x6d, 0xd4, 0xbe, 0xb8, 0x1a, 0x11, 0xef, 0xd5, 0x3b, 0x2a, 0xf1, 0xdd, 0xf2, + 0x06, 0x79, 0x0b, 0x86, 0x4b, 0xdf, 0xec, 0x7a, 0x54, 0xc8, 0x27, 0x13, 0xb2, 0x4e, 0x06, 0x5b, + 0xba, 0x20, 0x08, 0xa7, 0x6d, 0xf6, 0x53, 0x95, 0xeb, 0xb0, 0x9c, 0xd5, 0xbc, 0xb9, 0x5a, 0x13, + 0xb2, 0x07, 0x89, 0x75, 0xcb, 0xe6, 0xaa, 0xd2, 0xec, 0x40, 0xfb, 0x6a, 0x46, 0x45, 0x6e, 0x40, + 0xb6, 0x54, 0xc1, 0x1b, 0xd1, 0xf8, 0xe2, 0x98, 0xac, 0xb6, 0xb2, 0x34, 0x27, 0x48, 0x26, 0x6c, + 0x75, 0x19, 0x64, 0x4b, 0x15, 0xb2, 0x04, 0xc3, 0x6b, 0x47, 0xb5, 0x2f, 0xae, 0x8a, 0xcd, 0x6c, + 0x56, 0xce, 0x6b, 0x06, 0x7b, 0x80, 0xcb, 0xde, 0x8f, 0x5a, 0xdc, 0x3a, 0xf2, 0xbf, 0xd1, 0x54, + 0x5b, 0x8c, 0x68, 0x64, 0x03, 0xc6, 0x4a, 0x8d, 0x96, 0xd3, 0xde, 0xf2, 0xa9, 0x37, 0x3f, 0x8e, + 0x7c, 0xe6, 0x63, 0xed, 0x0e, 0xcb, 0x97, 0xe6, 0x4f, 0x8e, 0x8b, 0x73, 0x36, 0xfb, 0x69, 0x75, + 0x7d, 0xea, 0x29, 0xdc, 0x22, 0x26, 0x64, 0x03, 0x60, 0xcd, 0x6d, 0xef, 0xb9, 0xa5, 0xa0, 0x69, + 0xfb, 0xb1, 0xed, 0x31, 0x2a, 0x08, 0xc5, 0x87, 0x73, 0x2d, 0x06, 0xb3, 0x6c, 0x06, 0x54, 0x18, + 0x2a, 0x3c, 0xc8, 0x1d, 0x18, 0x79, 0xe0, 0xd9, 0xf5, 0x26, 0x9d, 0x9f, 0x44, 0x6e, 0x73, 0x82, + 0x1b, 0x07, 0xca, 0x2f, 0x9d, 0x17, 0x0c, 0x0b, 0x2e, 0x82, 0xd5, 0x6b, 0x0a, 0x47, 0x5c, 0xd8, + 0x06, 0x92, 0x9c, 0x93, 0x29, 0x97, 0x84, 0x4f, 0xa9, 0x97, 0x84, 0x68, 0xd1, 0x97, 0xdd, 0x56, + 0xcb, 0x6e, 0x37, 0x90, 0xf6, 0xe1, 0xa2, 0x72, 0x77, 0x30, 0xbe, 0x01, 0x33, 0x89, 0xce, 0x3a, + 0xe5, 0x7e, 0xf7, 0x2e, 0x4c, 0x57, 0xe8, 0xae, 0xdd, 0x6d, 0x06, 0xe1, 0x49, 0xc2, 0x97, 0x28, + 0xde, 0xb4, 0x1a, 0xbc, 0xc8, 0x92, 0xc7, 0x87, 0x19, 0x47, 0x36, 0xde, 0x81, 0x49, 0xed, 0xf3, + 0xd9, 0x55, 0xa1, 0xd4, 0x6d, 0x38, 0x01, 0x0e, 0x64, 0x26, 0xba, 0x2a, 0xd8, 0x0c, 0x88, 0xc3, + 0x65, 0x46, 0x08, 0xc6, 0xbf, 0xaf, 0x4a, 0x2b, 0x62, 0x27, 0x62, 0xd7, 0x6a, 0xb1, 0x1f, 0x64, + 0x22, 0xd9, 0x29, 0xb1, 0x1f, 0x84, 0xbb, 0xc1, 0x35, 0xbe, 0x36, 0xb3, 0x89, 0xb5, 0x39, 0x2e, + 0x46, 0x22, 0x67, 0x1f, 0xfa, 0x7c, 0x45, 0x86, 0x33, 0x35, 0xf7, 0xe1, 0x67, 0xea, 0x7b, 0x30, + 0xb1, 0x66, 0xb7, 0xed, 0x3d, 0xda, 0x60, 0x5f, 0xc0, 0xf7, 0x9e, 0xb1, 0xa5, 0x67, 0x4f, 0x8e, + 0x8b, 0x17, 0x5a, 0x1c, 0x8e, 0x5f, 0xa9, 0x4e, 0x22, 0x8d, 0x80, 0xdc, 0x94, 0x2b, 0x7b, 0x38, + 0x65, 0x65, 0x4f, 0x8a, 0xda, 0x87, 0x71, 0x65, 0x8b, 0xf5, 0x6c, 0xfc, 0xf6, 0x18, 0x7e, 0x23, + 0x79, 0x0d, 0x46, 0x4c, 0xba, 0xc7, 0x8e, 0x9a, 0x4c, 0x34, 0x48, 0x1e, 0x42, 0xd4, 0x8e, 0xe1, + 0x38, 0x28, 0x67, 0xd0, 0x86, 0xbf, 0xef, 0xec, 0x06, 0xa2, 0x77, 0x42, 0x39, 0x43, 0x80, 0x15, + 0x39, 0x43, 0x40, 0xf4, 0xeb, 0x2c, 0x87, 0xb1, 0xdd, 0xcf, 0xac, 0xd4, 0x44, 0xa7, 0xc9, 0x1e, + 0x36, 0x2b, 0xca, 0x36, 0xe2, 0x69, 0x52, 0x02, 0xc3, 0x26, 0xb7, 0x61, 0xac, 0x54, 0xaf, 0xbb, + 0x5d, 0xe5, 0xce, 0xc8, 0xd7, 0x2d, 0x07, 0xea, 0x2a, 0x92, 0x08, 0x95, 0xd4, 0x60, 0x7c, 0x99, + 0x5d, 0xb4, 0x9c, 0xb2, 0x5d, 0xdf, 0x97, 0x9d, 0x24, 0xf7, 0x30, 0xa5, 0x24, 0x5a, 0xb9, 0x14, + 0x81, 0x75, 0x06, 0x54, 0x95, 0x0c, 0x0a, 0x2e, 0xd9, 0x84, 0xf1, 0x1a, 0xad, 0x7b, 0x34, 0xa8, + 0x05, 0xae, 0x47, 0x63, 0x5b, 0xb2, 0x52, 0xb2, 0x74, 0x49, 0xde, 0xf5, 0x7c, 0x04, 0x5a, 0x3e, + 0x83, 0xaa, 0x5c, 0x15, 0x64, 0x2e, 0xb4, 0xb7, 0x5c, 0xef, 0xa8, 0xb2, 0x24, 0xb6, 0xe9, 0xe8, + 0x4c, 0xe7, 0x60, 0x55, 0x68, 0x67, 0x90, 0xc6, 0x8e, 0x2e, 0xb4, 0x73, 0x2c, 0x1c, 0xa9, 0x4a, + 0x0d, 0x65, 0x2b, 0xb1, 0x69, 0x4f, 0x47, 0xbd, 0x8c, 0x60, 0x65, 0xa4, 0x1a, 0x3e, 0x4a, 0x66, + 0xda, 0x48, 0x09, 0x2c, 0xd2, 0x01, 0x22, 0x47, 0x8d, 0x0b, 0xba, 0x4d, 0xea, 0xfb, 0x62, 0x2f, + 0xbf, 0x18, 0x1b, 0xfc, 0x08, 0x61, 0xe9, 0x65, 0xc1, 0xfc, 0x79, 0x39, 0x0d, 0xc4, 0x3d, 0x8d, + 0x15, 0x2a, 0xf5, 0xa4, 0xf0, 0x26, 0x6f, 0x02, 0x2c, 0x3f, 0x0e, 0xa8, 0xd7, 0xb6, 0x9b, 0xa1, + 0x1e, 0x0c, 0x55, 0x3f, 0x54, 0x40, 0xf5, 0x81, 0x56, 0x90, 0x49, 0x19, 0x26, 0x4b, 0xbe, 0xdf, + 0x6d, 0x51, 0xd3, 0x6d, 0xd2, 0x92, 0xb9, 0x8e, 0xfb, 0xfe, 0xd8, 0xd2, 0xf3, 0x27, 0xc7, 0xc5, + 0x8b, 0x36, 0x16, 0x58, 0x9e, 0xdb, 0xa4, 0x96, 0xed, 0xa9, 0xb3, 0x5b, 0xa7, 0x21, 0x0f, 0x00, + 0x1e, 0x74, 0x68, 0xbb, 0x46, 0x6d, 0xaf, 0xbe, 0x1f, 0xdb, 0xe6, 0xa3, 0x82, 0xa5, 0xe7, 0xc4, + 0x17, 0xce, 0xb9, 0x1d, 0xda, 0xf6, 0x11, 0xa6, 0xb6, 0x2a, 0xc2, 0x24, 0xdb, 0x30, 0x5d, 0x2d, + 0xad, 0x6d, 0xb8, 0x4d, 0xa7, 0x7e, 0x24, 0x24, 0xa7, 0x29, 0xd4, 0x0e, 0x9e, 0x17, 0x5c, 0x63, + 0xa5, 0x7c, 0x7b, 0x72, 0xec, 0x96, 0xd5, 0x41, 0xa8, 0x25, 0xe4, 0xa7, 0x38, 0x17, 0xf2, 0x3e, + 0x9b, 0x83, 0x3e, 0x13, 0x06, 0x37, 0xed, 0x3d, 0x7f, 0x7e, 0x5a, 0xd3, 0x76, 0x95, 0xb6, 0x6b, + 0xd7, 0x95, 0x52, 0x2e, 0xa6, 0x2c, 0xf0, 0x89, 0x88, 0x50, 0x2b, 0xb0, 0xf7, 0x7c, 0x7d, 0x22, + 0x86, 0xd8, 0xe4, 0x1e, 0x40, 0xc5, 0xad, 0x77, 0x5b, 0xb4, 0x1d, 0x54, 0x96, 0xe6, 0x0b, 0xfa, + 0x55, 0x20, 0x2c, 0x88, 0xb6, 0xb6, 0x86, 0x5b, 0xd7, 0x66, 0xa2, 0x42, 0xbd, 0xf0, 0x2e, 0x14, + 0xe2, 0x0d, 0x39, 0xa3, 0x02, 0x6b, 0xb2, 0x30, 0xa5, 0x7c, 0xfd, 0xf2, 0x63, 0xc7, 0x0f, 0x7c, + 0xe3, 0x5b, 0xda, 0x0a, 0x64, 0xbb, 0xc3, 0x7d, 0x7a, 0xb4, 0xe1, 0xd1, 0x5d, 0xe7, 0xb1, 0xd8, + 0xcc, 0x70, 0x77, 0x38, 0xa0, 0x47, 0x56, 0x07, 0xa1, 0xea, 0xee, 0x10, 0xa2, 0x92, 0xcf, 0x40, + 0xfe, 0xfe, 0x5a, 0xed, 0x3e, 0x3d, 0xaa, 0x56, 0xc4, 0x41, 0xc5, 0xc9, 0x5a, 0xbe, 0xc5, 0x48, + 0xb5, 0xb9, 0x16, 0x62, 0x1a, 0x4b, 0xd1, 0x4e, 0xc8, 0x6a, 0x2e, 0x37, 0xbb, 0x7e, 0x40, 0xbd, + 0x6a, 0x45, 0xad, 0xb9, 0xce, 0x81, 0xb1, 0x7d, 0x29, 0x44, 0x35, 0xfe, 0x55, 0x16, 0x77, 0x41, + 0x36, 0xe1, 0xab, 0x6d, 0x3f, 0xb0, 0xdb, 0x75, 0x1a, 0x32, 0xc0, 0x09, 0xef, 0x08, 0x68, 0x6c, + 0xc2, 0x47, 0xc8, 0x7a, 0xd5, 0xd9, 0x81, 0xab, 0x66, 0x55, 0x4a, 0xcd, 0x45, 0xb5, 0xa2, 0xaa, + 0x57, 0x3d, 0x01, 0x8d, 0x55, 0x19, 0x21, 0x93, 0x2b, 0x30, 0x5a, 0x2d, 0xad, 0x95, 0xba, 0xc1, + 0x3e, 0xee, 0xc1, 0x79, 0x2e, 0x9f, 0xb3, 0xd9, 0x6a, 0x77, 0x83, 0x7d, 0x53, 0x16, 0x92, 0x1b, + 0x78, 0xef, 0x69, 0xd3, 0x80, 0xab, 0x61, 0xc5, 0xa1, 0xeb, 0x73, 0x50, 0xec, 0xda, 0xc3, 0x40, + 0xe4, 0x55, 0x18, 0x7e, 0xb8, 0x51, 0xae, 0x56, 0xc4, 0xc5, 0x19, 0x4f, 0xa2, 0x47, 0x9d, 0xba, + 0xde, 0x12, 0x8e, 0x42, 0x96, 0x61, 0xaa, 0x46, 0xeb, 0x5d, 0xcf, 0x09, 0x8e, 0xee, 0x7a, 0x6e, + 0xb7, 0xe3, 0xcf, 0x8f, 0x62, 0x1d, 0xb8, 0xd2, 0x7d, 0x51, 0x62, 0xed, 0x61, 0x91, 0x42, 0x1d, + 0x23, 0x32, 0x7e, 0x27, 0x13, 0x6d, 0x93, 0xe4, 0x8a, 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, 0xc9, 0x71, 0xf1, 0x52, 0x1d, 0x4b, 0x2d, 0x2a, 0x8a, + 0xad, 0x18, 0x97, 0x14, 0xea, 0x8f, 0x30, 0x1e, 0xc6, 0x1f, 0x64, 0xb5, 0xe3, 0x8d, 0x35, 0xcf, + 0xa4, 0x9d, 0xa6, 0x53, 0xc7, 0x1b, 0x3d, 0x7e, 0x68, 0x38, 0xab, 0xb0, 0x79, 0x5e, 0x54, 0xca, + 0x7b, 0x48, 0xe7, 0x9d, 0x42, 0x4d, 0xbe, 0x00, 0x13, 0x4c, 0xd2, 0x10, 0x3f, 0xfd, 0xf9, 0x2c, + 0x76, 0xf6, 0x73, 0xa8, 0x85, 0xf3, 0xa9, 0x17, 0xb2, 0xd1, 0x44, 0x14, 0x95, 0x82, 0x34, 0x60, + 0x7e, 0xd3, 0xb3, 0xdb, 0xbe, 0x13, 0x2c, 0xb7, 0xeb, 0xde, 0x11, 0x4a, 0x46, 0xcb, 0x6d, 0x7b, + 0xa7, 0x49, 0x1b, 0xf8, 0xb9, 0xf9, 0xa5, 0xab, 0x27, 0xc7, 0xc5, 0x97, 0x02, 0x8e, 0x63, 0xd1, + 0x10, 0xc9, 0xa2, 0x1c, 0x4b, 0xe1, 0xdc, 0x93, 0x13, 0x93, 0xa4, 0x64, 0xb7, 0xe2, 0x23, 0x0c, + 0x17, 0x12, 0x50, 0x92, 0x0a, 0x47, 0x83, 0xed, 0x61, 0x6a, 0x33, 0x55, 0x02, 0xe3, 0xff, 0xcd, + 0x44, 0x07, 0x30, 0x79, 0x1b, 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, 0xd1, 0x3f, 0xfc, 0x7f, 0xce, 0xa4, 0x9d, 0xf3, 0x64, 0x09, 0x26, 0xb7, + 0x5d, 0xef, 0x00, 0xc7, 0x57, 0xe9, 0x04, 0x1c, 0xf9, 0x43, 0x59, 0x10, 0xff, 0x20, 0x9d, 0x44, + 0x6d, 0x9b, 0xd2, 0x1b, 0x7a, 0xdb, 0x62, 0x1c, 0x34, 0x02, 0x36, 0x0e, 0x21, 0xc7, 0x70, 0x75, + 0xe0, 0x38, 0x44, 0x4d, 0xd0, 0xa6, 0xb0, 0x8a, 0x6e, 0xfc, 0x57, 0x19, 0xf5, 0x3c, 0x67, 0x9d, + 0x5c, 0x71, 0x5b, 0xb6, 0xd3, 0x56, 0x3e, 0x87, 0x3f, 0x2c, 0x21, 0x34, 0xde, 0x12, 0x05, 0x99, + 0xdc, 0x82, 0x3c, 0xff, 0x15, 0xee, 0xb5, 0xa8, 0xd5, 0x12, 0x84, 0xfa, 0x41, 0x21, 0x11, 0x13, + 0x23, 0x93, 0x3b, 0xeb, 0xc8, 0xfc, 0x76, 0x46, 0x3d, 0x8a, 0x3f, 0xec, 0x61, 0x13, 0x3b, 0x64, + 0xb2, 0x67, 0x39, 0x64, 0x3e, 0xf2, 0x27, 0x7c, 0x5f, 0x06, 0xc6, 0x15, 0x2d, 0x05, 0xfb, 0x86, + 0x0d, 0xcf, 0xfd, 0x80, 0xd6, 0x03, 0xfd, 0x1b, 0x3a, 0x1c, 0x18, 0xfb, 0x86, 0x10, 0xf5, 0x23, + 0x7c, 0x83, 0xf1, 0x17, 0x19, 0x71, 0x47, 0x1a, 0x78, 0x9b, 0xd7, 0xb7, 0xe4, 0xec, 0x59, 0x8e, + 0xc8, 0x2f, 0xc0, 0xb0, 0x49, 0x1b, 0x8e, 0x2f, 0xee, 0x37, 0x33, 0xea, 0x7d, 0x0c, 0x0b, 0x22, + 0xb9, 0xc9, 0x63, 0x3f, 0xd5, 0xf3, 0x0d, 0xcb, 0x99, 0x20, 0x5b, 0xf5, 0xef, 0x34, 0xe9, 0x63, + 0x87, 0x2f, 0x46, 0x71, 0xd4, 0xe2, 0xf1, 0xe6, 0xf8, 0xd6, 0x2e, 0x2b, 0x11, 0x12, 0xb5, 0xba, + 0xf0, 0x34, 0x1a, 0xe3, 0x7d, 0x80, 0xa8, 0x4a, 0x72, 0x1f, 0x0a, 0x62, 0x36, 0x38, 0xed, 0x3d, + 0x2e, 0x48, 0x89, 0x3e, 0x28, 0x9e, 0x1c, 0x17, 0x9f, 0xad, 0x87, 0x65, 0x42, 0xea, 0x54, 0xf8, + 0x26, 0x08, 0x8d, 0xff, 0x30, 0x0b, 0xd9, 0x12, 0x0e, 0xc8, 0x7d, 0x7a, 0x14, 0xd8, 0x3b, 0x77, + 0x9c, 0xa6, 0xb6, 0x98, 0x0e, 0x10, 0x6a, 0xed, 0x3a, 0x9a, 0xba, 0x42, 0x41, 0x66, 0x8b, 0xe9, + 0xbe, 0xb7, 0xf3, 0x06, 0x12, 0x2a, 0x8b, 0xe9, 0xc0, 0xdb, 0x79, 0x23, 0x4e, 0x16, 0x22, 0x12, + 0x03, 0x46, 0xf8, 0xc2, 0x12, 0x73, 0x10, 0x4e, 0x8e, 0x8b, 0x23, 0x7c, 0xfd, 0x99, 0xa2, 0x84, + 0x5c, 0x84, 0x5c, 0x6d, 0x63, 0x5d, 0xec, 0x80, 0xa8, 0x16, 0xf4, 0x3b, 0x6d, 0x93, 0xc1, 0x58, + 0x9d, 0xab, 0x95, 0xd2, 0x06, 0x2a, 0x02, 0x86, 0xa3, 0x3a, 0x9b, 0x0d, 0xbb, 0x13, 0x57, 0x05, + 0x84, 0x88, 0xe4, 0x1d, 0x18, 0xbf, 0x5f, 0x29, 0xaf, 0xb8, 0x3e, 0xdf, 0xbd, 0x46, 0xa2, 0xc9, + 0x7f, 0xd0, 0xa8, 0x5b, 0xa8, 0x89, 0x8f, 0x1f, 0x03, 0x0a, 0xbe, 0xf1, 0xc3, 0x59, 0x18, 0x57, + 0xf4, 0x64, 0xe4, 0x33, 0xe2, 0x81, 0x34, 0xa3, 0xdd, 0x00, 0x14, 0x0c, 0x56, 0xca, 0x95, 0x2a, + 0x2d, 0xb7, 0x41, 0xc5, 0x73, 0x69, 0xa4, 0xc0, 0xc8, 0x0e, 0xa2, 0xc0, 0x78, 0x13, 0x80, 0xcf, + 0x01, 0x6c, 0xb2, 0x22, 0x4e, 0x28, 0x76, 0x12, 0xea, 0xb8, 0x44, 0xc8, 0xe4, 0x21, 0xcc, 0x6e, + 0x7a, 0x5d, 0x3f, 0xa8, 0x1d, 0xf9, 0x01, 0x6d, 0x31, 0x6e, 0x1b, 0xae, 0xdb, 0x14, 0xf3, 0xef, + 0xa5, 0x93, 0xe3, 0xe2, 0x65, 0x34, 0xee, 0xb0, 0x7c, 0x2c, 0xc7, 0x06, 0x58, 0x1d, 0xd7, 0x55, + 0xd5, 0x1a, 0x69, 0x0c, 0x0c, 0x13, 0x26, 0x54, 0xa5, 0x08, 0x3b, 0x59, 0xc4, 0x63, 0x92, 0x50, + 0x75, 0x2b, 0x27, 0x8b, 0x68, 0x65, 0xf2, 0x71, 0x4b, 0x27, 0x31, 0x3e, 0xa3, 0x2a, 0xe4, 0x06, + 0x5d, 0xd8, 0xc6, 0x0f, 0x64, 0xa2, 0x6d, 0xe4, 0xe1, 0x4d, 0xf2, 0x16, 0x8c, 0xf0, 0xc7, 0x3b, + 0xf1, 0xc6, 0x79, 0x2e, 0xbc, 0xd4, 0xaa, 0x2f, 0x7b, 0x5c, 0x13, 0xfe, 0x47, 0xfc, 0x81, 0xff, + 0x19, 0x53, 0x90, 0x84, 0x4a, 0x74, 0x5d, 0x9f, 0x26, 0xb9, 0xa3, 0xba, 0xf8, 0x66, 0x9a, 0x12, + 0xdd, 0xf8, 0xdd, 0x21, 0x98, 0xd2, 0xd1, 0xd4, 0x17, 0xbe, 0xcc, 0x40, 0x2f, 0x7c, 0x5f, 0x80, + 0x3c, 0xeb, 0x0f, 0xa7, 0x4e, 0xa5, 0x44, 0xf6, 0x12, 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, 0x75, 0x18, 0x61, 0xf2, 0x7d, 0xa8, 0x82, 0xc1, 0x56, + 0x32, 0xd1, 0x3f, 0x66, 0xa2, 0xc2, 0x91, 0xc8, 0x36, 0xe4, 0x57, 0x6d, 0x3f, 0xa8, 0x51, 0xda, + 0x1e, 0xe0, 0xed, 0xbe, 0x28, 0xba, 0x6a, 0x16, 0x1f, 0xc6, 0x7d, 0x4a, 0xdb, 0xb1, 0xc7, 0xd7, + 0x90, 0x19, 0xf9, 0x2a, 0x40, 0xd9, 0x6d, 0x07, 0x9e, 0xdb, 0x5c, 0x75, 0xf7, 0xe6, 0x47, 0xf0, + 0xee, 0x7b, 0x29, 0x36, 0x00, 0x11, 0x02, 0xbf, 0xfe, 0x86, 0x0a, 0x9e, 0x3a, 0x2f, 0xb0, 0x9a, + 0xee, 0x9e, 0xba, 0x0e, 0x22, 0x7c, 0x72, 0x07, 0x0a, 0x52, 0xb1, 0xb0, 0xd5, 0xd9, 0xf3, 0x70, + 0x82, 0x8c, 0x46, 0x92, 0x07, 0x7d, 0x1c, 0x58, 0x5d, 0x01, 0x57, 0x77, 0xca, 0x38, 0x0d, 0xf9, + 0x0a, 0x5c, 0x88, 0xc3, 0xe4, 0x28, 0xe7, 0x23, 0x99, 0x5c, 0x65, 0x97, 0x32, 0xef, 0x7b, 0xb1, + 0x30, 0xbe, 0x9b, 0x85, 0x0b, 0x3d, 0x3e, 0x96, 0xad, 0x07, 0x3c, 0xae, 0x95, 0xf5, 0x10, 0x3b, + 0xa5, 0xb9, 0xcd, 0xd1, 0x65, 0xc8, 0x8a, 0x03, 0x6e, 0x68, 0xa9, 0x70, 0x72, 0x5c, 0x9c, 0xd0, + 0xc6, 0x31, 0x5b, 0xad, 0x90, 0x7b, 0x30, 0xc4, 0x86, 0x68, 0x80, 0xa7, 0x73, 0xa9, 0x53, 0x9a, + 0x0a, 0x1c, 0x75, 0xfa, 0xe0, 0xd0, 0x21, 0x0f, 0xf2, 0x19, 0xc8, 0x6d, 0x6e, 0xae, 0xe2, 0xdc, + 0xc9, 0xe1, 0xb7, 0x4f, 0x06, 0x41, 0x53, 0x9b, 0xaa, 0x93, 0x8c, 0xf6, 0x7a, 0x68, 0x69, 0xc1, + 0xd0, 0xc9, 0x97, 0x62, 0x26, 0x3d, 0xaf, 0xf6, 0x1f, 0xe8, 0xc1, 0x2d, 0x7c, 0x3e, 0x82, 0x61, + 0x8d, 0xf1, 0xf3, 0xd9, 0x68, 0x0d, 0xdf, 0x71, 0x9a, 0x01, 0xf5, 0xc8, 0x02, 0x5f, 0x92, 0x91, + 0x70, 0x66, 0x86, 0xbf, 0xc9, 0x7c, 0xb4, 0xbe, 0x39, 0xab, 0x70, 0x21, 0xbf, 0xaa, 0x2c, 0xe4, + 0x1c, 0x2e, 0xe4, 0xa9, 0x9e, 0x4b, 0xf6, 0xd5, 0x94, 0x79, 0x89, 0x0b, 0x31, 0x65, 0xee, 0xbd, + 0x04, 0x93, 0xeb, 0xee, 0xf2, 0xe3, 0x20, 0x44, 0x64, 0x0b, 0x30, 0x6f, 0xea, 0x40, 0xc6, 0xf1, + 0x41, 0xb3, 0x41, 0xbd, 0xcd, 0x7d, 0xbb, 0xad, 0xbd, 0x5d, 0x9b, 0x09, 0x38, 0xc3, 0x5d, 0xa7, + 0x87, 0x3a, 0xee, 0x28, 0xc7, 0x8d, 0xc3, 0x8d, 0xef, 0xcf, 0xca, 0xce, 0x78, 0xb8, 0xf8, 0x94, + 0xbe, 0x91, 0xbe, 0xa1, 0xbd, 0x91, 0xce, 0x86, 0xda, 0xdd, 0xf0, 0xc1, 0x7f, 0xf1, 0x14, 0x3b, + 0x81, 0xff, 0x65, 0x18, 0x26, 0x54, 0x74, 0xd6, 0x0f, 0xa5, 0x46, 0xc3, 0x53, 0xfb, 0xc1, 0x6e, + 0x34, 0x3c, 0x13, 0xa1, 0x9a, 0x59, 0x40, 0xae, 0xaf, 0x59, 0xc0, 0xd7, 0x60, 0xac, 0xdc, 0x6a, + 0x68, 0x8f, 0x95, 0x46, 0x4a, 0xf3, 0xae, 0x87, 0x48, 0x7c, 0x2d, 0x84, 0x4a, 0xcb, 0x7a, 0xab, + 0x91, 0x7c, 0xa2, 0x8c, 0x58, 0x6a, 0x16, 0x05, 0xc3, 0x1f, 0xc5, 0xa2, 0xe0, 0x36, 0x8c, 0x6d, + 0xf9, 0x74, 0xb3, 0xdb, 0x6e, 0xd3, 0x26, 0x4e, 0xab, 0x3c, 0x97, 0xf5, 0xbb, 0x3e, 0xb5, 0x02, + 0x84, 0xaa, 0x0d, 0x08, 0x51, 0xd5, 0x01, 0x1e, 0xed, 0x33, 0xc0, 0xb7, 0x20, 0xbf, 0x41, 0xa9, + 0x87, 0x7d, 0x3a, 0x1e, 0x89, 0x74, 0x1d, 0x4a, 0x3d, 0x8b, 0x75, 0xac, 0x66, 0x69, 0x20, 0x10, + 0x35, 0xf3, 0x84, 0x89, 0x01, 0xcd, 0x13, 0xc8, 0x0b, 0x30, 0xd1, 0xe9, 0xee, 0x34, 0x9d, 0x3a, + 0xf2, 0x15, 0x76, 0x0d, 0xe6, 0x38, 0x87, 0x31, 0xb6, 0x3e, 0xf9, 0x12, 0x4c, 0xe2, 0x1d, 0x27, + 0x9c, 0x72, 0x53, 0xda, 0xab, 0x9e, 0x56, 0xc6, 0x25, 0x9d, 0x3a, 0x03, 0x59, 0x29, 0xe6, 0x37, + 0x3a, 0xa3, 0x85, 0x1a, 0x4c, 0xe9, 0x23, 0xf9, 0x04, 0x1e, 0xf7, 0x42, 0x53, 0x8b, 0x7c, 0x61, + 0xec, 0xde, 0x50, 0x1e, 0x0a, 0xe3, 0xdc, 0xc8, 0xc2, 0x84, 0x8d, 0xf0, 0x9b, 0x4c, 0x72, 0xbf, + 0xbb, 0x43, 0xbd, 0x36, 0x0d, 0xa8, 0x2f, 0x2e, 0x01, 0xbe, 0x39, 0x54, 0xea, 0x74, 0x7c, 0xe3, + 0x3f, 0xcd, 0xc2, 0x68, 0x69, 0xbb, 0x56, 0x6d, 0xef, 0xba, 0xf8, 0x44, 0x17, 0xbe, 0xcc, 0xa8, + 0x4f, 0x74, 0xe1, 0xcb, 0x8c, 0xfa, 0x1e, 0x73, 0x23, 0xe5, 0x1a, 0x87, 0x56, 0xbc, 0xca, 0x35, + 0x4e, 0xbb, 0x80, 0x46, 0x8f, 0x54, 0xb9, 0x01, 0x1e, 0xa9, 0x42, 0x3d, 0xe2, 0xd0, 0xe9, 0x7a, + 0xc4, 0xb7, 0x60, 0xbc, 0xda, 0x0e, 0xe8, 0x9e, 0x17, 0xcd, 0xf4, 0xf0, 0x4a, 0x19, 0x82, 0x55, + 0xd1, 0x5e, 0xc1, 0x66, 0xd3, 0x88, 0xeb, 0x2e, 0x43, 0x9d, 0x25, 0x4e, 0x23, 0xae, 0xe2, 0x8c, + 0xe9, 0x03, 0x24, 0xa2, 0x51, 0x89, 0xcd, 0x11, 0x69, 0x08, 0xc0, 0x85, 0xcf, 0xa9, 0x48, 0x79, + 0xcf, 0x3a, 0x76, 0x69, 0x26, 0xdd, 0x10, 0xc0, 0xf8, 0x91, 0x2c, 0x8c, 0x97, 0x3a, 0x9d, 0xa7, + 0xdc, 0x1c, 0xeb, 0x73, 0xda, 0xf6, 0x2a, 0xef, 0x42, 0xe1, 0x77, 0x0d, 0x64, 0x89, 0xf5, 0xab, + 0x59, 0x98, 0x8e, 0x51, 0xa8, 0xad, 0xcf, 0x0c, 0x68, 0x84, 0x95, 0x1d, 0xd0, 0x08, 0x2b, 0x37, + 0x98, 0x11, 0xd6, 0xd0, 0x47, 0xd9, 0x32, 0x5f, 0x81, 0x5c, 0xa9, 0xd3, 0x89, 0x3f, 0xe6, 0x76, + 0x3a, 0x0f, 0x6f, 0xf1, 0xfb, 0xac, 0xdd, 0xe9, 0x98, 0x0c, 0x43, 0xdb, 0xc7, 0x46, 0x06, 0xdc, + 0xc7, 0x8c, 0xd7, 0x61, 0x0c, 0x79, 0xa1, 0xe9, 0xd3, 0x65, 0xc0, 0xc5, 0x2c, 0xac, 0x9e, 0xb4, + 0xba, 0xc4, 0x32, 0xff, 0x17, 0x19, 0x18, 0xc6, 0xdf, 0x4f, 0xe9, 0x1c, 0x5b, 0xd4, 0xe6, 0x58, + 0x41, 0x99, 0x63, 0x83, 0xcc, 0xae, 0x7f, 0x94, 0x03, 0x28, 0x3f, 0x30, 0x6b, 0x5c, 0xed, 0x41, + 0xee, 0xc0, 0xb4, 0xdd, 0x6c, 0xba, 0x87, 0xb4, 0x61, 0xb9, 0x9e, 0xb3, 0xe7, 0xb4, 0x79, 0xcf, + 0xc9, 0x17, 0x46, 0xbd, 0x48, 0x7d, 0x77, 0x10, 0x45, 0x0f, 0x78, 0x89, 0xca, 0xa7, 0x45, 0x83, + 0x7d, 0xb7, 0x21, 0x2f, 0x70, 0x1a, 0x1f, 0x51, 0x94, 0xc2, 0x67, 0x8d, 0x97, 0xa8, 0x7c, 0xf6, + 0xf1, 0x42, 0x2a, 0xe5, 0x47, 0x8d, 0x8f, 0x28, 0x4a, 0xe1, 0xc3, 0x6f, 0xb1, 0x3e, 0x59, 0x85, + 0x19, 0x84, 0x58, 0x75, 0x8f, 0x36, 0x68, 0x3b, 0x70, 0xec, 0xa6, 0x2f, 0xae, 0xfc, 0xa8, 0x1c, + 0x4a, 0x14, 0xaa, 0x57, 0x1e, 0x2c, 0x2c, 0x47, 0x65, 0xe4, 0x3a, 0x8c, 0xb6, 0xec, 0xc7, 0x96, + 0xbd, 0xc7, 0xdf, 0xda, 0x27, 0xf9, 0x15, 0x51, 0x80, 0xd4, 0x0d, 0xbb, 0x65, 0x3f, 0x2e, 0xed, + 0x51, 0xf6, 0x15, 0xf4, 0x71, 0xc7, 0xf5, 0x95, 0xaf, 0x18, 0x89, 0xbe, 0x22, 0x56, 0xa4, 0x7e, + 0x85, 0x28, 0x12, 0x5f, 0x61, 0xfc, 0x4a, 0x06, 0x9e, 0xad, 0x62, 0x2b, 0x82, 0xa3, 0x32, 0x6d, + 0x07, 0xd4, 0xdb, 0xa0, 0x5e, 0xcb, 0xc1, 0x97, 0xc7, 0x1a, 0x0d, 0xc8, 0x8b, 0x90, 0x2b, 0x99, + 0xeb, 0x62, 0xfe, 0xf2, 0x9d, 0x55, 0x7b, 0x07, 0x66, 0xa5, 0xa1, 0x16, 0x21, 0x7b, 0x8a, 0x7a, + 0xb0, 0x04, 0x13, 0x25, 0xdf, 0x77, 0xf6, 0xda, 0x2d, 0x6e, 0xc3, 0x9e, 0xd3, 0x5e, 0x9a, 0x05, + 0x3c, 0xa1, 0xd7, 0x56, 0x49, 0x8c, 0xff, 0x2c, 0x03, 0x33, 0xa5, 0x4e, 0x47, 0x6f, 0xb2, 0x6e, + 0xe5, 0x90, 0x19, 0xdc, 0xca, 0xc1, 0x81, 0x29, 0xed, 0x73, 0xf9, 0x94, 0x8a, 0xc4, 0xc2, 0x3e, + 0x3d, 0xc3, 0x9b, 0xdd, 0x09, 0x41, 0x96, 0xaf, 0x3f, 0xd1, 0xc5, 0x18, 0x1b, 0xff, 0xee, 0x28, + 0xee, 0x21, 0x62, 0xb7, 0x15, 0x76, 0x78, 0x99, 0x14, 0x3b, 0xbc, 0x37, 0x41, 0x91, 0x25, 0x54, + 0x1d, 0xaa, 0x22, 0x49, 0xa9, 0xf7, 0xef, 0x08, 0x99, 0x1c, 0xc4, 0x2d, 0xf2, 0x72, 0xf8, 0x35, + 0x2f, 0xc6, 0x17, 0xf0, 0x13, 0x31, 0xc6, 0x5b, 0x01, 0x52, 0x6d, 0xe3, 0xb3, 0x21, 0xad, 0x1d, + 0x38, 0x9d, 0x87, 0xd4, 0x73, 0x76, 0x8f, 0xc4, 0x02, 0xc0, 0xce, 0x77, 0x44, 0xa9, 0xe5, 0x1f, + 0x38, 0x1d, 0x76, 0x41, 0x77, 0x76, 0x8f, 0xcc, 0x14, 0x1a, 0xf2, 0x1e, 0x8c, 0x9a, 0xf4, 0xd0, + 0x73, 0x02, 0x69, 0x67, 0x32, 0x15, 0xaa, 0x93, 0x10, 0xca, 0xd7, 0x82, 0xc7, 0x7f, 0xa8, 0xbb, + 0xa2, 0x28, 0x27, 0x8b, 0x5c, 0x1c, 0xe0, 0xf6, 0x24, 0x93, 0xd1, 0xd7, 0x96, 0xb6, 0x6b, 0xbd, + 0xa4, 0x01, 0x72, 0x0d, 0x86, 0x51, 0xa6, 0x10, 0x92, 0x32, 0xfa, 0x67, 0xa0, 0x64, 0xa9, 0x0a, + 0x3c, 0x88, 0x41, 0x2e, 0x01, 0x84, 0xef, 0x72, 0xfe, 0x7c, 0x1e, 0x65, 0x58, 0x05, 0x12, 0x17, + 0x88, 0xc6, 0xce, 0x24, 0x10, 0xad, 0x42, 0xc1, 0xe4, 0xae, 0x5e, 0x8d, 0x52, 0x07, 0x1f, 0x7f, + 0xfc, 0x79, 0xc0, 0x95, 0x7c, 0xf9, 0xe4, 0xb8, 0xf8, 0x9c, 0x70, 0x03, 0x6b, 0x58, 0x76, 0x87, + 0xbf, 0x19, 0x69, 0xdb, 0x48, 0x9c, 0x92, 0xbc, 0x09, 0x43, 0x6c, 0xeb, 0x15, 0xb6, 0x7b, 0x52, + 0x89, 0x1e, 0xed, 0xc6, 0x7c, 0x71, 0xd6, 0x5d, 0x6d, 0x4f, 0x40, 0x12, 0x62, 0xc1, 0x94, 0x3e, + 0xdd, 0x85, 0x19, 0xc7, 0x7c, 0xd4, 0x9f, 0x7a, 0xb9, 0xd0, 0xac, 0x0b, 0x98, 0x55, 0x47, 0xa0, + 0xba, 0x02, 0x62, 0x8b, 0x74, 0x19, 0xf2, 0x9b, 0xe5, 0x8d, 0x0d, 0xd7, 0x0b, 0xf8, 0x45, 0x20, + 0x3a, 0x59, 0x18, 0xcc, 0xb4, 0xdb, 0x7b, 0x94, 0x9f, 0xc5, 0x41, 0xbd, 0x63, 0x75, 0x18, 0x9a, + 0x7a, 0x16, 0x4b, 0xd2, 0x8f, 0xcf, 0x6e, 0xef, 0x57, 0xb3, 0xf0, 0x62, 0x28, 0x15, 0x3d, 0xf0, + 0x6a, 0xa5, 0xb5, 0xd5, 0x6a, 0x63, 0x43, 0x28, 0x11, 0x36, 0x3c, 0xf7, 0x91, 0xd3, 0xa0, 0xde, + 0xc3, 0x9b, 0xa7, 0x9c, 0xe9, 0xab, 0x7c, 0x99, 0xf3, 0x17, 0x88, 0xac, 0x66, 0xe1, 0xa4, 0x08, + 0x9f, 0x62, 0x7b, 0xea, 0x74, 0x12, 0x0f, 0x12, 0x2b, 0xcf, 0x98, 0x11, 0x03, 0xf2, 0x03, 0x19, + 0x38, 0x9f, 0xde, 0x10, 0xa1, 0x58, 0x2a, 0xca, 0x0b, 0x6c, 0x8f, 0xd6, 0x2e, 0xbd, 0x72, 0x72, + 0x5c, 0x7c, 0xd1, 0xb7, 0x5b, 0x4d, 0xcb, 0x69, 0xf0, 0xda, 0x9c, 0x3a, 0xb5, 0x3a, 0x02, 0x41, + 0xab, 0xb7, 0x47, 0x4d, 0x9f, 0x07, 0x79, 0xb4, 0xcf, 0x67, 0x96, 0x00, 0xf2, 0x52, 0xc9, 0x6b, + 0xfc, 0x46, 0x06, 0x94, 0x25, 0x98, 0x37, 0x69, 0xc3, 0xf1, 0x68, 0x3d, 0x10, 0xc7, 0xbb, 0xf0, + 0xcf, 0xe2, 0xb0, 0x98, 0x41, 0x1b, 0xc2, 0xc8, 0xbb, 0x30, 0x2a, 0x8e, 0x21, 0xb1, 0xed, 0xca, + 0xa5, 0x2b, 0xd4, 0xc7, 0xdc, 0x91, 0x2f, 0x71, 0x84, 0x49, 0x22, 0xb6, 0xeb, 0xdf, 0xdb, 0xde, + 0x2c, 0x37, 0x6d, 0xa7, 0xe5, 0x8b, 0xb3, 0x04, 0xbb, 0xf5, 0x83, 0xc3, 0xc0, 0xaa, 0x23, 0x54, + 0xdd, 0xf5, 0x43, 0x54, 0xe3, 0xae, 0xd4, 0x5e, 0x9f, 0x62, 0x95, 0x59, 0x84, 0xe1, 0x87, 0x91, + 0x16, 0x6b, 0x69, 0xec, 0xe4, 0xb8, 0xc8, 0xa7, 0x8b, 0xc9, 0xe1, 0xc6, 0x97, 0x61, 0x2c, 0x9c, + 0xba, 0x8c, 0x17, 0xfb, 0x81, 0xbc, 0x26, 0x39, 0x2f, 0x36, 0x89, 0x4d, 0x84, 0x32, 0x51, 0x6f, + 0xb9, 0xdd, 0x40, 0x84, 0x2c, 0x22, 0x60, 0xf7, 0xd0, 0x76, 0x03, 0x67, 0xba, 0xfa, 0x75, 0x02, + 0xcd, 0xf8, 0xb1, 0x0c, 0x4c, 0xe9, 0x93, 0x95, 0x5c, 0x87, 0x11, 0xe1, 0x78, 0x95, 0x41, 0x55, + 0x20, 0xe3, 0x31, 0xc2, 0x5d, 0xae, 0x34, 0x47, 0x2b, 0x81, 0xc5, 0xa4, 0x45, 0xc1, 0x41, 0x88, + 0x4a, 0x28, 0x2d, 0xd6, 0x39, 0xc8, 0x94, 0x65, 0xc4, 0x60, 0x57, 0x45, 0xbf, 0xdb, 0x0c, 0xd4, + 0x17, 0x22, 0x0f, 0x21, 0xa6, 0x28, 0x31, 0xca, 0x30, 0xc2, 0x37, 0xd4, 0x98, 0xa9, 0x59, 0xe6, + 0x0c, 0xa6, 0x66, 0xc6, 0x71, 0x06, 0xa0, 0x56, 0x5b, 0xb9, 0x4f, 0x8f, 0x36, 0x6c, 0x07, 0x4f, + 0x6d, 0x7e, 0x78, 0xdd, 0x17, 0x2b, 0x77, 0x42, 0x3c, 0x69, 0xf2, 0x83, 0xee, 0x80, 0x1e, 0x69, + 0x4f, 0x9a, 0x12, 0x15, 0x4f, 0x48, 0xcf, 0x79, 0x64, 0x07, 0x94, 0x11, 0x66, 0x91, 0x90, 0x9f, + 0x90, 0x1c, 0x1a, 0xa3, 0x54, 0x90, 0xc9, 0x57, 0x61, 0x2a, 0xfa, 0x15, 0x3e, 0xcc, 0x4e, 0x85, + 0xbb, 0x83, 0x5e, 0xb8, 0x74, 0xe9, 0xe4, 0xb8, 0xb8, 0xa0, 0x70, 0x8d, 0x3f, 0xd9, 0xc6, 0x98, + 0x19, 0xbf, 0x94, 0x41, 0x73, 0x04, 0xf9, 0x81, 0x57, 0x60, 0x28, 0x34, 0xa0, 0x9d, 0x10, 0x5b, + 0xaf, 0xfe, 0xf8, 0x84, 0xe5, 0x4c, 0xc8, 0x8a, 0xbe, 0x04, 0x0f, 0x2c, 0xfd, 0x0b, 0x58, 0x29, + 0xb9, 0x0b, 0xa3, 0x03, 0xb5, 0x19, 0x27, 0x56, 0x4a, 0x5b, 0x25, 0x35, 0x8e, 0xc2, 0xbd, 0xed, + 0xcd, 0x4f, 0xee, 0x28, 0xfc, 0x64, 0x16, 0xa6, 0x59, 0xbf, 0x96, 0xba, 0xc1, 0xbe, 0xeb, 0x39, + 0xc1, 0xd1, 0x53, 0xab, 0x4b, 0x7d, 0x5b, 0xbb, 0x88, 0x2d, 0xc8, 0x23, 0x4c, 0xfd, 0xb6, 0x81, + 0x54, 0xaa, 0xff, 0xdd, 0x30, 0xcc, 0xa6, 0x50, 0x91, 0xd7, 0xb4, 0xe7, 0x8e, 0x79, 0xe9, 0x58, + 0xfd, 0xdd, 0xe3, 0xe2, 0x84, 0x44, 0xdf, 0x8c, 0x1c, 0xad, 0x17, 0x75, 0xdb, 0x1e, 0xde, 0x53, + 0xf8, 0xfa, 0xa1, 0xda, 0xf6, 0xe8, 0x16, 0x3d, 0xd7, 0x60, 0xd8, 0x74, 0x9b, 0x54, 0xda, 0xb3, + 0xa1, 0x98, 0xe5, 0x31, 0x80, 0xf6, 0x7e, 0xcf, 0x00, 0x64, 0x05, 0x46, 0xd9, 0x1f, 0x6b, 0x76, + 0x47, 0xbc, 0x4c, 0x91, 0x50, 0x15, 0x80, 0xd0, 0x8e, 0xd3, 0xde, 0x53, 0xb5, 0x01, 0x4d, 0x6a, + 0xb5, 0xec, 0x8e, 0x26, 0x0f, 0x72, 0x44, 0x4d, 0xab, 0x90, 0xef, 0xad, 0x55, 0xc8, 0x9c, 0xaa, + 0x55, 0xd8, 0x05, 0xa8, 0x39, 0x7b, 0x6d, 0xa7, 0xbd, 0x57, 0x6a, 0xee, 0x09, 0xf7, 0xf4, 0x6b, + 0xbd, 0x47, 0xe1, 0x7a, 0x84, 0x8c, 0x13, 0xf7, 0x59, 0x7c, 0x3e, 0xe6, 0x30, 0xcb, 0x6e, 0xee, + 0x69, 0x6e, 0x34, 0x0a, 0x67, 0xb2, 0x0e, 0x50, 0xaa, 0x07, 0xce, 0x23, 0x36, 0x85, 0x7d, 0x21, + 0xbc, 0xc9, 0x26, 0x97, 0x4b, 0xf7, 0xe9, 0x11, 0x5e, 0x38, 0xe4, 0x43, 0x9c, 0x8d, 0xa8, 0x6c, + 0x25, 0x68, 0x3e, 0x12, 0x11, 0x07, 0xd2, 0x81, 0x73, 0xa5, 0x46, 0xc3, 0x61, 0xdf, 0x60, 0x37, + 0x37, 0x79, 0x60, 0x01, 0x64, 0x3d, 0x91, 0xce, 0xfa, 0x9a, 0x60, 0xfd, 0x82, 0x1d, 0x52, 0x59, + 0x32, 0x1e, 0x41, 0xac, 0x9a, 0x74, 0xc6, 0x46, 0x0d, 0xa6, 0xf4, 0x8f, 0xd7, 0xdd, 0xea, 0x27, + 0x20, 0x6f, 0xd6, 0x4a, 0x56, 0x6d, 0xa5, 0x74, 0xb3, 0x90, 0x21, 0x05, 0x98, 0x10, 0xbf, 0x16, + 0xad, 0xc5, 0x37, 0x6e, 0x17, 0xb2, 0x1a, 0xe4, 0x8d, 0x9b, 0x8b, 0x85, 0xdc, 0x42, 0x76, 0x3e, + 0x13, 0xf3, 0x68, 0x1b, 0x2d, 0xe4, 0xb9, 0xca, 0xd5, 0xf8, 0xb5, 0x0c, 0xe4, 0x65, 0xdb, 0xc9, + 0x6d, 0xc8, 0xd5, 0x6a, 0x2b, 0x31, 0x1f, 0xb4, 0xe8, 0x94, 0xe1, 0xfb, 0xa9, 0xef, 0xab, 0x86, + 0xc6, 0x8c, 0x80, 0xd1, 0x6d, 0xae, 0xd6, 0x84, 0xe4, 0x21, 0xe9, 0xa2, 0xcd, 0x9b, 0xd3, 0xa5, + 0x38, 0xe6, 0xdc, 0x86, 0xdc, 0xbd, 0xed, 0x4d, 0x71, 0xb5, 0x92, 0x74, 0xd1, 0x7e, 0xca, 0xe9, + 0x3e, 0x38, 0x54, 0x77, 0x79, 0x46, 0x60, 0x98, 0x30, 0xae, 0x4c, 0x64, 0x7e, 0xe8, 0xb6, 0xdc, + 0xd0, 0x97, 0x5c, 0x1c, 0xba, 0x0c, 0x62, 0x8a, 0x12, 0x26, 0x80, 0xac, 0xba, 0x75, 0xbb, 0x29, + 0x4e, 0x6f, 0x14, 0x40, 0x9a, 0x0c, 0x60, 0x72, 0xb8, 0xf1, 0x3b, 0x19, 0x28, 0xa0, 0x98, 0x86, + 0x86, 0xc2, 0xee, 0x01, 0x6d, 0x3f, 0xbc, 0x49, 0x5e, 0x97, 0x4b, 0x2e, 0x13, 0xaa, 0xb7, 0x86, + 0x71, 0xc9, 0xc5, 0xde, 0xc7, 0xc4, 0xb2, 0x53, 0xdc, 0xf5, 0xb3, 0x83, 0xbb, 0xf9, 0x9e, 0xe2, + 0xae, 0x5f, 0x84, 0x61, 0x6c, 0x8e, 0xd8, 0x1c, 0xb1, 0xe5, 0x01, 0x03, 0x98, 0x1c, 0xae, 0xec, + 0x4d, 0x3f, 0x9d, 0x4d, 0x7c, 0xc3, 0xe2, 0x27, 0xca, 0x55, 0x56, 0xff, 0xb8, 0x81, 0xf6, 0xeb, + 0xf7, 0x61, 0x2e, 0xde, 0x25, 0xa8, 0x7a, 0x2c, 0xc1, 0xb4, 0x0e, 0x97, 0x5a, 0xc8, 0x0b, 0xa9, + 0x75, 0x3d, 0x5c, 0x34, 0xe3, 0xf8, 0xc6, 0xff, 0x91, 0x81, 0x31, 0xfc, 0xd3, 0xec, 0x36, 0xd1, + 0x60, 0xab, 0xb4, 0x5d, 0x13, 0x0a, 0x11, 0x55, 0x98, 0xb3, 0x0f, 0x7d, 0x4b, 0x68, 0x4f, 0xb4, + 0x3d, 0x26, 0x44, 0x16, 0xa4, 0xfc, 0xfd, 0x40, 0xaa, 0xe2, 0x42, 0x52, 0xfe, 0xd0, 0xe0, 0xc7, + 0x48, 0x05, 0x32, 0x9a, 0x79, 0x6e, 0xd7, 0xd8, 0xf4, 0x53, 0x2d, 0x28, 0x90, 0xce, 0x6d, 0xea, + 0x66, 0x9e, 0x1c, 0x0d, 0x0d, 0x28, 0xb6, 0x6b, 0x25, 0x73, 0x5d, 0x33, 0xa0, 0x60, 0x6d, 0xd4, + 0xb4, 0x51, 0x02, 0xc9, 0xf8, 0xf9, 0xf1, 0x78, 0x07, 0x8a, 0x03, 0xef, 0x8c, 0x6b, 0xe3, 0x2d, + 0x18, 0x2e, 0x35, 0x9b, 0xee, 0xa1, 0xd8, 0x25, 0xe4, 0x7d, 0x35, 0xec, 0x3f, 0x7e, 0x9e, 0xa1, + 0x32, 0x4f, 0x73, 0xff, 0x63, 0x00, 0x52, 0x86, 0xb1, 0xd2, 0x76, 0xad, 0x5a, 0xad, 0x6c, 0x6e, + 0x72, 0x57, 0xa7, 0xdc, 0xd2, 0xcb, 0xb2, 0x7f, 0x1c, 0xa7, 0x61, 0xc5, 0xdf, 0xf0, 0x23, 0xf9, + 0x3d, 0xa2, 0x23, 0xef, 0x00, 0xdc, 0x73, 0x9d, 0x36, 0x57, 0x5e, 0x8a, 0x8f, 0x67, 0xf7, 0xee, + 0xf1, 0x0f, 0x5c, 0xa7, 0x2d, 0xb4, 0x9d, 0xac, 0xed, 0x11, 0x92, 0xa9, 0xfc, 0xcd, 0x7a, 0x7a, + 0xc9, 0xe5, 0x46, 0x58, 0xc3, 0x51, 0x4f, 0xef, 0xb8, 0x09, 0x2d, 0x9b, 0x44, 0x23, 0x2d, 0x98, + 0xae, 0x75, 0xf7, 0xf6, 0x28, 0xdb, 0xd9, 0x85, 0x16, 0x69, 0x44, 0x5c, 0xa0, 0xc3, 0x00, 0x33, + 0xfc, 0x3e, 0xc2, 0xae, 0x40, 0xfe, 0xd2, 0x6b, 0x6c, 0x22, 0x7f, 0xe7, 0xb8, 0x28, 0x6c, 0x03, + 0x98, 0xa8, 0xe6, 0x4b, 0xfa, 0xa4, 0x0e, 0x29, 0xce, 0x9b, 0x3c, 0x80, 0x91, 0xbb, 0x4e, 0xb0, + 0xd2, 0xdd, 0x11, 0xae, 0x3b, 0x2f, 0xf4, 0x59, 0x34, 0x1c, 0x91, 0x3f, 0x4e, 0xed, 0x39, 0xc1, + 0x7e, 0x57, 0x75, 0x9e, 0x10, 0x6c, 0xc8, 0x36, 0xe4, 0xcb, 0x8e, 0x57, 0x6f, 0xd2, 0x72, 0x55, + 0x9c, 0xfd, 0x2f, 0xf6, 0x61, 0x29, 0x51, 0x79, 0xbf, 0xd4, 0xf1, 0x57, 0xdd, 0x51, 0x65, 0x01, + 0x89, 0x41, 0xfe, 0xed, 0x0c, 0x3c, 0x1b, 0xb6, 0xbe, 0xb4, 0x47, 0xdb, 0xc1, 0x9a, 0x1d, 0xd4, + 0xf7, 0xa9, 0x27, 0x7a, 0x69, 0xac, 0x5f, 0x2f, 0x7d, 0x3e, 0xd1, 0x4b, 0x57, 0xa3, 0x5e, 0xb2, + 0x19, 0x33, 0xab, 0xc5, 0xb9, 0x25, 0xfb, 0xac, 0x5f, 0xad, 0xc4, 0x02, 0x88, 0x5e, 0x1b, 0x85, + 0xeb, 0xe7, 0xcb, 0x7d, 0x3e, 0x38, 0x42, 0x16, 0x2e, 0x1b, 0xe1, 0x6f, 0xcd, 0xe6, 0x30, 0x84, + 0x92, 0xfb, 0xd2, 0x4f, 0x8e, 0x4b, 0x25, 0x97, 0xfb, 0xf0, 0xe6, 0xbe, 0x73, 0xb3, 0x7d, 0x3c, + 0x62, 0xf9, 0x68, 0xaf, 0xda, 0x3b, 0x42, 0x10, 0x39, 0x65, 0xb4, 0x57, 0xed, 0x68, 0xb4, 0x9b, + 0x76, 0x7c, 0xb4, 0x57, 0xed, 0x1d, 0x52, 0xe6, 0xce, 0xbd, 0xdc, 0x13, 0xf4, 0x52, 0x3f, 0x6e, + 0xe5, 0x0d, 0x7e, 0x32, 0xa7, 0x38, 0xf9, 0x7e, 0x19, 0xc6, 0x6a, 0x1d, 0xbb, 0x4e, 0x9b, 0xce, + 0x6e, 0x20, 0x9e, 0x9f, 0x5f, 0xea, 0xc3, 0x2a, 0xc4, 0x15, 0x4f, 0x97, 0xf2, 0xa7, 0x7a, 0x4d, + 0x0a, 0x71, 0x58, 0x0b, 0x37, 0x37, 0xd6, 0xe6, 0xa7, 0x4f, 0x6d, 0xe1, 0xe6, 0xc6, 0x9a, 0x90, + 0x39, 0x3a, 0x2d, 0x4d, 0xe6, 0xd8, 0x58, 0x23, 0x1d, 0x98, 0xda, 0xa4, 0x9e, 0x67, 0xef, 0xba, + 0x5e, 0x8b, 0x6b, 0x2d, 0xb9, 0x77, 0xd1, 0xb5, 0x7e, 0xfc, 0x34, 0x02, 0xae, 0xac, 0x0b, 0x24, + 0xcc, 0x8a, 0xab, 0x3a, 0x63, 0xfc, 0x59, 0x9f, 0x2c, 0x39, 0xc1, 0x4e, 0xb7, 0x7e, 0x40, 0x83, + 0xf9, 0x99, 0x53, 0xfb, 0x24, 0xc4, 0xe5, 0x7d, 0xb2, 0x23, 0x7f, 0xaa, 0x7d, 0x12, 0xe2, 0x18, + 0xbf, 0x99, 0x83, 0x0b, 0x3d, 0xba, 0x80, 0xac, 0xcb, 0x2d, 0x37, 0xa3, 0xe9, 0xae, 0x7b, 0xa0, + 0x5f, 0x3f, 0x75, 0x17, 0x5e, 0x85, 0xc2, 0xf2, 0x7d, 0x94, 0xd5, 0xf9, 0xf3, 0x4d, 0xb9, 0x24, + 0x0f, 0x2b, 0xd4, 0xaf, 0xd2, 0x03, 0xb4, 0xc6, 0x94, 0xcf, 0x3e, 0x75, 0xcd, 0xed, 0x38, 0x41, + 0xb9, 0xf0, 0xfd, 0x59, 0x18, 0xc2, 0x83, 0x33, 0x16, 0x6c, 0x29, 0x73, 0xa6, 0x60, 0x4b, 0x5f, + 0x80, 0x89, 0xe5, 0xfb, 0xfc, 0x26, 0xbd, 0x62, 0xfb, 0xfb, 0x62, 0x5b, 0x47, 0xe3, 0x06, 0x7a, + 0x60, 0x89, 0x8b, 0xf7, 0xbe, 0xad, 0xc9, 0xac, 0x1a, 0x05, 0xd9, 0x82, 0x59, 0xde, 0x36, 0x67, + 0xd7, 0xa9, 0xf3, 0x98, 0x2d, 0x8e, 0xdd, 0x14, 0x7b, 0xfc, 0x8b, 0x27, 0xc7, 0xc5, 0x22, 0x3d, + 0x40, 0x3b, 0x53, 0x51, 0x6e, 0xf9, 0x88, 0xa0, 0x1a, 0x9c, 0xa6, 0xd0, 0xab, 0x81, 0x24, 0xcc, + 0x31, 0xac, 0x90, 0xd5, 0xc6, 0xea, 0x66, 0xb8, 0x1c, 0xc9, 0xf8, 0xf3, 0x61, 0x58, 0xe8, 0xbd, + 0x3d, 0x93, 0x2f, 0xea, 0x03, 0x78, 0xe5, 0xd4, 0x0d, 0xfd, 0xf4, 0x31, 0xfc, 0x12, 0xcc, 0x2d, + 0xb7, 0x03, 0xea, 0x75, 0x3c, 0x47, 0x86, 0x0e, 0x59, 0x71, 0x7d, 0x69, 0xd7, 0x8b, 0x06, 0xb6, + 0x34, 0x2c, 0x17, 0x1a, 0x55, 0xb4, 0x32, 0x56, 0x58, 0xa5, 0x72, 0x20, 0xcb, 0x30, 0xa5, 0xc0, + 0x9b, 0xdd, 0x3d, 0xf5, 0x4d, 0x4a, 0xe5, 0xd9, 0xec, 0xaa, 0x46, 0x8f, 0x31, 0x22, 0xb4, 0x1d, + 0x66, 0x57, 0xc6, 0xfa, 0xbd, 0xed, 0xfb, 0x35, 0x31, 0x9c, 0xdc, 0x76, 0x18, 0xa1, 0xd6, 0x07, + 0x87, 0x07, 0xda, 0xfe, 0x1a, 0x21, 0x2f, 0xfc, 0x52, 0x4e, 0xcc, 0xa8, 0x17, 0x21, 0x57, 0xeb, + 0xee, 0xa8, 0x2f, 0x6d, 0xbe, 0x76, 0xc0, 0xb1, 0x52, 0xf2, 0x39, 0x00, 0x93, 0x76, 0x5c, 0xdf, + 0x09, 0x5c, 0xef, 0x48, 0x75, 0x5e, 0xf3, 0x42, 0xa8, 0x6e, 0x5f, 0x2f, 0xa1, 0x64, 0x05, 0xa6, + 0xa3, 0x5f, 0x0f, 0x0e, 0xdb, 0x42, 0x83, 0x3c, 0xc6, 0xb5, 0x2b, 0x11, 0xb9, 0xe5, 0xb2, 0x32, + 0xf5, 0xc8, 0x8e, 0x91, 0x91, 0x45, 0xc8, 0x6f, 0xbb, 0xde, 0xc1, 0x2e, 0x1b, 0xe3, 0xa1, 0x48, + 0xa8, 0x38, 0x14, 0x30, 0xf5, 0xf0, 0x94, 0x78, 0x6c, 0xb9, 0x2c, 0xb7, 0x1f, 0x39, 0x9e, 0x8b, + 0xef, 0x78, 0xaa, 0xcd, 0x08, 0x8d, 0xc0, 0x9a, 0xdb, 0x70, 0x04, 0x26, 0xd7, 0x60, 0xb8, 0x54, + 0x0f, 0x5c, 0x4f, 0x18, 0x8c, 0xf0, 0x99, 0xc2, 0x00, 0xda, 0x4c, 0x61, 0x00, 0xd6, 0x89, 0x26, + 0xdd, 0x15, 0x6f, 0x3a, 0xd8, 0x89, 0x1e, 0xdd, 0xd5, 0x7c, 0xa2, 0xe9, 0x2e, 0x13, 0x8a, 0x4c, + 0xba, 0x8b, 0x8a, 0x0f, 0x2d, 0x94, 0xd8, 0x6e, 0x42, 0x65, 0x26, 0xd0, 0x8c, 0xdf, 0x1f, 0xeb, + 0x39, 0xe5, 0xd9, 0x29, 0x74, 0xb6, 0x29, 0xbf, 0x6a, 0x0f, 0x30, 0xe5, 0x5f, 0x0b, 0xad, 0xf6, + 0xd5, 0x40, 0x00, 0x08, 0x51, 0x8f, 0x41, 0x8e, 0xb3, 0xf0, 0xcb, 0xf9, 0xb3, 0x4c, 0x22, 0xd1, + 0x49, 0xd9, 0x41, 0x3b, 0x29, 0x37, 0x50, 0x27, 0x91, 0x25, 0x98, 0x0c, 0x83, 0xd1, 0x6d, 0xd8, + 0x81, 0xb6, 0xad, 0x85, 0x11, 0x04, 0xad, 0x8e, 0x1d, 0xa8, 0xdb, 0x9a, 0x4e, 0x42, 0xde, 0x86, + 0x71, 0xe1, 0xba, 0x82, 0x1c, 0x86, 0x23, 0xe3, 0x61, 0xe9, 0xe7, 0x12, 0xa3, 0x57, 0xd1, 0xd9, + 0x6a, 0xde, 0x70, 0x3a, 0xb4, 0xe9, 0xb4, 0x69, 0x0d, 0x9f, 0x28, 0xc4, 0x8c, 0xe1, 0x4f, 0xb5, + 0xa2, 0xc4, 0xe2, 0xaf, 0x17, 0x9a, 0xfe, 0x50, 0x23, 0x8a, 0x4f, 0xd6, 0xd1, 0x33, 0x4d, 0x56, + 0x6e, 0xbb, 0xe7, 0xad, 0xba, 0x7b, 0x8e, 0xb4, 0x56, 0x96, 0xb6, 0x7b, 0x9e, 0xd5, 0x64, 0xd0, + 0x98, 0xed, 0x1e, 0x47, 0x65, 0x37, 0x1c, 0xf6, 0xa3, 0x5a, 0x11, 0xef, 0x87, 0x78, 0xc3, 0x41, + 0x22, 0xdd, 0x44, 0x9c, 0x23, 0xc9, 0x6a, 0x96, 0x5b, 0xb6, 0xd3, 0x14, 0xfe, 0xde, 0x51, 0x35, + 0x94, 0x41, 0xe3, 0xd5, 0x20, 0x2a, 0xa9, 0xc3, 0x84, 0x49, 0x77, 0x37, 0x3c, 0x37, 0xa0, 0xf5, + 0x80, 0x36, 0x84, 0x54, 0x27, 0x2f, 0x36, 0x4b, 0xae, 0xcb, 0x25, 0xd6, 0xa5, 0xd7, 0x7f, 0xff, + 0xb8, 0x98, 0xf9, 0xce, 0x71, 0x11, 0x18, 0x88, 0xfb, 0x1f, 0x9c, 0x1c, 0x17, 0x2f, 0xb0, 0xf1, + 0xef, 0x48, 0x62, 0xf5, 0x74, 0x52, 0x99, 0x92, 0x6f, 0xb1, 0xfd, 0x3a, 0xec, 0x92, 0xa8, 0xb2, + 0x89, 0x1e, 0x95, 0xbd, 0x91, 0x5a, 0x59, 0x51, 0xe9, 0xed, 0xd4, 0x4a, 0x53, 0x2b, 0x21, 0xef, + 0xc0, 0x78, 0xb9, 0x5a, 0x76, 0xdb, 0xbb, 0xce, 0x5e, 0x6d, 0xa5, 0x84, 0xa2, 0xa1, 0xf0, 0x3d, + 0xa9, 0x3b, 0x56, 0x1d, 0xe1, 0x96, 0xbf, 0x6f, 0x6b, 0x2e, 0x88, 0x11, 0x3e, 0xb9, 0x0b, 0x53, + 0xf2, 0xa7, 0x49, 0x77, 0xb7, 0xcc, 0x2a, 0x4a, 0x84, 0xd2, 0xe1, 0x27, 0xe4, 0xc0, 0x3a, 0xa2, + 0xeb, 0xa9, 0x37, 0x85, 0x18, 0x19, 0x9b, 0x8c, 0x15, 0xda, 0x69, 0xba, 0x47, 0xac, 0x79, 0x9b, + 0x0e, 0xf5, 0x50, 0x06, 0x14, 0x93, 0xb1, 0x11, 0x96, 0x58, 0x81, 0xa3, 0xbf, 0x9a, 0xea, 0x44, + 0x64, 0x1d, 0x66, 0xc4, 0x14, 0x7f, 0xe8, 0xf8, 0xce, 0x8e, 0xd3, 0x74, 0x82, 0x23, 0x94, 0xfe, + 0x84, 0x00, 0x23, 0xd7, 0xc5, 0xa3, 0xb0, 0x54, 0x61, 0x96, 0x24, 0x35, 0x7e, 0x2d, 0x0b, 0xcf, + 0xf5, 0xbb, 0x09, 0x91, 0x9a, 0xbe, 0x99, 0x5d, 0x1d, 0xe0, 0xf6, 0x74, 0xfa, 0x76, 0xb6, 0x0c, + 0x53, 0x0f, 0xbc, 0x3d, 0xbb, 0xed, 0x7c, 0x13, 0x6f, 0xb8, 0xa1, 0x09, 0x23, 0x76, 0x86, 0xab, + 0x94, 0xe8, 0xb3, 0x3d, 0x46, 0xb4, 0xf0, 0x48, 0x6c, 0x73, 0x1f, 0xd6, 0x19, 0xee, 0x36, 0x8c, + 0x95, 0xdd, 0x76, 0x40, 0x1f, 0x07, 0x31, 0xd7, 0x6f, 0x0e, 0x8c, 0x3b, 0x02, 0x4a, 0x54, 0xe3, + 0x5f, 0x65, 0xe1, 0xf9, 0xbe, 0x57, 0x01, 0xb2, 0xa9, 0xf7, 0xda, 0xb5, 0x41, 0xee, 0x0f, 0xa7, + 0x77, 0xdb, 0x62, 0xc2, 0xda, 0xee, 0x54, 0x5f, 0x93, 0x85, 0xff, 0x21, 0x23, 0x3a, 0xe9, 0xd3, + 0x30, 0x8a, 0x55, 0x85, 0x5d, 0xc4, 0xb5, 0x64, 0xb8, 0x0b, 0x3b, 0xba, 0x96, 0x8c, 0xa3, 0x91, + 0x5b, 0x90, 0x2f, 0xdb, 0xcd, 0xa6, 0xe2, 0x18, 0x8f, 0xd2, 0x7c, 0x1d, 0x61, 0x31, 0xe3, 0x4c, + 0x89, 0xc8, 0x64, 0x1f, 0xfe, 0xb7, 0x72, 0x56, 0xe0, 0x66, 0x29, 0xc8, 0x62, 0xc7, 0x85, 0x82, + 0x8c, 0xe1, 0x34, 0xeb, 0x6e, 0xe8, 0x7a, 0xcb, 0xc3, 0x69, 0x32, 0x80, 0x16, 0x4e, 0x93, 0x01, + 0x8c, 0x5f, 0xcf, 0xc1, 0xa5, 0xfe, 0xf7, 0x59, 0xb2, 0xa5, 0x0f, 0xc1, 0xab, 0x03, 0xdd, 0x82, + 0x4f, 0x1f, 0x03, 0x19, 0x9c, 0x96, 0x77, 0xc8, 0xd5, 0xa4, 0x4b, 0xc8, 0x77, 0x8f, 0x8b, 0x8a, + 0xc5, 0xef, 0x3d, 0xd7, 0x69, 0x2b, 0x6f, 0x26, 0xdf, 0xd0, 0x24, 0x43, 0xfe, 0x66, 0x7f, 0x7b, + 0xb0, 0x96, 0x45, 0x74, 0x7c, 0x5f, 0x19, 0x54, 0xa2, 0xfc, 0x3c, 0x14, 0xe2, 0xa4, 0xe4, 0x0a, + 0x0c, 0x61, 0x03, 0x14, 0xbf, 0x96, 0x18, 0x07, 0x2c, 0x5f, 0x58, 0x13, 0x73, 0x07, 0x63, 0x05, + 0xa0, 0x15, 0x80, 0xae, 0x1b, 0x14, 0xb1, 0x02, 0xb8, 0x11, 0x41, 0x52, 0x3f, 0x18, 0x23, 0x32, + 0xfe, 0x32, 0x03, 0x17, 0x7b, 0x6a, 0x0a, 0xc8, 0x86, 0x3e, 0x60, 0x2f, 0x9f, 0xa6, 0x5a, 0x38, + 0x75, 0xac, 0x16, 0x7e, 0x5c, 0xce, 0xfd, 0x77, 0x61, 0xa2, 0xd6, 0xdd, 0x89, 0xdf, 0xcf, 0x78, + 0x24, 0x0f, 0x05, 0xae, 0x9e, 0x60, 0x2a, 0x3e, 0xfb, 0x7e, 0x69, 0xe6, 0x20, 0xcc, 0x7e, 0x14, + 0x5b, 0xc3, 0xd0, 0x99, 0x35, 0x19, 0x2b, 0x41, 0x27, 0x32, 0x7e, 0x35, 0x9b, 0x7e, 0xd1, 0xbd, + 0x5b, 0xde, 0x38, 0xcb, 0x45, 0xf7, 0x6e, 0x79, 0xe3, 0xf4, 0x6f, 0xff, 0x27, 0xf2, 0xdb, 0xf1, + 0x61, 0x56, 0xec, 0x78, 0x52, 0xd1, 0x29, 0x1e, 0x66, 0xe5, 0xee, 0xe8, 0xeb, 0x0f, 0xb3, 0x12, + 0x99, 0xbc, 0x01, 0x63, 0xab, 0x2e, 0x0f, 0x63, 0x20, 0xbf, 0x98, 0x7b, 0x7b, 0x4a, 0xa0, 0xba, + 0x3d, 0x86, 0x98, 0xec, 0x6e, 0xa1, 0x0f, 0xbc, 0x34, 0xa9, 0xc4, 0xbb, 0x45, 0x6c, 0xba, 0xe8, + 0xea, 0x40, 0x9d, 0xcc, 0xf8, 0x4f, 0x86, 0xc1, 0x38, 0x5d, 0x99, 0x41, 0xde, 0xd7, 0xfb, 0xee, + 0xfa, 0xc0, 0x6a, 0x90, 0x81, 0xb6, 0xdc, 0x52, 0xb7, 0xe1, 0xd0, 0x76, 0x5d, 0x8f, 0x41, 0x20, + 0x60, 0xea, 0x16, 0x28, 0xf1, 0x3e, 0x8c, 0x4b, 0xe0, 0xc2, 0x7f, 0x93, 0x8b, 0x96, 0x5a, 0xec, + 0x68, 0xcc, 0x7c, 0x88, 0xa3, 0x91, 0xdc, 0x87, 0x82, 0x0a, 0x51, 0x5e, 0x68, 0x51, 0x72, 0xd1, + 0x18, 0xc5, 0x1a, 0x95, 0x20, 0xd4, 0xcf, 0xd7, 0xdc, 0xe0, 0xe7, 0x6b, 0x24, 0xbe, 0x63, 0xfd, + 0x43, 0x49, 0xf1, 0x3d, 0xee, 0xf6, 0xab, 0xa0, 0xcb, 0x98, 0x05, 0xbe, 0x38, 0xb4, 0x86, 0xf5, + 0x98, 0x05, 0x29, 0x07, 0x97, 0x8a, 0x2e, 0xc3, 0x2e, 0xe0, 0x4f, 0xc5, 0xeb, 0x38, 0x0c, 0xbb, + 0xc0, 0xe9, 0xd3, 0xc2, 0x2e, 0x84, 0x24, 0xec, 0x00, 0x34, 0xbb, 0x6d, 0x1e, 0xb7, 0x79, 0x34, + 0x3a, 0x00, 0xbd, 0x6e, 0xdb, 0x8a, 0xc7, 0x6e, 0x0e, 0x11, 0x8d, 0x7f, 0x3c, 0x94, 0x2e, 0x1c, + 0x84, 0xfa, 0xae, 0xb3, 0x08, 0x07, 0x21, 0xd1, 0xc7, 0x33, 0x53, 0xb7, 0x60, 0x56, 0x5a, 0xe5, + 0x49, 0xf3, 0xae, 0x2d, 0x73, 0x55, 0x0c, 0x31, 0xea, 0x8d, 0x42, 0x7b, 0x3e, 0x69, 0x22, 0x66, + 0x75, 0x3d, 0x4d, 0x6f, 0x94, 0x42, 0xbf, 0xf0, 0x1b, 0x52, 0x2d, 0xa6, 0x0e, 0xc2, 0xd6, 0x56, + 0x38, 0x97, 0x63, 0x83, 0xd0, 0xed, 0x6a, 0xc3, 0xa8, 0x93, 0xf0, 0xbd, 0x57, 0xaa, 0x1c, 0x90, + 0x89, 0x22, 0x2b, 0x2a, 0x8a, 0x8a, 0x18, 0x97, 0x18, 0x11, 0xd9, 0x83, 0x8b, 0x91, 0x28, 0xad, + 0xdc, 0x14, 0x90, 0x23, 0xff, 0xe0, 0x6b, 0x27, 0xc7, 0xc5, 0x97, 0x15, 0x51, 0x5c, 0xbd, 0x70, + 0xc4, 0xb8, 0xf7, 0xe6, 0xc5, 0xf6, 0xdb, 0x25, 0xcf, 0x6e, 0xd7, 0xf7, 0x95, 0x39, 0x8f, 0xfb, + 0xed, 0x0e, 0x42, 0x13, 0x8e, 0xe3, 0x11, 0xb2, 0xf1, 0xe3, 0x59, 0x98, 0xe2, 0x67, 0x35, 0x7f, + 0x9d, 0x7b, 0x6a, 0x5f, 0x3e, 0xdf, 0xd2, 0x5e, 0x3e, 0x65, 0x8c, 0x33, 0xf5, 0xd3, 0x06, 0x7a, + 0xf7, 0xdc, 0x07, 0x92, 0xa4, 0x21, 0x26, 0x4c, 0xa8, 0xd0, 0xfe, 0x4f, 0x9e, 0x37, 0xa3, 0x70, + 0x78, 0x42, 0x54, 0xc2, 0x77, 0x67, 0xdf, 0xd4, 0x78, 0x18, 0x3f, 0x96, 0x85, 0x49, 0xc5, 0x4e, + 0xe5, 0xa9, 0xed, 0xf8, 0xcf, 0x6b, 0x1d, 0x3f, 0x1f, 0x7a, 0xcd, 0x85, 0x5f, 0x36, 0x50, 0xbf, + 0x77, 0x61, 0x26, 0x41, 0x12, 0x37, 0xf7, 0xc9, 0x0c, 0x62, 0xee, 0xf3, 0x5a, 0x32, 0xb6, 0x16, + 0x0f, 0x51, 0x1f, 0x46, 0x5a, 0x51, 0x83, 0x79, 0xfd, 0x64, 0x16, 0xe6, 0xc4, 0x2f, 0x0c, 0x46, + 0xc9, 0x85, 0xd5, 0xa7, 0x76, 0x2c, 0x4a, 0xda, 0x58, 0x14, 0xf5, 0xb1, 0x50, 0x3e, 0xb0, 0xf7, + 0x90, 0x18, 0x3f, 0x04, 0x30, 0xdf, 0x8b, 0x60, 0x60, 0xe7, 0xf4, 0xc8, 0xf5, 0x2f, 0x3b, 0x80, + 0xeb, 0xdf, 0x2a, 0x14, 0xb0, 0x2a, 0x11, 0x6e, 0xce, 0xdf, 0x32, 0xab, 0xa2, 0x93, 0x50, 0xbf, + 0xc0, 0x23, 0x86, 0x8a, 0xf0, 0x77, 0x7e, 0x4c, 0xe7, 0x91, 0xa0, 0x24, 0xbf, 0x94, 0x81, 0x29, + 0x04, 0x2e, 0x3f, 0xa2, 0xed, 0x00, 0x99, 0x0d, 0x09, 0x4f, 0xb5, 0xf0, 0x61, 0xb4, 0x16, 0x78, + 0x4e, 0x7b, 0x4f, 0xbc, 0x8c, 0xee, 0x88, 0x97, 0xd1, 0xb7, 0xf9, 0x8b, 0xee, 0xf5, 0xba, 0xdb, + 0xba, 0xb1, 0xe7, 0xd9, 0x8f, 0x1c, 0x6e, 0x82, 0x65, 0x37, 0x6f, 0x44, 0x99, 0x55, 0x3a, 0x4e, + 0x2c, 0xe7, 0x89, 0x60, 0x85, 0xaf, 0xce, 0xbc, 0xa1, 0x14, 0xab, 0x8d, 0xab, 0x66, 0xf4, 0x16, + 0x91, 0xef, 0x81, 0x0b, 0x3c, 0x08, 0x14, 0xbb, 0xe1, 0x3b, 0xed, 0xae, 0xdb, 0xf5, 0x97, 0xec, + 0xfa, 0x01, 0x13, 0xf3, 0xb9, 0xb7, 0x2d, 0x7e, 0x79, 0x3d, 0x2c, 0xb4, 0x76, 0x78, 0xa9, 0x16, + 0x5d, 0x20, 0x9d, 0x01, 0x59, 0x81, 0x19, 0x5e, 0x54, 0xea, 0x06, 0x6e, 0xad, 0x6e, 0x37, 0x9d, + 0xf6, 0x1e, 0xca, 0x12, 0x79, 0x2e, 0xca, 0xd8, 0xdd, 0xc0, 0xb5, 0x7c, 0x0e, 0x57, 0x35, 0x35, + 0x09, 0x22, 0x52, 0x85, 0x69, 0x93, 0xda, 0x8d, 0x35, 0xfb, 0x71, 0xd9, 0xee, 0xd8, 0x75, 0x27, + 0xe0, 0x51, 0x29, 0x73, 0x5c, 0xa0, 0xf3, 0xa8, 0xdd, 0xb0, 0x5a, 0xf6, 0x63, 0xab, 0x2e, 0x0a, + 0x75, 0x95, 0xbd, 0x46, 0x17, 0xb2, 0x72, 0xda, 0x21, 0xab, 0xb1, 0x38, 0x2b, 0xa7, 0xdd, 0x9b, + 0x55, 0x44, 0x27, 0x59, 0x6d, 0xda, 0xde, 0x1e, 0x0d, 0xb8, 0x79, 0x34, 0x5c, 0xce, 0x5c, 0xcd, + 0x28, 0xac, 0x02, 0x2c, 0xb3, 0xd0, 0x54, 0x3a, 0xce, 0x4a, 0xa1, 0x63, 0x33, 0x6f, 0xdb, 0x73, + 0x02, 0xaa, 0x7e, 0xe1, 0x38, 0x36, 0x0b, 0xfb, 0x1f, 0x0d, 0xcb, 0x7b, 0x7d, 0x62, 0x82, 0x32, + 0xe2, 0xa6, 0x7c, 0xe4, 0x44, 0x82, 0x5b, 0xfa, 0x57, 0x26, 0x28, 0x43, 0x6e, 0xea, 0x77, 0x4e, + 0xe2, 0x77, 0x2a, 0xdc, 0x7a, 0x7c, 0x68, 0x82, 0x92, 0xac, 0xb3, 0x4e, 0x0b, 0x98, 0xdc, 0xe4, + 0xb6, 0x85, 0x05, 0xf7, 0x14, 0x36, 0xed, 0x25, 0x61, 0x86, 0x58, 0xf0, 0x64, 0xb1, 0x95, 0x62, + 0xcf, 0x1d, 0x27, 0x26, 0x7f, 0x0b, 0xa6, 0xb7, 0x7c, 0x7a, 0xa7, 0xba, 0x51, 0x93, 0x31, 0xa3, + 0x50, 0xb9, 0x38, 0xb5, 0x78, 0xf3, 0x94, 0x4d, 0xe7, 0xba, 0x4a, 0x83, 0x89, 0x4a, 0xf8, 0xb8, + 0x75, 0x7d, 0x6a, 0xed, 0x3a, 0x1d, 0x3f, 0x0c, 0xc0, 0xa7, 0x8e, 0x5b, 0xac, 0x2a, 0x63, 0x05, + 0x66, 0x12, 0x6c, 0xc8, 0x14, 0x00, 0x03, 0x5a, 0x5b, 0xeb, 0xb5, 0xe5, 0xcd, 0xc2, 0x33, 0xa4, + 0x00, 0x13, 0xf8, 0x7b, 0x79, 0xbd, 0xb4, 0xb4, 0xba, 0x5c, 0x29, 0x64, 0xc8, 0x0c, 0x4c, 0x22, + 0xa4, 0x52, 0xad, 0x71, 0x50, 0x96, 0x87, 0xa9, 0x37, 0x0b, 0x7c, 0xe9, 0x06, 0x6c, 0x01, 0xe0, + 0x99, 0x62, 0xfc, 0xfd, 0x2c, 0x5c, 0x94, 0xc7, 0x0a, 0x0d, 0x98, 0xe0, 0xe8, 0xb4, 0xf7, 0x9e, + 0xf2, 0xd3, 0xe1, 0x8e, 0x76, 0x3a, 0xbc, 0x14, 0x3b, 0xa9, 0x63, 0x5f, 0xd9, 0xe7, 0x88, 0xf8, + 0xed, 0x31, 0x78, 0xbe, 0x2f, 0x15, 0xf9, 0x22, 0x3b, 0xcd, 0x1d, 0xda, 0x0e, 0xaa, 0x8d, 0x26, + 0xdd, 0x74, 0x5a, 0xd4, 0xed, 0x06, 0xc2, 0x63, 0xe0, 0x45, 0xd4, 0xe7, 0x61, 0xa1, 0xe5, 0x34, + 0x9a, 0xd4, 0x0a, 0x78, 0xb1, 0x36, 0xdd, 0x92, 0xd4, 0x8c, 0x65, 0x98, 0x34, 0xa9, 0xda, 0x0e, + 0xa8, 0xf7, 0x08, 0xad, 0x12, 0x43, 0x96, 0x07, 0x94, 0x76, 0x2c, 0x9b, 0x95, 0x5a, 0x8e, 0x28, + 0xd6, 0x59, 0x26, 0xa8, 0xc9, 0x1d, 0x85, 0x65, 0x99, 0xdd, 0xfe, 0xd7, 0xec, 0xc7, 0xc2, 0x4c, + 0x4a, 0xc4, 0x20, 0x0d, 0x59, 0x72, 0x27, 0xbe, 0x96, 0xfd, 0xd8, 0x4c, 0x92, 0x90, 0xaf, 0xc2, + 0x39, 0x71, 0x00, 0x89, 0x80, 0x26, 0xf2, 0x8b, 0x79, 0xb8, 0x94, 0x57, 0x4e, 0x8e, 0x8b, 0x17, + 0x64, 0xf4, 0x56, 0x19, 0xc2, 0x26, 0xed, 0xab, 0xd3, 0xb9, 0x90, 0x4d, 0x76, 0x20, 0xc7, 0xba, + 0x63, 0x8d, 0xfa, 0xbe, 0xf4, 0xd4, 0x14, 0x37, 0x63, 0xb5, 0x33, 0xad, 0x16, 0x2f, 0x37, 0x7b, + 0x52, 0x92, 0x15, 0x98, 0xda, 0xa6, 0x3b, 0xea, 0xf8, 0x8c, 0x84, 0x5b, 0x55, 0xe1, 0x90, 0xee, + 0xf4, 0x1e, 0x9c, 0x18, 0x1d, 0x71, 0xf0, 0x7d, 0xe0, 0xf1, 0xd1, 0xaa, 0xe3, 0x07, 0xb4, 0x4d, + 0x3d, 0x0c, 0x94, 0x35, 0x8a, 0x9b, 0xc1, 0x7c, 0x24, 0x21, 0xeb, 0xe5, 0x4b, 0x2f, 0x9c, 0x1c, + 0x17, 0x9f, 0xe7, 0x2e, 0xcf, 0x4d, 0x01, 0xb7, 0x62, 0x29, 0x87, 0x92, 0x5c, 0xc9, 0xd7, 0x61, + 0xda, 0x74, 0xbb, 0x81, 0xd3, 0xde, 0xab, 0x05, 0x9e, 0x1d, 0xd0, 0x3d, 0x7e, 0x20, 0x45, 0x11, + 0xb9, 0x62, 0xa5, 0xe2, 0x69, 0x99, 0x03, 0x2d, 0x5f, 0x40, 0xb5, 0x13, 0x41, 0x27, 0x20, 0x5f, + 0x83, 0x29, 0x1e, 0xca, 0x22, 0xac, 0x60, 0x4c, 0x4b, 0x97, 0xa0, 0x17, 0x3e, 0xbc, 0x29, 0xac, + 0x5a, 0x10, 0x9a, 0x56, 0x41, 0x8c, 0x1b, 0xf9, 0xb2, 0xe8, 0xac, 0x0d, 0xa7, 0xbd, 0x17, 0x4e, + 0x63, 0xc0, 0x9e, 0x7f, 0x3d, 0xea, 0x92, 0x0e, 0x6b, 0xae, 0x9c, 0xc6, 0x3d, 0x4c, 0xf4, 0x92, + 0x7c, 0x48, 0x00, 0xcf, 0x97, 0x7c, 0xdf, 0xf1, 0x03, 0xe1, 0x57, 0xb3, 0xfc, 0x98, 0xd6, 0xbb, + 0x0c, 0x99, 0x5d, 0x6f, 0xa9, 0xc7, 0xed, 0xba, 0x87, 0x97, 0xae, 0x9f, 0x1c, 0x17, 0x5f, 0xb5, + 0x11, 0xd1, 0x12, 0xae, 0x38, 0x16, 0x95, 0xa8, 0xd6, 0x21, 0xc7, 0x55, 0xbe, 0xa1, 0x3f, 0x53, + 0xf2, 0x35, 0x38, 0x5f, 0xb6, 0x7d, 0x5a, 0x6d, 0xfb, 0xb4, 0xed, 0x3b, 0x81, 0xf3, 0x88, 0x8a, + 0x4e, 0xc5, 0xc3, 0x2f, 0x8f, 0xc9, 0x99, 0x8c, 0xba, 0xed, 0xb3, 0x85, 0x19, 0xa2, 0x58, 0x62, + 0x50, 0x94, 0x6a, 0x7a, 0x70, 0x21, 0x26, 0x4c, 0xd5, 0x6a, 0x2b, 0x15, 0xc7, 0x0e, 0xd7, 0xd5, + 0x24, 0xf6, 0xd7, 0xab, 0xa8, 0xda, 0xf3, 0xf7, 0xad, 0x86, 0x63, 0x87, 0x0b, 0xaa, 0x47, 0x67, + 0xc5, 0x38, 0x18, 0xc7, 0x19, 0x28, 0xc4, 0x87, 0x92, 0x7c, 0x09, 0xc6, 0xb8, 0x7d, 0x1b, 0xf5, + 0xf7, 0x45, 0x64, 0x07, 0x69, 0x2e, 0x15, 0xc2, 0x75, 0x22, 0xe1, 0x44, 0xc7, 0xad, 0xe7, 0xa8, + 0x6a, 0x2d, 0x83, 0x4e, 0x74, 0x92, 0x88, 0x34, 0x60, 0x82, 0x8f, 0x16, 0xc5, 0x70, 0x7c, 0xc2, + 0xcc, 0xf9, 0x05, 0x75, 0x75, 0x88, 0xa2, 0x18, 0x7f, 0x7c, 0x35, 0x14, 0x73, 0x82, 0x23, 0x68, + 0x55, 0x68, 0x5c, 0x97, 0x00, 0xf2, 0x92, 0xd0, 0xb8, 0x08, 0x17, 0x7a, 0xb4, 0xd9, 0x78, 0x84, + 0x96, 0x04, 0x3d, 0x6a, 0x24, 0x5f, 0x82, 0x39, 0x24, 0x2c, 0xbb, 0xed, 0x36, 0xad, 0x07, 0xb8, + 0x1d, 0x49, 0xed, 0x7b, 0x8e, 0x5b, 0xba, 0xf0, 0xef, 0xad, 0x87, 0x08, 0x56, 0x5c, 0x09, 0x9f, + 0xca, 0xc1, 0xf8, 0xb9, 0x2c, 0xcc, 0x8b, 0x1d, 0xce, 0xa4, 0x75, 0xd7, 0x6b, 0x3c, 0xfd, 0x27, + 0xea, 0xb2, 0x76, 0xa2, 0xbe, 0x18, 0x86, 0xf2, 0x49, 0xfb, 0xc8, 0x3e, 0x07, 0xea, 0xaf, 0x66, + 0xe0, 0xb9, 0x7e, 0x44, 0xac, 0x77, 0xc2, 0xf0, 0x83, 0x63, 0x89, 0x30, 0x83, 0x1d, 0x98, 0xc5, + 0x01, 0x2d, 0xef, 0xd3, 0xfa, 0x81, 0xbf, 0xe2, 0xfa, 0x01, 0x7a, 0x5a, 0x64, 0x7b, 0xbc, 0x75, + 0xbf, 0x96, 0xfa, 0xd6, 0x7d, 0x9e, 0xcf, 0xb2, 0x3a, 0xf2, 0xe0, 0x01, 0x12, 0x0f, 0xe8, 0x91, + 0x6f, 0xa6, 0xb1, 0x46, 0x8b, 0xf9, 0x52, 0x37, 0xd8, 0xdf, 0xf0, 0xe8, 0x2e, 0xf5, 0x68, 0xbb, + 0x4e, 0x3f, 0x61, 0x16, 0xf3, 0xfa, 0xc7, 0x0d, 0xa4, 0xc1, 0xf8, 0x27, 0x93, 0x30, 0x97, 0x46, + 0xc6, 0xfa, 0x45, 0xb9, 0x34, 0xc7, 0x73, 0x47, 0xfe, 0x60, 0x06, 0x26, 0x6a, 0xb4, 0xee, 0xb6, + 0x1b, 0x77, 0xd0, 0xa2, 0x48, 0xf4, 0x8e, 0xc5, 0x85, 0x06, 0x06, 0xb7, 0x76, 0x63, 0xa6, 0x46, + 0xdf, 0x3d, 0x2e, 0x7e, 0x61, 0xb0, 0xbb, 0x6a, 0xdd, 0xc5, 0x70, 0x3c, 0x01, 0xe6, 0x36, 0x08, + 0xab, 0xc0, 0xc7, 0x41, 0xad, 0x52, 0xb2, 0x04, 0x93, 0x62, 0xb9, 0xba, 0x6a, 0xf4, 0x49, 0x1e, + 0xed, 0x48, 0x16, 0x24, 0x54, 0xd7, 0x1a, 0x09, 0xb9, 0x05, 0xb9, 0xad, 0xc5, 0x3b, 0x62, 0x0c, + 0x64, 0x76, 0x88, 0xad, 0xc5, 0x3b, 0xa8, 0x0e, 0x63, 0x57, 0x8c, 0xc9, 0xee, 0xa2, 0x66, 0xe4, + 0xb3, 0xb5, 0x78, 0x87, 0xfc, 0x6d, 0x38, 0x57, 0x71, 0x7c, 0x51, 0x05, 0xf7, 0xdd, 0x68, 0xa0, + 0xc7, 0xe2, 0x48, 0x8f, 0xd9, 0xfb, 0xd9, 0xd4, 0xd9, 0xfb, 0x42, 0x23, 0x64, 0x62, 0x71, 0xc7, + 0x90, 0x46, 0x3c, 0xca, 0x66, 0x7a, 0x3d, 0xe4, 0x03, 0x98, 0x42, 0x65, 0x36, 0xba, 0xb3, 0x60, + 0x7c, 0xf4, 0xd1, 0x1e, 0x35, 0x7f, 0x3a, 0xb5, 0xe6, 0x05, 0x1e, 0x65, 0x03, 0x9d, 0x62, 0x30, + 0x96, 0xba, 0x76, 0xeb, 0xd7, 0x38, 0x93, 0x7b, 0x30, 0x2d, 0xc4, 0xaf, 0x07, 0xbb, 0x9b, 0xfb, + 0xb4, 0x62, 0x1f, 0x09, 0xfb, 0x1c, 0xbc, 0xd1, 0x09, 0x99, 0xcd, 0x72, 0x77, 0xad, 0x60, 0x9f, + 0x5a, 0x0d, 0x5b, 0x13, 0x54, 0x62, 0x84, 0xe4, 0x5b, 0x30, 0xbe, 0xea, 0xd6, 0x99, 0xe4, 0x8d, + 0x3b, 0x03, 0x37, 0xd9, 0x79, 0x1f, 0xb3, 0x13, 0x72, 0x70, 0x4c, 0x9c, 0xfa, 0xee, 0x71, 0xf1, + 0xad, 0xb3, 0x4e, 0x1a, 0xa5, 0x02, 0x53, 0xad, 0x8d, 0x94, 0x21, 0xbf, 0x4d, 0x77, 0xd8, 0xd7, + 0xc6, 0x33, 0x97, 0x49, 0xb0, 0xb0, 0xc8, 0x13, 0xbf, 0x34, 0x8b, 0x3c, 0x01, 0x23, 0x1e, 0xcc, + 0x60, 0xff, 0x6c, 0xd8, 0xbe, 0x7f, 0xe8, 0x7a, 0x0d, 0x4c, 0x51, 0xd1, 0xcb, 0x1a, 0x68, 0x31, + 0xb5, 0xf3, 0x9f, 0xe3, 0x9d, 0xdf, 0x51, 0x38, 0xa8, 0x02, 0x64, 0x82, 0x3d, 0xf9, 0x3a, 0x4c, + 0x89, 0x88, 0x05, 0x6b, 0x77, 0x4a, 0xb8, 0x2a, 0x27, 0x34, 0xbf, 0x4f, 0xbd, 0x90, 0x4b, 0xa9, + 0x22, 0x00, 0x82, 0xd4, 0x40, 0x59, 0xad, 0x5d, 0x5b, 0x57, 0xfa, 0xab, 0x24, 0x64, 0x03, 0xc6, + 0x2b, 0x98, 0x3f, 0x17, 0x7d, 0xd3, 0x84, 0x5d, 0x78, 0x98, 0x7a, 0x29, 0x2a, 0xe1, 0xba, 0x18, + 0x91, 0x6a, 0x17, 0x3d, 0xdd, 0x74, 0x5b, 0xdd, 0x10, 0x91, 0xdc, 0x86, 0x5c, 0xb5, 0xb2, 0x21, + 0xcc, 0xc2, 0x67, 0xc2, 0xb8, 0x20, 0x1b, 0x32, 0x51, 0x0d, 0xda, 0xcf, 0x39, 0x0d, 0xcd, 0xa8, + 0xbc, 0x5a, 0xd9, 0x20, 0xbb, 0x30, 0x89, 0x1d, 0xb0, 0x42, 0x6d, 0xde, 0xb7, 0xd3, 0x3d, 0xfa, + 0xf6, 0x7a, 0x6a, 0xdf, 0xce, 0xf3, 0xbe, 0xdd, 0x17, 0xd4, 0x5a, 0xe6, 0x0d, 0x95, 0x2d, 0x13, + 0x69, 0x45, 0x36, 0x20, 0x99, 0x2f, 0x62, 0x73, 0x15, 0xed, 0x83, 0x84, 0x48, 0x2b, 0x93, 0x07, + 0x85, 0x09, 0x2c, 0x7a, 0x7a, 0x9d, 0x24, 0xf9, 0x90, 0xcf, 0xc3, 0xd0, 0x83, 0x83, 0xc0, 0x16, + 0x06, 0xe0, 0xb2, 0x1f, 0x19, 0x48, 0x7e, 0x3e, 0x6a, 0x21, 0xdd, 0x03, 0x2d, 0x0e, 0x1b, 0xd2, + 0xb0, 0xa1, 0x58, 0xb1, 0xbd, 0xc6, 0xa1, 0xed, 0xa1, 0x83, 0xf0, 0xac, 0xc6, 0x42, 0x29, 0xe1, + 0x43, 0xb1, 0x2f, 0x00, 0x31, 0xaf, 0x61, 0x95, 0x05, 0xf9, 0x1e, 0xb8, 0xe8, 0x3b, 0x7b, 0x6d, + 0x3b, 0xe8, 0x7a, 0xd4, 0xb2, 0x9b, 0x7b, 0xae, 0xe7, 0x04, 0xfb, 0x2d, 0xcb, 0xef, 0x3a, 0x01, + 0x9d, 0x9f, 0xd3, 0x72, 0x07, 0xd7, 0x24, 0x5e, 0x49, 0xa2, 0xd5, 0x18, 0x96, 0x79, 0xc1, 0x4f, + 0x2f, 0x20, 0x5f, 0x86, 0x49, 0x75, 0x4b, 0xf6, 0xe7, 0xcf, 0x5d, 0xce, 0x5d, 0x9d, 0x0a, 0x2f, + 0x1e, 0xf1, 0x0d, 0x5c, 0xc6, 0xdc, 0x55, 0x4e, 0x08, 0x5f, 0x8f, 0xb9, 0xab, 0xf0, 0x0a, 0xb3, + 0xf1, 0x91, 0xc2, 0xac, 0x39, 0x23, 0x66, 0xac, 0xe8, 0xe5, 0xb5, 0x3b, 0x25, 0x73, 0x74, 0xa3, + 0xfa, 0xb0, 0xd6, 0x74, 0x03, 0xe3, 0xbf, 0xc8, 0xe0, 0x26, 0x4e, 0x5e, 0xc5, 0xf0, 0x51, 0xe1, + 0xeb, 0x19, 0xea, 0x6f, 0xed, 0x4e, 0x2c, 0x60, 0x3b, 0x47, 0x21, 0xaf, 0xc1, 0xc8, 0x1d, 0xbb, + 0x2e, 0x43, 0xd7, 0x08, 0xe4, 0x5d, 0x84, 0xa8, 0xca, 0x5e, 0x8e, 0xc3, 0xe4, 0x4b, 0x3e, 0xb9, + 0x4b, 0x51, 0x5a, 0xea, 0x72, 0x49, 0x3e, 0xd7, 0xa3, 0x7c, 0x29, 0x16, 0x85, 0x92, 0xb7, 0x3a, + 0x66, 0x15, 0x9f, 0xca, 0xc1, 0xf8, 0xf3, 0x4c, 0xb4, 0x2b, 0x91, 0x57, 0x60, 0xc8, 0xdc, 0x08, + 0xdb, 0xcf, 0x9d, 0x7e, 0x63, 0xcd, 0x47, 0x04, 0xf2, 0x65, 0x38, 0xa7, 0xf0, 0x49, 0x98, 0xe8, + 0xbf, 0x8c, 0x3e, 0xa9, 0x4a, 0x4b, 0xd2, 0xed, 0xf4, 0xd3, 0x79, 0xa0, 0x30, 0x1d, 0x15, 0x54, + 0x68, 0xdb, 0xe1, 0xbc, 0x95, 0x8f, 0x55, 0x79, 0x37, 0x10, 0x21, 0xfe, 0xb1, 0x69, 0x1c, 0xb8, + 0x4b, 0xaa, 0xf1, 0x5b, 0x19, 0x6d, 0xb7, 0x09, 0xf3, 0xf8, 0x66, 0x4e, 0xc9, 0xe3, 0xfb, 0x26, + 0x40, 0xa9, 0x1b, 0xb8, 0xcb, 0x6d, 0xcf, 0x6d, 0x72, 0x2d, 0x8a, 0xc8, 0x59, 0x80, 0xba, 0x61, + 0x8a, 0x60, 0xcd, 0x73, 0x2e, 0x44, 0x4e, 0xf5, 0x66, 0xc8, 0x7d, 0x58, 0x6f, 0x06, 0xe3, 0x0f, + 0x32, 0xda, 0x1a, 0x65, 0x52, 0xa2, 0x98, 0x8a, 0xaa, 0xc5, 0x58, 0xc7, 0x79, 0x64, 0xf9, 0x4d, + 0x57, 0x0b, 0x52, 0x21, 0xd0, 0xc8, 0xbf, 0x99, 0x81, 0xf3, 0xdc, 0x2d, 0x60, 0xbd, 0xdb, 0xda, + 0xa1, 0xde, 0x43, 0xbb, 0xe9, 0x34, 0xb8, 0xe3, 0x35, 0x17, 0x80, 0xaf, 0x26, 0x17, 0x7c, 0x3a, + 0x3e, 0xbf, 0xa8, 0x72, 0x37, 0x05, 0xab, 0x8d, 0x85, 0xd6, 0xa3, 0xb0, 0x54, 0xbd, 0xa8, 0xa6, + 0xd3, 0x1b, 0xbf, 0x96, 0x81, 0x17, 0x4e, 0xad, 0x85, 0xdc, 0x80, 0x51, 0x99, 0x2c, 0x22, 0x83, + 0x1d, 0x8f, 0x76, 0xb6, 0xc9, 0x44, 0x11, 0x12, 0x8b, 0x7c, 0x05, 0xce, 0xa9, 0xac, 0x36, 0x3d, + 0xdb, 0x51, 0x53, 0x32, 0xa4, 0xb4, 0x3a, 0x60, 0x28, 0x71, 0x69, 0x2d, 0x9d, 0x89, 0xf1, 0xff, + 0x65, 0x94, 0xcc, 0xde, 0x4f, 0xa9, 0x0c, 0x7f, 0x5b, 0x93, 0xe1, 0x65, 0xe0, 0xce, 0xf0, 0xab, + 0x58, 0x59, 0xea, 0xbd, 0x6b, 0x5a, 0xb1, 0x17, 0x47, 0xc0, 0x8f, 0x64, 0x61, 0x7c, 0xcb, 0xa7, + 0x1e, 0x7f, 0xc8, 0xfd, 0x64, 0x05, 0x68, 0x0c, 0xbf, 0x6b, 0xa0, 0x10, 0x7a, 0x7f, 0x9a, 0x41, + 0x05, 0xbf, 0x4a, 0xc1, 0x7a, 0x43, 0xc9, 0xe6, 0x87, 0xbd, 0x81, 0x79, 0xfc, 0x10, 0xca, 0x03, + 0x8a, 0xad, 0xea, 0x89, 0x3d, 0x31, 0xbb, 0xeb, 0x2a, 0xf9, 0x02, 0x0c, 0x6f, 0xa1, 0xba, 0x52, + 0x0f, 0xb2, 0x11, 0xf2, 0xc7, 0x42, 0xbe, 0x49, 0x77, 0x7d, 0x3d, 0xda, 0x1c, 0x27, 0x24, 0x35, + 0x18, 0x2d, 0x7b, 0x14, 0xf3, 0x74, 0x0f, 0x0d, 0xee, 0x22, 0x5e, 0xe7, 0x24, 0x71, 0x17, 0x71, + 0xc1, 0xc9, 0xf8, 0xd9, 0x2c, 0x90, 0xe8, 0x1b, 0x31, 0x29, 0x95, 0xff, 0xd4, 0x0e, 0xfa, 0x7b, + 0xda, 0xa0, 0x3f, 0x9f, 0x18, 0x74, 0xfe, 0x79, 0x03, 0x8d, 0xfd, 0xef, 0x64, 0xe0, 0x7c, 0x3a, + 0x21, 0x79, 0x11, 0x46, 0x1e, 0x6c, 0x6e, 0xc8, 0x38, 0x2d, 0xe2, 0x53, 0xdc, 0x0e, 0xea, 0x0a, + 0x4c, 0x51, 0x44, 0x5e, 0x87, 0x91, 0x2f, 0x9a, 0x65, 0x76, 0x0e, 0x29, 0x69, 0x0f, 0xbe, 0xe1, + 0x59, 0x75, 0xfd, 0x28, 0x12, 0x48, 0xea, 0xd8, 0xe6, 0x9e, 0xd8, 0xd8, 0xfe, 0x64, 0x16, 0xa6, + 0x4b, 0xf5, 0x3a, 0xf5, 0x7d, 0x26, 0xed, 0x50, 0x3f, 0x78, 0x6a, 0x07, 0x36, 0x3d, 0x02, 0x8b, + 0xf6, 0x6d, 0x03, 0x8d, 0xea, 0xef, 0x65, 0xe0, 0x9c, 0xa4, 0x7a, 0xe4, 0xd0, 0xc3, 0xcd, 0x7d, + 0x8f, 0xfa, 0xfb, 0x6e, 0xb3, 0x31, 0x70, 0x6e, 0x15, 0x26, 0xe8, 0x61, 0xc0, 0x74, 0xf5, 0x55, + 0x7f, 0x17, 0x21, 0x9a, 0xa0, 0xc7, 0x83, 0xaa, 0xdf, 0x80, 0xd1, 0x52, 0xa7, 0xe3, 0xb9, 0x8f, + 0xf8, 0xb2, 0x17, 0xf1, 0x24, 0x6d, 0x0e, 0xd2, 0x3c, 0xec, 0x39, 0x88, 0x35, 0xa3, 0x42, 0xdb, + 0x3c, 0x80, 0xdf, 0x24, 0x6f, 0x46, 0x83, 0xb6, 0x55, 0x59, 0x1c, 0xcb, 0x8d, 0x1a, 0x90, 0x0d, + 0xcf, 0x6d, 0xb9, 0x01, 0x6d, 0xf0, 0xef, 0xc1, 0xc0, 0x04, 0xa7, 0x06, 0xd2, 0xda, 0x74, 0x82, + 0xa6, 0x16, 0x48, 0x2b, 0x60, 0x00, 0x93, 0xc3, 0x8d, 0xff, 0x67, 0x18, 0x26, 0xd4, 0xde, 0x21, + 0x06, 0x4f, 0x98, 0xe0, 0x7a, 0x6a, 0x74, 0x0c, 0x1b, 0x21, 0xa6, 0x28, 0x89, 0x42, 0xcb, 0x64, + 0x4f, 0x0d, 0x2d, 0xb3, 0x0d, 0x93, 0x1b, 0x9e, 0x8b, 0x81, 0x2f, 0xf1, 0xb5, 0x52, 0x6c, 0x85, + 0xb3, 0xca, 0xbd, 0x93, 0x0d, 0x24, 0xbe, 0x87, 0xa2, 0x64, 0xdf, 0x11, 0xd8, 0x98, 0x46, 0x50, + 0xd3, 0xba, 0x68, 0x7c, 0xb8, 0xa9, 0x85, 0xed, 0x8b, 0xe8, 0xb5, 0xa1, 0xa9, 0x05, 0x83, 0xe8, + 0xa6, 0x16, 0x0c, 0xa2, 0xae, 0xb5, 0xe1, 0x27, 0xb5, 0xd6, 0xc8, 0xcf, 0x66, 0x60, 0xbc, 0xd4, + 0x6e, 0x8b, 0x90, 0x35, 0xa7, 0x78, 0xeb, 0x7f, 0x45, 0x58, 0x5b, 0xbc, 0xf5, 0xa1, 0xac, 0x2d, + 0x50, 0x6e, 0xf1, 0x51, 0x52, 0x8d, 0x2a, 0x54, 0x6f, 0x6b, 0x4a, 0x3b, 0xc8, 0x5b, 0x50, 0x08, + 0x27, 0x79, 0xb5, 0xdd, 0xa0, 0x8f, 0x29, 0x4f, 0x38, 0x37, 0x29, 0xe2, 0x56, 0xab, 0x92, 0x69, + 0x1c, 0x91, 0x6c, 0x02, 0xd8, 0xe1, 0xec, 0x8a, 0x65, 0xce, 0x4c, 0x4e, 0x3f, 0x21, 0x3d, 0xe3, + 0x6f, 0x7c, 0xd0, 0x52, 0xa5, 0xe7, 0x88, 0x0f, 0x69, 0xc1, 0x34, 0x4f, 0x5b, 0x59, 0x0b, 0x6c, + 0x2f, 0xc0, 0xf4, 0x0c, 0x70, 0xea, 0x38, 0xbc, 0x22, 0xf4, 0x67, 0xcf, 0x8a, 0x64, 0x98, 0x3e, + 0xa3, 0xb5, 0x52, 0x72, 0x35, 0xc4, 0x79, 0xf3, 0x28, 0xe1, 0xe6, 0x85, 0x64, 0x7b, 0xf9, 0xa4, + 0xff, 0xc9, 0x0c, 0x9c, 0x57, 0x27, 0x7d, 0xad, 0xbb, 0x23, 0x02, 0x86, 0x92, 0xeb, 0x30, 0x26, + 0xe6, 0x64, 0x78, 0x89, 0x4a, 0x66, 0x99, 0x88, 0x50, 0xc8, 0x32, 0x9b, 0x86, 0x8c, 0x87, 0x90, + 0xba, 0x67, 0x63, 0xfb, 0x14, 0x2b, 0x8a, 0x52, 0x22, 0x7b, 0xf8, 0x5b, 0x9f, 0x9f, 0x0c, 0x62, + 0xbc, 0x0b, 0x33, 0xfa, 0x48, 0xd4, 0x68, 0x40, 0xae, 0xc1, 0xa8, 0x1c, 0xbe, 0x4c, 0xfa, 0xf0, + 0xc9, 0x72, 0x63, 0x1b, 0x48, 0x82, 0xde, 0x47, 0xb3, 0x28, 0x76, 0x3f, 0xe5, 0x66, 0x7b, 0xf2, + 0x51, 0x32, 0x81, 0xb8, 0x34, 0x2b, 0xda, 0x37, 0xae, 0xb9, 0x25, 0x60, 0xf0, 0xd4, 0x3f, 0x9f, + 0x82, 0xd9, 0x94, 0x3d, 0xf7, 0x14, 0x99, 0xa8, 0xa8, 0x6f, 0x10, 0x63, 0x61, 0xb0, 0x0f, 0xb9, + 0x2d, 0xbc, 0x0b, 0xc3, 0xa7, 0x6e, 0x07, 0xdc, 0x29, 0x25, 0xb6, 0x0b, 0x70, 0xb2, 0x8f, 0x45, + 0x2e, 0x52, 0xe3, 0xf1, 0x0c, 0x3f, 0xb1, 0x78, 0x3c, 0x4b, 0x30, 0x29, 0xbe, 0x4a, 0x6c, 0x57, + 0x8a, 0x71, 0xb4, 0xc7, 0x0b, 0xac, 0xc4, 0xb6, 0xa5, 0x93, 0x70, 0x1e, 0xbe, 0xdb, 0x7c, 0x44, + 0x05, 0x8f, 0x51, 0x95, 0x07, 0x16, 0xa4, 0xf2, 0x50, 0x48, 0xc8, 0x7f, 0x84, 0x29, 0xf3, 0x10, + 0xa2, 0xee, 0x59, 0xf9, 0x7e, 0x7b, 0x56, 0xe3, 0xc9, 0xec, 0x59, 0xcf, 0xcb, 0x36, 0xa6, 0xef, + 0x5d, 0x29, 0xcd, 0x22, 0xbf, 0x9c, 0x81, 0x19, 0x1e, 0x14, 0x46, 0x6d, 0x6c, 0xdf, 0x40, 0x1f, + 0xf5, 0x27, 0xd3, 0xd8, 0xe7, 0x44, 0xaa, 0xa8, 0xf4, 0xb6, 0x26, 0x1b, 0x45, 0xbe, 0x07, 0x20, + 0x5c, 0x51, 0x3c, 0x80, 0xec, 0xf8, 0xe2, 0x73, 0x29, 0xbb, 0x40, 0x88, 0x14, 0xa5, 0xb5, 0x08, + 0x42, 0x3a, 0x2d, 0x51, 0x62, 0x08, 0x25, 0x7f, 0x1b, 0xe6, 0xd8, 0x7a, 0x09, 0x21, 0x22, 0x84, + 0xd5, 0xfc, 0x38, 0xd6, 0xf2, 0x99, 0xde, 0x32, 0xd1, 0xf5, 0x34, 0x32, 0x1e, 0x6e, 0x38, 0xca, + 0x59, 0x1d, 0xa8, 0xd1, 0x2e, 0x52, 0x2b, 0xc2, 0xc8, 0x70, 0xd8, 0x7a, 0x9e, 0x7a, 0xa2, 0xc7, + 0xfe, 0x76, 0x51, 0xae, 0x05, 0xbe, 0xbf, 0xf9, 0xba, 0x8f, 0x32, 0x82, 0xc8, 0x17, 0x81, 0x84, + 0xd1, 0x54, 0x38, 0x8c, 0xca, 0xb4, 0x14, 0x5c, 0xdd, 0x1c, 0x45, 0x65, 0xf1, 0x64, 0xb1, 0x3a, + 0x49, 0x92, 0xc4, 0x84, 0xc2, 0x9c, 0xf8, 0x68, 0x06, 0x95, 0xf9, 0xec, 0xfc, 0xf9, 0x29, 0x2d, + 0x40, 0x58, 0x54, 0x12, 0x25, 0xb7, 0x56, 0x92, 0xe2, 0x69, 0x2a, 0xa7, 0x34, 0x76, 0xe4, 0x36, + 0x8c, 0xa1, 0xa3, 0xf0, 0x8a, 0x34, 0xf6, 0x12, 0x86, 0x27, 0xe8, 0x52, 0x6c, 0xed, 0xeb, 0x26, + 0x5b, 0x11, 0x2a, 0xbb, 0x0e, 0x54, 0xbc, 0x23, 0xb3, 0xdb, 0x46, 0xa5, 0xb0, 0xd0, 0x77, 0x34, + 0xbc, 0x23, 0xcb, 0xeb, 0xea, 0x9e, 0xe4, 0x88, 0x44, 0xbe, 0x0e, 0xe3, 0x6b, 0xf6, 0x63, 0xa9, + 0x13, 0x16, 0x8a, 0xdf, 0x7e, 0x3b, 0x90, 0x21, 0xbf, 0xa6, 0x65, 0x3f, 0xb6, 0x1a, 0xdd, 0x78, + 0xb0, 0x63, 0xdc, 0x86, 0x54, 0x96, 0xe4, 0xab, 0x00, 0x8a, 0xa6, 0x9a, 0x9c, 0x5a, 0xc1, 0x0b, + 0x32, 0xec, 0x5d, 0xaa, 0x06, 0x1b, 0xf9, 0x2b, 0x0c, 0x63, 0x92, 0xc3, 0xdc, 0xc7, 0x27, 0x39, + 0x9c, 0xfb, 0xf8, 0x24, 0x87, 0x85, 0x1d, 0xb8, 0xd8, 0x73, 0xe9, 0xa4, 0x84, 0x3a, 0xbe, 0xa1, + 0x87, 0x3a, 0xbe, 0xd8, 0xeb, 0x88, 0xf5, 0xf5, 0x4c, 0x26, 0xb3, 0x85, 0xb9, 0xde, 0xd2, 0xc9, + 0x77, 0xb2, 0xb1, 0x23, 0x57, 0x5c, 0x2c, 0x78, 0xe6, 0xab, 0x5e, 0x32, 0x49, 0x16, 0x93, 0x1d, + 0xf3, 0x43, 0x59, 0x89, 0x06, 0xcf, 0x0e, 0x65, 0xf5, 0x50, 0xc7, 0xe3, 0xf9, 0xa3, 0x9e, 0xbe, + 0x6f, 0xc3, 0x14, 0xcf, 0x4f, 0x7a, 0x9f, 0x1e, 0x1d, 0xba, 0x5e, 0x83, 0xe7, 0xf4, 0x11, 0x32, + 0x78, 0x22, 0xb9, 0x78, 0x0c, 0x97, 0x54, 0xa4, 0xef, 0xe9, 0x30, 0xd6, 0x7e, 0x31, 0x75, 0x17, + 0x63, 0x08, 0xfd, 0xdc, 0x52, 0xc9, 0x1b, 0xa1, 0xa0, 0x46, 0x3d, 0x35, 0x9f, 0x89, 0x27, 0x81, + 0x29, 0xf2, 0x1a, 0xf5, 0x8c, 0x7f, 0x96, 0x03, 0xc2, 0x6b, 0x2a, 0xdb, 0x1d, 0x1b, 0x3d, 0xb3, + 0x1d, 0x8c, 0xb5, 0x54, 0x10, 0x38, 0xf6, 0x4e, 0x93, 0xaa, 0x81, 0xca, 0x84, 0x71, 0x6d, 0x58, + 0x66, 0xc5, 0x2f, 0x3a, 0x09, 0xc2, 0x1e, 0x5b, 0x5d, 0xf6, 0xa3, 0x6c, 0x75, 0x5f, 0x87, 0x67, + 0x4b, 0x1d, 0x4c, 0x74, 0x2c, 0x6b, 0xb9, 0xe3, 0x7a, 0x72, 0x93, 0xd2, 0x7c, 0xfe, 0xec, 0x10, + 0x2d, 0xd1, 0xd2, 0x7e, 0x2c, 0x14, 0x39, 0x85, 0xcd, 0xcb, 0x4e, 0xa0, 0xc6, 0x90, 0x90, 0x72, + 0x4a, 0x07, 0x4b, 0x52, 0xe4, 0x14, 0x4e, 0x22, 0x79, 0x38, 0x9e, 0x94, 0x53, 0x30, 0x83, 0x57, + 0xc4, 0xc3, 0xf1, 0x68, 0x0f, 0x59, 0x27, 0x24, 0x21, 0x6f, 0xc3, 0x78, 0xa9, 0x1b, 0xb8, 0x82, + 0xb1, 0xb0, 0x0a, 0x8f, 0xec, 0xb7, 0x45, 0x53, 0xb4, 0xab, 0x4f, 0x84, 0x6e, 0xfc, 0x59, 0x0e, + 0x2e, 0x26, 0x87, 0x57, 0x94, 0x86, 0xeb, 0x23, 0x73, 0xca, 0xfa, 0x48, 0x9b, 0x0d, 0xd9, 0x28, + 0xbf, 0xc4, 0x93, 0x98, 0x0d, 0x3c, 0x5f, 0xf2, 0x87, 0x9c, 0x0d, 0x35, 0x18, 0x57, 0xcf, 0xbb, + 0xa1, 0x0f, 0x7b, 0xde, 0xa9, 0x5c, 0xd8, 0xa5, 0x9e, 0x87, 0xce, 0x18, 0x8e, 0x9e, 0x8e, 0xe2, + 0x51, 0x33, 0x38, 0x06, 0xf9, 0x37, 0xe0, 0x32, 0xdf, 0x93, 0xe2, 0x1f, 0xbb, 0x74, 0x24, 0x39, + 0x8a, 0x81, 0x5b, 0x3c, 0x39, 0x2e, 0x5e, 0xe7, 0xaa, 0x12, 0x2b, 0xd1, 0x6d, 0xd6, 0xce, 0x91, + 0x25, 0x5b, 0xa6, 0x54, 0x72, 0x2a, 0x6f, 0xa3, 0x0c, 0x17, 0x45, 0x69, 0xe4, 0xb4, 0x2d, 0x0b, + 0xd9, 0x20, 0x1f, 0x44, 0xda, 0x2e, 0x1c, 0xe4, 0x98, 0x22, 0x0b, 0xcb, 0x31, 0xd3, 0xb2, 0x92, + 0x05, 0xf7, 0xf5, 0x34, 0x9f, 0x1b, 0x1e, 0xb5, 0x9b, 0x83, 0x75, 0x77, 0x1b, 0xa9, 0x53, 0xcb, + 0xa6, 0xea, 0xd4, 0xa4, 0x52, 0x26, 0x97, 0xaa, 0x94, 0xa9, 0xc0, 0x74, 0xad, 0xbb, 0x23, 0xeb, + 0x8e, 0xfb, 0x6b, 0xfa, 0xdd, 0x9d, 0xb4, 0x5e, 0x89, 0x93, 0x18, 0x3f, 0x9a, 0x85, 0x89, 0x8d, + 0x66, 0x77, 0xcf, 0x69, 0x57, 0xec, 0xc0, 0x7e, 0x6a, 0xd5, 0x7c, 0x6f, 0x6a, 0x6a, 0xbe, 0xd0, + 0xb5, 0x2c, 0xfc, 0xb0, 0x81, 0x74, 0x7c, 0x3f, 0x93, 0x81, 0xe9, 0x88, 0x84, 0x1f, 0xd6, 0x2b, + 0x30, 0xc4, 0x7e, 0x88, 0xcb, 0xef, 0xe5, 0x04, 0x63, 0x9e, 0x7a, 0x31, 0xfc, 0x4b, 0x28, 0xde, + 0xf4, 0xbc, 0x66, 0xc8, 0x61, 0xe1, 0xb3, 0x30, 0x16, 0xb1, 0x3d, 0x4b, 0xca, 0xc5, 0x5f, 0xcf, + 0x40, 0x21, 0xfe, 0x25, 0xe4, 0x3e, 0x8c, 0x32, 0x4e, 0x0e, 0x95, 0xf7, 0xf2, 0x97, 0x7a, 0x7c, + 0xf3, 0x75, 0x81, 0xc6, 0x9b, 0x87, 0x9d, 0x4f, 0x39, 0xc4, 0x94, 0x1c, 0x16, 0x4c, 0x98, 0x50, + 0xb1, 0x52, 0x5a, 0xf7, 0x9a, 0x2e, 0xa1, 0x9c, 0x4f, 0xef, 0x07, 0x2d, 0x51, 0xa4, 0xd6, 0x6a, + 0x21, 0x7c, 0x5c, 0xd1, 0x26, 0x57, 0xea, 0xaa, 0xc2, 0x49, 0xb3, 0x18, 0x65, 0x29, 0x50, 0xe7, + 0x59, 0xca, 0x84, 0x0e, 0xf1, 0xc8, 0x6b, 0x30, 0xc2, 0xeb, 0x53, 0x13, 0xa6, 0x75, 0x10, 0xa2, + 0xca, 0xc9, 0x1c, 0xc7, 0xf8, 0x07, 0x39, 0x38, 0x1f, 0x35, 0x6f, 0xab, 0xd3, 0xb0, 0x03, 0xba, + 0x61, 0x7b, 0x76, 0xcb, 0x3f, 0x65, 0x05, 0x5c, 0x4d, 0x34, 0x0d, 0x13, 0x68, 0xc9, 0xa6, 0x29, + 0x0d, 0x32, 0x62, 0x0d, 0x42, 0x1d, 0x28, 0x6f, 0x90, 0x6c, 0x06, 0xb9, 0x0f, 0xb9, 0x1a, 0x0d, + 0xc4, 0xde, 0x7b, 0x25, 0xd1, 0xab, 0x6a, 0xbb, 0xae, 0xd7, 0x68, 0xc0, 0x07, 0x91, 0xc7, 0x85, + 0xd2, 0x82, 0xf3, 0x31, 0x2e, 0x64, 0x1b, 0x46, 0x96, 0x1f, 0x77, 0x68, 0x3d, 0x10, 0x09, 0x43, + 0xaf, 0xf5, 0xe7, 0xc7, 0x71, 0x95, 0x7c, 0xa1, 0x14, 0x01, 0x6a, 0x67, 0x71, 0x94, 0x85, 0xdb, + 0x90, 0x97, 0x95, 0x9f, 0x65, 0xe6, 0x2e, 0xbc, 0x09, 0xe3, 0x4a, 0x25, 0x67, 0x9a, 0xf4, 0xbf, + 0xc0, 0xf6, 0x55, 0xb7, 0x29, 0x73, 0x8c, 0x2e, 0x27, 0x64, 0x45, 0x25, 0x07, 0x15, 0x97, 0x15, + 0xad, 0x03, 0x51, 0xd4, 0x47, 0x68, 0xac, 0xc2, 0x74, 0xed, 0xc0, 0xe9, 0x44, 0x81, 0x62, 0xb5, + 0x13, 0x19, 0xf3, 0xdc, 0x88, 0x8b, 0x7b, 0xfc, 0x44, 0x8e, 0xd3, 0x19, 0x7f, 0x99, 0x81, 0x11, + 0xf6, 0xd7, 0xc3, 0xdb, 0x4f, 0xe9, 0x96, 0x79, 0x4b, 0xdb, 0x32, 0x67, 0x94, 0x58, 0xed, 0xb8, + 0x71, 0xdc, 0x3e, 0x65, 0xb3, 0x3c, 0x16, 0x03, 0xc4, 0x91, 0xc9, 0x5d, 0x18, 0x15, 0x26, 0x45, + 0xc2, 0xf6, 0x5b, 0x0d, 0xfe, 0x2e, 0x8d, 0x8d, 0xc2, 0x1b, 0xbe, 0xdb, 0x89, 0xab, 0x44, 0x24, + 0x35, 0x93, 0xeb, 0x65, 0xc8, 0x5e, 0x2d, 0x33, 0xb5, 0x8b, 0xce, 0x7a, 0x3c, 0x74, 0xb9, 0x92, + 0x4b, 0xbe, 0x87, 0x6f, 0x7d, 0x49, 0xbc, 0x86, 0xe4, 0xfa, 0x31, 0x39, 0x2f, 0x13, 0xf7, 0xa6, + 0x3e, 0x94, 0xfc, 0xf1, 0x39, 0x1e, 0xf0, 0x5b, 0x36, 0xec, 0x1d, 0x98, 0xb8, 0xe3, 0x7a, 0x87, + 0xb6, 0xc7, 0xc3, 0xb8, 0x0a, 0xf3, 0x03, 0x76, 0xff, 0x9c, 0xdc, 0xe5, 0x70, 0x1e, 0x08, 0xf6, + 0xbb, 0xc7, 0xc5, 0xa1, 0x25, 0xd7, 0x6d, 0x9a, 0x1a, 0x3a, 0x79, 0x00, 0x93, 0x6b, 0xf6, 0x63, + 0xe5, 0xe6, 0xcc, 0xbd, 0x6f, 0xae, 0xb1, 0x09, 0xcc, 0xae, 0xde, 0xa7, 0xdb, 0x77, 0xe9, 0xf4, + 0x98, 0xfb, 0xca, 0xf5, 0x02, 0x51, 0x89, 0xd3, 0xde, 0x13, 0x1f, 0x9b, 0xb4, 0x50, 0xbb, 0x91, + 0x6a, 0xa1, 0x76, 0xb1, 0xe3, 0x7a, 0x81, 0xb5, 0x1b, 0x92, 0x6b, 0x01, 0xd5, 0x34, 0xc6, 0xe4, + 0x1d, 0x98, 0x51, 0x62, 0x4d, 0xde, 0x71, 0xbd, 0x96, 0x2d, 0x25, 0x7b, 0x54, 0x26, 0xa3, 0xd1, + 0xca, 0x2e, 0x82, 0xcd, 0x24, 0x26, 0xf9, 0x72, 0x9a, 0x3f, 0xd3, 0x70, 0x64, 0xe2, 0x96, 0xe2, + 0xcf, 0xd4, 0xcb, 0xc4, 0x2d, 0xe9, 0xd9, 0xb4, 0xd7, 0xcf, 0x04, 0x36, 0xbf, 0x74, 0x53, 0xdc, + 0xe1, 0x4f, 0x37, 0x71, 0x0d, 0xc7, 0xad, 0x87, 0xa9, 0xeb, 0x22, 0xe4, 0x96, 0x36, 0xee, 0xe0, + 0x13, 0x88, 0xb4, 0xd6, 0x69, 0xef, 0xdb, 0xed, 0x3a, 0x4a, 0xdc, 0xc2, 0xec, 0x5c, 0xdd, 0x91, + 0x97, 0x36, 0xee, 0x10, 0x1b, 0x66, 0x31, 0x8d, 0x58, 0xf0, 0xa5, 0x9b, 0x37, 0x95, 0x81, 0xca, + 0x63, 0xd3, 0x6e, 0x88, 0xa6, 0x15, 0x31, 0x09, 0x59, 0x60, 0x3d, 0xbe, 0x79, 0x33, 0x75, 0x38, + 0xc2, 0x86, 0xa5, 0xf1, 0x62, 0x3b, 0xe3, 0x9a, 0xfd, 0x38, 0xf2, 0x16, 0xf0, 0x85, 0x67, 0xe8, + 0xf3, 0x72, 0x62, 0x45, 0x9e, 0x06, 0xda, 0xce, 0xa8, 0x13, 0xb1, 0x0b, 0x53, 0x34, 0xbd, 0x7c, + 0xe1, 0x53, 0xb3, 0x20, 0xf5, 0x42, 0xd2, 0x7d, 0x58, 0x95, 0xfa, 0x15, 0x74, 0xb2, 0x15, 0x5e, + 0xfb, 0xf8, 0xb5, 0x49, 0xa4, 0xa5, 0xbd, 0xa1, 0x5e, 0xfb, 0xb8, 0x36, 0x46, 0xfb, 0xac, 0xe9, + 0x50, 0x57, 0xc0, 0xdd, 0x27, 0x4c, 0x9d, 0x4b, 0xf2, 0x36, 0x39, 0x71, 0xf6, 0xdb, 0x24, 0x85, + 0xa1, 0x55, 0xb7, 0x7e, 0x20, 0xa2, 0xc0, 0x7d, 0x91, 0x2d, 0xf7, 0xa6, 0x5b, 0x3f, 0x78, 0x72, + 0xa6, 0xbd, 0xc8, 0x9e, 0xac, 0xb3, 0xa6, 0xb2, 0x59, 0x20, 0xfa, 0x44, 0x98, 0x8b, 0xce, 0x85, + 0xd7, 0x29, 0xa5, 0x8c, 0x0b, 0x3e, 0x7c, 0xd2, 0xc8, 0xae, 0x35, 0x75, 0x72, 0x42, 0xa1, 0x50, + 0xa1, 0xfe, 0x41, 0xe0, 0x76, 0xca, 0x4d, 0xa7, 0xb3, 0xe3, 0xda, 0x9e, 0x8c, 0x19, 0x9c, 0x5c, + 0xdf, 0xaf, 0xa4, 0xae, 0xef, 0x99, 0x06, 0xa7, 0xb7, 0xea, 0x92, 0x81, 0x99, 0x60, 0x49, 0xbe, + 0x0c, 0x53, 0x6c, 0x72, 0x2f, 0x3f, 0x0e, 0x68, 0x9b, 0x8f, 0xfc, 0x0c, 0x8a, 0x0e, 0x73, 0x4a, + 0x92, 0x8c, 0xb0, 0x90, 0xcf, 0x29, 0x5c, 0xec, 0x34, 0x24, 0xd0, 0x22, 0xe8, 0x69, 0xac, 0x48, + 0x03, 0xe6, 0xd7, 0xec, 0xc7, 0x4a, 0x32, 0x5d, 0x65, 0x92, 0x12, 0x9c, 0x60, 0x57, 0x4f, 0x8e, + 0x8b, 0x2f, 0xb1, 0x09, 0x16, 0x85, 0xb1, 0xee, 0x31, 0x5f, 0x7b, 0x72, 0x22, 0xdf, 0x82, 0x0b, + 0xe2, 0xb3, 0x2a, 0x98, 0x96, 0xca, 0xf5, 0x8e, 0x6a, 0xfb, 0x36, 0x3a, 0x0a, 0xcd, 0x9e, 0x6d, + 0x43, 0x94, 0x1d, 0xd6, 0x90, 0x7c, 0x2c, 0x9f, 0x33, 0x32, 0x7b, 0xd5, 0x40, 0x3e, 0x80, 0x29, + 0xfe, 0xee, 0xb3, 0xe2, 0xfa, 0x01, 0x6a, 0x05, 0xe6, 0xce, 0x66, 0xff, 0xce, 0x1f, 0x93, 0xb8, + 0xc7, 0x48, 0x4c, 0x8b, 0x10, 0xe3, 0x4c, 0xde, 0x82, 0xf1, 0x0d, 0xa7, 0xcd, 0x63, 0x5c, 0x56, + 0x37, 0x50, 0x7f, 0x29, 0xce, 0x9f, 0x8e, 0xd3, 0xb6, 0xe4, 0xd5, 0xbc, 0x13, 0x6e, 0x17, 0x2a, + 0x36, 0xd9, 0x86, 0xf1, 0x5a, 0x6d, 0xe5, 0x8e, 0xc3, 0x0e, 0xc0, 0xce, 0xd1, 0xfc, 0xf9, 0x1e, + 0xad, 0x7c, 0x31, 0xb5, 0x95, 0x93, 0xbe, 0xbf, 0x6f, 0xed, 0x3a, 0x4d, 0x6a, 0xd5, 0xdd, 0xce, + 0x91, 0xa9, 0x72, 0x4a, 0xb1, 0x09, 0xbf, 0xf0, 0x84, 0x6d, 0xc2, 0xab, 0x30, 0xad, 0x58, 0x69, + 0xa2, 0x85, 0xe6, 0x7c, 0x14, 0x18, 0x49, 0xb5, 0x01, 0x8f, 0xfb, 0x40, 0xc6, 0xe9, 0xa4, 0x31, + 0xf8, 0xc5, 0xb3, 0x1a, 0x83, 0x3b, 0x30, 0xc3, 0x07, 0x43, 0xcc, 0x03, 0x1c, 0xe9, 0x85, 0x1e, + 0x7d, 0x78, 0x2d, 0xb5, 0x0f, 0x67, 0xc5, 0x48, 0xcb, 0x49, 0x86, 0xef, 0x9c, 0x49, 0xae, 0x64, + 0x17, 0x88, 0x00, 0xda, 0x81, 0xbd, 0x63, 0xfb, 0x14, 0xeb, 0x7a, 0xb6, 0x47, 0x5d, 0x2f, 0xa5, + 0xd6, 0x35, 0x25, 0xeb, 0xda, 0xe1, 0xd5, 0xa4, 0x70, 0x24, 0x6d, 0x59, 0x8f, 0x9c, 0x5f, 0xd8, + 0xb1, 0xcf, 0x69, 0xca, 0xd4, 0x24, 0x02, 0x8f, 0x31, 0x14, 0x9f, 0xb4, 0xf1, 0x7e, 0x4f, 0xe1, + 0x4c, 0x1e, 0xc3, 0xf9, 0x64, 0x2b, 0xb0, 0xce, 0xe7, 0xb1, 0xce, 0xe7, 0xb5, 0x3a, 0xe3, 0x48, + 0x7c, 0xde, 0xe8, 0x9f, 0x15, 0xaf, 0xb5, 0x07, 0x7f, 0xf2, 0x43, 0x19, 0xb8, 0xb0, 0x76, 0xa7, + 0x84, 0xc9, 0x2a, 0x1d, 0x1e, 0xf2, 0x2c, 0xf4, 0x1d, 0xbd, 0x24, 0x14, 0xee, 0xf1, 0x47, 0x00, + 0x29, 0x71, 0xe0, 0x56, 0xc1, 0x64, 0xc4, 0x17, 0x5b, 0xbb, 0x36, 0xcf, 0x81, 0x29, 0x58, 0xa4, + 0x38, 0x98, 0x7e, 0xfb, 0x4f, 0x8a, 0x19, 0xb3, 0x57, 0x55, 0xa4, 0x09, 0x0b, 0x7a, 0xb7, 0x48, + 0x73, 0xfd, 0x7d, 0xda, 0x6c, 0xce, 0x17, 0x71, 0x46, 0xbf, 0x76, 0x72, 0x5c, 0xbc, 0x9a, 0xe8, + 0xdd, 0xd0, 0x05, 0x80, 0x61, 0x2a, 0x1f, 0xdc, 0x87, 0xdf, 0xbd, 0xa1, 0xfc, 0x64, 0x61, 0x2a, + 0xc5, 0x58, 0xdd, 0xf8, 0xed, 0x6c, 0xec, 0xa4, 0x22, 0x55, 0x18, 0x15, 0x13, 0x50, 0x88, 0xee, + 0xc9, 0x69, 0xf6, 0x7c, 0xea, 0x34, 0x1b, 0x15, 0x73, 0xd9, 0x94, 0xf4, 0xe4, 0x90, 0xb1, 0xc2, 0x56, 0x88, 0xbb, 0xce, 0x57, 0xf9, 0x41, 0x84, 0x20, 0xed, 0xc8, 0xad, 0x9c, 0xdd, 0x05, 0x4b, 0xf7, 0xf0, 0xc3, 0xb3, 0x57, 0xd6, 0x46, 0x0e, 0x78, 0x12, 0xa1, 0x5c, 0xe8, 0xc7, 0xa3, 0x67, - 0x0c, 0x7a, 0x6a, 0x15, 0xb2, 0x5a, 0x8c, 0xdf, 0xcc, 0xc0, 0xa4, 0x76, 0xd4, 0x91, 0x3b, 0x8a, - 0x93, 0x5a, 0xe4, 0xb7, 0xad, 0xe1, 0xe0, 0xee, 0x17, 0x77, 0x5f, 0xbb, 0x23, 0x2c, 0xce, 0xb3, + 0x0c, 0x7a, 0x62, 0x15, 0xb2, 0x5a, 0x8c, 0xdf, 0xca, 0xc0, 0xa4, 0x76, 0xd4, 0x91, 0xdb, 0x8a, + 0x93, 0x5a, 0xe4, 0xb7, 0xad, 0xe1, 0xe0, 0xee, 0x17, 0x77, 0x5f, 0xbb, 0x2d, 0x2c, 0xce, 0xb3, 0xbd, 0xe9, 0x70, 0xf6, 0xc7, 0x7d, 0x16, 0xfb, 0x6b, 0x06, 0xc3, 0xbc, 0x87, 0x43, 0x3d, 0xf2, - 0x1e, 0xfe, 0xda, 0x0b, 0x30, 0xa5, 0xdf, 0x85, 0xc8, 0xeb, 0x30, 0x82, 0x5a, 0x59, 0x79, 0xb1, - 0x46, 0x85, 0x00, 0x2a, 0x6e, 0x35, 0x37, 0x04, 0x8e, 0x43, 0x5e, 0x01, 0x08, 0x4d, 0x7f, 0xe5, - 0x9b, 0xc4, 0xf0, 0xc9, 0x71, 0x31, 0xf3, 0x86, 0xa9, 0x14, 0x90, 0xaf, 0x01, 0xac, 0xbb, 0x0d, - 0x1a, 0xe6, 0x9a, 0xed, 0xf3, 0xee, 0xfe, 0x6a, 0x22, 0xc1, 0xc6, 0xb9, 0xb6, 0xdb, 0xa0, 0xc9, + 0x1e, 0xfe, 0xfa, 0x73, 0x30, 0xa5, 0xdf, 0x85, 0xc8, 0x6b, 0x30, 0x82, 0x5a, 0x59, 0x79, 0xb1, + 0x46, 0x85, 0x00, 0x2a, 0x6e, 0x35, 0x37, 0x04, 0x8e, 0x43, 0x5e, 0x06, 0x08, 0x4d, 0x7f, 0xe5, + 0x9b, 0xc4, 0xf0, 0xc9, 0x71, 0x31, 0xf3, 0xba, 0xa9, 0x14, 0x90, 0xaf, 0x01, 0xac, 0xbb, 0x0d, + 0x1a, 0x26, 0xb3, 0xed, 0xf3, 0xee, 0xfe, 0x4a, 0x22, 0xc1, 0xc6, 0xb9, 0xb6, 0xdb, 0xa0, 0xc9, 0x6c, 0x1a, 0x0a, 0x47, 0xf2, 0x79, 0x18, 0x36, 0xbb, 0xec, 0x12, 0xcf, 0xf5, 0x27, 0xe3, 0xf2, - 0xc8, 0xe9, 0x36, 0x69, 0x74, 0x43, 0xf4, 0xba, 0x71, 0x93, 0x32, 0x06, 0x20, 0xef, 0xf3, 0xc4, + 0xc8, 0xe9, 0x36, 0x69, 0x74, 0x43, 0xf4, 0xba, 0x71, 0x93, 0x32, 0x06, 0x20, 0xef, 0xf1, 0xc4, 0x1b, 0x22, 0x3a, 0xe4, 0x70, 0xf4, 0x4a, 0xa3, 0x88, 0x22, 0x89, 0xf8, 0x90, 0x0a, 0x09, 0x79, - 0x08, 0xa3, 0xea, 0xf3, 0x82, 0xe2, 0xed, 0xac, 0x3e, 0x41, 0x29, 0xd7, 0x4d, 0x91, 0xa4, 0x36, - 0xfe, 0xf2, 0x20, 0xb9, 0x90, 0x77, 0x60, 0x8c, 0xb1, 0x67, 0x4b, 0xd9, 0x17, 0xd7, 0x0c, 0x7c, + 0x00, 0xa3, 0xea, 0xf3, 0x82, 0xe2, 0xed, 0xac, 0x3e, 0x41, 0x29, 0xd7, 0x4d, 0x91, 0x05, 0x37, + 0xfe, 0xf2, 0x20, 0xb9, 0x90, 0xb7, 0x61, 0x8c, 0xb1, 0x67, 0x4b, 0xd9, 0x17, 0xd7, 0x0c, 0x7c, 0x8b, 0x51, 0x1a, 0xc4, 0xb6, 0x03, 0x2d, 0x86, 0x63, 0x48, 0x40, 0xbe, 0x8c, 0x79, 0x4b, 0x45, - 0x57, 0xf7, 0xb5, 0xc7, 0xb8, 0x9a, 0xe8, 0x6a, 0x4c, 0x64, 0x9a, 0xe8, 0xe9, 0x88, 0x1f, 0xd9, - 0x0b, 0x83, 0x6d, 0x0d, 0x92, 0x2c, 0xe5, 0xb5, 0x44, 0x05, 0xf3, 0x32, 0x7e, 0x54, 0x32, 0x67, - 0xb0, 0xc6, 0x97, 0x74, 0xa0, 0x10, 0x49, 0x79, 0xa2, 0x2e, 0xe8, 0x57, 0xd7, 0x1b, 0x89, 0xba, + 0x57, 0xf7, 0xb5, 0xc7, 0xb8, 0x92, 0xe8, 0x6a, 0x4c, 0x64, 0x9a, 0xe8, 0xe9, 0x88, 0x1f, 0xd9, + 0x0b, 0x83, 0x6d, 0x0d, 0x92, 0x2c, 0xe5, 0xd5, 0x44, 0x05, 0xf3, 0x32, 0x7e, 0x54, 0x32, 0x29, + 0xb1, 0xc6, 0x97, 0x74, 0xa0, 0x10, 0x49, 0x79, 0xa2, 0x2e, 0xe8, 0x57, 0xd7, 0xeb, 0x89, 0xba, 0xd4, 0x01, 0x4c, 0x54, 0x97, 0xe0, 0x4e, 0x1a, 0x30, 0x25, 0x4f, 0x0c, 0x51, 0xdf, 0x78, 0xbf, - 0xfa, 0x5e, 0x49, 0xd4, 0x37, 0xdb, 0xd8, 0x49, 0xd6, 0x13, 0xe3, 0x49, 0xde, 0x81, 0x49, 0x09, - 0xe1, 0x19, 0x7c, 0x27, 0xa2, 0x1c, 0xab, 0x8d, 0x9d, 0x44, 0xde, 0x5e, 0x1d, 0x59, 0xa5, 0xe6, - 0xb3, 0x63, 0x52, 0xa3, 0x8e, 0xcf, 0x0a, 0x1d, 0x99, 0x7c, 0x00, 0xe3, 0xd5, 0x16, 0xfb, 0x10, - 0xb7, 0x6d, 0x07, 0x54, 0x78, 0xc2, 0x49, 0xdb, 0x12, 0xa5, 0x44, 0x99, 0xaa, 0x3c, 0x37, 0x71, - 0x54, 0xa4, 0xe5, 0x26, 0x8e, 0xc0, 0xac, 0xf3, 0xf8, 0x7b, 0x92, 0x98, 0xc3, 0xd2, 0x4b, 0xee, - 0x52, 0x8a, 0x7d, 0x87, 0xc2, 0x5e, 0x44, 0x02, 0x64, 0x50, 0xf9, 0x9e, 0x13, 0x8b, 0xc2, 0xaa, - 0xf2, 0x24, 0xef, 0xc2, 0xb8, 0xc8, 0x23, 0x55, 0x32, 0xd7, 0xfd, 0xf9, 0x02, 0x7e, 0x3c, 0xfa, - 0xf6, 0xcb, 0x94, 0x53, 0x96, 0xed, 0xc5, 0x0c, 0x19, 0x23, 0x7c, 0xf2, 0x25, 0x98, 0xdb, 0x76, - 0xda, 0x0d, 0xf7, 0xd0, 0x17, 0xc7, 0x94, 0xd8, 0xe8, 0x66, 0x22, 0x37, 0xa2, 0x43, 0x5e, 0x1e, - 0x0a, 0x67, 0x89, 0x8d, 0x2f, 0x95, 0x03, 0xf9, 0x9b, 0x09, 0xce, 0x7c, 0x06, 0x91, 0x7e, 0x33, + 0xfa, 0x5e, 0x4e, 0xd4, 0x37, 0xdb, 0xd8, 0x49, 0xd6, 0x13, 0xe3, 0x49, 0xde, 0x86, 0x49, 0x09, + 0xe1, 0x29, 0x82, 0x27, 0xa2, 0x1c, 0xab, 0x8d, 0x9d, 0x44, 0x62, 0x60, 0x1d, 0x59, 0xa5, 0xe6, + 0xb3, 0x63, 0x52, 0xa3, 0x8e, 0xcf, 0x0a, 0x1d, 0x99, 0xbc, 0x0f, 0xe3, 0xd5, 0x16, 0xfb, 0x10, + 0xb7, 0x6d, 0x07, 0x54, 0x78, 0xc2, 0x49, 0xdb, 0x12, 0xa5, 0x44, 0x99, 0xaa, 0x3c, 0xf9, 0x71, + 0x54, 0xa4, 0x25, 0x3f, 0x8e, 0xc0, 0xac, 0xf3, 0xf8, 0x7b, 0x92, 0x98, 0xc3, 0xd2, 0x4b, 0xee, + 0xf9, 0x14, 0xfb, 0x0e, 0x85, 0xbd, 0x88, 0x04, 0xc8, 0xa0, 0xf2, 0x3d, 0x27, 0x16, 0x85, 0x55, + 0xe5, 0x49, 0xde, 0x81, 0x71, 0x91, 0x47, 0xaa, 0x64, 0xae, 0xfb, 0xf3, 0x05, 0xfc, 0x78, 0xf4, + 0xed, 0x97, 0x29, 0xa7, 0x2c, 0xdb, 0x8b, 0x19, 0x32, 0x46, 0xf8, 0xe4, 0x4b, 0x30, 0xb7, 0xed, + 0xb4, 0x1b, 0xee, 0xa1, 0x2f, 0x8e, 0x29, 0xb1, 0xd1, 0xcd, 0x44, 0x6e, 0x44, 0x87, 0xbc, 0x3c, + 0x14, 0xce, 0x12, 0x1b, 0x5f, 0x2a, 0x07, 0xf2, 0xbd, 0x09, 0xce, 0x7c, 0x06, 0x91, 0x7e, 0x33, 0x68, 0x31, 0x31, 0x83, 0x92, 0xd5, 0xc7, 0xa7, 0x53, 0x6a, 0x35, 0xc4, 0x05, 0xa2, 0x9f, 0xef, - 0xf7, 0x5d, 0xa7, 0x3d, 0x3f, 0x8b, 0x7b, 0xe1, 0xf3, 0x71, 0x6f, 0x7a, 0xc4, 0x13, 0x39, 0x9e, - 0x8d, 0x93, 0xe3, 0xe2, 0xe5, 0xb8, 0x10, 0xfe, 0xa1, 0xab, 0x29, 0xca, 0x53, 0x58, 0x93, 0x0f, - 0x60, 0x82, 0xfd, 0x1f, 0x6a, 0x09, 0xe6, 0x34, 0x8b, 0x40, 0x05, 0x53, 0xd4, 0x83, 0x63, 0x84, - 0x89, 0xae, 0x52, 0x14, 0x08, 0x1a, 0x2b, 0xf2, 0x16, 0x00, 0x93, 0x63, 0xc4, 0x76, 0x7c, 0x2e, - 0x0a, 0x7a, 0x8b, 0x62, 0x50, 0x72, 0x23, 0x8e, 0x90, 0xc9, 0x3b, 0x30, 0xce, 0x7e, 0xd5, 0xba, + 0xf7, 0x5c, 0xa7, 0x3d, 0x3f, 0x8b, 0x7b, 0xe1, 0xb3, 0x71, 0x6f, 0x7a, 0xc4, 0x13, 0x49, 0xa4, + 0x8d, 0x93, 0xe3, 0xe2, 0xa5, 0xb8, 0x10, 0xfe, 0x81, 0xab, 0x29, 0xca, 0x53, 0x58, 0x93, 0xf7, + 0x61, 0x82, 0xfd, 0x1f, 0x6a, 0x09, 0xe6, 0x34, 0x8b, 0x40, 0x05, 0x53, 0xd4, 0x83, 0x63, 0x84, + 0x89, 0xae, 0x52, 0x14, 0x08, 0x1a, 0x2b, 0xf2, 0x26, 0x00, 0x93, 0x63, 0xc4, 0x76, 0x7c, 0x2e, + 0x0a, 0x7a, 0x8b, 0x62, 0x50, 0x72, 0x23, 0x8e, 0x90, 0xc9, 0xdb, 0x30, 0xce, 0x7e, 0xd5, 0xba, 0x0d, 0x97, 0xad, 0x8d, 0xf3, 0x48, 0xcb, 0x9d, 0x12, 0x19, 0xad, 0xcf, 0xe1, 0x9a, 0x53, 0x62, 0x84, 0x4e, 0x56, 0x60, 0x1a, 0x83, 0x13, 0x8b, 0xb0, 0x98, 0x0e, 0xf5, 0xe7, 0x2f, 0x28, 0xef, 0xe0, 0xac, 0xc8, 0x72, 0xc2, 0x32, 0xf5, 0x72, 0x11, 0x23, 0x23, 0x3e, 0xcc, 0x26, 0x1f, 0x12, 0xfd, 0xf9, 0x79, 0xec, 0x24, 0x29, 0x52, 0x27, 0x31, 0xf8, 0x7e, 0xcc, 0x46, 0x44, 0xd9, 0xb8, - 0xe4, 0x73, 0x82, 0x5a, 0x61, 0x1a, 0x77, 0x62, 0x02, 0xb9, 0x57, 0xde, 0x88, 0x47, 0xef, 0xbd, + 0xe4, 0x73, 0x82, 0x5a, 0x61, 0x1a, 0x77, 0x62, 0x02, 0xb9, 0x5b, 0xde, 0x88, 0x47, 0xef, 0xbd, 0x88, 0x5f, 0x80, 0xc3, 0xbc, 0x57, 0x8f, 0xb2, 0x46, 0xa7, 0x44, 0xf0, 0x4d, 0xa1, 0x26, 0xdf, 0x84, 0x73, 0x72, 0x07, 0x11, 0x45, 0x62, 0x5e, 0x2f, 0x9c, 0x71, 0x27, 0x6e, 0xec, 0x84, 0x55, - 0x27, 0xa6, 0x74, 0x7a, 0x15, 0xc4, 0x86, 0x71, 0x1c, 0x56, 0x51, 0xe3, 0xf3, 0xfd, 0x6a, 0xbc, - 0x96, 0xa8, 0xf1, 0x3c, 0x4e, 0x94, 0x64, 0x65, 0x2a, 0x4f, 0xb2, 0x04, 0x93, 0x62, 0x1d, 0x89, - 0xd9, 0xf6, 0x02, 0xf6, 0x16, 0x6a, 0x95, 0xe4, 0x0a, 0x4c, 0x4c, 0x38, 0x9d, 0x44, 0xdd, 0x91, - 0xf9, 0x33, 0xc2, 0x25, 0x6d, 0x47, 0x8e, 0xbf, 0x1e, 0xe8, 0xc8, 0x6c, 0x47, 0x8a, 0xa4, 0x98, - 0xe5, 0x27, 0x1d, 0x4f, 0xe8, 0x8c, 0x2e, 0x47, 0xf9, 0x70, 0x14, 0xe1, 0xc7, 0xa2, 0x21, 0x86, - 0xba, 0x25, 0xa4, 0x71, 0x20, 0x5b, 0x30, 0x1b, 0x9e, 0xda, 0x0a, 0xe3, 0x62, 0x14, 0x1f, 0x36, - 0x3a, 0xea, 0xd3, 0xf9, 0xa6, 0xd1, 0x13, 0x1b, 0x2e, 0x68, 0xe7, 0xb4, 0xc2, 0xfa, 0x0a, 0xb2, - 0xc6, 0x2c, 0xe5, 0xfa, 0x21, 0x9f, 0xce, 0xbe, 0x17, 0x1f, 0xf2, 0x21, 0x2c, 0xc4, 0xcf, 0x66, - 0xa5, 0x96, 0x17, 0xb1, 0x96, 0xd7, 0x4e, 0x8e, 0x8b, 0x57, 0x13, 0xc7, 0x7b, 0x7a, 0x45, 0x7d, - 0xb8, 0x91, 0xaf, 0xc1, 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, 0x7d, 0x50, - 0x62, 0x95, 0xa4, 0x57, 0x77, 0x1a, 0x4b, 0x72, 0x08, 0x97, 0xd3, 0x8e, 0x09, 0xa5, 0xd2, 0x97, - 0x43, 0xad, 0xec, 0xa7, 0xd2, 0x8f, 0x9c, 0xf4, 0x9a, 0x4f, 0x61, 0x4b, 0xbe, 0x0c, 0xe7, 0x94, - 0xf5, 0xa5, 0xd4, 0xf7, 0x0a, 0xd6, 0x87, 0x4e, 0xc0, 0xea, 0xc2, 0x4c, 0xaf, 0x25, 0x9d, 0x07, - 0x69, 0xc1, 0xac, 0xfc, 0x70, 0x54, 0x7f, 0x8b, 0xa3, 0xe7, 0xaa, 0xb6, 0xab, 0x26, 0x31, 0x96, - 0xae, 0x88, 0x5d, 0x75, 0xbe, 0xb1, 0x63, 0x75, 0x22, 0x42, 0x75, 0xa6, 0xa7, 0xf0, 0x25, 0x2b, - 0x30, 0x52, 0xdb, 0xa8, 0xde, 0xbd, 0xbb, 0x3c, 0xff, 0x2a, 0xd6, 0x20, 0x3d, 0x86, 0x38, 0x50, - 0xbb, 0x34, 0x09, 0x43, 0xb5, 0x8e, 0xb3, 0xbb, 0xab, 0x39, 0x66, 0x71, 0x54, 0xf2, 0x37, 0xd1, - 0x44, 0x8c, 0xed, 0xa8, 0x25, 0xdf, 0x77, 0xf6, 0x30, 0xde, 0xb0, 0x3f, 0xff, 0x9a, 0xf6, 0xd2, - 0x2b, 0x63, 0x31, 0x97, 0x31, 0x55, 0x55, 0x02, 0x9d, 0x4b, 0x9b, 0x27, 0xc7, 0xc5, 0x4b, 0x62, - 0xe7, 0xb6, 0xec, 0x88, 0x95, 0xba, 0x89, 0x27, 0x2b, 0xba, 0x3f, 0x94, 0xbf, 0x56, 0xb8, 0x7e, - 0x7f, 0x28, 0x7f, 0xbd, 0xf0, 0x9a, 0xf9, 0x42, 0xad, 0xb4, 0xb6, 0x5a, 0x6d, 0xc8, 0x8d, 0x5e, - 0x46, 0x7e, 0xe6, 0x7d, 0x6d, 0x5e, 0xed, 0x57, 0x1a, 0x8d, 0x84, 0xf1, 0xf7, 0x32, 0x50, 0x3c, - 0xa5, 0xc1, 0x6c, 0x6f, 0x8d, 0x7a, 0xb3, 0x46, 0x03, 0x35, 0x7e, 0x74, 0x34, 0x0a, 0x96, 0xfe, - 0x78, 0xad, 0x93, 0xa0, 0xeb, 0x93, 0x48, 0x5a, 0xa0, 0x78, 0xc0, 0x25, 0x93, 0x15, 0x48, 0x2c, - 0xe3, 0x17, 0x32, 0x30, 0x9b, 0x32, 0x3e, 0xe4, 0x2a, 0x0c, 0x61, 0x16, 0x22, 0xc5, 0xda, 0x20, - 0x96, 0x7d, 0x08, 0xcb, 0xc9, 0xa7, 0x61, 0xb4, 0xb2, 0x5e, 0xab, 0x95, 0xd6, 0xe5, 0x55, 0x96, - 0x6f, 0xe3, 0x6d, 0xdf, 0xf2, 0x6d, 0xfd, 0x91, 0x52, 0xa0, 0x91, 0x37, 0x60, 0xa4, 0xba, 0x81, - 0x04, 0xdc, 0x66, 0x0e, 0x5b, 0xe8, 0x74, 0xe2, 0xf8, 0x02, 0xc9, 0xf8, 0xf1, 0x0c, 0x90, 0xe4, - 0x64, 0x23, 0xb7, 0x60, 0x5c, 0x9d, 0xd2, 0xfc, 0xe2, 0x8d, 0x0f, 0x6a, 0xca, 0x84, 0x35, 0x55, - 0x1c, 0x52, 0x81, 0x61, 0xcc, 0x1f, 0x19, 0xbe, 0x8e, 0xa6, 0x1e, 0x8c, 0x17, 0x12, 0x07, 0xe3, - 0x30, 0x66, 0xa7, 0x34, 0x39, 0xb1, 0xf1, 0xbb, 0x19, 0x20, 0xe9, 0x36, 0x4f, 0x03, 0x59, 0x67, - 0xbc, 0xa9, 0xf8, 0x3c, 0xab, 0x79, 0x46, 0xc2, 0x24, 0x51, 0xea, 0x25, 0x32, 0xf2, 0x8e, 0xbe, - 0xaa, 0x29, 0x2d, 0x7a, 0x3b, 0xca, 0x5d, 0x87, 0xe1, 0x47, 0xd4, 0xdb, 0x91, 0xe6, 0xa0, 0x68, - 0x42, 0xf6, 0x98, 0x01, 0xd4, 0x4b, 0x3c, 0x62, 0x18, 0x7f, 0x9a, 0x81, 0xb9, 0x34, 0x09, 0xf7, - 0x14, 0x7f, 0x36, 0x23, 0xe6, 0x8a, 0x87, 0x96, 0x19, 0xdc, 0xbe, 0x2c, 0x74, 0xc0, 0x2b, 0xc2, - 0x30, 0xfb, 0x58, 0x39, 0xc2, 0xa8, 0x44, 0x61, 0xbd, 0xe1, 0x9b, 0x1c, 0xce, 0x10, 0x78, 0x6c, - 0xaf, 0x21, 0x0c, 0x0b, 0x87, 0x08, 0x38, 0x1f, 0x4d, 0x0e, 0x67, 0x08, 0x6b, 0x6e, 0x23, 0x4c, - 0x9d, 0x8e, 0x08, 0x2d, 0x06, 0x30, 0x39, 0x9c, 0x5c, 0x85, 0xd1, 0x87, 0xed, 0x55, 0x6a, 0x3f, - 0x96, 0xb1, 0xee, 0xd1, 0x92, 0xc4, 0x6d, 0x5b, 0x4d, 0x06, 0x33, 0x65, 0xa1, 0xf1, 0x33, 0x19, - 0x98, 0x49, 0x08, 0xd7, 0xa7, 0xbb, 0xec, 0xf5, 0xf7, 0x9d, 0x19, 0xe4, 0xfb, 0x78, 0xf3, 0x87, - 0xd2, 0x9b, 0x6f, 0xfc, 0x37, 0x23, 0x70, 0xa1, 0x87, 0xae, 0x23, 0xf2, 0xed, 0xcb, 0x9c, 0xea, - 0xdb, 0xf7, 0x15, 0x98, 0x2c, 0x37, 0x6d, 0xa7, 0xe5, 0x6f, 0xba, 0x51, 0x8b, 0x23, 0x17, 0x01, - 0x2c, 0x93, 0xd9, 0xe3, 0xa5, 0x2d, 0xf9, 0xc5, 0x3a, 0x52, 0x58, 0x81, 0x9b, 0x14, 0xb5, 0x34, - 0x66, 0x09, 0xef, 0xba, 0xdc, 0x5f, 0x11, 0xef, 0x3a, 0xdd, 0xdf, 0x63, 0xe8, 0xa9, 0xfa, 0x7b, - 0xa4, 0xdb, 0x8a, 0x0e, 0x7f, 0x1c, 0xcb, 0xe1, 0x32, 0x4c, 0x72, 0x53, 0x9a, 0x92, 0xcf, 0x07, - 0x69, 0x24, 0x61, 0x7e, 0x63, 0xfb, 0xc9, 0xb1, 0xd0, 0x68, 0xc8, 0x8a, 0xee, 0x9b, 0x30, 0x8a, - 0x4f, 0x80, 0x57, 0x7b, 0xfb, 0x1e, 0x68, 0x4f, 0xff, 0x9a, 0x0f, 0xc2, 0xb7, 0x60, 0x2e, 0xed, - 0xb2, 0x34, 0x9f, 0xd7, 0xac, 0xf4, 0x7a, 0x5a, 0x77, 0x0e, 0x7e, 0xe5, 0x3a, 0x48, 0xbd, 0x72, - 0x49, 0x9f, 0xd1, 0x31, 0x2d, 0x14, 0x6c, 0x8f, 0xb5, 0xc0, 0x71, 0xfb, 0x7b, 0x96, 0x1a, 0x5f, - 0x81, 0x4b, 0x7d, 0xc9, 0xc9, 0xdb, 0x5a, 0x6c, 0x92, 0x57, 0x93, 0xb1, 0x49, 0xbe, 0x7b, 0x5c, - 0x9c, 0xd1, 0xfc, 0xbd, 0xd6, 0x42, 0x75, 0xb1, 0xf1, 0x33, 0x59, 0xdd, 0x53, 0xf1, 0xaf, 0xe2, - 0x42, 0xbd, 0x0e, 0xc3, 0xdb, 0xfb, 0xd4, 0x93, 0xc7, 0x03, 0x36, 0xe4, 0x90, 0x01, 0xd4, 0x86, - 0x20, 0x06, 0xb9, 0x0b, 0x53, 0x1b, 0x7c, 0xe2, 0xca, 0xd9, 0x38, 0x14, 0xdd, 0xd8, 0x3b, 0x42, - 0xaf, 0x94, 0x32, 0x1d, 0x63, 0x54, 0xc6, 0xbd, 0x58, 0xa7, 0x8b, 0xc8, 0x2a, 0xdc, 0xa3, 0x82, - 0x0b, 0x10, 0x53, 0x91, 0x0f, 0x49, 0xb4, 0xd9, 0x9a, 0x31, 0xa8, 0xb1, 0x0b, 0x97, 0xfb, 0x32, - 0x62, 0xe7, 0x36, 0x74, 0xc2, 0x5f, 0x31, 0x8b, 0xcd, 0xbe, 0xa4, 0xa6, 0x42, 0x67, 0x7c, 0x0b, - 0x26, 0xd4, 0x5e, 0xc6, 0x23, 0x88, 0xfd, 0x16, 0xb3, 0x82, 0x1f, 0x41, 0x0c, 0x60, 0x72, 0x78, - 0xf4, 0x12, 0x90, 0x4d, 0x7f, 0x09, 0x88, 0x86, 0x3f, 0x77, 0xda, 0xf0, 0xb3, 0xca, 0x71, 0x87, - 0x53, 0x2a, 0xc7, 0xdf, 0x6a, 0xe5, 0x18, 0x3a, 0xc5, 0xe4, 0xf0, 0xa7, 0x5a, 0xf9, 0xef, 0xc8, - 0xe4, 0x48, 0xe8, 0xb0, 0x21, 0x97, 0x7b, 0x94, 0x04, 0x7e, 0x36, 0x6d, 0xf5, 0x46, 0x98, 0x91, - 0x4c, 0x91, 0x3d, 0x4d, 0xa6, 0x38, 0xcb, 0x44, 0x44, 0x49, 0x95, 0x0f, 0xe9, 0x50, 0x24, 0x07, - 0xda, 0x09, 0xe3, 0x05, 0x89, 0x65, 0x7c, 0x3b, 0x03, 0xe7, 0x52, 0x35, 0xae, 0xac, 0x56, 0xae, - 0xda, 0x55, 0xd6, 0x61, 0x5c, 0xaf, 0xcb, 0x31, 0xce, 0xe2, 0x37, 0x3f, 0xf8, 0xb7, 0x18, 0x2f, - 0xc2, 0x58, 0xf8, 0xde, 0x47, 0xe6, 0xe4, 0xd0, 0xa1, 0x91, 0x9b, 0x7c, 0x36, 0xaa, 0x01, 0xb0, - 0x16, 0x3c, 0x55, 0x93, 0x4c, 0xe3, 0x77, 0xb2, 0x3c, 0x71, 0xe6, 0x33, 0x1b, 0x02, 0x33, 0xdd, - 0x8e, 0x92, 0x7d, 0x52, 0xef, 0xc0, 0x97, 0x64, 0x19, 0x46, 0x6a, 0x81, 0x1d, 0x74, 0xa5, 0xbb, - 0xff, 0xac, 0x4a, 0x86, 0x05, 0x8f, 0x16, 0x23, 0x87, 0x6f, 0x1f, 0x21, 0xda, 0x1d, 0x13, 0x21, - 0x8a, 0x39, 0xe6, 0x1f, 0x64, 0x60, 0x42, 0x25, 0x26, 0x1f, 0xc0, 0x94, 0x0c, 0xec, 0xc7, 0x83, - 0x20, 0x88, 0xc7, 0x49, 0x69, 0xd9, 0x23, 0x03, 0xfb, 0xa9, 0x41, 0x13, 0x34, 0x7c, 0x75, 0xab, - 0xee, 0xa8, 0xc8, 0xa4, 0x01, 0xa4, 0xb5, 0x6b, 0x5b, 0x87, 0xd4, 0x3e, 0xa0, 0x7e, 0x60, 0x71, - 0x0b, 0x0c, 0xf1, 0x86, 0x29, 0xd9, 0xaf, 0xdd, 0x2d, 0x71, 0xe3, 0x0b, 0x36, 0x12, 0x22, 0x42, - 0x63, 0x82, 0x46, 0x7d, 0x98, 0x69, 0xed, 0xda, 0xdb, 0xbc, 0x90, 0xd3, 0x19, 0x7f, 0x36, 0xc2, - 0xa7, 0x9b, 0x88, 0x03, 0xba, 0x03, 0x53, 0x0f, 0xab, 0x95, 0xb2, 0xa2, 0xa6, 0xd5, 0xd3, 0xc8, - 0x2c, 0x3f, 0x09, 0xa8, 0xd7, 0xb6, 0x9b, 0xf2, 0x86, 0x1a, 0x1d, 0x41, 0xae, 0xd3, 0xa8, 0xa7, - 0xab, 0x70, 0x63, 0x1c, 0x59, 0x1d, 0xfc, 0x2e, 0x1c, 0xd6, 0x91, 0x1d, 0xb0, 0x0e, 0xdf, 0x6e, - 0x35, 0x7b, 0xd4, 0xa1, 0x73, 0x24, 0xfb, 0x50, 0xb8, 0x87, 0xd2, 0xa5, 0x52, 0x4b, 0xae, 0x7f, - 0x2d, 0x2f, 0x89, 0x5a, 0x9e, 0xe7, 0x62, 0x69, 0x7a, 0x3d, 0x09, 0xae, 0xd1, 0x3e, 0x31, 0x74, - 0xea, 0x3e, 0xf1, 0x77, 0x32, 0x30, 0xc2, 0xc5, 0x57, 0x31, 0x8d, 0x7b, 0x08, 0xc8, 0xdb, 0x4f, - 0x47, 0x40, 0x2e, 0xe0, 0x39, 0xa1, 0x4d, 0x68, 0x5e, 0x46, 0x2a, 0xb1, 0x75, 0x21, 0xad, 0x88, - 0xf1, 0xc1, 0x85, 0x97, 0x9c, 0xbe, 0x2c, 0x48, 0x35, 0x72, 0xc1, 0x1f, 0x3d, 0xd5, 0xcb, 0x53, - 0x86, 0x2d, 0x18, 0x15, 0x2e, 0xf8, 0xba, 0xe3, 0xfd, 0x2a, 0x8c, 0x09, 0xc7, 0xfe, 0xa5, 0x23, - 0xf1, 0xac, 0x5a, 0xd0, 0x2c, 0x55, 0x1a, 0x4b, 0x47, 0x91, 0x68, 0x2e, 0x42, 0x03, 0x58, 0x3b, - 0x47, 0x5a, 0x1e, 0x52, 0x89, 0x48, 0x1e, 0xf2, 0xfc, 0x7c, 0x3c, 0x52, 0xaa, 0x1e, 0x1a, 0x3d, - 0x84, 0x8b, 0x90, 0x41, 0xd2, 0x3b, 0x38, 0x25, 0x30, 0x6a, 0xc4, 0x83, 0xac, 0x42, 0x01, 0xad, - 0x9b, 0x68, 0x83, 0xaf, 0x9a, 0x6a, 0x85, 0x3b, 0x8f, 0x0b, 0x0b, 0xd5, 0x80, 0x97, 0x89, 0xe5, - 0x16, 0xf3, 0xdb, 0x4a, 0x50, 0xb2, 0xeb, 0x74, 0x21, 0x3e, 0xfb, 0xc8, 0x3b, 0x30, 0x1e, 0x46, - 0xaa, 0x0d, 0x3d, 0x47, 0xf1, 0x79, 0x25, 0x0a, 0x6d, 0xab, 0x67, 0x75, 0x53, 0xd0, 0xc9, 0x22, - 0xe4, 0xd9, 0x22, 0x8e, 0x67, 0x40, 0xed, 0x0a, 0x98, 0xea, 0xc9, 0x21, 0xf1, 0x48, 0x0d, 0x66, - 0xd9, 0xa2, 0xa9, 0x39, 0xed, 0xbd, 0x26, 0x5d, 0x75, 0xf7, 0xdc, 0x6e, 0x10, 0x25, 0x39, 0xe3, - 0x17, 0x18, 0xbb, 0xd5, 0xd4, 0x8a, 0xf5, 0x14, 0x67, 0x29, 0xd4, 0xca, 0x56, 0xf9, 0xc7, 0x59, - 0x18, 0x57, 0xe6, 0x13, 0xb9, 0x0e, 0xf9, 0xaa, 0xbf, 0xea, 0xd6, 0x0f, 0xc2, 0x98, 0x72, 0x93, - 0x27, 0xc7, 0xc5, 0x31, 0xc7, 0xb7, 0x9a, 0x08, 0x34, 0xc3, 0x62, 0xb2, 0x04, 0x93, 0xfc, 0x2f, - 0x99, 0x41, 0x20, 0x1b, 0xa9, 0xb7, 0x38, 0xb2, 0xcc, 0x1d, 0xa0, 0xee, 0x9e, 0x1a, 0x09, 0xf9, - 0x2a, 0x00, 0x07, 0xa0, 0x17, 0x72, 0x6e, 0x70, 0xff, 0x69, 0x51, 0x41, 0x8a, 0xff, 0xb1, 0xc2, - 0x90, 0x7c, 0x9d, 0x47, 0xb6, 0x95, 0xf3, 0x7f, 0x68, 0x70, 0x07, 0x70, 0xc6, 0xdf, 0x4a, 0x8f, - 0x43, 0xa1, 0xb2, 0x14, 0x49, 0x3f, 0x16, 0x4c, 0x5a, 0x77, 0x1f, 0x53, 0xef, 0xa8, 0x14, 0x20, - 0xa2, 0x82, 0x61, 0xfc, 0x2f, 0x19, 0x65, 0xd5, 0x90, 0x75, 0x4c, 0xda, 0xcb, 0x67, 0x84, 0xb0, - 0x30, 0x0a, 0xef, 0x0c, 0x12, 0x6e, 0xd2, 0xdd, 0xa5, 0xe7, 0x85, 0x3d, 0xf4, 0x6c, 0x38, 0xaf, - 0x62, 0xc9, 0x7c, 0x39, 0x90, 0x7c, 0x01, 0x86, 0xb0, 0xeb, 0xb2, 0xa7, 0x7e, 0x9a, 0x3c, 0xb6, - 0x87, 0x58, 0x9f, 0xe1, 0x87, 0x20, 0x25, 0xf9, 0xb4, 0xf0, 0xe0, 0xe4, 0x9d, 0x3f, 0xa5, 0x9c, - 0xbd, 0xac, 0x1d, 0xe1, 0x79, 0x1d, 0x85, 0x22, 0x51, 0x66, 0xcf, 0xdf, 0xcb, 0x42, 0x21, 0xbe, - 0x56, 0xc9, 0xfb, 0x30, 0x21, 0xcf, 0xd3, 0x15, 0x5b, 0x84, 0xbf, 0x9f, 0x10, 0xe1, 0xe7, 0xe5, - 0xa1, 0xba, 0x6f, 0xab, 0x16, 0x49, 0xa6, 0x46, 0xc0, 0x84, 0x9b, 0x4d, 0x11, 0x1a, 0x4c, 0x59, - 0x25, 0x81, 0x1b, 0x74, 0x62, 0x01, 0x55, 0x25, 0x1a, 0x79, 0x13, 0x72, 0x6b, 0x77, 0x4b, 0xc2, - 0xd3, 0xa7, 0x10, 0x3f, 0x75, 0xb9, 0x25, 0xa3, 0x6e, 0x57, 0xc9, 0xf0, 0xc9, 0xaa, 0x12, 0x7b, - 0x78, 0x44, 0xcb, 0x39, 0x26, 0xc1, 0xe1, 0xc7, 0x9d, 0x1e, 0x84, 0xf8, 0xfe, 0x50, 0x3e, 0x57, - 0x18, 0x12, 0xd1, 0x34, 0xff, 0xbb, 0x1c, 0x8c, 0x85, 0xf5, 0x13, 0xa2, 0xfa, 0x4f, 0x72, 0x5f, - 0x49, 0x72, 0x11, 0xf2, 0x52, 0x5c, 0x13, 0x0e, 0x3f, 0xa3, 0xbe, 0x10, 0xd5, 0xe6, 0x41, 0xca, - 0x65, 0x7c, 0x99, 0x9b, 0xf2, 0x27, 0xb9, 0x05, 0xa1, 0xd0, 0xd5, 0x4b, 0x3a, 0x1b, 0x62, 0x03, - 0x66, 0x86, 0x68, 0x64, 0x0a, 0xb2, 0x0e, 0x8f, 0xd0, 0x34, 0x66, 0x66, 0x9d, 0x06, 0x79, 0x1f, - 0xf2, 0x76, 0xa3, 0x41, 0x1b, 0x96, 0x2d, 0x4d, 0x75, 0xfa, 0x4d, 0x9a, 0x3c, 0xe3, 0xc6, 0x0f, - 0x01, 0xa4, 0x2a, 0x05, 0xa4, 0x04, 0x63, 0x4d, 0x9b, 0x5b, 0xe3, 0x35, 0x06, 0x38, 0x51, 0x22, - 0x0e, 0x79, 0x46, 0xb6, 0xe5, 0xd3, 0x06, 0x79, 0x15, 0x86, 0xd8, 0x68, 0x8a, 0x23, 0x44, 0x4a, - 0x89, 0x6c, 0x30, 0x79, 0x87, 0xad, 0x3c, 0x67, 0x22, 0x02, 0x79, 0x19, 0x72, 0xdd, 0xc5, 0x5d, - 0x71, 0x38, 0x14, 0xa2, 0x38, 0xe0, 0x21, 0x1a, 0x2b, 0x26, 0xb7, 0x21, 0x7f, 0xa8, 0x87, 0x90, - 0x3e, 0x17, 0x1b, 0xc6, 0x10, 0x3f, 0x44, 0x24, 0xaf, 0x42, 0xce, 0xf7, 0x5d, 0x61, 0xdf, 0x22, - 0x97, 0x60, 0xad, 0xf6, 0x30, 0x1c, 0x35, 0xc6, 0xdd, 0xf7, 0xdd, 0xa5, 0x3c, 0x8c, 0xf0, 0x13, - 0xc3, 0xb8, 0x0c, 0x10, 0xb5, 0x31, 0xe9, 0xc0, 0x65, 0x7c, 0x15, 0xc6, 0xc2, 0xb6, 0x91, 0x4b, - 0x00, 0x07, 0xf4, 0xc8, 0xda, 0xb7, 0xdb, 0x8d, 0x26, 0x17, 0x37, 0x27, 0xcc, 0xb1, 0x03, 0x7a, - 0xb4, 0x82, 0x00, 0x72, 0x01, 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, 0xe7, - 0x39, 0xcc, 0xb3, 0xa2, 0x7c, 0x10, 0x79, 0x09, 0x26, 0xeb, 0x1e, 0xc5, 0xc3, 0xc9, 0x66, 0x22, - 0x97, 0xa8, 0x67, 0x22, 0x02, 0x56, 0x1b, 0xe4, 0x2a, 0x4c, 0x77, 0xba, 0x3b, 0x4d, 0xa7, 0xce, - 0x6a, 0xb3, 0xea, 0x3b, 0x22, 0x30, 0xfc, 0x84, 0x39, 0xc9, 0xc1, 0x0f, 0xe8, 0x51, 0x79, 0x07, - 0x43, 0x90, 0x15, 0xd4, 0x08, 0xb2, 0x41, 0x98, 0x01, 0xdb, 0x9c, 0x56, 0xe0, 0x68, 0xaa, 0x77, - 0x1e, 0x46, 0x6c, 0x7b, 0xaf, 0xeb, 0xf0, 0x50, 0x41, 0x13, 0xa6, 0xf8, 0x45, 0x3e, 0x05, 0x33, - 0x51, 0x50, 0x63, 0xf9, 0x19, 0xc3, 0xf8, 0x19, 0x85, 0xb0, 0xa0, 0xcc, 0xe1, 0xe4, 0x0d, 0x20, - 0x6a, 0x7d, 0xee, 0xce, 0x87, 0xb4, 0xce, 0xe7, 0xe4, 0x84, 0x39, 0xa3, 0x94, 0x3c, 0xc4, 0x02, - 0xf2, 0x22, 0x4c, 0x78, 0xd4, 0x47, 0x71, 0x0f, 0xbb, 0x0d, 0xd3, 0x90, 0x99, 0xe3, 0x12, 0xc6, - 0xfa, 0xee, 0x1a, 0x14, 0x94, 0xee, 0xc0, 0x20, 0xbd, 0x3c, 0x2a, 0xba, 0x39, 0x15, 0xc1, 0xcd, - 0x4e, 0xb5, 0x41, 0xbe, 0x04, 0x0b, 0x0a, 0x26, 0xcf, 0x88, 0x66, 0xd1, 0xa6, 0xb3, 0xe7, 0xec, - 0x34, 0xa9, 0x98, 0x6f, 0xc9, 0x59, 0x1d, 0xde, 0x09, 0xcd, 0xf9, 0x88, 0x9a, 0xe7, 0x4a, 0x5b, - 0x16, 0xb4, 0x64, 0x15, 0xe6, 0x62, 0x9c, 0x69, 0xc3, 0xea, 0x76, 0x7a, 0xc6, 0xe6, 0x8a, 0x78, - 0x12, 0x9d, 0x27, 0x6d, 0x6c, 0x75, 0x8c, 0x6f, 0xc1, 0x84, 0x3a, 0x27, 0x59, 0x27, 0xa8, 0x82, - 0x86, 0x98, 0x7d, 0xe3, 0x21, 0xac, 0xca, 0x2e, 0x7a, 0x53, 0x11, 0x4a, 0x10, 0x26, 0xfb, 0x36, - 0x27, 0x43, 0x28, 0x0e, 0xe1, 0x8b, 0x30, 0xd1, 0x70, 0xfc, 0x4e, 0xd3, 0x3e, 0xb2, 0xa2, 0x54, - 0xbf, 0xe6, 0xb8, 0x80, 0xa1, 0x26, 0x67, 0x09, 0x66, 0x12, 0xfb, 0x20, 0x79, 0x83, 0xdf, 0x50, - 0x85, 0xf0, 0x33, 0xc1, 0x6f, 0xf9, 0x68, 0x99, 0xab, 0xc9, 0x3d, 0x02, 0xc9, 0x68, 0xc3, 0x84, - 0x7a, 0xae, 0x9d, 0x92, 0xc1, 0xe0, 0x3c, 0xc6, 0xe3, 0xe0, 0x9b, 0xfe, 0xc8, 0xc9, 0x71, 0x31, - 0xeb, 0x34, 0x30, 0x0a, 0xc7, 0x35, 0xc8, 0x4b, 0x11, 0x4c, 0x48, 0x3e, 0xf8, 0x3a, 0x20, 0xd3, - 0xbb, 0x9a, 0x61, 0xa9, 0xf1, 0x2a, 0x8c, 0x8a, 0xa3, 0xab, 0xff, 0x9b, 0x80, 0xf1, 0xc3, 0x59, - 0x98, 0x36, 0x29, 0xdb, 0x58, 0x29, 0x4f, 0x5b, 0xf2, 0xcc, 0xde, 0xb9, 0xd3, 0xa3, 0x3a, 0x6a, - 0xdf, 0xd6, 0x27, 0x61, 0xc8, 0x3f, 0xce, 0xc0, 0x6c, 0x0a, 0xee, 0x47, 0x4a, 0x98, 0x79, 0x07, - 0xc6, 0x2a, 0x8e, 0xdd, 0x2c, 0x35, 0x1a, 0x61, 0x70, 0x0e, 0x14, 0xdc, 0x31, 0xab, 0x8e, 0xcd, - 0xa0, 0xaa, 0x10, 0x13, 0xa2, 0x92, 0xd7, 0xc4, 0xa4, 0x88, 0xd2, 0x4d, 0xe3, 0xa4, 0xf8, 0xee, - 0x71, 0x11, 0x78, 0x9b, 0xa2, 0x1c, 0xf4, 0x18, 0x69, 0x95, 0x03, 0x23, 0xbf, 0x97, 0x67, 0x76, - 0xe8, 0xd2, 0x23, 0xad, 0xc6, 0x3f, 0x6f, 0xa0, 0x9c, 0x21, 0x3f, 0x91, 0x85, 0xf3, 0xe9, 0x84, - 0x1f, 0x35, 0xf7, 0x29, 0x66, 0x6b, 0x51, 0xa2, 0x43, 0x63, 0xee, 0x53, 0x9e, 0xda, 0x05, 0xf1, - 0x23, 0x04, 0xb2, 0x0b, 0x93, 0xab, 0xb6, 0x1f, 0xac, 0x50, 0xdb, 0x0b, 0x76, 0xa8, 0x1d, 0x0c, - 0x20, 0xc9, 0xbf, 0x2c, 0x4d, 0x12, 0x50, 0x98, 0xd8, 0x97, 0x94, 0x31, 0x59, 0x5b, 0x67, 0x1b, - 0x4e, 0x94, 0xa1, 0x01, 0x26, 0xca, 0x37, 0x60, 0xba, 0x46, 0x5b, 0x76, 0x67, 0xdf, 0xf5, 0xa4, - 0xe3, 0xf4, 0x0d, 0x98, 0x0c, 0x41, 0xa9, 0xb3, 0x45, 0x2f, 0xd6, 0xf0, 0x95, 0x8e, 0x88, 0xb6, - 0x12, 0xbd, 0xd8, 0xf8, 0xfb, 0x59, 0xb8, 0x50, 0xaa, 0x0b, 0x4b, 0x41, 0x51, 0x20, 0x0d, 0x9a, - 0x3f, 0xe1, 0xba, 0xc9, 0x4d, 0x18, 0x5b, 0xb3, 0x9f, 0xac, 0x52, 0xdb, 0xa7, 0xbe, 0xc8, 0x3c, - 0xc7, 0xc5, 0x5e, 0xfb, 0x49, 0xf4, 0x9a, 0x63, 0x46, 0x38, 0xaa, 0x5e, 0x60, 0xe8, 0x63, 0xea, - 0x05, 0x0c, 0x18, 0x59, 0x71, 0x9b, 0x0d, 0x71, 0xd6, 0x8b, 0x27, 0xe4, 0x7d, 0x84, 0x98, 0xa2, - 0x84, 0x5d, 0xa7, 0xa7, 0xc2, 0x16, 0x63, 0x13, 0x3e, 0xf1, 0x2e, 0xb9, 0x0a, 0xa3, 0x58, 0x51, - 0x98, 0x22, 0x1b, 0x0f, 0x8d, 0x26, 0xc5, 0xfc, 0x61, 0x0d, 0x53, 0x16, 0xaa, 0x3d, 0x31, 0xfc, - 0xf1, 0x7a, 0xc2, 0xf8, 0x47, 0xf8, 0x3a, 0xad, 0x7e, 0x25, 0x3b, 0x89, 0x94, 0x86, 0x64, 0x06, - 0x6c, 0x48, 0xf6, 0xa9, 0x0d, 0x49, 0xae, 0xe7, 0x90, 0xfc, 0x48, 0x16, 0xc6, 0xc3, 0xc6, 0x7e, - 0x8f, 0x85, 0x28, 0x0f, 0xbf, 0x6b, 0xa0, 0x60, 0x27, 0x35, 0x65, 0xaf, 0x10, 0x31, 0x45, 0xbe, - 0x00, 0x23, 0x62, 0x31, 0x65, 0x62, 0x86, 0xbd, 0xb1, 0xd1, 0x5d, 0x9a, 0x12, 0xac, 0x47, 0x70, - 0x40, 0x7d, 0x53, 0xd0, 0x61, 0x34, 0x99, 0x6d, 0xba, 0x23, 0x8c, 0x15, 0x9e, 0xd9, 0x33, 0x2a, - 0x3d, 0x9a, 0x4c, 0xf4, 0x61, 0x03, 0x9d, 0x4e, 0xff, 0x2c, 0x0f, 0x85, 0x38, 0xc9, 0xe9, 0x41, - 0xe0, 0x37, 0xba, 0x3b, 0xfc, 0xaa, 0xc2, 0x83, 0xc0, 0x77, 0xba, 0x3b, 0x26, 0x83, 0xa1, 0x2d, - 0x93, 0xe7, 0x3c, 0xc6, 0xaf, 0x9e, 0x10, 0xb6, 0x4c, 0x9e, 0xf3, 0x58, 0xb3, 0x65, 0xf2, 0x9c, - 0xc7, 0xa8, 0x48, 0x58, 0xad, 0xa1, 0x03, 0x3c, 0xde, 0x53, 0x84, 0x22, 0xa1, 0xe9, 0xc7, 0x13, - 0x3a, 0x49, 0x34, 0x76, 0x54, 0x2e, 0x51, 0xdb, 0x13, 0x01, 0xcb, 0xc5, 0x76, 0x86, 0x47, 0xe5, - 0x0e, 0x82, 0x79, 0xfe, 0x75, 0x53, 0x45, 0x22, 0x4d, 0x20, 0xca, 0x4f, 0xb9, 0x80, 0x4f, 0xbf, - 0x5b, 0x4b, 0xa3, 0xbc, 0x39, 0x95, 0xb5, 0xa5, 0xae, 0xe6, 0x14, 0xbe, 0x4f, 0x53, 0x9d, 0xbb, - 0x21, 0xa2, 0x30, 0xa2, 0x02, 0x29, 0x7f, 0x2a, 0x33, 0x19, 0x21, 0x02, 0x78, 0x94, 0xc6, 0x50, - 0x8d, 0x14, 0x31, 0x21, 0xef, 0xc1, 0xb8, 0x1a, 0xd6, 0x80, 0x3b, 0xdf, 0xbf, 0xc0, 0x03, 0xeb, - 0xf5, 0x48, 0x01, 0xaa, 0x12, 0x90, 0x1d, 0xb8, 0x50, 0x76, 0xdb, 0x7e, 0xb7, 0x25, 0x43, 0xf8, - 0x45, 0x81, 0x83, 0x01, 0x87, 0x02, 0x7d, 0xa4, 0xeb, 0x02, 0x45, 0x78, 0xd1, 0x4b, 0xaf, 0x09, - 0xfd, 0x02, 0xd2, 0x8b, 0x11, 0xd9, 0x84, 0x71, 0x54, 0x89, 0x0a, 0xb3, 0xcc, 0x71, 0x7d, 0xdb, - 0x88, 0x4a, 0x2a, 0x6c, 0x61, 0xf0, 0xf0, 0x51, 0x76, 0xab, 0x29, 0x8d, 0xf6, 0x55, 0xd5, 0xae, - 0x82, 0x4c, 0xbe, 0x0a, 0x53, 0xfc, 0x8a, 0xb6, 0x4d, 0x77, 0xf8, 0xdc, 0x99, 0xd0, 0x34, 0x11, - 0x7a, 0x21, 0x7f, 0x9d, 0x17, 0x8a, 0xe8, 0x43, 0xba, 0xc3, 0xc7, 0x5e, 0x73, 0x99, 0xd1, 0xf0, - 0xc9, 0x16, 0xcc, 0xae, 0xd8, 0x3e, 0x07, 0x2a, 0xfe, 0xe9, 0x93, 0xa8, 0xa1, 0x45, 0x53, 0xe6, - 0x7d, 0xdb, 0x97, 0x9a, 0xed, 0x54, 0x7f, 0xf4, 0x34, 0x7a, 0xf2, 0xc3, 0x19, 0x98, 0xd7, 0x14, - 0xdf, 0xc2, 0x70, 0xac, 0x45, 0xdb, 0x01, 0xfa, 0xc6, 0x4c, 0x85, 0x99, 0xdf, 0x7b, 0xa1, 0xf1, - 0x21, 0x89, 0xe9, 0xd6, 0xbd, 0xa8, 0x5c, 0xb5, 0x11, 0xee, 0xc5, 0x43, 0x2c, 0x54, 0x5c, 0xd3, - 0xd3, 0xfa, 0x42, 0x8d, 0xad, 0x6b, 0x89, 0x66, 0xdc, 0x89, 0xf7, 0xb7, 0x50, 0x74, 0x65, 0x42, - 0x45, 0xd7, 0x1c, 0x0c, 0x63, 0xaf, 0xca, 0x70, 0x3a, 0xf8, 0xc3, 0xf8, 0xb4, 0xba, 0x0f, 0x09, - 0xb1, 0xb0, 0xef, 0x3e, 0x64, 0xfc, 0x0f, 0x23, 0x30, 0x1d, 0x9b, 0x16, 0xe2, 0x9e, 0x9a, 0x49, - 0xdc, 0x53, 0x6b, 0x00, 0x5c, 0xd5, 0x3b, 0xa0, 0x4e, 0x56, 0xfa, 0xe5, 0x8d, 0x0b, 0x37, 0xd7, - 0x70, 0x4d, 0x29, 0x6c, 0x18, 0x53, 0xbe, 0x62, 0x07, 0xd4, 0x91, 0x87, 0x4c, 0xf9, 0xa2, 0x57, - 0x98, 0x46, 0x6c, 0x48, 0x11, 0x86, 0x31, 0x90, 0xa6, 0xea, 0x16, 0xe9, 0x30, 0x80, 0xc9, 0xe1, - 0xe4, 0x25, 0x18, 0x61, 0x42, 0x54, 0xb5, 0x22, 0x36, 0x41, 0x3c, 0x5b, 0x98, 0x94, 0xc5, 0x24, - 0x16, 0x51, 0x44, 0xee, 0xc0, 0x04, 0xff, 0x4b, 0x84, 0x41, 0x19, 0xd1, 0xad, 0x19, 0x2d, 0xa7, - 0x21, 0x23, 0xa1, 0x68, 0x78, 0xec, 0x76, 0x51, 0xeb, 0xa2, 0x5a, 0xa7, 0x5a, 0x11, 0x91, 0x97, - 0xf1, 0x76, 0xe1, 0x73, 0x20, 0xab, 0x22, 0x42, 0x60, 0xb2, 0x8c, 0x70, 0x4e, 0xc8, 0xe3, 0x9d, - 0x12, 0x65, 0x19, 0xee, 0x94, 0x60, 0x8a, 0x12, 0x72, 0x9d, 0x3f, 0xad, 0xa0, 0x58, 0xc8, 0x13, - 0xd8, 0xe1, 0xbb, 0x05, 0x2a, 0x26, 0x50, 0x36, 0x0c, 0x8b, 0x59, 0xe5, 0xec, 0xef, 0xe5, 0x96, - 0xed, 0x34, 0xc5, 0xb6, 0x82, 0x95, 0x23, 0x2e, 0x65, 0x50, 0x33, 0x42, 0x20, 0xef, 0xc0, 0x14, - 0xfb, 0x51, 0x76, 0x5b, 0x2d, 0xb7, 0x8d, 0xec, 0xc7, 0xa3, 0x88, 0x5a, 0x48, 0x52, 0xc7, 0x22, - 0x5e, 0x4b, 0x0c, 0x97, 0x9d, 0x27, 0xf8, 0x6c, 0xdb, 0xe5, 0x8f, 0x3e, 0x13, 0xd1, 0x79, 0x82, - 0xa4, 0x3e, 0x87, 0x9b, 0x2a, 0x12, 0x79, 0x0b, 0x26, 0xd9, 0xcf, 0x7b, 0xce, 0x63, 0xca, 0x2b, - 0x9c, 0x8c, 0xec, 0x15, 0x90, 0x6a, 0x8f, 0x95, 0xf0, 0xfa, 0x74, 0x4c, 0xf2, 0x45, 0x38, 0x87, - 0x9c, 0xea, 0x6e, 0x87, 0x36, 0x4a, 0xbb, 0xbb, 0x4e, 0xd3, 0xe1, 0xe6, 0x65, 0x3c, 0xe0, 0x07, - 0xea, 0xe0, 0x79, 0xc5, 0x88, 0x61, 0xd9, 0x11, 0x8a, 0x99, 0x4e, 0x49, 0xb6, 0xa1, 0x50, 0xee, - 0xfa, 0x81, 0xdb, 0x2a, 0x05, 0x81, 0xe7, 0xec, 0x74, 0x03, 0xea, 0xcf, 0x4f, 0x6b, 0x61, 0x31, - 0xd8, 0xe2, 0x08, 0x0b, 0xb9, 0x3e, 0xa8, 0x8e, 0x14, 0x96, 0x1d, 0x92, 0x98, 0x09, 0x26, 0xc6, - 0x1f, 0x65, 0x60, 0x52, 0x23, 0x25, 0x6f, 0xc2, 0xc4, 0x5d, 0xcf, 0xa1, 0xed, 0x46, 0xf3, 0x48, - 0xb9, 0xa8, 0xe2, 0x2d, 0x66, 0x57, 0xc0, 0xf9, 0x57, 0x6b, 0x68, 0xa1, 0x9e, 0x27, 0x9b, 0x6a, - 0xfb, 0x79, 0x93, 0x7b, 0xe7, 0x8a, 0x09, 0x9a, 0x8b, 0xe2, 0xf4, 0xe0, 0x04, 0x15, 0xb3, 0x53, - 0x41, 0x21, 0xef, 0xc2, 0x08, 0x7f, 0xe0, 0x15, 0x86, 0x88, 0x17, 0xd3, 0x3e, 0x93, 0x7b, 0x82, - 0xe3, 0x44, 0x44, 0x2b, 0x1e, 0xdf, 0x14, 0x44, 0xc6, 0xcf, 0x66, 0x80, 0x24, 0x51, 0x4f, 0xd1, - 0x7b, 0x9d, 0x6a, 0x1d, 0xf4, 0x85, 0x70, 0x35, 0xe6, 0x34, 0x9d, 0x39, 0xab, 0x89, 0x17, 0xf0, - 0x8e, 0x17, 0xab, 0x4e, 0x55, 0xc4, 0xf1, 0x62, 0xe3, 0x87, 0xb2, 0x00, 0x11, 0x36, 0xf9, 0x1c, - 0xcf, 0x57, 0xf4, 0xc5, 0xae, 0xdd, 0x74, 0x76, 0x1d, 0x3d, 0x80, 0x27, 0x32, 0xf9, 0x86, 0x2c, - 0x31, 0x75, 0x44, 0xf2, 0x3e, 0x4c, 0xd7, 0x36, 0x74, 0x5a, 0xc5, 0x32, 0xdd, 0xef, 0x58, 0x31, - 0xf2, 0x38, 0x36, 0x1a, 0x1c, 0xab, 0xa3, 0xc1, 0x0d, 0x8e, 0xf9, 0x40, 0x88, 0x12, 0xb6, 0xb1, - 0xd4, 0x36, 0x84, 0xf1, 0x7d, 0xa3, 0x5a, 0x11, 0xbb, 0x14, 0xb6, 0xce, 0xef, 0x58, 0x1d, 0x61, - 0x95, 0xcf, 0xf6, 0x09, 0x0d, 0x2f, 0xea, 0xc8, 0xe1, 0x1e, 0xde, 0xde, 0x3f, 0x87, 0x6a, 0xbf, - 0x96, 0x1b, 0x50, 0xa1, 0xed, 0x78, 0x66, 0xef, 0x3d, 0x91, 0x75, 0xc0, 0xb0, 0xe6, 0xc4, 0xaa, - 0x7d, 0x9d, 0xb0, 0x80, 0xb9, 0x1d, 0x5d, 0x52, 0xb8, 0x9d, 0x40, 0x8a, 0xd1, 0xcc, 0x3f, 0xcc, - 0xc0, 0xb9, 0x54, 0x5a, 0x72, 0x03, 0x20, 0xd2, 0x29, 0x89, 0x5e, 0xc2, 0x1d, 0x33, 0x8a, 0x4e, - 0x63, 0x2a, 0x18, 0xe4, 0x2b, 0x71, 0x6d, 0xd0, 0xe9, 0x07, 0xe1, 0x82, 0x8c, 0x3e, 0xa6, 0x6b, - 0x83, 0x52, 0x74, 0x40, 0xc6, 0x3f, 0xce, 0xc1, 0x8c, 0x12, 0xfc, 0x86, 0xb7, 0xf5, 0x14, 0x03, - 0xf0, 0x03, 0x98, 0x60, 0x5f, 0xe3, 0xd4, 0x85, 0x27, 0x1d, 0xb7, 0x64, 0x79, 0x2d, 0xe1, 0x86, - 0x28, 0xb8, 0xdd, 0x50, 0x91, 0x79, 0x4c, 0x40, 0xdc, 0x3a, 0xf1, 0x41, 0xa2, 0x9e, 0xf4, 0xa8, + 0x27, 0xa6, 0x74, 0x7a, 0x15, 0xc4, 0x86, 0x71, 0x1c, 0x56, 0x51, 0xe3, 0xb3, 0xfd, 0x6a, 0xbc, + 0x9a, 0xa8, 0xf1, 0x3c, 0x4e, 0x94, 0x64, 0x65, 0x2a, 0x4f, 0xb2, 0x04, 0x93, 0x62, 0x1d, 0x89, + 0xd9, 0xf6, 0x1c, 0xf6, 0x16, 0x6a, 0x95, 0xe4, 0x0a, 0x4c, 0x4c, 0x38, 0x9d, 0x44, 0xdd, 0x91, + 0xf9, 0x33, 0xc2, 0xf3, 0xda, 0x8e, 0x1c, 0x7f, 0x3d, 0xd0, 0x91, 0xd9, 0x8e, 0x14, 0x49, 0x31, + 0xcb, 0x8f, 0x3b, 0x9e, 0xd0, 0x19, 0x5d, 0x8a, 0xf2, 0xe1, 0x28, 0xc2, 0x8f, 0x45, 0x43, 0x0c, + 0x75, 0x4b, 0x48, 0xe3, 0x40, 0xb6, 0x60, 0x36, 0x3c, 0xb5, 0x15, 0xc6, 0xc5, 0x28, 0x3e, 0x6c, + 0x74, 0xd4, 0xa7, 0xf3, 0x4d, 0xa3, 0x27, 0x36, 0x5c, 0xd0, 0xce, 0x69, 0x85, 0xf5, 0x65, 0x64, + 0x8d, 0x59, 0xca, 0xf5, 0x43, 0x3e, 0x9d, 0x7d, 0x2f, 0x3e, 0xe4, 0x03, 0x58, 0x88, 0x9f, 0xcd, + 0x4a, 0x2d, 0x2f, 0x60, 0x2d, 0xaf, 0x9e, 0x1c, 0x17, 0xaf, 0x24, 0x8e, 0xf7, 0xf4, 0x8a, 0xfa, + 0x70, 0x23, 0x5f, 0x83, 0x79, 0xfd, 0x7c, 0x56, 0x6a, 0x32, 0xb0, 0x26, 0x5c, 0x3a, 0xe1, 0xc1, + 0x9e, 0x5e, 0x43, 0x4f, 0x1e, 0x24, 0x80, 0x62, 0xea, 0xec, 0x56, 0xaa, 0x79, 0x31, 0xfa, 0xa0, + 0xc4, 0x2a, 0x49, 0xaf, 0xee, 0x34, 0x96, 0xe4, 0x10, 0x2e, 0xa5, 0x1d, 0x13, 0x4a, 0xa5, 0x2f, + 0x85, 0x5a, 0xd9, 0x4f, 0xa5, 0x1f, 0x39, 0xe9, 0x35, 0x9f, 0xc2, 0x96, 0x7c, 0x19, 0xce, 0x29, + 0xeb, 0x4b, 0xa9, 0xef, 0x65, 0xac, 0x0f, 0x9d, 0x80, 0xd5, 0x85, 0x99, 0x5e, 0x4b, 0x3a, 0x0f, + 0xd2, 0x82, 0x59, 0xf9, 0xe1, 0xa8, 0xfe, 0x16, 0x47, 0xcf, 0x15, 0x6d, 0x57, 0x4d, 0x62, 0x2c, + 0x5d, 0x16, 0xbb, 0xea, 0x7c, 0x63, 0xc7, 0xea, 0x44, 0x84, 0xea, 0x4c, 0x4f, 0xe1, 0x4b, 0x56, + 0x60, 0xa4, 0xb6, 0x51, 0xbd, 0x73, 0x67, 0x79, 0xfe, 0x15, 0xac, 0x41, 0x7a, 0x0c, 0x71, 0xa0, + 0x76, 0x69, 0x12, 0x86, 0x6a, 0x1d, 0x67, 0x77, 0x57, 0x73, 0xcc, 0xe2, 0xa8, 0xe4, 0x7b, 0xd1, + 0x44, 0x8c, 0xed, 0xa8, 0x25, 0xdf, 0x77, 0xf6, 0x30, 0xde, 0xb0, 0x3f, 0xff, 0xaa, 0xf6, 0xd2, + 0x2b, 0x63, 0x31, 0x97, 0x31, 0x55, 0x55, 0x02, 0x9d, 0x4b, 0x9b, 0x27, 0xc7, 0xc5, 0xe7, 0xc5, + 0xce, 0x6d, 0xd9, 0x11, 0x2b, 0x75, 0x13, 0x4f, 0x56, 0x74, 0x6f, 0x28, 0x7f, 0xb5, 0x70, 0xed, + 0xde, 0x50, 0xfe, 0x5a, 0xe1, 0x55, 0xf3, 0xb9, 0x5a, 0x69, 0x6d, 0xb5, 0xda, 0x90, 0x1b, 0xbd, + 0x8c, 0xfc, 0xcc, 0xfb, 0xda, 0xbc, 0xd2, 0xaf, 0x34, 0x1a, 0x09, 0xe3, 0xef, 0x65, 0xa0, 0x78, + 0x4a, 0x83, 0xd9, 0xde, 0x1a, 0xf5, 0x66, 0x8d, 0x06, 0x6a, 0xfc, 0xe8, 0x68, 0x14, 0x2c, 0xfd, + 0xf1, 0x5a, 0x27, 0x41, 0xd7, 0x27, 0x91, 0xb4, 0x40, 0xf1, 0x80, 0x4b, 0x26, 0x2b, 0x90, 0x58, + 0xc6, 0x2f, 0x64, 0x60, 0x36, 0x65, 0x7c, 0xc8, 0x15, 0x18, 0xc2, 0x2c, 0x44, 0x8a, 0xb5, 0x41, + 0x2c, 0xfb, 0x10, 0x96, 0x93, 0x4f, 0xc3, 0x68, 0x65, 0xbd, 0x56, 0x2b, 0xad, 0xcb, 0xab, 0x2c, + 0xdf, 0xc6, 0xdb, 0xbe, 0xe5, 0xdb, 0xfa, 0x23, 0xa5, 0x40, 0x23, 0xaf, 0xc3, 0x48, 0x75, 0x03, + 0x09, 0xb8, 0xcd, 0x1c, 0xb6, 0xd0, 0xe9, 0xc4, 0xf1, 0x05, 0x92, 0xf1, 0xe3, 0x19, 0x20, 0xc9, + 0xc9, 0x46, 0x6e, 0xc2, 0xb8, 0x3a, 0xa5, 0xf9, 0xc5, 0x1b, 0x1f, 0xd4, 0x94, 0x09, 0x6b, 0xaa, + 0x38, 0xa4, 0x02, 0xc3, 0x98, 0x3f, 0x32, 0x7c, 0x1d, 0x4d, 0x3d, 0x18, 0x2f, 0x24, 0x0e, 0xc6, + 0x61, 0xcc, 0x4e, 0x69, 0x72, 0x62, 0xe3, 0xf7, 0x32, 0x40, 0xd2, 0x6d, 0x9e, 0x06, 0xb2, 0xce, + 0x78, 0x43, 0xf1, 0x79, 0x56, 0xf3, 0x8c, 0x84, 0x49, 0xa2, 0xd4, 0x4b, 0x64, 0xe4, 0x1d, 0x7d, + 0x45, 0x53, 0x5a, 0xf4, 0x76, 0x94, 0xbb, 0x06, 0xc3, 0x0f, 0xa9, 0xb7, 0x23, 0xcd, 0x41, 0xd1, + 0x84, 0xec, 0x11, 0x03, 0xa8, 0x97, 0x78, 0xc4, 0x30, 0xfe, 0x2c, 0x03, 0x73, 0x69, 0x12, 0xee, + 0x29, 0xfe, 0x6c, 0x46, 0xcc, 0x15, 0x0f, 0x2d, 0x33, 0xb8, 0x7d, 0x59, 0xe8, 0x80, 0x57, 0x84, + 0x61, 0xf6, 0xb1, 0x72, 0x84, 0x51, 0x89, 0xc2, 0x7a, 0xc3, 0x37, 0x39, 0x9c, 0x21, 0xf0, 0xd8, + 0x5e, 0x43, 0x18, 0x16, 0x0e, 0x11, 0x70, 0x3e, 0x9a, 0x1c, 0xce, 0x10, 0xd6, 0xdc, 0x46, 0x98, + 0x3a, 0x1d, 0x11, 0x5a, 0x0c, 0x60, 0x72, 0x38, 0xb9, 0x02, 0xa3, 0x0f, 0xda, 0xab, 0xd4, 0x7e, + 0x24, 0x63, 0xdd, 0xa3, 0x25, 0x89, 0xdb, 0xb6, 0x9a, 0x0c, 0x66, 0xca, 0x42, 0xe3, 0x67, 0x32, + 0x30, 0x93, 0x10, 0xae, 0x4f, 0x77, 0xd9, 0xeb, 0xef, 0x3b, 0x33, 0xc8, 0xf7, 0xf1, 0xe6, 0x0f, + 0xa5, 0x37, 0xdf, 0xf8, 0x6f, 0x47, 0xe0, 0x42, 0x0f, 0x5d, 0x47, 0xe4, 0xdb, 0x97, 0x39, 0xd5, + 0xb7, 0xef, 0x2b, 0x30, 0x59, 0x6e, 0xda, 0x4e, 0xcb, 0xdf, 0x74, 0xa3, 0x16, 0x47, 0x2e, 0x02, + 0x58, 0x26, 0xb3, 0xc7, 0x4b, 0x5b, 0xf2, 0x8b, 0x75, 0xa4, 0xb0, 0x02, 0x37, 0x29, 0x6a, 0x69, + 0xcc, 0x12, 0xde, 0x75, 0xb9, 0xbf, 0x26, 0xde, 0x75, 0xba, 0xbf, 0xc7, 0xd0, 0x13, 0xf5, 0xf7, + 0x48, 0xb7, 0x15, 0x1d, 0xfe, 0x28, 0x96, 0xc3, 0x65, 0x98, 0xe4, 0xa6, 0x34, 0x25, 0x9f, 0x0f, + 0xd2, 0x48, 0xc2, 0xfc, 0xc6, 0xf6, 0x93, 0x63, 0xa1, 0xd1, 0x90, 0x15, 0xdd, 0x37, 0x61, 0x14, + 0x9f, 0x00, 0xaf, 0xf4, 0xf6, 0x3d, 0xd0, 0x9e, 0xfe, 0x35, 0x1f, 0x84, 0x6f, 0xc1, 0x5c, 0xda, + 0x65, 0x69, 0x3e, 0xaf, 0x59, 0xe9, 0xf5, 0xb4, 0xee, 0x1c, 0xfc, 0xca, 0x75, 0x90, 0x7a, 0xe5, + 0x92, 0x3e, 0xa3, 0x63, 0x5a, 0x28, 0xd8, 0x1e, 0x6b, 0x81, 0xe3, 0xf6, 0xf7, 0x2c, 0x35, 0xbe, + 0x02, 0xcf, 0xf7, 0x25, 0x27, 0x6f, 0x69, 0xb1, 0x49, 0x5e, 0x49, 0xc6, 0x26, 0xf9, 0xee, 0x71, + 0x71, 0x46, 0xf3, 0xf7, 0x5a, 0x0b, 0xd5, 0xc5, 0xc6, 0xcf, 0x64, 0x75, 0x4f, 0xc5, 0xbf, 0x8e, + 0x0b, 0xf5, 0x1a, 0x0c, 0x6f, 0xef, 0x53, 0x4f, 0x1e, 0x0f, 0xd8, 0x90, 0x43, 0x06, 0x50, 0x1b, + 0x82, 0x18, 0xe4, 0x0e, 0x4c, 0x6d, 0xf0, 0x89, 0x2b, 0x67, 0xe3, 0x50, 0x74, 0x63, 0xef, 0x08, + 0xbd, 0x52, 0xca, 0x74, 0x8c, 0x51, 0x19, 0x77, 0x63, 0x9d, 0x2e, 0x22, 0xab, 0x70, 0x8f, 0x0a, + 0x2e, 0x40, 0x4c, 0x45, 0x3e, 0x24, 0xd1, 0x66, 0x6b, 0xc6, 0xa0, 0xc6, 0x2e, 0x5c, 0xea, 0xcb, + 0x88, 0x9d, 0xdb, 0xd0, 0x09, 0x7f, 0xc5, 0x2c, 0x36, 0xfb, 0x92, 0x9a, 0x0a, 0x9d, 0xf1, 0x2d, + 0x98, 0x50, 0x7b, 0x19, 0x8f, 0x20, 0xf6, 0x5b, 0xcc, 0x0a, 0x7e, 0x04, 0x31, 0x80, 0xc9, 0xe1, + 0xd1, 0x4b, 0x40, 0x36, 0xfd, 0x25, 0x20, 0x1a, 0xfe, 0xdc, 0x69, 0xc3, 0xcf, 0x2a, 0xc7, 0x1d, + 0x4e, 0xa9, 0x1c, 0x7f, 0xab, 0x95, 0x63, 0xe8, 0x14, 0x93, 0xc3, 0x9f, 0x68, 0xe5, 0xbf, 0x2b, + 0x93, 0x23, 0xa1, 0xc3, 0x86, 0x5c, 0xee, 0x51, 0x12, 0xf8, 0xd9, 0xb4, 0xd5, 0x1b, 0x61, 0x46, + 0x32, 0x45, 0xf6, 0x34, 0x99, 0xe2, 0x2c, 0x13, 0x11, 0x25, 0x55, 0x3e, 0xa4, 0x43, 0x91, 0x1c, + 0x68, 0x27, 0x8c, 0x17, 0x24, 0x96, 0xf1, 0xed, 0x0c, 0x9c, 0x4b, 0xd5, 0xb8, 0xb2, 0x5a, 0xb9, + 0x6a, 0x57, 0x59, 0x87, 0x71, 0xbd, 0x2e, 0xc7, 0x38, 0x8b, 0xdf, 0xfc, 0xe0, 0xdf, 0x62, 0xbc, + 0x00, 0x63, 0xe1, 0x7b, 0x1f, 0x99, 0x93, 0x43, 0x87, 0x46, 0x6e, 0xf2, 0xd9, 0xa8, 0x06, 0xc0, + 0x5a, 0xf0, 0x44, 0x4d, 0x32, 0x8d, 0xdf, 0xcd, 0xf2, 0xc4, 0x99, 0x4f, 0x6d, 0x08, 0xcc, 0x74, + 0x3b, 0x4a, 0xf6, 0x49, 0xbd, 0x03, 0x5f, 0x92, 0x65, 0x18, 0xa9, 0x05, 0x76, 0xd0, 0x95, 0xee, + 0xfe, 0xb3, 0x2a, 0x19, 0x16, 0x3c, 0x5c, 0x8c, 0x1c, 0xbe, 0x7d, 0x84, 0x68, 0x77, 0x4c, 0x84, + 0x28, 0xe6, 0x98, 0x7f, 0x98, 0x81, 0x09, 0x95, 0x98, 0xbc, 0x0f, 0x53, 0x32, 0xb0, 0x1f, 0x0f, + 0x82, 0x20, 0x1e, 0x27, 0xa5, 0x65, 0x8f, 0x0c, 0xec, 0xa7, 0x06, 0x4d, 0xd0, 0xf0, 0xd5, 0xad, + 0xba, 0xa3, 0x22, 0x93, 0x06, 0x90, 0xd6, 0xae, 0x6d, 0x1d, 0x52, 0xfb, 0x80, 0xfa, 0x81, 0xc5, + 0x2d, 0x30, 0xc4, 0x1b, 0xa6, 0x64, 0xbf, 0x76, 0xa7, 0xc4, 0x8d, 0x2f, 0xd8, 0x48, 0x88, 0x08, + 0x8d, 0x09, 0x1a, 0xf5, 0x61, 0xa6, 0xb5, 0x6b, 0x6f, 0xf3, 0x42, 0x4e, 0x67, 0xfc, 0xf9, 0x08, + 0x9f, 0x6e, 0x22, 0x0e, 0xe8, 0x0e, 0x4c, 0x3d, 0xa8, 0x56, 0xca, 0x8a, 0x9a, 0x56, 0x4f, 0x23, + 0xb3, 0xfc, 0x38, 0xa0, 0x5e, 0xdb, 0x6e, 0xca, 0x1b, 0x6a, 0x74, 0x04, 0xb9, 0x4e, 0xa3, 0x9e, + 0xae, 0xc2, 0x8d, 0x71, 0x64, 0x75, 0xf0, 0xbb, 0x70, 0x58, 0x47, 0x76, 0xc0, 0x3a, 0x7c, 0xbb, + 0xd5, 0xec, 0x51, 0x87, 0xce, 0x91, 0xec, 0x43, 0xe1, 0x2e, 0x4a, 0x97, 0x4a, 0x2d, 0xb9, 0xfe, + 0xb5, 0xbc, 0x28, 0x6a, 0x79, 0x96, 0x8b, 0xa5, 0xe9, 0xf5, 0x24, 0xb8, 0x46, 0xfb, 0xc4, 0xd0, + 0xa9, 0xfb, 0xc4, 0xdf, 0xc9, 0xc0, 0x08, 0x17, 0x5f, 0xc5, 0x34, 0xee, 0x21, 0x20, 0x6f, 0x3f, + 0x19, 0x01, 0xb9, 0x80, 0xe7, 0x84, 0x36, 0xa1, 0x79, 0x19, 0xa9, 0xc4, 0xd6, 0x85, 0xb4, 0x22, + 0xc6, 0x07, 0x17, 0x5e, 0x72, 0xfa, 0xb2, 0x20, 0xd5, 0xc8, 0x05, 0x7f, 0xf4, 0x54, 0x2f, 0x4f, + 0x19, 0xb6, 0x60, 0x54, 0xb8, 0xe0, 0xeb, 0x8e, 0xf7, 0xab, 0x30, 0x26, 0x1c, 0xfb, 0x97, 0x8e, + 0xc4, 0xb3, 0x6a, 0x41, 0xb3, 0x54, 0x69, 0x2c, 0x1d, 0x45, 0xa2, 0xb9, 0x08, 0x0d, 0x60, 0xed, + 0x1c, 0x69, 0x79, 0x48, 0x25, 0x22, 0x79, 0xc0, 0xf3, 0xf3, 0xf1, 0x48, 0xa9, 0x7a, 0x68, 0xf4, + 0x10, 0x2e, 0x42, 0x06, 0x49, 0xef, 0xe0, 0x94, 0xc0, 0xa8, 0x11, 0x0f, 0xb2, 0x0a, 0x05, 0xb4, + 0x6e, 0xa2, 0x0d, 0xbe, 0x6a, 0xaa, 0x15, 0xee, 0x3c, 0x2e, 0x2c, 0x54, 0x03, 0x5e, 0x26, 0x96, + 0x5b, 0xcc, 0x6f, 0x2b, 0x41, 0xc9, 0xae, 0xd3, 0x85, 0xf8, 0xec, 0x23, 0x6f, 0xc3, 0x78, 0x18, + 0xa9, 0x36, 0xf4, 0x1c, 0xc5, 0xe7, 0x95, 0x28, 0xb4, 0xad, 0x9e, 0xd5, 0x4d, 0x41, 0x27, 0x8b, + 0x90, 0x67, 0x8b, 0x38, 0x9e, 0x01, 0xb5, 0x2b, 0x60, 0xaa, 0x27, 0x87, 0xc4, 0x23, 0x35, 0x98, + 0x65, 0x8b, 0xa6, 0xe6, 0xb4, 0xf7, 0x9a, 0x74, 0xd5, 0xdd, 0x73, 0xbb, 0x41, 0x94, 0xe4, 0x8c, + 0x5f, 0x60, 0xec, 0x56, 0x53, 0x2b, 0xd6, 0x53, 0x9c, 0xa5, 0x50, 0x2b, 0x5b, 0xe5, 0x9f, 0x64, + 0x61, 0x5c, 0x99, 0x4f, 0xe4, 0x1a, 0xe4, 0xab, 0xfe, 0xaa, 0x5b, 0x3f, 0x08, 0x63, 0xca, 0x4d, + 0x9e, 0x1c, 0x17, 0xc7, 0x1c, 0xdf, 0x6a, 0x22, 0xd0, 0x0c, 0x8b, 0xc9, 0x12, 0x4c, 0xf2, 0xbf, + 0x64, 0x06, 0x81, 0x6c, 0xa4, 0xde, 0xe2, 0xc8, 0x32, 0x77, 0x80, 0xba, 0x7b, 0x6a, 0x24, 0xe4, + 0xab, 0x00, 0x1c, 0x80, 0x5e, 0xc8, 0xb9, 0xc1, 0xfd, 0xa7, 0x45, 0x05, 0x29, 0xfe, 0xc7, 0x0a, + 0x43, 0xf2, 0x75, 0x1e, 0xd9, 0x56, 0xce, 0xff, 0xa1, 0xc1, 0x1d, 0xc0, 0x19, 0x7f, 0x2b, 0x3d, + 0x0e, 0x85, 0xca, 0x52, 0x24, 0xfd, 0x58, 0x30, 0x69, 0xdd, 0x7d, 0x44, 0xbd, 0xa3, 0x52, 0x80, + 0x88, 0x0a, 0x86, 0xf1, 0xbf, 0x66, 0x94, 0x55, 0x43, 0xd6, 0x31, 0x69, 0x2f, 0x9f, 0x11, 0xc2, + 0xc2, 0x28, 0xbc, 0x33, 0x48, 0xb8, 0x49, 0x77, 0x97, 0x9e, 0x15, 0xf6, 0xd0, 0xb3, 0xe1, 0xbc, + 0x8a, 0x25, 0xf3, 0xe5, 0x40, 0xf2, 0x05, 0x18, 0xc2, 0xae, 0xcb, 0x9e, 0xfa, 0x69, 0xf2, 0xd8, + 0x1e, 0x62, 0x7d, 0x86, 0x1f, 0x82, 0x94, 0xe4, 0xd3, 0xc2, 0x83, 0x93, 0x77, 0xfe, 0x94, 0x72, + 0xf6, 0xb2, 0x76, 0x84, 0xe7, 0x75, 0x14, 0x8a, 0x44, 0x99, 0x3d, 0x7f, 0x2f, 0x0b, 0x85, 0xf8, + 0x5a, 0x25, 0xef, 0xc1, 0x84, 0x3c, 0x4f, 0x57, 0x6c, 0x11, 0xfe, 0x7e, 0x42, 0x84, 0x9f, 0x97, + 0x87, 0xea, 0xbe, 0xad, 0x5a, 0x24, 0x99, 0x1a, 0x01, 0x13, 0x6e, 0x36, 0x45, 0x68, 0x30, 0x65, + 0x95, 0x04, 0x6e, 0xd0, 0x89, 0x05, 0x54, 0x95, 0x68, 0xe4, 0x0d, 0xc8, 0xad, 0xdd, 0x29, 0x09, + 0x4f, 0x9f, 0x42, 0xfc, 0xd4, 0xe5, 0x96, 0x8c, 0xba, 0x5d, 0x25, 0xc3, 0x27, 0xab, 0x4a, 0xec, + 0xe1, 0x11, 0x2d, 0xe7, 0x98, 0x04, 0x87, 0x1f, 0x77, 0x7a, 0x10, 0xe2, 0x7b, 0x43, 0xf9, 0x5c, + 0x61, 0x48, 0x44, 0xd3, 0xfc, 0xef, 0x73, 0x30, 0x16, 0xd6, 0x4f, 0x88, 0xea, 0x3f, 0xc9, 0x7d, + 0x25, 0xc9, 0x45, 0xc8, 0x4b, 0x71, 0x4d, 0x38, 0xfc, 0x8c, 0xfa, 0x42, 0x54, 0x9b, 0x07, 0x29, + 0x97, 0xf1, 0x65, 0x6e, 0xca, 0x9f, 0xe4, 0x26, 0x84, 0x42, 0x57, 0x2f, 0xe9, 0x6c, 0x88, 0x0d, + 0x98, 0x19, 0xa2, 0x91, 0x29, 0xc8, 0x3a, 0x3c, 0x42, 0xd3, 0x98, 0x99, 0x75, 0x1a, 0xe4, 0x3d, + 0xc8, 0xdb, 0x8d, 0x06, 0x6d, 0x58, 0xb6, 0x34, 0xd5, 0xe9, 0x37, 0x69, 0xf2, 0x8c, 0x1b, 0x3f, + 0x04, 0x90, 0xaa, 0x14, 0x90, 0x12, 0x8c, 0x35, 0x6d, 0x6e, 0x8d, 0xd7, 0x18, 0xe0, 0x44, 0x89, + 0x38, 0xe4, 0x19, 0xd9, 0x96, 0x4f, 0x1b, 0xe4, 0x15, 0x18, 0x62, 0xa3, 0x29, 0x8e, 0x10, 0x29, + 0x25, 0xb2, 0xc1, 0xe4, 0x1d, 0xb6, 0xf2, 0x8c, 0x89, 0x08, 0xe4, 0x25, 0xc8, 0x75, 0x17, 0x77, + 0xc5, 0xe1, 0x50, 0x88, 0xe2, 0x80, 0x87, 0x68, 0xac, 0x98, 0xdc, 0x82, 0xfc, 0xa1, 0x1e, 0x42, + 0xfa, 0x5c, 0x6c, 0x18, 0x43, 0xfc, 0x10, 0x91, 0xbc, 0x02, 0x39, 0xdf, 0x77, 0x85, 0x7d, 0x8b, + 0x5c, 0x82, 0xb5, 0xda, 0x83, 0x70, 0xd4, 0x18, 0x77, 0xdf, 0x77, 0x97, 0xf2, 0x30, 0xc2, 0x4f, + 0x0c, 0xe3, 0x12, 0x40, 0xd4, 0xc6, 0xa4, 0x03, 0x97, 0xf1, 0x55, 0x18, 0x0b, 0xdb, 0x46, 0x9e, + 0x07, 0x38, 0xa0, 0x47, 0xd6, 0xbe, 0xdd, 0x6e, 0x34, 0xb9, 0xb8, 0x39, 0x61, 0x8e, 0x1d, 0xd0, + 0xa3, 0x15, 0x04, 0x90, 0x0b, 0x30, 0xda, 0x61, 0xc3, 0x2f, 0xe6, 0xf8, 0x84, 0x39, 0xd2, 0xe9, + 0xee, 0xb0, 0xa9, 0x3c, 0x0f, 0xa3, 0xa8, 0x38, 0x15, 0x2b, 0x72, 0xd2, 0x94, 0x3f, 0x8d, 0xbf, + 0xc8, 0x61, 0x9e, 0x15, 0xe5, 0x83, 0xc8, 0x8b, 0x30, 0x59, 0xf7, 0x28, 0x1e, 0x4e, 0x36, 0x13, + 0xb9, 0x44, 0x3d, 0x13, 0x11, 0xb0, 0xda, 0x20, 0x57, 0x60, 0xba, 0xd3, 0xdd, 0x69, 0x3a, 0x75, + 0x56, 0x9b, 0x55, 0xdf, 0x11, 0x81, 0xe1, 0x27, 0xcc, 0x49, 0x0e, 0xbe, 0x4f, 0x8f, 0xca, 0x3b, + 0x18, 0x82, 0xac, 0xa0, 0x46, 0x90, 0x0d, 0xc2, 0x0c, 0xd8, 0xe6, 0xb4, 0x02, 0x47, 0x53, 0xbd, + 0xf3, 0x30, 0x62, 0xdb, 0x7b, 0x5d, 0x87, 0x87, 0x0a, 0x9a, 0x30, 0xc5, 0x2f, 0xf2, 0x29, 0x98, + 0x89, 0x82, 0x1a, 0xcb, 0xcf, 0x18, 0xc6, 0xcf, 0x28, 0x84, 0x05, 0x65, 0x0e, 0x27, 0xaf, 0x03, + 0x51, 0xeb, 0x73, 0x77, 0x3e, 0xa0, 0x75, 0x3e, 0x27, 0x27, 0xcc, 0x19, 0xa5, 0xe4, 0x01, 0x16, + 0x90, 0x17, 0x60, 0xc2, 0xa3, 0x3e, 0x8a, 0x7b, 0xd8, 0x6d, 0x98, 0x86, 0xcc, 0x1c, 0x97, 0x30, + 0xd6, 0x77, 0x57, 0xa1, 0xa0, 0x74, 0x07, 0x06, 0xe9, 0xe5, 0x51, 0xd1, 0xcd, 0xa9, 0x08, 0x6e, + 0x76, 0xaa, 0x0d, 0xf2, 0x25, 0x58, 0x50, 0x30, 0x79, 0x46, 0x34, 0x8b, 0x36, 0x9d, 0x3d, 0x67, + 0xa7, 0x49, 0xc5, 0x7c, 0x4b, 0xce, 0xea, 0xf0, 0x4e, 0x68, 0xce, 0x47, 0xd4, 0x3c, 0x57, 0xda, + 0xb2, 0xa0, 0x25, 0xab, 0x30, 0x17, 0xe3, 0x4c, 0x1b, 0x56, 0xb7, 0xd3, 0x33, 0x36, 0x57, 0xc4, + 0x93, 0xe8, 0x3c, 0x69, 0x63, 0xab, 0x63, 0x7c, 0x0b, 0x26, 0xd4, 0x39, 0xc9, 0x3a, 0x41, 0x15, + 0x34, 0xc4, 0xec, 0x1b, 0x0f, 0x61, 0x55, 0x76, 0xd1, 0x9b, 0x8a, 0x50, 0x82, 0x30, 0xd9, 0xb7, + 0x39, 0x19, 0x42, 0x71, 0x08, 0x5f, 0x80, 0x89, 0x86, 0xe3, 0x77, 0x9a, 0xf6, 0x91, 0x15, 0xa5, + 0xfa, 0x35, 0xc7, 0x05, 0x0c, 0x35, 0x39, 0x4b, 0x30, 0x93, 0xd8, 0x07, 0xc9, 0xeb, 0xfc, 0x86, + 0x2a, 0x84, 0x9f, 0x09, 0x7e, 0xcb, 0x47, 0xcb, 0x5c, 0x4d, 0xee, 0x11, 0x48, 0x46, 0x1b, 0x26, + 0xd4, 0x73, 0xed, 0x94, 0x0c, 0x06, 0xe7, 0x31, 0x1e, 0x07, 0xdf, 0xf4, 0x47, 0x4e, 0x8e, 0x8b, + 0x59, 0xa7, 0x81, 0x51, 0x38, 0xae, 0x42, 0x5e, 0x8a, 0x60, 0x42, 0xf2, 0xc1, 0xd7, 0x01, 0x99, + 0xde, 0xd5, 0x0c, 0x4b, 0x8d, 0x57, 0x60, 0x54, 0x1c, 0x5d, 0xfd, 0xdf, 0x04, 0x8c, 0x1f, 0xce, + 0xc2, 0xb4, 0x49, 0xd9, 0xc6, 0x4a, 0x79, 0xda, 0x92, 0xa7, 0xf6, 0xce, 0x9d, 0x1e, 0xd5, 0x51, + 0xfb, 0xb6, 0x3e, 0x09, 0x43, 0x7e, 0x25, 0x03, 0xb3, 0x29, 0xb8, 0x1f, 0x2a, 0x61, 0xe6, 0x6d, + 0x18, 0xab, 0x38, 0x76, 0xb3, 0xd4, 0x68, 0x84, 0xc1, 0x39, 0x50, 0x70, 0xc7, 0xac, 0x3a, 0x36, + 0x83, 0xaa, 0x42, 0x4c, 0x88, 0x4a, 0x5e, 0x15, 0x93, 0x22, 0x4a, 0x37, 0x8d, 0x93, 0xe2, 0xbb, + 0xc7, 0x45, 0xe0, 0x6d, 0x8a, 0x72, 0xd0, 0x63, 0xa4, 0x55, 0x0e, 0x8c, 0xfc, 0x5e, 0x9e, 0xda, + 0xa1, 0x4b, 0x8f, 0xb4, 0x1a, 0xff, 0xbc, 0x81, 0x72, 0x86, 0xfc, 0x44, 0x16, 0xce, 0xa7, 0x13, + 0x7e, 0xd8, 0xdc, 0xa7, 0x98, 0xad, 0x45, 0x89, 0x0e, 0x8d, 0xb9, 0x4f, 0x79, 0x6a, 0x17, 0xc4, + 0x8f, 0x10, 0xc8, 0x2e, 0x4c, 0xae, 0xda, 0x7e, 0xb0, 0x42, 0x6d, 0x2f, 0xd8, 0xa1, 0x76, 0x30, + 0x80, 0x24, 0xff, 0x92, 0x34, 0x49, 0x40, 0x61, 0x62, 0x5f, 0x52, 0xc6, 0x64, 0x6d, 0x9d, 0x6d, + 0x38, 0x51, 0x86, 0x06, 0x98, 0x28, 0xdf, 0x80, 0xe9, 0x1a, 0x6d, 0xd9, 0x9d, 0x7d, 0xd7, 0x93, + 0x8e, 0xd3, 0xd7, 0x61, 0x32, 0x04, 0xa5, 0xce, 0x16, 0xbd, 0x58, 0xc3, 0x57, 0x3a, 0x22, 0xda, + 0x4a, 0xf4, 0x62, 0xe3, 0xef, 0x67, 0xe1, 0x42, 0xa9, 0x2e, 0x2c, 0x05, 0x45, 0x81, 0x34, 0x68, + 0xfe, 0x98, 0xeb, 0x26, 0x37, 0x60, 0x6c, 0xcd, 0x7e, 0xbc, 0x4a, 0x6d, 0x9f, 0xfa, 0x22, 0xf3, + 0x1c, 0x17, 0x7b, 0xed, 0xc7, 0xd1, 0x6b, 0x8e, 0x19, 0xe1, 0xa8, 0x7a, 0x81, 0xa1, 0x8f, 0xa8, + 0x17, 0x30, 0x60, 0x64, 0xc5, 0x6d, 0x36, 0xc4, 0x59, 0x2f, 0x9e, 0x90, 0xf7, 0x11, 0x62, 0x8a, + 0x12, 0x76, 0x9d, 0x9e, 0x0a, 0x5b, 0x8c, 0x4d, 0xf8, 0xd8, 0xbb, 0xe4, 0x0a, 0x8c, 0x62, 0x45, + 0x61, 0x8a, 0x6c, 0x3c, 0x34, 0x9a, 0x14, 0xf3, 0x87, 0x35, 0x4c, 0x59, 0xa8, 0xf6, 0xc4, 0xf0, + 0x47, 0xeb, 0x09, 0xe3, 0x1f, 0xe1, 0xeb, 0xb4, 0xfa, 0x95, 0xec, 0x24, 0x52, 0x1a, 0x92, 0x19, + 0xb0, 0x21, 0xd9, 0x27, 0x36, 0x24, 0xb9, 0x9e, 0x43, 0xf2, 0x23, 0x59, 0x18, 0x0f, 0x1b, 0xfb, + 0x09, 0x0b, 0x51, 0x1e, 0x7e, 0xd7, 0x40, 0xc1, 0x4e, 0x6a, 0xca, 0x5e, 0x21, 0x62, 0x8a, 0x7c, + 0x01, 0x46, 0xc4, 0x62, 0xca, 0xc4, 0x0c, 0x7b, 0x63, 0xa3, 0xbb, 0x34, 0x25, 0x58, 0x8f, 0xe0, + 0x80, 0xfa, 0xa6, 0xa0, 0xc3, 0x68, 0x32, 0xdb, 0x74, 0x47, 0x18, 0x2b, 0x3c, 0xb5, 0x67, 0x54, + 0x7a, 0x34, 0x99, 0xe8, 0xc3, 0x06, 0x3a, 0x9d, 0xfe, 0x69, 0x1e, 0x0a, 0x71, 0x92, 0xd3, 0x83, + 0xc0, 0x6f, 0x74, 0x77, 0xf8, 0x55, 0x85, 0x07, 0x81, 0xef, 0x74, 0x77, 0x4c, 0x06, 0x43, 0x5b, + 0x26, 0xcf, 0x79, 0x84, 0x5f, 0x3d, 0x21, 0x6c, 0x99, 0x3c, 0xe7, 0x91, 0x66, 0xcb, 0xe4, 0x39, + 0x8f, 0x50, 0x91, 0xb0, 0x5a, 0x43, 0x07, 0x78, 0xbc, 0xa7, 0x08, 0x45, 0x42, 0xd3, 0x8f, 0x27, + 0x74, 0x92, 0x68, 0xec, 0xa8, 0x5c, 0xa2, 0xb6, 0x27, 0x02, 0x96, 0x8b, 0xed, 0x0c, 0x8f, 0xca, + 0x1d, 0x04, 0xf3, 0xfc, 0xeb, 0xa6, 0x8a, 0x44, 0x9a, 0x40, 0x94, 0x9f, 0x72, 0x01, 0x9f, 0x7e, + 0xb7, 0x96, 0x46, 0x79, 0x73, 0x2a, 0x6b, 0x4b, 0x5d, 0xcd, 0x29, 0x7c, 0x9f, 0xa4, 0x3a, 0x77, + 0x43, 0x44, 0x61, 0x44, 0x05, 0x52, 0xfe, 0x54, 0x66, 0x32, 0x42, 0x04, 0xf0, 0x28, 0x8d, 0xa1, + 0x1a, 0x29, 0x62, 0x42, 0xde, 0x85, 0x71, 0x35, 0xac, 0x01, 0x77, 0xbe, 0x7f, 0x8e, 0x07, 0xd6, + 0xeb, 0x91, 0x02, 0x54, 0x25, 0x20, 0x3b, 0x70, 0xa1, 0xec, 0xb6, 0xfd, 0x6e, 0x4b, 0x86, 0xf0, + 0x8b, 0x02, 0x07, 0x03, 0x0e, 0x05, 0xfa, 0x48, 0xd7, 0x05, 0x8a, 0xf0, 0xa2, 0x97, 0x5e, 0x13, + 0xfa, 0x05, 0xa4, 0x17, 0x23, 0xb2, 0x09, 0xe3, 0xa8, 0x12, 0x15, 0x66, 0x99, 0xe3, 0xfa, 0xb6, + 0x11, 0x95, 0x54, 0xd8, 0xc2, 0xe0, 0xe1, 0xa3, 0xec, 0x56, 0x53, 0x1a, 0xed, 0xab, 0xaa, 0x5d, + 0x05, 0x99, 0x7c, 0x15, 0xa6, 0xf8, 0x15, 0x6d, 0x9b, 0xee, 0xf0, 0xb9, 0x33, 0xa1, 0x69, 0x22, + 0xf4, 0x42, 0xfe, 0x3a, 0x2f, 0x14, 0xd1, 0x87, 0x74, 0x87, 0x8f, 0xbd, 0xe6, 0x32, 0xa3, 0xe1, + 0x93, 0x2d, 0x98, 0x5d, 0xb1, 0x7d, 0x0e, 0x54, 0xfc, 0xd3, 0x27, 0x51, 0x43, 0x8b, 0xa6, 0xcc, + 0xfb, 0xb6, 0x2f, 0x35, 0xdb, 0xa9, 0xfe, 0xe8, 0x69, 0xf4, 0xe4, 0x87, 0x33, 0x30, 0xaf, 0x29, + 0xbe, 0x85, 0xe1, 0x58, 0x8b, 0xb6, 0x03, 0xf4, 0x8d, 0x99, 0x0a, 0x33, 0xbf, 0xf7, 0x42, 0xe3, + 0x43, 0x12, 0xd3, 0xad, 0x7b, 0x51, 0xb9, 0x6a, 0x23, 0xdc, 0x8b, 0x87, 0x58, 0xa8, 0xb8, 0xa6, + 0xa7, 0xf5, 0x85, 0x1a, 0x5b, 0xd7, 0x12, 0xcd, 0xb8, 0x1d, 0xef, 0x6f, 0xa1, 0xe8, 0xca, 0x84, + 0x8a, 0xae, 0x39, 0x18, 0xc6, 0x5e, 0x95, 0xe1, 0x74, 0xf0, 0x87, 0xf1, 0x69, 0x75, 0x1f, 0x12, + 0x62, 0x61, 0xdf, 0x7d, 0xc8, 0xf8, 0x1f, 0x47, 0x60, 0x3a, 0x36, 0x2d, 0xc4, 0x3d, 0x35, 0x93, + 0xb8, 0xa7, 0xd6, 0x00, 0xb8, 0xaa, 0x77, 0x40, 0x9d, 0xac, 0xf4, 0xcb, 0x1b, 0x17, 0x6e, 0xae, + 0xe1, 0x9a, 0x52, 0xd8, 0x30, 0xa6, 0x7c, 0xc5, 0x0e, 0xa8, 0x23, 0x0f, 0x99, 0xf2, 0x45, 0xaf, + 0x30, 0x8d, 0xd8, 0x90, 0x22, 0x0c, 0x63, 0x20, 0x4d, 0xd5, 0x2d, 0xd2, 0x61, 0x00, 0x93, 0xc3, + 0xc9, 0x8b, 0x30, 0xc2, 0x84, 0xa8, 0x6a, 0x45, 0x6c, 0x82, 0x78, 0xb6, 0x30, 0x29, 0x8b, 0x49, + 0x2c, 0xa2, 0x88, 0xdc, 0x86, 0x09, 0xfe, 0x97, 0x08, 0x83, 0x32, 0xa2, 0x5b, 0x33, 0x5a, 0x4e, + 0x43, 0x46, 0x42, 0xd1, 0xf0, 0xd8, 0xed, 0xa2, 0xd6, 0x45, 0xb5, 0x4e, 0xb5, 0x22, 0x22, 0x2f, + 0xe3, 0xed, 0xc2, 0xe7, 0x40, 0x56, 0x45, 0x84, 0xc0, 0x64, 0x19, 0xe1, 0x9c, 0x90, 0xc7, 0x3b, + 0x25, 0xca, 0x32, 0xdc, 0x29, 0xc1, 0x14, 0x25, 0xe4, 0x1a, 0x7f, 0x5a, 0x41, 0xb1, 0x90, 0x27, + 0xb0, 0xc3, 0x77, 0x0b, 0x54, 0x4c, 0xa0, 0x6c, 0x18, 0x16, 0xb3, 0xca, 0xd9, 0xdf, 0xcb, 0x2d, + 0xdb, 0x69, 0x8a, 0x6d, 0x05, 0x2b, 0x47, 0x5c, 0xca, 0xa0, 0x66, 0x84, 0x40, 0xde, 0x86, 0x29, + 0xf6, 0xa3, 0xec, 0xb6, 0x5a, 0x6e, 0x1b, 0xd9, 0x8f, 0x47, 0x11, 0xb5, 0x90, 0xa4, 0x8e, 0x45, + 0xbc, 0x96, 0x18, 0x2e, 0x3b, 0x4f, 0xf0, 0xd9, 0xb6, 0xcb, 0x1f, 0x7d, 0x26, 0xa2, 0xf3, 0x04, + 0x49, 0x7d, 0x0e, 0x37, 0x55, 0x24, 0xf2, 0x26, 0x4c, 0xb2, 0x9f, 0x77, 0x9d, 0x47, 0x94, 0x57, + 0x38, 0x19, 0xd9, 0x2b, 0x20, 0xd5, 0x1e, 0x2b, 0xe1, 0xf5, 0xe9, 0x98, 0xe4, 0x8b, 0x70, 0x0e, + 0x39, 0xd5, 0xdd, 0x0e, 0x6d, 0x94, 0x76, 0x77, 0x9d, 0xa6, 0xc3, 0xcd, 0xcb, 0x78, 0xc0, 0x0f, + 0xd4, 0xc1, 0xf3, 0x8a, 0x11, 0xc3, 0xb2, 0x23, 0x14, 0x33, 0x9d, 0x92, 0x6c, 0x43, 0xa1, 0xdc, + 0xf5, 0x03, 0xb7, 0x55, 0x0a, 0x02, 0xcf, 0xd9, 0xe9, 0x06, 0xd4, 0x9f, 0x9f, 0xd6, 0xc2, 0x62, + 0xb0, 0xc5, 0x11, 0x16, 0x72, 0x7d, 0x50, 0x1d, 0x29, 0x2c, 0x3b, 0x24, 0x31, 0x13, 0x4c, 0x8c, + 0x3f, 0xce, 0xc0, 0xa4, 0x46, 0x4a, 0xde, 0x80, 0x89, 0x3b, 0x9e, 0x43, 0xdb, 0x8d, 0xe6, 0x91, + 0x72, 0x51, 0xc5, 0x5b, 0xcc, 0xae, 0x80, 0xf3, 0xaf, 0xd6, 0xd0, 0x42, 0x3d, 0x4f, 0x36, 0xd5, + 0xf6, 0xf3, 0x06, 0xf7, 0xce, 0x15, 0x13, 0x34, 0x17, 0xc5, 0xe9, 0xc1, 0x09, 0x2a, 0x66, 0xa7, + 0x82, 0x42, 0xde, 0x81, 0x11, 0xfe, 0xc0, 0x2b, 0x0c, 0x11, 0x2f, 0xa6, 0x7d, 0x26, 0xf7, 0x04, + 0xc7, 0x89, 0x88, 0x56, 0x3c, 0xbe, 0x29, 0x88, 0x8c, 0x9f, 0xcd, 0x00, 0x49, 0xa2, 0x9e, 0xa2, + 0xf7, 0x3a, 0xd5, 0x3a, 0xe8, 0x0b, 0xe1, 0x6a, 0xcc, 0x69, 0x3a, 0x73, 0x56, 0x13, 0x2f, 0xe0, + 0x1d, 0x2f, 0x56, 0x9d, 0xaa, 0x88, 0xe3, 0xc5, 0xc6, 0x0f, 0x65, 0x01, 0x22, 0x6c, 0xf2, 0x39, + 0x9e, 0xaf, 0xe8, 0x8b, 0x5d, 0xbb, 0xe9, 0xec, 0x3a, 0x7a, 0x00, 0x4f, 0x64, 0xf2, 0x0d, 0x59, + 0x62, 0xea, 0x88, 0xe4, 0x3d, 0x98, 0xae, 0x6d, 0xe8, 0xb4, 0x8a, 0x65, 0xba, 0xdf, 0xb1, 0x62, + 0xe4, 0x71, 0x6c, 0x34, 0x38, 0x56, 0x47, 0x83, 0x1b, 0x1c, 0xf3, 0x81, 0x10, 0x25, 0x6c, 0x63, + 0xa9, 0x6d, 0x08, 0xe3, 0xfb, 0x46, 0xb5, 0x22, 0x76, 0x29, 0x6c, 0x9d, 0xdf, 0xb1, 0x3a, 0xc2, + 0x2a, 0x9f, 0xed, 0x13, 0x1a, 0x5e, 0xd4, 0x91, 0xc3, 0x3d, 0xbc, 0xbd, 0x7f, 0x0e, 0xd5, 0x7e, + 0x2d, 0x37, 0xa0, 0x42, 0xdb, 0xf1, 0xd4, 0xde, 0x7b, 0x22, 0xeb, 0x80, 0x61, 0xcd, 0x89, 0x55, + 0xfb, 0x3a, 0x61, 0x01, 0x73, 0x2b, 0xba, 0xa4, 0x70, 0x3b, 0x81, 0x14, 0xa3, 0x99, 0x7f, 0x98, + 0x81, 0x73, 0xa9, 0xb4, 0xe4, 0x3a, 0x40, 0xa4, 0x53, 0x12, 0xbd, 0x84, 0x3b, 0x66, 0x14, 0x9d, + 0xc6, 0x54, 0x30, 0xc8, 0x57, 0xe2, 0xda, 0xa0, 0xd3, 0x0f, 0xc2, 0x05, 0x19, 0x7d, 0x4c, 0xd7, + 0x06, 0xa5, 0xe8, 0x80, 0x8c, 0x5f, 0xc9, 0xc1, 0x8c, 0x12, 0xfc, 0x86, 0xb7, 0xf5, 0x14, 0x03, + 0xf0, 0x03, 0x98, 0x60, 0x5f, 0xe3, 0xd4, 0x85, 0x27, 0x1d, 0xb7, 0x64, 0x79, 0x35, 0xe1, 0x86, + 0x28, 0xb8, 0x5d, 0x57, 0x91, 0x79, 0x4c, 0x40, 0xdc, 0x3a, 0xf1, 0x41, 0xa2, 0x9e, 0xf4, 0xa8, 0xd3, 0x98, 0x13, 0x1f, 0x26, 0x2b, 0x47, 0x6d, 0xbb, 0x15, 0xd6, 0xc6, 0x2d, 0x5a, 0x3e, 0xd5, 0xb3, 0x36, 0x0d, 0x9b, 0x57, 0x17, 0x39, 0xec, 0xf0, 0xb2, 0x14, 0x5f, 0x71, 0x8d, 0x6a, 0xe1, - 0x7d, 0x98, 0x49, 0x34, 0xfa, 0x4c, 0xe1, 0x09, 0xb7, 0x81, 0x24, 0xdb, 0x91, 0xc2, 0xe1, 0x53, + 0x3d, 0x98, 0x49, 0x34, 0xfa, 0x4c, 0xe1, 0x09, 0xb7, 0x81, 0x24, 0xdb, 0x91, 0xc2, 0xe1, 0x53, 0x7a, 0xf0, 0xcb, 0x73, 0xe1, 0xe3, 0x35, 0x66, 0x74, 0xe7, 0xf6, 0x31, 0x8b, 0x6a, 0xf0, 0xc2, - 0x9f, 0xcb, 0xaa, 0xae, 0xa0, 0xcf, 0xfa, 0xaa, 0xfb, 0x82, 0x76, 0x1b, 0xbe, 0xdc, 0x6b, 0x4c, + 0x9f, 0xcb, 0xaa, 0xae, 0xa0, 0x4f, 0xfb, 0xaa, 0xfb, 0x82, 0x76, 0x1b, 0xbe, 0xd4, 0x6b, 0x4c, 0x07, 0xd2, 0x3a, 0x7c, 0x27, 0x07, 0x17, 0x7a, 0x50, 0x92, 0xa3, 0xf8, 0x24, 0xe2, 0x5a, 0x88, - 0x5b, 0xfd, 0x2b, 0x7c, 0x1a, 0x53, 0x89, 0x7c, 0x8e, 0x07, 0x83, 0xa8, 0x63, 0xd6, 0x70, 0x71, - 0xff, 0x46, 0x35, 0xfe, 0x41, 0x08, 0x8d, 0x47, 0x81, 0xe0, 0x50, 0xf2, 0x3e, 0x0c, 0xa3, 0x1f, + 0x9b, 0xfd, 0x2b, 0x7c, 0x12, 0x53, 0x89, 0x7c, 0x8e, 0x07, 0x83, 0xa8, 0x63, 0xd6, 0x70, 0x71, + 0xff, 0x46, 0x35, 0xfe, 0x41, 0x08, 0x8d, 0x47, 0x81, 0xe0, 0x50, 0xf2, 0x1e, 0x0c, 0xa3, 0x1f, 0x70, 0x2c, 0xf8, 0x1e, 0xc3, 0x40, 0xb8, 0x12, 0xa9, 0x90, 0xfd, 0xd4, 0x22, 0x15, 0x32, 0x00, 0xf9, 0x2c, 0xe4, 0x4a, 0xdb, 0x35, 0x31, 0x2e, 0x53, 0x2a, 0xf9, 0x76, 0x2d, 0xca, 0xb2, 0x60, - 0x6b, 0xe9, 0x10, 0x18, 0x05, 0x23, 0xbc, 0x57, 0xde, 0x10, 0xa3, 0xa2, 0x12, 0xde, 0x2b, 0x6f, - 0x44, 0x84, 0x7b, 0x75, 0x2d, 0x98, 0xd1, 0xbd, 0xf2, 0xc6, 0x27, 0x37, 0xed, 0xff, 0xad, 0x2c, - 0x8f, 0x60, 0xc1, 0x3f, 0xec, 0x7d, 0x98, 0xd0, 0x82, 0x13, 0x67, 0x22, 0x79, 0x2c, 0x0c, 0x24, + 0x6b, 0xe9, 0x10, 0x18, 0x05, 0x23, 0xbc, 0x5b, 0xde, 0x10, 0xa3, 0xa2, 0x12, 0xde, 0x2d, 0x6f, + 0x44, 0x84, 0x7b, 0x75, 0x2d, 0x98, 0xd1, 0xdd, 0xf2, 0xc6, 0xc7, 0x37, 0xed, 0xff, 0xad, 0x2c, + 0x8f, 0x60, 0xc1, 0x3f, 0xec, 0x3d, 0x98, 0xd0, 0x82, 0x13, 0x67, 0x22, 0x79, 0x2c, 0x0c, 0x24, 0x1d, 0x33, 0x01, 0xd2, 0x08, 0x64, 0xbe, 0x12, 0xf6, 0x1b, 0x25, 0x5e, 0xd5, 0xd8, 0x26, 0xe4, - 0x80, 0x32, 0x71, 0x3c, 0x5f, 0x49, 0x48, 0x42, 0x6e, 0x43, 0x7e, 0x93, 0xb6, 0xed, 0x76, 0x10, + 0x80, 0x32, 0x71, 0x3c, 0x5f, 0x49, 0x48, 0x42, 0x6e, 0x41, 0x7e, 0x93, 0xb6, 0xed, 0x76, 0x10, 0x2a, 0x44, 0xd1, 0x5a, 0x38, 0x40, 0x98, 0x2e, 0x35, 0x84, 0x88, 0x68, 0xd9, 0xda, 0xdd, 0xf1, 0xeb, 0x9e, 0x83, 0x91, 0x6e, 0xc2, 0xb3, 0x98, 0x5b, 0xb6, 0x2a, 0x25, 0x3a, 0x83, 0x18, 0x91, 0xf1, 0x73, 0x19, 0x18, 0x15, 0x03, 0xc9, 0xf3, 0x4c, 0xed, 0x45, 0x67, 0x89, 0xf0, 0x06, 0xd8, 0x73, 0xe2, 0xde, 0x00, 0x7b, 0x3c, 0x9c, 0xcc, 0x98, 0xf0, 0x6d, 0x0b, 0x9f, 0x06, 0x71, 0x36, 0x4a, 0x2f, 0x40, 0x3d, 0x8d, 0x50, 0x88, 0x3a, 0xa8, 0x87, 0x95, 0xf1, 0x0f, 0x44, 0xcb, 0xee, - 0x95, 0x37, 0xc8, 0x22, 0xe4, 0x57, 0x5d, 0x1e, 0xaa, 0x48, 0x4d, 0x1a, 0xda, 0x14, 0x30, 0xb5, + 0x96, 0x37, 0xc8, 0x22, 0xe4, 0x57, 0x5d, 0x1e, 0xaa, 0x48, 0x4d, 0x1a, 0xda, 0x14, 0x30, 0xb5, 0x83, 0x24, 0x1e, 0x6b, 0xdf, 0x86, 0xe7, 0x8a, 0xbb, 0x8c, 0xd2, 0xbe, 0x0e, 0x07, 0xc6, 0xda, - 0x17, 0xa2, 0x0e, 0xdc, 0x3e, 0x9a, 0xb2, 0x49, 0x3c, 0xba, 0x8d, 0x89, 0x1c, 0xee, 0xab, 0x9e, - 0x6b, 0xa2, 0x48, 0xee, 0x14, 0x0b, 0xbd, 0x76, 0x8a, 0x47, 0xb7, 0xcd, 0x14, 0x2a, 0x7c, 0x57, - 0x8b, 0xc0, 0x35, 0xea, 0x3d, 0x7e, 0x86, 0x77, 0xe9, 0xf4, 0x77, 0xb5, 0xf8, 0xe7, 0x0d, 0xb4, - 0x49, 0xff, 0x41, 0x16, 0xce, 0xa7, 0x13, 0xaa, 0xdf, 0x92, 0xe9, 0xf3, 0x2d, 0xd7, 0x20, 0xbf, + 0x17, 0xa2, 0x0e, 0xdc, 0x3e, 0x9a, 0xb2, 0x49, 0x3c, 0xbc, 0x85, 0x89, 0x1c, 0xee, 0xa9, 0x9e, + 0x6b, 0xa2, 0x48, 0xee, 0x14, 0x0b, 0xbd, 0x76, 0x8a, 0x87, 0xb7, 0xcc, 0x14, 0x2a, 0x7c, 0x57, + 0x8b, 0xc0, 0x35, 0xea, 0x3d, 0x7a, 0x8a, 0x77, 0xe9, 0xf4, 0x77, 0xb5, 0xf8, 0xe7, 0x0d, 0xb4, + 0x49, 0xff, 0x61, 0x16, 0xce, 0xa7, 0x13, 0xaa, 0xdf, 0x92, 0xe9, 0xf3, 0x2d, 0x57, 0x21, 0xbf, 0xe2, 0xfa, 0x81, 0x62, 0xf5, 0x87, 0xea, 0xff, 0x7d, 0x01, 0x33, 0xc3, 0x52, 0x76, 0xe7, 0x66, - 0x7f, 0x87, 0xcb, 0x13, 0xf9, 0x61, 0xdc, 0x06, 0x76, 0xe7, 0xe6, 0x45, 0xe4, 0x1e, 0xe4, 0x4d, + 0x7f, 0x87, 0xcb, 0x13, 0xf9, 0x61, 0xdc, 0x06, 0x76, 0xe7, 0xe6, 0x45, 0xe4, 0x2e, 0xe4, 0x4d, 0xe1, 0x39, 0x15, 0xeb, 0x1a, 0x09, 0x0e, 0xa5, 0x29, 0xe2, 0x09, 0x88, 0x16, 0x23, 0x5a, 0xc0, 0x48, 0x09, 0x46, 0xc5, 0xe8, 0xc7, 0x9e, 0x8e, 0x53, 0xa6, 0x8c, 0x1e, 0xb6, 0x5d, 0xd2, 0xb1, 0x1d, 0x05, 0x1f, 0x01, 0xab, 0x15, 0xe9, 0x04, 0x85, 0x3b, 0x0a, 0x7f, 0x24, 0xd4, 0x0d, 0x2c, - 0x43, 0x44, 0xe3, 0x87, 0xb3, 0x00, 0x52, 0x6b, 0xf3, 0xcc, 0xce, 0xb0, 0xcf, 0x6a, 0x33, 0x4c, - 0xb1, 0x37, 0x1a, 0x3c, 0x2f, 0xea, 0x43, 0x34, 0xe7, 0x19, 0x3c, 0x2b, 0x6a, 0x11, 0x86, 0x37, - 0x23, 0x85, 0x96, 0xf0, 0x31, 0x41, 0x75, 0x34, 0x87, 0x1b, 0x3b, 0x30, 0x77, 0x8f, 0x06, 0x91, - 0x7a, 0x4b, 0x3e, 0x3d, 0xf6, 0x67, 0xfb, 0x3a, 0x8c, 0x09, 0xfc, 0x70, 0xff, 0xe2, 0xba, 0x18, - 0x11, 0x0a, 0x05, 0x75, 0x31, 0x12, 0x81, 0xed, 0x46, 0x15, 0xda, 0xa4, 0x01, 0xfd, 0x64, 0xab, - 0xa9, 0x01, 0xe1, 0x9f, 0x82, 0x5f, 0x36, 0x58, 0x0d, 0xa7, 0xf6, 0xcf, 0x23, 0x38, 0x17, 0xb6, - 0xfd, 0x69, 0xf2, 0xbd, 0xc9, 0xae, 0x94, 0x22, 0xe2, 0x79, 0xc4, 0xb1, 0x8f, 0xed, 0xc9, 0x13, - 0x58, 0x90, 0x04, 0xdb, 0x4e, 0x68, 0x38, 0x39, 0x10, 0x2d, 0x79, 0x07, 0xc6, 0x15, 0x1a, 0x11, + 0x43, 0x44, 0xe3, 0x87, 0xb3, 0x00, 0x52, 0x6b, 0xf3, 0xd4, 0xce, 0xb0, 0xcf, 0x6a, 0x33, 0x4c, + 0xb1, 0x37, 0x1a, 0x3c, 0x2f, 0xea, 0x03, 0x34, 0xe7, 0x19, 0x3c, 0x2b, 0x6a, 0x11, 0x86, 0x37, + 0x23, 0x85, 0x96, 0xf0, 0x31, 0x41, 0x75, 0x34, 0x87, 0x1b, 0x3b, 0x30, 0x77, 0x97, 0x06, 0x91, + 0x7a, 0x4b, 0x3e, 0x3d, 0xf6, 0x67, 0xfb, 0x1a, 0x8c, 0x09, 0xfc, 0x70, 0xff, 0xe2, 0xba, 0x18, + 0x11, 0x0a, 0x05, 0x75, 0x31, 0x12, 0x81, 0xed, 0x46, 0x15, 0xda, 0xa4, 0x01, 0xfd, 0x78, 0xab, + 0xa9, 0x01, 0xe1, 0x9f, 0x82, 0x5f, 0x36, 0x58, 0x0d, 0xa7, 0xf6, 0xcf, 0x43, 0x38, 0x17, 0xb6, + 0xfd, 0x49, 0xf2, 0xbd, 0xc1, 0xae, 0x94, 0x22, 0xe2, 0x79, 0xc4, 0xb1, 0x8f, 0xed, 0xc9, 0x63, + 0x58, 0x90, 0x04, 0xdb, 0x4e, 0x68, 0x38, 0x39, 0x10, 0x2d, 0x79, 0x1b, 0xc6, 0x15, 0x1a, 0x11, 0xb1, 0x1b, 0xd5, 0xd4, 0x87, 0x4e, 0xb0, 0x6f, 0xf9, 0x1c, 0xae, 0xaa, 0xa9, 0x15, 0x74, 0xe3, - 0xcb, 0xf0, 0x7c, 0xe8, 0x07, 0x94, 0x52, 0x75, 0x8c, 0x79, 0xe6, 0x6c, 0xcc, 0xd7, 0xa3, 0xcf, - 0xaa, 0xb6, 0x43, 0x57, 0x67, 0xc9, 0x9b, 0xa8, 0x9f, 0x25, 0x3e, 0xe6, 0x85, 0x84, 0xf3, 0xb4, - 0xe2, 0x23, 0x6d, 0xbc, 0xad, 0x34, 0x36, 0x85, 0xa1, 0x46, 0x9c, 0x89, 0x13, 0xff, 0x70, 0x16, - 0xa6, 0x1f, 0x56, 0x2b, 0xe5, 0xd0, 0xfa, 0xe8, 0x7b, 0x2c, 0x6b, 0xab, 0xf6, 0x6d, 0xbd, 0xf7, - 0x1b, 0x63, 0x0b, 0x66, 0x63, 0xdd, 0x80, 0xa2, 0xc3, 0x7b, 0xdc, 0x83, 0x24, 0x04, 0x4b, 0xb1, - 0xe1, 0x7c, 0x1a, 0xfb, 0x47, 0xb7, 0xcd, 0x18, 0xb6, 0xf1, 0x5f, 0x40, 0x8c, 0xaf, 0xd8, 0xc2, - 0x5e, 0x87, 0xb1, 0xaa, 0xef, 0x77, 0xa9, 0xb7, 0x65, 0xae, 0xaa, 0xaa, 0x02, 0x07, 0x81, 0x56, - 0xd7, 0x6b, 0x9a, 0x11, 0x02, 0xb9, 0x0e, 0x79, 0x11, 0xc4, 0x5a, 0xee, 0x09, 0xa8, 0xb5, 0x0d, - 0x63, 0x60, 0x9b, 0x61, 0x31, 0x79, 0x13, 0x26, 0xf8, 0xdf, 0x7c, 0xb6, 0x89, 0x0e, 0x47, 0xe5, - 0xa0, 0x40, 0xe7, 0xb3, 0xd3, 0xd4, 0xd0, 0xc8, 0x6b, 0x90, 0x2b, 0x95, 0x4d, 0xa1, 0x0e, 0x12, - 0x72, 0x23, 0xe6, 0x62, 0xef, 0x52, 0xfd, 0x12, 0x51, 0x36, 0x99, 0xf4, 0x27, 0xe3, 0x3d, 0x08, - 0x4d, 0x36, 0x4f, 0x19, 0x2f, 0x60, 0xb1, 0xc3, 0x0c, 0x61, 0xe4, 0x26, 0x8c, 0x56, 0xb8, 0xc9, - 0x9c, 0xd0, 0x63, 0xf3, 0x94, 0x64, 0x1c, 0xa4, 0x45, 0x4b, 0xe0, 0x20, 0x72, 0x5d, 0xa6, 0x6a, - 0xca, 0x47, 0x8e, 0x28, 0x3d, 0xf2, 0x31, 0xbd, 0x0e, 0x23, 0x22, 0xd4, 0xf3, 0x98, 0x92, 0xc4, - 0x21, 0x1e, 0xe2, 0x59, 0xe0, 0x24, 0x3d, 0x52, 0xe1, 0x69, 0x7a, 0xa4, 0xee, 0xc0, 0x85, 0x7b, - 0xa8, 0xbd, 0xd1, 0xe3, 0x23, 0x6d, 0x99, 0x55, 0xa1, 0x0f, 0xc7, 0x67, 0x20, 0xae, 0xe0, 0x89, - 0x87, 0x58, 0xb2, 0xba, 0x9e, 0x9a, 0x61, 0xb3, 0x17, 0x23, 0xf2, 0x25, 0x98, 0x4b, 0x2b, 0x12, - 0x5a, 0x73, 0x8c, 0x04, 0x94, 0x5e, 0x81, 0x1a, 0x09, 0x28, 0x8d, 0x03, 0x59, 0x85, 0x02, 0x87, - 0x97, 0x1a, 0x2d, 0xa7, 0xcd, 0x35, 0xff, 0x5c, 0xab, 0x8e, 0x9e, 0x21, 0x82, 0xab, 0xcd, 0x0a, - 0xf9, 0x0b, 0x80, 0xe6, 0x4b, 0x14, 0xa3, 0x24, 0x3f, 0x95, 0x61, 0xb7, 0x39, 0x1e, 0x18, 0x79, - 0xcb, 0x5c, 0xf5, 0x45, 0x14, 0xb9, 0xf3, 0x91, 0x9b, 0x50, 0x2d, 0xf0, 0x9c, 0xf6, 0x9e, 0xf0, - 0x13, 0xda, 0x14, 0x7e, 0x42, 0xef, 0x7c, 0x24, 0x3f, 0x21, 0xce, 0xca, 0x3f, 0x39, 0x2e, 0x4e, - 0x78, 0xa2, 0x4e, 0x5c, 0x45, 0x5a, 0x0b, 0x58, 0xd7, 0xa1, 0xb3, 0xec, 0x56, 0x9b, 0x87, 0x65, - 0xa5, 0x0d, 0xfe, 0x91, 0xd3, 0xb8, 0x83, 0x63, 0xd7, 0x61, 0x72, 0x00, 0xab, 0x1b, 0x22, 0x24, - 0x3e, 0x34, 0x95, 0x03, 0xbb, 0x78, 0x4a, 0x5f, 0x14, 0xee, 0x5e, 0x5b, 0x88, 0x2e, 0x9e, 0xd2, - 0x71, 0xc5, 0xc2, 0x69, 0xa4, 0x4e, 0x1e, 0x8d, 0x84, 0xdc, 0x84, 0x91, 0x35, 0xfb, 0x49, 0x69, - 0x8f, 0x8a, 0x14, 0x7c, 0x93, 0x72, 0xfb, 0x43, 0xe0, 0x52, 0xfe, 0x0f, 0xb9, 0xaf, 0xc3, 0x73, - 0xa6, 0x40, 0x23, 0xdf, 0x9f, 0x81, 0xf3, 0x7c, 0x19, 0xcb, 0xaf, 0xac, 0xd1, 0x20, 0x60, 0xfd, - 0x20, 0xc2, 0xc9, 0x5d, 0x89, 0x0c, 0xb6, 0xd3, 0xf1, 0xd0, 0x95, 0xde, 0x10, 0x3b, 0x43, 0xd8, - 0x71, 0xbe, 0x28, 0xd5, 0x02, 0xe5, 0xa6, 0xd2, 0x93, 0x4d, 0x18, 0x5f, 0xbb, 0x5b, 0x0a, 0xab, - 0xe5, 0xd1, 0xb3, 0x8b, 0x69, 0xbb, 0xa3, 0x82, 0x96, 0xe6, 0x69, 0xa0, 0xb2, 0x11, 0xde, 0x01, - 0x9f, 0x95, 0xfd, 0x41, 0xde, 0x50, 0x7d, 0x4b, 0x73, 0x28, 0x3d, 0x8f, 0xb6, 0xec, 0x27, 0x96, - 0xbd, 0x47, 0xb5, 0x57, 0x72, 0xa1, 0xbd, 0xfe, 0x99, 0x0c, 0x5c, 0xec, 0xf9, 0xc9, 0xe4, 0x0e, - 0x5c, 0xb0, 0xb9, 0xc7, 0xb4, 0xb5, 0x1f, 0x04, 0x1d, 0xdf, 0x92, 0x57, 0x0c, 0xe1, 0x8d, 0x6a, - 0x9e, 0x13, 0xc5, 0x2b, 0xac, 0x54, 0xde, 0x3a, 0x7c, 0xf2, 0x3e, 0xbc, 0xe0, 0xb4, 0x7d, 0x5a, - 0xef, 0x7a, 0xd4, 0x92, 0x0c, 0xea, 0x4e, 0xc3, 0xb3, 0x3c, 0xbb, 0xbd, 0x27, 0x5d, 0x6b, 0xcd, - 0x8b, 0x12, 0x47, 0x78, 0x65, 0x97, 0x9d, 0x86, 0x67, 0x22, 0x82, 0xf1, 0x47, 0x19, 0x98, 0xef, - 0xd5, 0x25, 0x64, 0x1e, 0x46, 0x69, 0xdb, 0xde, 0x69, 0x4a, 0x87, 0x22, 0x53, 0xfe, 0x24, 0xcf, - 0x43, 0xb4, 0xd3, 0x8b, 0xd3, 0x3f, 0x5f, 0x17, 0x39, 0x0d, 0xd0, 0xb4, 0x5d, 0xdd, 0xd7, 0x85, - 0x81, 0xf2, 0x44, 0x5d, 0xdd, 0xdd, 0x2f, 0x01, 0x44, 0xdb, 0x39, 0x57, 0x4c, 0x98, 0x63, 0x76, + 0xcb, 0xf0, 0x6c, 0xe8, 0x07, 0x94, 0x52, 0x75, 0x8c, 0x79, 0xe6, 0x6c, 0xcc, 0xd7, 0xa3, 0xcf, + 0xaa, 0xb6, 0x43, 0x57, 0x67, 0xc9, 0x9b, 0xa8, 0x9f, 0x25, 0x3e, 0xe6, 0xb9, 0x84, 0xf3, 0xb4, + 0xe2, 0x23, 0x6d, 0xbc, 0xa5, 0x34, 0x36, 0x85, 0xa1, 0x46, 0x9c, 0x89, 0x13, 0xff, 0x70, 0x16, + 0xa6, 0x1f, 0x54, 0x2b, 0xe5, 0xd0, 0xfa, 0xe8, 0x13, 0x96, 0xb5, 0x55, 0xfb, 0xb6, 0xde, 0xfb, + 0x8d, 0xb1, 0x05, 0xb3, 0xb1, 0x6e, 0x40, 0xd1, 0xe1, 0x5d, 0xee, 0x41, 0x12, 0x82, 0xa5, 0xd8, + 0x70, 0x3e, 0x8d, 0xfd, 0xc3, 0x5b, 0x66, 0x0c, 0xdb, 0xf8, 0x2f, 0x21, 0xc6, 0x57, 0x6c, 0x61, + 0xaf, 0xc1, 0x58, 0xd5, 0xf7, 0xbb, 0xd4, 0xdb, 0x32, 0x57, 0x55, 0x55, 0x81, 0x83, 0x40, 0xab, + 0xeb, 0x35, 0xcd, 0x08, 0x81, 0x5c, 0x83, 0xbc, 0x08, 0x62, 0x2d, 0xf7, 0x04, 0xd4, 0xda, 0x86, + 0x31, 0xb0, 0xcd, 0xb0, 0x98, 0xbc, 0x01, 0x13, 0xfc, 0x6f, 0x3e, 0xdb, 0x44, 0x87, 0xa3, 0x72, + 0x50, 0xa0, 0xf3, 0xd9, 0x69, 0x6a, 0x68, 0xe4, 0x55, 0xc8, 0x95, 0xca, 0xa6, 0x50, 0x07, 0x09, + 0xb9, 0x11, 0x73, 0xb1, 0x77, 0xa9, 0x7e, 0x89, 0x28, 0x9b, 0x4c, 0xfa, 0x93, 0xf1, 0x1e, 0x84, + 0x26, 0x9b, 0xa7, 0x8c, 0x17, 0xb0, 0xd8, 0x61, 0x86, 0x30, 0x72, 0x03, 0x46, 0x2b, 0xdc, 0x64, + 0x4e, 0xe8, 0xb1, 0x79, 0x4a, 0x32, 0x0e, 0xd2, 0xa2, 0x25, 0x70, 0x10, 0xb9, 0x26, 0x53, 0x35, + 0xe5, 0x23, 0x47, 0x94, 0x1e, 0xf9, 0x98, 0x5e, 0x83, 0x11, 0x11, 0xea, 0x79, 0x4c, 0x49, 0xe2, + 0x10, 0x0f, 0xf1, 0x2c, 0x70, 0x92, 0x1e, 0xa9, 0xf0, 0x24, 0x3d, 0x52, 0x77, 0xe0, 0xc2, 0x5d, + 0xd4, 0xde, 0xe8, 0xf1, 0x91, 0xb6, 0xcc, 0xaa, 0xd0, 0x87, 0xe3, 0x33, 0x10, 0x57, 0xf0, 0xc4, + 0x43, 0x2c, 0x59, 0x5d, 0x4f, 0xcd, 0xb0, 0xd9, 0x8b, 0x11, 0xf9, 0x12, 0xcc, 0xa5, 0x15, 0x09, + 0xad, 0x39, 0x46, 0x02, 0x4a, 0xaf, 0x40, 0x8d, 0x04, 0x94, 0xc6, 0x81, 0xac, 0x42, 0x81, 0xc3, + 0x4b, 0x8d, 0x96, 0xd3, 0xe6, 0x9a, 0x7f, 0xae, 0x55, 0x47, 0xcf, 0x10, 0xc1, 0xd5, 0x66, 0x85, + 0xfc, 0x05, 0x40, 0xf3, 0x25, 0x8a, 0x51, 0x92, 0x9f, 0xca, 0xb0, 0xdb, 0x1c, 0x0f, 0x8c, 0xbc, + 0x65, 0xae, 0xfa, 0x22, 0x8a, 0xdc, 0xf9, 0xc8, 0x4d, 0xa8, 0x16, 0x78, 0x4e, 0x7b, 0x4f, 0xf8, + 0x09, 0x6d, 0x0a, 0x3f, 0xa1, 0xb7, 0x3f, 0x94, 0x9f, 0x10, 0x67, 0xe5, 0x9f, 0x1c, 0x17, 0x27, + 0x3c, 0x51, 0x27, 0xae, 0x22, 0xad, 0x05, 0xac, 0xeb, 0xd0, 0x59, 0x76, 0xab, 0xcd, 0xc3, 0xb2, + 0xd2, 0x06, 0xff, 0xc8, 0x69, 0xdc, 0xc1, 0xb1, 0xeb, 0x30, 0x39, 0x80, 0xd5, 0x0d, 0x11, 0x12, + 0x1f, 0x9a, 0xca, 0x81, 0x5d, 0x3c, 0xa5, 0x2f, 0x0a, 0x77, 0xaf, 0x2d, 0x44, 0x17, 0x4f, 0xe9, + 0xb8, 0x62, 0xe1, 0x34, 0x52, 0x27, 0x8f, 0x46, 0x42, 0x6e, 0xc0, 0xc8, 0x9a, 0xfd, 0xb8, 0xb4, + 0x47, 0x45, 0x0a, 0xbe, 0x49, 0xb9, 0xfd, 0x21, 0x70, 0x29, 0xff, 0x47, 0xdc, 0xd7, 0xe1, 0x19, + 0x53, 0xa0, 0x91, 0xef, 0xcb, 0xc0, 0x79, 0xbe, 0x8c, 0xe5, 0x57, 0xd6, 0x68, 0x10, 0xb0, 0x7e, + 0x10, 0xe1, 0xe4, 0x2e, 0x47, 0x06, 0xdb, 0xe9, 0x78, 0xe8, 0x4a, 0x6f, 0x88, 0x9d, 0x21, 0xec, + 0x38, 0x5f, 0x94, 0x6a, 0x81, 0x72, 0x53, 0xe9, 0xc9, 0x26, 0x8c, 0xaf, 0xdd, 0x29, 0x85, 0xd5, + 0xf2, 0xe8, 0xd9, 0xc5, 0xb4, 0xdd, 0x51, 0x41, 0x4b, 0xf3, 0x34, 0x50, 0xd9, 0x08, 0xef, 0x80, + 0xcf, 0xca, 0xfe, 0x20, 0xaf, 0xab, 0xbe, 0xa5, 0x39, 0x94, 0x9e, 0x47, 0x5b, 0xf6, 0x63, 0xcb, + 0xde, 0xa3, 0xda, 0x2b, 0xb9, 0xd0, 0x5e, 0xff, 0x4c, 0x06, 0x2e, 0xf6, 0xfc, 0x64, 0x72, 0x1b, + 0x2e, 0xd8, 0xdc, 0x63, 0xda, 0xda, 0x0f, 0x82, 0x8e, 0x6f, 0xc9, 0x2b, 0x86, 0xf0, 0x46, 0x35, + 0xcf, 0x89, 0xe2, 0x15, 0x56, 0x2a, 0x6f, 0x1d, 0x3e, 0x79, 0x0f, 0x9e, 0x73, 0xda, 0x3e, 0xad, + 0x77, 0x3d, 0x6a, 0x49, 0x06, 0x75, 0xa7, 0xe1, 0x59, 0x9e, 0xdd, 0xde, 0x93, 0xae, 0xb5, 0xe6, + 0x45, 0x89, 0x23, 0xbc, 0xb2, 0xcb, 0x4e, 0xc3, 0x33, 0x11, 0xc1, 0xf8, 0xe3, 0x0c, 0xcc, 0xf7, + 0xea, 0x12, 0x32, 0x0f, 0xa3, 0xb4, 0x6d, 0xef, 0x34, 0xa5, 0x43, 0x91, 0x29, 0x7f, 0x92, 0x67, + 0x21, 0xda, 0xe9, 0xc5, 0xe9, 0x9f, 0xaf, 0x8b, 0x9c, 0x06, 0x68, 0xda, 0xae, 0xee, 0xeb, 0xc2, + 0x40, 0x79, 0xa2, 0xae, 0xee, 0xee, 0xcf, 0x03, 0x44, 0xdb, 0x39, 0x57, 0x4c, 0x98, 0x63, 0x76, 0xdd, 0xe3, 0x2b, 0x8f, 0x9c, 0x87, 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, 0x3a, 0x8c, 0x95, 0xf7, + 0xd8, 0x65, 0xeb, 0x6e, 0x5f, 0xf2, 0xed, 0x27, 0x9b, 0xfa, 0xf6, 0xf3, 0x1a, 0x8c, 0x95, 0xf7, 0x69, 0xfd, 0x20, 0x74, 0xc2, 0xc9, 0x0b, 0xe5, 0x3a, 0x03, 0xf2, 0x90, 0xd5, 0x11, 0x02, 0xb9, - 0x09, 0x80, 0x7e, 0xa7, 0x5c, 0x22, 0x55, 0xd2, 0x4e, 0xa0, 0x9b, 0xaa, 0x30, 0x4f, 0x51, 0x50, - 0x90, 0x7d, 0xcd, 0xbc, 0xab, 0xda, 0xb3, 0x70, 0xf6, 0xbe, 0xb7, 0x2b, 0xd0, 0x23, 0x04, 0xf6, - 0x79, 0xca, 0xbe, 0x22, 0x4e, 0xc1, 0x42, 0x62, 0xf3, 0x51, 0x91, 0xc8, 0x0d, 0x18, 0xdb, 0x90, + 0x01, 0x80, 0x7e, 0xa7, 0x5c, 0x22, 0x55, 0xd2, 0x4e, 0xa0, 0x9b, 0xaa, 0x30, 0x4f, 0x51, 0x50, + 0x90, 0x7d, 0xcd, 0xbc, 0xa3, 0xda, 0xb3, 0x70, 0xf6, 0xbe, 0xb7, 0x2b, 0xd0, 0x23, 0x04, 0xf6, + 0x79, 0xca, 0xbe, 0x22, 0x4e, 0xc1, 0x42, 0x62, 0xf3, 0x51, 0x91, 0xc8, 0x75, 0x18, 0xdb, 0x90, 0x8e, 0x04, 0x78, 0x08, 0x4e, 0x20, 0x05, 0x44, 0x4e, 0x07, 0xf3, 0x19, 0x33, 0x42, 0x21, 0x9f, 0x85, 0xd1, 0x32, 0xf5, 0x82, 0xcd, 0xcd, 0x55, 0x34, 0x3a, 0xe1, 0xd9, 0x19, 0xf2, 0x18, 0x49, 0x3f, 0x08, 0x9a, 0xdf, 0x3d, 0x2e, 0x4e, 0x06, 0x4e, 0x8b, 0x86, 0x51, 0xa7, 0x4d, 0x89, 0x4d, @@ -22504,759 +22609,759 @@ var fileDescriptor_9198ee693835762e = []byte{ 0x43, 0xba, 0x13, 0xe6, 0x11, 0x48, 0xe0, 0x93, 0x65, 0x99, 0x7e, 0x43, 0xfd, 0x4c, 0x88, 0x94, 0x61, 0xf1, 0x1d, 0x83, 0x7d, 0x6d, 0x92, 0x82, 0x94, 0x60, 0xb2, 0xec, 0xb6, 0x3a, 0x76, 0xe0, 0x60, 0x42, 0xbc, 0x23, 0x71, 0x08, 0xa2, 0x42, 0xaf, 0xae, 0x16, 0x68, 0x27, 0xaa, 0x5a, 0x40, - 0xee, 0xc2, 0x94, 0xe9, 0x76, 0xd9, 0x30, 0xc9, 0x5b, 0x38, 0x3f, 0xe7, 0xd0, 0x34, 0xc4, 0x63, + 0xee, 0xc0, 0x94, 0xe9, 0x76, 0xd9, 0x30, 0xc9, 0x5b, 0x38, 0x3f, 0xe7, 0xd0, 0x34, 0xc4, 0x63, 0x25, 0xec, 0x58, 0x16, 0x57, 0x6e, 0x2d, 0x20, 0xa8, 0x46, 0x45, 0xd6, 0x53, 0x9e, 0x43, 0xd4, - 0xc3, 0x4d, 0xcd, 0x26, 0x90, 0x60, 0x96, 0xf2, 0x92, 0x72, 0x1b, 0xc6, 0x6b, 0xb5, 0x87, 0x9b, - 0xd4, 0x0f, 0xee, 0x36, 0xdd, 0x43, 0x3c, 0xdb, 0xf2, 0x22, 0xcb, 0x92, 0xef, 0x5a, 0x01, 0xf5, + 0xc3, 0x4d, 0xcd, 0x26, 0x90, 0x60, 0x96, 0xf2, 0x92, 0x72, 0x0b, 0xc6, 0x6b, 0xb5, 0x07, 0x9b, + 0xd4, 0x0f, 0xee, 0x34, 0xdd, 0x43, 0x3c, 0xdb, 0xf2, 0x22, 0xcb, 0x92, 0xef, 0x5a, 0x01, 0xf5, 0x03, 0x6b, 0xb7, 0xe9, 0x1e, 0x9a, 0x2a, 0x16, 0xf9, 0x1a, 0xeb, 0x0f, 0x45, 0x12, 0x14, 0xa1, 0x4f, 0xfb, 0x09, 0xab, 0x78, 0x82, 0x44, 0x8b, 0x86, 0x89, 0xac, 0x7a, 0x67, 0x29, 0xe8, 0xe8, - 0x53, 0xe6, 0xb9, 0x4f, 0x8e, 0x4a, 0x8d, 0x86, 0x47, 0x7d, 0x5f, 0x1c, 0x42, 0xdc, 0xa7, 0x0c, + 0x53, 0xe6, 0xb9, 0x8f, 0x8f, 0x4a, 0x8d, 0x86, 0x47, 0x7d, 0x5f, 0x1c, 0x42, 0xdc, 0xa7, 0x0c, 0x95, 0x0d, 0x36, 0x2f, 0xd0, 0x7c, 0xca, 0x14, 0x02, 0xf2, 0xa3, 0x19, 0x38, 0xa7, 0x7a, 0x9b, - 0xe0, 0x72, 0x41, 0x33, 0x17, 0x7e, 0x24, 0xbd, 0x71, 0x43, 0x1e, 0xc2, 0x37, 0x14, 0xb4, 0x1b, - 0x8f, 0x6f, 0xdd, 0x28, 0x45, 0x3f, 0x6b, 0x92, 0x08, 0xc3, 0xb8, 0x15, 0x53, 0xf9, 0x45, 0x2d, + 0xe0, 0x72, 0x41, 0x33, 0x17, 0x7e, 0x24, 0xbd, 0x7e, 0x5d, 0x1e, 0xc2, 0xd7, 0x15, 0xb4, 0xeb, + 0x8f, 0x6e, 0x5e, 0x2f, 0x45, 0x3f, 0x6b, 0x92, 0x08, 0xc3, 0xb8, 0x15, 0x53, 0xf9, 0x45, 0x2d, 0x98, 0xcf, 0x98, 0x73, 0x76, 0x0a, 0x31, 0x29, 0x33, 0x49, 0x8d, 0xcd, 0x28, 0x34, 0x9c, 0xaa, 0x6e, 0xe0, 0x99, 0x26, 0x34, 0xaa, 0x62, 0xfe, 0x71, 0x13, 0x2b, 0xa7, 0xa3, 0x0b, 0x64, 0x0a, 0x0d, 0xa9, 0xc2, 0x34, 0x07, 0xb0, 0x6d, 0x81, 0x27, 0xe1, 0x99, 0x8d, 0x12, 0x01, 0x08, 0x36, - 0xf8, 0xd6, 0x8f, 0x89, 0x78, 0xd4, 0x58, 0x9d, 0x31, 0x3a, 0xf2, 0x3e, 0x4c, 0xf9, 0xfe, 0xbe, + 0xf8, 0xd6, 0x8f, 0x89, 0x78, 0xd4, 0x58, 0x9d, 0x31, 0x3a, 0xf2, 0x1e, 0x4c, 0xf9, 0xfe, 0xbe, 0xa5, 0xac, 0xd7, 0x39, 0x5c, 0xc5, 0x18, 0x72, 0x54, 0x94, 0xc4, 0x3c, 0xef, 0x26, 0x7c, 0x7f, - 0x3f, 0x5a, 0xd1, 0xef, 0xc3, 0x14, 0xda, 0xea, 0x44, 0x0c, 0xce, 0x45, 0x0c, 0x44, 0x49, 0x9c, - 0x41, 0xd0, 0xf4, 0x23, 0x06, 0x7f, 0x37, 0x03, 0x17, 0x59, 0x45, 0xe9, 0x23, 0x74, 0xfe, 0xa3, + 0x3f, 0x5a, 0xd1, 0xef, 0xc1, 0x14, 0xda, 0xea, 0x44, 0x0c, 0xce, 0x45, 0x0c, 0x44, 0x49, 0x9c, + 0x41, 0xd0, 0xf4, 0x23, 0x06, 0x7f, 0x37, 0x03, 0x17, 0x59, 0x45, 0xe9, 0x23, 0x74, 0xfe, 0xc3, 0x8c, 0x10, 0x06, 0x61, 0xec, 0xc9, 0x53, 0x15, 0x47, 0x7d, 0x7f, 0x3f, 0x8d, 0x03, 0x36, 0x8a, - 0x35, 0x3e, 0xbd, 0x51, 0x17, 0x3e, 0x72, 0xa3, 0x7a, 0xf2, 0x54, 0x1b, 0x15, 0x34, 0xfd, 0x34, - 0x0e, 0x78, 0xad, 0xad, 0x95, 0xd6, 0x56, 0xa3, 0xbb, 0xd9, 0xf7, 0x96, 0xdb, 0x8a, 0xf6, 0x6d, - 0x7d, 0xdc, 0x56, 0xb6, 0xb8, 0x5b, 0xb4, 0xd2, 0x0d, 0xf2, 0x5a, 0xab, 0x81, 0xe3, 0xd7, 0xda, - 0x18, 0x8d, 0x19, 0xc3, 0x36, 0x7e, 0x09, 0x62, 0x7c, 0x85, 0xa9, 0xaa, 0x01, 0x23, 0xfc, 0xd6, - 0x2a, 0x3a, 0x19, 0x6d, 0x16, 0xf8, 0x9d, 0xd6, 0x14, 0x25, 0xe4, 0x22, 0xe4, 0x6a, 0xb5, 0x87, - 0xa2, 0x93, 0xd1, 0x60, 0xd5, 0xf7, 0x5d, 0x93, 0xc1, 0xd8, 0x08, 0xa1, 0x15, 0xaa, 0x12, 0xa2, - 0x9e, 0x9d, 0x77, 0x26, 0x42, 0x59, 0x7f, 0xcb, 0x3b, 0xe4, 0x50, 0xd4, 0xdf, 0xe2, 0x0e, 0x19, - 0xdd, 0x1c, 0xcb, 0x30, 0x5f, 0xf2, 0x7d, 0xea, 0xb1, 0x09, 0x21, 0x8c, 0x1b, 0x3d, 0x71, 0xcf, - 0x11, 0x07, 0x3b, 0x56, 0x6a, 0xd7, 0x7d, 0xb3, 0x27, 0x22, 0xb9, 0x06, 0xf9, 0x52, 0xb7, 0xe1, - 0xd0, 0x76, 0x5d, 0x8b, 0xb3, 0x66, 0x0b, 0x98, 0x19, 0x96, 0x92, 0x2f, 0xc2, 0xb9, 0x58, 0x10, - 0x44, 0xd1, 0x03, 0xa3, 0xd1, 0xde, 0x2b, 0xef, 0x61, 0x91, 0x41, 0x06, 0xef, 0x92, 0x74, 0x4a, - 0x52, 0x82, 0xc2, 0x32, 0xba, 0x69, 0x55, 0x28, 0x7f, 0x1b, 0x72, 0x3d, 0xee, 0x9f, 0xc7, 0x6f, - 0xcd, 0xdc, 0x85, 0xcb, 0x6a, 0x84, 0x85, 0x66, 0x02, 0x9d, 0x3c, 0x80, 0xd9, 0x38, 0x8c, 0x9d, - 0xe0, 0xfc, 0x82, 0x8c, 0xfb, 0x4d, 0x82, 0x0b, 0x9e, 0xe1, 0x69, 0x54, 0x64, 0x07, 0x66, 0x22, - 0x83, 0x24, 0xfd, 0xda, 0x2c, 0xed, 0x9c, 0xc3, 0x72, 0x79, 0x75, 0x7e, 0x5e, 0x4c, 0xc6, 0xd9, - 0xc8, 0xb8, 0x29, 0xbc, 0x3e, 0x9b, 0x49, 0x76, 0xa4, 0x01, 0x53, 0x35, 0x67, 0xaf, 0xed, 0xb4, - 0xf7, 0x1e, 0xd0, 0xa3, 0x0d, 0xdb, 0xf1, 0x84, 0xc5, 0xa9, 0xb4, 0x27, 0x2f, 0xf9, 0x47, 0xad, - 0x16, 0x0d, 0x3c, 0xdc, 0x08, 0x59, 0x39, 0xfa, 0xa0, 0xb3, 0xeb, 0xd0, 0x82, 0xcf, 0xe9, 0xd0, - 0x6d, 0xb3, 0x63, 0x3b, 0x9a, 0x10, 0xa0, 0xf3, 0xd4, 0x54, 0x17, 0x13, 0x03, 0xaa, 0x2e, 0x9a, - 0x30, 0xb3, 0xdc, 0xae, 0x7b, 0x47, 0xf8, 0x44, 0x27, 0x1b, 0x37, 0x79, 0x4a, 0xe3, 0x5e, 0x16, - 0x8d, 0x7b, 0xc1, 0x96, 0x33, 0x2c, 0xad, 0x79, 0x49, 0xc6, 0xa4, 0x06, 0x33, 0x78, 0x71, 0xa8, - 0x56, 0x36, 0xaa, 0x6d, 0x27, 0x70, 0xec, 0x80, 0x36, 0x84, 0x70, 0xf1, 0x8a, 0xe0, 0x79, 0x89, + 0x35, 0x3e, 0xbd, 0x51, 0x17, 0x3e, 0x74, 0xa3, 0x7a, 0xf2, 0x54, 0x1b, 0x15, 0x34, 0xfd, 0x34, + 0x0e, 0x78, 0xad, 0xad, 0x95, 0xd6, 0x56, 0xa3, 0xbb, 0xd9, 0x27, 0xcb, 0x6d, 0x45, 0xfb, 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, 0x11, 0x72, 0xb5, 0xda, 0x03, + 0xd1, 0xc9, 0x68, 0xb0, 0xea, 0xfb, 0xae, 0xc9, 0x60, 0x6c, 0x84, 0xd0, 0x0a, 0x55, 0x09, 0x51, + 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, 0x85, 0x7c, 0xa9, 0xdb, 0x70, + 0x68, 0xbb, 0xae, 0xc5, 0x59, 0xb3, 0x05, 0xcc, 0x0c, 0x4b, 0xc9, 0x17, 0xe1, 0x5c, 0x2c, 0x08, + 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, 0xc3, 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, 0x2b, 0x26, 0xe3, 0x6c, + 0x64, 0xdc, 0x14, 0x5e, 0x9f, 0xcd, 0x24, 0x3b, 0xd2, 0x80, 0xa9, 0x9a, 0xb3, 0xd7, 0x76, 0xda, + 0x7b, 0xf7, 0xe9, 0xd1, 0x86, 0xed, 0x78, 0xc2, 0xe2, 0x54, 0xda, 0x93, 0x97, 0xfc, 0xa3, 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, 0x23, 0x7c, 0xa2, 0x93, 0x8d, 0x9b, 0x3c, 0xa5, 0x71, 0x2f, 0x89, + 0xc6, 0x3d, 0x67, 0xcb, 0x19, 0x96, 0xd6, 0xbc, 0x24, 0x63, 0x52, 0x83, 0x19, 0xbc, 0x38, 0x54, + 0x2b, 0x1b, 0xd5, 0xb6, 0x13, 0x38, 0x76, 0x40, 0x1b, 0x42, 0xb8, 0x78, 0x59, 0xf0, 0x7c, 0x9e, 0x5f, 0x51, 0x9d, 0x46, 0xc7, 0x72, 0x24, 0x8a, 0xca, 0x34, 0x41, 0xdf, 0xef, 0x9e, 0x38, 0xfd, - 0x97, 0x74, 0x4f, 0xac, 0xc2, 0x74, 0x3c, 0x36, 0x43, 0x21, 0x3a, 0x87, 0x7d, 0x2c, 0x62, 0xc7, + 0x57, 0x74, 0x4f, 0xac, 0xc2, 0x74, 0x3c, 0x36, 0x43, 0x21, 0x3a, 0x87, 0x7d, 0x2c, 0x62, 0xc7, 0xb9, 0xdb, 0x45, 0x61, 0x52, 0xcb, 0xa2, 0xa8, 0xd3, 0xc5, 0xaf, 0x9c, 0x33, 0xda, 0x95, 0x53, - 0xdb, 0x95, 0xce, 0x70, 0xe5, 0x24, 0x1b, 0x00, 0x77, 0x5d, 0xaf, 0x4e, 0x4b, 0xe8, 0x1f, 0x4d, + 0xdb, 0x95, 0xce, 0x70, 0xe5, 0x24, 0x1b, 0x00, 0x77, 0x5c, 0xaf, 0x4e, 0x4b, 0xe8, 0x1f, 0x4d, 0xb4, 0x7c, 0x44, 0x8c, 0x69, 0x54, 0xc8, 0xd7, 0xcf, 0x2e, 0xfb, 0x6d, 0xc5, 0xdd, 0xdc, 0x15, 0x1e, 0xc6, 0x8f, 0x65, 0x61, 0xbe, 0x57, 0x73, 0xfa, 0x5c, 0xf7, 0x3e, 0x05, 0xc9, 0x15, 0x2e, 0xae, 0x7d, 0x05, 0x1a, 0x5f, 0xe7, 0x8b, 0x90, 0xbe, 0x90, 0xc5, 0x35, 0x70, 0x36, 0x4e, 0xb0, - 0xe5, 0x35, 0xc9, 0x1d, 0x18, 0x57, 0x1a, 0x8f, 0x7b, 0x69, 0xaf, 0x4f, 0x35, 0x61, 0x37, 0xfc, + 0xe5, 0x35, 0xc9, 0x6d, 0x18, 0x57, 0x1a, 0x8f, 0x7b, 0x69, 0xaf, 0x4f, 0x35, 0x61, 0x37, 0xfc, 0x9b, 0x5d, 0x13, 0xf9, 0xbe, 0x25, 0xaf, 0x89, 0xfc, 0x17, 0x29, 0x70, 0x17, 0xf1, 0x11, 0x6e, - 0x05, 0xe0, 0xfb, 0x2e, 0x21, 0x80, 0xfb, 0x36, 0xdf, 0x02, 0x4d, 0xfc, 0xdb, 0xf8, 0xf5, 0x09, + 0x05, 0xe0, 0xfb, 0x2e, 0x21, 0x80, 0xfb, 0x36, 0xdf, 0x02, 0x4d, 0xfc, 0xdb, 0xf8, 0x8d, 0x09, 0x7e, 0x22, 0xab, 0xb7, 0xc4, 0x5e, 0xf6, 0xc1, 0xb1, 0xdb, 0x63, 0xf6, 0x2c, 0xb7, 0xc7, 0xdc, 0xe9, 0xb7, 0xc7, 0xa1, 0xd3, 0x6e, 0x8f, 0xb1, 0xeb, 0xdd, 0xf0, 0x99, 0xaf, 0x77, 0x23, 0x67, - 0xba, 0xde, 0x8d, 0x9e, 0xe9, 0x7a, 0xa7, 0xdd, 0x54, 0xf3, 0xa7, 0xdd, 0x54, 0xff, 0xfa, 0x32, - 0xf8, 0xac, 0x5e, 0x06, 0xd3, 0x44, 0xbc, 0x33, 0x5d, 0x06, 0x7f, 0xa4, 0xe7, 0x5d, 0xae, 0xf0, - 0x51, 0x84, 0xf2, 0x97, 0x06, 0xb8, 0xcb, 0x0d, 0x7a, 0x93, 0x9b, 0x79, 0x3a, 0x37, 0x39, 0xf2, - 0xd4, 0x6e, 0x72, 0xb3, 0x1f, 0xf7, 0x26, 0x37, 0xf7, 0x34, 0x6f, 0x72, 0xe7, 0xfe, 0x2a, 0xde, - 0xe4, 0xce, 0xff, 0x9b, 0xb9, 0xc9, 0xfd, 0x0d, 0x28, 0xc4, 0x85, 0xcb, 0xd3, 0xc3, 0x18, 0x3f, - 0xb5, 0x18, 0x92, 0x4c, 0xf4, 0x8d, 0x0b, 0x77, 0xe4, 0x26, 0xc0, 0x86, 0xe7, 0x3c, 0xb6, 0x03, - 0xfa, 0x40, 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, 0x3d, + 0xba, 0xde, 0x8d, 0x9e, 0xe9, 0x7a, 0xa7, 0xdd, 0x54, 0xf3, 0xa7, 0xdd, 0x54, 0xff, 0xe6, 0x32, + 0xf8, 0xb4, 0x5e, 0x06, 0xd3, 0x44, 0xbc, 0x33, 0x5d, 0x06, 0x7f, 0xa4, 0xe7, 0x5d, 0xae, 0xf0, + 0x61, 0x84, 0xf2, 0x17, 0x07, 0xb8, 0xcb, 0x0d, 0x7a, 0x93, 0x9b, 0x79, 0x32, 0x37, 0x39, 0xf2, + 0xc4, 0x6e, 0x72, 0xb3, 0x1f, 0xf5, 0x26, 0x37, 0xf7, 0x24, 0x6f, 0x72, 0xe7, 0xfe, 0x3a, 0xde, + 0xe4, 0xce, 0xff, 0xeb, 0xb9, 0xc9, 0xfd, 0x2d, 0x28, 0xc4, 0x85, 0xcb, 0xd3, 0xc3, 0x18, 0x3f, + 0xb1, 0x18, 0x92, 0x4c, 0xf4, 0x8d, 0x0b, 0x77, 0xe4, 0x06, 0xc0, 0x86, 0xe7, 0x3c, 0xb2, 0x03, + 0x7a, 0x5f, 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, 0xa7, 0xff, 0x11, 0xf6, 0x5d, 0xed, 0xb6, 0x2a, 0x6d, 0xad, 0x63, 0x5f, 0xd7, 0xe7, 0x19, 0xf6, 0xab, 0x70, 0x2e, 0xd1, 0x15, - 0x78, 0x63, 0xad, 0xc8, 0x10, 0x78, 0x89, 0x3b, 0xeb, 0x7c, 0x7a, 0x25, 0x8f, 0x6e, 0x9b, 0x09, - 0x0a, 0xe3, 0xcf, 0x87, 0x12, 0xfc, 0xc5, 0x83, 0xac, 0xfa, 0xc4, 0x9a, 0x39, 0xdb, 0x13, 0x6b, + 0x78, 0x63, 0xad, 0xc8, 0x10, 0x78, 0x89, 0x3b, 0xeb, 0x7c, 0x7a, 0x25, 0x0f, 0x6f, 0x99, 0x09, + 0x0a, 0xe3, 0x2f, 0x86, 0x12, 0xfc, 0xc5, 0x83, 0xac, 0xfa, 0xc4, 0x9a, 0x39, 0xdb, 0x13, 0x6b, 0x76, 0xb0, 0x27, 0xd6, 0x98, 0x50, 0x91, 0x1b, 0x44, 0xa8, 0xf8, 0x22, 0x4c, 0x6e, 0x52, 0xbb, 0xe5, 0x6f, 0xba, 0x22, 0xff, 0x10, 0xf7, 0xb5, 0x90, 0x11, 0xee, 0x58, 0x99, 0xbc, 0x70, 0x85, 0x36, 0xa3, 0x01, 0x23, 0x60, 0xc7, 0x20, 0x4f, 0x48, 0x64, 0xea, 0x1c, 0xd4, 0x5b, 0xf4, 0x70, 0x9f, 0x5b, 0x74, 0x0d, 0x26, 0x04, 0x5d, 0x14, 0xbb, 0x39, 0xba, 0xee, 0xb1, 0x22, 0x84, 0xcb, 0xda, 0xc3, 0xb4, 0xd8, 0x61, 0xed, 0xfc, 0xa6, 0xa7, 0x31, 0x61, 0x5d, 0xb0, 0xdc, 0x6e, 0x74, - 0x5c, 0xa7, 0x8d, 0x5d, 0x30, 0x1a, 0x75, 0x01, 0x15, 0x60, 0xde, 0x05, 0x0a, 0x12, 0x79, 0x07, + 0x5c, 0xa7, 0x8d, 0x5d, 0x30, 0x1a, 0x75, 0x01, 0x15, 0x60, 0xde, 0x05, 0x0a, 0x12, 0x79, 0x1b, 0xa6, 0x4a, 0x1b, 0x55, 0x95, 0x2c, 0x1f, 0xbd, 0xf2, 0xda, 0x1d, 0xc7, 0xd2, 0x48, 0x63, 0xb8, - 0xfd, 0x6e, 0x3e, 0x63, 0x7f, 0x39, 0x37, 0x1f, 0xe3, 0x5f, 0x4e, 0xc8, 0xe5, 0xfd, 0xc9, 0x3e, + 0xfd, 0x6e, 0x3e, 0x63, 0x7f, 0x35, 0x37, 0x1f, 0xe3, 0x5f, 0x4c, 0xc8, 0xe5, 0xfd, 0xf1, 0x3e, 0x90, 0xe8, 0x4f, 0x1e, 0xb9, 0x33, 0x3e, 0x79, 0x0c, 0x9d, 0x26, 0x48, 0x6a, 0xf2, 0xed, 0xf0, - 0x99, 0xe4, 0xdb, 0x91, 0x8f, 0xfd, 0x7c, 0x31, 0x7a, 0x46, 0x89, 0x35, 0xb6, 0xd6, 0xf2, 0x83, - 0xac, 0xb5, 0x54, 0x29, 0x77, 0xec, 0xe3, 0x4b, 0xb9, 0x70, 0x66, 0x29, 0xb7, 0x16, 0xf9, 0x2e, - 0x8f, 0x9f, 0xea, 0x12, 0x72, 0x49, 0x68, 0x05, 0x66, 0xd2, 0xa3, 0xf0, 0x85, 0x5e, 0xcc, 0xdf, - 0x53, 0xa2, 0xf3, 0xd7, 0xd3, 0x45, 0xe7, 0xfe, 0xe7, 0xcd, 0x99, 0x84, 0xe7, 0x1f, 0x7d, 0xba, - 0xc2, 0xf3, 0xd3, 0x7d, 0x08, 0xf9, 0x6b, 0xf1, 0xf9, 0xaf, 0xc5, 0xe7, 0x01, 0xc5, 0x67, 0x0f, - 0x97, 0xd7, 0xb6, 0xed, 0xb5, 0x51, 0xed, 0x74, 0x13, 0x46, 0x65, 0x18, 0xd2, 0x4c, 0xa4, 0x51, + 0x99, 0xe4, 0xdb, 0x91, 0x8f, 0xfc, 0x7c, 0x31, 0x7a, 0x46, 0x89, 0x35, 0xb6, 0xd6, 0xf2, 0x83, + 0xac, 0xb5, 0x54, 0x29, 0x77, 0xec, 0xa3, 0x4b, 0xb9, 0x70, 0x66, 0x29, 0xb7, 0x16, 0xf9, 0x2e, + 0x8f, 0x9f, 0xea, 0x12, 0xf2, 0xbc, 0xd0, 0x0a, 0xcc, 0xa4, 0x47, 0xe1, 0x0b, 0xbd, 0x98, 0x3f, + 0x51, 0xa2, 0xf3, 0xd7, 0xd3, 0x45, 0xe7, 0xfe, 0xe7, 0xcd, 0x99, 0x84, 0xe7, 0x1f, 0x7d, 0xb2, + 0xc2, 0xf3, 0x93, 0x7d, 0x08, 0xf9, 0x1b, 0xf1, 0xf9, 0x6f, 0xc4, 0xe7, 0x01, 0xc5, 0x67, 0x0f, + 0x97, 0xd7, 0xb6, 0xed, 0xb5, 0x51, 0xed, 0x74, 0x03, 0x46, 0x65, 0x18, 0xd2, 0x4c, 0xa4, 0x51, 0x4e, 0xc6, 0x1f, 0x95, 0x58, 0x64, 0x11, 0xf2, 0x92, 0x58, 0x4d, 0x74, 0x73, 0x28, 0x60, 0x5a, 0x84, 0x47, 0x01, 0x33, 0xfe, 0x83, 0x21, 0xb9, 0x85, 0xb3, 0x39, 0xb3, 0x61, 0x7b, 0x76, 0x0b, - 0x33, 0xa8, 0x85, 0x2b, 0x4c, 0x11, 0xde, 0x63, 0x8b, 0x32, 0x66, 0xda, 0xaf, 0x93, 0x7c, 0xa4, - 0xc0, 0xb0, 0x51, 0x92, 0xda, 0xdc, 0x00, 0x49, 0x6a, 0xdf, 0xd2, 0x32, 0xbc, 0x0e, 0x45, 0x29, - 0x05, 0xd9, 0xb6, 0xd6, 0x3f, 0xb7, 0xeb, 0x1d, 0x35, 0x15, 0xeb, 0x70, 0x14, 0xd5, 0x0b, 0x29, - 0xfb, 0x24, 0x61, 0x0d, 0x6f, 0x23, 0x23, 0x67, 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, 0x7b, 0x58, 0x71, 0xec, 0xbd, 0xb6, + 0x33, 0xa8, 0x85, 0x2b, 0x4c, 0x11, 0xde, 0x63, 0x8b, 0x32, 0x66, 0xda, 0xaf, 0x93, 0x7c, 0xa8, + 0xc0, 0xb0, 0x51, 0x92, 0xda, 0xdc, 0x00, 0x49, 0x6a, 0xdf, 0xd4, 0x32, 0xbc, 0x0e, 0x45, 0x29, + 0x05, 0xd9, 0xb6, 0xd6, 0x3f, 0xb7, 0xeb, 0x6d, 0x35, 0x15, 0xeb, 0x70, 0x14, 0xd5, 0x0b, 0x29, + 0xfb, 0x24, 0x61, 0x0d, 0x6f, 0x23, 0x23, 0x67, 0x09, 0xb9, 0x3c, 0xfa, 0xaf, 0x35, 0xe4, 0xf2, + 0x32, 0x80, 0x38, 0x6a, 0x23, 0xf3, 0x84, 0x97, 0x71, 0xf5, 0x0b, 0x33, 0xe5, 0x20, 0x68, 0xf6, + 0xc8, 0xc9, 0xa1, 0x10, 0x1a, 0x7f, 0x40, 0x60, 0xa6, 0x56, 0x7b, 0x50, 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, 0x17, 0xb4, 0xc0, 0xcd, 0x51, 0x31, 0x3f, 0xec, 0x84, 0x30, 0x82, 0xdb, 0x66, 0x07, 0xe1, 0xaa, 0x45, 0x5c, 0x62, 0x0d, 0x1c, 0xc1, 0x39, 0xcd, - 0xe7, 0x79, 0xd0, 0xc7, 0x94, 0xd7, 0x84, 0x74, 0x6d, 0x60, 0x88, 0x8d, 0x94, 0x17, 0x15, 0x35, - 0x25, 0x5a, 0x6a, 0x0d, 0xec, 0x3c, 0xbb, 0x94, 0x5a, 0x12, 0xae, 0xee, 0x71, 0x2d, 0x78, 0xb6, - 0xb2, 0x69, 0xf0, 0xe4, 0x6f, 0xbd, 0xaa, 0xb6, 0x52, 0xb6, 0x82, 0xfe, 0x35, 0x91, 0xdf, 0xc8, - 0xc0, 0x05, 0x0d, 0x23, 0xdc, 0xae, 0xfc, 0x30, 0x1c, 0x48, 0xea, 0xbc, 0xfe, 0xf0, 0xe9, 0xcc, - 0xeb, 0x97, 0xf4, 0x6f, 0x89, 0x36, 0x54, 0xf5, 0x1b, 0x7a, 0xb5, 0x90, 0x3c, 0x86, 0x19, 0x2c, - 0x92, 0x0f, 0x3b, 0x6c, 0xce, 0x8a, 0xf7, 0xa0, 0xb9, 0xa8, 0xd9, 0xdc, 0x8f, 0x1f, 0x13, 0x78, - 0x2f, 0x7e, 0xe7, 0xb8, 0x38, 0xa9, 0xa1, 0xcb, 0x70, 0xd4, 0x56, 0xf4, 0x3a, 0xe4, 0xb4, 0x77, - 0x5d, 0x55, 0x50, 0x4a, 0x54, 0x41, 0xfe, 0xab, 0x0c, 0x7f, 0x4e, 0xe0, 0x9f, 0x71, 0xd7, 0x73, - 0x5b, 0x61, 0xb9, 0x34, 0xad, 0xec, 0xd1, 0x6d, 0xcd, 0xa7, 0xd3, 0x6d, 0xaf, 0x60, 0x93, 0xf9, - 0x9e, 0x60, 0xed, 0x7a, 0x6e, 0x2b, 0x6a, 0xbe, 0xda, 0x71, 0x3d, 0x1b, 0x49, 0x7e, 0x20, 0x03, - 0x17, 0x35, 0xad, 0xa6, 0x9a, 0x1b, 0x44, 0x44, 0x4b, 0x98, 0x0d, 0xe3, 0xa8, 0x44, 0x45, 0x4b, - 0x37, 0xc4, 0xfc, 0xbf, 0x8a, 0x2d, 0x50, 0xc2, 0x76, 0x32, 0x24, 0xab, 0xc5, 0xb1, 0x94, 0x26, - 0xf4, 0xae, 0x85, 0x38, 0x30, 0x83, 0x56, 0x36, 0x9a, 0x09, 0xf0, 0x5c, 0x6f, 0x13, 0xe0, 0x30, - 0xeb, 0x0f, 0x66, 0x04, 0xe8, 0x6d, 0x07, 0x9c, 0xe4, 0x4a, 0xfe, 0x26, 0x5c, 0x4c, 0x00, 0xc3, - 0xd5, 0x76, 0xae, 0xe7, 0x6a, 0xfb, 0xd4, 0xc9, 0x71, 0xf1, 0xd5, 0xb4, 0xda, 0xd2, 0x56, 0x5a, + 0xe7, 0x79, 0xd0, 0xc7, 0x94, 0x57, 0x85, 0x74, 0x6d, 0x60, 0x88, 0x8d, 0x94, 0x17, 0x15, 0x35, + 0x25, 0x5a, 0x6a, 0x0d, 0xec, 0x3c, 0x7b, 0x3e, 0xb5, 0x24, 0x5c, 0xdd, 0xe3, 0x5a, 0xf0, 0x6c, + 0x65, 0xd3, 0xe0, 0xc9, 0xdf, 0x7a, 0x55, 0x6d, 0xa5, 0x6c, 0x05, 0xfd, 0x6b, 0x22, 0xbf, 0x99, + 0x81, 0x0b, 0x1a, 0x46, 0xb8, 0x5d, 0xf9, 0x61, 0x38, 0x90, 0xd4, 0x79, 0xfd, 0xc1, 0x93, 0x99, + 0xd7, 0x2f, 0xea, 0xdf, 0x12, 0x6d, 0xa8, 0xea, 0x37, 0xf4, 0x6a, 0x21, 0x79, 0x04, 0x33, 0x58, + 0x24, 0x1f, 0x76, 0xd8, 0x9c, 0x15, 0xef, 0x41, 0x73, 0x51, 0xb3, 0xb9, 0x1f, 0x3f, 0x26, 0xf0, + 0x5e, 0xfc, 0xce, 0x71, 0x71, 0x52, 0x43, 0x97, 0xe1, 0xa8, 0xad, 0xe8, 0x75, 0xc8, 0x69, 0xef, + 0xba, 0xaa, 0xa0, 0x94, 0xa8, 0x82, 0xfc, 0xd7, 0x19, 0xfe, 0x9c, 0xc0, 0x3f, 0xe3, 0x8e, 0xe7, + 0xb6, 0xc2, 0x72, 0x69, 0x5a, 0xd9, 0xa3, 0xdb, 0x9a, 0x4f, 0xa6, 0xdb, 0x5e, 0xc6, 0x26, 0xf3, + 0x3d, 0xc1, 0xda, 0xf5, 0xdc, 0x56, 0xd4, 0x7c, 0xb5, 0xe3, 0x7a, 0x36, 0x92, 0x7c, 0x7f, 0x06, + 0x2e, 0x6a, 0x5a, 0x4d, 0x35, 0x37, 0x88, 0x88, 0x96, 0x30, 0x1b, 0xc6, 0x51, 0x89, 0x8a, 0x96, + 0xae, 0x8b, 0xf9, 0x7f, 0x05, 0x5b, 0xa0, 0x84, 0xed, 0x64, 0x48, 0x56, 0x8b, 0x63, 0x29, 0x4d, + 0xe8, 0x5d, 0x0b, 0x71, 0x60, 0x06, 0xad, 0x6c, 0x34, 0x13, 0xe0, 0xb9, 0xde, 0x26, 0xc0, 0x61, + 0xd6, 0x1f, 0xcc, 0x08, 0xd0, 0xdb, 0x0e, 0x38, 0xc9, 0x95, 0x7c, 0x2f, 0x5c, 0x4c, 0x00, 0xc3, + 0xd5, 0x76, 0xae, 0xe7, 0x6a, 0xfb, 0xd4, 0xc9, 0x71, 0xf1, 0x95, 0xb4, 0xda, 0xd2, 0x56, 0x5a, 0xef, 0x1a, 0x88, 0x0d, 0x10, 0x15, 0x0a, 0xf1, 0x23, 0x7d, 0x82, 0x7e, 0x4a, 0xcc, 0x0f, 0x05, 0x9f, 0xed, 0xe5, 0x4a, 0x1b, 0xd4, 0x23, 0x2f, 0x42, 0x22, 0x14, 0x26, 0x94, 0x6c, 0x08, 0x47, 0xc2, 0xd8, 0xa3, 0x47, 0x25, 0xdf, 0x39, 0x2e, 0x6a, 0xd8, 0xec, 0x42, 0xa4, 0xa6, 0x59, 0xd0, - 0xa4, 0x3d, 0x15, 0x91, 0xfc, 0x5a, 0x06, 0xe6, 0x18, 0x20, 0x9a, 0x54, 0xe2, 0xa3, 0xe6, 0xfb, - 0xcd, 0xfa, 0xfd, 0xa7, 0x33, 0xeb, 0x5f, 0xc4, 0x36, 0xaa, 0xb3, 0x3e, 0xd1, 0x25, 0xa9, 0x8d, + 0xa4, 0x3d, 0x15, 0x91, 0xfc, 0x7a, 0x06, 0xe6, 0x18, 0x20, 0x9a, 0x54, 0xe2, 0xa3, 0xe6, 0xfb, + 0xcd, 0xfa, 0xfd, 0x27, 0x33, 0xeb, 0x5f, 0xc0, 0x36, 0xaa, 0xb3, 0x3e, 0xd1, 0x25, 0xa9, 0x8d, 0xc3, 0xd9, 0xae, 0x19, 0x74, 0x69, 0xb3, 0xfd, 0xe2, 0x00, 0xb3, 0x9d, 0x0f, 0xc0, 0xe9, 0xb3, - 0xbd, 0x67, 0x2d, 0x64, 0x13, 0x26, 0xc4, 0x5d, 0x88, 0x77, 0xd8, 0x65, 0x2d, 0x8c, 0xb3, 0x5a, + 0xbd, 0x67, 0x2d, 0x64, 0x13, 0x26, 0xc4, 0x5d, 0x88, 0x77, 0xd8, 0x25, 0x2d, 0x8c, 0xb3, 0x5a, 0xc4, 0x2f, 0xa8, 0x22, 0x59, 0x44, 0xe2, 0x0b, 0x35, 0x2e, 0xa4, 0x0d, 0xb3, 0xfc, 0xb7, 0xae, - 0x9b, 0x2a, 0xf6, 0xd4, 0x4d, 0x5d, 0x13, 0x5f, 0x74, 0x45, 0xf0, 0x8f, 0xa9, 0xa8, 0xd4, 0xf0, - 0x4b, 0x29, 0x8c, 0x49, 0x07, 0x88, 0x06, 0xe6, 0x8b, 0xf6, 0x4a, 0x7f, 0x8d, 0xd4, 0xab, 0xa2, + 0x9b, 0x2a, 0xf6, 0xd4, 0x4d, 0x5d, 0x15, 0x5f, 0x74, 0x59, 0xf0, 0x8f, 0xa9, 0xa8, 0xd4, 0xf0, + 0x4b, 0x29, 0x8c, 0x49, 0x07, 0x88, 0x06, 0xe6, 0x8b, 0xf6, 0x72, 0x7f, 0x8d, 0xd4, 0x2b, 0xa2, 0xce, 0x62, 0xbc, 0xce, 0xf8, 0xca, 0x4d, 0xe1, 0x4d, 0x6c, 0x98, 0x16, 0x50, 0xf7, 0x80, 0xf2, - 0x1d, 0xfe, 0x45, 0x2d, 0x00, 0x56, 0xac, 0x94, 0x5f, 0xa2, 0x64, 0x4d, 0x18, 0xa0, 0x2c, 0xb6, - 0xa1, 0xc7, 0xf9, 0x91, 0x87, 0x30, 0x53, 0xea, 0x74, 0x9a, 0x0e, 0x6d, 0xe0, 0x57, 0x9a, 0x5d, + 0x1d, 0xfe, 0x05, 0x2d, 0x00, 0x56, 0xac, 0x94, 0x5f, 0xa2, 0x64, 0x4d, 0x18, 0xa0, 0x2c, 0xb6, + 0xa1, 0xc7, 0xf9, 0x91, 0x07, 0x30, 0x53, 0xea, 0x74, 0x9a, 0x0e, 0x6d, 0xe0, 0x57, 0x9a, 0x5d, 0xf6, 0x4d, 0x46, 0x94, 0x6f, 0xcd, 0xe6, 0x85, 0xe2, 0x66, 0xe7, 0x75, 0x63, 0xdb, 0x4d, 0x82, - 0xd6, 0xf8, 0x91, 0x4c, 0xa2, 0xd1, 0xe4, 0x75, 0x18, 0xc3, 0x1f, 0x4a, 0x4c, 0x15, 0x54, 0xf1, + 0xd6, 0xf8, 0x91, 0x4c, 0xa2, 0xd1, 0xe4, 0x35, 0x18, 0xc3, 0x1f, 0x4a, 0x4c, 0x15, 0x54, 0xf1, 0xf0, 0x26, 0xa2, 0xf2, 0x28, 0x42, 0x60, 0xc2, 0x92, 0x1a, 0x57, 0x31, 0xc7, 0x85, 0x25, 0xa1, 0x57, 0x88, 0x34, 0x09, 0x45, 0xe9, 0x9a, 0x91, 0x8b, 0x84, 0x2e, 0x74, 0xcd, 0x10, 0x0e, 0x19, - 0xc6, 0x0f, 0x64, 0xf5, 0x69, 0x47, 0xae, 0x29, 0x72, 0xbb, 0x12, 0xd9, 0x51, 0xca, 0xed, 0x8a, - 0xb4, 0xfe, 0x0f, 0x33, 0x30, 0xfb, 0xd0, 0xdb, 0xb3, 0xdb, 0xce, 0x37, 0x79, 0x18, 0x6d, 0x17, - 0xc7, 0xa5, 0x7f, 0xea, 0xca, 0xa7, 0x95, 0x82, 0xcf, 0x55, 0x2a, 0x66, 0x33, 0x05, 0xa7, 0x8c, + 0xc6, 0xf7, 0x67, 0xf5, 0x69, 0x47, 0xae, 0x2a, 0x72, 0xbb, 0x12, 0xd9, 0x51, 0xca, 0xed, 0x8a, + 0xb4, 0xfe, 0x0f, 0x33, 0x30, 0xfb, 0xc0, 0xdb, 0xb3, 0xdb, 0xce, 0x37, 0x79, 0x18, 0x6d, 0x17, + 0xc7, 0xa5, 0x7f, 0xea, 0xca, 0x27, 0x95, 0x82, 0xcf, 0x55, 0x2a, 0x66, 0x33, 0x05, 0xa7, 0x8c, 0x99, 0xd6, 0x1e, 0x74, 0x76, 0xc3, 0x86, 0x29, 0x99, 0x10, 0x39, 0x3a, 0x87, 0x1b, 0x3f, 0x91, 0x85, 0x71, 0x65, 0x09, 0x90, 0xcf, 0xc0, 0x84, 0xca, 0x47, 0x55, 0xf8, 0xa9, 0xd5, 0x9a, 0x1a, 0x16, 0x6a, 0xfc, 0xa8, 0xdd, 0xd2, 0x34, 0x7e, 0x6c, 0xa2, 0x23, 0xf4, 0x8c, 0x57, 0x9b, 0xf7, - 0x53, 0xae, 0x36, 0x38, 0x6d, 0x15, 0x8d, 0x4d, 0xdf, 0x0b, 0xce, 0x3b, 0xc9, 0x0b, 0x0e, 0x2a, - 0x8f, 0x14, 0xfa, 0xde, 0xd7, 0x1c, 0xe3, 0xa7, 0x33, 0x50, 0x88, 0x2f, 0xd2, 0x4f, 0xa4, 0x57, - 0xce, 0xf0, 0xba, 0xf3, 0xe3, 0xd9, 0x30, 0x15, 0x8a, 0x74, 0xe1, 0x7d, 0x56, 0xcd, 0x04, 0xdf, - 0xd5, 0x1e, 0x5e, 0x9e, 0xd7, 0xa3, 0xd1, 0xa9, 0xc1, 0x2f, 0xd2, 0x43, 0x50, 0x0e, 0x7d, 0xfb, - 0x17, 0x8b, 0xcf, 0x19, 0x1f, 0xc0, 0x5c, 0xbc, 0x3b, 0xf0, 0xf1, 0xa5, 0x04, 0xd3, 0x3a, 0x3c, - 0x9e, 0x48, 0x29, 0x4e, 0x65, 0xc6, 0xf1, 0x8d, 0x3f, 0xcc, 0xc6, 0x79, 0x0b, 0x93, 0x41, 0xb6, + 0x52, 0xae, 0x36, 0x38, 0x6d, 0x15, 0x8d, 0x4d, 0xdf, 0x0b, 0xce, 0xdb, 0xc9, 0x0b, 0x0e, 0x2a, + 0x8f, 0x14, 0xfa, 0xde, 0xd7, 0x1c, 0xe3, 0xa7, 0x33, 0x50, 0x88, 0x2f, 0xd2, 0x8f, 0xa5, 0x57, + 0xce, 0xf0, 0xba, 0xf3, 0xe3, 0xd9, 0x30, 0x15, 0x8a, 0x74, 0xe1, 0x7d, 0x5a, 0xcd, 0x04, 0xdf, + 0xd1, 0x1e, 0x5e, 0x9e, 0xd5, 0xa3, 0xd1, 0xa9, 0xc1, 0x2f, 0xd2, 0x43, 0x50, 0x0e, 0x7d, 0xfb, + 0x17, 0x8b, 0xcf, 0x18, 0xef, 0xc3, 0x5c, 0xbc, 0x3b, 0xf0, 0xf1, 0xa5, 0x04, 0xd3, 0x3a, 0x3c, + 0x9e, 0x48, 0x29, 0x4e, 0x65, 0xc6, 0xf1, 0x8d, 0x3f, 0xca, 0xc6, 0x79, 0x0b, 0x93, 0x41, 0xb6, 0xe9, 0xa8, 0x86, 0x30, 0x62, 0xd3, 0xe1, 0x20, 0x53, 0x96, 0x9d, 0x25, 0x81, 0x59, 0xe8, 0x88, - 0x9a, 0x4b, 0x77, 0x44, 0x25, 0x77, 0x62, 0x56, 0xd2, 0x4a, 0xd4, 0xa4, 0x43, 0xba, 0x63, 0x45, + 0x9a, 0x4b, 0x77, 0x44, 0x25, 0xb7, 0x63, 0x56, 0xd2, 0x4a, 0xd4, 0xa4, 0x43, 0xba, 0x63, 0x45, 0x96, 0xd2, 0x31, 0xe3, 0xe8, 0x32, 0xcc, 0x69, 0x21, 0xc0, 0x25, 0xfd, 0x70, 0xa4, 0x6b, 0x0f, 0xb0, 0x80, 0x13, 0xa7, 0x22, 0x93, 0x15, 0x18, 0x65, 0xcd, 0x5c, 0xb3, 0x3b, 0xe2, 0x4d, 0x85, 0x84, 0x6e, 0xe9, 0xcd, 0xf0, 0xc2, 0xa7, 0x78, 0xa6, 0x37, 0x29, 0x3b, 0xf2, 0xd5, 0x89, 0x25, - 0x10, 0x8d, 0x7f, 0x91, 0x61, 0xeb, 0xbf, 0x7e, 0xf0, 0x3d, 0x96, 0x05, 0x8d, 0x7d, 0x52, 0x1f, - 0x8b, 0xd6, 0x3f, 0xc9, 0xf2, 0x5c, 0x38, 0x62, 0xfa, 0xbc, 0x05, 0x23, 0x9b, 0xb6, 0xb7, 0x27, - 0xb2, 0x46, 0xeb, 0x5c, 0x78, 0x41, 0x14, 0xd3, 0x29, 0xc0, 0xdf, 0xa6, 0x20, 0x50, 0x75, 0x61, - 0xd9, 0x81, 0x74, 0x61, 0x8a, 0x5e, 0x3e, 0xf7, 0xd4, 0xf4, 0xf2, 0xdf, 0x17, 0xa6, 0xbd, 0x29, - 0x05, 0x03, 0x44, 0x98, 0xbe, 0x12, 0x4f, 0x1b, 0x95, 0x88, 0x05, 0x1e, 0xb1, 0x23, 0x77, 0xd4, - 0x44, 0x54, 0x8a, 0x6f, 0xe7, 0x29, 0x29, 0xa7, 0x8c, 0x3f, 0xc9, 0xf1, 0x3e, 0x16, 0x1d, 0x75, - 0x55, 0xf3, 0xfb, 0xc6, 0x75, 0xc2, 0x36, 0x7a, 0x35, 0x04, 0x07, 0x9a, 0x4d, 0x5d, 0x85, 0x21, - 0x36, 0x37, 0x45, 0x6f, 0x22, 0x1e, 0x9b, 0xbf, 0x2a, 0x1e, 0x2b, 0x67, 0x6b, 0x19, 0xcf, 0x24, - 0x35, 0xc3, 0x20, 0x1e, 0x5b, 0xea, 0x5a, 0x46, 0x0c, 0x72, 0x0d, 0x86, 0xd6, 0xdd, 0x86, 0x8c, - 0x64, 0x3e, 0x87, 0xd1, 0x3f, 0xb4, 0x14, 0xa6, 0xf3, 0x19, 0x13, 0x31, 0xd8, 0xb7, 0x86, 0xf9, - 0x1f, 0xd4, 0x6f, 0x6d, 0xed, 0xda, 0xc9, 0xcc, 0x71, 0x4a, 0xd2, 0x99, 0x65, 0x98, 0xd2, 0x53, - 0xd5, 0x0b, 0x7b, 0x5f, 0xd4, 0xae, 0xc7, 0x32, 0xde, 0xab, 0xcf, 0x22, 0x3a, 0x11, 0x59, 0x82, - 0x49, 0x2d, 0x82, 0xaa, 0x78, 0xdc, 0x44, 0xf5, 0xa6, 0x1e, 0x7f, 0x55, 0x55, 0x6f, 0x6a, 0x24, - 0xec, 0x3c, 0x17, 0xed, 0x57, 0x9e, 0x38, 0x13, 0x6d, 0x17, 0x38, 0xe4, 0x36, 0xe4, 0x79, 0x98, - 0x8d, 0x6a, 0x45, 0x7d, 0xa6, 0xf2, 0x11, 0x16, 0x0b, 0x53, 0x23, 0x11, 0x95, 0xb0, 0x0a, 0x9f, - 0x86, 0x82, 0xd8, 0x92, 0xa2, 0xe4, 0xe7, 0x2f, 0xc0, 0x50, 0xb9, 0x5a, 0x31, 0xd5, 0x6d, 0xa4, - 0xee, 0x34, 0x3c, 0x13, 0xa1, 0xe8, 0x55, 0xb7, 0x4e, 0x83, 0x43, 0xd7, 0x3b, 0x30, 0xa9, 0x1f, - 0x78, 0x0e, 0x4f, 0x50, 0x89, 0x0b, 0xf1, 0x33, 0xe4, 0x1d, 0x18, 0x46, 0xc3, 0xd3, 0xd8, 0xc9, - 0x10, 0xaf, 0x63, 0x69, 0x52, 0x4c, 0xe0, 0x61, 0xb4, 0x62, 0x35, 0x39, 0x11, 0x79, 0x0b, 0x86, - 0x2a, 0xb4, 0x7d, 0x14, 0xcb, 0x9d, 0x97, 0x20, 0x0e, 0x37, 0x84, 0x06, 0x6d, 0x1f, 0x99, 0x48, - 0x62, 0xfc, 0x74, 0x16, 0xce, 0xa5, 0x34, 0xeb, 0xd1, 0x67, 0x9e, 0xd1, 0x5d, 0x71, 0x49, 0xdb, - 0x15, 0xe5, 0xfb, 0x74, 0xcf, 0x8e, 0x4f, 0xdd, 0x24, 0x7f, 0x3e, 0x03, 0x17, 0xf4, 0x09, 0x2a, - 0x2c, 0xcd, 0x1f, 0xdd, 0x26, 0x6f, 0xc3, 0xc8, 0x0a, 0xb5, 0x1b, 0x54, 0xe6, 0xd5, 0x3a, 0x17, - 0x06, 0xc4, 0xe3, 0x31, 0x04, 0x78, 0x21, 0x67, 0x1b, 0x79, 0x9c, 0x72, 0x28, 0xa9, 0x88, 0xc6, - 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, 0x0f, 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, 0x00, 0x73, - 0xfa, 0xb7, 0x89, 0xf0, 0xb9, 0x51, 0xd4, 0x9a, 0x4c, 0xef, 0xa8, 0x35, 0x7d, 0x83, 0x74, 0x1a, - 0x3f, 0x91, 0x81, 0x82, 0xce, 0xfb, 0xe3, 0x8e, 0xe7, 0xbb, 0xda, 0x78, 0x3e, 0x9f, 0x3e, 0x9e, - 0xbd, 0x07, 0xf2, 0xff, 0xca, 0xc4, 0x3f, 0x76, 0xa0, 0x11, 0x34, 0x60, 0xa4, 0xe2, 0xb6, 0x6c, - 0xa7, 0xad, 0xe6, 0xd2, 0x6f, 0x20, 0xc4, 0x14, 0x25, 0x83, 0x05, 0xf9, 0xb9, 0x02, 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, 0x37, 0x69, 0x4c, 0xd2, 0x60, 0x3d, 0xd4, 0xec, - 0xe2, 0xc6, 0xc2, 0x9f, 0x2e, 0x11, 0xd1, 0xf2, 0x9d, 0x6f, 0xaa, 0xfb, 0xad, 0x42, 0x8f, 0xeb, - 0x4a, 0xc4, 0x41, 0x8b, 0x8d, 0xc3, 0xad, 0x4f, 0x62, 0x5d, 0xa5, 0x56, 0x85, 0x3d, 0x7c, 0x2b, - 0x75, 0x38, 0xfe, 0x20, 0x03, 0xcf, 0xf7, 0xa1, 0x79, 0x0a, 0xa3, 0xf2, 0x97, 0xdd, 0xe1, 0x14, - 0x20, 0x22, 0xc2, 0xd4, 0xc4, 0x4e, 0x23, 0xe0, 0xb9, 0xf2, 0x26, 0x45, 0x6a, 0x62, 0x06, 0xd0, - 0x52, 0x13, 0x33, 0x00, 0x3b, 0x4b, 0x57, 0xa8, 0xb3, 0xb7, 0xcf, 0xcd, 0xb3, 0x26, 0xf9, 0xde, - 0xb0, 0x8f, 0x10, 0xf5, 0x2c, 0xe5, 0x38, 0xc6, 0xbf, 0x1a, 0x86, 0x8b, 0x26, 0xdd, 0x73, 0xd8, - 0xbd, 0x64, 0xcb, 0x77, 0xda, 0x7b, 0x5a, 0xdc, 0x1b, 0x23, 0xb6, 0x72, 0x45, 0x92, 0x08, 0x06, - 0x09, 0x67, 0xe2, 0x75, 0xc8, 0x33, 0x31, 0x44, 0x59, 0xbc, 0xf8, 0x68, 0xc5, 0x84, 0x15, 0x11, - 0x58, 0x59, 0x16, 0x93, 0xd7, 0x84, 0x98, 0xa4, 0xa4, 0xf1, 0x61, 0x62, 0xd2, 0x77, 0x8f, 0x8b, - 0x50, 0x3b, 0xf2, 0x03, 0x8a, 0x57, 0x64, 0x21, 0x2a, 0x85, 0x77, 0x99, 0xa1, 0x1e, 0x77, 0x99, - 0x35, 0x98, 0x2b, 0x35, 0xf8, 0xe9, 0x68, 0x37, 0x37, 0x3c, 0xa7, 0x5d, 0x77, 0x3a, 0x76, 0x53, - 0xde, 0xcf, 0xb1, 0x97, 0xed, 0xb0, 0xdc, 0xea, 0x84, 0x08, 0x66, 0x2a, 0x19, 0xfb, 0x8c, 0xca, - 0x7a, 0x0d, 0xc3, 0xc3, 0x88, 0xf7, 0x48, 0xfc, 0x8c, 0x46, 0xdb, 0xc7, 0xaf, 0xf0, 0xcd, 0xb0, - 0x18, 0x6f, 0x51, 0xf8, 0x20, 0xbf, 0xb9, 0x5a, 0x8b, 0x5c, 0x9a, 0x79, 0x96, 0x01, 0xfe, 0xb0, - 0x1f, 0x34, 0x7d, 0x34, 0x85, 0xd4, 0xf0, 0x22, 0xba, 0x5a, 0x6d, 0x85, 0xd1, 0xe5, 0x13, 0x74, - 0xbe, 0xbf, 0xaf, 0xd2, 0x71, 0x3c, 0x72, 0x93, 0x4d, 0x85, 0x96, 0x1b, 0x50, 0x9c, 0xc2, 0x63, - 0xd1, 0x9d, 0xcb, 0x43, 0x28, 0xbf, 0x73, 0x29, 0x28, 0xe4, 0x1d, 0x98, 0x5d, 0x2e, 0x2f, 0x4a, - 0x2d, 0x72, 0xc5, 0xad, 0x77, 0xf1, 0x21, 0x1e, 0xb0, 0x3e, 0x1c, 0x43, 0x5a, 0x5f, 0x64, 0xbb, - 0x49, 0x1a, 0x1a, 0xb9, 0x0a, 0xa3, 0xd5, 0x0a, 0xef, 0xfb, 0x71, 0x35, 0x95, 0x96, 0xb0, 0x8c, - 0x92, 0x85, 0xe4, 0x61, 0x74, 0x29, 0x98, 0x38, 0x55, 0x7a, 0xbf, 0x38, 0xc0, 0x85, 0xe0, 0x2d, - 0x98, 0x5c, 0x72, 0x83, 0x6a, 0xdb, 0x0f, 0xec, 0x76, 0x9d, 0x56, 0x2b, 0x6a, 0x5c, 0xeb, 0x1d, - 0x37, 0xb0, 0x1c, 0x51, 0xc2, 0x5a, 0xae, 0x63, 0x92, 0xcf, 0x21, 0xe9, 0x3d, 0xda, 0xa6, 0x5e, - 0x14, 0xcf, 0x7a, 0x98, 0xf7, 0x2d, 0x23, 0xdd, 0x0b, 0x4b, 0x4c, 0x1d, 0x51, 0xa4, 0xf9, 0xe2, - 0xc9, 0x39, 0xcb, 0x6e, 0x83, 0xfa, 0x7c, 0xb7, 0xf8, 0x1e, 0x4a, 0xf3, 0xa5, 0x7c, 0x5b, 0x9f, - 0x1d, 0xf4, 0xdf, 0xc1, 0x34, 0x5f, 0x09, 0x5c, 0xf2, 0x39, 0x18, 0xc6, 0x9f, 0x42, 0xba, 0x9d, - 0x4d, 0x61, 0x1b, 0x49, 0xb6, 0x75, 0x86, 0x69, 0x72, 0x02, 0x52, 0x85, 0x51, 0x71, 0xb1, 0x3a, - 0x4b, 0xb2, 0x1a, 0x71, 0x43, 0xe3, 0x33, 0x43, 0xd0, 0x1b, 0x0d, 0x98, 0x50, 0x2b, 0x64, 0x2b, - 0x62, 0xc5, 0xf6, 0xf7, 0x69, 0x83, 0xfd, 0x12, 0x79, 0xe6, 0x70, 0x45, 0xec, 0x23, 0xd4, 0x62, - 0xed, 0x30, 0x15, 0x14, 0x76, 0xa6, 0x56, 0xfd, 0x2d, 0x5f, 0x34, 0x45, 0xa8, 0x5a, 0x1c, 0x54, - 0xdb, 0x35, 0x4c, 0x51, 0x64, 0x7c, 0x1f, 0xcc, 0xad, 0x77, 0x9b, 0x4d, 0x7b, 0xa7, 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, 0xfd, 0x20, 0x4c, 0x0c, 0x7f, 0x55, 0x9b, 0x6b, 0x38, 0x61, 0x63, 0xd3, 0x88, - 0xcf, 0xba, 0xfb, 0xb2, 0x11, 0xba, 0xc0, 0x92, 0xd6, 0xe0, 0xd3, 0x1a, 0x43, 0xde, 0x81, 0x71, - 0x71, 0x3c, 0x2a, 0x01, 0x26, 0x31, 0x8a, 0x97, 0xb8, 0xee, 0xc5, 0xad, 0x51, 0x54, 0x74, 0x94, - 0xc5, 0xf4, 0x4f, 0xf9, 0xb8, 0x32, 0x40, 0xba, 0x2c, 0xa6, 0xd7, 0xd1, 0x67, 0xea, 0xfe, 0xd6, - 0x78, 0xbc, 0x6f, 0xc5, 0xdc, 0xbd, 0xa3, 0x86, 0x94, 0xcb, 0x44, 0x37, 0xe3, 0x28, 0xa4, 0x9c, - 0x7a, 0x33, 0x0e, 0x51, 0xc3, 0x31, 0xc9, 0x9e, 0x32, 0x26, 0xef, 0xc9, 0x31, 0xc9, 0xf5, 0x9e, - 0x18, 0xb3, 0x7d, 0xc6, 0xa1, 0x16, 0xad, 0x90, 0xa1, 0x81, 0xd4, 0x2a, 0xcf, 0x61, 0xec, 0x7c, - 0x4e, 0x12, 0xdf, 0x45, 0x05, 0x27, 0x55, 0x57, 0x33, 0x3c, 0x38, 0xd3, 0x53, 0xb6, 0xe6, 0xcf, - 0xc3, 0x44, 0x29, 0x08, 0xec, 0xfa, 0x3e, 0x6d, 0x54, 0xd8, 0xf6, 0xa4, 0x44, 0xbf, 0xb2, 0x05, - 0x5c, 0x7d, 0x34, 0x53, 0x71, 0x79, 0x34, 0x57, 0xdb, 0x17, 0xc6, 0xac, 0x61, 0x34, 0x57, 0x06, - 0xd1, 0xa3, 0xb9, 0x32, 0x08, 0xb9, 0x09, 0xa3, 0xd5, 0xf6, 0x63, 0x87, 0xf5, 0x09, 0x0f, 0x80, - 0x85, 0xba, 0x29, 0x87, 0x83, 0xd4, 0xcd, 0x55, 0x60, 0x91, 0xb7, 0x94, 0x4b, 0xcd, 0x58, 0xa4, - 0xc0, 0xe0, 0x2a, 0xaf, 0x30, 0xc2, 0x8d, 0x7a, 0x61, 0x09, 0x6f, 0x39, 0x77, 0x60, 0x54, 0x6a, - 0x32, 0x21, 0x52, 0x5a, 0x08, 0xca, 0x64, 0xc0, 0x08, 0x89, 0x8c, 0x49, 0xbe, 0x95, 0x7c, 0x79, - 0xe3, 0x4a, 0x92, 0x6f, 0x25, 0x5f, 0x9e, 0x96, 0xe4, 0x5b, 0xc9, 0x9c, 0x17, 0x2a, 0x81, 0x26, - 0x4e, 0x55, 0x02, 0x3d, 0x82, 0x89, 0x0d, 0xdb, 0x0b, 0x1c, 0x26, 0xa3, 0xb4, 0x03, 0x7f, 0x7e, - 0x52, 0xd3, 0x9b, 0x2a, 0x45, 0x4b, 0x97, 0x65, 0x5e, 0xea, 0x8e, 0x82, 0xaf, 0x27, 0x50, 0x8e, - 0xe0, 0xe9, 0xa6, 0xac, 0x53, 0x1f, 0xc7, 0x94, 0x15, 0x3b, 0x15, 0x75, 0x65, 0xd3, 0x91, 0x46, - 0x06, 0x2f, 0x2d, 0x31, 0x85, 0x59, 0x88, 0x48, 0xbe, 0x02, 0x13, 0xec, 0xef, 0x0d, 0xb7, 0xe9, - 0xd4, 0x1d, 0xea, 0xcf, 0x17, 0xf0, 0xe3, 0x2e, 0xa7, 0xae, 0x7e, 0x44, 0x3a, 0xaa, 0xd1, 0x80, - 0x2f, 0x60, 0x64, 0x1c, 0x57, 0x82, 0x6b, 0xdc, 0xc8, 0xfb, 0x30, 0xc1, 0x66, 0xdf, 0x8e, 0xed, - 0x73, 0xd1, 0x74, 0x26, 0x32, 0x46, 0x6e, 0x08, 0x78, 0x22, 0xa0, 0xb2, 0x4a, 0xc0, 0x8e, 0xf9, - 0x52, 0x87, 0x6f, 0x90, 0x44, 0x99, 0xed, 0x9d, 0xc4, 0xe6, 0x28, 0xd1, 0xc8, 0x17, 0x60, 0xa2, - 0xd4, 0xe9, 0x44, 0x3b, 0xce, 0xac, 0xa2, 0x08, 0xeb, 0x74, 0xac, 0xd4, 0x5d, 0x47, 0xa3, 0x88, - 0x6f, 0xcc, 0x73, 0x67, 0xda, 0x98, 0xc9, 0x1b, 0xa1, 0xb4, 0x7e, 0x2e, 0xd2, 0xea, 0x8a, 0x8b, - 0xa3, 0x26, 0xfa, 0x73, 0xc1, 0xbd, 0x0c, 0x93, 0x5c, 0xcd, 0x29, 0xa5, 0x99, 0xf3, 0x89, 0xd5, - 0x93, 0x22, 0xd4, 0xe8, 0x34, 0x64, 0x19, 0xa6, 0xb8, 0xb7, 0x75, 0x53, 0x44, 0xba, 0x9e, 0xbf, - 0x80, 0xab, 0x16, 0xb9, 0x70, 0x27, 0xed, 0x26, 0x26, 0x40, 0xb1, 0x35, 0x2e, 0x31, 0x22, 0xe3, - 0x4f, 0x33, 0x70, 0xa1, 0xc7, 0x88, 0x87, 0x71, 0x90, 0x33, 0xfd, 0xe3, 0x20, 0xb3, 0x9d, 0x43, - 0xd7, 0x8a, 0xe0, 0xf7, 0x0b, 0x29, 0x4b, 0x1d, 0x2f, 0x29, 0x6f, 0xb9, 0x40, 0x44, 0x8e, 0x21, - 0x51, 0xf5, 0x7d, 0x17, 0x55, 0xb3, 0xb9, 0xe4, 0x21, 0x24, 0xf0, 0x78, 0xa3, 0x96, 0x8c, 0x93, - 0xe3, 0xe2, 0x65, 0x91, 0xc2, 0x28, 0x1c, 0xd6, 0x0f, 0x5d, 0x6d, 0x05, 0xa7, 0xb0, 0x36, 0x8e, - 0x33, 0x30, 0xae, 0xac, 0x43, 0x72, 0x45, 0xf1, 0x02, 0x2e, 0xf0, 0x24, 0x58, 0x0a, 0x87, 0x2c, - 0x3f, 0x89, 0x70, 0x51, 0x65, 0x4f, 0x57, 0x40, 0xaf, 0x31, 0x51, 0x48, 0x89, 0x15, 0xdd, 0xd2, - 0xb4, 0xc5, 0x26, 0x96, 0x63, 0x3a, 0x7d, 0xdb, 0x0f, 0x4a, 0xf5, 0xc0, 0x79, 0x4c, 0x07, 0x38, - 0x74, 0xa2, 0x74, 0xfa, 0xb6, 0x1f, 0x58, 0x36, 0x92, 0x25, 0xd2, 0xe9, 0x87, 0x0c, 0x8d, 0xbf, - 0x9d, 0x01, 0xd8, 0xaa, 0x96, 0x31, 0xd8, 0xfb, 0xc7, 0x15, 0x0a, 0xd2, 0x03, 0xe8, 0x4a, 0xee, - 0x7d, 0xc4, 0x81, 0xff, 0x31, 0x03, 0x53, 0x3a, 0x1a, 0x79, 0x0f, 0xa6, 0x6b, 0x75, 0xcf, 0x6d, - 0x36, 0x77, 0xec, 0xfa, 0xc1, 0xaa, 0xd3, 0xa6, 0x3c, 0x74, 0xe9, 0x30, 0x3f, 0x8b, 0xfc, 0xb0, - 0xc8, 0x6a, 0xb2, 0x32, 0x33, 0x8e, 0x4c, 0x7e, 0x30, 0x03, 0x93, 0xb5, 0x7d, 0xf7, 0x30, 0x8c, - 0x36, 0x2a, 0x06, 0xe4, 0xab, 0x6c, 0x6d, 0xfb, 0xfb, 0xee, 0x61, 0x94, 0x41, 0x53, 0x33, 0xfe, - 0x7c, 0x77, 0xb0, 0x77, 0xf9, 0xba, 0x8b, 0x37, 0x99, 0xc0, 0xbf, 0xa1, 0x55, 0x62, 0xea, 0x75, - 0x1a, 0x7f, 0x91, 0x81, 0x71, 0xbc, 0xf3, 0x34, 0x9b, 0x28, 0x73, 0x7d, 0x2f, 0xa5, 0x63, 0x0c, - 0xbf, 0xab, 0xcf, 0xc0, 0xbe, 0x09, 0xd3, 0x31, 0x34, 0x62, 0xc0, 0x48, 0x0d, 0x1d, 0xfc, 0x55, - 0x05, 0x05, 0x77, 0xf9, 0x37, 0x45, 0x89, 0xb1, 0xac, 0x90, 0x3d, 0xba, 0x85, 0xcf, 0xba, 0x8b, - 0x00, 0x8e, 0x04, 0xc9, 0x9b, 0x0d, 0x89, 0xb7, 0xe4, 0xd1, 0x2d, 0x53, 0xc1, 0x32, 0xd6, 0x61, - 0xa4, 0xe6, 0x7a, 0xc1, 0xd2, 0x11, 0xbf, 0x4c, 0x54, 0xa8, 0x5f, 0x57, 0xdf, 0x6d, 0x1d, 0x7c, - 0x2b, 0xa9, 0x9b, 0xa2, 0x88, 0x14, 0x61, 0xf8, 0xae, 0x43, 0x9b, 0x0d, 0xd5, 0x40, 0x77, 0x97, - 0x01, 0x4c, 0x0e, 0x67, 0x17, 0xae, 0xf3, 0x51, 0x4e, 0x94, 0xc8, 0x12, 0xf8, 0xe3, 0xae, 0x9b, - 0xb2, 0xd6, 0xbf, 0x2f, 0x86, 0x79, 0x08, 0x92, 0x35, 0xf5, 0xe9, 0xea, 0xff, 0x38, 0x03, 0x0b, - 0xbd, 0x49, 0x54, 0xe3, 0xe2, 0x4c, 0x1f, 0xe3, 0xe2, 0x57, 0xe2, 0xef, 0x8c, 0x88, 0x26, 0xde, - 0x19, 0xa3, 0xd7, 0xc5, 0x0a, 0xda, 0x76, 0xd7, 0xa9, 0x4c, 0x84, 0x72, 0xa5, 0x4f, 0x9b, 0x11, - 0x91, 0x0f, 0x73, 0x80, 0x34, 0xa6, 0xa0, 0x35, 0x7e, 0x73, 0x08, 0x2e, 0xf6, 0xa4, 0x20, 0x2b, - 0x4a, 0x7a, 0xa5, 0xa9, 0x30, 0xb1, 0x4b, 0x4f, 0xfc, 0x1b, 0xf8, 0x2f, 0x9a, 0xef, 0xc5, 0xbd, - 0xcd, 0x1e, 0x86, 0x69, 0x75, 0xb2, 0xc8, 0xeb, 0x53, 0xa7, 0xf2, 0xe2, 0xe8, 0xc8, 0x0c, 0x92, - 0x19, 0x76, 0xd0, 0x2f, 0x91, 0x06, 0xb6, 0xd3, 0xf4, 0xd5, 0x65, 0xd7, 0xe0, 0x20, 0x53, 0x96, - 0x45, 0x16, 0xdf, 0x43, 0xe9, 0x16, 0xdf, 0xc6, 0xbf, 0xca, 0xc0, 0x58, 0xd8, 0x6c, 0xb2, 0x00, - 0xe7, 0x37, 0xcd, 0x52, 0x79, 0xd9, 0xda, 0xfc, 0x60, 0x63, 0xd9, 0xda, 0x5a, 0xaf, 0x6d, 0x2c, - 0x97, 0xab, 0x77, 0xab, 0xcb, 0x95, 0xc2, 0x73, 0x64, 0x06, 0x26, 0xb7, 0xd6, 0x1f, 0xac, 0x3f, - 0xdc, 0x5e, 0xb7, 0x96, 0x4d, 0xf3, 0xa1, 0x59, 0xc8, 0x90, 0x49, 0x18, 0x33, 0x97, 0x4a, 0x65, - 0x6b, 0xfd, 0x61, 0x65, 0xb9, 0x90, 0x25, 0x05, 0x98, 0x28, 0x3f, 0x5c, 0x5f, 0x5f, 0x2e, 0x6f, - 0x56, 0x1f, 0x55, 0x37, 0x3f, 0x28, 0xe4, 0x08, 0x81, 0x29, 0x44, 0xd8, 0x30, 0xab, 0xeb, 0xe5, - 0xea, 0x46, 0x69, 0xb5, 0x30, 0xc4, 0x60, 0x0c, 0x5f, 0x81, 0x0d, 0x87, 0x8c, 0x1e, 0x6c, 0x2d, - 0x2d, 0x17, 0x46, 0x18, 0x0a, 0xfb, 0x4b, 0x41, 0x19, 0x65, 0xd5, 0x23, 0x4a, 0xa5, 0xb4, 0x59, - 0x5a, 0x2a, 0xd5, 0x96, 0x0b, 0x79, 0x72, 0x01, 0x66, 0x35, 0x90, 0xb5, 0xfa, 0xf0, 0x5e, 0x75, - 0xbd, 0x30, 0x46, 0xe6, 0xa0, 0x10, 0xc2, 0x2a, 0x4b, 0xd6, 0x56, 0x6d, 0xd9, 0x2c, 0x40, 0x1c, - 0xba, 0x5e, 0x5a, 0x5b, 0x2e, 0x8c, 0x1b, 0xef, 0x72, 0x3f, 0x40, 0xde, 0xd5, 0xe4, 0x3c, 0x90, - 0xda, 0x66, 0x69, 0x73, 0xab, 0x16, 0xfb, 0xf8, 0x71, 0x18, 0xad, 0x6d, 0x95, 0xcb, 0xcb, 0xb5, - 0x5a, 0x21, 0x43, 0x00, 0x46, 0xee, 0x96, 0xaa, 0xab, 0xcb, 0x95, 0x42, 0xd6, 0xf8, 0xa9, 0x0c, - 0xcc, 0x48, 0x09, 0x50, 0x3e, 0x1a, 0x7d, 0xcc, 0xb5, 0xf8, 0x9e, 0x76, 0xb1, 0x95, 0x4e, 0x5a, - 0xb1, 0x4a, 0xfa, 0x2c, 0xc3, 0x9f, 0xcf, 0xc0, 0xb9, 0x54, 0x6c, 0xf2, 0x01, 0x14, 0x64, 0x0b, - 0xd6, 0xec, 0xa0, 0xbe, 0x1f, 0xed, 0x63, 0x97, 0x63, 0xb5, 0xc4, 0xd0, 0xb8, 0x5a, 0x33, 0x4a, - 0xf8, 0x9c, 0x60, 0x33, 0x78, 0x3a, 0x02, 0xe3, 0xdb, 0x19, 0xb8, 0xd0, 0xa3, 0x1a, 0x52, 0x86, - 0x91, 0x30, 0x31, 0x4d, 0x1f, 0x0b, 0xb6, 0xb9, 0xef, 0x1c, 0x17, 0x05, 0x22, 0x66, 0xc8, 0xc5, - 0xbf, 0xcc, 0x91, 0x30, 0xd3, 0x0c, 0xa6, 0x7b, 0xe1, 0xdd, 0x77, 0x31, 0xd6, 0xf3, 0xa2, 0xa6, - 0xd2, 0x76, 0x6d, 0x69, 0x5c, 0xf4, 0x5d, 0xce, 0x3e, 0xf4, 0x31, 0xdf, 0x8b, 0xf1, 0x33, 0x19, - 0x26, 0xdc, 0xc5, 0x11, 0x99, 0xcc, 0x5b, 0xf2, 0xfd, 0x6e, 0x8b, 0x9a, 0x6e, 0x93, 0x96, 0xcc, - 0x75, 0x71, 0x6c, 0xa0, 0xb4, 0x6a, 0x63, 0x01, 0x5e, 0x2b, 0x2c, 0xdb, 0x6b, 0x6b, 0xaf, 0xd5, - 0x2a, 0x0d, 0x79, 0x0b, 0x60, 0xf9, 0x49, 0x40, 0xbd, 0xb6, 0xdd, 0x0c, 0x63, 0xb4, 0xf0, 0xc8, - 0x52, 0x02, 0xaa, 0xcb, 0xdb, 0x0a, 0xb2, 0xf1, 0x77, 0x32, 0x30, 0x21, 0x2e, 0x4d, 0xa5, 0x26, - 0xf5, 0x82, 0x8f, 0x37, 0xbd, 0xde, 0xd2, 0xa6, 0x57, 0xe8, 0xb0, 0xa1, 0xf0, 0x67, 0xc5, 0xa9, - 0x33, 0xeb, 0x9f, 0x65, 0xa0, 0x10, 0x47, 0x24, 0xef, 0x41, 0xbe, 0x46, 0x1f, 0x53, 0xcf, 0x09, - 0x8e, 0xc4, 0x46, 0x29, 0x53, 0xf8, 0x71, 0x1c, 0x51, 0xc6, 0xe7, 0x83, 0x2f, 0x7e, 0x99, 0x21, - 0xcd, 0xa0, 0xfb, 0xbd, 0xa2, 0xf6, 0xc8, 0x3d, 0x2d, 0xb5, 0x87, 0xf1, 0xbf, 0x65, 0xe1, 0xc2, - 0x3d, 0x1a, 0xa8, 0xdf, 0x14, 0x9a, 0x17, 0x7c, 0x7a, 0xb0, 0xef, 0x52, 0xbe, 0x64, 0x1e, 0x46, - 0xb1, 0x48, 0x8e, 0xaf, 0x29, 0x7f, 0x92, 0xa5, 0x70, 0x5e, 0xe7, 0xb4, 0x1c, 0x61, 0x3d, 0xea, - 0xbe, 0xa1, 0x64, 0x0d, 0x0a, 0xa7, 0xf5, 0x55, 0x98, 0xc2, 0xb0, 0xf8, 0x5d, 0xb6, 0x1c, 0x68, - 0x43, 0xa8, 0x7f, 0xf2, 0x66, 0x0c, 0x4a, 0x5e, 0x83, 0x02, 0x83, 0x94, 0xea, 0x07, 0x6d, 0xf7, - 0xb0, 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, 0x16, 0x8c, 0x7f, 0xc4, 0x0c, 0x60, - 0xc6, 0xff, 0x9a, 0x81, 0x39, 0xfc, 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, 0x67, - 0xc9, 0x44, 0x3f, 0xa0, 0x4a, 0xeb, 0xfe, 0x50, 0x3e, 0x57, 0x18, 0x8a, 0x86, 0xdc, 0xf8, 0xc1, - 0x2c, 0x8c, 0x9a, 0x14, 0x53, 0x74, 0x93, 0xab, 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, 0x1d, 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, 0x0d, 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, 0xaf, 0x3d, 0x99, 0x7a, 0xf5, 0x7d, - 0x13, 0xa1, 0xe4, 0x16, 0x6a, 0x2a, 0x64, 0xfe, 0x26, 0xf1, 0xf5, 0xa8, 0x82, 0x6f, 0x44, 0x60, - 0x53, 0xc5, 0x09, 0x5f, 0xf8, 0x73, 0xa9, 0xb1, 0x4b, 0xce, 0x43, 0xf6, 0x61, 0x4d, 0x7c, 0x31, - 0x46, 0xc4, 0x72, 0x7d, 0x33, 0xfb, 0xb0, 0x86, 0xbd, 0xb1, 0x52, 0x5a, 0x7c, 0xf3, 0x8e, 0xf8, - 0x50, 0xde, 0x1b, 0xfb, 0xf6, 0xe2, 0x9b, 0x77, 0x4c, 0x51, 0xc2, 0xfa, 0x17, 0xdb, 0x8c, 0x0f, - 0xaf, 0xdc, 0xe7, 0x1e, 0xfb, 0x17, 0xbf, 0x0d, 0x1f, 0x59, 0xcd, 0x08, 0x81, 0x2c, 0xc2, 0xb8, - 0x88, 0xf5, 0x80, 0xf8, 0x4a, 0x2c, 0x06, 0x11, 0x0b, 0x82, 0x53, 0xa8, 0x48, 0xfc, 0x09, 0x4e, - 0x0c, 0x90, 0xcc, 0x32, 0x2b, 0x9e, 0xe0, 0xe4, 0x10, 0xfa, 0xa6, 0x82, 0xc2, 0x9a, 0xc4, 0xdf, - 0xf0, 0x22, 0x5f, 0xfa, 0x29, 0x25, 0x68, 0x00, 0xa6, 0x39, 0x08, 0x11, 0x8c, 0x5f, 0xce, 0x42, - 0x7e, 0xa3, 0xd9, 0xdd, 0x73, 0xda, 0x8f, 0x6e, 0x11, 0x02, 0x78, 0x8d, 0x93, 0x79, 0x30, 0xd8, - 0xdf, 0xe4, 0x22, 0xe4, 0xe5, 0xcd, 0x4d, 0x6e, 0x48, 0xbe, 0xb8, 0xb5, 0xcd, 0x83, 0x1c, 0x77, - 0x11, 0xfa, 0x4c, 0xfe, 0x24, 0xb7, 0x20, 0xbc, 0x7f, 0xf5, 0xba, 0xa8, 0x0d, 0xb1, 0xc5, 0x62, - 0x86, 0x68, 0xe4, 0x0d, 0xc0, 0x43, 0x42, 0x5c, 0x1e, 0xa4, 0x42, 0x9b, 0x37, 0x4d, 0xc8, 0x29, - 0x9c, 0x04, 0xd1, 0xc8, 0x6d, 0x10, 0x13, 0x53, 0x64, 0x33, 0x3f, 0xa7, 0x13, 0xf0, 0xfc, 0x90, - 0x92, 0x44, 0xa0, 0x92, 0x77, 0x60, 0xbc, 0xee, 0x51, 0x7c, 0x75, 0xb4, 0x9b, 0x51, 0x92, 0x72, - 0x95, 0xb2, 0x1c, 0x95, 0x3f, 0xba, 0x65, 0xaa, 0xe8, 0xc6, 0x2f, 0xe7, 0x61, 0x42, 0x6d, 0x0f, - 0x31, 0x61, 0xd6, 0x6f, 0xb2, 0xbb, 0xbb, 0x30, 0x36, 0xeb, 0x60, 0xa1, 0x38, 0x4e, 0xaf, 0xe8, - 0x0d, 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, 0xa1, - 0x28, 0x4c, 0xf0, 0x0a, 0xc9, 0xc8, 0x9b, 0x30, 0xe2, 0x76, 0x68, 0xdb, 0x76, 0xc4, 0x19, 0xf7, - 0x7c, 0x8c, 0x01, 0x6d, 0x97, 0xaa, 0x0a, 0xa1, 0x40, 0x26, 0x37, 0x61, 0xc8, 0x3d, 0x08, 0xc7, - 0xeb, 0xa2, 0x4e, 0x74, 0x10, 0xd8, 0x0a, 0x09, 0x22, 0x32, 0x82, 0x0f, 0xed, 0xd6, 0xae, 0x18, - 0x31, 0x9d, 0xe0, 0xbe, 0xdd, 0xda, 0x55, 0x09, 0x18, 0x22, 0x79, 0x1f, 0xa0, 0x63, 0xef, 0x51, - 0xcf, 0x6a, 0x74, 0x83, 0x23, 0x31, 0x6e, 0x97, 0x35, 0xb2, 0x0d, 0x56, 0x5c, 0xe9, 0x06, 0x47, - 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, 0x46, 0x3b, 0x9e, 0x2d, - 0x72, 0xca, 0xc7, 0x1a, 0xed, 0x78, 0xda, 0x57, 0x32, 0x44, 0xf2, 0x39, 0x18, 0x6d, 0x38, 0x7e, - 0xdd, 0xf5, 0x1a, 0x22, 0x7a, 0xc9, 0x0b, 0x1a, 0x4d, 0x85, 0x97, 0x29, 0x64, 0x12, 0x9d, 0xb5, - 0x56, 0x04, 0x21, 0x5d, 0x77, 0x0f, 0x51, 0xcd, 0x1f, 0x6f, 0x6d, 0x2d, 0x2c, 0x56, 0x5b, 0x1b, - 0x11, 0xb1, 0xa1, 0xdc, 0x73, 0x82, 0xa6, 0xbd, 0x23, 0xde, 0xb9, 0xf5, 0xa1, 0xbc, 0x87, 0x45, - 0xea, 0x50, 0x72, 0x64, 0xf2, 0x16, 0xe4, 0x69, 0x3b, 0xf0, 0x6c, 0xcb, 0x69, 0x08, 0x2f, 0x49, - 0xbd, 0xd1, 0xec, 0x00, 0xb6, 0xab, 0x15, 0xb5, 0xd1, 0x88, 0x5f, 0x6d, 0xb0, 0xfe, 0xf1, 0xeb, - 0x4e, 0x4b, 0x38, 0x37, 0xea, 0xfd, 0x53, 0x2b, 0x57, 0xd7, 0xd4, 0xfe, 0x61, 0x88, 0xe4, 0x3d, - 0x18, 0x65, 0xeb, 0xb7, 0xe1, 0xee, 0x89, 0x80, 0x10, 0x86, 0xde, 0x3f, 0xbc, 0x2c, 0x31, 0x5d, - 0x25, 0x11, 0x5b, 0xc8, 0xf6, 0xa1, 0x6f, 0x39, 0x75, 0x11, 0xe4, 0x41, 0x5f, 0x8e, 0xa5, 0xed, - 0x5a, 0xb5, 0xac, 0x90, 0x0d, 0xdb, 0x87, 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, 0x4d, 0x14, 0xe8, 0xe4, 0x32, 0x40, - 0xf4, 0x8a, 0xcf, 0xdf, 0x5c, 0x4c, 0x05, 0xf2, 0xf9, 0xa1, 0xff, 0xf3, 0x17, 0x8b, 0x99, 0x25, - 0x80, 0xbc, 0x8c, 0x50, 0x63, 0xac, 0xc2, 0xc5, 0x9e, 0xeb, 0x9e, 0x5c, 0x87, 0xc2, 0xae, 0x2d, - 0xb4, 0x7e, 0xf5, 0x7d, 0xbb, 0xdd, 0xa6, 0x4d, 0xb1, 0xe3, 0x4e, 0x4b, 0x78, 0x99, 0x83, 0x39, - 0x67, 0xe3, 0x7d, 0x98, 0x4b, 0x1b, 0x70, 0xf2, 0x22, 0x4c, 0xa8, 0xc1, 0x78, 0x04, 0x93, 0x71, - 0xbb, 0xe3, 0xc8, 0x70, 0x3c, 0x82, 0xc1, 0x6f, 0x64, 0xe0, 0x85, 0x7e, 0xdb, 0x07, 0x59, 0x80, - 0x7c, 0xc7, 0x73, 0x5c, 0x14, 0x53, 0x45, 0xb6, 0x03, 0xf9, 0x1b, 0x13, 0x19, 0xa0, 0x3c, 0x15, - 0xd8, 0x7b, 0xc2, 0xc1, 0xc3, 0x1c, 0x43, 0xc8, 0xa6, 0xbd, 0xe7, 0x93, 0x4f, 0xc1, 0x4c, 0x83, - 0xee, 0xda, 0xdd, 0x66, 0x60, 0xf9, 0xf5, 0x7d, 0xda, 0x40, 0x9f, 0x2a, 0x34, 0xdc, 0x33, 0x0b, - 0xa2, 0xa0, 0x26, 0xe1, 0x89, 0x16, 0x0f, 0xf7, 0x68, 0xf1, 0xfd, 0xa1, 0x7c, 0xa6, 0x90, 0x35, - 0xd1, 0x52, 0xca, 0xf8, 0xfe, 0x2c, 0xcc, 0xf7, 0x5a, 0x2f, 0xe4, 0xdd, 0xb4, 0x3e, 0xe0, 0x0f, - 0x17, 0x2a, 0x5c, 0x7d, 0xb8, 0x50, 0x6a, 0x23, 0x8b, 0x10, 0x7a, 0x44, 0x9d, 0x16, 0xdd, 0x40, - 0xc2, 0x18, 0x4d, 0xc7, 0xf6, 0xfd, 0x43, 0xb6, 0x25, 0xe4, 0x94, 0x80, 0xb6, 0x02, 0xa6, 0xd2, - 0x48, 0x18, 0xf9, 0x2c, 0x40, 0xbd, 0xe9, 0xfa, 0x14, 0xed, 0x03, 0x84, 0xac, 0xc1, 0xcd, 0xc2, - 0x43, 0xa8, 0xfa, 0x20, 0x8c, 0xd0, 0xb2, 0xdb, 0xa0, 0x62, 0x00, 0x6d, 0xb8, 0xd0, 0x63, 0x83, - 0x64, 0xc3, 0x13, 0x65, 0x87, 0x97, 0xb9, 0xa6, 0xba, 0x61, 0x8e, 0xf8, 0x78, 0x8f, 0x67, 0x7b, - 0xcd, 0x91, 0x23, 0x20, 0xc9, 0x5d, 0x90, 0x71, 0x17, 0xc6, 0xcd, 0x5d, 0x2f, 0xe4, 0xce, 0x21, - 0x5b, 0x5e, 0x93, 0x14, 0x61, 0x5c, 0xe6, 0x92, 0x64, 0xb2, 0x3c, 0x67, 0x0e, 0x02, 0xf4, 0x80, - 0xe2, 0xe4, 0xc1, 0x88, 0xa5, 0xe8, 0xf7, 0x26, 0xa4, 0x84, 0x31, 0x84, 0x6c, 0x1e, 0x75, 0xe4, - 0xd7, 0xbd, 0x20, 0xe7, 0xb7, 0x7e, 0x36, 0x89, 0xd2, 0x9f, 0xcd, 0xc8, 0xe1, 0x4f, 0x6e, 0xee, - 0xa7, 0xb5, 0x8f, 0x00, 0x7a, 0x29, 0x89, 0x86, 0xe1, 0xdf, 0x4c, 0x6a, 0x91, 0xab, 0x4e, 0x48, - 0x2d, 0xe2, 0x27, 0xb9, 0x0a, 0xd3, 0x1e, 0xb7, 0x63, 0x0d, 0x5c, 0xd1, 0x9f, 0x3c, 0x6f, 0xc7, - 0x24, 0x07, 0x6f, 0xba, 0xd8, 0xa7, 0xa2, 0x5d, 0xf7, 0xc3, 0x0e, 0x53, 0xce, 0x3a, 0x72, 0x03, - 0xc6, 0xd8, 0x59, 0x87, 0x91, 0x6e, 0x62, 0xee, 0x11, 0x88, 0x87, 0x92, 0x83, 0x99, 0xff, 0x50, - 0xfc, 0x2d, 0x78, 0x7d, 0x3b, 0x2b, 0x99, 0xa9, 0x27, 0x2d, 0xb9, 0x00, 0xa3, 0xae, 0xb7, 0xa7, - 0x7c, 0xda, 0x88, 0xeb, 0xed, 0xb1, 0xef, 0xba, 0x06, 0x05, 0xee, 0xad, 0xc3, 0xc3, 0x20, 0xf8, - 0x47, 0x6d, 0x7e, 0x15, 0xcf, 0x9b, 0x53, 0x1c, 0x8e, 0x09, 0xf3, 0x8f, 0xda, 0x75, 0x86, 0xe9, - 0xfb, 0xae, 0xa5, 0x06, 0xb8, 0x12, 0x9f, 0x3d, 0xe5, 0xfb, 0x6e, 0x14, 0xe9, 0xaa, 0x41, 0x96, - 0x60, 0x92, 0xf1, 0x09, 0xc3, 0x6c, 0x09, 0x41, 0xe0, 0x52, 0x52, 0x10, 0x38, 0x6a, 0xd7, 0x65, - 0x13, 0xcd, 0x09, 0x5f, 0xf9, 0x45, 0x1e, 0x40, 0x41, 0x91, 0x98, 0xd0, 0x1f, 0x33, 0x66, 0x53, - 0x1d, 0xb1, 0x51, 0x24, 0xad, 0x6a, 0x7b, 0xd7, 0x35, 0xa7, 0xeb, 0x3a, 0x40, 0x74, 0xcd, 0xbf, - 0x9b, 0x91, 0x7b, 0x69, 0x0a, 0x11, 0x31, 0x60, 0x72, 0xdf, 0xf6, 0x2d, 0xdf, 0x6f, 0x71, 0x1b, - 0x31, 0x11, 0xd8, 0x77, 0x7c, 0xdf, 0xf6, 0x6b, 0x7e, 0xeb, 0xff, 0x63, 0xef, 0xd9, 0x62, 0xdb, - 0xc8, 0xae, 0xf3, 0x90, 0x94, 0x44, 0x1d, 0xea, 0x31, 0xba, 0xb6, 0x25, 0xad, 0xe4, 0xb5, 0xd7, - 0xb3, 0xb6, 0x63, 0x73, 0xb3, 0x9b, 0xd8, 0xdb, 0xcd, 0xee, 0x26, 0xcd, 0x63, 0x44, 0x0e, 0x25, - 0xda, 0x7c, 0x65, 0x86, 0x94, 0xe2, 0x38, 0xc9, 0x64, 0x96, 0x1c, 0x49, 0xd3, 0x50, 0x24, 0xc3, - 0x21, 0xd7, 0x71, 0x50, 0xa0, 0x0d, 0x0a, 0x24, 0x40, 0x5f, 0x69, 0xd3, 0x02, 0x0d, 0xfa, 0xd3, - 0x8f, 0x06, 0x45, 0x3f, 0xfa, 0x5b, 0xb4, 0x68, 0xfb, 0x93, 0xbf, 0x00, 0x41, 0x80, 0x00, 0xed, - 0x57, 0x5b, 0x2c, 0xda, 0x05, 0x5a, 0xa0, 0x8f, 0xbf, 0xa2, 0xf9, 0xc8, 0x57, 0x71, 0xcf, 0xbd, - 0x77, 0xe6, 0xce, 0x83, 0xb4, 0x9c, 0xdd, 0xb4, 0x0d, 0x90, 0x2f, 0x89, 0xe7, 0x9e, 0x7b, 0xe7, - 0x3e, 0xcf, 0x3d, 0xe7, 0xdc, 0xf3, 0x10, 0x89, 0x43, 0x2e, 0x53, 0x9c, 0xa1, 0x33, 0x9d, 0x9c, - 0xda, 0x32, 0xff, 0xc7, 0x66, 0xec, 0xe2, 0xa9, 0xe3, 0x37, 0x69, 0x99, 0xd4, 0x36, 0xb9, 0x01, - 0x6b, 0xd8, 0x6e, 0xd7, 0x13, 0x0d, 0x63, 0x28, 0x0b, 0x73, 0x85, 0x36, 0xdc, 0xf5, 0x58, 0xcb, - 0xbc, 0x87, 0xff, 0x96, 0x81, 0xcd, 0xf4, 0xd9, 0xc1, 0xed, 0x49, 0xe7, 0x14, 0x7d, 0xf4, 0x78, - 0xdf, 0x96, 0x29, 0x84, 0x85, 0x21, 0x49, 0x5b, 0x9c, 0x4c, 0xea, 0xe2, 0x14, 0x61, 0x03, 0x1b, - 0xe2, 0x9c, 0x66, 0xdf, 0xf3, 0x27, 0x3c, 0xba, 0x86, 0xb9, 0x4e, 0x0b, 0x18, 0x3d, 0xaf, 0x51, - 0x30, 0xb9, 0x09, 0x6b, 0x82, 0x22, 0x0f, 0x1f, 0x0f, 0xe8, 0x87, 0x19, 0x39, 0x5e, 0xe5, 0xd0, - 0x26, 0x02, 0xc9, 0x65, 0x58, 0x74, 0x46, 0x23, 0xfa, 0x49, 0x46, 0x85, 0x17, 0x9c, 0xd1, 0x88, - 0x25, 0xb7, 0x41, 0x8f, 0x44, 0xfb, 0x18, 0xad, 0x84, 0xb8, 0x49, 0xa2, 0xb9, 0x82, 0x40, 0x66, - 0x39, 0xe4, 0xd3, 0x73, 0x4f, 0xeb, 0x0a, 0x94, 0x25, 0x44, 0x01, 0x67, 0x14, 0x20, 0x3c, 0x07, - 0x79, 0xf1, 0x5e, 0xcd, 0x1c, 0x2b, 0xcc, 0x25, 0x87, 0xbf, 0x55, 0xbf, 0x06, 0x5b, 0x3d, 0xcf, - 0xc7, 0xcd, 0xcb, 0x86, 0x34, 0x1a, 0x71, 0x1f, 0x48, 0x16, 0x24, 0xd7, 0xbc, 0xc4, 0x8b, 0xe9, - 0x4c, 0xea, 0xa3, 0x11, 0xf3, 0x84, 0xe4, 0x73, 0xfd, 0x06, 0xac, 0x73, 0x8e, 0x8b, 0x5f, 0x91, - 0xd8, 0x17, 0x7e, 0x80, 0xa9, 0x28, 0xc4, 0xd3, 0x09, 0x01, 0x07, 0x55, 0x7b, 0xa2, 0xe6, 0x3f, - 0x2a, 0x70, 0x39, 0x95, 0x65, 0x23, 0x5f, 0x04, 0xe6, 0xf2, 0x35, 0x19, 0xda, 0x63, 0xb7, 0xeb, - 0x8d, 0x3c, 0x0c, 0x8a, 0xc1, 0x54, 0x9a, 0xf7, 0xe6, 0x31, 0x7b, 0xe8, 0x3e, 0xd6, 0x1e, 0x9a, - 0x41, 0x25, 0xa6, 0x6b, 0x51, 0xc7, 0x31, 0xf0, 0xce, 0x23, 0xb8, 0x9c, 0x8a, 0x9a, 0xa2, 0x03, - 0xf9, 0x60, 0x34, 0x99, 0xb3, 0x78, 0xa4, 0x8a, 0x0d, 0x5a, 0xd2, 0x8d, 0xf0, 0xe1, 0x7d, 0x37, - 0x18, 0x5e, 0x8c, 0xb9, 0x23, 0x46, 0xfc, 0x5c, 0xa7, 0xc9, 0x27, 0xa2, 0xd2, 0xec, 0xa3, 0xfd, - 0x08, 0x2e, 0xf3, 0xcd, 0x77, 0x32, 0x76, 0x46, 0xa7, 0x61, 0x73, 0xac, 0xa3, 0x1f, 0x48, 0x6b, - 0x8e, 0xed, 0xca, 0x7d, 0x8a, 0x1f, 0xb4, 0x7a, 0xd1, 0x49, 0x02, 0xf9, 0x18, 0xbe, 0x96, 0x11, - 0x47, 0x3d, 0xa5, 0x3b, 0x29, 0xdb, 0x5a, 0x49, 0xdb, 0xd6, 0xe7, 0x3f, 0x53, 0x0d, 0x20, 0x32, - 0xb1, 0x62, 0x5a, 0x4f, 0x6e, 0x50, 0x25, 0xf8, 0x74, 0xde, 0x11, 0x89, 0x34, 0x58, 0x2c, 0x99, - 0xe6, 0x46, 0x37, 0x0e, 0x22, 0xbb, 0xb0, 0x1c, 0xe4, 0xab, 0xe6, 0x17, 0x47, 0x9e, 0x01, 0xaa, - 0x3d, 0xf2, 0x02, 0xac, 0x30, 0x96, 0x3c, 0x72, 0xe6, 0x00, 0x61, 0x3a, 0x3d, 0x78, 0x62, 0x0e, - 0x14, 0x78, 0xe1, 0x69, 0x73, 0x48, 0x8e, 0x60, 0x13, 0xcd, 0x3a, 0xfc, 0x61, 0xb0, 0x0c, 0x76, - 0xd7, 0xe9, 0x9e, 0xba, 0x7c, 0xd7, 0x6a, 0xa9, 0x8b, 0x31, 0x1a, 0x59, 0x56, 0x53, 0x5a, 0x87, - 0xd1, 0xc8, 0xf2, 0x87, 0xe2, 0x77, 0x89, 0x56, 0xe7, 0x7d, 0xe8, 0xc1, 0xee, 0x9c, 0x9a, 0x12, - 0xe1, 0x50, 0x64, 0xc2, 0x71, 0x1b, 0xd4, 0x63, 0xb7, 0x47, 0x79, 0x62, 0xb7, 0x87, 0x5d, 0x7b, - 0xfb, 0x1e, 0xcb, 0xd0, 0x6e, 0xae, 0x05, 0x70, 0xcb, 0x1f, 0x1e, 0xde, 0xe3, 0x5f, 0x39, 0x13, - 0x57, 0x9e, 0x2c, 0x56, 0x90, 0x57, 0xe0, 0x62, 0x2c, 0xe0, 0x48, 0xe8, 0xc1, 0x6e, 0x6e, 0xd0, - 0xa2, 0x68, 0x78, 0xaa, 0xeb, 0xb0, 0x22, 0x76, 0xc5, 0x38, 0xf0, 0x83, 0x33, 0x0b, 0x1c, 0x46, - 0x4f, 0x1d, 0xff, 0xdc, 0x54, 0x0c, 0x2a, 0x55, 0x22, 0x39, 0x07, 0x2f, 0x4d, 0x5e, 0x06, 0x12, - 0xf0, 0xed, 0x01, 0xa1, 0xe0, 0x1f, 0xdc, 0x10, 0x25, 0xc1, 0x09, 0xe7, 0x9f, 0xfd, 0x9b, 0x0c, - 0x5c, 0x4c, 0x11, 0x65, 0xa8, 0x10, 0xe0, 0x0d, 0x26, 0xee, 0x09, 0x13, 0x21, 0xe4, 0x41, 0xae, - 0x4b, 0x70, 0xae, 0x9f, 0x5a, 0x64, 0x19, 0xc8, 0xf9, 0xb7, 0xf8, 0x2f, 0x4a, 0x3c, 0x9c, 0xb1, - 0x50, 0xbd, 0xd0, 0x7f, 0x49, 0x15, 0x36, 0x30, 0xad, 0x82, 0xef, 0x0d, 0x31, 0x3b, 0x03, 0x32, - 0x21, 0xb9, 0x88, 0xb0, 0x83, 0xbd, 0x68, 0x49, 0x48, 0x94, 0x0b, 0x31, 0xd5, 0x51, 0x0c, 0x42, - 0x3e, 0x06, 0x3b, 0xd2, 0x5d, 0x63, 0xc7, 0x4e, 0x1e, 0x5a, 0xba, 0x9b, 0x5b, 0x4e, 0x70, 0xeb, - 0x94, 0x23, 0x67, 0x70, 0x0f, 0xae, 0xe2, 0x22, 0x7a, 0xbd, 0x91, 0x9d, 0xc8, 0xc3, 0x81, 0x43, - 0x65, 0x81, 0xeb, 0x77, 0x28, 0x56, 0xb5, 0x37, 0x8a, 0xa5, 0xe4, 0xa0, 0xa3, 0xe6, 0xd3, 0xf7, - 0x08, 0x2e, 0xa7, 0xf6, 0x98, 0x5e, 0x30, 0x68, 0x48, 0x15, 0xf2, 0x46, 0x4b, 0xf4, 0x37, 0x65, - 0x8e, 0xae, 0xc3, 0xca, 0x5b, 0xae, 0x33, 0x76, 0xc7, 0xfc, 0xe6, 0xe6, 0x5b, 0x82, 0xc1, 0xe4, - 0x8b, 0xbb, 0x17, 0x5d, 0x1a, 0xae, 0x33, 0x22, 0x75, 0xb8, 0xc8, 0x6e, 0x40, 0xef, 0x0c, 0x99, - 0x41, 0xae, 0x67, 0x52, 0x22, 0xec, 0x10, 0x56, 0xc1, 0xab, 0xa9, 0x8a, 0x58, 0xac, 0xb6, 0xb9, - 0x71, 0x12, 0x07, 0xd1, 0x13, 0xbd, 0x99, 0x8e, 0x4d, 0xf6, 0xa0, 0xc0, 0x1a, 0x67, 0x62, 0x01, - 0x7b, 0x20, 0xb8, 0x3e, 0xf7, 0x0b, 0x25, 0xb4, 0x2f, 0xf6, 0x83, 0xff, 0xe9, 0x7d, 0x8d, 0x6f, - 0xb1, 0xf6, 0x99, 0xfc, 0xfe, 0x61, 0xae, 0x20, 0x90, 0xbf, 0x7b, 0x68, 0x7f, 0xab, 0x88, 0xa1, - 0x46, 0x84, 0x63, 0xba, 0xb5, 0x7c, 0x77, 0x20, 0xde, 0x80, 0x96, 0x4d, 0xfe, 0xeb, 0x19, 0xb7, - 0x3a, 0x79, 0x1d, 0x56, 0x68, 0xb3, 0x27, 0xd3, 0x01, 0xdb, 0x72, 0xd9, 0x48, 0xa0, 0x9d, 0x3a, - 0x2b, 0xa2, 0xcb, 0x76, 0x70, 0xc1, 0x2c, 0x9c, 0x85, 0x3f, 0x29, 0xb7, 0xec, 0x9f, 0x4d, 0x46, - 0xf2, 0x46, 0x15, 0x8a, 0x42, 0xab, 0xde, 0x6e, 0xf1, 0x2a, 0x79, 0x8a, 0x13, 0x72, 0xcb, 0x7b, - 0x8b, 0x4c, 0x55, 0xa8, 0xbd, 0x04, 0x05, 0xa9, 0x6d, 0x3a, 0x18, 0xe6, 0x39, 0x23, 0x06, 0xc3, - 0x7e, 0xf1, 0xc5, 0x7e, 0x0b, 0xf2, 0xa2, 0x49, 0x2a, 0x16, 0x9c, 0x0e, 0x7d, 0x71, 0xc8, 0xf1, - 0x7f, 0x0a, 0xa3, 0xb3, 0x8c, 0x83, 0x5c, 0x30, 0xf1, 0x7f, 0xbc, 0x4b, 0x26, 0x0e, 0x95, 0x07, - 0xfa, 0xbe, 0x3d, 0x42, 0x0b, 0xac, 0x80, 0x79, 0xa6, 0xf0, 0x76, 0xdf, 0x67, 0x76, 0x59, 0xfc, - 0x1b, 0x7f, 0x19, 0x5c, 0xc2, 0x31, 0x6d, 0xc2, 0x2c, 0x9a, 0x19, 0xb9, 0x32, 0x32, 0xc9, 0x2b, - 0x83, 0x05, 0x50, 0xe1, 0x35, 0xd9, 0x97, 0x01, 0x61, 0x78, 0x65, 0x48, 0x94, 0x21, 0x17, 0xa1, - 0x0c, 0x92, 0x4c, 0x1e, 0xae, 0x1e, 0xbb, 0x71, 0x84, 0x4c, 0x1e, 0xa7, 0x53, 0x7f, 0x92, 0x11, - 0x2a, 0x82, 0xbd, 0xe1, 0x70, 0xe2, 0x4f, 0xc6, 0xce, 0x28, 0xa2, 0x0a, 0x25, 0x67, 0xf0, 0x1c, - 0x72, 0xd0, 0xf7, 0x30, 0x85, 0xc5, 0x70, 0x2c, 0x62, 0x76, 0x04, 0x3b, 0xb7, 0x70, 0xef, 0x43, - 0x51, 0x1e, 0x5f, 0xa7, 0xd8, 0xba, 0x8c, 0x4c, 0x37, 0xac, 0xd4, 0xea, 0xc1, 0x05, 0x73, 0x8b, - 0xb5, 0x99, 0xc0, 0x22, 0x07, 0x29, 0x87, 0x38, 0xae, 0x0b, 0xdd, 0x0b, 0x4f, 0x74, 0xb4, 0x55, - 0xf9, 0xac, 0x93, 0x4f, 0xc0, 0xb2, 0xd7, 0x93, 0x33, 0x35, 0xc6, 0xb5, 0x70, 0xd5, 0x1e, 0x8b, - 0x16, 0x1d, 0xb6, 0x41, 0xf7, 0x9c, 0xc7, 0xa1, 0x7b, 0xab, 0x11, 0xa5, 0xb1, 0xb6, 0x27, 0xa4, - 0xd1, 0x64, 0x35, 0xb2, 0x06, 0x99, 0x60, 0x85, 0x33, 0x5e, 0x8f, 0x1d, 0xaf, 0x30, 0x5e, 0xb5, - 0xc9, 0x7f, 0x69, 0xbf, 0x0c, 0xb7, 0xcf, 0x3b, 0x47, 0xf4, 0x28, 0xce, 0x98, 0xf0, 0x65, 0x73, - 0xc3, 0x49, 0xcc, 0xdb, 0x75, 0x90, 0xc3, 0xed, 0x7a, 0x82, 0xf8, 0x09, 0x58, 0x67, 0xec, 0x69, - 0x7f, 0x91, 0x85, 0xb5, 0xa8, 0x9a, 0x9c, 0xbc, 0x04, 0x39, 0x89, 0x02, 0x6d, 0xa5, 0xe8, 0xd2, - 0x91, 0xee, 0x20, 0xd2, 0xb9, 0x28, 0x0e, 0xb9, 0x0f, 0x6b, 0x68, 0xb8, 0x87, 0xac, 0xe7, 0xc4, - 0xe3, 0x8f, 0x2f, 0xf3, 0xdf, 0xcf, 0xf2, 0xdf, 0x7b, 0xe7, 0xda, 0x05, 0x7c, 0x2a, 0x5b, 0xa1, - 0x75, 0x29, 0xf7, 0x47, 0x0b, 0x25, 0x2d, 0x68, 0x6e, 0xb6, 0x16, 0x94, 0x0f, 0x65, 0x86, 0x16, - 0x74, 0x61, 0x8e, 0x16, 0x34, 0xac, 0x29, 0x6b, 0x41, 0x51, 0x17, 0xbe, 0x34, 0x4b, 0x17, 0x1e, - 0xd6, 0x61, 0xba, 0xf0, 0x50, 0x8b, 0x99, 0x9f, 0xa9, 0xc5, 0x0c, 0xeb, 0x70, 0x2d, 0xe6, 0x0d, - 0x3e, 0x47, 0x63, 0xe7, 0xb1, 0x8d, 0x93, 0xc7, 0xaf, 0x45, 0x1c, 0xbd, 0xe9, 0x3c, 0x46, 0xe3, - 0x9a, 0xbd, 0x65, 0x10, 0x16, 0x39, 0xda, 0xef, 0x29, 0x31, 0x4d, 0xa0, 0x58, 0xbf, 0x9b, 0xb0, - 0xc6, 0x2e, 0x2b, 0xb7, 0x27, 0xc9, 0x9a, 0xab, 0xe6, 0xaa, 0x80, 0x32, 0x79, 0xf3, 0x03, 0xb0, - 0x1e, 0xa0, 0x71, 0x91, 0x0b, 0x3d, 0xf5, 0xcc, 0xa0, 0x36, 0x0f, 0x3b, 0xf3, 0x12, 0x6c, 0x04, - 0x88, 0x5c, 0x9b, 0xc3, 0xc4, 0xcd, 0x55, 0x53, 0x15, 0x05, 0x2d, 0x0e, 0xd7, 0x4e, 0xe2, 0x92, - 0xc7, 0x4f, 0xa9, 0x57, 0xda, 0x77, 0xb3, 0x11, 0x2d, 0x89, 0xf8, 0x0c, 0xbd, 0x45, 0xfd, 0xa1, - 0xcd, 0x27, 0x89, 0xd3, 0xa2, 0xeb, 0x33, 0xd6, 0x8c, 0xdb, 0x34, 0x59, 0x56, 0xd3, 0x04, 0xdf, - 0x1f, 0x0a, 0x13, 0x27, 0x9b, 0x71, 0xd4, 0xec, 0xde, 0xc7, 0x3d, 0x2b, 0x9a, 0x63, 0x84, 0xa7, - 0x38, 0xbf, 0x39, 0x21, 0xa6, 0xd2, 0x2d, 0x8b, 0x9c, 0x75, 0xf0, 0x4b, 0x7c, 0xa0, 0x03, 0xa8, - 0x54, 0xf4, 0xa3, 0x8d, 0x67, 0x53, 0x64, 0xa7, 0x44, 0xe3, 0x38, 0x4b, 0xd8, 0xb2, 0x3a, 0x15, - 0xff, 0x8a, 0x66, 0x0d, 0x58, 0x41, 0x1d, 0x85, 0x68, 0x30, 0x97, 0xa2, 0x82, 0x4f, 0x0e, 0xbe, - 0x54, 0xad, 0x9b, 0x05, 0x5a, 0x4f, 0x34, 0x73, 0x0a, 0xcf, 0xc9, 0x9a, 0x85, 0x68, 0x27, 0x17, - 0x44, 0x14, 0xdd, 0xb9, 0x33, 0x10, 0x2a, 0x20, 0xb0, 0xab, 0x9b, 0x4e, 0x14, 0xc0, 0xd1, 0xb4, - 0x53, 0xd8, 0x99, 0xbd, 0x24, 0x73, 0x32, 0x34, 0x85, 0x17, 0x68, 0x46, 0xbe, 0x40, 0x65, 0x3d, - 0x43, 0x36, 0xa2, 0x67, 0xd0, 0xfe, 0x38, 0x0b, 0x2f, 0x9e, 0x63, 0xb9, 0xe6, 0x7c, 0xf3, 0x53, - 0x51, 0xf6, 0x2c, 0x13, 0x91, 0x0c, 0x69, 0xa3, 0x9c, 0x40, 0x52, 0x29, 0x35, 0x9d, 0x39, 0xfb, - 0x22, 0xac, 0x33, 0x2a, 0xc8, 0xcc, 0x12, 0x8f, 0xa7, 0xfd, 0x73, 0x90, 0xc1, 0x5d, 0xe1, 0x43, - 0x15, 0xab, 0x8a, 0x94, 0x11, 0x29, 0x86, 0x15, 0xc0, 0x48, 0x1b, 0x0a, 0x88, 0x76, 0xec, 0x78, - 0xfd, 0x73, 0x39, 0xf3, 0x08, 0x0f, 0x2d, 0xb9, 0x1a, 0xb3, 0xa6, 0xa6, 0x80, 0x0a, 0xfe, 0x26, - 0xb7, 0x60, 0x7d, 0x30, 0x3d, 0xa3, 0x8c, 0x07, 0xdb, 0x0b, 0xdc, 0xfa, 0x63, 0xc1, 0x5c, 0x1d, - 0x4c, 0xcf, 0xf4, 0xd1, 0x08, 0x97, 0x14, 0xcd, 0x44, 0x36, 0x28, 0x1e, 0x3b, 0xb5, 0x02, 0x73, - 0x11, 0x31, 0x69, 0x03, 0xec, 0xdc, 0x72, 0xdc, 0x4b, 0xc0, 0x8c, 0x06, 0x79, 0x86, 0x2a, 0xf6, - 0x43, 0xfb, 0x51, 0x46, 0xc8, 0xbb, 0xb3, 0xf7, 0xfd, 0xcf, 0x97, 0x28, 0x65, 0x89, 0x6e, 0x83, - 0x4a, 0xa7, 0x3e, 0x24, 0x2a, 0xc1, 0x1a, 0xad, 0x0d, 0xa6, 0x67, 0xc1, 0xdc, 0xc9, 0x13, 0xbf, - 0x28, 0x4f, 0xfc, 0xeb, 0x42, 0x1e, 0x4e, 0x25, 0x0f, 0xb3, 0xa7, 0x5c, 0xfb, 0xcf, 0x2c, 0xdc, - 0x3a, 0x1f, 0x11, 0xf8, 0xf9, 0xba, 0xa5, 0xac, 0x5b, 0x4c, 0x75, 0xba, 0x90, 0x50, 0x9d, 0xa6, - 0x9c, 0xbd, 0xc5, 0xb4, 0xb3, 0x97, 0x50, 0xd4, 0x2e, 0xa5, 0x28, 0x6a, 0x53, 0x0f, 0x68, 0xfe, - 0x29, 0x07, 0x74, 0x59, 0xde, 0x27, 0xff, 0x1a, 0x28, 0x30, 0xa2, 0xf2, 0xc0, 0x23, 0xb8, 0x28, - 0xe4, 0x01, 0x76, 0x73, 0x84, 0xfa, 0xf7, 0xc2, 0xbd, 0x3b, 0x69, 0x92, 0x00, 0xa2, 0xa5, 0x70, - 0xeb, 0x1b, 0x5c, 0x06, 0x08, 0xcb, 0xff, 0xff, 0x70, 0xff, 0xe4, 0x21, 0x6c, 0x62, 0x7c, 0xf7, - 0xae, 0xfc, 0x72, 0x60, 0x8f, 0xdd, 0x63, 0xbe, 0x1f, 0xae, 0x27, 0x78, 0x65, 0xaf, 0x2b, 0x75, - 0xc7, 0x74, 0x8f, 0x0f, 0x2e, 0x98, 0x97, 0xfc, 0x14, 0x78, 0x5c, 0xb0, 0xf8, 0x33, 0x05, 0xb4, - 0xa7, 0xcf, 0x17, 0x2a, 0xaa, 0xe2, 0x13, 0xbe, 0x6c, 0x16, 0x1c, 0x69, 0xf6, 0x5e, 0x84, 0xd5, - 0xb1, 0x7b, 0x3c, 0x76, 0xfd, 0xd3, 0x88, 0x06, 0x64, 0x85, 0x03, 0xc5, 0xc4, 0x88, 0x28, 0x93, - 0xcf, 0xc4, 0x99, 0x8b, 0x4a, 0x5a, 0x25, 0x90, 0x17, 0x53, 0xd7, 0x81, 0xee, 0x26, 0xb9, 0x83, - 0xec, 0xc7, 0xfd, 0x5c, 0x3e, 0xa3, 0x66, 0x4d, 0x1e, 0x0b, 0xf3, 0xd8, 0xeb, 0xbb, 0xda, 0x5f, - 0x29, 0x82, 0x23, 0x48, 0x9b, 0x3c, 0xf2, 0x48, 0x32, 0xe6, 0xcd, 0x26, 0xd8, 0x90, 0xb4, 0x2a, - 0xb2, 0xdd, 0x23, 0x0f, 0xcf, 0x88, 0x80, 0x48, 0x78, 0x46, 0x84, 0xbc, 0x07, 0x8b, 0x44, 0x2e, - 0x35, 0xbf, 0x29, 0x2c, 0x82, 0x28, 0xcd, 0x3b, 0xbc, 0x4b, 0xee, 0xc0, 0x12, 0x33, 0x02, 0x12, - 0xdd, 0x5d, 0x8f, 0x74, 0xf7, 0xf0, 0xae, 0x29, 0xca, 0xb5, 0x6f, 0x07, 0xef, 0x5a, 0x89, 0x41, - 0x1c, 0xde, 0x25, 0xaf, 0x9f, 0xcf, 0x38, 0x37, 0x2f, 0x8c, 0x73, 0x03, 0xc3, 0xdc, 0x37, 0x22, - 0x86, 0xb9, 0x37, 0xe6, 0xcf, 0x16, 0x7f, 0x8d, 0x64, 0xe1, 0x08, 0xc3, 0x30, 0x55, 0x3f, 0x52, - 0xe0, 0xf9, 0xb9, 0x35, 0xc8, 0x15, 0xc8, 0xeb, 0xad, 0x6a, 0x3b, 0x5c, 0x5f, 0x7a, 0x66, 0x04, - 0x84, 0xec, 0xc3, 0xf2, 0x9e, 0xe3, 0x7b, 0x5d, 0xba, 0x8d, 0x53, 0x9f, 0x07, 0x12, 0xcd, 0x06, - 0xe8, 0x07, 0x17, 0xcc, 0xb0, 0x2e, 0xb1, 0x61, 0x03, 0xcf, 0x42, 0x24, 0xf5, 0x53, 0x36, 0x45, - 0xd7, 0x90, 0x68, 0x30, 0x51, 0x8d, 0xd2, 0x99, 0x04, 0x30, 0x7e, 0x04, 0xdf, 0x16, 0xbc, 0xc8, - 0xec, 0x0e, 0x3e, 0x43, 0x5c, 0xd5, 0xdb, 0x90, 0x6f, 0x09, 0x3b, 0x01, 0xc9, 0x9a, 0x5d, 0xd8, - 0x04, 0x98, 0x41, 0xa9, 0xf6, 0x9b, 0x8a, 0x50, 0x08, 0x3c, 0x7d, 0x20, 0x52, 0xd6, 0xac, 0xde, - 0xfc, 0xac, 0x59, 0xbd, 0x9f, 0x30, 0x6b, 0x96, 0xf6, 0xa7, 0x3c, 0xea, 0x79, 0xb5, 0xd7, 0x8a, - 0x69, 0x66, 0xdf, 0xab, 0x57, 0x82, 0x11, 0xd9, 0x9d, 0x2f, 0x4a, 0x59, 0x17, 0x93, 0xdf, 0x9a, - 0xed, 0x9c, 0x20, 0x6d, 0xd5, 0x3f, 0xc8, 0xc2, 0x95, 0x79, 0xd5, 0x53, 0xf3, 0x3a, 0x2b, 0xcf, - 0x96, 0xd7, 0xf9, 0x0e, 0xe4, 0x19, 0x2c, 0x30, 0xb9, 0xc7, 0x09, 0xe7, 0x55, 0xe9, 0x84, 0x8b, - 0x62, 0xf2, 0x22, 0x2c, 0xea, 0x25, 0x2b, 0x4c, 0x35, 0x86, 0xb6, 0xb1, 0x4e, 0xd7, 0x47, 0xab, - 0x4b, 0x5e, 0x44, 0xbe, 0x90, 0xcc, 0xae, 0xc7, 0x73, 0x8c, 0xed, 0x4a, 0x13, 0x92, 0x48, 0x48, - 0x80, 0xfd, 0x0d, 0x03, 0xe8, 0xf3, 0x98, 0xd4, 0x66, 0x32, 0x53, 0x9f, 0x06, 0x8b, 0xad, 0xb1, - 0xeb, 0xbb, 0x13, 0xd9, 0x6e, 0x75, 0x84, 0x10, 0x93, 0x97, 0x70, 0xab, 0x52, 0xe7, 0x09, 0x0b, - 0x22, 0xb0, 0x28, 0x07, 0x76, 0x41, 0x33, 0x54, 0x0a, 0x36, 0x25, 0x14, 0x5a, 0xa1, 0xe6, 0x4c, - 0x07, 0xdd, 0xd3, 0x8e, 0x59, 0xe3, 0xac, 0x06, 0xab, 0xd0, 0x47, 0x28, 0x1d, 0xa0, 0x6f, 0x4a, - 0x28, 0xda, 0x37, 0x14, 0xb8, 0x94, 0x36, 0x0e, 0x72, 0x05, 0x72, 0x83, 0xd4, 0x44, 0x82, 0x03, - 0xe6, 0xfb, 0x5c, 0xa0, 0x7f, 0xed, 0xe3, 0xe1, 0xf8, 0xcc, 0x99, 0xc8, 0xd6, 0xbd, 0x12, 0xd8, - 0x04, 0xfa, 0xa3, 0x82, 0xff, 0x93, 0x6b, 0x82, 0x46, 0x67, 0x13, 0xa9, 0x07, 0xf1, 0x8f, 0xa6, - 0x03, 0x54, 0x7b, 0xad, 0xe6, 0x88, 0x05, 0xc4, 0x7f, 0x15, 0x72, 0xb4, 0x5b, 0xb1, 0xdd, 0x4b, - 0xf7, 0x8f, 0x5e, 0xaf, 0x71, 0x24, 0xd6, 0x2b, 0xdf, 0x39, 0xeb, 0x9b, 0x88, 0xac, 0x1d, 0xc1, - 0x5a, 0x14, 0x83, 0x18, 0xd1, 0x10, 0xaa, 0x85, 0x7b, 0x2a, 0x6f, 0x69, 0x6f, 0x38, 0x64, 0x1e, - 0x26, 0x7b, 0xcf, 0xfd, 0xfd, 0x3b, 0xd7, 0x80, 0xfe, 0x64, 0x75, 0xd2, 0x42, 0xac, 0x6a, 0xdf, - 0xcc, 0xc0, 0xa5, 0xd0, 0xa9, 0x5d, 0x9c, 0xa1, 0x9f, 0x59, 0x0f, 0x4b, 0x3d, 0xe2, 0x01, 0x28, - 0x18, 0xad, 0xe4, 0x00, 0xe7, 0x38, 0x1e, 0xed, 0xc3, 0xf6, 0x2c, 0x7c, 0xf2, 0x12, 0x2c, 0x63, - 0x1c, 0xa4, 0x91, 0xd3, 0x75, 0x65, 0xda, 0x37, 0x10, 0x40, 0x33, 0x2c, 0xd7, 0x7e, 0xa0, 0xc0, - 0x0e, 0xf7, 0x8b, 0xa8, 0x3b, 0xde, 0x00, 0xd5, 0xea, 0x5d, 0xf7, 0xfd, 0xf1, 0x10, 0xde, 0x8f, - 0xd0, 0xb1, 0x9b, 0x51, 0xf7, 0x97, 0xc4, 0xd7, 0x66, 0x8f, 0x96, 0xdc, 0xc1, 0xd8, 0x5e, 0xfc, - 0xd9, 0x39, 0xc7, 0x22, 0x32, 0x0c, 0x28, 0x40, 0x8e, 0xc8, 0x80, 0x18, 0xda, 0xaf, 0xc0, 0xd5, - 0xf9, 0x1f, 0x20, 0x9f, 0x87, 0x55, 0x4c, 0x16, 0xd5, 0x19, 0x9d, 0x8c, 0x9d, 0x9e, 0x2b, 0x54, - 0x61, 0x42, 0x7d, 0x29, 0x97, 0xb1, 0x50, 0x65, 0x3c, 0x42, 0xc0, 0x09, 0xa6, 0xa1, 0xe2, 0x95, - 0x22, 0xce, 0x47, 0x72, 0x6b, 0xda, 0xaf, 0x2a, 0x40, 0x92, 0x6d, 0x90, 0x8f, 0xc0, 0x4a, 0xa7, - 0x5d, 0xb2, 0x26, 0xce, 0x78, 0x72, 0x30, 0x9c, 0x8e, 0x79, 0x9c, 0x30, 0xe6, 0x30, 0x3e, 0xe9, - 0xda, 0xec, 0x01, 0xe5, 0x74, 0x38, 0x1d, 0x9b, 0x11, 0x3c, 0xcc, 0x72, 0xe4, 0xba, 0x5f, 0xea, - 0x39, 0x4f, 0xa2, 0x59, 0x8e, 0x38, 0x2c, 0x92, 0xe5, 0x88, 0xc3, 0xb4, 0xef, 0x28, 0xb0, 0x2b, - 0xac, 0x09, 0x7b, 0x29, 0x7d, 0x29, 0x61, 0x58, 0x94, 0xb1, 0x08, 0x4c, 0x3b, 0x8f, 0xa5, 0xdd, - 0x10, 0x91, 0x83, 0xb0, 0x83, 0xc8, 0xdb, 0xb2, 0xba, 0xe4, 0x53, 0x90, 0xb3, 0x26, 0xc3, 0xd1, - 0x39, 0x42, 0x07, 0xa9, 0xc1, 0x8a, 0x4e, 0x86, 0x23, 0x6c, 0x02, 0x6b, 0x6a, 0x2e, 0x5c, 0x92, - 0x3b, 0x27, 0x7a, 0x4c, 0xea, 0xb0, 0xc4, 0x63, 0xc4, 0xc5, 0x1e, 0xea, 0xe7, 0x8c, 0x69, 0x6f, - 0x5d, 0xc4, 0x27, 0xe2, 0x81, 0x51, 0x4d, 0xd1, 0x86, 0xf6, 0xdb, 0x0a, 0x14, 0x28, 0xb7, 0x81, - 0x52, 0xdc, 0x7b, 0xdd, 0xd2, 0x51, 0xc6, 0x51, 0xd8, 0x9d, 0x04, 0xcd, 0x9f, 0xeb, 0x36, 0x7e, - 0x0d, 0xd6, 0x63, 0x15, 0x88, 0x86, 0x91, 0x29, 0xfa, 0x5e, 0xd7, 0x61, 0x49, 0x53, 0x98, 0xcd, - 0x46, 0x04, 0xa6, 0xfd, 0xba, 0x02, 0x97, 0xa8, 0xcc, 0xcf, 0xde, 0x39, 0xcd, 0x69, 0x5f, 0x9c, - 0x77, 0xca, 0x41, 0x09, 0xb3, 0x54, 0xe6, 0x35, 0xcf, 0x38, 0x28, 0x0e, 0x33, 0x83, 0x52, 0x72, - 0x00, 0x79, 0x7e, 0xbf, 0xf8, 0x3c, 0x9e, 0xe9, 0x55, 0x49, 0x99, 0x10, 0x36, 0xcc, 0x91, 0xe8, - 0x48, 0x90, 0x84, 0xf1, 0x3a, 0x66, 0x50, 0x5b, 0xfb, 0x2f, 0x05, 0xb6, 0x66, 0xd4, 0x21, 0x1f, - 0x87, 0x05, 0xf4, 0xe8, 0xe3, 0xab, 0x77, 0x65, 0xc6, 0x27, 0x26, 0xdd, 0xd3, 0xc3, 0xbb, 0xec, - 0x22, 0x3a, 0xa3, 0x3f, 0x4c, 0x56, 0x8b, 0x3c, 0x82, 0x65, 0xbd, 0xd7, 0xe3, 0xe2, 0x4c, 0x26, - 0x22, 0xce, 0xcc, 0xf8, 0xe2, 0x2b, 0x01, 0x3e, 0x13, 0x67, 0x98, 0x6f, 0x49, 0xaf, 0x67, 0x73, - 0x6f, 0xc5, 0xb0, 0xbd, 0x9d, 0x5f, 0x84, 0xb5, 0x28, 0xf2, 0x33, 0x39, 0x58, 0x7d, 0x5b, 0x01, - 0x35, 0xda, 0x87, 0x9f, 0x4e, 0x64, 0xa5, 0xb4, 0x65, 0x7e, 0xca, 0xa6, 0xfa, 0xdd, 0x0c, 0x5c, - 0x4e, 0x9d, 0x61, 0xf2, 0x32, 0x2c, 0xea, 0xa3, 0x51, 0xb5, 0xcc, 0x77, 0x15, 0xe7, 0x90, 0x50, - 0x4b, 0x1c, 0x91, 0xf6, 0x18, 0x12, 0x79, 0x15, 0xf2, 0xec, 0x39, 0xbd, 0x2c, 0x08, 0x0e, 0x86, - 0x8a, 0xe1, 0x6f, 0xfd, 0xd1, 0xc8, 0xa2, 0x02, 0x91, 0x54, 0x60, 0x8d, 0x07, 0x59, 0x31, 0xdd, - 0x13, 0xf7, 0x2b, 0x41, 0x88, 0x7b, 0x8c, 0xc2, 0x2f, 0x54, 0xcf, 0xf6, 0x98, 0x95, 0xc9, 0x61, - 0x46, 0xa2, 0xb5, 0x48, 0x0d, 0x54, 0x6c, 0x53, 0x6e, 0x89, 0x85, 0x37, 0xc5, 0xb0, 0x37, 0xac, - 0x13, 0x33, 0xda, 0x4a, 0xd4, 0x0c, 0x96, 0x4b, 0xf7, 0x7d, 0xef, 0x64, 0x70, 0xe6, 0x0e, 0x26, - 0x3f, 0xbd, 0xe5, 0x0a, 0xbf, 0x71, 0xae, 0xe5, 0xfa, 0xfd, 0x1c, 0x3b, 0xcc, 0xf1, 0x6a, 0x94, - 0xa3, 0x91, 0x22, 0x5a, 0x23, 0x47, 0x43, 0x85, 0x26, 0x1e, 0x46, 0xa4, 0x0c, 0x4b, 0x2c, 0xbc, - 0x8b, 0x38, 0x19, 0xcf, 0xa7, 0x76, 0x81, 0xe1, 0x1c, 0xde, 0x65, 0xec, 0x0b, 0x73, 0x2d, 0xf4, - 0x4d, 0x51, 0x95, 0x1c, 0x42, 0xa1, 0xd4, 0x77, 0x9d, 0xc1, 0x74, 0xd4, 0x3e, 0xdf, 0x93, 0xe3, - 0x36, 0x1f, 0xcb, 0x4a, 0x97, 0x55, 0xc3, 0xa7, 0x4a, 0xa4, 0xe4, 0x72, 0x43, 0xa4, 0x1d, 0x78, - 0x1b, 0xe5, 0x50, 0x53, 0xf9, 0xe1, 0x39, 0xf3, 0x13, 0x07, 0x62, 0xbd, 0xa8, 0x2b, 0x1d, 0x77, - 0x47, 0xb2, 0x61, 0xad, 0xe6, 0xf8, 0x93, 0xf6, 0xd8, 0x19, 0xf8, 0x18, 0x16, 0xf2, 0x1c, 0x61, - 0xb3, 0x76, 0x45, 0xca, 0x61, 0xd4, 0x31, 0x4e, 0x82, 0xaa, 0x4c, 0x83, 0x19, 0x6d, 0x8e, 0xf2, - 0x4b, 0x15, 0x6f, 0xe0, 0xf4, 0xbd, 0xaf, 0x0a, 0xa7, 0x4c, 0xc6, 0x2f, 0x1d, 0x0b, 0xa0, 0x19, - 0x96, 0x6b, 0x9f, 0x4b, 0xac, 0x1b, 0xeb, 0x65, 0x01, 0x96, 0xb8, 0xcb, 0x3e, 0x73, 0x61, 0x6f, - 0x19, 0x8d, 0x72, 0xb5, 0xb1, 0xaf, 0x2a, 0x64, 0x0d, 0xa0, 0x65, 0x36, 0x4b, 0x86, 0x65, 0xd1, - 0xdf, 0x19, 0xfa, 0x9b, 0xfb, 0xb7, 0x57, 0x3a, 0x35, 0x35, 0x2b, 0xb9, 0xb8, 0xe7, 0xb4, 0xef, - 0x2b, 0xb0, 0x99, 0xbe, 0x94, 0xa4, 0x0d, 0x18, 0xe4, 0x80, 0x3f, 0x3e, 0x7f, 0x64, 0xee, 0xba, - 0xa7, 0x82, 0xe3, 0xc1, 0x12, 0x26, 0xcc, 0x09, 0x3f, 0x23, 0x1e, 0x8b, 0x98, 0x57, 0x9f, 0xd7, - 0x33, 0x33, 0x5e, 0x4f, 0x2b, 0xc1, 0xf6, 0xac, 0x36, 0xa2, 0x43, 0x5d, 0x87, 0x82, 0xde, 0x6a, - 0xd5, 0xaa, 0x25, 0xbd, 0x5d, 0x6d, 0x36, 0x54, 0x85, 0x2c, 0xc3, 0xc2, 0xbe, 0xd9, 0xec, 0xb4, - 0xd4, 0x8c, 0xf6, 0x2d, 0x05, 0x56, 0xab, 0xa1, 0x99, 0xd6, 0x7b, 0x3d, 0x7c, 0x1f, 0x8d, 0x1c, - 0xbe, 0xed, 0x20, 0x1c, 0x48, 0xf0, 0x81, 0x73, 0x9d, 0xbc, 0xbf, 0x53, 0x60, 0x23, 0x51, 0x87, - 0x58, 0xb0, 0xa4, 0x1f, 0x59, 0xcd, 0x6a, 0xb9, 0xc4, 0x7b, 0x76, 0x2d, 0xb4, 0x2f, 0xc2, 0x8c, - 0x4f, 0x89, 0xaf, 0x30, 0x17, 0xda, 0xc7, 0xbe, 0x3d, 0xf4, 0x7a, 0x52, 0xb6, 0xd6, 0x83, 0x0b, - 0xa6, 0x68, 0x09, 0x6f, 0xb2, 0xaf, 0x4e, 0xc7, 0x2e, 0x36, 0x9b, 0x89, 0x28, 0x42, 0x03, 0x78, - 0xb2, 0x61, 0x74, 0x78, 0x70, 0x68, 0x79, 0xb2, 0xe9, 0xb0, 0xbd, 0xbd, 0x55, 0x28, 0x70, 0xa9, - 0x05, 0x05, 0x82, 0xef, 0x2a, 0xb0, 0x3d, 0xab, 0xaf, 0x54, 0x10, 0x8a, 0xfa, 0xd3, 0x6f, 0x06, - 0x19, 0x1c, 0xa2, 0x8e, 0xf4, 0x02, 0x8d, 0x7c, 0x12, 0x0a, 0x55, 0xdf, 0x9f, 0xba, 0x63, 0xeb, - 0xd5, 0x8e, 0x59, 0xe5, 0x1b, 0xe4, 0xf9, 0x7f, 0x7f, 0xe7, 0xda, 0x16, 0xba, 0x25, 0x8c, 0x6d, - 0xff, 0x55, 0x7b, 0x3a, 0xf6, 0x22, 0xd1, 0xee, 0xe5, 0x1a, 0x94, 0x6f, 0x75, 0xa6, 0x3d, 0xcf, - 0x15, 0x5c, 0xbb, 0xf0, 0x39, 0xe6, 0x30, 0xf9, 0x16, 0x11, 0x30, 0xed, 0xeb, 0x0a, 0xec, 0xcc, - 0x9e, 0x18, 0x7a, 0x33, 0xb5, 0x99, 0xd5, 0x8f, 0xf0, 0xfa, 0xc5, 0x9b, 0x29, 0x30, 0x0d, 0x92, - 0xdb, 0x14, 0x88, 0xb4, 0x52, 0x90, 0x3d, 0x3d, 0x93, 0x48, 0x99, 0x1c, 0xad, 0x24, 0x10, 0xb5, - 0xff, 0xc8, 0xc0, 0x26, 0xdd, 0x74, 0x7d, 0xd7, 0xf7, 0xf5, 0xe9, 0xe4, 0xd4, 0x1d, 0x4c, 0x38, - 0x1b, 0x46, 0x5e, 0x87, 0xc5, 0xd3, 0x67, 0x53, 0x39, 0x32, 0x74, 0x42, 0x00, 0x09, 0xb9, 0x70, - 0xb2, 0xa0, 0xff, 0x93, 0xeb, 0x20, 0x27, 0xa9, 0xce, 0x62, 0x98, 0xcc, 0xcc, 0xb6, 0x62, 0x2e, - 0x8f, 0x82, 0x7c, 0xb2, 0x6f, 0xc0, 0x02, 0xaa, 0x19, 0x38, 0x49, 0x15, 0xac, 0x70, 0x7a, 0xef, - 0x50, 0x09, 0x61, 0xb2, 0x0a, 0xe4, 0x43, 0x00, 0x61, 0x86, 0x01, 0x4e, 0x33, 0x85, 0xf8, 0x1d, - 0x24, 0x19, 0x30, 0x97, 0xcf, 0x8e, 0x1d, 0x1e, 0xb6, 0xbf, 0x08, 0x1b, 0x62, 0x5a, 0x46, 0x22, - 0xba, 0x1e, 0x7f, 0x0d, 0x5b, 0x67, 0x05, 0xd5, 0x91, 0x88, 0xb0, 0x77, 0x23, 0x91, 0x68, 0x17, - 0x83, 0xec, 0xc6, 0xb2, 0xe9, 0xde, 0x48, 0x64, 0xd3, 0xcd, 0x33, 0x2c, 0x39, 0x65, 0xae, 0xf6, - 0x2f, 0x19, 0x58, 0x3e, 0xa2, 0xcc, 0x0a, 0x8a, 0xe0, 0xf3, 0x45, 0xfa, 0x7b, 0x50, 0xa8, 0x0d, - 0x1d, 0xfe, 0xec, 0xc0, 0x7d, 0x13, 0x98, 0x6f, 0x70, 0x7f, 0xe8, 0x88, 0x17, 0x0c, 0xdf, 0x94, - 0x91, 0x9e, 0xe2, 0xd7, 0x7c, 0x1f, 0x16, 0xd9, 0x33, 0x10, 0xd7, 0x2e, 0x09, 0x76, 0x35, 0xe8, - 0xd1, 0x2b, 0xac, 0x58, 0xd2, 0x94, 0xb3, 0xa7, 0x24, 0x99, 0x77, 0xe2, 0xb1, 0x42, 0x25, 0x85, - 0xc3, 0xc2, 0xf9, 0x14, 0x0e, 0x52, 0x4c, 0xb4, 0xc5, 0xf3, 0xc4, 0x44, 0xdb, 0x79, 0x13, 0x0a, - 0x52, 0x7f, 0x9e, 0x89, 0x7b, 0xfd, 0x5a, 0x06, 0x56, 0x71, 0x54, 0x81, 0x4d, 0xc8, 0xcf, 0xa6, - 0xfa, 0xe4, 0xa3, 0x11, 0xf5, 0xc9, 0xb6, 0xbc, 0x5e, 0x6c, 0x64, 0x73, 0xf4, 0x26, 0xf7, 0x61, - 0x23, 0x81, 0x48, 0x5e, 0x83, 0x05, 0xda, 0x7d, 0x21, 0x6e, 0xaa, 0xf1, 0x1d, 0x10, 0xc6, 0xcf, - 0xa5, 0x03, 0xf7, 0x4d, 0x86, 0xad, 0xfd, 0xb7, 0x02, 0x2b, 0x3c, 0x7d, 0xc5, 0xe0, 0x78, 0xf8, - 0xd4, 0xe9, 0xbc, 0x15, 0x9f, 0x4e, 0x16, 0xa5, 0x83, 0x4f, 0xe7, 0xff, 0xf6, 0x24, 0xbe, 0x19, - 0x99, 0xc4, 0xad, 0x20, 0x9a, 0x9e, 0x18, 0xce, 0x9c, 0x39, 0xfc, 0x6b, 0x8c, 0x2f, 0x1b, 0x45, - 0x24, 0x5f, 0x80, 0xe5, 0x86, 0xfb, 0x38, 0x22, 0xb5, 0xdd, 0x9a, 0xd1, 0xe8, 0x2b, 0x01, 0x22, - 0x3b, 0x53, 0x78, 0xe1, 0x0d, 0xdc, 0xc7, 0x76, 0xe2, 0x05, 0x2a, 0x6c, 0x92, 0x0a, 0x6e, 0xd1, - 0x6a, 0xcf, 0xb2, 0xf5, 0xb9, 0xa3, 0x24, 0x06, 0x9e, 0xf9, 0x46, 0x16, 0x20, 0xf4, 0x31, 0xa3, - 0x07, 0x30, 0xf2, 0xf8, 0x2e, 0x14, 0xde, 0x08, 0x92, 0xf7, 0xb8, 0x78, 0x93, 0xbf, 0xc5, 0x15, - 0xb3, 0x99, 0xd9, 0xd1, 0x0e, 0x51, 0x45, 0x5b, 0xe2, 0x4e, 0x4d, 0x3d, 0xb7, 0xef, 0x30, 0xda, - 0x9e, 0xdd, 0xbb, 0x81, 0xc1, 0x6d, 0x03, 0xe8, 0x8c, 0x3c, 0xc4, 0xe8, 0xfa, 0x54, 0xa6, 0x08, - 0x09, 0xbf, 0xcd, 0xdc, 0xb3, 0xf9, 0x6d, 0xb6, 0x60, 0xd9, 0x1b, 0xbc, 0xed, 0x0e, 0x26, 0xc3, - 0xf1, 0x13, 0xd4, 0x46, 0x87, 0x6a, 0x2e, 0x3a, 0x05, 0x55, 0x51, 0xc6, 0xd6, 0x01, 0x2f, 0xc6, - 0x00, 0x5f, 0x5e, 0x86, 0x00, 0x18, 0xf8, 0x9d, 0x2e, 0xa8, 0x8b, 0xf7, 0x73, 0xf9, 0x45, 0x75, - 0xe9, 0x7e, 0x2e, 0x9f, 0x57, 0x97, 0xef, 0xe7, 0xf2, 0xcb, 0x2a, 0x98, 0xd2, 0xfb, 0x4e, 0xf0, - 0x7e, 0x23, 0x3d, 0xb9, 0x44, 0x9f, 0x53, 0xb4, 0x1f, 0x67, 0x80, 0x24, 0xbb, 0x41, 0x3e, 0x0a, - 0x05, 0x46, 0x60, 0xed, 0xb1, 0xff, 0x65, 0x6e, 0xb6, 0xce, 0xc2, 0xf7, 0x48, 0x60, 0x39, 0x7c, - 0x0f, 0x03, 0x9b, 0xfe, 0x97, 0xfb, 0xe4, 0xf3, 0x70, 0x11, 0xa7, 0x77, 0xe4, 0x8e, 0xbd, 0x61, - 0xcf, 0xc6, 0x58, 0xab, 0x4e, 0x9f, 0xe7, 0x0c, 0x7c, 0x19, 0x93, 0xdb, 0x26, 0x8b, 0x67, 0x2c, - 0x03, 0xba, 0x92, 0xb5, 0x10, 0xb3, 0xc5, 0x10, 0x49, 0x1b, 0x54, 0xb9, 0xfe, 0xf1, 0xb4, 0xdf, - 0xe7, 0x2b, 0x5b, 0xa4, 0x82, 0x6e, 0xbc, 0x6c, 0x46, 0xc3, 0x6b, 0x61, 0xc3, 0x95, 0x69, 0xbf, - 0x4f, 0x5e, 0x07, 0x18, 0x0e, 0xec, 0x33, 0xcf, 0xf7, 0xd9, 0x1b, 0x47, 0xe0, 0xf5, 0x1a, 0x42, - 0xe5, 0xc5, 0x18, 0x0e, 0xea, 0x0c, 0x48, 0x7e, 0x01, 0xd0, 0xeb, 0x1f, 0xc3, 0x61, 0x30, 0xab, - 0x16, 0x9e, 0x05, 0x44, 0x00, 0xa3, 0x4e, 0xb6, 0x27, 0xae, 0xe5, 0x7d, 0x55, 0xb8, 0x0c, 0x7c, - 0x16, 0x36, 0xb8, 0x11, 0xea, 0x91, 0x37, 0x39, 0xe5, 0x1c, 0xf6, 0x7b, 0x61, 0xcf, 0x25, 0x16, - 0xfb, 0x1f, 0x72, 0x00, 0xfa, 0x91, 0x25, 0x22, 0x4d, 0xdd, 0x81, 0x05, 0x2a, 0x37, 0x08, 0xfd, - 0x03, 0x6a, 0x6f, 0xb1, 0x5d, 0x59, 0x7b, 0x8b, 0x18, 0xf4, 0x34, 0x9a, 0x68, 0x9c, 0x2d, 0x74, - 0x0f, 0x78, 0x1a, 0x99, 0xbd, 0x76, 0x24, 0xd2, 0x2f, 0xc7, 0x22, 0x35, 0x80, 0x30, 0xf6, 0x13, - 0x97, 0x64, 0x37, 0xc2, 0x20, 0x2a, 0xbc, 0x80, 0x67, 0x1b, 0x08, 0xe3, 0x47, 0xc9, 0xdb, 0x27, - 0x44, 0x23, 0x0f, 0x20, 0xd7, 0x76, 0x02, 0x9f, 0xce, 0x19, 0x11, 0xb1, 0x5e, 0xe0, 0x39, 0x1d, - 0xc3, 0xa8, 0x58, 0x6b, 0x13, 0x27, 0x92, 0xfa, 0x16, 0x1b, 0x21, 0x06, 0x2c, 0xf2, 0x7c, 0xdd, - 0x33, 0x22, 0x29, 0xf2, 0x74, 0xdd, 0x3c, 0x7e, 0x32, 0x02, 0x65, 0x9e, 0x82, 0x67, 0xe6, 0xbe, - 0x07, 0x59, 0xcb, 0xaa, 0xf3, 0x38, 0x10, 0xab, 0xa1, 0x54, 0x62, 0x59, 0x75, 0xf6, 0x46, 0xe9, - 0xfb, 0x67, 0x52, 0x35, 0x8a, 0x4c, 0x3e, 0x06, 0x05, 0x89, 0x7d, 0xe6, 0x11, 0x54, 0x70, 0x0e, - 0x24, 0xaf, 0x19, 0x99, 0x68, 0x48, 0xd8, 0xa4, 0x06, 0xea, 0x83, 0xe9, 0x5b, 0xae, 0x3e, 0x1a, - 0xa1, 0x3b, 0xdd, 0xdb, 0xee, 0x98, 0xb1, 0x6d, 0xf9, 0x30, 0xf4, 0x30, 0xda, 0xda, 0xf7, 0x44, - 0xa9, 0xac, 0x83, 0x89, 0xd7, 0x24, 0x2d, 0xd8, 0xb0, 0xdc, 0xc9, 0x74, 0xc4, 0xec, 0x34, 0x2a, - 0xc3, 0x31, 0x15, 0x42, 0x58, 0xbc, 0x15, 0x8c, 0xd2, 0xea, 0xd3, 0x42, 0x61, 0x1c, 0x73, 0x3c, - 0x1c, 0xc7, 0x04, 0x92, 0x64, 0x65, 0xcd, 0x95, 0x97, 0x9c, 0xde, 0xaa, 0x51, 0xd1, 0x06, 0x6f, - 0x55, 0x21, 0xda, 0x84, 0x02, 0xcd, 0x87, 0x52, 0x62, 0x82, 0xe1, 0x83, 0x99, 0x14, 0x13, 0x2c, - 0x12, 0x09, 0xec, 0x3b, 0x39, 0x29, 0x2c, 0x25, 0x5f, 0x8b, 0x8f, 0x03, 0xdc, 0x1f, 0x7a, 0x83, - 0xba, 0x3b, 0x39, 0x1d, 0xf6, 0xa4, 0xd0, 0x64, 0x85, 0x5f, 0x1a, 0x7a, 0x03, 0xfb, 0x0c, 0xc1, - 0x3f, 0x7e, 0xe7, 0x9a, 0x84, 0x64, 0x4a, 0xff, 0x93, 0x0f, 0xc2, 0x32, 0xfd, 0xd5, 0x0e, 0xad, - 0x4d, 0x98, 0xaa, 0x12, 0x6b, 0xb3, 0xe4, 0x0d, 0x21, 0x02, 0x79, 0x13, 0xd3, 0x95, 0x78, 0xa3, - 0x89, 0xc4, 0xbc, 0x8a, 0xdc, 0x24, 0xde, 0x68, 0x12, 0x8f, 0x34, 0x2c, 0x21, 0x93, 0x83, 0xa0, - 0xeb, 0x22, 0xc3, 0x10, 0xcf, 0x8a, 0x82, 0xfa, 0x38, 0xbe, 0xd7, 0x6c, 0x11, 0xe2, 0x54, 0xce, - 0x05, 0x1b, 0xab, 0x86, 0x9d, 0xb0, 0x0e, 0xca, 0xec, 0x01, 0x85, 0x33, 0xb5, 0xac, 0x13, 0xfe, - 0x69, 0xcf, 0xee, 0x22, 0x38, 0xd2, 0x89, 0x00, 0x99, 0xec, 0xc1, 0x3a, 0xe3, 0xf1, 0x83, 0x4c, - 0x85, 0x9c, 0xc5, 0x45, 0xda, 0x16, 0xa6, 0x32, 0x94, 0x3f, 0x1f, 0xab, 0x40, 0x2a, 0xb0, 0x80, - 0x02, 0x21, 0x37, 0x31, 0xdf, 0x95, 0xa5, 0xe7, 0xf8, 0x39, 0x42, 0xba, 0x82, 0x72, 0xb3, 0x4c, - 0x57, 0x10, 0x95, 0x7c, 0x06, 0xc0, 0x18, 0x8c, 0x87, 0xfd, 0x3e, 0x06, 0xe1, 0xcd, 0xa3, 0x28, - 0xf5, 0x7c, 0xf4, 0x3c, 0x62, 0x2b, 0x21, 0x12, 0x0f, 0x18, 0x87, 0xbf, 0xed, 0x58, 0xa8, 0x5e, - 0xa9, 0x2d, 0xad, 0x0a, 0x8b, 0xec, 0x30, 0x62, 0x40, 0x6b, 0x9e, 0xa2, 0x43, 0x0a, 0x87, 0xcc, - 0x02, 0x5a, 0x73, 0x78, 0x32, 0xa0, 0xb5, 0x54, 0x41, 0x7b, 0x00, 0x97, 0xd2, 0x06, 0x16, 0x11, - 0x61, 0x95, 0xf3, 0x8a, 0xb0, 0x7f, 0x94, 0x85, 0x15, 0x6c, 0x4d, 0x50, 0x61, 0x1d, 0x56, 0xad, - 0xe9, 0x5b, 0x41, 0xb4, 0x27, 0x41, 0x8d, 0xb1, 0x7f, 0xbe, 0x5c, 0x20, 0x3f, 0x6d, 0x45, 0x6a, - 0x10, 0x03, 0xd6, 0xc4, 0x4d, 0xb0, 0x2f, 0x2c, 0xd0, 0x83, 0x58, 0xd2, 0x22, 0x62, 0x61, 0x32, - 0x53, 0x6b, 0xac, 0x52, 0x78, 0x1f, 0x64, 0x9f, 0xe5, 0x3e, 0xc8, 0x9d, 0xeb, 0x3e, 0x78, 0x04, - 0x2b, 0xe2, 0x6b, 0x48, 0xc9, 0x17, 0xde, 0x1b, 0x25, 0x8f, 0x34, 0x46, 0x6a, 0x01, 0x45, 0x5f, - 0x9c, 0x4b, 0xd1, 0xf1, 0xbd, 0x50, 0x9c, 0xb2, 0x11, 0xc2, 0x92, 0x84, 0x1d, 0x53, 0x19, 0xee, - 0x97, 0x5a, 0x3f, 0xc1, 0x2d, 0xf9, 0x1a, 0x2c, 0xd7, 0x86, 0xe2, 0xa9, 0x48, 0xd2, 0xd1, 0xf7, - 0x05, 0x50, 0x66, 0x17, 0x02, 0xcc, 0xe0, 0x76, 0xcb, 0xbe, 0x1f, 0xb7, 0xdb, 0x9b, 0x00, 0xdc, - 0xb5, 0x21, 0x4c, 0x41, 0x86, 0x47, 0x46, 0x44, 0xba, 0x88, 0x3e, 0x15, 0x48, 0xc8, 0x94, 0x3a, - 0x71, 0x2b, 0x14, 0xbd, 0xdb, 0x1d, 0x4e, 0x07, 0x93, 0x48, 0xce, 0x5e, 0xe1, 0x09, 0xe9, 0xf0, - 0x32, 0x99, 0x3c, 0xc4, 0xaa, 0xbd, 0xbf, 0x0b, 0x42, 0x3e, 0x1d, 0x18, 0xd1, 0x2d, 0xcd, 0x9b, - 0x21, 0x2d, 0x31, 0x43, 0x33, 0x4d, 0xe7, 0xb4, 0xef, 0x2b, 0x72, 0x20, 0xff, 0x9f, 0x60, 0xa9, - 0xdf, 0x00, 0x08, 0xde, 0xea, 0xc5, 0x5a, 0x33, 0x79, 0x29, 0x80, 0xca, 0xb3, 0x1c, 0xe2, 0x4a, - 0xa3, 0xc9, 0xbe, 0x5f, 0xa3, 0x69, 0x43, 0xa1, 0xf9, 0xa5, 0x89, 0x13, 0x1a, 0x77, 0x80, 0x15, - 0x70, 0xb2, 0x48, 0x99, 0xb2, 0x7b, 0x37, 0xf1, 0x6e, 0x08, 0xf9, 0xe0, 0x19, 0x2c, 0xb0, 0x54, - 0x51, 0xfb, 0x73, 0x05, 0xd6, 0x65, 0xf7, 0xed, 0x27, 0x83, 0x2e, 0xf9, 0x04, 0x8b, 0x2b, 0xaa, - 0x44, 0x44, 0x16, 0x09, 0x89, 0x92, 0xdc, 0x27, 0x83, 0x2e, 0x63, 0x80, 0x9c, 0xc7, 0x72, 0x67, - 0x69, 0x45, 0xf2, 0x16, 0xac, 0xb4, 0x86, 0xfd, 0x3e, 0x65, 0x6b, 0xc6, 0x6f, 0x73, 0x01, 0x80, - 0x36, 0x14, 0x7f, 0x31, 0x10, 0x1d, 0xda, 0x7b, 0x91, 0xcb, 0xb9, 0x5b, 0x23, 0x4a, 0xef, 0x3d, - 0x5e, 0x2f, 0x6c, 0xf6, 0xdb, 0xe8, 0x6f, 0x25, 0xb7, 0xa9, 0xfd, 0x50, 0x01, 0x92, 0xec, 0x92, - 0x4c, 0xb2, 0x94, 0xff, 0x03, 0x16, 0x36, 0xc6, 0xfa, 0xe5, 0x9e, 0x85, 0xf5, 0x2b, 0xfe, 0x8e, - 0x02, 0xeb, 0x55, 0xbd, 0xce, 0x43, 0xfb, 0xb3, 0x87, 0x8d, 0xeb, 0xf0, 0x7c, 0x55, 0xaf, 0xdb, - 0xad, 0x66, 0xad, 0x5a, 0x7a, 0x68, 0xa7, 0x46, 0xec, 0x7d, 0x1e, 0x9e, 0x4b, 0xa2, 0x84, 0x0f, - 0x20, 0x57, 0x60, 0x3b, 0x59, 0x2c, 0xa2, 0xfa, 0xa6, 0x57, 0x16, 0x01, 0x80, 0xb3, 0xc5, 0x4f, - 0xc2, 0xba, 0x88, 0x60, 0xdb, 0xae, 0x59, 0x18, 0x23, 0x7f, 0x1d, 0x0a, 0x87, 0x86, 0x59, 0xad, - 0x3c, 0xb4, 0x2b, 0x9d, 0x5a, 0x4d, 0xbd, 0x40, 0x56, 0x61, 0x99, 0x03, 0x4a, 0xba, 0xaa, 0x90, - 0x15, 0xc8, 0x57, 0x1b, 0x96, 0x51, 0xea, 0x98, 0x86, 0x9a, 0x29, 0x7e, 0x12, 0xd6, 0x5a, 0x63, - 0xef, 0x6d, 0x67, 0xe2, 0x3e, 0x70, 0x9f, 0xe0, 0xfb, 0xc5, 0x12, 0x64, 0x4d, 0xfd, 0x48, 0xbd, - 0x40, 0x00, 0x16, 0x5b, 0x0f, 0x4a, 0xd6, 0xdd, 0xbb, 0xaa, 0x42, 0x0a, 0xb0, 0xb4, 0x5f, 0x6a, - 0xd9, 0x0f, 0xea, 0x96, 0x9a, 0xa1, 0x3f, 0xf4, 0x23, 0x0b, 0x7f, 0x64, 0x8b, 0x1f, 0x86, 0x0d, - 0x64, 0x48, 0x6a, 0x9e, 0x3f, 0x71, 0x07, 0xee, 0x18, 0xfb, 0xb0, 0x02, 0x79, 0xcb, 0xa5, 0x94, - 0x64, 0xe2, 0xb2, 0x0e, 0xd4, 0xa7, 0xfd, 0x89, 0x37, 0xea, 0xbb, 0x5f, 0x51, 0x95, 0xe2, 0x9b, - 0xb0, 0x6e, 0x0e, 0xa7, 0x13, 0x6f, 0x70, 0x62, 0x4d, 0x28, 0xc6, 0xc9, 0x13, 0x72, 0x19, 0x36, - 0x3a, 0x0d, 0xbd, 0xbe, 0x57, 0xdd, 0xef, 0x34, 0x3b, 0x96, 0x5d, 0xd7, 0xdb, 0xa5, 0x03, 0xf6, - 0x7a, 0x52, 0x6f, 0x5a, 0x6d, 0xdb, 0x34, 0x4a, 0x46, 0xa3, 0xad, 0x2a, 0xc5, 0x6f, 0xa2, 0x6e, - 0xa5, 0x3b, 0x1c, 0xf4, 0x2a, 0x4e, 0x77, 0x32, 0x1c, 0x63, 0x87, 0x35, 0xb8, 0x6a, 0x19, 0xa5, - 0x66, 0xa3, 0x6c, 0x57, 0xf4, 0x52, 0xbb, 0x69, 0xa6, 0x85, 0x8c, 0xde, 0x81, 0xcd, 0x14, 0x9c, - 0x66, 0xbb, 0xa5, 0x2a, 0xe4, 0x1a, 0xec, 0xa6, 0x94, 0x1d, 0x19, 0x7b, 0x7a, 0xa7, 0x7d, 0xd0, - 0x50, 0x33, 0x33, 0x2a, 0x5b, 0x56, 0x53, 0xcd, 0x16, 0x7f, 0x43, 0x81, 0xb5, 0x8e, 0xcf, 0x4d, - 0x97, 0x3b, 0xe8, 0xb5, 0xf8, 0x02, 0x5c, 0xe9, 0x58, 0x86, 0x69, 0xb7, 0x9b, 0x0f, 0x8c, 0x86, - 0xdd, 0xb1, 0xf4, 0xfd, 0x78, 0x6f, 0xae, 0xc1, 0xae, 0x84, 0x61, 0x1a, 0xa5, 0xe6, 0xa1, 0x61, - 0xda, 0x2d, 0xdd, 0xb2, 0x8e, 0x9a, 0x66, 0x59, 0x55, 0xe8, 0x17, 0x53, 0x10, 0xea, 0x15, 0x9d, - 0xf5, 0x26, 0x52, 0xd6, 0x30, 0x8e, 0xf4, 0x9a, 0xbd, 0xd7, 0x6c, 0xab, 0xd9, 0x62, 0x9d, 0xde, - 0xef, 0x18, 0xb8, 0x95, 0x19, 0xdc, 0xe5, 0x21, 0xd7, 0x68, 0x36, 0x8c, 0xf8, 0x9b, 0xdb, 0x0a, - 0xe4, 0xf5, 0x56, 0xcb, 0x6c, 0x1e, 0xe2, 0x16, 0x03, 0x58, 0x2c, 0x1b, 0x0d, 0xda, 0xb3, 0x2c, - 0x2d, 0x69, 0x99, 0xcd, 0x7a, 0xb3, 0x6d, 0x94, 0xd5, 0x5c, 0xd1, 0x14, 0x47, 0x58, 0x34, 0xda, - 0x1d, 0xb2, 0x07, 0xae, 0xb2, 0x51, 0xd1, 0x3b, 0xb5, 0x36, 0x5f, 0xa2, 0x87, 0xb6, 0x69, 0x7c, - 0xba, 0x63, 0x58, 0x6d, 0x4b, 0x55, 0x88, 0x0a, 0x2b, 0x0d, 0xc3, 0x28, 0x5b, 0xb6, 0x69, 0x1c, - 0x56, 0x8d, 0x23, 0x35, 0x43, 0xdb, 0x64, 0xff, 0xd3, 0x2f, 0x14, 0xbf, 0xa3, 0x00, 0x61, 0x41, - 0x6f, 0x45, 0x26, 0x15, 0xdc, 0x31, 0x57, 0x61, 0xe7, 0x80, 0x2e, 0x35, 0x0e, 0xad, 0xde, 0x2c, - 0xc7, 0xa7, 0x6c, 0x13, 0x48, 0xac, 0xbc, 0x59, 0xa9, 0xa8, 0x0a, 0xd9, 0x85, 0x8b, 0x31, 0x78, - 0xd9, 0x6c, 0xb6, 0xd4, 0xcc, 0x4e, 0x26, 0xaf, 0x90, 0xad, 0x44, 0xe1, 0x03, 0xc3, 0x68, 0xa9, - 0x59, 0xba, 0x44, 0xb1, 0x02, 0x71, 0x24, 0x58, 0xf5, 0x5c, 0xf1, 0xeb, 0x0a, 0x6c, 0xb2, 0x6e, - 0x8a, 0xf3, 0x15, 0x74, 0xf5, 0x0a, 0x6c, 0xf3, 0x50, 0xde, 0x69, 0x1d, 0xbd, 0x04, 0x6a, 0xa4, - 0x94, 0x75, 0xf3, 0x32, 0x6c, 0x44, 0xa0, 0xd8, 0x8f, 0x0c, 0xa5, 0x1e, 0x11, 0xf0, 0x9e, 0x61, - 0xb5, 0x6d, 0xa3, 0x52, 0x69, 0x9a, 0x6d, 0xd6, 0x91, 0x6c, 0x51, 0x83, 0x8d, 0x92, 0x3b, 0x9e, - 0x50, 0xd1, 0x6b, 0xe0, 0x7b, 0xc3, 0x01, 0x76, 0x61, 0x15, 0x96, 0x8d, 0xcf, 0xb4, 0x8d, 0x86, - 0x55, 0x6d, 0x36, 0xd4, 0x0b, 0xc5, 0x2b, 0x31, 0x1c, 0x71, 0x8e, 0x2d, 0xeb, 0x40, 0xbd, 0x50, - 0x74, 0x60, 0x55, 0x18, 0x09, 0xb3, 0x5d, 0x71, 0x15, 0x76, 0xc4, 0x5e, 0x43, 0x8a, 0x12, 0x1f, - 0xc2, 0x36, 0x5c, 0x4a, 0x96, 0x1b, 0x6d, 0x55, 0xa1, 0xab, 0x10, 0x2b, 0xa1, 0xf0, 0x4c, 0xf1, - 0xd7, 0x14, 0x58, 0x0d, 0x1e, 0x4d, 0x50, 0x4d, 0x7b, 0x0d, 0x76, 0xeb, 0x15, 0xdd, 0x2e, 0x1b, - 0x87, 0xd5, 0x92, 0x61, 0x3f, 0xa8, 0x36, 0xca, 0xb1, 0x8f, 0x3c, 0x07, 0x97, 0x53, 0x10, 0xf0, - 0x2b, 0xdb, 0x70, 0x29, 0x5e, 0xd4, 0xa6, 0x47, 0x35, 0x43, 0xa7, 0x3e, 0x5e, 0x12, 0x9c, 0xd3, - 0x6c, 0xf1, 0x10, 0xd6, 0x2c, 0xbd, 0x5e, 0xab, 0x0c, 0xc7, 0x5d, 0x57, 0x9f, 0x4e, 0x4e, 0x07, - 0x64, 0x17, 0xb6, 0x2a, 0x4d, 0xb3, 0x64, 0xd8, 0x88, 0x12, 0xeb, 0xc1, 0x45, 0x58, 0x97, 0x0b, - 0x1f, 0x1a, 0x74, 0xfb, 0x12, 0x58, 0x93, 0x81, 0x8d, 0xa6, 0x9a, 0x29, 0x7e, 0x0e, 0x56, 0x22, - 0x09, 0xd5, 0xb6, 0xe0, 0xa2, 0xfc, 0xbb, 0xe5, 0x0e, 0x7a, 0xde, 0xe0, 0x44, 0xbd, 0x10, 0x2f, - 0x30, 0xa7, 0x83, 0x01, 0x2d, 0xc0, 0xf3, 0x2c, 0x17, 0xb4, 0xdd, 0xf1, 0x99, 0x37, 0x70, 0x26, - 0x6e, 0x4f, 0xcd, 0x14, 0x5f, 0x81, 0xd5, 0x48, 0x18, 0x67, 0xba, 0x70, 0xb5, 0x26, 0x27, 0xc0, - 0x75, 0xa3, 0x5c, 0xed, 0xd4, 0xd5, 0x05, 0x7a, 0x92, 0x0f, 0xaa, 0xfb, 0x07, 0x2a, 0x14, 0xbf, - 0xa5, 0x50, 0x39, 0x03, 0x93, 0xb3, 0xd4, 0x2b, 0xba, 0x58, 0x6a, 0xba, 0xcd, 0x58, 0x70, 0x78, - 0xc3, 0xb2, 0xd8, 0x53, 0xf3, 0x15, 0xd8, 0xe6, 0x3f, 0x6c, 0xbd, 0x51, 0xb6, 0x0f, 0x74, 0xb3, - 0x7c, 0xa4, 0x9b, 0x74, 0xef, 0x3d, 0x54, 0x33, 0x78, 0xa0, 0x24, 0x88, 0xdd, 0x6e, 0x76, 0x4a, - 0x07, 0x6a, 0x96, 0xee, 0xdf, 0x08, 0xbc, 0x55, 0x6d, 0xa8, 0x39, 0x3c, 0x9e, 0x09, 0x6c, 0x6c, - 0x96, 0x96, 0x2f, 0x14, 0xdf, 0x55, 0x60, 0xcb, 0xf2, 0x4e, 0x06, 0xce, 0x64, 0x3a, 0x76, 0xf5, - 0xfe, 0xc9, 0x70, 0xec, 0x4d, 0x4e, 0xcf, 0xac, 0xa9, 0x37, 0x71, 0xc9, 0x1d, 0xb8, 0x69, 0x55, - 0xf7, 0x1b, 0x7a, 0x9b, 0x1e, 0x2f, 0xbd, 0xb6, 0xdf, 0x34, 0xab, 0xed, 0x83, 0xba, 0x6d, 0x75, - 0xaa, 0x89, 0x9d, 0x77, 0x03, 0x5e, 0x98, 0x8d, 0x5a, 0x33, 0xf6, 0xf5, 0xd2, 0x43, 0x55, 0x99, - 0xdf, 0xe0, 0x9e, 0x5e, 0xd3, 0x1b, 0x25, 0xa3, 0x6c, 0x1f, 0xde, 0x55, 0x33, 0xe4, 0x26, 0x5c, - 0x9f, 0x8d, 0x5a, 0xa9, 0xb6, 0x2c, 0x8a, 0x96, 0x9d, 0xff, 0xdd, 0x03, 0xab, 0x4e, 0xb1, 0x72, - 0xc5, 0x3f, 0x54, 0x60, 0x7b, 0x56, 0x2c, 0x1f, 0x72, 0x0b, 0x34, 0xa3, 0xd1, 0x36, 0xf5, 0x6a, - 0xd9, 0x2e, 0x99, 0x46, 0xd9, 0x68, 0xb4, 0xab, 0x7a, 0xcd, 0xb2, 0xad, 0x66, 0x87, 0xee, 0xa6, - 0xd0, 0x22, 0xe0, 0x45, 0xb8, 0x36, 0x07, 0xaf, 0x59, 0x2d, 0x97, 0x54, 0x85, 0xdc, 0x85, 0x97, - 0xe7, 0x20, 0x59, 0x0f, 0xad, 0xb6, 0x51, 0x97, 0x4b, 0xd4, 0x4c, 0xb1, 0x04, 0x3b, 0xb3, 0x83, - 0x7d, 0x50, 0x32, 0x1d, 0x9d, 0xe9, 0x3c, 0xe4, 0xca, 0xf4, 0x66, 0x88, 0xe4, 0x10, 0x28, 0x7a, - 0xa0, 0xc6, 0xfd, 0xf5, 0x13, 0xa6, 0x1b, 0x66, 0xa7, 0xd1, 0x60, 0xd7, 0xc8, 0x3a, 0x14, 0x9a, - 0xed, 0x03, 0xc3, 0xe4, 0x59, 0x18, 0x30, 0xed, 0x42, 0xa7, 0x41, 0x0f, 0x4e, 0xd3, 0xac, 0x7e, - 0x16, 0xef, 0x93, 0x6d, 0xb8, 0x64, 0xd5, 0xf4, 0xd2, 0x03, 0xbb, 0xd1, 0x6c, 0xdb, 0xd5, 0x86, - 0x5d, 0x3a, 0xd0, 0x1b, 0x0d, 0xa3, 0xa6, 0x02, 0x4e, 0xe6, 0x2c, 0x1f, 0x3d, 0xf2, 0x41, 0xb8, - 0xdd, 0x7c, 0xd0, 0xd6, 0xed, 0x56, 0xad, 0xb3, 0x5f, 0x6d, 0xd8, 0xd6, 0xc3, 0x46, 0x49, 0xf0, - 0x3e, 0xa5, 0x24, 0xc9, 0xbd, 0x0d, 0x37, 0xe6, 0x62, 0x87, 0xf9, 0x12, 0x6e, 0x81, 0x36, 0x17, - 0x93, 0x0f, 0xa4, 0xf8, 0x03, 0x05, 0x76, 0xe7, 0xbc, 0x21, 0x93, 0x97, 0xe1, 0xce, 0x81, 0xa1, - 0x97, 0x6b, 0x86, 0x65, 0x21, 0xa1, 0xa0, 0xcb, 0xc0, 0x4c, 0x3c, 0x52, 0x09, 0xea, 0x1d, 0xb8, - 0x39, 0x1f, 0x3d, 0xbc, 0x9a, 0x6f, 0xc3, 0x8d, 0xf9, 0xa8, 0xfc, 0xaa, 0xce, 0x90, 0x22, 0xdc, - 0x9a, 0x8f, 0x19, 0x5c, 0xf1, 0xd9, 0xe2, 0x6f, 0x29, 0xb0, 0x99, 0xae, 0xc8, 0xa1, 0x7d, 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, 0x52, 0x6f, 0x0d, 0xae, - 0xce, 0xc6, 0x32, 0xaa, 0x25, 0x43, 0xcd, 0xec, 0x7d, 0xfc, 0x7b, 0xff, 0x7c, 0xf5, 0xc2, 0xf7, - 0xde, 0xbd, 0xaa, 0xfc, 0xf0, 0xdd, 0xab, 0xca, 0x3f, 0xbd, 0x7b, 0x55, 0xf9, 0xec, 0x4b, 0xe7, - 0x4b, 0x35, 0x84, 0x7c, 0xff, 0x5b, 0x8b, 0x28, 0xa1, 0xbc, 0xfa, 0x3f, 0x01, 0x00, 0x00, 0xff, - 0xff, 0x36, 0x08, 0x9e, 0xb6, 0x9f, 0xb4, 0x01, 0x00, + 0x10, 0x8d, 0x7f, 0x9e, 0x61, 0xeb, 0xbf, 0x7e, 0xf0, 0x09, 0xcb, 0x82, 0xc6, 0x3e, 0xa9, 0x8f, + 0x45, 0xeb, 0x9f, 0x66, 0x79, 0x2e, 0x1c, 0x31, 0x7d, 0xde, 0x84, 0x91, 0x4d, 0xdb, 0xdb, 0x13, + 0x59, 0xa3, 0x75, 0x2e, 0xbc, 0x20, 0x8a, 0xe9, 0x14, 0xe0, 0x6f, 0x53, 0x10, 0xa8, 0xba, 0xb0, + 0xec, 0x40, 0xba, 0x30, 0x45, 0x2f, 0x9f, 0x7b, 0x62, 0x7a, 0xf9, 0xef, 0x09, 0xd3, 0xde, 0x94, + 0x82, 0x01, 0x22, 0x4c, 0x5f, 0x8e, 0xa7, 0x8d, 0x4a, 0xc4, 0x02, 0x8f, 0xd8, 0x91, 0xdb, 0x6a, + 0x22, 0x2a, 0xc5, 0xb7, 0xf3, 0x94, 0x94, 0x53, 0xc6, 0x9f, 0xe6, 0x78, 0x1f, 0x8b, 0x8e, 0xba, + 0xa2, 0xf9, 0x7d, 0xe3, 0x3a, 0x61, 0x1b, 0xbd, 0x1a, 0x82, 0x03, 0xcd, 0xa6, 0xae, 0xc0, 0x10, + 0x9b, 0x9b, 0xa2, 0x37, 0x11, 0x8f, 0xcd, 0x5f, 0x15, 0x8f, 0x95, 0xb3, 0xb5, 0x8c, 0x67, 0x92, + 0x9a, 0x61, 0x10, 0x8f, 0x2d, 0x75, 0x2d, 0x23, 0x06, 0xb9, 0x0a, 0x43, 0xeb, 0x6e, 0x43, 0x46, + 0x32, 0x9f, 0xc3, 0xe8, 0x1f, 0x5a, 0x0a, 0xd3, 0xf9, 0x8c, 0x89, 0x18, 0xec, 0x5b, 0xc3, 0xfc, + 0x0f, 0xea, 0xb7, 0xb6, 0x76, 0xed, 0x64, 0xe6, 0x38, 0x25, 0xe9, 0xcc, 0x32, 0x4c, 0xe9, 0xa9, + 0xea, 0x85, 0xbd, 0x2f, 0x6a, 0xd7, 0x63, 0x19, 0xef, 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, 0xf6, 0x2b, 0x4f, 0x9c, 0x89, 0xb6, 0x0b, 0x1c, 0x72, 0x0b, 0xf2, 0x3c, 0xcc, + 0x46, 0xb5, 0xa2, 0x3e, 0x53, 0xf9, 0x08, 0x8b, 0x85, 0xa9, 0x91, 0x88, 0x4a, 0x58, 0x85, 0x4f, + 0x43, 0x41, 0x6c, 0x49, 0x51, 0xf2, 0xf3, 0xe7, 0x60, 0xa8, 0x5c, 0xad, 0x98, 0xea, 0x36, 0x52, + 0x77, 0x1a, 0x9e, 0x89, 0x50, 0xf4, 0xaa, 0x5b, 0xa7, 0xc1, 0xa1, 0xeb, 0x1d, 0x98, 0xd4, 0x0f, + 0x3c, 0x87, 0x27, 0xa8, 0xc4, 0x85, 0xf8, 0x19, 0xf2, 0x36, 0x0c, 0xa3, 0xe1, 0x69, 0xec, 0x64, + 0x88, 0xd7, 0xb1, 0x34, 0x29, 0x26, 0xf0, 0x30, 0x5a, 0xb1, 0x9a, 0x9c, 0x88, 0xbc, 0x09, 0x43, + 0x15, 0xda, 0x3e, 0x8a, 0xe5, 0xce, 0x4b, 0x10, 0x87, 0x1b, 0x42, 0x83, 0xb6, 0x8f, 0x4c, 0x24, + 0x31, 0x7e, 0x3a, 0x0b, 0xe7, 0x52, 0x9a, 0xf5, 0xf0, 0x33, 0x4f, 0xe9, 0xae, 0xb8, 0xa4, 0xed, + 0x8a, 0xf2, 0x7d, 0xba, 0x67, 0xc7, 0xa7, 0x6e, 0x92, 0x3f, 0x9f, 0x81, 0x0b, 0xfa, 0x04, 0x15, + 0x96, 0xe6, 0x0f, 0x6f, 0x91, 0xb7, 0x60, 0x64, 0x85, 0xda, 0x0d, 0x2a, 0xf3, 0x6a, 0x9d, 0x0b, + 0x03, 0xe2, 0xf1, 0x18, 0x02, 0xbc, 0x90, 0xb3, 0x8d, 0x3c, 0x4e, 0x39, 0x94, 0x54, 0x44, 0xe3, + 0xb8, 0x3c, 0x6e, 0xc8, 0x78, 0x1e, 0x69, 0x55, 0xf5, 0xb1, 0xf2, 0xf8, 0x4e, 0x06, 0x9e, 0xed, + 0x43, 0xc3, 0x06, 0x8e, 0x0d, 0xbd, 0x3a, 0x70, 0x78, 0xa2, 0x22, 0x94, 0xbc, 0x0b, 0xd3, 0x9b, + 0x42, 0x9e, 0x97, 0xc3, 0x91, 0x8d, 0xd6, 0x8b, 0x14, 0xf5, 0x2d, 0x39, 0x2e, 0x71, 0x64, 0x2d, + 0xd0, 0x4c, 0xae, 0x6f, 0xa0, 0x19, 0x35, 0x6e, 0xcb, 0xd0, 0xa0, 0x71, 0x5b, 0xde, 0x87, 0x39, + 0xfd, 0xdb, 0x44, 0xf8, 0xdc, 0x28, 0x6a, 0x4d, 0xa6, 0x77, 0xd4, 0x9a, 0xbe, 0x41, 0x3a, 0x8d, + 0x9f, 0xc8, 0x40, 0x41, 0xe7, 0xfd, 0x51, 0xc7, 0xf3, 0x1d, 0x6d, 0x3c, 0x9f, 0x4d, 0x1f, 0xcf, + 0xde, 0x03, 0xf9, 0x7f, 0x67, 0xe2, 0x1f, 0x3b, 0xd0, 0x08, 0x1a, 0x30, 0x52, 0x71, 0x5b, 0xb6, + 0xd3, 0x56, 0x73, 0xe9, 0x37, 0x10, 0x62, 0x8a, 0x92, 0xc1, 0x82, 0xfc, 0x5c, 0x86, 0xe1, 0x75, + 0xb7, 0x5d, 0xaa, 0x08, 0x93, 0x5e, 0xe4, 0xd3, 0x76, 0xdb, 0x96, 0xdd, 0x30, 0x79, 0x01, 0x59, + 0x05, 0xa8, 0xd5, 0x3d, 0x4a, 0xdb, 0x35, 0xe7, 0x9b, 0x34, 0x26, 0x69, 0xb0, 0x1e, 0x6a, 0x76, + 0x71, 0x63, 0xe1, 0x4f, 0x97, 0x88, 0x68, 0xf9, 0xce, 0x37, 0xd5, 0xfd, 0x56, 0xa1, 0xc7, 0x75, + 0x25, 0xe2, 0xa0, 0xc5, 0xc6, 0xe1, 0xe6, 0xc7, 0xb1, 0xae, 0x52, 0xab, 0xc2, 0x1e, 0xbe, 0x99, + 0x3a, 0x1c, 0x7f, 0x98, 0x81, 0x67, 0xfb, 0xd0, 0x3c, 0x81, 0x51, 0xf9, 0xab, 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, 0x0e, 0xc3, 0x45, 0x93, 0xee, 0x39, 0xec, + 0x5e, 0xb2, 0xe5, 0x3b, 0xed, 0x3d, 0x2d, 0xee, 0x8d, 0x11, 0x5b, 0xb9, 0x22, 0x49, 0x04, 0x83, + 0x84, 0x33, 0xf1, 0x1a, 0xe4, 0x99, 0x18, 0xa2, 0x2c, 0x5e, 0x7c, 0xb4, 0x62, 0xc2, 0x8a, 0x08, + 0xac, 0x2c, 0x8b, 0xc9, 0xab, 0x42, 0x4c, 0x52, 0xd2, 0xf8, 0x30, 0x31, 0xe9, 0xbb, 0xc7, 0x45, + 0xa8, 0x1d, 0xf9, 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, 0x7d, 0x46, 0x65, + 0xbd, 0x86, 0xe1, 0x61, 0xc4, 0x7b, 0x24, 0x7e, 0x46, 0xa3, 0xed, 0xe3, 0x57, 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, 0x57, 0xe9, 0x38, 0x1e, 0xb9, 0xc1, 0xa6, 0x42, 0xcb, 0x0d, 0x28, 0x4e, 0xe1, 0xb1, + 0xe8, 0xce, 0xe5, 0x21, 0x94, 0xdf, 0xb9, 0x14, 0x14, 0xf2, 0x36, 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, 0x81, 0xd1, 0x6a, 0x85, 0xf7, 0xfd, 0xb8, 0x9a, 0x4a, 0x4b, 0x58, 0x46, + 0xc9, 0x42, 0xf2, 0x20, 0xba, 0x14, 0x4c, 0x9c, 0x2a, 0xbd, 0x5f, 0x1c, 0xe0, 0x42, 0xf0, 0x26, + 0x4c, 0x2e, 0xb9, 0x41, 0xb5, 0xed, 0x07, 0x76, 0xbb, 0x4e, 0xab, 0x15, 0x35, 0xae, 0xf5, 0x8e, + 0x1b, 0x58, 0x8e, 0x28, 0x61, 0x2d, 0xd7, 0x31, 0xc9, 0xe7, 0x90, 0xf4, 0x2e, 0x6d, 0x53, 0x2f, + 0x8a, 0x67, 0x3d, 0xcc, 0xfb, 0x96, 0x91, 0xee, 0x85, 0x25, 0xa6, 0x8e, 0x28, 0xd2, 0x7c, 0xf1, + 0xe4, 0x9c, 0x65, 0xb7, 0x41, 0x7d, 0xbe, 0x5b, 0x7c, 0x82, 0xd2, 0x7c, 0x29, 0xdf, 0xd6, 0x67, + 0x07, 0xfd, 0x77, 0x30, 0xcd, 0x57, 0x02, 0x97, 0x7c, 0x0e, 0x86, 0xf1, 0xa7, 0x90, 0x6e, 0x67, + 0x53, 0xd8, 0x46, 0x92, 0x6d, 0x9d, 0x61, 0x9a, 0x9c, 0x80, 0x54, 0x61, 0x54, 0x5c, 0xac, 0xce, + 0x92, 0xac, 0x46, 0xdc, 0xd0, 0xf8, 0xcc, 0x10, 0xf4, 0x46, 0x03, 0x26, 0xd4, 0x0a, 0xd9, 0x8a, + 0x58, 0xb1, 0xfd, 0x7d, 0xda, 0x60, 0xbf, 0x44, 0x9e, 0x39, 0x5c, 0x11, 0xfb, 0x08, 0xb5, 0x58, + 0x3b, 0x4c, 0x05, 0x85, 0x9d, 0xa9, 0x55, 0x7f, 0xcb, 0x17, 0x4d, 0x11, 0xaa, 0x16, 0x07, 0xd5, + 0x76, 0x0d, 0x53, 0x14, 0x19, 0xdf, 0x03, 0x73, 0xeb, 0xdd, 0x66, 0xd3, 0xde, 0x69, 0x52, 0x99, + 0x87, 0x04, 0x33, 0x78, 0x2f, 0xc1, 0x70, 0x4d, 0xc9, 0x09, 0x1e, 0xe6, 0x82, 0x54, 0x70, 0xd0, + 0x08, 0x35, 0x83, 0xa1, 0x7a, 0x62, 0xd9, 0xc0, 0x39, 0xa9, 0xf1, 0xfb, 0x19, 0x98, 0x93, 0xef, + 0xff, 0x9e, 0x5d, 0x3f, 0x08, 0x13, 0xc3, 0x5f, 0xd1, 0xe6, 0x1a, 0x4e, 0xd8, 0xd8, 0x34, 0xe2, + 0xb3, 0xee, 0x9e, 0x6c, 0x84, 0x2e, 0xb0, 0xa4, 0x35, 0xf8, 0xb4, 0xc6, 0x90, 0xb7, 0x61, 0x5c, + 0x1c, 0x8f, 0x4a, 0x80, 0x49, 0x8c, 0xe2, 0x25, 0xae, 0x7b, 0x71, 0x6b, 0x14, 0x15, 0x1d, 0x65, + 0x31, 0xfd, 0x53, 0x3e, 0xaa, 0x0c, 0x90, 0x2e, 0x8b, 0xe9, 0x75, 0xf4, 0x99, 0xba, 0xbf, 0x3d, + 0x1e, 0xef, 0x5b, 0x31, 0x77, 0x6f, 0xab, 0x21, 0xe5, 0x32, 0xd1, 0xcd, 0x38, 0x0a, 0x29, 0xa7, + 0xde, 0x8c, 0x43, 0xd4, 0x70, 0x4c, 0xb2, 0xa7, 0x8c, 0xc9, 0xbb, 0x72, 0x4c, 0x72, 0xbd, 0x27, + 0xc6, 0x6c, 0x9f, 0x71, 0xa8, 0x45, 0x2b, 0x64, 0x68, 0x20, 0xb5, 0xca, 0x33, 0x18, 0x3b, 0x9f, + 0x93, 0xc4, 0x77, 0x51, 0xc1, 0x49, 0xd5, 0xd5, 0x0c, 0x0f, 0xce, 0xf4, 0x94, 0xad, 0xf9, 0xf3, + 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, 0x6e, 0xc0, 0x68, 0xb5, 0xfd, 0xc8, 0x61, 0x7d, 0xc2, 0x03, 0x60, + 0xa1, 0x6e, 0xca, 0xe1, 0x20, 0x75, 0x73, 0x15, 0x58, 0xe4, 0x4d, 0xe5, 0x52, 0x33, 0x16, 0x29, + 0x30, 0xb8, 0xca, 0x2b, 0x8c, 0x70, 0xa3, 0x5e, 0x58, 0xc2, 0x5b, 0xce, 0x6d, 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, + 0x53, 0x95, 0x40, 0x0f, 0x61, 0x62, 0xc3, 0xf6, 0x02, 0x87, 0xc9, 0x28, 0xed, 0xc0, 0x9f, 0x9f, + 0xd4, 0xf4, 0xa6, 0x4a, 0xd1, 0xd2, 0x25, 0x99, 0x97, 0xba, 0xa3, 0xe0, 0xeb, 0x09, 0x94, 0x23, + 0x78, 0xba, 0x29, 0xeb, 0xd4, 0x47, 0x31, 0x65, 0xc5, 0x4e, 0x45, 0x5d, 0xd9, 0x74, 0xa4, 0x91, + 0xc1, 0x4b, 0x4b, 0x4c, 0x61, 0x16, 0x22, 0x92, 0xaf, 0xc0, 0x04, 0xfb, 0x7b, 0xc3, 0x6d, 0x3a, + 0x75, 0x87, 0xfa, 0xf3, 0x05, 0xfc, 0xb8, 0x4b, 0xa9, 0xab, 0x1f, 0x91, 0x8e, 0x6a, 0x34, 0xe0, + 0x0b, 0x18, 0x19, 0xc7, 0x95, 0xe0, 0x1a, 0x37, 0xf2, 0x1e, 0x4c, 0xb0, 0xd9, 0xb7, 0x63, 0xfb, + 0x5c, 0x34, 0x9d, 0x89, 0x8c, 0x91, 0x1b, 0x02, 0x9e, 0x08, 0xa8, 0xac, 0x12, 0xb0, 0x63, 0xbe, + 0xd4, 0xe1, 0x1b, 0x24, 0x51, 0x66, 0x7b, 0x27, 0xb1, 0x39, 0x4a, 0x34, 0xf2, 0x05, 0x98, 0x28, + 0x75, 0x3a, 0xd1, 0x8e, 0x33, 0xab, 0x28, 0xc2, 0x3a, 0x1d, 0x2b, 0x75, 0xd7, 0xd1, 0x28, 0xe2, + 0x1b, 0xf3, 0xdc, 0x99, 0x36, 0x66, 0xf2, 0x7a, 0x28, 0xad, 0x9f, 0x8b, 0xb4, 0xba, 0xe2, 0xe2, + 0xa8, 0x89, 0xfe, 0x5c, 0x70, 0x2f, 0xc3, 0x24, 0x57, 0x73, 0x4a, 0x69, 0xe6, 0x7c, 0x62, 0xf5, + 0xa4, 0x08, 0x35, 0x3a, 0x0d, 0x59, 0x86, 0x29, 0xee, 0x6d, 0xdd, 0x14, 0x91, 0xae, 0xe7, 0x2f, + 0xe0, 0xaa, 0x45, 0x2e, 0xdc, 0x49, 0xbb, 0x89, 0x09, 0x50, 0x6c, 0x8d, 0x4b, 0x8c, 0xc8, 0xf8, + 0xb3, 0x0c, 0x5c, 0xe8, 0x31, 0xe2, 0x61, 0x1c, 0xe4, 0x4c, 0xff, 0x38, 0xc8, 0x6c, 0xe7, 0xd0, + 0xb5, 0x22, 0xf8, 0xfd, 0x42, 0xca, 0x52, 0xc7, 0x4b, 0xca, 0x5b, 0x2e, 0x10, 0x91, 0x63, 0x48, + 0x54, 0x7d, 0xcf, 0x45, 0xd5, 0x6c, 0x2e, 0x79, 0x08, 0x09, 0x3c, 0xde, 0xa8, 0x25, 0xe3, 0xe4, + 0xb8, 0x78, 0x49, 0xa4, 0x30, 0x0a, 0x87, 0xf5, 0x03, 0x57, 0x5b, 0xc1, 0x29, 0xac, 0x8d, 0xe3, + 0x0c, 0x8c, 0x2b, 0xeb, 0x90, 0x5c, 0x56, 0xbc, 0x80, 0x0b, 0x3c, 0x09, 0x96, 0xc2, 0x21, 0xcb, + 0x4f, 0x22, 0x5c, 0x54, 0xd9, 0xd3, 0x15, 0xd0, 0x6b, 0x4c, 0x14, 0x52, 0x62, 0x45, 0xb7, 0x34, + 0x6d, 0xb1, 0x89, 0xe5, 0x98, 0x4e, 0xdf, 0xf6, 0x83, 0x52, 0x3d, 0x70, 0x1e, 0xd1, 0x01, 0x0e, + 0x9d, 0x28, 0x9d, 0xbe, 0xed, 0x07, 0x96, 0x8d, 0x64, 0x89, 0x74, 0xfa, 0x21, 0x43, 0xe3, 0x07, + 0x32, 0x00, 0x5b, 0xd5, 0x32, 0x06, 0x7b, 0xff, 0xa8, 0x42, 0x41, 0x7a, 0x00, 0x5d, 0xc9, 0xbd, + 0x8f, 0x38, 0xf0, 0x3f, 0x65, 0x60, 0x4a, 0x47, 0x23, 0xef, 0xc2, 0x74, 0xad, 0xee, 0xb9, 0xcd, + 0xe6, 0x8e, 0x5d, 0x3f, 0x58, 0x75, 0xda, 0x94, 0x87, 0x2e, 0x1d, 0xe6, 0x67, 0x91, 0x1f, 0x16, + 0x59, 0x4d, 0x56, 0x66, 0xc6, 0x91, 0xc9, 0x0f, 0x66, 0x60, 0xb2, 0xb6, 0xef, 0x1e, 0x86, 0xd1, + 0x46, 0xc5, 0x80, 0x7c, 0x95, 0xad, 0x6d, 0x7f, 0xdf, 0x3d, 0x8c, 0x32, 0x68, 0x6a, 0xc6, 0x9f, + 0xef, 0x0c, 0xf6, 0x2e, 0x5f, 0x77, 0xf1, 0x26, 0x13, 0xf8, 0xd7, 0xb5, 0x4a, 0x4c, 0xbd, 0x4e, + 0xe3, 0x2f, 0x33, 0x30, 0x8e, 0x77, 0x9e, 0x66, 0x13, 0x65, 0xae, 0x4f, 0x52, 0x3a, 0xc6, 0xf0, + 0xbb, 0xfa, 0x0c, 0xec, 0x1b, 0x30, 0x1d, 0x43, 0x23, 0x06, 0x8c, 0xd4, 0xd0, 0xc1, 0x5f, 0x55, + 0x50, 0x70, 0x97, 0x7f, 0x53, 0x94, 0x18, 0xcb, 0x0a, 0xd9, 0xc3, 0x9b, 0xf8, 0xac, 0xbb, 0x08, + 0xe0, 0x48, 0x90, 0xbc, 0xd9, 0x90, 0x78, 0x4b, 0x1e, 0xde, 0x34, 0x15, 0x2c, 0x63, 0x1d, 0x46, + 0x6a, 0xae, 0x17, 0x2c, 0x1d, 0xf1, 0xcb, 0x44, 0x85, 0xfa, 0x75, 0xf5, 0xdd, 0xd6, 0xc1, 0xb7, + 0x92, 0xba, 0x29, 0x8a, 0x48, 0x11, 0x86, 0xef, 0x38, 0xb4, 0xd9, 0x50, 0x0d, 0x74, 0x77, 0x19, + 0xc0, 0xe4, 0x70, 0x76, 0xe1, 0x3a, 0x1f, 0xe5, 0x44, 0x89, 0x2c, 0x81, 0x3f, 0xea, 0xba, 0x29, + 0x6b, 0xfd, 0xfb, 0x42, 0x98, 0x87, 0x20, 0x59, 0x53, 0x9f, 0xae, 0xfe, 0x8f, 0x33, 0xb0, 0xd0, + 0x9b, 0x44, 0x35, 0x2e, 0xce, 0xf4, 0x31, 0x2e, 0x7e, 0x39, 0xfe, 0xce, 0x88, 0x68, 0xe2, 0x9d, + 0x31, 0x7a, 0x5d, 0xac, 0xa0, 0x6d, 0x77, 0x9d, 0xca, 0x44, 0x28, 0x97, 0xfb, 0xb4, 0x19, 0x11, + 0xf9, 0x30, 0x07, 0x48, 0x63, 0x0a, 0x5a, 0xe3, 0xb7, 0x86, 0xe0, 0x62, 0x4f, 0x0a, 0xb2, 0xa2, + 0xa4, 0x57, 0x9a, 0x0a, 0x13, 0xbb, 0xf4, 0xc4, 0xbf, 0x8e, 0xff, 0xa2, 0xf9, 0x5e, 0xdc, 0xdb, + 0xec, 0x41, 0x98, 0x56, 0x27, 0x8b, 0xbc, 0x3e, 0x75, 0x2a, 0x2f, 0x8e, 0x8e, 0xcc, 0x20, 0x99, + 0x61, 0x07, 0xfd, 0x12, 0x69, 0x60, 0x3b, 0x4d, 0x5f, 0x5d, 0x76, 0x0d, 0x0e, 0x32, 0x65, 0x59, + 0x64, 0xf1, 0x3d, 0x94, 0x6e, 0xf1, 0x6d, 0xfc, 0xcb, 0x0c, 0x8c, 0x85, 0xcd, 0x26, 0x0b, 0x70, + 0x7e, 0xd3, 0x2c, 0x95, 0x97, 0xad, 0xcd, 0xf7, 0x37, 0x96, 0xad, 0xad, 0xf5, 0xda, 0xc6, 0x72, + 0xb9, 0x7a, 0xa7, 0xba, 0x5c, 0x29, 0x3c, 0x43, 0x66, 0x60, 0x72, 0x6b, 0xfd, 0xfe, 0xfa, 0x83, + 0xed, 0x75, 0x6b, 0xd9, 0x34, 0x1f, 0x98, 0x85, 0x0c, 0x99, 0x84, 0x31, 0x73, 0xa9, 0x54, 0xb6, + 0xd6, 0x1f, 0x54, 0x96, 0x0b, 0x59, 0x52, 0x80, 0x89, 0xf2, 0x83, 0xf5, 0xf5, 0xe5, 0xf2, 0x66, + 0xf5, 0x61, 0x75, 0xf3, 0xfd, 0x42, 0x8e, 0x10, 0x98, 0x42, 0x84, 0x0d, 0xb3, 0xba, 0x5e, 0xae, + 0x6e, 0x94, 0x56, 0x0b, 0x43, 0x0c, 0xc6, 0xf0, 0x15, 0xd8, 0x70, 0xc8, 0xe8, 0xfe, 0xd6, 0xd2, + 0x72, 0x61, 0x84, 0xa1, 0xb0, 0xbf, 0x14, 0x94, 0x51, 0x56, 0x3d, 0xa2, 0x54, 0x4a, 0x9b, 0xa5, + 0xa5, 0x52, 0x6d, 0xb9, 0x90, 0x27, 0x17, 0x60, 0x56, 0x03, 0x59, 0xab, 0x0f, 0xee, 0x56, 0xd7, + 0x0b, 0x63, 0x64, 0x0e, 0x0a, 0x21, 0xac, 0xb2, 0x64, 0x6d, 0xd5, 0x96, 0xcd, 0x02, 0xc4, 0xa1, + 0xeb, 0xa5, 0xb5, 0xe5, 0xc2, 0xb8, 0xf1, 0x0e, 0xf7, 0x03, 0xe4, 0x5d, 0x4d, 0xce, 0x03, 0xa9, + 0x6d, 0x96, 0x36, 0xb7, 0x6a, 0xb1, 0x8f, 0x1f, 0x87, 0xd1, 0xda, 0x56, 0xb9, 0xbc, 0x5c, 0xab, + 0x15, 0x32, 0x04, 0x60, 0xe4, 0x4e, 0xa9, 0xba, 0xba, 0x5c, 0x29, 0x64, 0x8d, 0x9f, 0xca, 0xc0, + 0x8c, 0x94, 0x00, 0xe5, 0xa3, 0xd1, 0x47, 0x5c, 0x8b, 0xef, 0x6a, 0x17, 0x5b, 0xe9, 0xa4, 0x15, + 0xab, 0xa4, 0xcf, 0x32, 0xfc, 0xf9, 0x0c, 0x9c, 0x4b, 0xc5, 0x26, 0xef, 0x43, 0x41, 0xb6, 0x60, + 0xcd, 0x0e, 0xea, 0xfb, 0xd1, 0x3e, 0x76, 0x29, 0x56, 0x4b, 0x0c, 0x8d, 0xab, 0x35, 0xa3, 0x84, + 0xcf, 0x09, 0x36, 0x83, 0xa7, 0x23, 0x30, 0xbe, 0x9d, 0x81, 0x0b, 0x3d, 0xaa, 0x21, 0x65, 0x18, + 0x09, 0x13, 0xd3, 0xf4, 0xb1, 0x60, 0x9b, 0xfb, 0xce, 0x71, 0x51, 0x20, 0x62, 0x86, 0x5c, 0xfc, + 0xcb, 0x1c, 0x09, 0x33, 0xcd, 0x60, 0xba, 0x17, 0xde, 0x7d, 0x17, 0x63, 0x3d, 0x2f, 0x6a, 0x2a, + 0x6d, 0xd7, 0x96, 0xc6, 0x45, 0xdf, 0xe5, 0xec, 0x43, 0x1f, 0xf3, 0xbd, 0x18, 0x3f, 0x93, 0x61, + 0xc2, 0x5d, 0x1c, 0x91, 0xc9, 0xbc, 0x25, 0xdf, 0xef, 0xb6, 0xa8, 0xe9, 0x36, 0x69, 0xc9, 0x5c, + 0x17, 0xc7, 0x06, 0x4a, 0xab, 0x36, 0x16, 0xe0, 0xb5, 0xc2, 0xb2, 0xbd, 0xb6, 0xf6, 0x5a, 0xad, + 0xd2, 0x90, 0x37, 0x01, 0x96, 0x1f, 0x07, 0xd4, 0x6b, 0xdb, 0xcd, 0x30, 0x46, 0x0b, 0x8f, 0x2c, + 0x25, 0xa0, 0xba, 0xbc, 0xad, 0x20, 0x1b, 0x7f, 0x27, 0x03, 0x13, 0xe2, 0xd2, 0x54, 0x6a, 0x52, + 0x2f, 0xf8, 0x68, 0xd3, 0xeb, 0x4d, 0x6d, 0x7a, 0x85, 0x0e, 0x1b, 0x0a, 0x7f, 0x56, 0x9c, 0x3a, + 0xb3, 0xfe, 0x69, 0x06, 0x0a, 0x71, 0x44, 0xf2, 0x2e, 0xe4, 0x6b, 0xf4, 0x11, 0xf5, 0x9c, 0xe0, + 0x48, 0x6c, 0x94, 0x32, 0x85, 0x1f, 0xc7, 0x11, 0x65, 0x7c, 0x3e, 0xf8, 0xe2, 0x97, 0x19, 0xd2, + 0x0c, 0xba, 0xdf, 0x2b, 0x6a, 0x8f, 0xdc, 0x93, 0x52, 0x7b, 0x18, 0xff, 0x7b, 0x16, 0x2e, 0xdc, + 0xa5, 0x81, 0xfa, 0x4d, 0xa1, 0x79, 0xc1, 0xa7, 0x07, 0xfb, 0x2e, 0xe5, 0x4b, 0xe6, 0x61, 0x14, + 0x8b, 0xe4, 0xf8, 0x9a, 0xf2, 0x27, 0x59, 0x0a, 0xe7, 0x75, 0x4e, 0xcb, 0x11, 0xd6, 0xa3, 0xee, + 0xeb, 0x4a, 0xd6, 0xa0, 0x70, 0x5a, 0x5f, 0x81, 0x29, 0x0c, 0x8b, 0xdf, 0x65, 0xcb, 0x81, 0x36, + 0x84, 0xfa, 0x27, 0x6f, 0xc6, 0xa0, 0xe4, 0x55, 0x28, 0x30, 0x48, 0xa9, 0x7e, 0xd0, 0x76, 0x0f, + 0x9b, 0xb4, 0xb1, 0x47, 0x1b, 0x78, 0xac, 0xe7, 0xcd, 0x04, 0x5c, 0xf2, 0xdc, 0x6a, 0xf3, 0xab, + 0x1b, 0x6d, 0xa0, 0x8e, 0x46, 0xf0, 0x8c, 0xa0, 0x0b, 0x6f, 0xc2, 0xf8, 0x87, 0xcc, 0x00, 0x66, + 0xfc, 0x6f, 0x19, 0x98, 0xc3, 0x8f, 0x53, 0x2a, 0x96, 0xd9, 0x59, 0x65, 0x6f, 0x29, 0x49, 0x71, + 0x6c, 0x06, 0xd2, 0x97, 0x42, 0xd8, 0x8b, 0x91, 0x4e, 0x28, 0x3b, 0x80, 0x4e, 0xa8, 0x76, 0x96, + 0x4c, 0xf4, 0x03, 0xaa, 0xb4, 0xee, 0x0d, 0xe5, 0x73, 0x85, 0xa1, 0x68, 0xc8, 0x8d, 0x1f, 0xcc, + 0xc2, 0xa8, 0x49, 0x31, 0x45, 0x37, 0xb9, 0x02, 0xa3, 0xeb, 0x6e, 0x40, 0xfd, 0x35, 0x2d, 0x1f, + 0x7b, 0x9b, 0x81, 0xac, 0x56, 0xc3, 0x94, 0x85, 0x6c, 0xc2, 0x6f, 0x78, 0x6e, 0xa3, 0x5b, 0x0f, + 0xd4, 0x09, 0xdf, 0xe1, 0x20, 0x53, 0x96, 0x91, 0xd7, 0x60, 0x4c, 0x70, 0x0e, 0x1f, 0x75, 0xd1, + 0x18, 0xd9, 0xa3, 0x61, 0x8a, 0xf7, 0x08, 0x01, 0x65, 0x5a, 0x2e, 0x60, 0x0c, 0x29, 0x32, 0x6d, + 0x42, 0x66, 0x90, 0xa2, 0xfa, 0x70, 0x1f, 0x51, 0xfd, 0xd3, 0x30, 0x52, 0xf2, 0x7d, 0x1a, 0xc8, + 0x28, 0x06, 0x13, 0x61, 0xd8, 0x36, 0x9f, 0x06, 0x9c, 0xb1, 0x8d, 0xe5, 0xa6, 0xc0, 0x33, 0xfe, + 0x79, 0x16, 0x86, 0xf1, 0x4f, 0x7c, 0x32, 0xf5, 0xea, 0xfb, 0xda, 0x93, 0xa9, 0x57, 0xdf, 0x37, + 0x11, 0x4a, 0x6e, 0xa2, 0xa6, 0x42, 0xe6, 0x6f, 0x12, 0x5f, 0x8f, 0x2a, 0xf8, 0x46, 0x04, 0x36, + 0x55, 0x9c, 0xf0, 0x85, 0x3f, 0x97, 0x1a, 0xbb, 0xe4, 0x3c, 0x64, 0x1f, 0xd4, 0xc4, 0x17, 0x63, + 0x44, 0x2c, 0xd7, 0x37, 0xb3, 0x0f, 0x6a, 0xd8, 0x1b, 0x2b, 0xa5, 0xc5, 0x37, 0x6e, 0x8b, 0x0f, + 0xe5, 0xbd, 0xb1, 0x6f, 0x2f, 0xbe, 0x71, 0xdb, 0x14, 0x25, 0xac, 0x7f, 0xb1, 0xcd, 0xf8, 0xf0, + 0xca, 0x7d, 0xee, 0xb1, 0x7f, 0xf1, 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, 0xac, 0x49, 0xfc, 0x0d, + 0x2f, 0xf2, 0xa5, 0x9f, 0x52, 0x82, 0x06, 0x60, 0x9a, 0x83, 0x10, 0xc1, 0xf8, 0xe5, 0x2c, 0xe4, + 0x37, 0x9a, 0xdd, 0x3d, 0xa7, 0xfd, 0xf0, 0x26, 0x21, 0x80, 0xd7, 0x38, 0x99, 0x07, 0x83, 0xfd, + 0x4d, 0x2e, 0x42, 0x5e, 0xde, 0xdc, 0xe4, 0x86, 0xe4, 0x8b, 0x5b, 0xdb, 0x3c, 0xc8, 0x71, 0x17, + 0xa1, 0xcf, 0xe4, 0x4f, 0x72, 0x13, 0xc2, 0xfb, 0x57, 0xaf, 0x8b, 0xda, 0x10, 0x5b, 0x2c, 0x66, + 0x88, 0x46, 0x5e, 0x07, 0x3c, 0x24, 0xc4, 0xe5, 0x41, 0x2a, 0xb4, 0x79, 0xd3, 0x84, 0x9c, 0xc2, + 0x49, 0x10, 0x8d, 0xdc, 0x02, 0x31, 0x31, 0x45, 0x36, 0xf3, 0x73, 0x3a, 0x01, 0xcf, 0x0f, 0x29, + 0x49, 0x04, 0x2a, 0x79, 0x1b, 0xc6, 0xeb, 0x1e, 0xc5, 0x57, 0x47, 0xbb, 0x19, 0x25, 0x29, 0x57, + 0x29, 0xcb, 0x51, 0xf9, 0xc3, 0x9b, 0xa6, 0x8a, 0x6e, 0xfc, 0x72, 0x1e, 0x26, 0xd4, 0xf6, 0x10, + 0x13, 0x66, 0xfd, 0x26, 0xbb, 0xbb, 0x0b, 0x63, 0xb3, 0x0e, 0x16, 0x8a, 0xe3, 0xf4, 0xb2, 0xde, + 0x20, 0x86, 0xc7, 0x2d, 0xcf, 0x64, 0x90, 0x8a, 0x95, 0x67, 0xcc, 0x19, 0x3f, 0x02, 0x73, 0x3c, + 0x52, 0x82, 0xbc, 0xdb, 0xf1, 0xf7, 0x68, 0xdb, 0x91, 0xef, 0x2d, 0x2f, 0x6a, 0x8c, 0x1e, 0x88, + 0xc2, 0x04, 0xaf, 0x90, 0x8c, 0xbc, 0x01, 0x23, 0x6e, 0x87, 0xb6, 0x6d, 0x47, 0x9c, 0x71, 0xcf, + 0xc6, 0x18, 0xd0, 0x76, 0xa9, 0xaa, 0x10, 0x0a, 0x64, 0x72, 0x03, 0x86, 0xdc, 0x83, 0x70, 0xbc, + 0x2e, 0xea, 0x44, 0x07, 0x81, 0xad, 0x90, 0x20, 0x22, 0x23, 0xf8, 0xc0, 0x6e, 0xed, 0x8a, 0x11, + 0xd3, 0x09, 0xee, 0xd9, 0xad, 0x5d, 0x95, 0x80, 0x21, 0x92, 0xf7, 0x00, 0x3a, 0xf6, 0x1e, 0xf5, + 0xac, 0x46, 0x37, 0x38, 0x12, 0xe3, 0x76, 0x49, 0x23, 0xdb, 0x60, 0xc5, 0x95, 0x6e, 0x70, 0xa4, + 0xd0, 0x8e, 0x75, 0x24, 0x90, 0x94, 0x00, 0x5a, 0x76, 0x10, 0x50, 0xaf, 0xe5, 0x0a, 0x6b, 0xbf, + 0x28, 0x08, 0x21, 0x67, 0xb0, 0x16, 0x16, 0x2b, 0x1c, 0x14, 0x22, 0x6c, 0xb4, 0xe3, 0xd9, 0x22, + 0xa7, 0x7c, 0xac, 0xd1, 0x8e, 0xa7, 0x7d, 0x25, 0x43, 0x24, 0x9f, 0x83, 0xd1, 0x86, 0xe3, 0xd7, + 0x5d, 0xaf, 0x21, 0xa2, 0x97, 0x3c, 0xa7, 0xd1, 0x54, 0x78, 0x99, 0x42, 0x26, 0xd1, 0x59, 0x6b, + 0x45, 0x10, 0xd2, 0x75, 0xf7, 0x10, 0xd5, 0xfc, 0xf1, 0xd6, 0xd6, 0xc2, 0x62, 0xb5, 0xb5, 0x11, + 0x11, 0x1b, 0xca, 0x3d, 0x27, 0x68, 0xda, 0x3b, 0xe2, 0x9d, 0x5b, 0x1f, 0xca, 0xbb, 0x58, 0xa4, + 0x0e, 0x25, 0x47, 0x26, 0x6f, 0x42, 0x9e, 0xb6, 0x03, 0xcf, 0xb6, 0x9c, 0x86, 0xf0, 0x92, 0xd4, + 0x1b, 0xcd, 0x0e, 0x60, 0xbb, 0x5a, 0x51, 0x1b, 0x8d, 0xf8, 0xd5, 0x06, 0xeb, 0x1f, 0xbf, 0xee, + 0xb4, 0x84, 0x73, 0xa3, 0xde, 0x3f, 0xb5, 0x72, 0x75, 0x4d, 0xed, 0x1f, 0x86, 0x48, 0xde, 0x85, + 0x51, 0xb6, 0x7e, 0x1b, 0xee, 0x9e, 0x08, 0x08, 0x61, 0xe8, 0xfd, 0xc3, 0xcb, 0x12, 0xd3, 0x55, + 0x12, 0xb1, 0x85, 0x6c, 0x1f, 0xfa, 0x96, 0x53, 0x17, 0x41, 0x1e, 0xf4, 0xe5, 0x58, 0xda, 0xae, + 0x55, 0xcb, 0x0a, 0xd9, 0xb0, 0x7d, 0xe8, 0x57, 0xeb, 0x64, 0x11, 0x86, 0x31, 0x45, 0x84, 0x08, + 0x44, 0xa9, 0xd3, 0x60, 0x72, 0x08, 0x95, 0x06, 0x51, 0xd9, 0x40, 0xb6, 0x7c, 0xf4, 0x17, 0x11, + 0x89, 0x1a, 0xf4, 0x3e, 0x59, 0xab, 0xa1, 0x13, 0x89, 0xda, 0x44, 0x81, 0x4e, 0x2e, 0x01, 0x44, + 0xaf, 0xf8, 0xfc, 0xcd, 0xc5, 0x54, 0x20, 0x9f, 0x1f, 0xfa, 0xbf, 0x7e, 0xb1, 0x98, 0x59, 0x02, + 0xc8, 0xcb, 0x08, 0x35, 0xc6, 0x2a, 0x5c, 0xec, 0xb9, 0xee, 0xc9, 0x35, 0x28, 0xec, 0xda, 0x42, + 0xeb, 0x57, 0xdf, 0xb7, 0xdb, 0x6d, 0xda, 0x14, 0x3b, 0xee, 0xb4, 0x84, 0x97, 0x39, 0x98, 0x73, + 0x36, 0xde, 0x83, 0xb9, 0xb4, 0x01, 0x27, 0x2f, 0xc0, 0x84, 0x1a, 0x8c, 0x47, 0x30, 0x19, 0xb7, + 0x3b, 0x8e, 0x0c, 0xc7, 0x23, 0x18, 0xfc, 0x66, 0x06, 0x9e, 0xeb, 0xb7, 0x7d, 0x90, 0x05, 0xc8, + 0x77, 0x3c, 0xc7, 0x45, 0x31, 0x55, 0x64, 0x3b, 0x90, 0xbf, 0x31, 0x91, 0x01, 0xca, 0x53, 0x81, + 0xbd, 0x27, 0x1c, 0x3c, 0xcc, 0x31, 0x84, 0x6c, 0xda, 0x7b, 0x3e, 0xf9, 0x14, 0xcc, 0x34, 0xe8, + 0xae, 0xdd, 0x6d, 0x06, 0x96, 0x5f, 0xdf, 0xa7, 0x0d, 0xf4, 0xa9, 0x42, 0xc3, 0x3d, 0xb3, 0x20, + 0x0a, 0x6a, 0x12, 0x9e, 0x68, 0xf1, 0x70, 0x8f, 0x16, 0xdf, 0x1b, 0xca, 0x67, 0x0a, 0x59, 0x13, + 0x2d, 0xa5, 0x8c, 0xef, 0xcb, 0xc2, 0x7c, 0xaf, 0xf5, 0x42, 0xde, 0x49, 0xeb, 0x03, 0xfe, 0x70, + 0xa1, 0xc2, 0xd5, 0x87, 0x0b, 0xa5, 0x36, 0xb2, 0x08, 0xa1, 0x47, 0xd4, 0x69, 0xd1, 0x0d, 0x24, + 0x8c, 0xd1, 0x74, 0x6c, 0xdf, 0x3f, 0x64, 0x5b, 0x42, 0x4e, 0x09, 0x68, 0x2b, 0x60, 0x2a, 0x8d, + 0x84, 0x91, 0xcf, 0x02, 0xd4, 0x9b, 0xae, 0x4f, 0xd1, 0x3e, 0x40, 0xc8, 0x1a, 0xdc, 0x2c, 0x3c, + 0x84, 0xaa, 0x0f, 0xc2, 0x08, 0x2d, 0xbb, 0x0d, 0x2a, 0x06, 0xd0, 0x86, 0x0b, 0x3d, 0x36, 0x48, + 0x36, 0x3c, 0x51, 0x76, 0x78, 0x99, 0x6b, 0xaa, 0x1b, 0xe6, 0x88, 0x8f, 0xf7, 0x78, 0xb6, 0xd7, + 0x1c, 0x39, 0x02, 0x92, 0xdc, 0x05, 0x19, 0x77, 0x61, 0xdc, 0xdc, 0xf5, 0x42, 0xee, 0x1c, 0xb2, + 0xe5, 0x35, 0x49, 0x11, 0xc6, 0x65, 0x2e, 0x49, 0x26, 0xcb, 0x73, 0xe6, 0x20, 0x40, 0xf7, 0x29, + 0x4e, 0x1e, 0x8c, 0x58, 0x8a, 0x7e, 0x6f, 0x42, 0x4a, 0x18, 0x43, 0xc8, 0xe6, 0x51, 0x47, 0x7e, + 0xdd, 0x73, 0x72, 0x7e, 0xeb, 0x67, 0x93, 0x28, 0xfd, 0xd9, 0x8c, 0x1c, 0xfe, 0xe4, 0xe6, 0x7e, + 0x5a, 0xfb, 0x08, 0xa0, 0x97, 0x92, 0x68, 0x18, 0xfe, 0xcd, 0xa4, 0x16, 0xb9, 0xea, 0x84, 0xd4, + 0x22, 0x7e, 0x92, 0x2b, 0x30, 0xed, 0x71, 0x3b, 0xd6, 0xc0, 0x15, 0xfd, 0xc9, 0xf3, 0x76, 0x4c, + 0x72, 0xf0, 0xa6, 0x8b, 0x7d, 0x2a, 0xda, 0x75, 0x2f, 0xec, 0x30, 0xe5, 0xac, 0x23, 0xd7, 0x61, + 0x8c, 0x9d, 0x75, 0x18, 0xe9, 0x26, 0xe6, 0x1e, 0x81, 0x78, 0x28, 0x39, 0x98, 0xf9, 0x0f, 0xc4, + 0xdf, 0x82, 0xd7, 0xb7, 0xb3, 0x92, 0x99, 0x7a, 0xd2, 0x92, 0x0b, 0x30, 0xea, 0x7a, 0x7b, 0xca, + 0xa7, 0x8d, 0xb8, 0xde, 0x1e, 0xfb, 0xae, 0xab, 0x50, 0xe0, 0xde, 0x3a, 0x3c, 0x0c, 0x82, 0x7f, + 0xd4, 0xe6, 0x57, 0xf1, 0xbc, 0x39, 0xc5, 0xe1, 0x98, 0x30, 0xff, 0xa8, 0x5d, 0x67, 0x98, 0xbe, + 0xef, 0x5a, 0x6a, 0x80, 0x2b, 0xf1, 0xd9, 0x53, 0xbe, 0xef, 0xfe, 0xff, 0xec, 0x7d, 0x4b, 0x6c, + 0x23, 0xc9, 0x79, 0xf0, 0x34, 0x49, 0x49, 0xd4, 0x47, 0x3d, 0x5a, 0x35, 0x2f, 0xad, 0x34, 0x8f, + 0x9d, 0xde, 0x99, 0xf1, 0x0c, 0xd7, 0xbb, 0xf6, 0xcc, 0xfe, 0xeb, 0xdd, 0xb5, 0x7f, 0x3f, 0x5a, + 0x64, 0x53, 0xe2, 0x88, 0x2f, 0x77, 0x93, 0x92, 0xc7, 0x63, 0xbb, 0xdd, 0x4b, 0xb6, 0xa4, 0x8e, + 0x29, 0x92, 0x66, 0x93, 0x3b, 0x1e, 0x23, 0x40, 0x62, 0x04, 0xb0, 0x81, 0xbc, 0x9c, 0x38, 0x01, + 0x62, 0xe4, 0xe2, 0x43, 0x8c, 0x20, 0x87, 0x5c, 0x83, 0x04, 0x49, 0x2e, 0xbe, 0x19, 0x30, 0x0c, + 0x18, 0x48, 0x4e, 0x49, 0xb0, 0x48, 0x16, 0x48, 0x80, 0x3c, 0x6e, 0x41, 0x7c, 0xf0, 0x29, 0xa8, + 0xaf, 0xaa, 0xba, 0xab, 0x1f, 0xe4, 0x68, 0x3c, 0xeb, 0x24, 0x06, 0x7c, 0x92, 0xf8, 0xd5, 0x57, + 0xd5, 0xf5, 0xfc, 0xea, 0xfb, 0xbe, 0xfa, 0x1e, 0x61, 0xa4, 0xab, 0x1e, 0xd9, 0x81, 0x55, 0xda, + 0x4e, 0x10, 0x66, 0x8b, 0x33, 0x02, 0x57, 0x93, 0x8c, 0xc0, 0x93, 0x41, 0x57, 0x74, 0xd1, 0x5c, + 0xf1, 0xa5, 0x5f, 0x64, 0x1f, 0x54, 0x89, 0x63, 0x42, 0x7f, 0xcc, 0x98, 0x4d, 0x75, 0xd8, 0x8c, + 0xc4, 0x69, 0x55, 0x07, 0x47, 0x43, 0x73, 0xbd, 0x1b, 0x05, 0xf0, 0xa9, 0xf9, 0x8e, 0x22, 0x68, + 0x69, 0x4a, 0x25, 0xa2, 0xc1, 0xea, 0x89, 0xe3, 0xdb, 0xbe, 0x7f, 0xca, 0x6c, 0xc4, 0x78, 0x60, + 0xdf, 0xc2, 0x89, 0xe3, 0x5b, 0xfe, 0xa9, 0x48, 0x1c, 0x72, 0x91, 0xe2, 0x0c, 0x9d, 0xe9, 0xe4, + 0xc4, 0x96, 0xf9, 0x3f, 0x36, 0x63, 0xe7, 0x4f, 0x1c, 0xbf, 0x49, 0xcb, 0xa4, 0xb6, 0xc9, 0x4d, + 0x58, 0xc3, 0x76, 0xbb, 0x9e, 0x68, 0x18, 0x43, 0x59, 0x98, 0x2b, 0xb4, 0xe1, 0xae, 0xc7, 0x5a, + 0xe6, 0x3d, 0xfc, 0xd7, 0x0c, 0x5c, 0x4a, 0x9f, 0x1d, 0xdc, 0x9e, 0x74, 0x4e, 0xd1, 0x47, 0x8f, + 0xf7, 0x6d, 0x99, 0x42, 0x58, 0x18, 0x92, 0xb4, 0xc5, 0xc9, 0xa4, 0x2e, 0x4e, 0x11, 0x36, 0xb0, + 0x21, 0xce, 0x69, 0xf6, 0x3d, 0x7f, 0xc2, 0xa3, 0x6b, 0x98, 0xeb, 0xb4, 0x80, 0xd1, 0xf3, 0x1a, + 0x05, 0x93, 0x5b, 0xb0, 0x26, 0x28, 0xf2, 0xf0, 0xf1, 0x80, 0x7e, 0x98, 0x91, 0xe3, 0x55, 0x0e, + 0x6d, 0x22, 0x90, 0x5c, 0x84, 0x45, 0x67, 0x34, 0xa2, 0x9f, 0x64, 0x54, 0x78, 0xc1, 0x19, 0x8d, + 0x58, 0x72, 0x1b, 0xf4, 0x48, 0xb4, 0x8f, 0xd0, 0x4a, 0x88, 0x9b, 0x24, 0x9a, 0x2b, 0x08, 0x64, + 0x96, 0x43, 0x3e, 0x3d, 0xf7, 0xb4, 0xae, 0x40, 0x59, 0x42, 0x14, 0x70, 0x46, 0x01, 0xc2, 0x0b, + 0x90, 0x17, 0xef, 0xd5, 0xcc, 0xb1, 0xc2, 0x5c, 0x72, 0xf8, 0x5b, 0xf5, 0xeb, 0x70, 0xb9, 0xe7, + 0xf9, 0xb8, 0x79, 0xd9, 0x90, 0x46, 0x23, 0xee, 0x03, 0xc9, 0x82, 0xe4, 0x9a, 0x17, 0x78, 0x31, + 0x9d, 0x49, 0x7d, 0x34, 0x62, 0x9e, 0x90, 0x7c, 0xae, 0xdf, 0x84, 0x75, 0xce, 0x71, 0xf1, 0x2b, + 0x12, 0xfb, 0xc2, 0x0f, 0x30, 0x15, 0x85, 0x78, 0x3a, 0x21, 0xe0, 0xa0, 0x6a, 0x4f, 0xd4, 0xfc, + 0x07, 0x05, 0x2e, 0xa6, 0xb2, 0x6c, 0xe4, 0x8b, 0xc0, 0x5c, 0xbe, 0x26, 0x43, 0x7b, 0xec, 0x76, + 0xbd, 0x91, 0x87, 0x41, 0x31, 0x98, 0x4a, 0xf3, 0xfe, 0x3c, 0x66, 0x0f, 0xdd, 0xc7, 0xda, 0x43, + 0x33, 0xa8, 0xc4, 0x74, 0x2d, 0xea, 0x38, 0x06, 0xde, 0x7a, 0x04, 0x17, 0x53, 0x51, 0x53, 0x74, + 0x20, 0x1f, 0x8c, 0x26, 0x73, 0x16, 0x8f, 0x54, 0xb1, 0x41, 0x4b, 0xba, 0x11, 0x3e, 0xbc, 0xef, + 0x05, 0xc3, 0x8b, 0x31, 0x77, 0xc4, 0x88, 0x9f, 0xeb, 0x34, 0xf9, 0x44, 0x54, 0x9a, 0x7d, 0xb4, + 0x1f, 0xc1, 0x45, 0xbe, 0xf9, 0x8e, 0xc7, 0xce, 0xe8, 0x24, 0x6c, 0x8e, 0x75, 0xf4, 0x03, 0x69, + 0xcd, 0xb1, 0x5d, 0xb9, 0x4b, 0xf1, 0x83, 0x56, 0xcf, 0x3b, 0x49, 0x20, 0x1f, 0xc3, 0xd7, 0x32, + 0xe2, 0xa8, 0xa7, 0x74, 0x27, 0x65, 0x5b, 0x2b, 0x69, 0xdb, 0xfa, 0xec, 0x67, 0xaa, 0x01, 0x44, + 0x26, 0x56, 0x4c, 0xeb, 0xc9, 0x0d, 0xaa, 0x04, 0x9f, 0xce, 0x3b, 0x22, 0x91, 0x06, 0x8b, 0x25, + 0xd3, 0xdc, 0xe8, 0xc6, 0x41, 0x64, 0x1b, 0x96, 0x83, 0x7c, 0xd5, 0xfc, 0xe2, 0xc8, 0x33, 0x40, + 0xb5, 0x47, 0x5e, 0x84, 0x15, 0xc6, 0x92, 0x47, 0xce, 0x1c, 0x20, 0x4c, 0xa7, 0x07, 0x4f, 0xcc, + 0x81, 0x02, 0x2f, 0x3e, 0x6d, 0x0e, 0xc9, 0x21, 0x5c, 0x42, 0xb3, 0x0e, 0x7f, 0x18, 0x2c, 0x83, + 0xdd, 0x75, 0xba, 0x27, 0x2e, 0xdf, 0xb5, 0x5a, 0xea, 0x62, 0x8c, 0x46, 0x96, 0xd5, 0x94, 0xd6, + 0x61, 0x34, 0xb2, 0xfc, 0xa1, 0xf8, 0x5d, 0xa2, 0xd5, 0x79, 0x1f, 0x7a, 0xb0, 0x3d, 0xa7, 0xa6, + 0x44, 0x38, 0x14, 0x99, 0x70, 0xdc, 0x01, 0xf5, 0xc8, 0xed, 0x51, 0x9e, 0xd8, 0xed, 0x61, 0xd7, + 0xde, 0xb9, 0xcf, 0x32, 0xb4, 0x9b, 0x6b, 0x01, 0xdc, 0xf2, 0x87, 0x07, 0xf7, 0xf9, 0x57, 0x4e, + 0xc5, 0x95, 0x27, 0x8b, 0x15, 0xe4, 0x55, 0x38, 0x1f, 0x0b, 0x38, 0x12, 0x7a, 0xb0, 0x9b, 0x1b, + 0xb4, 0x28, 0x1a, 0x9e, 0xea, 0x06, 0xac, 0x88, 0x5d, 0x31, 0x0e, 0xfc, 0xe0, 0xcc, 0x02, 0x87, + 0xd1, 0x53, 0xc7, 0x3f, 0x37, 0x15, 0x83, 0x4a, 0x95, 0x48, 0xce, 0xc0, 0x4b, 0x93, 0x57, 0x80, + 0x04, 0x7c, 0x7b, 0x40, 0x28, 0xf8, 0x07, 0x37, 0x44, 0x49, 0x70, 0xc2, 0xf9, 0x67, 0xff, 0x3a, + 0x03, 0xe7, 0x53, 0x44, 0x19, 0x2a, 0x04, 0x78, 0x83, 0x89, 0x7b, 0xcc, 0x44, 0x08, 0x79, 0x90, + 0xeb, 0x12, 0x9c, 0xeb, 0xa7, 0x16, 0x59, 0x06, 0x72, 0xfe, 0x2d, 0xfe, 0x8b, 0x12, 0x0f, 0x67, + 0x2c, 0x54, 0x2f, 0xf4, 0x5f, 0x52, 0x85, 0x0d, 0x4c, 0xab, 0xe0, 0x7b, 0x43, 0xcc, 0xce, 0x80, + 0x4c, 0x48, 0x2e, 0x22, 0xec, 0x60, 0x2f, 0x5a, 0x12, 0x12, 0xe5, 0x42, 0x4c, 0x75, 0x14, 0x83, + 0x90, 0x8f, 0xc1, 0x96, 0x74, 0xd7, 0xd8, 0xb1, 0x93, 0x87, 0x96, 0xee, 0xe6, 0x65, 0x27, 0xb8, + 0x75, 0xca, 0x91, 0x33, 0xb8, 0x03, 0xd7, 0x70, 0x11, 0xbd, 0xde, 0xc8, 0x4e, 0xe4, 0xe1, 0xc0, + 0xa1, 0xb2, 0xc0, 0xf5, 0x5b, 0x14, 0xab, 0xda, 0x1b, 0xc5, 0x52, 0x72, 0xd0, 0x51, 0xf3, 0xe9, + 0x7b, 0x04, 0x17, 0x53, 0x7b, 0x4c, 0x2f, 0x18, 0x34, 0xa4, 0x0a, 0x79, 0xa3, 0x25, 0xfa, 0x9b, + 0x32, 0x47, 0x37, 0x60, 0xe5, 0x6d, 0xd7, 0x19, 0xbb, 0x63, 0x7e, 0x73, 0xf3, 0x2d, 0xc1, 0x60, + 0xf2, 0xc5, 0xdd, 0x8b, 0x2e, 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, 0x89, 0xbe, 0x94, 0x8e, 0x4d, 0x76, 0xa0, 0xc0, 0x1a, 0x67, 0x62, + 0x01, 0x7b, 0x20, 0xb8, 0x31, 0xf7, 0x0b, 0x25, 0xb4, 0x2f, 0xf6, 0x83, 0xff, 0xe9, 0x7d, 0x8d, + 0x6f, 0xb1, 0xf6, 0xa9, 0xfc, 0xfe, 0x61, 0xae, 0x20, 0x90, 0xbf, 0x7b, 0x68, 0x7f, 0xa3, 0x88, + 0xa1, 0x46, 0x84, 0x63, 0xba, 0xb5, 0x7c, 0x77, 0x20, 0xde, 0x80, 0x96, 0x4d, 0xfe, 0xeb, 0x19, + 0xb7, 0x3a, 0x79, 0x03, 0x56, 0x68, 0xb3, 0xc7, 0xd3, 0x01, 0xdb, 0x72, 0xd9, 0x48, 0xa0, 0x9d, + 0x3a, 0x2b, 0xa2, 0xcb, 0xb6, 0x77, 0xce, 0x2c, 0x9c, 0x86, 0x3f, 0x29, 0xb7, 0xec, 0x9f, 0x4e, + 0x46, 0xf2, 0x46, 0x15, 0x8a, 0x42, 0xab, 0xde, 0x6e, 0xf1, 0x2a, 0x79, 0x8a, 0x13, 0x72, 0xcb, + 0x3b, 0x8b, 0x4c, 0x55, 0xa8, 0xbd, 0x0c, 0x05, 0xa9, 0x6d, 0x3a, 0x18, 0xe6, 0x39, 0x23, 0x06, + 0xc3, 0x7e, 0xf1, 0xc5, 0x7e, 0x1b, 0xf2, 0xa2, 0x49, 0x2a, 0x16, 0x9c, 0x0c, 0x7d, 0x71, 0xc8, + 0xf1, 0x7f, 0x0a, 0xa3, 0xb3, 0x8c, 0x83, 0x5c, 0x30, 0xf1, 0x7f, 0xbc, 0x4b, 0x26, 0x0e, 0x95, + 0x07, 0xfa, 0xbe, 0x3d, 0x42, 0x0b, 0xac, 0x80, 0x79, 0xa6, 0xf0, 0x76, 0xdf, 0x67, 0x76, 0x59, + 0xfc, 0x1b, 0x7f, 0x11, 0x5c, 0xc2, 0x31, 0x6d, 0xc2, 0x2c, 0x9a, 0x19, 0xb9, 0x32, 0x32, 0xc9, + 0x2b, 0x83, 0x05, 0x50, 0xe1, 0x35, 0xd9, 0x97, 0x01, 0x61, 0x78, 0x65, 0x48, 0x94, 0x21, 0x17, + 0xa1, 0x0c, 0x92, 0x4c, 0x1e, 0xae, 0x1e, 0xbb, 0x71, 0x84, 0x4c, 0x1e, 0xa7, 0x53, 0x7f, 0x9c, + 0x11, 0x2a, 0x82, 0x9d, 0xe1, 0x70, 0xe2, 0x4f, 0xc6, 0xce, 0x28, 0xa2, 0x0a, 0x25, 0xa7, 0xf0, + 0x02, 0x72, 0xd0, 0xf7, 0x31, 0x85, 0xc5, 0x70, 0x2c, 0x62, 0x76, 0x04, 0x3b, 0xb7, 0x70, 0xff, + 0x43, 0x51, 0x1e, 0x5f, 0xa7, 0xd8, 0xba, 0x8c, 0x4c, 0x37, 0xac, 0xd4, 0xea, 0xde, 0x39, 0xf3, + 0x32, 0x6b, 0x33, 0x81, 0x45, 0xf6, 0x52, 0x0e, 0x71, 0x5c, 0x17, 0xba, 0x13, 0x9e, 0xe8, 0x68, + 0xab, 0xf2, 0x59, 0x27, 0x9f, 0x80, 0x65, 0xaf, 0x27, 0x67, 0x6a, 0x8c, 0x6b, 0xe1, 0xaa, 0x3d, + 0x16, 0x2d, 0x3a, 0x6c, 0x83, 0xee, 0x39, 0x8f, 0x43, 0x77, 0x56, 0x23, 0x4a, 0x63, 0x6d, 0x47, + 0x48, 0xa3, 0xc9, 0x6a, 0x64, 0x0d, 0x32, 0xc1, 0x0a, 0x67, 0xbc, 0x1e, 0x3b, 0x5e, 0x61, 0xbc, + 0x6a, 0x93, 0xff, 0xd2, 0x7e, 0x19, 0xee, 0x9c, 0x75, 0x8e, 0xe8, 0x51, 0x9c, 0x31, 0xe1, 0xcb, + 0xe6, 0x86, 0x93, 0x98, 0xb7, 0x1b, 0x20, 0x87, 0xdb, 0xf5, 0x04, 0xf1, 0x13, 0xb0, 0xce, 0xd8, + 0xd3, 0xfe, 0x3c, 0x0b, 0x6b, 0x51, 0x35, 0x39, 0x79, 0x19, 0x72, 0x12, 0x05, 0xba, 0x9c, 0xa2, + 0x4b, 0x47, 0xba, 0x83, 0x48, 0x67, 0xa2, 0x38, 0xe4, 0x01, 0xac, 0xa1, 0xe1, 0x1e, 0xb2, 0x9e, + 0x13, 0x8f, 0x3f, 0xbe, 0xcc, 0x7f, 0x3f, 0xcb, 0x7f, 0xff, 0xdd, 0xeb, 0xe7, 0xf0, 0xa9, 0x6c, + 0x85, 0xd6, 0xa5, 0xdc, 0x1f, 0x2d, 0x94, 0xb4, 0xa0, 0xb9, 0xd9, 0x5a, 0x50, 0x3e, 0x94, 0x19, + 0x5a, 0xd0, 0x85, 0x39, 0x5a, 0xd0, 0xb0, 0xa6, 0xac, 0x05, 0x45, 0x5d, 0xf8, 0xd2, 0x2c, 0x5d, + 0x78, 0x58, 0x87, 0xe9, 0xc2, 0x43, 0x2d, 0x66, 0x7e, 0xa6, 0x16, 0x33, 0xac, 0xc3, 0xb5, 0x98, + 0x37, 0xf9, 0x1c, 0x8d, 0x9d, 0xc7, 0x36, 0x4e, 0x1e, 0xbf, 0x16, 0x71, 0xf4, 0xa6, 0xf3, 0x18, + 0x8d, 0x6b, 0x76, 0x96, 0x41, 0x58, 0xe4, 0x68, 0xbf, 0xa7, 0xc4, 0x34, 0x81, 0x62, 0xfd, 0x6e, + 0xc1, 0x1a, 0xbb, 0xac, 0xdc, 0x9e, 0x24, 0x6b, 0xae, 0x9a, 0xab, 0x02, 0xca, 0xe4, 0xcd, 0x0f, + 0xc0, 0x7a, 0x80, 0xc6, 0x45, 0x2e, 0xf4, 0xd4, 0x33, 0x83, 0xda, 0x3c, 0xec, 0xcc, 0xcb, 0xb0, + 0x11, 0x20, 0x72, 0x6d, 0x0e, 0x13, 0x37, 0x57, 0x4d, 0x55, 0x14, 0xb4, 0x38, 0x5c, 0x3b, 0x8e, + 0x4b, 0x1e, 0x3f, 0xa3, 0x5e, 0x69, 0xdf, 0xcb, 0x46, 0xb4, 0x24, 0xe2, 0x33, 0xf4, 0x16, 0xf5, + 0x87, 0x36, 0x9f, 0x24, 0x4e, 0x8b, 0x6e, 0xcc, 0x58, 0x33, 0x6e, 0xd3, 0x64, 0x59, 0x4d, 0x13, + 0x7c, 0x7f, 0x28, 0x4c, 0x9c, 0x6c, 0xc6, 0x51, 0xb3, 0x7b, 0x1f, 0xf7, 0xac, 0x68, 0x8e, 0x11, + 0x9e, 0xe2, 0xfc, 0xe6, 0x84, 0x98, 0x4a, 0xb7, 0x2c, 0x72, 0xd6, 0xc1, 0x2f, 0xf1, 0x81, 0x0e, + 0xa0, 0x52, 0xd1, 0x8f, 0x36, 0x9e, 0x4d, 0x91, 0x9d, 0x12, 0x8d, 0xe3, 0x2c, 0x61, 0xcb, 0xea, + 0x54, 0xfc, 0x2b, 0x9a, 0x35, 0x60, 0x05, 0x75, 0x14, 0xa2, 0xc1, 0x5c, 0x8a, 0x0a, 0x3e, 0x39, + 0xf8, 0x52, 0xb5, 0x6e, 0x16, 0x68, 0x3d, 0xd1, 0xcc, 0x09, 0xbc, 0x20, 0x6b, 0x16, 0xa2, 0x9d, + 0x5c, 0x10, 0x51, 0x74, 0xe7, 0xce, 0x40, 0xa8, 0x80, 0xc0, 0xae, 0x5e, 0x72, 0xa2, 0x00, 0x8e, + 0xa6, 0x9d, 0xc0, 0xd6, 0xec, 0x25, 0x99, 0x93, 0xa1, 0x29, 0xbc, 0x40, 0x33, 0xf2, 0x05, 0x2a, + 0xeb, 0x19, 0xb2, 0x11, 0x3d, 0x83, 0xf6, 0x47, 0x59, 0x78, 0xe9, 0x0c, 0xcb, 0x35, 0xe7, 0x9b, + 0x9f, 0x8a, 0xb2, 0x67, 0x99, 0x88, 0x64, 0x48, 0x1b, 0xe5, 0x04, 0x92, 0x4a, 0xa9, 0xe9, 0xcc, + 0xd9, 0x17, 0x61, 0x9d, 0x51, 0x41, 0x66, 0x96, 0x78, 0x34, 0xed, 0x9f, 0x81, 0x0c, 0x6e, 0x0b, + 0x1f, 0xaa, 0x58, 0x55, 0xa4, 0x8c, 0x48, 0x31, 0xac, 0x00, 0x46, 0xda, 0x50, 0x40, 0xb4, 0x23, + 0xc7, 0xeb, 0x9f, 0xc9, 0x99, 0x47, 0x78, 0x68, 0xc9, 0xd5, 0x98, 0x35, 0x35, 0x05, 0x54, 0xf0, + 0x37, 0xb9, 0x0d, 0xeb, 0x83, 0xe9, 0x29, 0x65, 0x3c, 0xd8, 0x5e, 0xe0, 0xd6, 0x1f, 0x0b, 0xe6, + 0xea, 0x60, 0x7a, 0xaa, 0x8f, 0x46, 0xb8, 0xa4, 0x68, 0x26, 0xb2, 0x41, 0xf1, 0xd8, 0xa9, 0x15, + 0x98, 0x8b, 0x88, 0x49, 0x1b, 0x60, 0xe7, 0x96, 0xe3, 0x5e, 0x00, 0x66, 0x34, 0xc8, 0x33, 0x54, + 0xb1, 0x1f, 0xda, 0x8f, 0x33, 0x42, 0xde, 0x9d, 0xbd, 0xef, 0x7f, 0xb1, 0x44, 0x29, 0x4b, 0x74, + 0x07, 0x54, 0x3a, 0xf5, 0x21, 0x51, 0x09, 0xd6, 0x68, 0x6d, 0x30, 0x3d, 0x0d, 0xe6, 0x4e, 0x9e, + 0xf8, 0x45, 0x79, 0xe2, 0xdf, 0x10, 0xf2, 0x70, 0x2a, 0x79, 0x98, 0x3d, 0xe5, 0xda, 0x7f, 0x64, + 0xe1, 0xf6, 0xd9, 0x88, 0xc0, 0x2f, 0xd6, 0x2d, 0x65, 0xdd, 0x62, 0xaa, 0xd3, 0x85, 0x84, 0xea, + 0x34, 0xe5, 0xec, 0x2d, 0xa6, 0x9d, 0xbd, 0x84, 0xa2, 0x76, 0x29, 0x45, 0x51, 0x9b, 0x7a, 0x40, + 0xf3, 0x4f, 0x39, 0xa0, 0xcb, 0xf2, 0x3e, 0xf9, 0x97, 0x40, 0x81, 0x11, 0x95, 0x07, 0x1e, 0xc1, + 0x79, 0x21, 0x0f, 0xb0, 0x9b, 0x23, 0xd4, 0xbf, 0x17, 0xee, 0xdf, 0x4d, 0x93, 0x04, 0x10, 0x2d, + 0x85, 0x5b, 0xdf, 0xe0, 0x32, 0x40, 0x58, 0xfe, 0x7f, 0x87, 0xfb, 0x27, 0x0f, 0xe1, 0x12, 0xc6, + 0x77, 0xef, 0xca, 0x2f, 0x07, 0xf6, 0xd8, 0x3d, 0xe2, 0xfb, 0xe1, 0x46, 0x82, 0x57, 0xf6, 0xba, + 0x52, 0x77, 0x4c, 0xf7, 0x68, 0xef, 0x9c, 0x79, 0xc1, 0x4f, 0x81, 0xc7, 0x05, 0x8b, 0x3f, 0x55, + 0x40, 0x7b, 0xfa, 0x7c, 0xa1, 0xa2, 0x2a, 0x3e, 0xe1, 0xcb, 0x66, 0xc1, 0x91, 0x66, 0xef, 0x25, + 0x58, 0x1d, 0xbb, 0x47, 0x63, 0xd7, 0x3f, 0x89, 0x68, 0x40, 0x56, 0x38, 0x50, 0x4c, 0x8c, 0x88, + 0x32, 0xf9, 0x4c, 0x9c, 0xb9, 0xa8, 0xa4, 0x55, 0x02, 0x79, 0x31, 0x75, 0x1d, 0xe8, 0x6e, 0x92, + 0x3b, 0xc8, 0x7e, 0x3c, 0xc8, 0xe5, 0x33, 0x6a, 0xd6, 0xe4, 0xb1, 0x30, 0x8f, 0xbc, 0xbe, 0xab, + 0xfd, 0xa5, 0x22, 0x38, 0x82, 0xb4, 0xc9, 0x23, 0x8f, 0x24, 0x63, 0xde, 0x6c, 0x82, 0x0d, 0x49, + 0xab, 0x22, 0xdb, 0x3d, 0xf2, 0xf0, 0x8c, 0x08, 0x88, 0x84, 0x67, 0x44, 0xc8, 0x73, 0x58, 0x24, + 0x72, 0xa9, 0xf9, 0x2d, 0x61, 0x11, 0x44, 0x69, 0xde, 0xc1, 0x3d, 0x72, 0x17, 0x96, 0x98, 0x11, + 0x90, 0xe8, 0xee, 0x7a, 0xa4, 0xbb, 0x07, 0xf7, 0x4c, 0x51, 0xae, 0x7d, 0x3b, 0x78, 0xd7, 0x4a, + 0x0c, 0xe2, 0xe0, 0x1e, 0x79, 0xe3, 0x6c, 0xc6, 0xb9, 0x79, 0x61, 0x9c, 0x1b, 0x18, 0xe6, 0xbe, + 0x19, 0x31, 0xcc, 0xbd, 0x39, 0x7f, 0xb6, 0xf8, 0x6b, 0x24, 0x0b, 0x47, 0x18, 0x86, 0xa9, 0xfa, + 0xb1, 0x02, 0x57, 0xe7, 0xd6, 0x20, 0x57, 0x20, 0xaf, 0xb7, 0xaa, 0xed, 0x70, 0x7d, 0xe9, 0x99, + 0x11, 0x10, 0xb2, 0x0b, 0xcb, 0x3b, 0x8e, 0xef, 0x75, 0xe9, 0x36, 0x4e, 0x7d, 0x1e, 0x48, 0x34, + 0x1b, 0xa0, 0xef, 0x9d, 0x33, 0xc3, 0xba, 0xc4, 0x86, 0x0d, 0x3c, 0x0b, 0x91, 0xd4, 0x4f, 0xd9, + 0x14, 0x5d, 0x43, 0xa2, 0xc1, 0x44, 0x35, 0x4a, 0x67, 0x12, 0xc0, 0xf8, 0x11, 0x7c, 0x47, 0xf0, + 0x22, 0xb3, 0x3b, 0xf8, 0x0c, 0x71, 0x55, 0xef, 0x40, 0xbe, 0x25, 0xec, 0x04, 0x24, 0x6b, 0x76, + 0x61, 0x13, 0x60, 0x06, 0xa5, 0xda, 0x6f, 0x2a, 0x42, 0x21, 0xf0, 0xf4, 0x81, 0x48, 0x59, 0xb3, + 0x7a, 0xf3, 0xb3, 0x66, 0xf5, 0x7e, 0xca, 0xac, 0x59, 0xda, 0x9f, 0xf0, 0xa8, 0xe7, 0xd5, 0x5e, + 0x2b, 0xa6, 0x99, 0x7d, 0x5e, 0xaf, 0x04, 0x23, 0xb2, 0x3b, 0x5f, 0x92, 0xb2, 0x2e, 0x26, 0xbf, + 0x35, 0xdb, 0x39, 0x41, 0xda, 0xaa, 0x7f, 0x90, 0x85, 0x2b, 0xf3, 0xaa, 0xa7, 0xe6, 0x75, 0x56, + 0x9e, 0x2d, 0xaf, 0xf3, 0x5d, 0xc8, 0x33, 0x58, 0x60, 0x72, 0x8f, 0x13, 0xce, 0xab, 0xd2, 0x09, + 0x17, 0xc5, 0xe4, 0x25, 0x58, 0xd4, 0x4b, 0x56, 0x98, 0x6a, 0x0c, 0x6d, 0x63, 0x9d, 0xae, 0x8f, + 0x56, 0x97, 0xbc, 0x88, 0x7c, 0x21, 0x99, 0x5d, 0x8f, 0xe7, 0x18, 0xdb, 0x96, 0x26, 0x24, 0x91, + 0x90, 0x00, 0xfb, 0x1b, 0x06, 0xd0, 0xe7, 0x31, 0xa9, 0xcd, 0x64, 0xa6, 0x3e, 0x0d, 0x16, 0x5b, + 0x63, 0xd7, 0x77, 0x27, 0xb2, 0xdd, 0xea, 0x08, 0x21, 0x26, 0x2f, 0xe1, 0x56, 0xa5, 0xce, 0x13, + 0x16, 0x44, 0x60, 0x51, 0x0e, 0xec, 0x82, 0x66, 0xa8, 0x14, 0x6c, 0x4a, 0x28, 0xb4, 0x42, 0xcd, + 0x99, 0x0e, 0xba, 0x27, 0x1d, 0xb3, 0xc6, 0x59, 0x0d, 0x56, 0xa1, 0x8f, 0x50, 0x3a, 0x40, 0xdf, + 0x94, 0x50, 0xb4, 0x6f, 0x28, 0x70, 0x21, 0x6d, 0x1c, 0xe4, 0x0a, 0xe4, 0x06, 0xa9, 0x89, 0x04, + 0x07, 0xcc, 0xf7, 0xb9, 0x40, 0xff, 0xda, 0x47, 0xc3, 0xf1, 0xa9, 0x33, 0x91, 0xad, 0x7b, 0x25, + 0xb0, 0x09, 0xf4, 0x47, 0x05, 0xff, 0x27, 0xd7, 0x05, 0x8d, 0xce, 0x26, 0x52, 0x0f, 0xe2, 0x1f, + 0x4d, 0x07, 0xa8, 0xf6, 0x5a, 0xcd, 0x11, 0x0b, 0x88, 0xff, 0x1a, 0xe4, 0x68, 0xb7, 0x62, 0xbb, + 0x97, 0xee, 0x1f, 0xbd, 0x5e, 0xe3, 0x48, 0xac, 0x57, 0xbe, 0x73, 0xda, 0x37, 0x11, 0x59, 0x3b, + 0x84, 0xb5, 0x28, 0x06, 0x31, 0xa2, 0x21, 0x54, 0x0b, 0xf7, 0x55, 0xde, 0xd2, 0xce, 0x70, 0xc8, + 0x3c, 0x4c, 0x76, 0x5e, 0xf8, 0xbb, 0x77, 0xaf, 0x03, 0xfd, 0xc9, 0xea, 0xa4, 0x85, 0x58, 0xd5, + 0xbe, 0x99, 0x81, 0x0b, 0xa1, 0x53, 0xbb, 0x38, 0x43, 0x3f, 0xb7, 0x1e, 0x96, 0x7a, 0xc4, 0x03, + 0x50, 0x30, 0x5a, 0xc9, 0x01, 0xce, 0x71, 0x3c, 0xda, 0x85, 0xcd, 0x59, 0xf8, 0xe4, 0x65, 0x58, + 0xc6, 0x38, 0x48, 0x23, 0xa7, 0xeb, 0xca, 0xb4, 0x6f, 0x20, 0x80, 0x66, 0x58, 0xae, 0xfd, 0x50, + 0x81, 0x2d, 0xee, 0x17, 0x51, 0x77, 0xbc, 0x01, 0xaa, 0xd5, 0xbb, 0xee, 0xfb, 0xe3, 0x21, 0xbc, + 0x1b, 0xa1, 0x63, 0xb7, 0xa2, 0xee, 0x2f, 0x89, 0xaf, 0xcd, 0x1e, 0x2d, 0xb9, 0x8b, 0xb1, 0xbd, + 0xf8, 0xb3, 0x73, 0x8e, 0x45, 0x64, 0x18, 0x50, 0x80, 0x1c, 0x91, 0x01, 0x31, 0xb4, 0x5f, 0x81, + 0x6b, 0xf3, 0x3f, 0x40, 0x3e, 0x0f, 0xab, 0x98, 0x2c, 0xaa, 0x33, 0x3a, 0x1e, 0x3b, 0x3d, 0x57, + 0xa8, 0xc2, 0x84, 0xfa, 0x52, 0x2e, 0x63, 0xa1, 0xca, 0x78, 0x84, 0x80, 0x63, 0x4c, 0x43, 0xc5, + 0x2b, 0x45, 0x9c, 0x8f, 0xe4, 0xd6, 0xb4, 0x5f, 0x55, 0x80, 0x24, 0xdb, 0x20, 0x1f, 0x81, 0x95, + 0x4e, 0xbb, 0x64, 0x4d, 0x9c, 0xf1, 0x64, 0x6f, 0x38, 0x1d, 0xf3, 0x38, 0x61, 0xcc, 0x61, 0x7c, + 0xd2, 0xb5, 0xd9, 0x03, 0xca, 0xc9, 0x70, 0x3a, 0x36, 0x23, 0x78, 0x98, 0xe5, 0xc8, 0x75, 0xbf, + 0xd4, 0x73, 0x9e, 0x44, 0xb3, 0x1c, 0x71, 0x58, 0x24, 0xcb, 0x11, 0x87, 0x69, 0xdf, 0x55, 0x60, + 0x5b, 0x58, 0x13, 0xf6, 0x52, 0xfa, 0x52, 0xc2, 0xb0, 0x28, 0x63, 0x11, 0x98, 0x76, 0x1e, 0x4b, + 0xbb, 0x21, 0x22, 0x07, 0x61, 0x07, 0x91, 0xb7, 0x65, 0x75, 0xc9, 0xa7, 0x20, 0x67, 0x4d, 0x86, + 0xa3, 0x33, 0x84, 0x0e, 0x52, 0x83, 0x15, 0x9d, 0x0c, 0x47, 0xd8, 0x04, 0xd6, 0xd4, 0x5c, 0xb8, + 0x20, 0x77, 0x4e, 0xf4, 0x98, 0xd4, 0x61, 0x89, 0xc7, 0x88, 0x8b, 0x3d, 0xd4, 0xcf, 0x19, 0xd3, + 0xce, 0xba, 0x88, 0x4f, 0xc4, 0x03, 0xa3, 0x9a, 0xa2, 0x0d, 0xed, 0xb7, 0x15, 0x28, 0x50, 0x6e, + 0x03, 0xa5, 0xb8, 0xe7, 0xdd, 0xd2, 0x51, 0xc6, 0x51, 0xd8, 0x9d, 0x04, 0xcd, 0x9f, 0xe9, 0x36, + 0x7e, 0x1d, 0xd6, 0x63, 0x15, 0x88, 0x86, 0x91, 0x29, 0xfa, 0x5e, 0xd7, 0x61, 0x49, 0x53, 0x98, + 0xcd, 0x46, 0x04, 0xa6, 0xfd, 0xba, 0x02, 0x17, 0xa8, 0xcc, 0xcf, 0xde, 0x39, 0xcd, 0x69, 0x5f, + 0x9c, 0x77, 0xca, 0x41, 0x09, 0xb3, 0x54, 0xe6, 0x35, 0xcf, 0x38, 0x28, 0x0e, 0x33, 0x83, 0x52, + 0xb2, 0x07, 0x79, 0x7e, 0xbf, 0xf8, 0x3c, 0x9e, 0xe9, 0x35, 0x49, 0x99, 0x10, 0x36, 0xcc, 0x91, + 0xe8, 0x48, 0x90, 0x84, 0xf1, 0x3a, 0x66, 0x50, 0x5b, 0xfb, 0x4f, 0x05, 0x2e, 0xcf, 0xa8, 0x43, + 0x3e, 0x0e, 0x0b, 0xe8, 0xd1, 0xc7, 0x57, 0xef, 0xca, 0x8c, 0x4f, 0x4c, 0xba, 0x27, 0x07, 0xf7, + 0xd8, 0x45, 0x74, 0x4a, 0x7f, 0x98, 0xac, 0x16, 0x79, 0x04, 0xcb, 0x7a, 0xaf, 0xc7, 0xc5, 0x99, + 0x4c, 0x44, 0x9c, 0x99, 0xf1, 0xc5, 0x57, 0x03, 0x7c, 0x26, 0xce, 0x30, 0xdf, 0x92, 0x5e, 0xcf, + 0xe6, 0xde, 0x8a, 0x61, 0x7b, 0x5b, 0xff, 0x1f, 0xd6, 0xa2, 0xc8, 0xcf, 0xe4, 0x60, 0xf5, 0x6d, + 0x05, 0xd4, 0x68, 0x1f, 0x7e, 0x36, 0x91, 0x95, 0xd2, 0x96, 0xf9, 0x29, 0x9b, 0xea, 0x77, 0x33, + 0x70, 0x31, 0x75, 0x86, 0xc9, 0x2b, 0xb0, 0xa8, 0x8f, 0x46, 0xd5, 0x32, 0xdf, 0x55, 0x9c, 0x43, + 0x42, 0x2d, 0x71, 0x44, 0xda, 0x63, 0x48, 0xe4, 0x35, 0xc8, 0xb3, 0xe7, 0xf4, 0xb2, 0x20, 0x38, + 0x18, 0x2a, 0x86, 0xbf, 0xf5, 0x47, 0x23, 0x8b, 0x0a, 0x44, 0x52, 0x81, 0x35, 0x1e, 0x64, 0xc5, + 0x74, 0x8f, 0xdd, 0xaf, 0x04, 0x21, 0xee, 0x31, 0x0a, 0xbf, 0x50, 0x3d, 0xdb, 0x63, 0x56, 0x26, + 0x87, 0x19, 0x89, 0xd6, 0x22, 0x35, 0x50, 0xb1, 0x4d, 0xb9, 0x25, 0x16, 0xde, 0x14, 0xc3, 0xde, + 0xb0, 0x4e, 0xcc, 0x68, 0x2b, 0x51, 0x33, 0x58, 0x2e, 0xdd, 0xf7, 0xbd, 0xe3, 0xc1, 0xa9, 0x3b, + 0x98, 0xfc, 0xec, 0x96, 0x2b, 0xfc, 0xc6, 0x99, 0x96, 0xeb, 0xf7, 0x73, 0xec, 0x30, 0xc7, 0xab, + 0x51, 0x8e, 0x46, 0x8a, 0x68, 0x8d, 0x1c, 0x0d, 0x15, 0x9a, 0x78, 0x18, 0x91, 0x32, 0x2c, 0xb1, + 0xf0, 0x2e, 0xe2, 0x64, 0x5c, 0x4d, 0xed, 0x02, 0xc3, 0x39, 0xb8, 0xc7, 0xd8, 0x17, 0xe6, 0x5a, + 0xe8, 0x9b, 0xa2, 0x2a, 0x39, 0x80, 0x42, 0xa9, 0xef, 0x3a, 0x83, 0xe9, 0xa8, 0x7d, 0xb6, 0x27, + 0xc7, 0x4d, 0x3e, 0x96, 0x95, 0x2e, 0xab, 0x86, 0x4f, 0x95, 0x48, 0xc9, 0xe5, 0x86, 0x48, 0x3b, + 0xf0, 0x36, 0xca, 0xa1, 0xa6, 0xf2, 0xc3, 0x73, 0xe6, 0x27, 0x0e, 0xc4, 0x7a, 0x51, 0x57, 0x3a, + 0xee, 0x8e, 0x64, 0xc3, 0x5a, 0xcd, 0xf1, 0x27, 0xed, 0xb1, 0x33, 0xf0, 0x31, 0x2c, 0xe4, 0x19, + 0xc2, 0x66, 0x6d, 0x8b, 0x94, 0xc3, 0xa8, 0x63, 0x9c, 0x04, 0x55, 0x99, 0x06, 0x33, 0xda, 0x1c, + 0xe5, 0x97, 0x2a, 0xde, 0xc0, 0xe9, 0x7b, 0x5f, 0x15, 0x4e, 0x99, 0x8c, 0x5f, 0x3a, 0x12, 0x40, + 0x33, 0x2c, 0xd7, 0x3e, 0x97, 0x58, 0x37, 0xd6, 0xcb, 0x02, 0x2c, 0x71, 0x97, 0x7d, 0xe6, 0xc2, + 0xde, 0x32, 0x1a, 0xe5, 0x6a, 0x63, 0x57, 0x55, 0xc8, 0x1a, 0x40, 0xcb, 0x6c, 0x96, 0x0c, 0xcb, + 0xa2, 0xbf, 0x33, 0xf4, 0x37, 0xf7, 0x6f, 0xaf, 0x74, 0x6a, 0x6a, 0x56, 0x72, 0x71, 0xcf, 0x69, + 0x3f, 0x50, 0xe0, 0x52, 0xfa, 0x52, 0x92, 0x36, 0x60, 0x90, 0x03, 0xfe, 0xf8, 0xfc, 0x91, 0xb9, + 0xeb, 0x9e, 0x0a, 0x8e, 0x07, 0x4b, 0x98, 0x30, 0x27, 0xfc, 0x8c, 0x78, 0x2c, 0x62, 0x5e, 0x7d, + 0x5e, 0xcf, 0xcc, 0x78, 0x3d, 0xad, 0x04, 0x9b, 0xb3, 0xda, 0x88, 0x0e, 0x75, 0x1d, 0x0a, 0x7a, + 0xab, 0x55, 0xab, 0x96, 0xf4, 0x76, 0xb5, 0xd9, 0x50, 0x15, 0xb2, 0x0c, 0x0b, 0xbb, 0x66, 0xb3, + 0xd3, 0x52, 0x33, 0xda, 0xb7, 0x14, 0x58, 0xad, 0x86, 0x66, 0x5a, 0xcf, 0x7b, 0xf8, 0x3e, 0x1a, + 0x39, 0x7c, 0x9b, 0x41, 0x38, 0x90, 0xe0, 0x03, 0x67, 0x3a, 0x79, 0x7f, 0xab, 0xc0, 0x46, 0xa2, + 0x0e, 0xb1, 0x60, 0x49, 0x3f, 0xb4, 0x9a, 0xd5, 0x72, 0x89, 0xf7, 0xec, 0x7a, 0x68, 0x5f, 0x84, + 0x19, 0x9f, 0x12, 0x5f, 0x61, 0x2e, 0xb4, 0x8f, 0x7d, 0x7b, 0xe8, 0xf5, 0xa4, 0x6c, 0xad, 0x7b, + 0xe7, 0x4c, 0xd1, 0x12, 0xde, 0x64, 0x5f, 0x9d, 0x8e, 0x5d, 0x6c, 0x36, 0x13, 0x51, 0x84, 0x06, + 0xf0, 0x64, 0xc3, 0xe8, 0xf0, 0xe0, 0xd0, 0xf2, 0x64, 0xd3, 0x61, 0x7b, 0x3b, 0xab, 0x50, 0xe0, + 0x52, 0x0b, 0x0a, 0x04, 0xdf, 0x53, 0x60, 0x73, 0x56, 0x5f, 0xa9, 0x20, 0x14, 0xf5, 0xa7, 0xbf, + 0x14, 0x64, 0x70, 0x88, 0x3a, 0xd2, 0x0b, 0x34, 0xf2, 0x49, 0x28, 0x54, 0x7d, 0x7f, 0xea, 0x8e, + 0xad, 0xd7, 0x3a, 0x66, 0x95, 0x6f, 0x90, 0xab, 0xff, 0xf6, 0xee, 0xf5, 0xcb, 0xe8, 0x96, 0x30, + 0xb6, 0xfd, 0xd7, 0xec, 0xe9, 0xd8, 0x8b, 0x44, 0xbb, 0x97, 0x6b, 0x50, 0xbe, 0xd5, 0x99, 0xf6, + 0x3c, 0x57, 0x70, 0xed, 0xc2, 0xe7, 0x98, 0xc3, 0xe4, 0x5b, 0x44, 0xc0, 0xb4, 0xaf, 0x2b, 0xb0, + 0x35, 0x7b, 0x62, 0xe8, 0xcd, 0xd4, 0x66, 0x56, 0x3f, 0xc2, 0xeb, 0x17, 0x6f, 0xa6, 0xc0, 0x34, + 0x48, 0x6e, 0x53, 0x20, 0xd2, 0x4a, 0x41, 0xf6, 0xf4, 0x4c, 0x22, 0x65, 0x72, 0xb4, 0x92, 0x40, + 0xd4, 0xfe, 0x3d, 0x03, 0x97, 0xe8, 0xa6, 0xeb, 0xbb, 0xbe, 0xaf, 0x4f, 0x27, 0x27, 0xee, 0x60, + 0xc2, 0xd9, 0x30, 0xf2, 0x06, 0x2c, 0x9e, 0x3c, 0x9b, 0xca, 0x91, 0xa1, 0x13, 0x02, 0x48, 0xc8, + 0x85, 0x93, 0x05, 0xfd, 0x9f, 0xdc, 0x00, 0x39, 0x49, 0x75, 0x16, 0xc3, 0x64, 0x66, 0x36, 0x15, + 0x73, 0x79, 0x14, 0xe4, 0x93, 0x7d, 0x13, 0x16, 0x50, 0xcd, 0xc0, 0x49, 0xaa, 0x60, 0x85, 0xd3, + 0x7b, 0x87, 0x4a, 0x08, 0x93, 0x55, 0x20, 0x1f, 0x02, 0x08, 0x33, 0x0c, 0x70, 0x9a, 0x29, 0xc4, + 0xef, 0x20, 0xc9, 0x80, 0xb9, 0x7c, 0x7a, 0xe4, 0xf0, 0xb0, 0xfd, 0x45, 0xd8, 0x10, 0xd3, 0x32, + 0x12, 0xd1, 0xf5, 0xf8, 0x6b, 0xd8, 0x3a, 0x2b, 0xa8, 0x8e, 0x44, 0x84, 0xbd, 0x9b, 0x89, 0x44, + 0xbb, 0x18, 0x64, 0x37, 0x96, 0x4d, 0xf7, 0x66, 0x22, 0x9b, 0x6e, 0x9e, 0x61, 0xc9, 0x29, 0x73, + 0xb5, 0x7f, 0xce, 0xc0, 0xf2, 0x21, 0x65, 0x56, 0x50, 0x04, 0x9f, 0x2f, 0xd2, 0xdf, 0x87, 0x42, + 0x6d, 0xe8, 0xf0, 0x67, 0x07, 0xee, 0x9b, 0xc0, 0x7c, 0x83, 0xfb, 0x43, 0x47, 0xbc, 0x60, 0xf8, + 0xa6, 0x8c, 0xf4, 0x14, 0xbf, 0xe6, 0x07, 0xb0, 0xc8, 0x9e, 0x81, 0xb8, 0x76, 0x49, 0xb0, 0xab, + 0x41, 0x8f, 0x5e, 0x65, 0xc5, 0x92, 0xa6, 0x9c, 0x3d, 0x25, 0xc9, 0xbc, 0x13, 0x8f, 0x15, 0x2a, + 0x29, 0x1c, 0x16, 0xce, 0xa6, 0x70, 0x90, 0x62, 0xa2, 0x2d, 0x9e, 0x25, 0x26, 0xda, 0xd6, 0x5b, + 0x50, 0x90, 0xfa, 0xf3, 0x4c, 0xdc, 0xeb, 0xd7, 0x32, 0xb0, 0x8a, 0xa3, 0x0a, 0x6c, 0x42, 0x7e, + 0x3e, 0xd5, 0x27, 0x1f, 0x8d, 0xa8, 0x4f, 0x36, 0xe5, 0xf5, 0x62, 0x23, 0x9b, 0xa3, 0x37, 0x79, + 0x00, 0x1b, 0x09, 0x44, 0xf2, 0x3a, 0x2c, 0xd0, 0xee, 0x0b, 0x71, 0x53, 0x8d, 0xef, 0x80, 0x30, + 0x7e, 0x2e, 0x1d, 0xb8, 0x6f, 0x32, 0x6c, 0xed, 0xbf, 0x14, 0x58, 0xe1, 0xe9, 0x2b, 0x06, 0x47, + 0xc3, 0xa7, 0x4e, 0xe7, 0xed, 0xf8, 0x74, 0xb2, 0x28, 0x1d, 0x7c, 0x3a, 0xff, 0xa7, 0x27, 0xf1, + 0xad, 0xc8, 0x24, 0x5e, 0x0e, 0xa2, 0xe9, 0x89, 0xe1, 0xcc, 0x99, 0xc3, 0xbf, 0xc2, 0xf8, 0xb2, + 0x51, 0x44, 0xf2, 0x05, 0x58, 0x6e, 0xb8, 0x8f, 0x23, 0x52, 0xdb, 0xed, 0x19, 0x8d, 0xbe, 0x1a, + 0x20, 0xb2, 0x33, 0x85, 0x17, 0xde, 0xc0, 0x7d, 0x6c, 0x27, 0x5e, 0xa0, 0xc2, 0x26, 0xa9, 0xe0, + 0x16, 0xad, 0xf6, 0x2c, 0x5b, 0x9f, 0x3b, 0x4a, 0x62, 0xe0, 0x99, 0x6f, 0x64, 0x01, 0x42, 0x1f, + 0x33, 0x7a, 0x00, 0x23, 0x8f, 0xef, 0x42, 0xe1, 0x8d, 0x20, 0x79, 0x8f, 0x8b, 0x37, 0xf9, 0xdb, + 0x5c, 0x31, 0x9b, 0x99, 0x1d, 0xed, 0x10, 0x55, 0xb4, 0x25, 0xee, 0xd4, 0xd4, 0x73, 0xfb, 0x0e, + 0xa3, 0xed, 0xd9, 0x9d, 0x9b, 0x18, 0xdc, 0x36, 0x80, 0xce, 0xc8, 0x43, 0x8c, 0xae, 0x4f, 0x65, + 0x8a, 0x90, 0xf0, 0xdb, 0xcc, 0x3d, 0x9b, 0xdf, 0x66, 0x0b, 0x96, 0xbd, 0xc1, 0x3b, 0xee, 0x60, + 0x32, 0x1c, 0x3f, 0x41, 0x6d, 0x74, 0xa8, 0xe6, 0xa2, 0x53, 0x50, 0x15, 0x65, 0x6c, 0x1d, 0xf0, + 0x62, 0x0c, 0xf0, 0xe5, 0x65, 0x08, 0x80, 0x81, 0xdf, 0xe9, 0x82, 0xba, 0xf8, 0x20, 0x97, 0x5f, + 0x54, 0x97, 0x1e, 0xe4, 0xf2, 0x79, 0x75, 0xf9, 0x41, 0x2e, 0xbf, 0xac, 0x82, 0x29, 0xbd, 0xef, + 0x04, 0xef, 0x37, 0xd2, 0x93, 0x4b, 0xf4, 0x39, 0x45, 0xfb, 0x49, 0x06, 0x48, 0xb2, 0x1b, 0xe4, + 0xa3, 0x50, 0x60, 0x04, 0xd6, 0x1e, 0xfb, 0x5f, 0xe6, 0x66, 0xeb, 0x2c, 0x7c, 0x8f, 0x04, 0x96, + 0xc3, 0xf7, 0x30, 0xb0, 0xe9, 0x7f, 0xb9, 0x4f, 0x3e, 0x0f, 0xe7, 0x71, 0x7a, 0x47, 0xee, 0xd8, + 0x1b, 0xf6, 0x6c, 0x8c, 0xb5, 0xea, 0xf4, 0x79, 0xce, 0xc0, 0x57, 0x30, 0xb9, 0x6d, 0xb2, 0x78, + 0xc6, 0x32, 0xa0, 0x2b, 0x59, 0x0b, 0x31, 0x5b, 0x0c, 0x91, 0xb4, 0x41, 0x95, 0xeb, 0x1f, 0x4d, + 0xfb, 0x7d, 0xbe, 0xb2, 0x45, 0x2a, 0xe8, 0xc6, 0xcb, 0x66, 0x34, 0xbc, 0x16, 0x36, 0x5c, 0x99, + 0xf6, 0xfb, 0xe4, 0x0d, 0x80, 0xe1, 0xc0, 0x3e, 0xf5, 0x7c, 0x9f, 0xbd, 0x71, 0x04, 0x5e, 0xaf, + 0x21, 0x54, 0x5e, 0x8c, 0xe1, 0xa0, 0xce, 0x80, 0xe4, 0xff, 0x01, 0x7a, 0xfd, 0x63, 0x38, 0x0c, + 0x66, 0xd5, 0xc2, 0xb3, 0x80, 0x08, 0x60, 0xd4, 0xc9, 0xf6, 0xd8, 0xb5, 0xbc, 0xaf, 0x0a, 0x97, + 0x81, 0xcf, 0xc2, 0x06, 0x37, 0x42, 0x3d, 0xf4, 0x26, 0x27, 0x9c, 0xc3, 0x7e, 0x1e, 0xf6, 0x5c, + 0x62, 0xb1, 0xff, 0x3e, 0x07, 0xa0, 0x1f, 0x5a, 0x22, 0xd2, 0xd4, 0x5d, 0x58, 0xa0, 0x72, 0x83, + 0xd0, 0x3f, 0xa0, 0xf6, 0x16, 0xdb, 0x95, 0xb5, 0xb7, 0x88, 0x41, 0x4f, 0xa3, 0x89, 0xc6, 0xd9, + 0x42, 0xf7, 0x80, 0xa7, 0x91, 0xd9, 0x6b, 0x47, 0x22, 0xfd, 0x72, 0x2c, 0x52, 0x03, 0x08, 0x63, + 0x3f, 0x71, 0x49, 0x76, 0x23, 0x0c, 0xa2, 0xc2, 0x0b, 0x78, 0xb6, 0x81, 0x30, 0x7e, 0x94, 0xbc, + 0x7d, 0x42, 0x34, 0xb2, 0x0f, 0xb9, 0xb6, 0x13, 0xf8, 0x74, 0xce, 0x88, 0x88, 0xf5, 0x22, 0xcf, + 0xe9, 0x18, 0x46, 0xc5, 0x5a, 0x9b, 0x38, 0x91, 0xd4, 0xb7, 0xd8, 0x08, 0x31, 0x60, 0x91, 0xe7, + 0xeb, 0x9e, 0x11, 0x49, 0x91, 0xa7, 0xeb, 0xe6, 0xf1, 0x93, 0x11, 0x28, 0xf3, 0x14, 0x3c, 0x33, + 0xf7, 0x7d, 0xc8, 0x5a, 0x56, 0x9d, 0xc7, 0x81, 0x58, 0x0d, 0xa5, 0x12, 0xcb, 0xaa, 0xb3, 0x37, + 0x4a, 0xdf, 0x3f, 0x95, 0xaa, 0x51, 0x64, 0xf2, 0x31, 0x28, 0x48, 0xec, 0x33, 0x8f, 0xa0, 0x82, + 0x73, 0x20, 0x79, 0xcd, 0xc8, 0x44, 0x43, 0xc2, 0x26, 0x35, 0x50, 0xf7, 0xa7, 0x6f, 0xbb, 0xfa, + 0x68, 0x84, 0xee, 0x74, 0xef, 0xb8, 0x63, 0xc6, 0xb6, 0xe5, 0xc3, 0xd0, 0xc3, 0x68, 0x6b, 0xdf, + 0x13, 0xa5, 0xb2, 0x0e, 0x26, 0x5e, 0x93, 0xb4, 0x60, 0xc3, 0x72, 0x27, 0xd3, 0x11, 0xb3, 0xd3, + 0xa8, 0x0c, 0xc7, 0x54, 0x08, 0x61, 0xf1, 0x56, 0x30, 0x4a, 0xab, 0x4f, 0x0b, 0x85, 0x71, 0xcc, + 0xd1, 0x70, 0x1c, 0x13, 0x48, 0x92, 0x95, 0x35, 0x57, 0x5e, 0x72, 0x7a, 0xab, 0x46, 0x45, 0x1b, + 0xbc, 0x55, 0x85, 0x68, 0x13, 0x0a, 0x34, 0x1f, 0x4a, 0x89, 0x09, 0x86, 0x0f, 0x66, 0x52, 0x4c, + 0xb0, 0x48, 0x24, 0xb0, 0xef, 0xe6, 0xa4, 0xb0, 0x94, 0x7c, 0x2d, 0x3e, 0x0e, 0xf0, 0x60, 0xe8, + 0x0d, 0xea, 0xee, 0xe4, 0x64, 0xd8, 0x93, 0x42, 0x93, 0x15, 0x7e, 0x69, 0xe8, 0x0d, 0xec, 0x53, + 0x04, 0xff, 0xe4, 0xdd, 0xeb, 0x12, 0x92, 0x29, 0xfd, 0x4f, 0x3e, 0x08, 0xcb, 0xf4, 0x57, 0x3b, + 0xb4, 0x36, 0x61, 0xaa, 0x4a, 0xac, 0xcd, 0x92, 0x37, 0x84, 0x08, 0xe4, 0x2d, 0x4c, 0x57, 0xe2, + 0x8d, 0x26, 0x12, 0xf3, 0x2a, 0x72, 0x93, 0x78, 0xa3, 0x49, 0x3c, 0xd2, 0xb0, 0x84, 0x4c, 0xf6, + 0x82, 0xae, 0x8b, 0x0c, 0x43, 0x3c, 0x2b, 0x0a, 0xea, 0xe3, 0xf8, 0x5e, 0xb3, 0x45, 0x88, 0x53, + 0x39, 0x17, 0x6c, 0xac, 0x1a, 0x76, 0xc2, 0xda, 0x2b, 0xb3, 0x07, 0x14, 0xce, 0xd4, 0xb2, 0x4e, + 0xf8, 0x27, 0x3d, 0xbb, 0x8b, 0xe0, 0x48, 0x27, 0x02, 0x64, 0xb2, 0x03, 0xeb, 0x8c, 0xc7, 0x0f, + 0x32, 0x15, 0x72, 0x16, 0x17, 0x69, 0x5b, 0x98, 0xca, 0x50, 0xfe, 0x7c, 0xac, 0x02, 0xa9, 0xc0, + 0x02, 0x0a, 0x84, 0xdc, 0xc4, 0x7c, 0x5b, 0x96, 0x9e, 0xe3, 0xe7, 0x08, 0xe9, 0x0a, 0xca, 0xcd, + 0x32, 0x5d, 0x41, 0x54, 0xf2, 0x19, 0x00, 0x63, 0x30, 0x1e, 0xf6, 0xfb, 0x18, 0x84, 0x37, 0x8f, + 0xa2, 0xd4, 0xd5, 0xe8, 0x79, 0xc4, 0x56, 0x42, 0x24, 0x1e, 0x30, 0x0e, 0x7f, 0xdb, 0xb1, 0x50, + 0xbd, 0x52, 0x5b, 0x5a, 0x15, 0x16, 0xd9, 0x61, 0xc4, 0x80, 0xd6, 0x3c, 0x45, 0x87, 0x14, 0x0e, + 0x99, 0x05, 0xb4, 0xe6, 0xf0, 0x64, 0x40, 0x6b, 0xa9, 0x82, 0xb6, 0x0f, 0x17, 0xd2, 0x06, 0x16, + 0x11, 0x61, 0x95, 0xb3, 0x8a, 0xb0, 0xdf, 0xc9, 0xc2, 0x0a, 0xb6, 0x26, 0xa8, 0xb0, 0x0e, 0xab, + 0xd6, 0xf4, 0xed, 0x20, 0xda, 0x93, 0xa0, 0xc6, 0xd8, 0x3f, 0x5f, 0x2e, 0x90, 0x9f, 0xb6, 0x22, + 0x35, 0x88, 0x01, 0x6b, 0xe2, 0x26, 0xd8, 0x15, 0x16, 0xe8, 0x41, 0x2c, 0x69, 0x11, 0xb1, 0x30, + 0x99, 0xa9, 0x35, 0x56, 0x29, 0xbc, 0x0f, 0xb2, 0xcf, 0x72, 0x1f, 0xe4, 0xce, 0x74, 0x1f, 0x3c, + 0x82, 0x15, 0xf1, 0x35, 0xa4, 0xe4, 0x0b, 0xcf, 0x47, 0xc9, 0x23, 0x8d, 0x91, 0x5a, 0x40, 0xd1, + 0x17, 0xe7, 0x52, 0x74, 0x7c, 0x2f, 0x14, 0xa7, 0x6c, 0x84, 0xb0, 0x24, 0x61, 0xc7, 0x54, 0x86, + 0xbb, 0xa5, 0xd6, 0x4f, 0x71, 0x4b, 0xbe, 0x0e, 0xcb, 0xb5, 0xa1, 0x78, 0x2a, 0x92, 0x74, 0xf4, + 0x7d, 0x01, 0x94, 0xd9, 0x85, 0x00, 0x33, 0xb8, 0xdd, 0xb2, 0xef, 0xc7, 0xed, 0xf6, 0x16, 0x00, + 0x77, 0x6d, 0x08, 0x53, 0x90, 0xe1, 0x91, 0x11, 0x91, 0x2e, 0xa2, 0x4f, 0x05, 0x12, 0x32, 0xa5, + 0x4e, 0xdc, 0x0a, 0x45, 0xef, 0x76, 0x87, 0xd3, 0xc1, 0x24, 0x92, 0xb3, 0x57, 0x78, 0x42, 0x3a, + 0xbc, 0x4c, 0x26, 0x0f, 0xb1, 0x6a, 0xef, 0xef, 0x82, 0x90, 0x4f, 0x07, 0x46, 0x74, 0x4b, 0xf3, + 0x66, 0x48, 0x4b, 0xcc, 0xd0, 0x4c, 0xd3, 0x39, 0xed, 0x07, 0x8a, 0x1c, 0xc8, 0xff, 0xa7, 0x58, + 0xea, 0x37, 0x01, 0x82, 0xb7, 0x7a, 0xb1, 0xd6, 0x4c, 0x5e, 0x0a, 0xa0, 0xf2, 0x2c, 0x87, 0xb8, + 0xd2, 0x68, 0xb2, 0xef, 0xd7, 0x68, 0xda, 0x50, 0x68, 0x7e, 0x69, 0xe2, 0x84, 0xc6, 0x1d, 0x60, + 0x05, 0x9c, 0x2c, 0x52, 0xa6, 0xec, 0xce, 0x2d, 0xbc, 0x1b, 0x42, 0x3e, 0x78, 0x06, 0x0b, 0x2c, + 0x55, 0xd4, 0xfe, 0x4c, 0x81, 0x75, 0xd9, 0x7d, 0xfb, 0xc9, 0xa0, 0x4b, 0x3e, 0xc1, 0xe2, 0x8a, + 0x2a, 0x11, 0x91, 0x45, 0x42, 0xa2, 0x24, 0xf7, 0xc9, 0xa0, 0xcb, 0x18, 0x20, 0xe7, 0xb1, 0xdc, + 0x59, 0x5a, 0x91, 0xbc, 0x0d, 0x2b, 0xad, 0x61, 0xbf, 0x4f, 0xd9, 0x9a, 0xf1, 0x3b, 0x5c, 0x00, + 0xa0, 0x0d, 0xc5, 0x5f, 0x0c, 0x44, 0x87, 0x76, 0x5e, 0xe2, 0x72, 0xee, 0xe5, 0x11, 0xa5, 0xf7, + 0x1e, 0xaf, 0x17, 0x36, 0xfb, 0x6d, 0xf4, 0xb7, 0x92, 0xdb, 0xd4, 0x7e, 0xa4, 0x00, 0x49, 0x76, + 0x49, 0x26, 0x59, 0xca, 0xff, 0x02, 0x0b, 0x1b, 0x63, 0xfd, 0x72, 0xcf, 0xc2, 0xfa, 0x15, 0x7f, + 0x47, 0x81, 0xf5, 0xaa, 0x5e, 0xe7, 0xa1, 0xfd, 0xd9, 0xc3, 0xc6, 0x0d, 0xb8, 0x5a, 0xd5, 0xeb, + 0x76, 0xab, 0x59, 0xab, 0x96, 0x1e, 0xda, 0xa9, 0x11, 0x7b, 0xaf, 0xc2, 0x0b, 0x49, 0x94, 0xf0, + 0x01, 0xe4, 0x0a, 0x6c, 0x26, 0x8b, 0x45, 0x54, 0xdf, 0xf4, 0xca, 0x22, 0x00, 0x70, 0xb6, 0xf8, + 0x49, 0x58, 0x17, 0x11, 0x6c, 0xdb, 0x35, 0x0b, 0x63, 0xe4, 0xaf, 0x43, 0xe1, 0xc0, 0x30, 0xab, + 0x95, 0x87, 0x76, 0xa5, 0x53, 0xab, 0xa9, 0xe7, 0xc8, 0x2a, 0x2c, 0x73, 0x40, 0x49, 0x57, 0x15, + 0xb2, 0x02, 0xf9, 0x6a, 0xc3, 0x32, 0x4a, 0x1d, 0xd3, 0x50, 0x33, 0xc5, 0x4f, 0xc2, 0x5a, 0x6b, + 0xec, 0xbd, 0xe3, 0x4c, 0xdc, 0x7d, 0xf7, 0x09, 0xbe, 0x5f, 0x2c, 0x41, 0xd6, 0xd4, 0x0f, 0xd5, + 0x73, 0x04, 0x60, 0xb1, 0xb5, 0x5f, 0xb2, 0xee, 0xdd, 0x53, 0x15, 0x52, 0x80, 0xa5, 0xdd, 0x52, + 0xcb, 0xde, 0xaf, 0x5b, 0x6a, 0x86, 0xfe, 0xd0, 0x0f, 0x2d, 0xfc, 0x91, 0x2d, 0x7e, 0x18, 0x36, + 0x90, 0x21, 0xa9, 0x79, 0xfe, 0xc4, 0x1d, 0xb8, 0x63, 0xec, 0xc3, 0x0a, 0xe4, 0x2d, 0x97, 0x52, + 0x92, 0x89, 0xcb, 0x3a, 0x50, 0x9f, 0xf6, 0x27, 0xde, 0xa8, 0xef, 0x7e, 0x45, 0x55, 0x8a, 0x6f, + 0xc1, 0xba, 0x39, 0x9c, 0x4e, 0xbc, 0xc1, 0xb1, 0x35, 0xa1, 0x18, 0xc7, 0x4f, 0xc8, 0x45, 0xd8, + 0xe8, 0x34, 0xf4, 0xfa, 0x4e, 0x75, 0xb7, 0xd3, 0xec, 0x58, 0x76, 0x5d, 0x6f, 0x97, 0xf6, 0xd8, + 0xeb, 0x49, 0xbd, 0x69, 0xb5, 0x6d, 0xd3, 0x28, 0x19, 0x8d, 0xb6, 0xaa, 0x14, 0xbf, 0x89, 0xba, + 0x95, 0xee, 0x70, 0xd0, 0xab, 0x38, 0xdd, 0xc9, 0x70, 0x8c, 0x1d, 0xd6, 0xe0, 0x9a, 0x65, 0x94, + 0x9a, 0x8d, 0xb2, 0x5d, 0xd1, 0x4b, 0xed, 0xa6, 0x99, 0x16, 0x32, 0x7a, 0x0b, 0x2e, 0xa5, 0xe0, + 0x34, 0xdb, 0x2d, 0x55, 0x21, 0xd7, 0x61, 0x3b, 0xa5, 0xec, 0xd0, 0xd8, 0xd1, 0x3b, 0xed, 0xbd, + 0x86, 0x9a, 0x99, 0x51, 0xd9, 0xb2, 0x9a, 0x6a, 0xb6, 0xf8, 0x1b, 0x0a, 0xac, 0x75, 0x7c, 0x6e, + 0xba, 0xdc, 0x41, 0xaf, 0xc5, 0x17, 0xe1, 0x4a, 0xc7, 0x32, 0x4c, 0xbb, 0xdd, 0xdc, 0x37, 0x1a, + 0x76, 0xc7, 0xd2, 0x77, 0xe3, 0xbd, 0xb9, 0x0e, 0xdb, 0x12, 0x86, 0x69, 0x94, 0x9a, 0x07, 0x86, + 0x69, 0xb7, 0x74, 0xcb, 0x3a, 0x6c, 0x9a, 0x65, 0x55, 0xa1, 0x5f, 0x4c, 0x41, 0xa8, 0x57, 0x74, + 0xd6, 0x9b, 0x48, 0x59, 0xc3, 0x38, 0xd4, 0x6b, 0xf6, 0x4e, 0xb3, 0xad, 0x66, 0x8b, 0x75, 0x7a, + 0xbf, 0x63, 0xe0, 0x56, 0x66, 0x70, 0x97, 0x87, 0x5c, 0xa3, 0xd9, 0x30, 0xe2, 0x6f, 0x6e, 0x2b, + 0x90, 0xd7, 0x5b, 0x2d, 0xb3, 0x79, 0x80, 0x5b, 0x0c, 0x60, 0xb1, 0x6c, 0x34, 0x68, 0xcf, 0xb2, + 0xb4, 0xa4, 0x65, 0x36, 0xeb, 0xcd, 0xb6, 0x51, 0x56, 0x73, 0x45, 0x53, 0x1c, 0x61, 0xd1, 0x68, + 0x77, 0xc8, 0x1e, 0xb8, 0xca, 0x46, 0x45, 0xef, 0xd4, 0xda, 0x7c, 0x89, 0x1e, 0xda, 0xa6, 0xf1, + 0xe9, 0x8e, 0x61, 0xb5, 0x2d, 0x55, 0x21, 0x2a, 0xac, 0x34, 0x0c, 0xa3, 0x6c, 0xd9, 0xa6, 0x71, + 0x50, 0x35, 0x0e, 0xd5, 0x0c, 0x6d, 0x93, 0xfd, 0x4f, 0xbf, 0x50, 0xfc, 0xae, 0x02, 0x84, 0x05, + 0xbd, 0x15, 0x99, 0x54, 0x70, 0xc7, 0x5c, 0x83, 0xad, 0x3d, 0xba, 0xd4, 0x38, 0xb4, 0x7a, 0xb3, + 0x1c, 0x9f, 0xb2, 0x4b, 0x40, 0x62, 0xe5, 0xcd, 0x4a, 0x45, 0x55, 0xc8, 0x36, 0x9c, 0x8f, 0xc1, + 0xcb, 0x66, 0xb3, 0xa5, 0x66, 0xb6, 0x32, 0x79, 0x85, 0x5c, 0x4e, 0x14, 0xee, 0x1b, 0x46, 0x4b, + 0xcd, 0xd2, 0x25, 0x8a, 0x15, 0x88, 0x23, 0xc1, 0xaa, 0xe7, 0x8a, 0x5f, 0x57, 0xe0, 0x12, 0xeb, + 0xa6, 0x38, 0x5f, 0x41, 0x57, 0xaf, 0xc0, 0x26, 0x0f, 0xe5, 0x9d, 0xd6, 0xd1, 0x0b, 0xa0, 0x46, + 0x4a, 0x59, 0x37, 0x2f, 0xc2, 0x46, 0x04, 0x8a, 0xfd, 0xc8, 0x50, 0xea, 0x11, 0x01, 0xef, 0x18, + 0x56, 0xdb, 0x36, 0x2a, 0x95, 0xa6, 0xd9, 0x66, 0x1d, 0xc9, 0x16, 0x35, 0xd8, 0x28, 0xb9, 0xe3, + 0x09, 0x15, 0xbd, 0x06, 0xbe, 0x37, 0x1c, 0x60, 0x17, 0x56, 0x61, 0xd9, 0xf8, 0x4c, 0xdb, 0x68, + 0x58, 0xd5, 0x66, 0x43, 0x3d, 0x57, 0xbc, 0x12, 0xc3, 0x11, 0xe7, 0xd8, 0xb2, 0xf6, 0xd4, 0x73, + 0x45, 0x07, 0x56, 0x85, 0x91, 0x30, 0xdb, 0x15, 0xd7, 0x60, 0x4b, 0xec, 0x35, 0xa4, 0x28, 0xf1, + 0x21, 0x6c, 0xc2, 0x85, 0x64, 0xb9, 0xd1, 0x56, 0x15, 0xba, 0x0a, 0xb1, 0x12, 0x0a, 0xcf, 0x14, + 0x7f, 0x4d, 0x81, 0xd5, 0xe0, 0xd1, 0x04, 0xd5, 0xb4, 0xd7, 0x61, 0xbb, 0x5e, 0xd1, 0xed, 0xb2, + 0x71, 0x50, 0x2d, 0x19, 0xf6, 0x7e, 0xb5, 0x51, 0x8e, 0x7d, 0xe4, 0x05, 0xb8, 0x98, 0x82, 0x80, + 0x5f, 0xd9, 0x84, 0x0b, 0xf1, 0xa2, 0x36, 0x3d, 0xaa, 0x19, 0x3a, 0xf5, 0xf1, 0x92, 0xe0, 0x9c, + 0x66, 0x8b, 0x07, 0xb0, 0x66, 0xe9, 0xf5, 0x5a, 0x65, 0x38, 0xee, 0xba, 0xfa, 0x74, 0x72, 0x32, + 0x20, 0xdb, 0x70, 0xb9, 0xd2, 0x34, 0x4b, 0x86, 0x8d, 0x28, 0xb1, 0x1e, 0x9c, 0x87, 0x75, 0xb9, + 0xf0, 0xa1, 0x41, 0xb7, 0x2f, 0x81, 0x35, 0x19, 0xd8, 0x68, 0xaa, 0x99, 0xe2, 0xe7, 0x60, 0x25, + 0x92, 0x50, 0xed, 0x32, 0x9c, 0x97, 0x7f, 0xb7, 0xdc, 0x41, 0xcf, 0x1b, 0x1c, 0xab, 0xe7, 0xe2, + 0x05, 0xe6, 0x74, 0x30, 0xa0, 0x05, 0x78, 0x9e, 0xe5, 0x82, 0xb6, 0x3b, 0x3e, 0xf5, 0x06, 0xce, + 0xc4, 0xed, 0xa9, 0x99, 0xe2, 0xab, 0xb0, 0x1a, 0x09, 0xe3, 0x4c, 0x17, 0xae, 0xd6, 0xe4, 0x04, + 0xb8, 0x6e, 0x94, 0xab, 0x9d, 0xba, 0xba, 0x40, 0x4f, 0xf2, 0x5e, 0x75, 0x77, 0x4f, 0x85, 0xe2, + 0xb7, 0x14, 0x2a, 0x67, 0x60, 0x72, 0x96, 0x7a, 0x45, 0x17, 0x4b, 0x4d, 0xb7, 0x19, 0x0b, 0x0e, + 0x6f, 0x58, 0x16, 0x7b, 0x6a, 0xbe, 0x02, 0x9b, 0xfc, 0x87, 0xad, 0x37, 0xca, 0xf6, 0x9e, 0x6e, + 0x96, 0x0f, 0x75, 0x93, 0xee, 0xbd, 0x87, 0x6a, 0x06, 0x0f, 0x94, 0x04, 0xb1, 0xdb, 0xcd, 0x4e, + 0x69, 0x4f, 0xcd, 0xd2, 0xfd, 0x1b, 0x81, 0xb7, 0xaa, 0x0d, 0x35, 0x87, 0xc7, 0x33, 0x81, 0x8d, + 0xcd, 0xd2, 0xf2, 0x85, 0xe2, 0x7b, 0x0a, 0x5c, 0xb6, 0xbc, 0xe3, 0x81, 0x33, 0x99, 0x8e, 0x5d, + 0xbd, 0x7f, 0x3c, 0x1c, 0x7b, 0x93, 0x93, 0x53, 0x6b, 0xea, 0x4d, 0x5c, 0x72, 0x17, 0x6e, 0x59, + 0xd5, 0xdd, 0x86, 0xde, 0xa6, 0xc7, 0x4b, 0xaf, 0xed, 0x36, 0xcd, 0x6a, 0x7b, 0xaf, 0x6e, 0x5b, + 0x9d, 0x6a, 0x62, 0xe7, 0xdd, 0x84, 0x17, 0x67, 0xa3, 0xd6, 0x8c, 0x5d, 0xbd, 0xf4, 0x50, 0x55, + 0xe6, 0x37, 0xb8, 0xa3, 0xd7, 0xf4, 0x46, 0xc9, 0x28, 0xdb, 0x07, 0xf7, 0xd4, 0x0c, 0xb9, 0x05, + 0x37, 0x66, 0xa3, 0x56, 0xaa, 0x2d, 0x8b, 0xa2, 0x65, 0xe7, 0x7f, 0x77, 0xcf, 0xaa, 0x53, 0xac, + 0x5c, 0xf1, 0x0f, 0x15, 0xd8, 0x9c, 0x15, 0xcb, 0x87, 0xdc, 0x06, 0xcd, 0x68, 0xb4, 0x4d, 0xbd, + 0x5a, 0xb6, 0x4b, 0xa6, 0x51, 0x36, 0x1a, 0xed, 0xaa, 0x5e, 0xb3, 0x6c, 0xab, 0xd9, 0xa1, 0xbb, + 0x29, 0xb4, 0x08, 0x78, 0x09, 0xae, 0xcf, 0xc1, 0x6b, 0x56, 0xcb, 0x25, 0x55, 0x21, 0xf7, 0xe0, + 0x95, 0x39, 0x48, 0xd6, 0x43, 0xab, 0x6d, 0xd4, 0xe5, 0x12, 0x35, 0x53, 0x2c, 0xc1, 0xd6, 0xec, + 0x60, 0x1f, 0x94, 0x4c, 0x47, 0x67, 0x3a, 0x0f, 0xb9, 0x32, 0xbd, 0x19, 0x22, 0x39, 0x04, 0x8a, + 0x1e, 0xa8, 0x71, 0x7f, 0xfd, 0x84, 0xe9, 0x86, 0xd9, 0x69, 0x34, 0xd8, 0x35, 0xb2, 0x0e, 0x85, + 0x66, 0x7b, 0xcf, 0x30, 0x79, 0x16, 0x06, 0x4c, 0xbb, 0xd0, 0x69, 0xd0, 0x83, 0xd3, 0x34, 0xab, + 0x9f, 0xc5, 0xfb, 0x64, 0x13, 0x2e, 0x58, 0x35, 0xbd, 0xb4, 0x6f, 0x37, 0x9a, 0x6d, 0xbb, 0xda, + 0xb0, 0x4b, 0x7b, 0x7a, 0xa3, 0x61, 0xd4, 0x54, 0xc0, 0xc9, 0x9c, 0xe5, 0xa3, 0x47, 0x3e, 0x08, + 0x77, 0x9a, 0xfb, 0x6d, 0xdd, 0x6e, 0xd5, 0x3a, 0xbb, 0xd5, 0x86, 0x6d, 0x3d, 0x6c, 0x94, 0x04, + 0xef, 0x53, 0x4a, 0x92, 0xdc, 0x3b, 0x70, 0x73, 0x2e, 0x76, 0x98, 0x2f, 0xe1, 0x36, 0x68, 0x73, + 0x31, 0xf9, 0x40, 0x8a, 0x3f, 0x54, 0x60, 0x7b, 0xce, 0x1b, 0x32, 0x79, 0x05, 0xee, 0xee, 0x19, + 0x7a, 0xb9, 0x66, 0x58, 0x16, 0x12, 0x0a, 0xba, 0x0c, 0xcc, 0xc4, 0x23, 0x95, 0xa0, 0xde, 0x85, + 0x5b, 0xf3, 0xd1, 0xc3, 0xab, 0xf9, 0x0e, 0xdc, 0x9c, 0x8f, 0xca, 0xaf, 0xea, 0x0c, 0x29, 0xc2, + 0xed, 0xf9, 0x98, 0xc1, 0x15, 0x9f, 0x2d, 0xfe, 0x96, 0x02, 0x97, 0xd2, 0x15, 0x39, 0xb4, 0x6f, + 0xd5, 0x86, 0xd5, 0xd6, 0x6b, 0x35, 0xbb, 0xa5, 0x9b, 0x7a, 0xdd, 0x36, 0x1a, 0x66, 0xb3, 0x56, + 0x4b, 0xbb, 0xda, 0x6e, 0xc2, 0x8b, 0xb3, 0x51, 0xad, 0x92, 0x59, 0x6d, 0x51, 0xea, 0xad, 0xc1, + 0xb5, 0xd9, 0x58, 0x46, 0xb5, 0x64, 0xa8, 0x99, 0x9d, 0x8f, 0x7f, 0xff, 0x9f, 0xae, 0x9d, 0xfb, + 0xfe, 0x7b, 0xd7, 0x94, 0x1f, 0xbd, 0x77, 0x4d, 0xf9, 0xc7, 0xf7, 0xae, 0x29, 0x9f, 0x7d, 0xf9, + 0x6c, 0xa9, 0x86, 0x90, 0xef, 0x7f, 0x7b, 0x11, 0x25, 0x94, 0xd7, 0xfe, 0x3b, 0x00, 0x00, 0xff, + 0xff, 0x55, 0xbe, 0x56, 0x52, 0x69, 0xb6, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -27582,6 +27687,102 @@ func (m *CORSPolicy) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *IdentityCenterPermissionSet) 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 *IdentityCenterPermissionSet) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IdentityCenterPermissionSet) 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 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) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0x12 + } + if len(m.ARN) > 0 { + i -= len(m.ARN) + copy(dAtA[i:], m.ARN) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ARN))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *AppIdentityCenter) 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 *AppIdentityCenter) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AppIdentityCenter) 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 len(m.PermissionSets) > 0 { + for iNdEx := len(m.PermissionSets) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.PermissionSets[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.AccountID) > 0 { + i -= len(m.AccountID) + copy(dAtA[i:], m.AccountID) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AccountID))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *AppSpecV3) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -27620,6 +27821,18 @@ func (m *AppSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x6a } } + if m.IdentityCenter != nil { + { + size, err := m.IdentityCenter.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + } if m.CORS != nil { { size, err := m.CORS.MarshalToSizedBuffer(dAtA[:i]) @@ -28491,12 +28704,12 @@ func (m *ProvisionTokenV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n67, err67 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err67 != nil { - return 0, err67 + n68, err68 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err68 != nil { + return 0, err68 } - i -= n67 - i = encodeVarintTypes(dAtA, i, uint64(n67)) + i -= n68 + i = encodeVarintTypes(dAtA, i, uint64(n68)) i-- dAtA[i] = 0x12 if len(m.Roles) > 0 { @@ -30996,20 +31209,20 @@ func (m *AuthPreferenceSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.SecondFactors) > 0 { - dAtA103 := make([]byte, len(m.SecondFactors)*10) - var j102 int + dAtA104 := make([]byte, len(m.SecondFactors)*10) + var j103 int for _, num := range m.SecondFactors { for num >= 1<<7 { - dAtA103[j102] = uint8(uint64(num)&0x7f | 0x80) + dAtA104[j103] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j102++ + j103++ } - dAtA103[j102] = uint8(num) - j102++ + dAtA104[j103] = uint8(num) + j103++ } - i -= j102 - copy(dAtA[i:], dAtA103[:j102]) - i = encodeVarintTypes(dAtA, i, uint64(j102)) + i -= j103 + copy(dAtA[i:], dAtA104[:j103]) + i = encodeVarintTypes(dAtA, i, uint64(j103)) i-- dAtA[i] = 0x1 i-- @@ -31630,12 +31843,12 @@ func (m *UserTokenSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n119, err119 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err119 != nil { - return 0, err119 + n120, err120 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err120 != nil { + return 0, err120 } - i -= n119 - i = encodeVarintTypes(dAtA, i, uint64(n119)) + i -= n120 + i = encodeVarintTypes(dAtA, i, uint64(n120)) i-- dAtA[i] = 0x22 if m.Usage != 0 { @@ -31752,12 +31965,12 @@ func (m *UserTokenSecretsSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n122, err122 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err122 != nil { - return 0, err122 + n123, err123 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err123 != nil { + return 0, err123 } - i -= n122 - i = encodeVarintTypes(dAtA, i, uint64(n122)) + i -= n123 + i = encodeVarintTypes(dAtA, i, uint64(n123)) i-- dAtA[i] = 0x1a if len(m.QRCode) > 0 { @@ -31962,12 +32175,12 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.AssumeStartTime != nil { - n125, err125 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) - if err125 != nil { - return 0, err125 + n126, err126 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) + if err126 != nil { + return 0, err126 } - i -= n125 - i = encodeVarintTypes(dAtA, i, uint64(n125)) + i -= n126 + i = encodeVarintTypes(dAtA, i, uint64(n126)) i-- dAtA[i] = 0x52 } @@ -31984,20 +32197,20 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x4a } if len(m.ThresholdIndexes) > 0 { - dAtA128 := make([]byte, len(m.ThresholdIndexes)*10) - var j127 int + dAtA129 := make([]byte, len(m.ThresholdIndexes)*10) + var j128 int for _, num := range m.ThresholdIndexes { for num >= 1<<7 { - dAtA128[j127] = uint8(uint64(num)&0x7f | 0x80) + dAtA129[j128] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j127++ + j128++ } - dAtA128[j127] = uint8(num) - j127++ + dAtA129[j128] = uint8(num) + j128++ } - i -= j127 - copy(dAtA[i:], dAtA128[:j127]) - i = encodeVarintTypes(dAtA, i, uint64(j127)) + i -= j128 + copy(dAtA[i:], dAtA129[:j128]) + i = encodeVarintTypes(dAtA, i, uint64(j128)) i-- dAtA[i] = 0x3a } @@ -32011,12 +32224,12 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x32 - n130, err130 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err130 != nil { - return 0, err130 + n131, err131 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err131 != nil { + return 0, err131 } - i -= n130 - i = encodeVarintTypes(dAtA, i, uint64(n130)) + i -= n131 + i = encodeVarintTypes(dAtA, i, uint64(n131)) i-- dAtA[i] = 0x2a if len(m.Reason) > 0 { @@ -32119,20 +32332,20 @@ func (m *ThresholdIndexSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Indexes) > 0 { - dAtA133 := make([]byte, len(m.Indexes)*10) - var j132 int + dAtA134 := make([]byte, len(m.Indexes)*10) + var j133 int for _, num := range m.Indexes { for num >= 1<<7 { - dAtA133[j132] = uint8(uint64(num)&0x7f | 0x80) + dAtA134[j133] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j132++ + j133++ } - dAtA133[j132] = uint8(num) - j132++ + dAtA134[j133] = uint8(num) + j133++ } - i -= j132 - copy(dAtA[i:], dAtA133[:j132]) - i = encodeVarintTypes(dAtA, i, uint64(j132)) + i -= j133 + copy(dAtA[i:], dAtA134[:j133]) + i = encodeVarintTypes(dAtA, i, uint64(j133)) i-- dAtA[i] = 0xa } @@ -32205,12 +32418,12 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.AssumeStartTime != nil { - n134, err134 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) - if err134 != nil { - return 0, err134 + n135, err135 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) + if err135 != nil { + return 0, err135 } - i -= n134 - i = encodeVarintTypes(dAtA, i, uint64(n134)) + i -= n135 + i = encodeVarintTypes(dAtA, i, uint64(n135)) i-- dAtA[i] = 0x1 i-- @@ -32230,22 +32443,22 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0xa2 } - n136, err136 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SessionTTL, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SessionTTL):]) - if err136 != nil { - return 0, err136 + n137, err137 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SessionTTL, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SessionTTL):]) + if err137 != nil { + return 0, err137 } - i -= n136 - i = encodeVarintTypes(dAtA, i, uint64(n136)) + i -= n137 + i = encodeVarintTypes(dAtA, i, uint64(n137)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0x92 - n137, err137 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MaxDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MaxDuration):]) - if err137 != nil { - return 0, err137 + n138, err138 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MaxDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MaxDuration):]) + if err138 != nil { + return 0, err138 } - i -= n137 - i = encodeVarintTypes(dAtA, i, uint64(n137)) + i -= n138 + i = encodeVarintTypes(dAtA, i, uint64(n138)) i-- dAtA[i] = 0x1 i-- @@ -32378,21 +32591,21 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n141, err141 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err141 != nil { - return 0, err141 - } - i -= n141 - i = encodeVarintTypes(dAtA, i, uint64(n141)) - i-- - dAtA[i] = 0x2a - n142, err142 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + n142, err142 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err142 != nil { return 0, err142 } i -= n142 i = encodeVarintTypes(dAtA, i, uint64(n142)) i-- + dAtA[i] = 0x2a + n143, err143 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err143 != nil { + return 0, err143 + } + i -= n143 + i = encodeVarintTypes(dAtA, i, uint64(n143)) + i-- dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.State)) @@ -33245,12 +33458,12 @@ func (m *RoleOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0xfa } - n151, err151 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MFAVerificationInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MFAVerificationInterval):]) - if err151 != nil { - return 0, err151 + n152, err152 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MFAVerificationInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MFAVerificationInterval):]) + if err152 != nil { + return 0, err152 } - i -= n151 - i = encodeVarintTypes(dAtA, i, uint64(n151)) + i -= n152 + i = encodeVarintTypes(dAtA, i, uint64(n152)) i-- dAtA[i] = 0x1 i-- @@ -35191,12 +35404,12 @@ func (m *UserSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x42 - n181, err181 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err181 != nil { - return 0, err181 + n182, err182 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err182 != nil { + return 0, err182 } - i -= n181 - i = encodeVarintTypes(dAtA, i, uint64(n181)) + i -= n182 + i = encodeVarintTypes(dAtA, i, uint64(n182)) i-- dAtA[i] = 0x3a { @@ -35345,21 +35558,21 @@ func (m *LoginStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n184, err184 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) - if err184 != nil { - return 0, err184 - } - i -= n184 - i = encodeVarintTypes(dAtA, i, uint64(n184)) - i-- - dAtA[i] = 0x22 - n185, err185 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + n185, err185 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) if err185 != nil { return 0, err185 } i -= n185 i = encodeVarintTypes(dAtA, i, uint64(n185)) i-- + dAtA[i] = 0x22 + n186, err186 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + if err186 != nil { + return 0, err186 + } + i -= n186 + i = encodeVarintTypes(dAtA, i, uint64(n186)) + i-- dAtA[i] = 0x1a if len(m.LockedMessage) > 0 { i -= len(m.LockedMessage) @@ -35415,12 +35628,12 @@ func (m *CreatedBy) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n187, err187 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err187 != nil { - return 0, err187 + n188, err188 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err188 != nil { + return 0, err188 } - i -= n187 - i = encodeVarintTypes(dAtA, i, uint64(n187)) + i -= n188 + i = encodeVarintTypes(dAtA, i, uint64(n188)) i-- dAtA[i] = 0x12 if m.Connector != nil { @@ -35538,21 +35751,21 @@ func (m *MFADevice) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } } - n190, err190 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) - if err190 != nil { - return 0, err190 - } - i -= n190 - i = encodeVarintTypes(dAtA, i, uint64(n190)) - i-- - dAtA[i] = 0x3a - n191, err191 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + n191, err191 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) if err191 != nil { return 0, err191 } i -= n191 i = encodeVarintTypes(dAtA, i, uint64(n191)) i-- + dAtA[i] = 0x3a + n192, err192 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + if err192 != nil { + return 0, err192 + } + i -= n192 + i = encodeVarintTypes(dAtA, i, uint64(n192)) + i-- dAtA[i] = 0x32 if len(m.Id) > 0 { i -= len(m.Id) @@ -36248,12 +36461,12 @@ func (m *TunnelConnectionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x22 } - n203, err203 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err203 != nil { - return 0, err203 + n204, err204 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err204 != nil { + return 0, err204 } - i -= n203 - i = encodeVarintTypes(dAtA, i, uint64(n203)) + i -= n204 + i = encodeVarintTypes(dAtA, i, uint64(n204)) i-- dAtA[i] = 0x1a if len(m.ProxyName) > 0 { @@ -36345,12 +36558,12 @@ func (m *AcquireSemaphoreRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x2a } - n204, err204 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err204 != nil { - return 0, err204 + n205, err205 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err205 != nil { + return 0, err205 } - i -= n204 - i = encodeVarintTypes(dAtA, i, uint64(n204)) + i -= n205 + i = encodeVarintTypes(dAtA, i, uint64(n205)) i-- dAtA[i] = 0x22 if m.MaxLeases != 0 { @@ -36399,12 +36612,12 @@ func (m *SemaphoreLease) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n205, err205 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err205 != nil { - return 0, err205 + n206, err206 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err206 != nil { + return 0, err206 } - i -= n205 - i = encodeVarintTypes(dAtA, i, uint64(n205)) + i -= n206 + i = encodeVarintTypes(dAtA, i, uint64(n206)) i-- dAtA[i] = 0x2a if len(m.LeaseID) > 0 { @@ -36462,12 +36675,12 @@ func (m *SemaphoreLeaseRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n206, err206 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err206 != nil { - return 0, err206 + n207, err207 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err207 != nil { + return 0, err207 } - i -= n206 - i = encodeVarintTypes(dAtA, i, uint64(n206)) + i -= n207 + i = encodeVarintTypes(dAtA, i, uint64(n207)) i-- dAtA[i] = 0x12 if len(m.LeaseID) > 0 { @@ -36739,29 +36952,29 @@ func (m *WebSessionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x48 } - n213, err213 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) - if err213 != nil { - return 0, err213 - } - i -= n213 - i = encodeVarintTypes(dAtA, i, uint64(n213)) - i-- - dAtA[i] = 0x42 - n214, err214 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + n214, err214 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) if err214 != nil { return 0, err214 } i -= n214 i = encodeVarintTypes(dAtA, i, uint64(n214)) i-- - dAtA[i] = 0x3a - n215, err215 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + dAtA[i] = 0x42 + n215, err215 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err215 != nil { return 0, err215 } i -= n215 i = encodeVarintTypes(dAtA, i, uint64(n215)) i-- + dAtA[i] = 0x3a + n216, err216 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + if err216 != nil { + return 0, err216 + } + i -= n216 + i = encodeVarintTypes(dAtA, i, uint64(n216)) + i-- dAtA[i] = 0x32 if len(m.BearerToken) > 0 { i -= len(m.BearerToken) @@ -36993,21 +37206,21 @@ func (m *SAMLSessionData) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x22 } - n216, err216 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) - if err216 != nil { - return 0, err216 - } - i -= n216 - i = encodeVarintTypes(dAtA, i, uint64(n216)) - i-- - dAtA[i] = 0x1a - n217, err217 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) + n217, err217 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) if err217 != nil { return 0, err217 } i -= n217 i = encodeVarintTypes(dAtA, i, uint64(n217)) i-- + dAtA[i] = 0x1a + n218, err218 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) + if err218 != nil { + return 0, err218 + } + i -= n218 + i = encodeVarintTypes(dAtA, i, uint64(n218)) + i-- dAtA[i] = 0x12 if len(m.ID) > 0 { i -= len(m.ID) @@ -37288,12 +37501,12 @@ func (m *RemoteClusterStatusV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n221, err221 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err221 != nil { - return 0, err221 + n222, err222 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err222 != nil { + return 0, err222 } - i -= n221 - i = encodeVarintTypes(dAtA, i, uint64(n221)) + i -= n222 + i = encodeVarintTypes(dAtA, i, uint64(n222)) i-- dAtA[i] = 0x12 if len(m.Connection) > 0 { @@ -40062,12 +40275,12 @@ func (m *GithubAuthRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x62 } if m.Expires != nil { - n262, err262 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err262 != nil { - return 0, err262 + n263, err263 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err263 != nil { + return 0, err263 } - i -= n262 - i = encodeVarintTypes(dAtA, i, uint64(n262)) + i -= n263 + i = encodeVarintTypes(dAtA, i, uint64(n263)) i-- dAtA[i] = 0x5a } @@ -41079,21 +41292,21 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a } - n280, err280 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) - if err280 != nil { - return 0, err280 + n281, err281 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) + if err281 != nil { + return 0, err281 } - i -= n280 - i = encodeVarintTypes(dAtA, i, uint64(n280)) + i -= n281 + i = encodeVarintTypes(dAtA, i, uint64(n281)) i-- dAtA[i] = 0x22 if m.Expires != nil { - n281, err281 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err281 != nil { - return 0, err281 + n282, err282 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err282 != nil { + return 0, err282 } - i -= n281 - i = encodeVarintTypes(dAtA, i, uint64(n281)) + i -= n282 + i = encodeVarintTypes(dAtA, i, uint64(n282)) i-- dAtA[i] = 0x1a } @@ -41810,12 +42023,12 @@ func (m *RegisterUsingTokenRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro dAtA[i] = 0x6a } if m.Expires != nil { - n293, err293 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err293 != nil { - return 0, err293 + n294, err294 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err294 != nil { + return 0, err294 } - i -= n293 - i = encodeVarintTypes(dAtA, i, uint64(n293)) + i -= n294 + i = encodeVarintTypes(dAtA, i, uint64(n294)) i-- dAtA[i] = 0x62 } @@ -41995,12 +42208,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n296, err296 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err296 != nil { - return 0, err296 + n297, err297 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err297 != nil { + return 0, err297 } - i -= n296 - i = encodeVarintTypes(dAtA, i, uint64(n296)) + i -= n297 + i = encodeVarintTypes(dAtA, i, uint64(n297)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -42380,21 +42593,21 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n300, err300 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err300 != nil { - return 0, err300 - } - i -= n300 - i = encodeVarintTypes(dAtA, i, uint64(n300)) - i-- - dAtA[i] = 0x2a - n301, err301 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + n301, err301 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err301 != nil { return 0, err301 } i -= n301 i = encodeVarintTypes(dAtA, i, uint64(n301)) i-- + dAtA[i] = 0x2a + n302, err302 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err302 != nil { + return 0, err302 + } + i -= n302 + i = encodeVarintTypes(dAtA, i, uint64(n302)) + i-- dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.State)) @@ -42497,12 +42710,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n302, err302 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err302 != nil { - return 0, err302 + n303, err303 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err303 != nil { + return 0, err303 } - i -= n302 - i = encodeVarintTypes(dAtA, i, uint64(n302)) + i -= n303 + i = encodeVarintTypes(dAtA, i, uint64(n303)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -43214,12 +43427,12 @@ func (m *ClusterAlertSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n315, err315 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err315 != nil { - return 0, err315 + n316, err316 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err316 != nil { + return 0, err316 } - i -= n315 - i = encodeVarintTypes(dAtA, i, uint64(n315)) + i -= n316 + i = encodeVarintTypes(dAtA, i, uint64(n316)) i-- dAtA[i] = 0x1a if len(m.Message) > 0 { @@ -43349,12 +43562,12 @@ func (m *AlertAcknowledgement) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n316, err316 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err316 != nil { - return 0, err316 + n317, err317 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err317 != nil { + return 0, err317 } - i -= n316 - i = encodeVarintTypes(dAtA, i, uint64(n316)) + i -= n317 + i = encodeVarintTypes(dAtA, i, uint64(n317)) i-- dAtA[i] = 0x22 if len(m.Reason) > 0 { @@ -45681,12 +45894,12 @@ func (m *PluginStatusV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n351, err351 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) - if err351 != nil { - return 0, err351 + n352, err352 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) + if err352 != nil { + return 0, err352 } - i -= n351 - i = encodeVarintTypes(dAtA, i, uint64(n351)) + i -= n352 + i = encodeVarintTypes(dAtA, i, uint64(n352)) i-- dAtA[i] = 0x1a if len(m.ErrorMessage) > 0 { @@ -46047,22 +46260,22 @@ func (m *PluginOktaStatusDetailsAppGroupSync) MarshalToSizedBuffer(dAtA []byte) dAtA[i] = 0x28 } if m.LastFailed != nil { - n361, err361 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err361 != nil { - return 0, err361 + n362, err362 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err362 != nil { + return 0, err362 } - i -= n361 - i = encodeVarintTypes(dAtA, i, uint64(n361)) + i -= n362 + i = encodeVarintTypes(dAtA, i, uint64(n362)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n362, err362 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err362 != nil { - return 0, err362 + n363, err363 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err363 != nil { + return 0, err363 } - i -= n362 - i = encodeVarintTypes(dAtA, i, uint64(n362)) + i -= n363 + i = encodeVarintTypes(dAtA, i, uint64(n363)) i-- dAtA[i] = 0x1a } @@ -46121,22 +46334,22 @@ func (m *PluginOktaStatusDetailsUsersSync) MarshalToSizedBuffer(dAtA []byte) (in dAtA[i] = 0x28 } if m.LastFailed != nil { - n363, err363 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err363 != nil { - return 0, err363 + n364, err364 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err364 != nil { + return 0, err364 } - i -= n363 - i = encodeVarintTypes(dAtA, i, uint64(n363)) + i -= n364 + i = encodeVarintTypes(dAtA, i, uint64(n364)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n364, err364 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err364 != nil { - return 0, err364 + n365, err365 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err365 != nil { + return 0, err365 } - i -= n364 - i = encodeVarintTypes(dAtA, i, uint64(n364)) + i -= n365 + i = encodeVarintTypes(dAtA, i, uint64(n365)) i-- dAtA[i] = 0x1a } @@ -46255,22 +46468,22 @@ func (m *PluginOktaStatusDetailsAccessListsSync) MarshalToSizedBuffer(dAtA []byt } } if m.LastFailed != nil { - n365, err365 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err365 != nil { - return 0, err365 + n366, err366 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err366 != nil { + return 0, err366 } - i -= n365 - i = encodeVarintTypes(dAtA, i, uint64(n365)) + i -= n366 + i = encodeVarintTypes(dAtA, i, uint64(n366)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n366, err366 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err366 != nil { - return 0, err366 + n367, err367 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err367 != nil { + return 0, err367 } - i -= n366 - i = encodeVarintTypes(dAtA, i, uint64(n366)) + i -= n367 + i = encodeVarintTypes(dAtA, i, uint64(n367)) i-- dAtA[i] = 0x1a } @@ -46436,12 +46649,12 @@ func (m *PluginOAuth2AccessTokenCredentials) MarshalToSizedBuffer(dAtA []byte) ( i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n371, err371 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err371 != nil { - return 0, err371 + n372, err372 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err372 != nil { + return 0, err372 } - i -= n371 - i = encodeVarintTypes(dAtA, i, uint64(n371)) + i -= n372 + i = encodeVarintTypes(dAtA, i, uint64(n372)) i-- dAtA[i] = 0x1a if len(m.RefreshToken) > 0 { @@ -47321,21 +47534,21 @@ func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n385, err385 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) - if err385 != nil { - return 0, err385 - } - i -= n385 - i = encodeVarintTypes(dAtA, i, uint64(n385)) - i-- - dAtA[i] = 0x12 - n386, err386 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + n386, err386 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) if err386 != nil { return 0, err386 } i -= n386 i = encodeVarintTypes(dAtA, i, uint64(n386)) i-- + dAtA[i] = 0x12 + n387, err387 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err387 != nil { + return 0, err387 + } + i -= n387 + i = encodeVarintTypes(dAtA, i, uint64(n387)) + i-- dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -47761,12 +47974,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n393, err393 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) - if err393 != nil { - return 0, err393 + n394, err394 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) + if err394 != nil { + return 0, err394 } - i -= n393 - i = encodeVarintTypes(dAtA, i, uint64(n393)) + i -= n394 + i = encodeVarintTypes(dAtA, i, uint64(n394)) i-- dAtA[i] = 0x2a if m.Status != 0 { @@ -47774,12 +47987,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n394, err394 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) - if err394 != nil { - return 0, err394 + n395, err395 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) + if err395 != nil { + return 0, err395 } - i -= n394 - i = encodeVarintTypes(dAtA, i, uint64(n394)) + i -= n395 + i = encodeVarintTypes(dAtA, i, uint64(n395)) i-- dAtA[i] = 0x1a if len(m.Targets) > 0 { @@ -49222,12 +49435,12 @@ func (m *AccessGraphSync) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n417, err417 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) - if err417 != nil { - return 0, err417 + n418, err418 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) + if err418 != nil { + return 0, err418 } - i -= n417 - i = encodeVarintTypes(dAtA, i, uint64(n417)) + i -= n418 + i = encodeVarintTypes(dAtA, i, uint64(n418)) i-- dAtA[i] = 0x12 if len(m.AWS) > 0 { @@ -50560,6 +50773,52 @@ func (m *CORSPolicy) Size() (n int) { return n } +func (m *IdentityCenterPermissionSet) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ARN) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Name) + 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) + } + return n +} + +func (m *AppIdentityCenter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.AccountID) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.PermissionSets) > 0 { + for _, e := range m.PermissionSets { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *AppSpecV3) Size() (n int) { if m == nil { return 0 @@ -50618,6 +50877,10 @@ func (m *AppSpecV3) Size() (n int) { l = m.CORS.Size() n += 1 + l + sovTypes(uint64(l)) } + if m.IdentityCenter != nil { + l = m.IdentityCenter.Size() + n += 1 + l + sovTypes(uint64(l)) + } if len(m.TCPPorts) > 0 { for _, e := range m.TCPPorts { l = e.Size() @@ -68911,43 +69174,410 @@ func (m *AppV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Kind = string(dAtA[iNdEx:postIndex]) + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SubKind", 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.SubKind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", 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.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + 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 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 + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", 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 + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + 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 *CORSPolicy) 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: CORSPolicy: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CORSPolicy: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedOrigins", 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.AllowedOrigins = append(m.AllowedOrigins, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedMethods", 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.AllowedMethods = append(m.AllowedMethods, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowedHeaders", 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.AllowedHeaders = append(m.AllowedHeaders, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowCredentials", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllowCredentials = bool(v != 0) + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxAge", wireType) + } + m.MaxAge = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxAge |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExposedHeaders", 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.ExposedHeaders = append(m.ExposedHeaders, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SubKind", 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 - } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - if postIndex > l { + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IdentityCenterPermissionSet) 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 } - m.SubKind = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: + 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: IdentityCenterPermissionSet: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IdentityCenterPermissionSet: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ARN", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -68975,13 +69605,13 @@ func (m *AppV3) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) + m.ARN = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -68991,30 +69621,29 @@ func (m *AppV3) 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 ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AssignmentID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -69024,24 +69653,23 @@ func (m *AppV3) 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 ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.AssignmentID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -69065,7 +69693,7 @@ func (m *AppV3) Unmarshal(dAtA []byte) error { } return nil } -func (m *CORSPolicy) Unmarshal(dAtA []byte) error { +func (m *AppIdentityCenter) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -69088,15 +69716,15 @@ func (m *CORSPolicy) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CORSPolicy: wiretype end group for non-group") + return fmt.Errorf("proto: AppIdentityCenter: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CORSPolicy: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AppIdentityCenter: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowedOrigins", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AccountID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -69124,45 +69752,13 @@ func (m *CORSPolicy) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AllowedOrigins = append(m.AllowedOrigins, string(dAtA[iNdEx:postIndex])) + m.AccountID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowedMethods", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PermissionSets", 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.AllowedMethods = append(m.AllowedMethods, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowedHeaders", wireType) - } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -69172,94 +69768,25 @@ func (m *CORSPolicy) 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 ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.AllowedHeaders = append(m.AllowedHeaders, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowCredentials", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllowCredentials = bool(v != 0) - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MaxAge", wireType) - } - m.MaxAge = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MaxAge |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExposedHeaders", 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.PermissionSets = append(m.PermissionSets, &IdentityCenterPermissionSet{}) + if err := m.PermissionSets[len(m.PermissionSets)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.ExposedHeaders = append(m.ExposedHeaders, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -69761,6 +70288,42 @@ func (m *AppSpecV3) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field IdentityCenter", 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 + } + if m.IdentityCenter == nil { + m.IdentityCenter = &AppIdentityCenter{} + } + if err := m.IdentityCenter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex case 13: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field TCPPorts", wireType) diff --git a/api/version.go b/api/version.go index aea12a72d84b2..ec5a0ba02d9b6 100644 --- a/api/version.go +++ b/api/version.go @@ -3,6 +3,6 @@ package api import "github.com/coreos/go-semver/semver" -const Version = "17.0.2" +const Version = "17.0.4" var SemVersion = semver.New(Version) diff --git a/build.assets/macos/tsh/tsh.app/Contents/Info.plist b/build.assets/macos/tsh/tsh.app/Contents/Info.plist index a9e1e191ba220..19b70a1d39732 100644 --- a/build.assets/macos/tsh/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tsh/tsh.app/Contents/Info.plist @@ -19,13 +19,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 17.0.2 + 17.0.4 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 17.0.2 + 17.0.4 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist index d96fd17f53844..b1273e855094b 100644 --- a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist @@ -17,13 +17,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 17.0.2 + 17.0.4 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 17.0.2 + 17.0.4 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/tooling/go.mod b/build.assets/tooling/go.mod index a029b07024b19..43b983e74cb10 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 diff --git a/build.assets/versions.mk b/build.assets/versions.mk index 9e6ee436c254a..05bd81039a18c 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.61.0 NODE_VERSION ?= 20.18.0 diff --git a/docs/config.json b/docs/config.json index 2148a1e51c235..c983edb0091a3 100644 --- a/docs/config.json +++ b/docs/config.json @@ -135,7 +135,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%", @@ -185,18 +185,18 @@ "teleport": { "git": "api/14.0.0-gd1e081e", "major_version": "17", - "version": "17.0.2", + "version": "17.0.4", "url": "teleport.example.com", - "golang": "1.22", + "golang": "1.23.4", "plugin": { - "version": "17.0.2" + "version": "17.0.4" }, "helm_repo_url": "https://charts.releases.teleport.dev", - "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:17.0.2", - "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:17.0.2", - "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:17.0.2", - "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:17.0.2", - "teleport_install_script_url": "https://cdn.teleport.dev/install-v17.0.2.sh" + "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:17.0.4", + "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:17.0.4", + "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:17.0.4", + "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:17.0.4", + "teleport_install_script_url": "https://cdn.teleport.dev/install-v17.0.4.sh" }, "terraform": { "version": "1.0.0" diff --git a/docs/cspell.json b/docs/cspell.json index 108255715c1c6..9c8b9d51e36b6 100644 --- a/docs/cspell.json +++ b/docs/cspell.json @@ -613,6 +613,7 @@ "lmnop", "loadbalancer", "localca", + "localinstall", "loginerrortroubleshooting", "loginrule", "loginrules", @@ -809,6 +810,7 @@ "remask", "remotefx", "removelock", + "removerepo", "replaceall", "replicaset", "replicationgroup", @@ -1030,11 +1032,9 @@ "zxvf", "zztop" ], - "flagWords": [ - "hte" - ], + "flagWords": ["hte"], "ignorePaths": [ "**/reference/terraform-provider/**", "**/reference/operator-resources/**" ] -} \ No newline at end of file +} 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/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/device-trust/prereqs.mdx b/docs/pages/includes/device-trust/prereqs.mdx index 046cfd9fbcc1d..32699c20b21a7 100644 --- a/docs/pages/includes/device-trust/prereqs.mdx +++ b/docs/pages/includes/device-trust/prereqs.mdx @@ -12,3 +12,7 @@ - `tsh` v15.0.0 or newer. [Install tsh for Linux](../../installation.mdx#linux). - To authenticate a Web UI session you need [Teleport Connect]( ../../connect-your-client/teleport-connect.mdx#installation--upgrade) +- Correct end-user IP propagation to your Teleport deployment: + [X-Forwarded-For header](../../reference/config.mdx#proxy-service) (L7 load + balancer) or [PROXY protocol]( + ../../admin-guides/management/security/proxy-protocol.mdx) (L4 load balancer) diff --git a/docs/pages/includes/device-trust/troubleshooting.mdx b/docs/pages/includes/device-trust/troubleshooting.mdx index 3e18fb6d56d67..aeac5c840d216 100644 --- a/docs/pages/includes/device-trust/troubleshooting.mdx +++ b/docs/pages/includes/device-trust/troubleshooting.mdx @@ -80,8 +80,21 @@ follow the steps below: 4. Ask your cluster administrator if device trust is enabled (cluster mode "optional" or higher) -If all of the above steps are done, try logging out from the Web UI and logging -in again. +After the steps above are done try logging out from the Web UI and logging in +again. If the error persists, check your audit log for failed "device +authenticated" or "device web" events and look for failure details within the +events. + +### "device web authentication IP mismatch" errors + +"IP mismatch" errors in audit logs indicate that the IP checks performed by the +device web authentication ceremony failed. In this case it's likely that +end-user IPs are not propagated correctly to your Teleport deployment. + +* L7 load balancer: make sure it propagates the [X-Forwarded-For header]( + ../../reference/config.mdx#proxy-service) +* L4 load balancer: enable [PROXY protocol]( + ../../admin-guides/management/security/proxy-protocol.mdx) ### Checking Device Trust authorization status in the web UI 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/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..d28240bb98f10 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/architecture/session-recording.mdx b/docs/pages/reference/architecture/session-recording.mdx index eae3e56e84d33..1f40d9d6eb35d 100644 --- a/docs/pages/reference/architecture/session-recording.mdx +++ b/docs/pages/reference/architecture/session-recording.mdx @@ -91,7 +91,7 @@ Proxy Server cannot see the SSH traffic to the node. It is encrypted end-to-end In **Recording Proxy Mode**, the Proxy Service terminates (decrypts) the SSH connection using the certificate supplied by the client via SSH agent forwarding and then establishes its own SSH connection to the final destination server. -This allows the Proxy Service to forward SSH session data to the auth server to +This allows the Proxy Service to forward SSH session data to the Auth Service to be recorded, as shown below: ![recording-proxy](../../../img/recording-proxy.svg) @@ -124,7 +124,7 @@ Auth Service. When synchronous recording is enabled, the Teleport component doing the recording (which may be the Teleport SSH Service or the Proxy Service instance depending on your configuration) -submits each recording event to Teleport's Auth Server as it occurs. In this mode, +submits each recording event to Teleport's Auth Service as it occurs. In this mode, failure to emit a recording event is considered fatal - the session will be terminated if an event cannot be recorded. This makes synchronous recording best suited for highly regulated environments where you need to be confident that all data is recorded. @@ -132,9 +132,9 @@ This also means that you need a reliable and low-latency connection to the Auth Server for the duration of the session to ensure that the session isn't interrupted or terminated due to temporary connection loss. -In synchronous recording modes, the Auth Server receives a stream of recording +In synchronous recording modes, the Auth Service receives a stream of recording events and is responsible for assembling them into the final artifact and uploading -it to the storage backend. Since data is streamed directly to the Auth Server, +it to the storage backend. Since data is streamed directly to the Auth Service, Teleport administrators don't need to be concerned with disk space on their Teleport SSH Service and Proxy Service instances, as no recording data is written to those disks. @@ -143,7 +143,7 @@ written to those disks. When asynchronous, recording events are written to the local filesystem during the session. When the session completes, Teleport assembles the parts into a -complete recording and submits the entire recording to the Auth Server for storage. +complete recording and submits the entire recording to the Auth Service for storage. Since recording data is flushed to disk, administrators should be careful to ensure that the system has enough disk space to accommodate the expected number of Teleport @@ -152,13 +152,14 @@ is a greater chance that it can be tampered with, deleted, or otherwise corrupte before the upload completes. The advantage of asynchronous recording is that it doesn't require a persistent -connection to the Auth Server. For example, an SSH session can continue to operate -even if Teleport's Auth Server goes down. When the session completes Teleport will -attempt to upload the recording to the Auth Server. If the Auth Server is still +connection to the Auth Service. For example, an SSH session can continue to operate +even if Teleport's Auth Service goes down. When the session completes Teleport will +attempt to upload the recording to the Auth Service. If the Auth Service is still unavailable, Teleport has built-in retry and backoff mechanisms that will upload -the artifact when the Auth Server comes back online. Additionally, asynchronous +the artifact when the Auth Service comes back online. Additionally, asynchronous recording is well-suited towards recording sessions that are extra chatty or in -environments where the connection to the auth server is unreliable or high-latency. +environments where the connection to the Auth Service is unreliable or +high-latency. ## Storage @@ -209,17 +210,17 @@ to be completed. In asynchronous recording modes, if the node goes down during the session, the partially completed recording will sit on the node's disk. The node's upload completer will eventually -detect the abandoned upload and stream it to the Teleport Auth Server where it will be +detect the abandoned upload and stream it to the Teleport Auth Service where it will be written to the storage backend. -In synchronous recording modes, Teleport's Auth Server is streaming the recording directly -to storage. If the Auth Server goes down during a session, the uncompleted upload will sit -as a series of parts (in cloud storage or on the Auth Server's disk) and it is the -responsibility of the Auth Server's upload completer to detect the abandoned upload and +In synchronous recording modes, Teleport's Auth Service is streaming the recording directly +to storage. If the Auth Service goes down during a session, the uncompleted upload will sit +as a series of parts (in cloud storage or on an Auth Service instance's disk) and it is the +responsibility of the Auth Service's upload completer to detect the abandoned upload and complete it. ## Related reading - [Recording Proxy Mode](../../enroll-resources/server-access/guides/recording-proxy-mode.mdx) - [SSH recording modes](../monitoring/audit.mdx) -- [Desktop Access recording](../agent-services/desktop-access-reference/sessions.mdx) +- [Session recording for desktops](../agent-services/desktop-access-reference/sessions.mdx) diff --git a/docs/pages/reference/terraform-provider/data-sources/app.mdx b/docs/pages/reference/terraform-provider/data-sources/app.mdx index a289277d6bca4..db743284d4819 100644 --- a/docs/pages/reference/terraform-provider/data-sources/app.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/app.mdx @@ -45,6 +45,7 @@ Optional: - `cloud` (String) Cloud identifies the cloud instance the app represents. - `cors` (Attributes) CORSPolicy defines the Cross-Origin Resource Sharing settings for the app. (see [below for nested schema](#nested-schema-for-speccors)) - `dynamic_labels` (Attributes Map) DynamicLabels are the app's command labels. (see [below for nested schema](#nested-schema-for-specdynamic_labels)) +- `identity_center` (Attributes) IdentityCenter encasulates AWS identity-center specific information. Only valid for Identity Center account apps. (see [below for nested schema](#nested-schema-for-specidentity_center)) - `insecure_skip_verify` (Boolean) InsecureSkipVerify disables app's TLS certificate verification. - `integration` (String) Integration is the integration name that must be used to access this Application. Only applicable to AWS App Access. If present, the Application must use the Integration's credentials instead of ambient credentials to access Cloud APIs. - `public_addr` (String) PublicAddr is the public address the application is accessible at. @@ -82,6 +83,23 @@ Optional: - `result` (String) Result captures standard output +### Nested Schema for `spec.identity_center` + +Optional: + +- `account_id` (String) Account ID is the AWS-assigned ID of the account +- `permission_sets` (Attributes List) PermissionSets lists the available permission sets on the given account (see [below for nested schema](#nested-schema-for-specidentity_centerpermission_sets)) + +### Nested Schema for `spec.identity_center.permission_sets` + +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. + + + ### Nested Schema for `spec.rewrite` Optional: diff --git a/docs/pages/reference/terraform-provider/resources/app.mdx b/docs/pages/reference/terraform-provider/resources/app.mdx index 2b3046fdf1405..5176f3452e1f1 100644 --- a/docs/pages/reference/terraform-provider/resources/app.mdx +++ b/docs/pages/reference/terraform-provider/resources/app.mdx @@ -64,6 +64,7 @@ Optional: - `cloud` (String) Cloud identifies the cloud instance the app represents. - `cors` (Attributes) CORSPolicy defines the Cross-Origin Resource Sharing settings for the app. (see [below for nested schema](#nested-schema-for-speccors)) - `dynamic_labels` (Attributes Map) DynamicLabels are the app's command labels. (see [below for nested schema](#nested-schema-for-specdynamic_labels)) +- `identity_center` (Attributes) IdentityCenter encasulates AWS identity-center specific information. Only valid for Identity Center account apps. (see [below for nested schema](#nested-schema-for-specidentity_center)) - `insecure_skip_verify` (Boolean) InsecureSkipVerify disables app's TLS certificate verification. - `integration` (String) Integration is the integration name that must be used to access this Application. Only applicable to AWS App Access. If present, the Application must use the Integration's credentials instead of ambient credentials to access Cloud APIs. - `public_addr` (String) PublicAddr is the public address the application is accessible at. @@ -101,6 +102,23 @@ Optional: - `result` (String) Result captures standard output +### Nested Schema for `spec.identity_center` + +Optional: + +- `account_id` (String) Account ID is the AWS-assigned ID of the account +- `permission_sets` (Attributes List) PermissionSets lists the available permission sets on the given account (see [below for nested schema](#nested-schema-for-specidentity_centerpermission_sets)) + +### Nested Schema for `spec.identity_center.permission_sets` + +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. + + + ### Nested Schema for `spec.rewrite` Optional: 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/e b/e index 6670d20fc68b5..007aaf25dfddc 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit 6670d20fc68b5f7835d2aae7ca463e4029e4c50a +Subproject commit 007aaf25dfddcdef87ece7ffaa0c1e090d958c23 diff --git a/examples/chart/access/datadog/Chart.yaml b/examples/chart/access/datadog/Chart.yaml index 8bb376329f8b9..3ba7fd4c76a46 100644 --- a/examples/chart/access/datadog/Chart.yaml +++ b/examples/chart/access/datadog/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" apiVersion: v2 name: teleport-plugin-datadog diff --git a/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap index 085a9df457c71..6f88b9c772837 100644 --- a/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap @@ -26,6 +26,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-datadog - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-datadog-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-datadog-17.0.4 name: RELEASE-NAME-teleport-plugin-datadog diff --git a/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap index 29052a90cf946..0b1dbfa022071 100644 --- a/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-datadog - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-datadog-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-datadog-17.0.4 name: RELEASE-NAME-teleport-plugin-datadog spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-datadog - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-datadog-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-datadog-17.0.4 spec: containers: - command: diff --git a/examples/chart/access/discord/Chart.yaml b/examples/chart/access/discord/Chart.yaml index 1457b0e79fa3a..1f36b0159b8b1 100644 --- a/examples/chart/access/discord/Chart.yaml +++ b/examples/chart/access/discord/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" apiVersion: v2 name: teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap index a462bdc74f861..2bd071e42ab93 100644 --- a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-discord-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-discord-17.0.4 name: RELEASE-NAME-teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap index 60937564e817c..f4923e35775ad 100644 --- a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-discord-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-discord-17.0.4 name: RELEASE-NAME-teleport-plugin-discord spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-discord-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-discord-17.0.4 spec: containers: - command: diff --git a/examples/chart/access/email/Chart.yaml b/examples/chart/access/email/Chart.yaml index 0f27f57c95c19..8f767e3053edd 100644 --- a/examples/chart/access/email/Chart.yaml +++ b/examples/chart/access/email/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" apiVersion: v2 name: teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap index 126c94c37f19e..4d5442ee245a3 100644 --- a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap @@ -26,8 +26,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on): 1: | @@ -59,8 +59,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, no starttls): 1: | @@ -92,8 +92,8 @@ should match the snapshot (smtp on, no starttls): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, password file): 1: | @@ -125,8 +125,8 @@ should match the snapshot (smtp on, password file): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, roleToRecipients set): 1: | @@ -161,8 +161,8 @@ should match the snapshot (smtp on, roleToRecipients set): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, starttls disabled): 1: | @@ -194,6 +194,6 @@ should match the snapshot (smtp on, starttls disabled): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap index 30d961f13463d..871ef0c973042 100644 --- a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -22,8 +22,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 spec: containers: - command: @@ -34,7 +34,7 @@ should be possible to override volume name (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -75,8 +75,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -90,8 +90,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 spec: containers: - command: @@ -136,8 +136,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -151,8 +151,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 spec: containers: - command: @@ -163,7 +163,7 @@ should match the snapshot (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -204,8 +204,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -219,8 +219,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 spec: containers: - command: @@ -231,7 +231,7 @@ should match the snapshot (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -272,8 +272,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -287,8 +287,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 spec: containers: - command: @@ -299,7 +299,7 @@ should mount external secret (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -340,8 +340,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -355,8 +355,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-email-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-email-17.0.4 spec: containers: - command: @@ -367,7 +367,7 @@ should mount external secret (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.2 + image: public.ecr.aws/gravitational/teleport-plugin-email:17.0.4 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: diff --git a/examples/chart/access/jira/Chart.yaml b/examples/chart/access/jira/Chart.yaml index cdce4722e7765..dacd5ef921ed3 100644 --- a/examples/chart/access/jira/Chart.yaml +++ b/examples/chart/access/jira/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" apiVersion: v2 name: teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap index 03a3905e74b2c..696c8f74f07cd 100644 --- a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap @@ -32,6 +32,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-jira-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-jira-17.0.4 name: RELEASE-NAME-teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap index a086959061271..51f07dd218313 100644 --- a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-jira-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-jira-17.0.4 name: RELEASE-NAME-teleport-plugin-jira spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-jira-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-jira-17.0.4 spec: containers: - command: diff --git a/examples/chart/access/mattermost/Chart.yaml b/examples/chart/access/mattermost/Chart.yaml index 8a762673daf13..a81f8ff24e1c0 100644 --- a/examples/chart/access/mattermost/Chart.yaml +++ b/examples/chart/access/mattermost/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" apiVersion: v2 name: teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap index 4bbb6774707c8..72537cb6e6e4a 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap @@ -22,6 +22,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-mattermost-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-mattermost-17.0.4 name: RELEASE-NAME-teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap index f4ba03a012f3e..57e97b33ac478 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-mattermost-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-mattermost-17.0.4 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-mattermost-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-mattermost-17.0.4 spec: containers: - command: @@ -75,8 +75,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-mattermost-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-mattermost-17.0.4 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -90,8 +90,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-mattermost-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-mattermost-17.0.4 spec: containers: - command: @@ -102,7 +102,7 @@ should mount external secret: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:17.0.2 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:17.0.4 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: @@ -143,8 +143,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-mattermost-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-mattermost-17.0.4 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -158,8 +158,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-mattermost-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-mattermost-17.0.4 spec: containers: - command: @@ -170,7 +170,7 @@ should override volume name: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:17.0.2 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:17.0.4 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: diff --git a/examples/chart/access/msteams/Chart.yaml b/examples/chart/access/msteams/Chart.yaml index 39a79f1a2b87a..3d6c444644664 100644 --- a/examples/chart/access/msteams/Chart.yaml +++ b/examples/chart/access/msteams/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" apiVersion: v2 name: teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap index e31886458bda1..5375a7d5a3815 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap @@ -29,6 +29,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-msteams-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-msteams-17.0.4 name: RELEASE-NAME-teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap index afe05f1d8f250..2fd504cc02bd7 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-msteams-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-msteams-17.0.4 name: RELEASE-NAME-teleport-plugin-msteams spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-msteams-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-msteams-17.0.4 spec: containers: - command: diff --git a/examples/chart/access/pagerduty/Chart.yaml b/examples/chart/access/pagerduty/Chart.yaml index 089eda7972f6e..e23b185fe02f4 100644 --- a/examples/chart/access/pagerduty/Chart.yaml +++ b/examples/chart/access/pagerduty/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" apiVersion: v2 name: teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap index c38c3e8f2a86e..a8f177811f71a 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap @@ -21,6 +21,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-pagerduty-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-pagerduty-17.0.4 name: RELEASE-NAME-teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap index 9249f2c1e5fc5..cc12b05a8ed6e 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-pagerduty-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-pagerduty-17.0.4 name: RELEASE-NAME-teleport-plugin-pagerduty spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-pagerduty-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-pagerduty-17.0.4 spec: containers: - command: diff --git a/examples/chart/access/slack/Chart.yaml b/examples/chart/access/slack/Chart.yaml index 5bec9fbedb51e..18593ba4a8123 100644 --- a/examples/chart/access/slack/Chart.yaml +++ b/examples/chart/access/slack/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" apiVersion: v2 name: teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap index 750e3457c05a5..f07475f9388c6 100644 --- a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-slack-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-slack-17.0.4 name: RELEASE-NAME-teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap index b062a46088806..2c43b6e233db0 100644 --- a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-slack-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-slack-17.0.4 name: RELEASE-NAME-teleport-plugin-slack spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-slack-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-slack-17.0.4 spec: containers: - command: diff --git a/examples/chart/event-handler/Chart.yaml b/examples/chart/event-handler/Chart.yaml index 998cb7f1ff875..993c5667c876f 100644 --- a/examples/chart/event-handler/Chart.yaml +++ b/examples/chart/event-handler/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" apiVersion: v2 name: teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap index cf34d758bcf65..630caadfbd9e9 100644 --- a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap @@ -26,6 +26,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-event-handler-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-event-handler-17.0.4 name: RELEASE-NAME-teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap index 023599c7a918e..7556759cfc49c 100644 --- a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-plugin-event-handler-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-plugin-event-handler-17.0.4 name: RELEASE-NAME-teleport-plugin-event-handler spec: replicas: 1 @@ -82,7 +82,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: "true" - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-plugin-event-handler:17.0.2 + image: public.ecr.aws/gravitational/teleport-plugin-event-handler:17.0.4 imagePullPolicy: IfNotPresent name: teleport-plugin-event-handler ports: diff --git a/examples/chart/tbot/Chart.yaml b/examples/chart/tbot/Chart.yaml index f3ff01ed1d9ad..e08615060b385 100644 --- a/examples/chart/tbot/Chart.yaml +++ b/examples/chart/tbot/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" name: tbot apiVersion: v2 diff --git a/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap index d837325b88f2f..3c90aa7e97849 100644 --- a/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap @@ -29,7 +29,7 @@ should match the snapshot (full): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: tbot - helm.sh/chart: tbot-17.0.2 + helm.sh/chart: tbot-17.0.4 test-key: test-label-pod spec: affinity: @@ -68,7 +68,7 @@ should match the snapshot (full): value: "1" - name: TEST_ENV value: test-value - image: public.ecr.aws/gravitational/tbot-distroless:17.0.2 + image: public.ecr.aws/gravitational/tbot-distroless:17.0.4 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -154,7 +154,7 @@ should match the snapshot (simple): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: tbot - helm.sh/chart: tbot-17.0.2 + helm.sh/chart: tbot-17.0.4 spec: containers: - args: @@ -176,7 +176,7 @@ should match the snapshot (simple): fieldPath: spec.nodeName - name: KUBERNETES_TOKEN_PATH value: /var/run/secrets/tokens/join-sa-token - image: public.ecr.aws/gravitational/tbot-distroless:17.0.2 + image: public.ecr.aws/gravitational/tbot-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-cluster/Chart.yaml b/examples/chart/teleport-cluster/Chart.yaml index e9c697272187d..cf9e942a69328 100644 --- a/examples/chart/teleport-cluster/Chart.yaml +++ b/examples/chart/teleport-cluster/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" name: teleport-cluster apiVersion: v2 diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml index 229b4b899d804..ca8bab514af5d 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" name: teleport-operator apiVersion: v2 diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap index 1928b5f00f7e8..f36a7cb215c43 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap @@ -8,8 +8,8 @@ adds operator permissions to ClusterRole: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-cluster-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-cluster-17.0.4 teleport.dev/majorVersion: "17" name: RELEASE-NAME rules: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap index ea0e3e401735a..28434d84c2031 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap @@ -1848,8 +1848,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-cluster-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-cluster-17.0.4 teleport.dev/majorVersion: "17" name: RELEASE-NAME-auth namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap index 4d993e77d172f..23cfb6dd74f69 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap @@ -8,7 +8,7 @@ - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -141,7 +141,7 @@ should set nodeSelector when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -238,7 +238,7 @@ should set resources when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -324,7 +324,7 @@ should set securityContext when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap index 16c0dde8ed4f6..2a825c63f754f 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap @@ -567,8 +567,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-cluster-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-cluster-17.0.4 teleport.dev/majorVersion: "17" name: RELEASE-NAME-proxy namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap index 088d4fb1f3379..e88d6755849f1 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap @@ -11,8 +11,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-cluster-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-cluster-17.0.4 teleport.dev/majorVersion: "17" name: RELEASE-NAME-proxy namespace: NAMESPACE @@ -26,7 +26,7 @@ sets clusterDomain on Deployment Pods: template: metadata: annotations: - checksum/config: dae3fc508f5900cce4e6712695856ddbd70d4b323139e1970517e461201de503 + checksum/config: 75e7880364b55dc899e7e003c20f73c24bc08a212d5d0466dfeabb99616c0817 kubernetes.io/pod: test-annotation kubernetes.io/pod-different: 4 labels: @@ -34,8 +34,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 17.0.2 - helm.sh/chart: teleport-cluster-17.0.2 + app.kubernetes.io/version: 17.0.4 + helm.sh/chart: teleport-cluster-17.0.4 teleport.dev/majorVersion: "17" spec: affinity: @@ -44,7 +44,7 @@ sets clusterDomain on Deployment Pods: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -105,7 +105,7 @@ sets clusterDomain on Deployment Pods: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.test.com - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 name: wait-auth-update serviceAccountName: RELEASE-NAME-proxy terminationGracePeriodSeconds: 60 @@ -137,7 +137,7 @@ should provision initContainer correctly when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 name: wait-auth-update resources: limits: @@ -201,7 +201,7 @@ should set nodeSelector when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -262,7 +262,7 @@ should set nodeSelector when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 name: wait-auth-update nodeSelector: environment: security @@ -313,7 +313,7 @@ should set resources for wait-auth-update initContainer when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -381,7 +381,7 @@ should set resources for wait-auth-update initContainer when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 name: wait-auth-update resources: limits: @@ -421,7 +421,7 @@ should set resources when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,7 +489,7 @@ should set resources when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 name: wait-auth-update resources: limits: @@ -529,7 +529,7 @@ should set securityContext for initContainers when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -597,7 +597,7 @@ should set securityContext for initContainers when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 name: wait-auth-update securityContext: allowPrivilegeEscalation: false @@ -637,7 +637,7 @@ should set securityContext when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -705,7 +705,7 @@ should set securityContext when set in values: - wait - no-resolve - RELEASE-NAME-auth-v16.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 name: wait-auth-update securityContext: allowPrivilegeEscalation: false diff --git a/examples/chart/teleport-kube-agent/Chart.yaml b/examples/chart/teleport-kube-agent/Chart.yaml index 673902d009cfa..6b62ab01c6a4d 100644 --- a/examples/chart/teleport-kube-agent/Chart.yaml +++ b/examples/chart/teleport-kube-agent/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "17.0.2" +.version: &version "17.0.4" name: teleport-kube-agent apiVersion: v2 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap index 1d1cd6e497b5d..0aa8a875c6f82 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap @@ -32,7 +32,7 @@ sets Deployment annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -109,7 +109,7 @@ sets Deployment labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -173,7 +173,7 @@ sets Pod annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -237,7 +237,7 @@ sets Pod labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -322,7 +322,7 @@ should add emptyDir for data when existingDataVolume is not set if action is Upg value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -387,7 +387,7 @@ should add insecureSkipProxyTLSVerify to args when set in values if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -451,7 +451,7 @@ should correctly configure existingDataVolume when set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -513,7 +513,7 @@ should expose diag port if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -589,7 +589,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -665,7 +665,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -729,7 +729,7 @@ should have one replica when replicaCount is not set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -793,7 +793,7 @@ should mount extraVolumes and extraVolumeMounts if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -862,7 +862,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf an value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -932,7 +932,7 @@ should mount jamfCredentialsSecret.name when role is jamf and action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1004,7 +1004,7 @@ should mount tls.existingCASecretName and set environment when set in values if value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1078,7 +1078,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: http://username:password@my.proxy.host:3128 - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1148,7 +1148,7 @@ should provision initContainer correctly when set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1270,7 +1270,7 @@ should set affinity when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1334,7 +1334,7 @@ should set default serviceAccountName when not set in values if action is Upgrad value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1411,7 +1411,7 @@ should set environment when extraEnv set in values if action is Upgrade: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1539,7 +1539,7 @@ should set imagePullPolicy when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1603,7 +1603,7 @@ should set nodeSelector if set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1669,7 +1669,7 @@ should set not set priorityClassName when not set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1745,7 +1745,7 @@ should set preferred affinity when more than one replica is used if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1809,7 +1809,7 @@ should set priorityClassName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1874,7 +1874,7 @@ should set probeTimeoutSeconds when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1948,7 +1948,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set if value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2012,7 +2012,7 @@ should set resources when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2083,7 +2083,7 @@ should set serviceAccountName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2147,7 +2147,7 @@ should set tolerations when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap index f3113275a5ac8..2cabef21a2c19 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap @@ -25,7 +25,7 @@ should create ServiceAccount for post-delete hook by default: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -108,7 +108,7 @@ should not create ServiceAccount for post-delete hook if serviceAccount.create i fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -138,7 +138,7 @@ should not create ServiceAccount, Role or RoleBinding for post-delete hook if se fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -168,7 +168,7 @@ should set nodeSelector in post-delete hook: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -200,7 +200,7 @@ should set resources in the Job's pod spec if resources is set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent name: post-delete-job resources: diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap index da8651302d003..01c9af5dd81a0 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap @@ -18,7 +18,7 @@ sets Pod annotations when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -91,7 +91,7 @@ sets Pod labels when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -188,7 +188,7 @@ sets StatefulSet labels when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -293,7 +293,7 @@ should add insecureSkipProxyTLSVerify to args when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -366,7 +366,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and action value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -459,7 +459,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and is Fre value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -542,7 +542,7 @@ should add volumeMount for data volume when using StatefulSet: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -615,7 +615,7 @@ should expose diag port: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -688,7 +688,7 @@ should generate Statefulset when storage is disabled and mode is a Upgrade: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -775,7 +775,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -860,7 +860,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -933,7 +933,7 @@ should have one replica when replicaCount is not set: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1006,7 +1006,7 @@ should install Statefulset when storage is disabled and mode is a Fresh Install: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1081,7 +1081,7 @@ should mount extraVolumes and extraVolumeMounts: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1159,7 +1159,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1240,7 +1240,7 @@ should mount jamfCredentialsSecret.name when role is jamf: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1323,7 +1323,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1408,7 +1408,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: /etc/teleport-tls-ca/ca.pem - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1489,7 +1489,7 @@ should not add emptyDir for data when using StatefulSet: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1562,7 +1562,7 @@ should provision initContainer correctly when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1693,7 +1693,7 @@ should set affinity when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1766,7 +1766,7 @@ should set default serviceAccountName when not set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1852,7 +1852,7 @@ should set environment when extraEnv set in values: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1998,7 +1998,7 @@ should set imagePullPolicy when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -2071,7 +2071,7 @@ should set nodeSelector if set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2158,7 +2158,7 @@ should set preferred affinity when more than one replica is used: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2231,7 +2231,7 @@ should set probeTimeoutSeconds when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2314,7 +2314,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2387,7 +2387,7 @@ should set resources when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2467,7 +2467,7 @@ should set serviceAccountName when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2540,7 +2540,7 @@ should set storage.requests when set in values and action is an Upgrade: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2613,7 +2613,7 @@ should set storage.storageClassName when set in values and action is an Upgrade: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2686,7 +2686,7 @@ should set tolerations when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:17.0.2 + image: public.ecr.aws/gravitational/teleport-distroless:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap index d351beb6fefdb..2b89f2bfde90a 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap @@ -27,7 +27,7 @@ sets the affinity: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:17.0.2 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -73,7 +73,7 @@ sets the tolerations: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:17.0.2 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:17.0.4 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/teleport-usage/Dockerfile b/examples/teleport-usage/Dockerfile index ba959b0c00107..aa9f485221143 100644 --- a/examples/teleport-usage/Dockerfile +++ b/examples/teleport-usage/Dockerfile @@ -1,6 +1,6 @@ ARG BASE_IMAGE=gcr.io/distroless/static-debian12 -FROM golang:1.21-bookworm as builder +FROM golang:1.22-bookworm as builder WORKDIR /go/src/github.com/gravitational/teleport/examples/teleport-usage diff --git a/examples/teleport-usage/go.mod b/examples/teleport-usage/go.mod index eaf6665957da9..9c009bebf497a 100644 --- a/examples/teleport-usage/go.mod +++ b/examples/teleport-usage/go.mod @@ -1,6 +1,6 @@ module usage-script -go 1.19 +go 1.22 require ( github.com/aws/aws-sdk-go v1.47.4 diff --git a/gen/proto/go/prehog/v1alpha/teleport.pb.go b/gen/proto/go/prehog/v1alpha/teleport.pb.go index 2900ed090375d..a4da89c259066 100644 --- a/gen/proto/go/prehog/v1alpha/teleport.pb.go +++ b/gen/proto/go/prehog/v1alpha/teleport.pb.go @@ -7548,6 +7548,12 @@ type SubmitEventRequest struct { // // PostHog timestamp Timestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // teleport_version is the version of the Teleport auth server that submitted + // the event, without the "v" prefix. + // For example: 16.4.7 + // + // PostHog property: tp.teleport_version + TeleportVersion string `protobuf:"bytes,95,opt,name=teleport_version,json=teleportVersion,proto3" json:"teleport_version,omitempty"` // the event being submitted // // Types that are assignable to Event: @@ -7690,6 +7696,13 @@ func (x *SubmitEventRequest) GetTimestamp() *timestamppb.Timestamp { return nil } +func (x *SubmitEventRequest) GetTeleportVersion() string { + if x != nil { + return x.TeleportVersion + } + return "" +} + func (m *SubmitEventRequest) GetEvent() isSubmitEventRequest_Event { if m != nil { return m.Event @@ -10125,963 +10138,965 @@ var file_prehog_v1alpha_teleport_proto_rawDesc = []byte{ 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x84, 0x4f, 0x0a, 0x12, 0x53, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xaf, 0x4f, 0x0a, 0x12, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3f, - 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, - 0x3f, 0x0a, 0x0a, 0x73, 0x73, 0x6f, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x53, 0x4f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x73, 0x73, 0x6f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x12, 0x4e, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, - 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x12, 0x48, 0x0a, 0x0d, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x4c, 0x0a, 0x0f, 0x75, 0x69, - 0x5f, 0x62, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6c, 0x69, - 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x75, 0x69, 0x42, 0x61, 0x6e, - 0x6e, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x92, 0x01, 0x0a, 0x29, 0x75, 0x69, 0x5f, - 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x5f, 0x67, 0x6f, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, - 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x47, - 0x6f, 0x54, 0x6f, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, 0x63, - 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x23, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x54, 0x6f, 0x44, - 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x82, 0x01, - 0x0a, 0x23, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, - 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, - 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x1e, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6c, 0x69, - 0x63, 0x6b, 0x12, 0x92, 0x01, 0x0a, 0x29, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x29, + 0x0a, 0x10, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0a, 0x75, 0x73, 0x65, + 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x09, 0x75, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x3f, 0x0a, 0x0a, 0x73, 0x73, + 0x6f, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x53, 0x53, 0x4f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x73, 0x73, 0x6f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x0d, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x4c, 0x0a, 0x0f, 0x75, 0x69, 0x5f, 0x62, 0x61, 0x6e, 0x6e, + 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x55, 0x49, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x75, 0x69, 0x42, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x43, 0x6c, + 0x69, 0x63, 0x6b, 0x12, 0x92, 0x01, 0x0a, 0x29, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x67, 0x6f, 0x5f, 0x74, + 0x6f, 0x5f, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x54, 0x6f, 0x44, 0x61, + 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x23, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x47, 0x6f, 0x54, 0x6f, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x82, 0x01, 0x0a, 0x23, 0x75, 0x69, 0x5f, + 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, 0x5f, 0x66, 0x69, 0x72, 0x73, + 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4c, 0x61, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x23, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x61, 0x74, - 0x65, 0x72, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x7b, 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x6f, 0x6e, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x74, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x12, 0x87, 0x01, 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, - 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, - 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, - 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x7b, - 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, - 0x64, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x63, 0x6c, 0x69, - 0x63, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x52, 0x65, 0x63, 0x6f, + 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x75, + 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x92, 0x01, + 0x0a, 0x29, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x64, 0x64, + 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, + 0x6c, 0x61, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, + 0x69, 0x72, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x61, 0x74, 0x65, + 0x72, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x23, 0x75, + 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x41, 0x64, 0x64, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4c, 0x61, 0x74, 0x65, 0x72, 0x43, 0x6c, 0x69, + 0x63, 0x6b, 0x12, 0x7b, 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x5f, + 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, + 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x1c, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x53, 0x65, 0x74, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, + 0x87, 0x01, 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, + 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6c, 0x6c, 0x65, + 0x6e, 0x67, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x7b, 0x0a, 0x20, 0x75, 0x69, 0x5f, + 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, + 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x43, 0x6c, 0x69, 0x63, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, - 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, + 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x6f, 0x0a, 0x1c, 0x75, 0x69, 0x5f, 0x72, 0x65, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x70, 0x79, + 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, + 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, 0x70, + 0x79, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x43, 0x6f, - 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x6f, 0x0a, 0x1c, 0x75, - 0x69, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, - 0x5f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x55, 0x49, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, - 0x65, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, - 0x64, 0x65, 0x73, 0x43, 0x6f, 0x70, 0x79, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x72, 0x0a, 0x1d, - 0x75, 0x69, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x73, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, - 0x6f, 0x64, 0x65, 0x73, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x19, 0x75, 0x69, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x63, 0x6b, - 0x12, 0x63, 0x0a, 0x19, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x75, - 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x82, 0x01, 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x12, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x6f, 0x0a, 0x1d, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x69, - 0x73, 0x73, 0x75, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x1a, 0x75, 0x73, 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x10, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x76, 0x32, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x56, 0x32, 0x12, 0x76, 0x0a, 0x20, 0x75, 0x69, - 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x7f, 0x0a, 0x23, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x1f, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x8f, 0x01, 0x0a, 0x29, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x74, 0x6c, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x24, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x4d, 0x74, 0x6c, 0x73, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0xb8, 0x01, 0x0a, 0x38, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x74, - 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, + 0x70, 0x79, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x72, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x72, 0x65, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x70, 0x72, 0x69, + 0x6e, 0x74, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x55, 0x49, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x73, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x19, 0x75, 0x69, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x64, 0x65, + 0x73, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x63, 0x0a, 0x19, 0x75, + 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x82, 0x01, 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x6f, 0x0a, 0x1d, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x65, + 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x73, 0x73, + 0x75, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x75, 0x73, 0x65, 0x72, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x73, 0x73, 0x75, 0x65, + 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x10, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x76, 0x32, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x56, 0x32, 0x12, 0x76, 0x0a, 0x20, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x1c, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x7f, 0x0a, + 0x23, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x75, + 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x8f, + 0x01, 0x0a, 0x29, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x5f, 0x6d, 0x74, 0x6c, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x4d, + 0x54, 0x4c, 0x53, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x24, 0x75, 0x69, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x4d, 0x74, 0x6c, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0xb8, 0x01, 0x0a, 0x38, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x41, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, + 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, + 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x31, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x31, 0x75, - 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x54, - 0x6f, 0x6f, 0x6c, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0xae, 0x01, 0x0a, 0x34, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x5f, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, - 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x2e, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, - 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x95, 0x01, 0x0a, 0x2b, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, - 0x64, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0xae, 0x01, 0x0a, 0x34, + 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x73, 0x6b, + 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x2e, 0x75, 0x69, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x95, 0x01, 0x0a, + 0x2b, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x41, 0x75, + 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x26, 0x75, 0x69, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x2f, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x61, 0x6d, 0x5f, 0x70, 0x6f, 0x6c, 0x69, + 0x63, 0x79, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x49, 0x41, 0x4d, 0x50, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x29, 0x75, 0x69, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x49, 0x61, 0x6d, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x26, 0x75, 0x69, 0x5f, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, - 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x26, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x41, 0x75, 0x74, - 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x2f, 0x75, 0x69, - 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x5f, 0x69, 0x61, 0x6d, - 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x49, 0x41, 0x4d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x29, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x49, 0x61, 0x6d, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x88, 0x01, 0x0a, 0x26, - 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x69, 0x6e, - 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, + 0x76, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x22, 0x75, + 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, + 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x79, 0x0a, 0x21, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, - 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x22, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x72, - 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x21, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x65, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x1d, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x65, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x69, 0x0a, 0x1b, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0b, - 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x12, 0x63, 0x0a, 0x18, 0x75, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, - 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x20, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, - 0x6f, 0x6c, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x14, 0x75, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, - 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x70, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x73, 0x61, 0x76, 0x65, - 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, 0x76, - 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, - 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, - 0x76, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x76, 0x0a, 0x1f, 0x75, 0x69, 0x5f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1d, 0x75, + 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x69, 0x0a, 0x1b, + 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, + 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x0a, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x63, 0x0a, 0x18, 0x75, + 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, + 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, + 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6c, + 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x6c, 0x69, 0x63, 0x6b, + 0x12, 0x70, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, + 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x73, 0x61, 0x76, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x63, + 0x6b, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6c, 0x69, 0x63, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x53, 0x61, 0x76, 0x65, 0x43, 0x6c, 0x69, + 0x63, 0x6b, 0x12, 0x76, 0x0a, 0x1f, 0x75, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, + 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x5f, + 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, + 0x75, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x98, 0x01, 0x0a, 0x2b, 0x75, + 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x6f, 0x6c, + 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, - 0x65, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x1a, 0x75, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, - 0x52, 0x6f, 0x6c, 0x65, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, - 0x98, 0x01, 0x0a, 0x2b, 0x75, 0x69, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x65, - 0x77, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x18, - 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, - 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x25, 0x75, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, - 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x69, 0x65, 0x77, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0c, 0x6b, 0x75, - 0x62, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x6b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2f, 0x0a, 0x04, 0x73, 0x66, 0x74, 0x70, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x53, 0x46, 0x54, 0x50, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x66, - 0x74, 0x70, 0x12, 0x56, 0x0a, 0x14, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x12, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x11, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x12, 0x9c, 0x01, 0x0a, 0x2e, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x61, 0x77, 0x73, 0x5f, 0x6f, 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x28, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x77, 0x73, 0x4f, 0x69, 0x64, 0x63, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x83, 0x01, 0x0a, 0x25, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x64, 0x73, 0x5f, - 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x44, 0x53, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x64, 0x73, 0x45, 0x6e, 0x72, - 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x6b, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x63, - 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, - 0x69, 0x63, 0x6b, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x55, 0x49, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x43, - 0x61, 0x6c, 0x6c, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x11, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x73, 0x73, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x79, 0x0a, 0x21, 0x75, - 0x69, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, - 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1d, 0x75, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x82, 0x01, 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x65, - 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x65, - 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x3f, 0x0a, 0x0a, 0x62, 0x6f, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x2f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x42, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x62, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x7a, 0x0a, 0x1f, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x69, 0x72, 0x65, 0x5f, 0x73, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x18, 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, + 0x65, 0x56, 0x69, 0x65, 0x77, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x25, + 0x75, 0x69, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x65, 0x77, 0x52, 0x6f, 0x6c, 0x65, 0x56, + 0x69, 0x65, 0x77, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x12, 0x45, 0x0a, 0x0c, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4b, 0x75, 0x62, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x0b, 0x6b, 0x75, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x04, + 0x73, 0x66, 0x74, 0x70, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x46, 0x54, 0x50, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x66, 0x74, 0x70, 0x12, 0x56, 0x0a, + 0x14, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x12, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x27, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x12, 0x9c, + 0x01, 0x0a, 0x2e, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x77, 0x73, 0x5f, 0x6f, + 0x69, 0x64, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x57, + 0x53, 0x4f, 0x49, 0x44, 0x43, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x28, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x77, 0x73, 0x4f, 0x69, 0x64, + 0x63, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x83, 0x01, + 0x0a, 0x25, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, + 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x52, 0x44, 0x53, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x20, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x64, 0x73, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x6b, 0x0a, 0x1d, 0x75, 0x69, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x74, + 0x6f, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x43, 0x61, + 0x6c, 0x6c, 0x54, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x75, 0x69, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x6f, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x54, 0x0a, 0x11, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x79, 0x0a, 0x21, 0x75, 0x69, 0x5f, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x55, 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x1d, 0x75, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x82, 0x01, 0x0a, 0x24, 0x75, 0x69, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x55, 0x49, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x75, 0x69, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, + 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x2e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x0a, 0x62, + 0x6f, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x42, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x09, 0x62, 0x6f, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x7a, 0x0a, 0x1f, + 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x69, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x18, + 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x69, 0x72, 0x65, 0x53, 0x75, 0x62, + 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x6e, 0x61, 0x69, - 0x72, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x1c, 0x75, 0x69, 0x4f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x51, 0x75, 0x65, 0x73, 0x74, 0x69, - 0x6f, 0x6e, 0x6e, 0x61, 0x69, 0x72, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x39, 0x0a, - 0x08, 0x62, 0x6f, 0x74, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x42, 0x6f, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x07, 0x62, 0x6f, 0x74, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x51, 0x0a, 0x10, 0x61, 0x73, 0x73, 0x69, - 0x73, 0x74, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x32, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x17, 0x61, - 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, - 0x73, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x15, 0x61, 0x73, 0x73, 0x69, - 0x73, 0x74, 0x4e, 0x65, 0x77, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x65, 0x0a, 0x19, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x34, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x17, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x6e, 0x0a, 0x1c, 0x66, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x66, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5e, 0x0a, 0x15, 0x61, 0x73, 0x73, 0x69, - 0x73, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x13, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x48, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x69, - 0x73, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x13, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x72, - 0x6f, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x72, 0x65, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x39, 0x0a, 0x08, 0x62, 0x6f, 0x74, 0x5f, + 0x6a, 0x6f, 0x69, 0x6e, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x42, 0x6f, 0x74, 0x4a, + 0x6f, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x62, 0x6f, 0x74, 0x4a, + 0x6f, 0x69, 0x6e, 0x12, 0x51, 0x0a, 0x10, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, + 0x73, 0x73, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x64, 0x0a, 0x17, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, + 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x4e, + 0x65, 0x77, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x15, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x77, + 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x19, + 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x64, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x6e, 0x0a, 0x1c, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x72, + 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x5e, 0x0a, 0x15, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x36, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, + 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x48, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x5f, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x73, 0x73, 0x69, + 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x0c, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, + 0x13, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x11, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x72, 0x6f, - 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x13, 0x6c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x39, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x6c, 0x69, 0x63, 0x65, 0x6e, - 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x12, - 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, - 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x12, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, - 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, - 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x3d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, - 0x72, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x69, 0x0a, 0x1a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x40, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, - 0x72, 0x61, 0x6e, 0x74, 0x73, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x73, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x12, 0x81, 0x01, 0x0a, 0x22, 0x75, - 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x63, 0x32, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x45, 0x43, 0x32, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, - 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x63, 0x32, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, - 0x0a, 0x17, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x65, 0x69, 0x63, 0x65, 0x18, 0x42, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x45, 0x49, 0x43, 0x45, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x45, 0x69, - 0x63, 0x65, 0x12, 0x62, 0x0a, 0x17, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x43, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x14, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x64, 0x0a, 0x17, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, - 0x70, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x18, 0x44, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, - 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x15, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x44, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x65, 0x0a, 0x1a, - 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x43, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, - 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x64, 0x65, 0x73, 0x6b, 0x74, - 0x6f, 0x70, 0x43, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x11, 0x74, 0x61, 0x67, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x54, 0x41, 0x47, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x74, 0x61, 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x86, 0x01, 0x0a, 0x23, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, - 0x47, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, - 0x75, 0x64, 0x69, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x12, 0x6b, 0x0a, 0x1a, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x48, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4c, 0x0a, - 0x0f, 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, - 0x18, 0x49, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x75, - 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x59, 0x0a, 0x15, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x65, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x13, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x65, 0x74, 0x63, - 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x3a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x55, + 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x55, 0x0a, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x4c, 0x20, + 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x65, 0x77, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x74, 0x0a, 0x1d, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x4d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x62, 0x0a, 0x18, 0x6d, 0x66, 0x61, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x4e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2e, 0x4d, 0x46, 0x41, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x66, - 0x61, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x12, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x5f, 0x73, - 0x76, 0x69, 0x64, 0x5f, 0x69, 0x73, 0x73, 0x75, 0x65, 0x64, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x53, 0x56, 0x49, 0x44, 0x49, 0x73, 0x73, 0x75, - 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x73, 0x70, 0x69, 0x66, 0x66, - 0x65, 0x53, 0x76, 0x69, 0x64, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x12, 0x5c, 0x0a, 0x15, 0x6f, - 0x6b, 0x74, 0x61, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, - 0x73, 0x79, 0x6e, 0x63, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4f, 0x6b, 0x74, 0x61, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x6f, 0x6b, 0x74, 0x61, 0x41, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x12, 0x5e, 0x0a, 0x15, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x7f, 0x0a, 0x21, 0x64, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x52, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x23, 0x75, - 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x1f, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x77, 0x0a, 0x21, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x5f, 0x65, 0x6b, 0x73, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4b, 0x75, 0x62, 0x65, 0x45, 0x4b, 0x53, 0x45, - 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x4b, 0x75, 0x62, 0x65, 0x45, 0x6b, 0x73, 0x45, - 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x7d, 0x0a, 0x23, 0x75, 0x69, - 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x55, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x75, 0x69, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x65, 0x0a, 0x18, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, - 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x18, 0x56, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x53, 0x63, - 0x61, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x15, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x53, 0x63, 0x61, 0x6e, - 0x12, 0x94, 0x01, 0x0a, 0x29, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, - 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x57, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x24, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x2a, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x58, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x69, 0x0a, 0x1a, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x73, + 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, + 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x73, 0x54, + 0x6f, 0x55, 0x73, 0x65, 0x72, 0x12, 0x81, 0x01, 0x0a, 0x22, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x63, 0x32, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x43, + 0x32, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x75, 0x69, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x63, 0x32, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x17, 0x75, 0x69, 0x5f, + 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, + 0x65, 0x69, 0x63, 0x65, 0x18, 0x42, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x45, 0x49, 0x43, 0x45, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x45, 0x69, 0x63, 0x65, 0x12, 0x62, 0x0a, + 0x17, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x43, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x75, 0x69, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x64, 0x0a, 0x17, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x5f, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x18, 0x44, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x15, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x53, 0x68, 0x61, 0x72, 0x65, 0x12, 0x65, 0x0a, 0x1a, 0x64, 0x65, 0x73, 0x6b, 0x74, + 0x6f, 0x70, 0x5f, 0x63, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x18, 0x45, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x65, 0x73, + 0x6b, 0x74, 0x6f, 0x70, 0x43, 0x6c, 0x69, 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x64, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x43, 0x6c, 0x69, + 0x70, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x52, + 0x0a, 0x11, 0x74, 0x61, 0x67, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x5f, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x46, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x54, 0x41, 0x47, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x0f, 0x74, 0x61, 0x67, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x86, 0x01, 0x0a, 0x23, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, + 0x61, 0x75, 0x64, 0x69, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x75, + 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x18, 0x47, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x35, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x41, 0x75, 0x64, 0x69, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x41, + 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x12, 0x6b, 0x0a, 0x1a, 0x73, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x67, + 0x65, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x48, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x17, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4c, 0x0a, 0x0f, 0x61, 0x75, 0x64, 0x69, + 0x74, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x49, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x75, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x59, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x4a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x65, 0x74, 0x63, 0x68, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x68, 0x0a, 0x19, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, + 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x4b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x74, 0x0a, 0x1d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6d, 0x70, + 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x1a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x69, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x18, 0x6d, + 0x66, 0x61, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4d, + 0x46, 0x41, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x66, 0x61, 0x41, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x55, 0x0a, 0x12, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x5f, 0x73, 0x76, 0x69, 0x64, 0x5f, 0x69, + 0x73, 0x73, 0x75, 0x65, 0x64, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x70, 0x72, + 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x50, 0x49, + 0x46, 0x46, 0x45, 0x53, 0x56, 0x49, 0x44, 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x73, 0x70, 0x69, 0x66, 0x66, 0x65, 0x53, 0x76, 0x69, 0x64, + 0x49, 0x73, 0x73, 0x75, 0x65, 0x64, 0x12, 0x5c, 0x0a, 0x15, 0x6f, 0x6b, 0x74, 0x61, 0x5f, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x18, + 0x50, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x12, 0x6f, 0x6b, 0x74, 0x61, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x79, 0x6e, 0x63, 0x12, 0x5e, 0x0a, 0x15, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x51, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x13, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x12, 0x7f, 0x0a, 0x21, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x52, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x32, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, 0x73, 0x65, 0x72, 0x50, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x23, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x53, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x75, 0x69, 0x44, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x77, 0x0a, 0x21, + 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x6b, 0x75, 0x62, 0x65, + 0x5f, 0x65, 0x6b, 0x73, 0x5f, 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, + 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x4b, 0x75, 0x62, 0x65, 0x45, 0x4b, 0x53, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x4b, 0x75, 0x62, 0x65, 0x45, 0x6b, 0x73, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x7d, 0x0a, 0x23, 0x75, 0x69, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x70, 0x70, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x55, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x75, 0x69, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x65, 0x0a, 0x18, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, + 0x72, 0x61, 0x70, 0x68, 0x5f, 0x67, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x5f, 0x73, 0x63, 0x61, 0x6e, + 0x18, 0x56, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x15, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x47, 0x69, 0x74, 0x6c, 0x61, 0x62, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x94, 0x01, 0x0a, 0x29, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x73, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x57, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x39, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, + 0x64, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x24, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x53, 0x63, 0x61, 0x6e, 0x53, 0x53, 0x48, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x24, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x53, 0x63, 0x61, - 0x6e, 0x53, 0x73, 0x68, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, - 0x5c, 0x0a, 0x15, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, - 0x61, 0x77, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x18, 0x59, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x41, 0x57, 0x53, 0x53, 0x63, - 0x61, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x41, 0x77, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x7b, 0x0a, - 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x64, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, + 0x53, 0x63, 0x61, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, + 0x79, 0x73, 0x12, 0x95, 0x01, 0x0a, 0x2a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, + 0x5f, 0x73, 0x73, 0x68, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x58, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x53, + 0x53, 0x48, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x24, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x53, 0x73, 0x68, 0x50, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x61, 0x77, 0x73, 0x5f, 0x73, + 0x63, 0x61, 0x6e, 0x18, 0x59, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x41, 0x57, 0x53, 0x53, 0x63, 0x61, 0x6e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x41, 0x77, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x12, 0x7b, 0x0a, 0x20, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x5a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x74, 0x68, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, - 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x78, 0x0a, 0x1f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x63, 0x72, 0x6f, 0x77, 0x6e, - 0x5f, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x5b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x25, 0x75, 0x69, 0x5f, 0x61, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x5f, 0x6a, - 0x65, 0x77, 0x65, 0x6c, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x5c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x49, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x44, 0x69, 0x66, - 0x66, 0x56, 0x69, 0x65, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x75, 0x69, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x78, 0x0a, 0x1f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x5f, 0x6a, 0x65, 0x77, 0x65, + 0x6c, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x43, 0x72, 0x6f, 0x77, 0x6e, - 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x44, 0x69, 0x66, 0x66, 0x56, 0x69, 0x65, 0x77, 0x12, 0x67, 0x0a, - 0x18, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, - 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x4c, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, - 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, - 0x08, 0x10, 0x09, 0x52, 0x1c, 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, - 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x63, - 0x6b, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x3a, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x16, 0x0a, 0x14, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x48, - 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x87, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x50, - 0x50, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, - 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x42, 0x5f, 0x53, 0x45, - 0x52, 0x56, 0x45, 0x52, 0x10, 0x04, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, - 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, - 0x4f, 0x50, 0x45, 0x4e, 0x53, 0x53, 0x48, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, - 0x4f, 0x50, 0x45, 0x4e, 0x53, 0x53, 0x48, 0x5f, 0x45, 0x49, 0x43, 0x45, 0x10, 0x07, 0x2a, 0x4d, - 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, - 0x45, 0x52, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x48, 0x55, 0x4d, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x53, - 0x45, 0x52, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x42, 0x4f, 0x54, 0x10, 0x02, 0x2a, 0xc0, 0x0f, - 0x0a, 0x10, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, - 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, - 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, - 0x52, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, 0x45, - 0x54, 0x45, 0x53, 0x10, 0x02, 0x12, 0x33, 0x0a, 0x2f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, + 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x1b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x43, + 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, + 0x86, 0x01, 0x0a, 0x25, 0x75, 0x69, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, + 0x61, 0x70, 0x68, 0x5f, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x5f, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x5f, + 0x64, 0x69, 0x66, 0x66, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x2e, 0x55, 0x49, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x43, 0x72, + 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x44, 0x69, 0x66, 0x66, 0x56, 0x69, 0x65, 0x77, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x75, 0x69, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, + 0x44, 0x69, 0x66, 0x66, 0x56, 0x69, 0x65, 0x77, 0x12, 0x67, 0x0a, 0x18, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x12, 0x4c, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x0d, 0x75, 0x73, 0x65, 0x72, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x42, + 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x52, 0x1c, + 0x75, 0x69, 0x5f, 0x6f, 0x6e, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x65, 0x74, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x15, 0x0a, 0x13, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x51, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x16, 0x0a, 0x14, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, + 0x0a, 0x14, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, + 0x87, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, + 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x16, 0x0a, 0x12, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x53, 0x45, 0x52, + 0x56, 0x45, 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, + 0x45, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, + 0x45, 0x52, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x42, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, + 0x04, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x49, + 0x4e, 0x44, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, + 0x4f, 0x50, 0x10, 0x05, 0x12, 0x1e, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x53, + 0x53, 0x48, 0x10, 0x06, 0x12, 0x23, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x53, + 0x53, 0x48, 0x5f, 0x45, 0x49, 0x43, 0x45, 0x10, 0x07, 0x2a, 0x4d, 0x0a, 0x08, 0x55, 0x73, 0x65, + 0x72, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x15, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4b, 0x49, + 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x48, 0x55, + 0x4d, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x4b, 0x49, + 0x4e, 0x44, 0x5f, 0x42, 0x4f, 0x54, 0x10, 0x02, 0x2a, 0xc0, 0x0f, 0x0a, 0x10, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x21, 0x0a, + 0x1d, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x1c, 0x0a, 0x18, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x01, 0x12, 0x20, + 0x0a, 0x1c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x45, 0x53, 0x10, 0x02, + 0x12, 0x33, 0x0a, 0x2f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, + 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, + 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, - 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x53, 0x45, 0x4c, - 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, + 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, + 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x32, 0x0a, 0x2e, 0x44, 0x49, 0x53, 0x43, 0x4f, + 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, + 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x53, 0x45, + 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x05, 0x12, 0x2b, 0x0a, 0x27, 0x44, + 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, + 0x45, 0x53, 0x5f, 0x52, 0x44, 0x53, 0x10, 0x06, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, + 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x52, 0x44, 0x53, + 0x10, 0x07, 0x12, 0x26, 0x0a, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, 0x08, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, - 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x04, 0x12, 0x32, 0x0a, 0x2e, - 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, - 0x44, 0x42, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x05, + 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x43, 0x50, 0x10, + 0x09, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x44, + 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x0a, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x49, 0x53, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, + 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, + 0x5f, 0x52, 0x44, 0x53, 0x10, 0x0b, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, + 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, + 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x52, 0x45, + 0x44, 0x53, 0x48, 0x49, 0x46, 0x54, 0x10, 0x0c, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x49, 0x53, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, + 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, + 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x30, + 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x44, + 0x49, 0x53, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x0e, 0x12, 0x2b, 0x0a, 0x27, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, - 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x52, 0x44, 0x53, 0x10, 0x06, 0x12, 0x28, 0x0a, + 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x0f, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, - 0x4c, 0x5f, 0x52, 0x44, 0x53, 0x10, 0x07, 0x12, 0x26, 0x0a, 0x22, 0x44, 0x49, 0x53, 0x43, 0x4f, - 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, - 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x48, 0x54, 0x54, 0x50, 0x10, 0x08, 0x12, - 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x43, 0x50, 0x10, 0x09, 0x12, 0x25, 0x0a, 0x21, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, - 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, - 0x4f, 0x57, 0x53, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x10, 0x0a, 0x12, 0x2c, 0x0a, - 0x28, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, - 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x44, 0x53, 0x10, 0x0b, 0x12, 0x30, 0x0a, 0x2c, 0x44, - 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, - 0x45, 0x53, 0x5f, 0x52, 0x45, 0x44, 0x53, 0x48, 0x49, 0x46, 0x54, 0x10, 0x0c, 0x12, 0x34, 0x0a, - 0x30, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, - 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, - 0x44, 0x10, 0x0d, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, - 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, - 0x54, 0x45, 0x44, 0x10, 0x0e, 0x12, 0x2b, 0x0a, 0x27, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, + 0x4c, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x10, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x49, 0x53, 0x43, 0x4f, + 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, + 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, + 0x47, 0x43, 0x50, 0x10, 0x11, 0x12, 0x3b, 0x0a, 0x37, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, - 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x47, 0x43, 0x50, - 0x10, 0x0f, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, + 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x44, + 0x53, 0x48, 0x49, 0x46, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x4c, 0x45, 0x53, 0x53, + 0x10, 0x12, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, - 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x10, 0x12, 0x2c, 0x0a, 0x28, - 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, - 0x52, 0x56, 0x45, 0x52, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x11, 0x12, 0x3b, 0x0a, 0x37, 0x44, 0x49, + 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, + 0x13, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, + 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x4f, 0x44, 0x42, 0x10, 0x14, 0x12, 0x32, 0x0a, 0x2e, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, - 0x53, 0x5f, 0x52, 0x45, 0x44, 0x53, 0x48, 0x49, 0x46, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, - 0x52, 0x4c, 0x45, 0x53, 0x53, 0x10, 0x12, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, + 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x41, 0x53, 0x53, 0x41, 0x4e, 0x44, + 0x52, 0x41, 0x5f, 0x4b, 0x45, 0x59, 0x53, 0x50, 0x41, 0x43, 0x45, 0x53, 0x10, 0x15, 0x12, 0x34, + 0x0a, 0x30, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x41, 0x53, + 0x53, 0x41, 0x4e, 0x44, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, + 0x45, 0x44, 0x10, 0x16, 0x12, 0x38, 0x0a, 0x34, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, + 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, + 0x53, 0x45, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, + 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x17, 0x12, 0x30, + 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x44, + 0x49, 0x53, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, 0x10, 0x18, + 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x52, + 0x45, 0x44, 0x49, 0x53, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, 0x44, 0x42, 0x10, 0x19, 0x12, + 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x45, + 0x44, 0x49, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x10, + 0x1a, 0x12, 0x38, 0x0a, 0x34, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, + 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x53, 0x45, + 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x1b, 0x12, 0x2a, 0x0a, 0x26, 0x44, + 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, + 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x1c, 0x12, 0x2e, 0x0a, 0x2a, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, - 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x41, - 0x5a, 0x55, 0x52, 0x45, 0x10, 0x13, 0x12, 0x27, 0x0a, 0x23, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, - 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, - 0x42, 0x41, 0x53, 0x45, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x4f, 0x44, 0x42, 0x10, 0x14, 0x12, - 0x32, 0x0a, 0x2e, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, - 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x41, - 0x53, 0x53, 0x41, 0x4e, 0x44, 0x52, 0x41, 0x5f, 0x4b, 0x45, 0x59, 0x53, 0x50, 0x41, 0x43, 0x45, - 0x53, 0x10, 0x15, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, + 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, + 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x1d, 0x12, 0x32, 0x0a, 0x2e, 0x44, 0x49, 0x53, 0x43, 0x4f, + 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, + 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x5f, + 0x4d, 0x49, 0x43, 0x52, 0x4f, 0x53, 0x4f, 0x46, 0x54, 0x10, 0x1e, 0x12, 0x36, 0x0a, 0x32, 0x44, + 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, 0x4f, 0x43, 0x4b, 0x52, 0x4f, + 0x41, 0x43, 0x48, 0x44, 0x42, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, + 0x44, 0x10, 0x1f, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, - 0x45, 0x5f, 0x43, 0x41, 0x53, 0x53, 0x41, 0x4e, 0x44, 0x52, 0x41, 0x5f, 0x53, 0x45, 0x4c, 0x46, - 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x16, 0x12, 0x38, 0x0a, 0x34, 0x44, 0x49, 0x53, + 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x41, 0x54, 0x4c, 0x41, 0x53, 0x10, + 0x20, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, + 0x53, 0x4e, 0x4f, 0x57, 0x46, 0x4c, 0x41, 0x4b, 0x45, 0x10, 0x21, 0x12, 0x2c, 0x0a, 0x28, 0x44, + 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x44, + 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x10, 0x22, 0x12, 0x34, 0x0a, 0x30, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, - 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x53, - 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, - 0x44, 0x10, 0x17, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, - 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x41, - 0x43, 0x48, 0x45, 0x10, 0x18, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, - 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, - 0x41, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, - 0x44, 0x42, 0x10, 0x19, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, - 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, - 0x53, 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x43, - 0x41, 0x43, 0x48, 0x45, 0x10, 0x1a, 0x12, 0x38, 0x0a, 0x34, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, - 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, - 0x42, 0x41, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x5f, 0x43, 0x4c, 0x55, 0x53, 0x54, - 0x45, 0x52, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x1b, - 0x12, 0x2a, 0x0a, 0x26, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, - 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x1c, 0x12, 0x2e, 0x0a, 0x2a, - 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, - 0x52, 0x56, 0x45, 0x52, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x1d, 0x12, 0x32, 0x0a, 0x2e, + 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x48, 0x49, 0x47, 0x48, + 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x10, 0x23, 0x12, + 0x37, 0x0a, 0x33, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, + 0x45, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x5f, 0x52, 0x45, 0x47, 0x49, 0x53, 0x54, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x24, 0x12, 0x26, 0x0a, 0x22, 0x44, 0x49, 0x53, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x53, 0x41, + 0x4d, 0x4c, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x25, + 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x43, 0x32, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, + 0x43, 0x45, 0x10, 0x26, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, + 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x57, 0x49, + 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, 0x4f, 0x50, 0x5f, 0x4e, 0x4f, + 0x4e, 0x5f, 0x41, 0x44, 0x10, 0x27, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, + 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x4b, 0x55, 0x42, 0x45, + 0x52, 0x4e, 0x45, 0x54, 0x45, 0x53, 0x5f, 0x45, 0x4b, 0x53, 0x10, 0x28, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x51, 0x4c, 0x53, 0x45, - 0x52, 0x56, 0x45, 0x52, 0x5f, 0x4d, 0x49, 0x43, 0x52, 0x4f, 0x53, 0x4f, 0x46, 0x54, 0x10, 0x1e, - 0x12, 0x36, 0x0a, 0x32, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x43, - 0x4f, 0x43, 0x4b, 0x52, 0x4f, 0x41, 0x43, 0x48, 0x44, 0x42, 0x5f, 0x53, 0x45, 0x4c, 0x46, 0x5f, - 0x48, 0x4f, 0x53, 0x54, 0x45, 0x44, 0x10, 0x1f, 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x49, 0x53, 0x43, - 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, - 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x41, - 0x54, 0x4c, 0x41, 0x53, 0x10, 0x20, 0x12, 0x28, 0x0a, 0x24, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, - 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, - 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x4e, 0x4f, 0x57, 0x46, 0x4c, 0x41, 0x4b, 0x45, 0x10, 0x21, - 0x12, 0x2c, 0x0a, 0x28, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, - 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, - 0x53, 0x45, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x10, 0x22, 0x12, 0x34, - 0x0a, 0x30, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, - 0x5f, 0x48, 0x49, 0x47, 0x48, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, - 0x54, 0x59, 0x10, 0x23, 0x12, 0x37, 0x0a, 0x33, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, - 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x44, 0x41, - 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x5f, 0x52, - 0x45, 0x47, 0x49, 0x53, 0x54, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x24, 0x12, 0x26, 0x0a, - 0x22, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, - 0x43, 0x45, 0x5f, 0x53, 0x41, 0x4d, 0x4c, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x25, 0x12, 0x22, 0x0a, 0x1e, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, - 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x43, 0x32, 0x5f, 0x49, - 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x26, 0x12, 0x30, 0x0a, 0x2c, 0x44, 0x49, 0x53, - 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x44, - 0x4f, 0x43, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x44, 0x45, 0x53, 0x4b, 0x54, - 0x4f, 0x50, 0x5f, 0x4e, 0x4f, 0x4e, 0x5f, 0x41, 0x44, 0x10, 0x27, 0x12, 0x24, 0x0a, 0x20, 0x44, - 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x45, 0x53, 0x5f, 0x45, 0x4b, 0x53, 0x10, - 0x28, 0x12, 0x2d, 0x0a, 0x29, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x45, 0x10, 0x29, - 0x2a, 0xa3, 0x01, 0x0a, 0x0e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, - 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x12, 0x19, - 0x0a, 0x15, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, - 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x42, 0x4f, - 0x52, 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0xd4, 0x02, 0x0a, 0x03, 0x43, 0x54, 0x41, 0x12, 0x13, - 0x0a, 0x0f, 0x43, 0x54, 0x41, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, - 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x43, - 0x54, 0x41, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, - 0x4e, 0x53, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x53, 0x10, 0x03, 0x12, 0x17, 0x0a, - 0x13, 0x43, 0x54, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x4d, 0x49, 0x55, 0x4d, 0x5f, 0x53, 0x55, 0x50, - 0x50, 0x4f, 0x52, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x54, 0x52, - 0x55, 0x53, 0x54, 0x45, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x05, 0x12, - 0x16, 0x0a, 0x12, 0x43, 0x54, 0x41, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x42, - 0x41, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x42, - 0x49, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x07, - 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x4c, - 0x49, 0x53, 0x54, 0x10, 0x08, 0x12, 0x19, 0x0a, 0x15, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, - 0x45, 0x53, 0x53, 0x5f, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, - 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x54, 0x41, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, - 0x5f, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x0a, - 0x12, 0x16, 0x0a, 0x12, 0x43, 0x54, 0x41, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x5f, 0x55, 0x53, 0x45, - 0x52, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x54, 0x41, 0x5f, - 0x45, 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x54, - 0x41, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x5f, 0x53, 0x43, 0x49, 0x4d, 0x10, 0x0d, 0x2a, 0xe3, 0x08, - 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, - 0x6f, 0x6c, 0x6c, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x4e, 0x54, 0x45, 0x47, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x43, - 0x4b, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, - 0x57, 0x53, 0x5f, 0x4f, 0x49, 0x44, 0x43, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x49, 0x4e, 0x54, + 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x57, + 0x53, 0x5f, 0x43, 0x4f, 0x4e, 0x53, 0x4f, 0x4c, 0x45, 0x10, 0x29, 0x2a, 0xa3, 0x01, 0x0a, 0x0e, + 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, + 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, + 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x12, 0x19, 0x0a, 0x15, 0x44, 0x49, 0x53, + 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, + 0x04, 0x2a, 0xd4, 0x02, 0x0a, 0x03, 0x43, 0x54, 0x41, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x54, 0x41, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x16, + 0x0a, 0x12, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x55, 0x54, 0x48, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x45, 0x5f, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x02, 0x12, + 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x52, 0x45, + 0x51, 0x55, 0x45, 0x53, 0x54, 0x53, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, + 0x50, 0x52, 0x45, 0x4d, 0x49, 0x55, 0x4d, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4f, 0x52, 0x54, 0x10, + 0x04, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x45, 0x44, + 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x54, + 0x41, 0x5f, 0x55, 0x50, 0x47, 0x52, 0x41, 0x44, 0x45, 0x5f, 0x42, 0x41, 0x4e, 0x4e, 0x45, 0x52, + 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x54, 0x41, 0x5f, 0x42, 0x49, 0x4c, 0x4c, 0x49, 0x4e, + 0x47, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x43, + 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x08, + 0x12, 0x19, 0x0a, 0x15, 0x43, 0x54, 0x41, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x4d, + 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x09, 0x12, 0x1e, 0x0a, 0x1a, 0x43, + 0x54, 0x41, 0x5f, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x41, 0x55, 0x44, 0x49, + 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x43, + 0x54, 0x41, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x59, 0x4e, + 0x43, 0x10, 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x54, 0x41, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x41, + 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x54, 0x41, 0x5f, 0x4f, 0x4b, 0x54, + 0x41, 0x5f, 0x53, 0x43, 0x49, 0x4d, 0x10, 0x0d, 0x2a, 0xe3, 0x08, 0x0a, 0x15, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4b, 0x69, + 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x49, + 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, + 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x24, + 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, + 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x4f, 0x49, + 0x44, 0x43, 0x10, 0x02, 0x12, 0x25, 0x0a, 0x21, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x50, 0x41, 0x47, 0x45, 0x52, 0x44, 0x55, 0x54, 0x59, 0x10, 0x03, 0x12, 0x21, 0x0a, 0x1d, 0x49, + 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, + 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, 0x4c, 0x10, 0x04, 0x12, 0x20, + 0x0a, 0x1c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, + 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x49, 0x52, 0x41, 0x10, 0x05, + 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x49, 0x53, 0x43, + 0x4f, 0x52, 0x44, 0x10, 0x06, 0x12, 0x26, 0x0a, 0x22, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, + 0x5f, 0x4d, 0x41, 0x54, 0x54, 0x45, 0x52, 0x4d, 0x4f, 0x53, 0x54, 0x10, 0x07, 0x12, 0x24, 0x0a, + 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, + 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x53, 0x5f, 0x54, 0x45, 0x41, 0x4d, + 0x53, 0x10, 0x08, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4f, + 0x50, 0x53, 0x47, 0x45, 0x4e, 0x49, 0x45, 0x10, 0x09, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x50, 0x41, 0x47, 0x45, 0x52, 0x44, 0x55, 0x54, 0x59, 0x10, 0x03, - 0x12, 0x21, 0x0a, 0x1d, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x4d, 0x41, 0x49, - 0x4c, 0x10, 0x04, 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, - 0x49, 0x52, 0x41, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, + 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x10, 0x0a, 0x12, 0x20, 0x0a, 0x1c, 0x49, + 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, + 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x41, 0x4d, 0x46, 0x10, 0x0b, 0x12, 0x26, 0x0a, + 0x22, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, + 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, + 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x12, 0x35, 0x0a, 0x31, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, - 0x5f, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x52, 0x44, 0x10, 0x06, 0x12, 0x26, 0x0a, 0x22, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x54, 0x54, 0x45, 0x52, 0x4d, 0x4f, 0x53, 0x54, - 0x10, 0x07, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x53, - 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x08, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, + 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x47, 0x49, 0x54, 0x48, + 0x55, 0x42, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x0d, 0x12, 0x2f, 0x0a, 0x2b, + 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, + 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, + 0x49, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x43, 0x49, 0x10, 0x0e, 0x12, 0x2d, 0x0a, + 0x29, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, + 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, + 0x5f, 0x49, 0x44, 0x5f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x10, 0x0f, 0x12, 0x2e, 0x0a, 0x2a, + 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, + 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, + 0x49, 0x44, 0x5f, 0x4a, 0x45, 0x4e, 0x4b, 0x49, 0x4e, 0x53, 0x10, 0x10, 0x12, 0x2e, 0x0a, 0x2a, + 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, + 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, + 0x49, 0x44, 0x5f, 0x41, 0x4e, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, 0x2a, 0x0a, 0x26, + 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, + 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, + 0x49, 0x44, 0x5f, 0x41, 0x57, 0x53, 0x10, 0x12, 0x12, 0x2a, 0x0a, 0x26, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, - 0x49, 0x4e, 0x44, 0x5f, 0x4f, 0x50, 0x53, 0x47, 0x45, 0x4e, 0x49, 0x45, 0x10, 0x09, 0x12, 0x20, - 0x0a, 0x1c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, - 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x10, 0x0a, - 0x12, 0x20, 0x0a, 0x1c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4a, 0x41, 0x4d, 0x46, - 0x10, 0x0b, 0x12, 0x26, 0x0a, 0x22, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, - 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x12, 0x35, 0x0a, 0x31, 0x49, 0x4e, - 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, - 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, - 0x5f, 0x47, 0x49, 0x54, 0x48, 0x55, 0x42, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, - 0x0d, 0x12, 0x2f, 0x0a, 0x2b, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, - 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x43, 0x49, - 0x10, 0x0e, 0x12, 0x2d, 0x0a, 0x29, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x47, + 0x43, 0x50, 0x10, 0x13, 0x12, 0x2c, 0x0a, 0x28, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, + 0x10, 0x14, 0x12, 0x30, 0x0a, 0x2c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, - 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x47, 0x49, 0x54, 0x4c, 0x41, 0x42, 0x10, - 0x0f, 0x12, 0x2e, 0x0a, 0x2a, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, - 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x4a, 0x45, 0x4e, 0x4b, 0x49, 0x4e, 0x53, 0x10, - 0x10, 0x12, 0x2e, 0x0a, 0x2a, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, - 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x4e, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x10, - 0x11, 0x12, 0x2a, 0x0a, 0x26, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, - 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x41, 0x57, 0x53, 0x10, 0x12, 0x12, 0x2a, 0x0a, - 0x26, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, - 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, - 0x5f, 0x49, 0x44, 0x5f, 0x47, 0x43, 0x50, 0x10, 0x13, 0x12, 0x2c, 0x0a, 0x28, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, - 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x14, 0x12, 0x30, 0x0a, 0x2c, 0x49, 0x4e, 0x54, 0x45, 0x47, + 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x53, 0x50, 0x41, 0x43, 0x45, 0x4c, 0x49, + 0x46, 0x54, 0x10, 0x15, 0x12, 0x31, 0x0a, 0x2d, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, + 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x4b, 0x55, 0x42, 0x45, 0x52, + 0x4e, 0x45, 0x54, 0x45, 0x53, 0x10, 0x16, 0x12, 0x24, 0x0a, 0x20, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, - 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, 0x53, 0x50, - 0x41, 0x43, 0x45, 0x4c, 0x49, 0x46, 0x54, 0x10, 0x15, 0x12, 0x31, 0x0a, 0x2d, 0x49, 0x4e, 0x54, - 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, - 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x44, 0x5f, - 0x4b, 0x55, 0x42, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x45, 0x53, 0x10, 0x16, 0x12, 0x24, 0x0a, 0x20, - 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, - 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x49, 0x44, - 0x10, 0x17, 0x12, 0x37, 0x0a, 0x33, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x41, - 0x54, 0x41, 0x44, 0x4f, 0x47, 0x5f, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x5f, 0x4d, - 0x41, 0x4e, 0x41, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, 0x49, - 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, - 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x4e, 0x4f, - 0x57, 0x10, 0x19, 0x2a, 0x88, 0x01, 0x0a, 0x12, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x20, 0x45, 0x44, - 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x25, 0x0a, 0x21, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x47, 0x52, - 0x41, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x45, 0x44, 0x49, 0x54, 0x4f, - 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x3f, - 0x0a, 0x07, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x45, 0x41, - 0x54, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x52, - 0x55, 0x53, 0x54, 0x45, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x01, 0x2a, - 0xa0, 0x01, 0x0a, 0x1b, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, - 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x2d, 0x0a, 0x29, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, - 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, - 0x0a, 0x26, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, - 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x46, 0x45, + 0x4e, 0x44, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x49, 0x44, 0x10, 0x17, 0x12, 0x37, 0x0a, + 0x33, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, + 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x44, 0x4f, 0x47, + 0x5f, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x5f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, + 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, + 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x4e, 0x4f, 0x57, 0x10, 0x19, 0x2a, 0x88, + 0x01, 0x0a, 0x12, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x20, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, + 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x25, 0x0a, 0x21, 0x45, + 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x45, 0x44, + 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, + 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, + 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x3f, 0x0a, 0x07, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, + 0x17, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x45, 0x44, + 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x01, 0x2a, 0xa0, 0x01, 0x0a, 0x1b, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x29, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, - 0x10, 0x02, 0x2a, 0x82, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x19, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, - 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, - 0x4d, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, - 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x4a, 0x41, 0x4d, 0x46, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, - 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, 0x45, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, - 0x55, 0x53, 0x41, 0x47, 0x45, 0x10, 0x02, 0x32, 0xb4, 0x02, 0x0a, 0x18, 0x54, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0b, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, - 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, - 0x01, 0x12, 0x5b, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x46, 0x45, 0x41, + 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, + 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x2a, 0x82, 0x01, + 0x0a, 0x0c, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, + 0x0a, 0x19, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, + 0x24, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, + 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, + 0x5f, 0x4a, 0x41, 0x4d, 0x46, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x4c, 0x49, 0x43, 0x45, 0x4e, + 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, + 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x55, 0x53, 0x41, 0x47, 0x45, + 0x10, 0x02, 0x32, 0xb4, 0x02, 0x0a, 0x18, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x5b, 0x0a, 0x0b, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x22, + 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x5b, 0x0a, 0x0c, + 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x70, + 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, - 0x0a, 0x0d, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xc9, - 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x42, 0x0d, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 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, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2f, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3b, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0xa2, 0x02, 0x03, 0x50, 0x58, 0x58, 0xaa, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, - 0x6f, 0x67, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xca, 0x02, 0x0e, 0x50, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xe2, 0x02, 0x1a, 0x50, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x50, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0d, 0x48, 0x65, 0x6c, + 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x48, 0x65, 0x6c, 0x6c, + 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xc9, 0x01, 0x0a, 0x12, 0x63, 0x6f, + 0x6d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x42, 0x0d, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x4b, 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, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x3b, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xa2, 0x02, + 0x03, 0x50, 0x58, 0x58, 0xaa, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0xca, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x5c, 0x56, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xe2, 0x02, 0x1a, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x5c, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x3a, 0x3a, 0x56, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( 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..5720d844b12e6 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/cluster.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/cluster.pb.go @@ -465,6 +465,8 @@ type ACL struct { RecordedSessions *ResourceAccess `protobuf:"bytes,13,opt,name=recorded_sessions,json=recordedSessions,proto3" json:"recorded_sessions,omitempty"` // active_sessions defines access to active sessions. ActiveSessions *ResourceAccess `protobuf:"bytes,14,opt,name=active_sessions,json=activeSessions,proto3" json:"active_sessions,omitempty"` + // review_requests defines the ability to review requests + ReviewRequests bool `protobuf:"varint,15,opt,name=review_requests,json=reviewRequests,proto3" json:"review_requests,omitempty"` } func (x *ACL) Reset() { @@ -588,6 +590,13 @@ func (x *ACL) GetActiveSessions() *ResourceAccess { return nil } +func (x *ACL) GetReviewRequests() bool { + if x != nil { + return x.ReviewRequests + } + return false +} + // ResourceAccess describes access verbs type ResourceAccess struct { state protoimpl.MessageState @@ -814,7 +823,7 @@ var file_teleport_lib_teleterm_v1_cluster_proto_rawDesc = []byte{ 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x53, 0x4f, 0x10, 0x02, 0x22, - 0xc8, 0x07, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x12, 0x51, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, + 0xf1, 0x07, 0x0a, 0x03, 0x41, 0x43, 0x4c, 0x12, 0x51, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, @@ -873,38 +882,41 @@ var file_teleport_lib_teleterm_v1_cluster_proto_rawDesc = []byte{ 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, - 0x52, 0x08, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x0e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x69, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x72, 0x65, 0x61, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x64, 0x69, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x04, 0x65, 0x64, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x73, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x75, 0x73, 0x65, 0x22, 0x7b, 0x0a, 0x08, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x61, 0x64, 0x76, 0x61, 0x6e, - 0x63, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x64, 0x76, 0x61, - 0x6e, 0x63, 0x65, 0x64, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x69, 0x73, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, - 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x69, 0x73, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, - 0x64, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x2a, 0x73, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x77, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x48, 0x4f, - 0x57, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x48, 0x4f, - 0x57, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, - 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x48, 0x4f, - 0x57, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x53, 0x5f, 0x41, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x42, 0x54, 0x5a, - 0x52, 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, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x74, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, - 0x6d, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, + 0x76, 0x69, 0x65, 0x77, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x08, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x8e, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, + 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x72, 0x65, 0x61, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x65, 0x64, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x65, 0x64, + 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x03, 0x75, 0x73, 0x65, 0x22, 0x7b, 0x0a, 0x08, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x12, 0x3a, 0x0a, 0x19, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x17, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x33, 0x0a, 0x16, + 0x69, 0x73, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x64, 0x5f, 0x62, + 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x69, 0x73, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x64, 0x42, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x2a, 0x73, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x48, 0x4f, 0x57, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x53, 0x48, 0x4f, 0x57, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x53, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, + 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x48, 0x4f, 0x57, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x53, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x5f, + 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x42, 0x54, 0x5a, 0x52, 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, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2f, 0x76, + 0x31, 0x3b, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/gen/proto/ts/prehog/v1alpha/teleport_pb.ts b/gen/proto/ts/prehog/v1alpha/teleport_pb.ts index 34c6f64af3619..950d8df1fa358 100644 --- a/gen/proto/ts/prehog/v1alpha/teleport_pb.ts +++ b/gen/proto/ts/prehog/v1alpha/teleport_pb.ts @@ -2665,6 +2665,16 @@ export interface SubmitEventRequest { * @generated from protobuf field: google.protobuf.Timestamp timestamp = 2; */ timestamp?: Timestamp; + /** + * teleport_version is the version of the Teleport auth server that submitted + * the event, without the "v" prefix. + * For example: 16.4.7 + * + * PostHog property: tp.teleport_version + * + * @generated from protobuf field: string teleport_version = 95; + */ + teleportVersion: string; /** * @generated from protobuf oneof: event */ @@ -9941,6 +9951,7 @@ class SubmitEventRequest$Type extends MessageType { super("prehog.v1alpha.SubmitEventRequest", [ { no: 1, name: "cluster_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 2, name: "timestamp", kind: "message", T: () => Timestamp }, + { no: 95, name: "teleport_version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, { no: 3, name: "user_login", kind: "message", oneof: "event", T: () => UserLoginEvent }, { no: 4, name: "sso_create", kind: "message", oneof: "event", T: () => SSOCreateEvent }, { no: 5, name: "resource_create", kind: "message", oneof: "event", T: () => ResourceCreateEvent }, @@ -10037,6 +10048,7 @@ class SubmitEventRequest$Type extends MessageType { create(value?: PartialMessage): SubmitEventRequest { const message = globalThis.Object.create((this.messagePrototype!)); message.clusterName = ""; + message.teleportVersion = ""; message.event = { oneofKind: undefined }; if (value !== undefined) reflectionMergePartial(this, message, value); @@ -10053,6 +10065,9 @@ class SubmitEventRequest$Type extends MessageType { case /* google.protobuf.Timestamp timestamp */ 2: message.timestamp = Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.timestamp); break; + case /* string teleport_version */ 95: + message.teleportVersion = reader.string(); + break; case /* prehog.v1alpha.UserLoginEvent user_login */ 3: message.event = { oneofKind: "userLogin", @@ -10617,6 +10632,9 @@ class SubmitEventRequest$Type extends MessageType { /* google.protobuf.Timestamp timestamp = 2; */ if (message.timestamp) Timestamp.internalBinaryWrite(message.timestamp, writer.tag(2, WireType.LengthDelimited).fork(), options).join(); + /* string teleport_version = 95; */ + if (message.teleportVersion !== "") + writer.tag(95, WireType.LengthDelimited).string(message.teleportVersion); /* prehog.v1alpha.UserLoginEvent user_login = 3; */ if (message.event.oneofKind === "userLogin") UserLoginEvent.internalBinaryWrite(message.event.userLogin, writer.tag(3, WireType.LengthDelimited).fork(), options).join(); diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/cluster_pb.ts b/gen/proto/ts/teleport/lib/teleterm/v1/cluster_pb.ts index 297e11f43715d..35c3ae9dcae0b 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/cluster_pb.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/cluster_pb.ts @@ -300,6 +300,12 @@ export interface ACL { * @generated from protobuf field: teleport.lib.teleterm.v1.ResourceAccess active_sessions = 14; */ activeSessions?: ResourceAccess; + /** + * review_requests defines the ability to review requests + * + * @generated from protobuf field: bool review_requests = 15; + */ + reviewRequests: boolean; } /** * ResourceAccess describes access verbs @@ -649,11 +655,13 @@ class ACL$Type extends MessageType { { no: 11, name: "kubeservers", kind: "message", T: () => ResourceAccess }, { no: 12, name: "access_requests", kind: "message", T: () => ResourceAccess }, { no: 13, name: "recorded_sessions", kind: "message", T: () => ResourceAccess }, - { no: 14, name: "active_sessions", kind: "message", T: () => ResourceAccess } + { no: 14, name: "active_sessions", kind: "message", T: () => ResourceAccess }, + { no: 15, name: "review_requests", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } ]); } create(value?: PartialMessage): ACL { const message = globalThis.Object.create((this.messagePrototype!)); + message.reviewRequests = false; if (value !== undefined) reflectionMergePartial(this, message, value); return message; @@ -702,6 +710,9 @@ class ACL$Type extends MessageType { case /* teleport.lib.teleterm.v1.ResourceAccess active_sessions */ 14: message.activeSessions = ResourceAccess.internalBinaryRead(reader, reader.uint32(), options, message.activeSessions); break; + case /* bool review_requests */ 15: + message.reviewRequests = reader.bool(); + break; default: let u = options.readUnknownField; if (u === "throw") @@ -753,6 +764,9 @@ class ACL$Type extends MessageType { /* teleport.lib.teleterm.v1.ResourceAccess active_sessions = 14; */ if (message.activeSessions) ResourceAccess.internalBinaryWrite(message.activeSessions, writer.tag(14, WireType.LengthDelimited).fork(), options).join(); + /* bool review_requests = 15; */ + if (message.reviewRequests !== false) + writer.tag(15, WireType.Varint).bool(message.reviewRequests); let u = options.writeUnknownFields; if (u !== false) (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); diff --git a/go.mod b/go.mod index 5f0894586d4d4..3b6ae97b36357 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport -go 1.23.3 +go 1.23.4 require ( cloud.google.com/go/cloudsqlconn v1.12.1 @@ -78,6 +78,7 @@ require ( github.com/buildkite/bintest/v3 v3.3.0 github.com/charmbracelet/bubbles v0.20.0 github.com/charmbracelet/bubbletea v1.1.0 + github.com/charmbracelet/huh v0.6.0 github.com/charmbracelet/lipgloss v0.13.0 github.com/coreos/go-oidc v2.2.1+incompatible // replaced github.com/coreos/go-oidc/v3 v3.11.0 @@ -266,6 +267,7 @@ require ( 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/atotto/clipboard v0.1.4 // 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 @@ -285,11 +287,13 @@ require ( github.com/blang/semver v3.5.1+incompatible // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/boombuler/barcode v1.0.1 // indirect + github.com/catppuccin/go v0.2.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect 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.2.3 // indirect + github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 // indirect github.com/charmbracelet/x/term v0.2.0 // indirect github.com/cloudflare/cfssl v1.6.4 // indirect github.com/cncf/xds/go v0.0.0-20240822171458-6449f94b4d59 // indirect @@ -432,6 +436,7 @@ require ( github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect + github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/moby/locker v1.0.1 // indirect github.com/moby/spdystream v0.4.0 // indirect @@ -442,7 +447,7 @@ require ( github.com/mtibben/percent v0.2.1 // indirect github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect - github.com/muesli/termenv v0.15.2 // indirect + github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect diff --git a/go.sum b/go.sum index 0d37d8ebebb48..3c570a4e09445 100644 --- a/go.sum +++ b/go.sum @@ -829,6 +829,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aws/aws-sdk-go v1.44.256/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go v1.44.263/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= github.com/aws/aws-sdk-go v1.49.12/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= @@ -983,6 +985,8 @@ github.com/buildkite/interpolate v0.1.3/go.mod h1:UNVe6A+UfiBNKbhAySrBbZFZFxQ+DX github.com/buildkite/roko v1.2.0 h1:hbNURz//dQqNl6Eo9awjQOVOZwSDJ8VEbBDxSfT9rGQ= github.com/buildkite/roko v1.2.0/go.mod h1:23R9e6nHxgedznkwwfmqZ6+0VJZJZ2Sg/uVcp2cP46I= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/catppuccin/go v0.2.0 h1:ktBeIrIP42b/8FGiScP9sgrWOss3lw0Z5SktRoithGA= +github.com/catppuccin/go v0.2.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= @@ -1003,10 +1007,14 @@ github.com/charmbracelet/bubbles v0.20.0 h1:jSZu6qD8cRQ6k9OMfR1WlM+ruM8fkPWkHvQW github.com/charmbracelet/bubbles v0.20.0/go.mod h1:39slydyswPy+uVOHZ5x/GjwVAFkCsV8IIVy+4MhzwwU= github.com/charmbracelet/bubbletea v1.1.0 h1:FjAl9eAL3HBCHenhz/ZPjkKdScmaS5SK69JAK2YJK9c= github.com/charmbracelet/bubbletea v1.1.0/go.mod h1:9Ogk0HrdbHolIKHdjfFpyXJmiCzGwy+FesYkZr7hYU4= +github.com/charmbracelet/huh v0.6.0 h1:mZM8VvZGuE0hoDXq6XLxRtgfWyTI3b2jZNKh0xWmax8= +github.com/charmbracelet/huh v0.6.0/go.mod h1:GGNKeWCeNzKpEOh/OJD8WBwTQjV3prFAtQPpLv+AVwU= github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw= github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY= github.com/charmbracelet/x/ansi v0.2.3 h1:VfFN0NUpcjBRd4DnKfRaIRo53KRgey/nhOoEqosGDEY= github.com/charmbracelet/x/ansi v0.2.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 h1:qko3AQ4gK1MTS/de7F5hPGx6/k1u0w4TeYmBFwzYVP4= +github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ= 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/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM= @@ -1822,6 +1830,8 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -1858,8 +1868,8 @@ github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= -github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= -github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= +github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= diff --git a/integration/helpers/helpers.go b/integration/helpers/helpers.go index 7d1b7e58b819f..fdede24b0209a 100644 --- a/integration/helpers/helpers.go +++ b/integration/helpers/helpers.go @@ -132,10 +132,7 @@ func ExternalSSHCommand(o CommandOptions) (*exec.Cmd, error) { } // Create an exec.Command and tell it where to find the SSH agent. - cmd, err := exec.Command(sshpath, execArgs...), nil - if err != nil { - return nil, trace.Wrap(err) - } + cmd := exec.Command(sshpath, execArgs...) cmd.Env = []string{fmt.Sprintf("SSH_AUTH_SOCK=%v", o.SocketPath)} return cmd, nil diff --git a/integration/helpers/instance.go b/integration/helpers/instance.go index 275837306b9d3..cdff68ef04e2a 100644 --- a/integration/helpers/instance.go +++ b/integration/helpers/instance.go @@ -45,8 +45,10 @@ import ( "github.com/gravitational/teleport/api/breaker" clientproto "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/api/utils/retryutils" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/keygen" "github.com/gravitational/teleport/lib/auth/state" @@ -1765,3 +1767,51 @@ func (i *TeleInstance) StopAll() error { i.Log.Infof("Stopped all teleport services for site %q", i.Secrets.SiteName) return trace.NewAggregate(errors...) } + +// WaitForNodeCount waits for a certain number of nodes in the provided cluster +// to be visible to the Proxy. This should be called prior to any client dialing +// of nodes to be sure that the node is registered and routable. +func (i *TeleInstance) WaitForNodeCount(ctx context.Context, cluster string, count int) error { + const ( + deadline = time.Second * 30 + iterWaitTime = time.Second + ) + + err := retryutils.RetryStaticFor(deadline, iterWaitTime, func() error { + site, err := i.Tunnel.GetSite(cluster) + if err != nil { + return trace.Wrap(err) + } + + // Validate that the site cache contains the expected count. + accessPoint, err := site.CachingAccessPoint() + if err != nil { + return trace.Wrap(err) + } + + nodes, err := accessPoint.GetNodes(ctx, apidefaults.Namespace) + if err != nil { + return trace.Wrap(err) + } + if len(nodes) != count { + return trace.BadParameter("cache contained %v nodes, but wanted to find %v nodes", len(nodes), count) + } + + // Validate that the site watcher contains the expected count. + watcher, err := site.NodeWatcher() + if err != nil { + return trace.Wrap(err) + } + + if watcher.ResourceCount() != count { + return trace.BadParameter("node watcher contained %v nodes, but wanted to find %v nodes", watcher.ResourceCount(), count) + } + + return nil + }) + if err != nil { + return trace.Wrap(err) + } + + return nil +} diff --git a/integration/helpers/trustedclusters.go b/integration/helpers/trustedclusters.go index a883fb8635a9e..1b3f43b61507c 100644 --- a/integration/helpers/trustedclusters.go +++ b/integration/helpers/trustedclusters.go @@ -30,9 +30,7 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/api/utils/retryutils" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/reversetunnelclient" ) @@ -112,37 +110,6 @@ func WaitForClusters(tun reversetunnelclient.Server, expected int) func() bool { } } -// WaitForNodeCount waits for a certain number of nodes to show up in the remote site. -func WaitForNodeCount(ctx context.Context, t *TeleInstance, clusterName string, count int) error { - const ( - deadline = time.Second * 30 - iterWaitTime = time.Second - ) - - err := retryutils.RetryStaticFor(deadline, iterWaitTime, func() error { - remoteSite, err := t.Tunnel.GetSite(clusterName) - if err != nil { - return trace.Wrap(err) - } - accessPoint, err := remoteSite.CachingAccessPoint() - if err != nil { - return trace.Wrap(err) - } - nodes, err := accessPoint.GetNodes(ctx, defaults.Namespace) - if err != nil { - return trace.Wrap(err) - } - if len(nodes) == count { - return nil - } - return trace.BadParameter("found %v nodes, but wanted to find %v nodes", len(nodes), count) - }) - if err != nil { - return trace.Wrap(err) - } - return nil -} - // WaitForActiveTunnelConnections waits for remote cluster to report a minimum number of active connections func WaitForActiveTunnelConnections(t *testing.T, tunnel reversetunnelclient.Server, clusterName string, expectedCount int) { require.EventuallyWithT(t, func(t *assert.CollectT) { diff --git a/integration/integration_test.go b/integration/integration_test.go index f49dfb06f5e0c..e1f3e9e07796b 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -442,27 +442,9 @@ func testAuditOn(t *testing.T, suite *integrationTestSuite) { ctx := context.Background() - // wait 10 seconds for both nodes to show up, otherwise + // wait for both nodes to show up, otherwise // we'll have trouble connecting to the node below. - waitForNodes := func(site authclient.ClientI, count int) error { - tickCh := time.Tick(500 * time.Millisecond) - stopCh := time.After(10 * time.Second) - for { - select { - case <-tickCh: - nodesInSite, err := site.GetNodes(ctx, defaults.Namespace) - if err != nil && !trace.IsNotFound(err) { - return trace.Wrap(err) - } - if got, want := len(nodesInSite), count; got == want { - return nil - } - case <-stopCh: - return trace.BadParameter("waited 10s, did find %v nodes", count) - } - } - } - err = waitForNodes(site, 2) + err = teleport.WaitForNodeCount(ctx, helpers.Site, 2) require.NoError(t, err) // should have no sessions: @@ -796,8 +778,6 @@ func testUUIDBasedProxy(t *testing.T, suite *integrationTestSuite) { teleportSvr := suite.newTeleport(t, nil, true) defer teleportSvr.StopAll() - site := teleportSvr.GetSiteAPI(helpers.Site) - // addNode adds a node to the teleport instance, returning its uuid. // All nodes added this way have the same hostname. addNode := func() (string, error) { @@ -819,36 +799,11 @@ func testUUIDBasedProxy(t *testing.T, suite *integrationTestSuite) { uuid1, err := addNode() require.NoError(t, err) - uuid2, err := addNode() + _, err = addNode() require.NoError(t, err) - // wait up to 10 seconds for supplied node names to show up. - waitForNodes := func(site authclient.ClientI, nodes ...string) error { - tickCh := time.Tick(500 * time.Millisecond) - stopCh := time.After(10 * time.Second) - Outer: - for _, nodeName := range nodes { - for { - select { - case <-tickCh: - nodesInSite, err := site.GetNodes(ctx, defaults.Namespace) - if err != nil && !trace.IsNotFound(err) { - return trace.Wrap(err) - } - for _, node := range nodesInSite { - if node.GetName() == nodeName { - continue Outer - } - } - case <-stopCh: - return trace.BadParameter("waited 10s, did find node %s", nodeName) - } - } - } - return nil - } - - err = waitForNodes(site, uuid1, uuid2) + // wait for supplied node names to show up. + err = teleportSvr.WaitForNodeCount(ctx, helpers.Site, 3) require.NoError(t, err) // attempting to run a command by hostname should generate NodeIsAmbiguous error. @@ -2150,7 +2105,8 @@ func runDisconnectTest(t *testing.T, suite *integrationTestSuite, tc disconnectT tc.concurrentConns = 1 } - waitForNodesToRegister(t, teleport, helpers.Site) + err = teleport.WaitForNodeCount(ctx, helpers.Site, 1) + require.NoError(t, err) asyncErrors := make(chan error, 1) @@ -2169,7 +2125,11 @@ func runDisconnectTest(t *testing.T, suite *integrationTestSuite, tc disconnectT tc.clientConfigOpts(&cc) } cl, err := teleport.NewClient(cc) - require.NoError(t, err) + if err != nil { + asyncErrors <- err + return + } + cl.Stdout = person cl.Stdin = person @@ -3139,6 +3099,10 @@ func trustedClusters(t *testing.T, suite *integrationTestSuite, test trustedClus cmd := []string{"echo", "hello world"} + // Wait for nodes to be visible before attempting connections + err = main.WaitForNodeCount(ctx, clusterAux, 2) + require.NoError(t, err) + // Try and connect to a node in the Aux cluster from the Main cluster using // direct dialing. creds, err := helpers.GenerateUserCreds(helpers.UserCredsRequest{ @@ -3224,6 +3188,10 @@ func trustedClusters(t *testing.T, suite *integrationTestSuite, test trustedClus require.Eventually(t, helpers.WaitForClusters(main.Tunnel, 1), 10*time.Second, 1*time.Second, "Two clusters do not see each other: tunnels are not working.") + // Wait for nodes to be visible before attempting connections + err = main.WaitForNodeCount(ctx, clusterAux, 2) + require.NoError(t, err) + // connection and client should recover and work again output = &bytes.Buffer{} tc.Stdout = output @@ -3630,7 +3598,7 @@ func testTrustedTunnelNode(t *testing.T, suite *integrationTestSuite) { "Two clusters do not see each other: tunnels are not working.") // Wait for both nodes to show up before attempting to dial to them. - err = helpers.WaitForNodeCount(ctx, main, clusterAux, 2) + err = main.WaitForNodeCount(ctx, clusterAux, 2) require.NoError(t, err) cmd := []string{"echo", "hello world"} @@ -4026,7 +3994,8 @@ func testDiscovery(t *testing.T, suite *integrationTestSuite) { helpers.WaitForActiveTunnelConnections(t, main.Tunnel, "cluster-remote", 1) helpers.WaitForActiveTunnelConnections(t, secondProxy, "cluster-remote", 1) - waitForNodesToRegister(t, main, "cluster-remote") + err = main.WaitForNodeCount(ctx, "cluster-remote", 1) + require.NoError(t, err) // execute the connection via first proxy cfg := helpers.ClientConfig{ @@ -4077,7 +4046,8 @@ func testDiscovery(t *testing.T, suite *integrationTestSuite) { helpers.WaitForActiveTunnelConnections(t, main.Tunnel, "cluster-remote", 1) helpers.WaitForActiveTunnelConnections(t, secondProxy, "cluster-remote", 1) - waitForNodesToRegister(t, main, "cluster-remote") + err = main.WaitForNodeCount(ctx, "cluster-remote", 1) + require.NoError(t, err) // Requests going via main proxy should succeed. output, err = runCommand(t, main, []string{"echo", "hello world"}, cfg, 1) @@ -4859,11 +4829,8 @@ func testProxyHostKeyCheck(t *testing.T, suite *integrationTestSuite) { require.NoError(t, err) // Wait for the node to be visible before continuing. - require.EventuallyWithT(t, func(t *assert.CollectT) { - found, err := clt.GetNodes(context.Background(), defaults.Namespace) - assert.NoError(t, err) - assert.Len(t, found, 2) - }, 10*time.Second, 100*time.Millisecond) + err = instance.WaitForNodeCount(context.Background(), helpers.Site, 2) + require.NoError(t, err) _, err = runCommand(t, instance, []string{"echo hello"}, clientConfig, 1) @@ -5956,27 +5923,9 @@ func testList(t *testing.T, suite *integrationTestSuite) { clt := teleport.GetSiteAPI(helpers.Site) require.NotNil(t, clt) - // Wait 10 seconds for both nodes to show up to make sure they both have + // Wait for both nodes to show up to make sure they both have // registered themselves. - waitForNodes := func(clt authclient.ClientI, count int) error { - tickCh := time.Tick(500 * time.Millisecond) - stopCh := time.After(10 * time.Second) - for { - select { - case <-tickCh: - nodesInCluster, err := clt.GetNodes(ctx, defaults.Namespace) - if err != nil && !trace.IsNotFound(err) { - return trace.Wrap(err) - } - if got, want := len(nodesInCluster), count; got == want { - return nil - } - case <-stopCh: - return trace.BadParameter("waited 10s, did find %v nodes", count) - } - } - } - err = waitForNodes(clt, 2) + err = teleport.WaitForNodeCount(ctx, helpers.Site, 2) require.NoError(t, err) tests := []struct { @@ -6158,22 +6107,6 @@ func testCmdLabels(t *testing.T, suite *integrationTestSuite) { } } -func waitForNodesToRegister(t *testing.T, teleport *helpers.TeleInstance, site string) { - t.Helper() - require.EventuallyWithT(t, func(t *assert.CollectT) { - // once the tunnel is established we need to wait until we have a - // connection to the remote auth - site := teleport.GetSiteAPI(site) - if !assert.NotNil(t, site) { - return - } - // we need to wait until we know about the node because direct dial to - // unregistered servers is no longer supported - _, err := site.GetNode(context.Background(), defaults.Namespace, teleport.Config.HostUUID) - assert.NoError(t, err) - }, time.Second*30, 250*time.Millisecond) -} - // TestDataTransfer makes sure that a "session.data" event is emitted at the // end of a session that matches the amount of data that was transferred. func testDataTransfer(t *testing.T, suite *integrationTestSuite) { @@ -6187,6 +6120,9 @@ func testDataTransfer(t *testing.T, suite *integrationTestSuite) { main := suite.newTeleport(t, nil, true) defer main.StopAll() + err := main.WaitForNodeCount(context.Background(), helpers.Site, 1) + require.NoError(t, err) + // Create a client to the above Teleport cluster. clientConfig := helpers.ClientConfig{ Login: suite.Me.Username, @@ -6195,8 +6131,6 @@ func testDataTransfer(t *testing.T, suite *integrationTestSuite) { Port: helpers.Port(t, main.SSH), } - waitForNodesToRegister(t, main, helpers.Site) - // Write 1 MB to stdout. command := []string{"dd", "if=/dev/zero", "bs=1024", "count=1024"} output, err := runCommand(t, main, command, clientConfig, 1) @@ -7155,6 +7089,7 @@ func (s *integrationTestSuite) defaultServiceConfig() *servicecfg.Config { cfg.Log = s.Log cfg.CircuitBreakerConfig = breaker.NoopBreakerConfig() cfg.InstanceMetadataClient = imds.NewDisabledIMDSClient() + cfg.DebugService.Enabled = false return cfg } @@ -7778,7 +7713,8 @@ func testModeratedSFTP(t *testing.T, suite *integrationTestSuite) { _, err = authServer.CreateUser(ctx, moderatorUser) require.NoError(t, err) - waitForNodesToRegister(t, instance, helpers.Site) + err = instance.WaitForNodeCount(context.Background(), helpers.Site, 1) + require.NoError(t, err) // Start a shell so a moderated session is created peerClient, err := instance.NewClient(helpers.ClientConfig{ @@ -8036,7 +7972,8 @@ func testSFTP(t *testing.T, suite *integrationTestSuite) { teleport.StopAll() }) - waitForNodesToRegister(t, teleport, helpers.Site) + err := teleport.WaitForNodeCount(context.Background(), helpers.Site, 1) + require.NoError(t, err) teleportClient, err := teleport.NewClient(helpers.ClientConfig{ Login: suite.Me.Username, diff --git a/integration/proxy/proxy_helpers.go b/integration/proxy/proxy_helpers.go index 422695a363d45..e0e3c7b587224 100644 --- a/integration/proxy/proxy_helpers.go +++ b/integration/proxy/proxy_helpers.go @@ -216,7 +216,7 @@ func (p *Suite) addNodeToLeafCluster(t *testing.T, tunnelNodeHostname string) { "Two clusters do not see each other: tunnels are not working.") // Wait for both nodes to show up before attempting to dial to them. - err = helpers.WaitForNodeCount(context.Background(), p.root, p.leaf.Secrets.SiteName, 2) + err = p.root.WaitForNodeCount(context.Background(), p.leaf.Secrets.SiteName, 2) require.NoError(t, err) } diff --git a/integration/proxy/proxy_test.go b/integration/proxy/proxy_test.go index 43d6254911a3b..0dcf986d70109 100644 --- a/integration/proxy/proxy_test.go +++ b/integration/proxy/proxy_test.go @@ -1614,7 +1614,7 @@ func TestALPNProxyHTTPProxyNoProxyDial(t *testing.T) { ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*30)) defer cancel() - err = helpers.WaitForNodeCount(ctx, rc, "root.example.com", 1) + err = rc.WaitForNodeCount(ctx, "root.example.com", 1) require.NoError(t, err) require.Zero(t, ph.Count()) @@ -1624,7 +1624,7 @@ func TestALPNProxyHTTPProxyNoProxyDial(t *testing.T) { require.NoError(t, os.Unsetenv("no_proxy")) _, err = rc.StartNode(makeNodeConfig("second-root-node", rcProxyAddr)) require.NoError(t, err) - err = helpers.WaitForNodeCount(ctx, rc, "root.example.com", 2) + err = rc.WaitForNodeCount(ctx, "root.example.com", 2) require.NoError(t, err) require.NotZero(t, ph.Count()) @@ -1723,7 +1723,7 @@ func TestALPNProxyHTTPProxyBasicAuthDial(t *testing.T) { startErrC <- err }() require.NoError(t, <-startErrC) - require.NoError(t, helpers.WaitForNodeCount(context.Background(), rc, rc.Secrets.SiteName, 1)) + require.NoError(t, rc.WaitForNodeCount(context.Background(), rc.Secrets.SiteName, 1)) require.Greater(t, ph.Count(), 0) } 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 4902d0345913c..de19613a07771 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/integrations/event-handler -go 1.23.3 +go 1.23.4 require ( github.com/alecthomas/kong v1.2.1 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 9187d437c4c30..6b1008be193ed 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 diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index 567743746ef94..77ccbefa53a1c 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -898,6 +898,38 @@ func GenSchemaAppV3(ctx context.Context) (github_com_hashicorp_terraform_plugin_ Description: "DynamicLabels are the app's command labels.", Optional: true, }, + "identity_center": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "account_id": { + Description: "Account ID is the AWS-assigned ID of the account", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + "permission_sets": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "arn": { + Description: "ARN is the fully-formed ARN of the Permission Set.", + 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, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + }), + Description: "PermissionSets lists the available permission sets on the given account", + Optional: true, + }, + }), + Description: "IdentityCenter encasulates AWS identity-center specific information. Only valid for Identity Center account apps.", + Optional: true, + }, "insecure_skip_verify": { Description: "InsecureSkipVerify disables app's TLS certificate verification.", Optional: true, @@ -10633,6 +10665,121 @@ func CopyAppV3FromTerraform(_ context.Context, tf github_com_hashicorp_terraform } } } + { + a, ok := tf.Attrs["identity_center"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.IdentityCenter"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.IdentityCenter", "github.com/hashicorp/terraform-plugin-framework/types.Object"}) + } else { + obj.IdentityCenter = nil + if !v.Null && !v.Unknown { + tf := v + obj.IdentityCenter = &github_com_gravitational_teleport_api_types.AppIdentityCenter{} + obj := obj.IdentityCenter + { + a, ok := tf.Attrs["account_id"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.IdentityCenter.AccountID"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.IdentityCenter.AccountID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.AccountID = t + } + } + } + { + a, ok := tf.Attrs["permission_sets"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.IdentityCenter.PermissionSets"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.IdentityCenter.PermissionSets", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.PermissionSets = make([]*github_com_gravitational_teleport_api_types.IdentityCenterPermissionSet, 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.IdentityCenter.PermissionSets", "github_com_hashicorp_terraform_plugin_framework_types.Object"}) + } else { + var t *github_com_gravitational_teleport_api_types.IdentityCenterPermissionSet + if !v.Null && !v.Unknown { + tf := v + t = &github_com_gravitational_teleport_api_types.IdentityCenterPermissionSet{} + obj := t + { + a, ok := tf.Attrs["arn"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.IdentityCenter.PermissionSets.ARN"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.IdentityCenter.PermissionSets.ARN", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.ARN = t + } + } + } + { + a, ok := tf.Attrs["name"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.IdentityCenter.PermissionSets.Name"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.IdentityCenter.PermissionSets.Name", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Name = t + } + } + } + { + 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 + } + } + } + } + } + } + } + } + } + } { a, ok := tf.Attrs["tcp_ports"] if !ok { @@ -11913,6 +12060,184 @@ func CopyAppV3ToTerraform(ctx context.Context, obj *github_com_gravitational_tel } } } + { + a, ok := tf.AttrTypes["identity_center"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.IdentityCenter"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.IdentityCenter", "github.com/hashicorp/terraform-plugin-framework/types.ObjectType"}) + } else { + v, ok := tf.Attrs["identity_center"].(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 obj.IdentityCenter == nil { + v.Null = true + } else { + obj := obj.IdentityCenter + tf := &v + { + t, ok := tf.AttrTypes["account_id"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.IdentityCenter.AccountID"}) + } else { + v, ok := tf.Attrs["account_id"].(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.AccountID", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.IdentityCenter.AccountID", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.AccountID) == "" + } + v.Value = string(obj.AccountID) + v.Unknown = false + tf.Attrs["account_id"] = v + } + } + { + a, ok := tf.AttrTypes["permission_sets"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.IdentityCenter.PermissionSets"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.IdentityCenter.PermissionSets", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["permission_sets"].(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.PermissionSets)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.PermissionSets)) + } + } + if obj.PermissionSets != nil { + o := o.ElemType.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if len(obj.PermissionSets) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.PermissionSets)) + } + for k, a := range obj.PermissionSets { + v, ok := tf.Attrs["permission_sets"].(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["arn"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.IdentityCenter.PermissionSets.ARN"}) + } else { + v, ok := tf.Attrs["arn"].(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.ARN", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.IdentityCenter.PermissionSets.ARN", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.ARN) == "" + } + v.Value = string(obj.ARN) + v.Unknown = false + tf.Attrs["arn"] = v + } + } + { + t, ok := tf.AttrTypes["name"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.IdentityCenter.PermissionSets.Name"}) + } else { + v, ok := tf.Attrs["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.Name", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.IdentityCenter.PermissionSets.Name", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.Name) == "" + } + v.Value = string(obj.Name) + v.Unknown = false + 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 + } + if len(obj.PermissionSets) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["permission_sets"] = c + } + } + } + } + v.Unknown = false + tf.Attrs["identity_center"] = v + } + } + } { a, ok := tf.AttrTypes["tcp_ports"] if !ok { diff --git a/lib/asciitable/table.go b/lib/asciitable/table.go index 39d332a2cce1a..ac43ea85d9e2d 100644 --- a/lib/asciitable/table.go +++ b/lib/asciitable/table.go @@ -23,11 +23,13 @@ package asciitable import ( "bytes" "fmt" + "io" "os" "slices" "strings" "text/tabwriter" + "github.com/gravitational/trace" "golang.org/x/term" ) @@ -158,10 +160,26 @@ func (t *Table) truncateCell(colIndex int, cell string) (string, bool) { } // AsBuffer returns a *bytes.Buffer with the printed output of the table. +// +// TODO(nklaassen): delete this, all calls either immediately copy the buffer to +// another writer or just call .String() once. func (t *Table) AsBuffer() *bytes.Buffer { var buffer bytes.Buffer + // Writes to bytes.Buffer never return an error. + _ = t.WriteTo(&buffer) + return &buffer +} - writer := tabwriter.NewWriter(&buffer, 5, 0, 1, ' ', 0) +func (t *Table) String() string { + var sb strings.Builder + // Writes to strings.Builder never return an error. + _ = t.WriteTo(&sb) + return sb.String() +} + +// WriteTo writes the full table to [w] or else returns an error. +func (t *Table) WriteTo(w io.Writer) error { + writer := tabwriter.NewWriter(w, 5, 0, 1, ' ', 0) template := strings.Repeat("%v\t", len(t.columns)) // Header and separator. @@ -173,8 +191,12 @@ func (t *Table) AsBuffer() *bytes.Buffer { colh = append(colh, col.Title) cols = append(cols, strings.Repeat("-", col.width)) } - fmt.Fprintf(writer, template+"\n", colh...) - fmt.Fprintf(writer, template+"\n", cols...) + if _, err := fmt.Fprintf(writer, template+"\n", colh...); err != nil { + return trace.Wrap(err) + } + if _, err := fmt.Fprintf(writer, template+"\n", cols...); err != nil { + return trace.Wrap(err) + } } // Body. @@ -188,17 +210,23 @@ func (t *Table) AsBuffer() *bytes.Buffer { } rowi = append(rowi, cell) } - fmt.Fprintf(writer, template+"\n", rowi...) + if _, err := fmt.Fprintf(writer, template+"\n", rowi...); err != nil { + return trace.Wrap(err) + } } // Footnotes. for label := range footnoteLabels { - fmt.Fprintln(writer) - fmt.Fprintln(writer, label, t.footnotes[label]) + if _, err := fmt.Fprintln(writer); err != nil { + return trace.Wrap(err) + } + if _, err := fmt.Fprintln(writer, label, t.footnotes[label]); err != nil { + return trace.Wrap(err) + } } writer.Flush() - return &buffer + return nil } // IsHeadless returns true if none of the table title cells contains any text. diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 93fb242c40335..090be4f938777 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -1380,8 +1380,6 @@ func (a *Server) runPeriodicOperations() { defer ticker.Stop() - missedKeepAliveCount := 0 - // Prevent some periodic operations from running for dashboard tenants. if !services.IsDashboard(*modules.GetModules().Features().ToProto()) { ticker.Push(interval.SubInterval[periodicIntervalKey]{ @@ -1483,7 +1481,7 @@ func (a *Server) runPeriodicOperations() { return false, nil } if services.NodeHasMissedKeepAlives(srv) { - missedKeepAliveCount++ + heartbeatsMissedByAuth.Inc() } // TODO(tross) DELETE in v20.0.0 - all invalid hostnames should have been sanitized by then. @@ -1521,9 +1519,6 @@ func (a *Server) runPeriodicOperations() { break } } - - // Update prometheus gauge - heartbeatsMissedByAuth.Set(float64(missedKeepAliveCount)) }() case metricsKey: go a.updateAgentMetrics() diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index 2bf4fb6ebf315..2c2bbad853b89 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -160,6 +160,20 @@ func (a *ServerWithRoles) authConnectorAction(namespace string, resource string, return nil } +// identityCenterAction is a special checker that grants access to Identity Center +// resources. In order to simplify the writing of role condition statements, the +// various Identity Center resources are bundled up under an umbrella +// `KindIdentityCenter` resource kind. This means that if access to the target +// resource is not explicitly denied, then the user has a second chance to get +// access via the generic resource kind. +func (a *ServerWithRoles) identityCenterAction(namespace string, resource string, verbs ...string) error { + err := a.action(namespace, resource, verbs...) + if err == nil || services.IsAccessExplicitlyDenied(err) { + return trace.Wrap(err) + } + return trace.Wrap(a.action(namespace, types.KindIdentityCenter, verbs...)) +} + // 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) { @@ -1321,6 +1335,18 @@ func (c *resourceAccess) checkAccess(resource types.ResourceWithLabels, filter s return true, nil } +type actionChecker func(namespace, resourceKind string, verbs ...string) error + +func (a *ServerWithRoles) selectActionChecker(resourceKind string) actionChecker { + switch resourceKind { + case types.KindIdentityCenterAccount, types.KindIdentityCenterAccountAssignment: + // Identity Center resources can be specified multiple ways in a Role + // Condition statement, so we need a special checker to handle it. + return a.identityCenterAction + } + return a.action +} + // ListUnifiedResources returns a paginated list of unified resources filtered by user access. func (a *ServerWithRoles) ListUnifiedResources(ctx context.Context, req *proto.ListUnifiedResourcesRequest) (*proto.ListUnifiedResourcesResponse, error) { filter := services.MatchResourceFilter{ @@ -1358,7 +1384,8 @@ func (a *ServerWithRoles) ListUnifiedResources(ctx context.Context, req *proto.L actionVerbs = []string{types.VerbList} } - resourceAccess.kindAccessMap[kind] = a.action(apidefaults.Namespace, kind, actionVerbs...) + checkAction := a.selectActionChecker(kind) + resourceAccess.kindAccessMap[kind] = checkAction(apidefaults.Namespace, kind, actionVerbs...) } // Before doing any listing, verify that the user is allowed to list @@ -1695,13 +1722,16 @@ func (a *ServerWithRoles) ListResources(ctx context.Context, req proto.ListResou types.KindWindowsDesktop, types.KindWindowsDesktopService, types.KindUserGroup, - types.KindSAMLIdPServiceProvider: + types.KindSAMLIdPServiceProvider, + types.KindIdentityCenterAccount, + types.KindIdentityCenterAccountAssignment: 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 { + checkAction := a.selectActionChecker(req.ResourceType) + if err := checkAction(req.Namespace, req.ResourceType, actionVerbs...); err != nil { return nil, trace.Wrap(err) } @@ -1828,9 +1858,14 @@ func (r resourceChecker) CanAccess(resource types.Resource) error { } case types.SAMLIdPServiceProvider: return r.CheckAccess(rr, state) + + case types.Resource153Unwrapper: + if checkable, ok := rr.(services.AccessCheckable); ok { + return r.CheckAccess(checkable, state) + } } - return trace.BadParameter("could not check access to resource type %T", r) + return trace.BadParameter("could not check access to resource type %T", resource) } // newResourceAccessChecker creates a resourceAccessChecker for the provided resource type @@ -1845,7 +1880,9 @@ func (a *ServerWithRoles) newResourceAccessChecker(resource string) (resourceAcc types.KindKubeServer, types.KindUserGroup, types.KindUnifiedResource, - types.KindSAMLIdPServiceProvider: + types.KindSAMLIdPServiceProvider, + types.KindIdentityCenterAccount, + types.KindIdentityCenterAccountAssignment: return &resourceChecker{AccessChecker: a.context.Checker}, nil default: return nil, trace.BadParameter("could not check access to resource type %s", resource) diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index 8381c0781bf91..ae64df0a23c06 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" @@ -75,6 +78,7 @@ import ( "github.com/gravitational/teleport/lib/srv/discovery/common" "github.com/gravitational/teleport/lib/tlsca" logutils "github.com/gravitational/teleport/lib/utils/log" + "github.com/gravitational/teleport/lib/utils/pagination" ) func TestGenerateUserCerts_MFAVerifiedFieldSet(t *testing.T) { @@ -5662,7 +5666,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. @@ -5737,6 +5742,205 @@ 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") + + setAccountAssignment := func(role types.Role) { + r := role.(*types.RoleV6) + r.Spec.Allow.AccountAssignments = []types.IdentityCenterAccountAssignment{ + { + Account: "11111111", + PermissionSet: "some:arn", + }, + } + } + + testCases := []struct { + name string + kind string + init func(*testing.T) + }{ + { + name: "account", + kind: types.KindIdentityCenterAccount, + init: func(subtestT *testing.T) { + acct, err := srv.Auth().CreateIdentityCenterAccount(ctx, services.IdentityCenterAccount{ + Account: &identitycenterv1.Account{ + Kind: types.KindIdentityCenterAccount, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "test-account", + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }, + Spec: &identitycenterv1.AccountSpec{ + Id: "11111111", + Arn: "some:arn", + Name: "Test Account", + }, + }, + }) + require.NoError(subtestT, err) + subtestT.Cleanup(func() { + srv.Auth().DeleteIdentityCenterAccount(ctx, + services.IdentityCenterAccountID(acct.GetMetadata().GetName())) + }) + + inlineEventually(subtestT, + func() bool { + accounts, _, err := srv.Auth().ListIdentityCenterAccounts( + ctx, 100, &pagination.PageRequestToken{}) + require.NoError(t, err) + return len(accounts) == 1 + }, + 5*time.Second, 200*time.Millisecond, + "Target resource missing from cache") + }, + }, + { + name: "account assignment", + kind: types.KindIdentityCenterAccountAssignment, + init: func(subtestT *testing.T) { + asmt, err := srv.Auth().CreateAccountAssignment(ctx, services.IdentityCenterAccountAssignment{ + AccountAssignment: &identitycenterv1.AccountAssignment{ + Kind: types.KindIdentityCenterAccountAssignment, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: "test-account", + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }, + Spec: &identitycenterv1.AccountAssignmentSpec{ + AccountId: "11111111", + Display: "Test Account Assignment", + PermissionSet: &identitycenterv1.PermissionSetInfo{ + Arn: "some:arn", + Name: "Test Account", + AssignmentId: "Test Assignment on Test Account", + }, + }, + }, + }) + require.NoError(subtestT, err) + subtestT.Cleanup(func() { + srv.Auth().DeleteAccountAssignment(ctx, + services.IdentityCenterAccountAssignmentID(asmt.GetMetadata().GetName())) + }) + + inlineEventually(subtestT, + func() bool { + testAssignments, _, err := srv.Auth().ListAccountAssignments( + ctx, 100, &pagination.PageRequestToken{}) + require.NoError(t, err) + return len(testAssignments) == 1 + }, + 5*time.Second, 200*time.Millisecond, + "Target resource missing from cache") + }, + }, + } + + for _, test := range testCases { + t.Run(test.name, func(t *testing.T) { + test.init(t) + + t.Run("no access", func(t *testing.T) { + userNoAccess, _, err := CreateUserAndRole(srv.Auth(), "no-access", nil, nil) + require.NoError(t, err) + + identity := TestUser(userNoAccess.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + defer clt.Close() + + resp, err := clt.ListResources(ctx, proto.ListResourcesRequest{ + ResourceType: test.kind, + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }) + require.NoError(t, err) + require.Empty(t, resp.Resources) + }) + + t.Run("access via generic kind", func(t *testing.T) { + user, _, err := CreateUserAndRole(srv.Auth(), "read-generic", nil, + []types.Rule{ + types.NewRule(types.KindIdentityCenter, services.RO()), + }, + WithRoleMutator(setAccountAssignment)) + require.NoError(t, err) + + identity := TestUser(user.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + defer clt.Close() + + resp, err := clt.ListResources(ctx, proto.ListResourcesRequest{ + ResourceType: test.kind, + Labels: map[string]string{ + types.OriginLabel: apicommon.OriginAWSIdentityCenter, + }, + }) + require.NoError(t, err) + require.Len(t, resp.Resources, 1) + }) + + t.Run("access via specific kind", func(t *testing.T) { + user, _, err := CreateUserAndRole(srv.Auth(), "read-specific", nil, + []types.Rule{ + types.NewRule(test.kind, services.RO()), + }, + WithRoleMutator(setAccountAssignment)) + require.NoError(t, err) + + identity := TestUser(user.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + defer clt.Close() + + resp, err := clt.ListResources(ctx, proto.ListResourcesRequest{ + ResourceType: test.kind, + }) + require.NoError(t, err) + require.Len(t, resp.Resources, 1) + }) + + t.Run("denied via specific kind beats allow via generic kind", func(t *testing.T) { + user, _, err := CreateUserAndRole(srv.Auth(), "specific-beats-generic", nil, + []types.Rule{ + types.NewRule(types.KindIdentityCenter, services.RO()), + }, + WithRoleMutator(func(r types.Role) { + setAccountAssignment(r) + r.SetRules(types.Deny, []types.Rule{ + types.NewRule(test.kind, services.RO()), + }) + })) + require.NoError(t, err) + + identity := TestUser(user.GetName()) + clt, err := srv.NewClient(identity) + require.NoError(t, err) + defer clt.Close() + + _, err = clt.ListResources(ctx, proto.ListResourcesRequest{ + ResourceType: test.kind, + }) + require.True(t, trace.IsAccessDenied(err), + "Expected Access Denied, got %v", err) + }) + }) + } +} + 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 932d78a383505..d2e206fd8dd51 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -1237,6 +1237,9 @@ type Cache interface { // GetProvisioningState gets a specific provisioning state GetProvisioningState(context.Context, services.DownstreamID, services.ProvisioningStateID) (*provisioningv1.PrincipalState, error) + // GetAccountAssignment fetches specific IdentityCenter Account Assignment + GetAccountAssignment(context.Context, services.IdentityCenterAccountAssignmentID) (services.IdentityCenterAccountAssignment, error) + // ListAccountAssignments fetches a paginated list of IdentityCenter Account Assignments ListAccountAssignments(context.Context, int, *pagination.PageRequestToken) ([]services.IdentityCenterAccountAssignment, pagination.NextPageToken, error) } diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 2ba3dbebfbbf5..d0e8408e07d0b 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -3560,6 +3560,19 @@ func (c *Cache) GetProvisioningState(ctx context.Context, downstream services.Do return rg.reader.GetProvisioningState(ctx, downstream, id) } +func (c *Cache) GetAccountAssignment(ctx context.Context, id services.IdentityCenterAccountAssignmentID) (services.IdentityCenterAccountAssignment, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetAccountAssignment") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.identityCenterAccountAssignments) + if err != nil { + return services.IdentityCenterAccountAssignment{}, trace.Wrap(err) + } + defer rg.Release() + + return rg.reader.GetAccountAssignment(ctx, id) +} + // ListAccountAssignments fetches a paginated list of IdentityCenter Account Assignments func (c *Cache) ListAccountAssignments(ctx context.Context, pageSize int, pageToken *pagination.PageRequestToken) ([]services.IdentityCenterAccountAssignment, pagination.NextPageToken, error) { ctx, span := c.Tracer.Start(ctx, "cache/ListAccountAssignments") diff --git a/lib/events/api.go b/lib/events/api.go index 20b72ddd2e5f9..0ae32c51c9c2c 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -792,35 +792,35 @@ const ( // IntegrationCreateEvent is emitted when an integration resource is created. IntegrationCreateEvent = "integration.create" - //IntegrationUpdateEvent is emitted when an integration resource is updated. + // IntegrationUpdateEvent is emitted when an integration resource is updated. IntegrationUpdateEvent = "integration.update" // IntegrationDeleteEvent is emitted when an integration resource is deleted. IntegrationDeleteEvent = "integration.delete" // PluginCreateEvent is emitted when a plugin resource is created. PluginCreateEvent = "plugin.create" - //PluginUpdateEvent is emitted when a plugin resource is updated. + // PluginUpdateEvent is emitted when a plugin resource is updated. PluginUpdateEvent = "plugin.update" // PluginDeleteEvent is emitted when a plugin resource is deleted. PluginDeleteEvent = "plugin.delete" // StaticHostUserCreateEvent is emitted when a static host user resource is created. StaticHostUserCreateEvent = "static_host_user.create" - //StaticHostUserUpdateEvent is emitted when a static host user resource is updated. + // StaticHostUserUpdateEvent is emitted when a static host user resource is updated. StaticHostUserUpdateEvent = "static_host_user.update" // StaticHostUserDeleteEvent is emitted when a static host user resource is deleted. StaticHostUserDeleteEvent = "static_host_user.delete" // CrownJewelCreateEvent is emitted when a crown jewel resource is created. CrownJewelCreateEvent = "access_graph.crown_jewel.create" - //CrownJewelUpdateEvent is emitted when a crown jewel resource is updated. + // CrownJewelUpdateEvent is emitted when a crown jewel resource is updated. CrownJewelUpdateEvent = "access_graph.crown_jewel.update" // CrownJewelDeleteEvent is emitted when a crown jewel resource is deleted. CrownJewelDeleteEvent = "access_graph.crown_jewel.delete" // UserTaskCreateEvent is emitted when a user task resource is created. UserTaskCreateEvent = "user_task.create" - //UserTaskUpdateEvent is emitted when a user task resource is updated. + // UserTaskUpdateEvent is emitted when a user task resource is updated. UserTaskUpdateEvent = "user_task.update" // UserTaskDeleteEvent is emitted when a user task resource is deleted. UserTaskDeleteEvent = "user_task.delete" @@ -838,6 +838,13 @@ const ( AutoUpdateVersionUpdateEvent = "auto_update_version.update" // AutoUpdateVersionDeleteEvent is emitted when a AutoUpdateVersion resource is deleted. AutoUpdateVersionDeleteEvent = "auto_update_version.delete" + + // WorkloadIdentityCreateEvent is emitted when a WorkloadIdentity resource is created. + WorkloadIdentityCreateEvent = "workload_identity.create" + // WorkloadIdentityUpdateEvent is emitted when a WorkloadIdentity resource is updated. + WorkloadIdentityUpdateEvent = "workload_identity.update" + // WorkloadIdentityDeleteEvent is emitted when a WorkloadIdentity resource is deleted. + WorkloadIdentityDeleteEvent = "workload_identity.delete" ) // Add an entry to eventsMap in lib/events/events_test.go when you add @@ -856,15 +863,13 @@ const ( V3 = 3 ) -var ( - // SessionRecordingEvents is a list of events that are related to session - // recorings. - SessionRecordingEvents = []string{ - SessionEndEvent, - WindowsDesktopSessionEndEvent, - DatabaseSessionEndEvent, - } -) +// SessionRecordingEvents is a list of events that are related to session +// recorings. +var SessionRecordingEvents = []string{ + SessionEndEvent, + WindowsDesktopSessionEndEvent, + DatabaseSessionEndEvent, +} // ServerMetadataGetter represents interface // that provides information about its server id diff --git a/lib/events/codes.go b/lib/events/codes.go index fa8c284fe925b..90ca42e07f68c 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -286,6 +286,8 @@ const ( ExecFailureCode = "T3002E" // PortForwardCode is the port forward event code. PortForwardCode = "T3003I" + // PortForwardStopCode is the port forward stop event code. + PortForwardStopCode = "T3003S" // PortForwardFailureCode is the port forward failure event code. PortForwardFailureCode = "T3003E" // SCPDownloadCode is the file download event code. @@ -669,6 +671,13 @@ const ( // AutoUpdateVersionDeleteCode is the auto update version delete event code. AutoUpdateVersionDeleteCode = "AUV003I" + // WorkloadIdentityCreateCode is the workload identity create event code. + WorkloadIdentityCreateCode = "WID001I" + // WorkloadIdentityUpdateCode is the workload identity update event code. + WorkloadIdentityUpdateCode = "WID002I" + // WorkloadIdentityDeleteCode is the workload identity delete event code. + WorkloadIdentityDeleteCode = "WID003I" + // 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..1fc5a3b4919de 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -462,6 +462,14 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { e = &events.AutoUpdateVersionUpdate{} case AutoUpdateVersionDeleteEvent: e = &events.AutoUpdateVersionDelete{} + + case WorkloadIdentityCreateEvent: + e = &events.WorkloadIdentityCreate{} + case WorkloadIdentityUpdateEvent: + e = &events.WorkloadIdentityUpdate{} + case WorkloadIdentityDeleteEvent: + e = &events.WorkloadIdentityDelete{} + 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..a806eccda3295 100644 --- a/lib/events/events_test.go +++ b/lib/events/events_test.go @@ -242,6 +242,9 @@ var eventsMap = map[string]apievents.AuditEvent{ AutoUpdateVersionCreateEvent: &apievents.AutoUpdateVersionCreate{}, AutoUpdateVersionUpdateEvent: &apievents.AutoUpdateVersionUpdate{}, AutoUpdateVersionDeleteEvent: &apievents.AutoUpdateVersionDelete{}, + WorkloadIdentityCreateEvent: &apievents.WorkloadIdentityCreate{}, + WorkloadIdentityUpdateEvent: &apievents.WorkloadIdentityUpdate{}, + WorkloadIdentityDeleteEvent: &apievents.WorkloadIdentityDelete{}, } // TestJSON tests JSON marshal events diff --git a/lib/kube/proxy/forwarder.go b/lib/kube/proxy/forwarder.go index 1cfd6351fddce..6f88ff1aa59c8 100644 --- a/lib/kube/proxy/forwarder.go +++ b/lib/kube/proxy/forwarder.go @@ -1773,10 +1773,12 @@ func (f *Forwarder) portForward(authCtx *authContext, w http.ResponseWriter, req return nil, trace.Wrap(err) } + auditSent := map[string]bool{} // Set of `addr`. Can be multiple ports on single call. Using bool to simplify the check. onPortForward := func(addr string, success bool) { - if !sess.isLocalKubernetesCluster { + if !sess.isLocalKubernetesCluster || auditSent[addr] { return } + auditSent[addr] = true portForward := &apievents.PortForward{ Metadata: apievents.Metadata{ Type: events.PortForwardEvent, @@ -1792,6 +1794,11 @@ func (f *Forwarder) portForward(authCtx *authContext, w http.ResponseWriter, req Status: apievents.Status{ Success: success, }, + KubernetesClusterMetadata: sess.eventClusterMeta(req), + KubernetesPodMetadata: apievents.KubernetesPodMetadata{ + KubernetesPodNamespace: p.ByName("podNamespace"), + KubernetesPodName: p.ByName("podName"), + }, } if !success { portForward.Code = events.PortForwardFailureCode @@ -1800,6 +1807,31 @@ func (f *Forwarder) portForward(authCtx *authContext, w http.ResponseWriter, req f.log.WithError(err).Warn("Failed to emit event.") } } + defer func() { + for addr := range auditSent { + portForward := &apievents.PortForward{ + Metadata: apievents.Metadata{ + Type: events.PortForwardEvent, + Code: events.PortForwardStopCode, + }, + UserMetadata: authCtx.eventUserMeta(), + ConnectionMetadata: apievents.ConnectionMetadata{ + LocalAddr: sess.kubeAddress, + RemoteAddr: req.RemoteAddr, + Protocol: events.EventProtocolKube, + }, + Addr: addr, + KubernetesClusterMetadata: sess.eventClusterMeta(req), + KubernetesPodMetadata: apievents.KubernetesPodMetadata{ + KubernetesPodNamespace: p.ByName("podNamespace"), + KubernetesPodName: p.ByName("podName"), + }, + } + if err := f.cfg.Emitter.EmitAuditEvent(f.ctx, portForward); err != nil { + f.log.WithError(err).Warn("Failed to emit event.") + } + } + }() q := req.URL.Query() request := portForwardRequest{ diff --git a/lib/kubernetestoken/token_validator.go b/lib/kubernetestoken/token_validator.go index 3d04392f2eeae..6e9316ed835ca 100644 --- a/lib/kubernetestoken/token_validator.go +++ b/lib/kubernetestoken/token_validator.go @@ -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/kubernetestoken/token_validator_test.go index 23433f62602ef..26e27e6a2673b 100644 --- a/lib/kubernetestoken/token_validator_test.go +++ b/lib/kubernetestoken/token_validator_test.go @@ -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/service/service_test.go b/lib/service/service_test.go index 5bba4200716e7..7495a9c7d681e 100644 --- a/lib/service/service_test.go +++ b/lib/service/service_test.go @@ -101,7 +101,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"} @@ -132,7 +132,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"} @@ -192,7 +192,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"} @@ -274,7 +274,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 @@ -785,7 +785,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 @@ -910,7 +910,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, @@ -935,7 +935,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 @@ -1003,7 +1003,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() @@ -1025,7 +1025,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 @@ -1612,11 +1612,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 @@ -1739,7 +1735,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 @@ -1800,7 +1796,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, } @@ -1845,3 +1841,14 @@ func TestInitDatabaseService(t *testing.T) { }) } } + +// 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/services/access_checker.go b/lib/services/access_checker.go index 39da72d5bbf8d..6174f56d7f7ba 100644 --- a/lib/services/access_checker.go +++ b/lib/services/access_checker.go @@ -444,6 +444,18 @@ func (a *accessChecker) CheckAccess(r AccessCheckable, state AccessState, matche if err := a.checkAllowedResources(r); err != nil { return trace.Wrap(err) } + + switch rr := r.(type) { + case types.Resource153Unwrapper: + switch urr := rr.Unwrap().(type) { + case IdentityCenterAccount: + matchers = append(matchers, NewIdentityCenterAccountMatcher(urr)) + + case IdentityCenterAccountAssignment: + matchers = append(matchers, NewIdentityCenterAccountAssignmentMatcher(urr)) + } + } + return trace.Wrap(a.RoleSet.checkAccess(r, a.info.Traits, state, matchers...)) } diff --git a/lib/services/access_request.go b/lib/services/access_request.go index 1e3ef0c8fb9de..67da35cde7381 100644 --- a/lib/services/access_request.go +++ b/lib/services/access_request.go @@ -2191,19 +2191,32 @@ func (m *RequestValidator) pruneResourceRequestRoles( necessaryRoles := make(map[string]struct{}) for _, resource := range resources { var ( - rolesForResource []types.Role - resourceMatcher *KubeResourcesMatcher + rolesForResource []types.Role + matchers []RoleMatcher + kubeResourceMatcher *KubeResourcesMatcher ) kubernetesResources, err := getKubeResourcesFromResourceIDs(resourceIDs, resource.GetName()) if err != nil { return nil, trace.Wrap(err) } if len(kubernetesResources) > 0 { - resourceMatcher = NewKubeResourcesMatcher(kubernetesResources) + kubeResourceMatcher = NewKubeResourcesMatcher(kubernetesResources) + matchers = append(matchers, kubeResourceMatcher) + } + + switch rr := resource.(type) { + case types.Resource153Unwrapper: + switch urr := rr.Unwrap().(type) { + case IdentityCenterAccount: + matchers = append(matchers, NewIdentityCenterAccountMatcher(urr)) + + case IdentityCenterAccountAssignment: + matchers = append(matchers, NewIdentityCenterAccountAssignmentMatcher(urr)) + } } for _, role := range allRoles { - roleAllowsAccess, err := m.roleAllowsResource(role, resource, loginHint, resourceMatcherToMatcherSlice(resourceMatcher)...) + roleAllowsAccess, err := m.roleAllowsResource(role, resource, loginHint, matchers...) if err != nil { return nil, trace.Wrap(err) } @@ -2217,7 +2230,7 @@ func (m *RequestValidator) pruneResourceRequestRoles( // If any of the requested resources didn't match with the provided roles, // we deny the request because the user is trying to request more access // than what is allowed by its search_as_roles. - if resourceMatcher != nil && len(resourceMatcher.Unmatched()) > 0 { + if kubeResourceMatcher != nil && len(kubeResourceMatcher.Unmatched()) > 0 { resourcesStr, err := types.ResourceIDsToString(resourceIDs) if err != nil { return nil, trace.Wrap(err) @@ -2226,7 +2239,7 @@ func (m *RequestValidator) pruneResourceRequestRoles( `no roles configured in the "search_as_roles" for this user allow `+ `access to at least one requested resources. `+ `resources: %s roles: %v unmatched resources: %v`, - resourcesStr, roles, resourceMatcher.Unmatched()) + resourcesStr, roles, kubeResourceMatcher.Unmatched()) } if len(loginHint) > 0 { // If we have a login hint, request the single role with the fewest @@ -2335,15 +2348,6 @@ func (m *RequestValidator) roleAllowsResource( return true, nil } -// resourceMatcherToMatcherSlice returns the resourceMatcher in a RoleMatcher slice -// if the resourceMatcher is not nil, otherwise returns a nil slice. -func resourceMatcherToMatcherSlice(resourceMatcher *KubeResourcesMatcher) []RoleMatcher { - if resourceMatcher == nil { - return nil - } - return []RoleMatcher{resourceMatcher} -} - // getUnderlyingResourcesByResourceIDs gets the underlying resources the user // requested access. Except for resource Kinds present in types.KubernetesResourcesKinds, // the underlying resources are the same as requested. If the resource requested diff --git a/lib/services/identitycenter.go b/lib/services/identitycenter.go index d3053b544e005..f1b3988e5adfc 100644 --- a/lib/services/identitycenter.go +++ b/lib/services/identitycenter.go @@ -18,11 +18,15 @@ package services import ( "context" + "fmt" - "google.golang.org/protobuf/proto" + "github.com/gravitational/trace" "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" "github.com/gravitational/teleport/lib/utils/pagination" ) @@ -49,12 +53,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 +188,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), } } @@ -189,21 +198,27 @@ func (a IdentityCenterAccountAssignment) CloneResource() IdentityCenterAccountAs // IdentityCenterAccountAssignment type IdentityCenterAccountAssignmentID string -// IdentityCenterAccountAssignments defines the operations to create and maintain -// Identity Center account assignment records in the service. -type IdentityCenterAccountAssignments interface { +// IdentityCenterAccountAssignmentGetter provides read-only access to Identity +// Center Account Assignment records +type IdentityCenterAccountAssignmentGetter interface { + // GetAccountAssignment fetches a specific Account Assignment record. + GetAccountAssignment(context.Context, IdentityCenterAccountAssignmentID) (IdentityCenterAccountAssignment, error) + // ListAccountAssignments lists all IdentityCenterAccountAssignment record // known to the service ListAccountAssignments(context.Context, int, *pagination.PageRequestToken) ([]IdentityCenterAccountAssignment, pagination.NextPageToken, error) +} + +// IdentityCenterAccountAssignments defines the operations to create and maintain +// Identity Center account assignment records in the service. +type IdentityCenterAccountAssignments interface { + IdentityCenterAccountAssignmentGetter // CreateAccountAssignment creates a new Account Assignment record in // the service from the supplied in-memory representation. Returns the // created record on success. CreateAccountAssignment(context.Context, IdentityCenterAccountAssignment) (IdentityCenterAccountAssignment, error) - // GetAccountAssignment fetches a specific Account Assignment record. - GetAccountAssignment(context.Context, IdentityCenterAccountAssignmentID) (IdentityCenterAccountAssignment, error) - // UpdateAccountAssignment performs a conditional update on the supplied // Account Assignment, returning the updated record on success. UpdateAccountAssignment(context.Context, IdentityCenterAccountAssignment) (IdentityCenterAccountAssignment, error) @@ -226,3 +241,105 @@ type IdentityCenter interface { IdentityCenterPrincipalAssignments IdentityCenterAccountAssignments } + +// NewIdentityCenterAccountMatcher creates a new [IdentityCenterMatcher] +// configured to match the supplied [IdentityCenterAccount]. +func NewIdentityCenterAccountMatcher(account IdentityCenterAccount) RoleMatcher { + return &IdentityCenterAccountMatcher{ + accountID: account.GetSpec().GetId(), + } +} + +// IdentityCenterMatcher implements a [RoleMatcher] for comparing Identity Center +// resources against the AccountAssignments specified in a Role condition. +// +// The same type is used for matching both [IdentityCenterAccount]s and +// [IdentityCenterAccountAssignment]s, the permission set is `nil` when matching +// an Account. +type IdentityCenterAccountMatcher struct { + accountID string +} + +// Match implements Role Matching for Identity Center Account resources. It +// attempts to match the Account Assignments in a Role Condition against a +// known Account ID. +func (m *IdentityCenterAccountMatcher) Match(role types.Role, condition types.RoleConditionType) (bool, error) { + // TODO(tcsc): Expand to cover role template expansion (e.g. {{external.account_assignments}}) + for _, asmt := range role.GetIdentityCenterAccountAssignments(condition) { + accountMatches, err := matchExpression(m.accountID, asmt.Account) + if err != nil { + return false, trace.Wrap(err) + } + + if accountMatches { + return true, nil + } + } + return false, nil +} + +func (m *IdentityCenterAccountMatcher) String() string { + return fmt.Sprintf("IdentityCenterAccountMatcher(account=%v)", m.accountID) +} + +// NewIdentityCenterAccountAssignmentMatcher creates a new [IdentityCenterAccountAssignmentMatcher] +// configured to match the supplied [IdentityCenterAccountAssignment]. +func NewIdentityCenterAccountAssignmentMatcher(account IdentityCenterAccountAssignment) RoleMatcher { + return &IdentityCenterAccountMatcher{ + accountID: account.GetSpec().GetAccountId(), + } +} + +// IdentityCenterMatcher implements a [RoleMatcher] for comparing Identity Center +// resources against the AccountAssignments specified in a Role condition. +// +// The same type is used for matching both [IdentityCenterAccount]s and +// [IdentityCenterAccountAssignment]s, the permission set is `nil` when matching +// an Account. +type IdentityCenterAccountAssignmentMatcher struct { + accountID string + permissionSetARN string +} + +// Match implements Role Matching for Identity Center Account resources. It +// attempts to match the Account Assignments in a Role Condition against a +// known Account ID. +func (m *IdentityCenterAccountAssignmentMatcher) Match(role types.Role, condition types.RoleConditionType) (bool, error) { + // TODO(tcsc): Expand to cover role template expansion (e.g. {{external.account_assignments}}) + for _, asmt := range role.GetIdentityCenterAccountAssignments(condition) { + accountMatches, err := matchExpression(m.accountID, asmt.Account) + if err != nil { + return false, trace.Wrap(err) + } + + if !accountMatches { + continue + } + + permissionSetMatches, err := matchExpression(m.permissionSetARN, asmt.PermissionSet) + if err != nil { + return false, trace.Wrap(err) + } + + if permissionSetMatches { + return true, nil + } + } + return false, nil +} + +func (m *IdentityCenterAccountAssignmentMatcher) String() string { + return fmt.Sprintf("IdentityCenterAccountMatcher(account=%v, permissionSet=%v)", + m.accountID, m.permissionSetARN) +} + +func matchExpression(target, expression string) (bool, error) { + if expression == types.Wildcard { + return true, nil + } + matches, err := utils.MatchString(target, expression) + if err != nil { + return false, trace.Wrap(err) + } + return matches, nil +} diff --git a/lib/services/identitycenter_test.go b/lib/services/identitycenter_test.go index 5cbc87493feed..640e780fd57ab 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) @@ -95,3 +95,297 @@ func TestIdentityCenterAccountAssignmentClone(t *testing.T) { require.NotEqual(t, src, dst) require.Equal(t, "original name", dst.Spec.PermissionSet.Name) } + +func TestIdentityCenterAccountMatcher(t *testing.T) { + testCases := []struct { + name string + roleAssignments []types.IdentityCenterAccountAssignment + condition types.RoleConditionType + matcher RoleMatcher + expectMatch require.BoolAssertionFunc + }{ + { + name: "empty nonmatch", + roleAssignments: nil, + condition: types.Allow, + matcher: &IdentityCenterAccountMatcher{ + accountID: "11111111", + }, + expectMatch: require.False, + }, + { + name: "simple account match", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "11111111", + PermissionSet: "some:arn", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountMatcher{ + accountID: "11111111", + }, + expectMatch: require.True, + }, + { + name: "multiple account assignments match", + roleAssignments: []types.IdentityCenterAccountAssignment{ + { + Account: "00000000", + PermissionSet: "some:arn", + }, + { + Account: "11111111", + PermissionSet: "some:arn", + }, + }, + condition: types.Allow, + matcher: &IdentityCenterAccountMatcher{ + accountID: "11111111", + }, + expectMatch: require.True, + }, + { + name: "simple account nonmatch", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "11111111", + PermissionSet: "some:arn", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountMatcher{ + accountID: "potato", + }, + expectMatch: require.False, + }, + { + name: "multiple account assignments match", + roleAssignments: []types.IdentityCenterAccountAssignment{ + { + Account: "00000000", + PermissionSet: "some:arn", + }, + { + Account: "11111111", + PermissionSet: "some:arn", + }, + }, + condition: types.Allow, + matcher: &IdentityCenterAccountMatcher{ + accountID: "66666666", + }, + expectMatch: require.False, + }, + { + name: "account glob match", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "*", + PermissionSet: "some:arn", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountMatcher{ + accountID: "potato", + }, + expectMatch: require.True, + }, + { + name: "account glob nonmatch", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "*!", + PermissionSet: "some:arn", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountMatcher{ + accountID: "potato", + }, + expectMatch: require.False, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + roleSpec := types.RoleSpecV6{} + condition := &roleSpec.Deny + if testCase.condition == types.Allow { + condition = &roleSpec.Allow + } + condition.AccountAssignments = append(condition.AccountAssignments, + testCase.roleAssignments...) + + r, err := types.NewRole("test", roleSpec) + require.NoError(t, err) + + match, err := testCase.matcher.Match(r, testCase.condition) + require.NoError(t, err) + + testCase.expectMatch(t, match) + }) + } +} + +func TestIdentityCenterAccountAssignmentMatcher(t *testing.T) { + testCases := []struct { + name string + roleAssignments []types.IdentityCenterAccountAssignment + condition types.RoleConditionType + matcher RoleMatcher + expectMatch require.BoolAssertionFunc + }{ + { + name: "empty nonmatch", + roleAssignments: nil, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "11111111", + permissionSetARN: "some:arn", + }, + expectMatch: require.False, + }, + { + name: "simple match", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "11111111", + PermissionSet: "some:arn", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "11111111", + permissionSetARN: "some:arn", + }, + expectMatch: require.True, + }, + { + name: "multiple match", + roleAssignments: []types.IdentityCenterAccountAssignment{ + { + Account: "00000000", + PermissionSet: "some:arn", + }, + { + Account: "11111111", + PermissionSet: "some:arn", + }, + }, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "11111111", + permissionSetARN: "some:arn", + }, + expectMatch: require.True, + }, + { + name: "multiple nonmatch", + roleAssignments: []types.IdentityCenterAccountAssignment{ + { + Account: "00000000", + PermissionSet: "some:arn", + }, + { + Account: "11111111", + PermissionSet: "some:arn", + }, + }, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "66666666", + permissionSetARN: "some:other:arn", + }, + expectMatch: require.False, + }, + { + name: "account glob", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "*1", + PermissionSet: "some:arn", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "11111111", + permissionSetARN: "some:arn", + }, + expectMatch: require.True, + }, + { + name: "account glob nonmatch", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "*!!!!", + PermissionSet: "some:arn", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "11111111", + permissionSetARN: "some:arn", + }, + expectMatch: require.False, + }, + { + name: "globbed", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "*", + PermissionSet: "*", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "11111111", + permissionSetARN: "some:arn", + }, + expectMatch: require.True, + }, + { + name: "globbed nonmatch", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "*", + PermissionSet: ":not:an:arn:*", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "11111111", + permissionSetARN: "some:arn", + }, + expectMatch: require.False, + }, + { + name: "bad account", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "11111111", + PermissionSet: "some:arn", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "potato", + permissionSetARN: "some:arn", + }, + expectMatch: require.False, + }, + { + name: "bad permissionset arn", + roleAssignments: []types.IdentityCenterAccountAssignment{{ + Account: "11111111", + PermissionSet: "some:arn", + }}, + condition: types.Allow, + matcher: &IdentityCenterAccountAssignmentMatcher{ + accountID: "11111111", + permissionSetARN: "banana", + }, + expectMatch: require.False, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + roleSpec := types.RoleSpecV6{} + condition := &roleSpec.Deny + if testCase.condition == types.Allow { + condition = &roleSpec.Allow + } + condition.AccountAssignments = append(condition.AccountAssignments, + testCase.roleAssignments...) + + r, err := types.NewRole("test", roleSpec) + require.NoError(t, err) + + match, err := testCase.matcher.Match(r, testCase.condition) + require.NoError(t, err) + + testCase.expectMatch(t, match) + }) + } +} diff --git a/lib/services/local/presence.go b/lib/services/local/presence.go index 9ce5353e00aac..9be1d2e96ac79 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" @@ -1373,6 +1374,12 @@ 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 + case types.KindIdentityCenterAccountAssignment: + keyPrefix = []string{awsResourcePrefix, awsAccountAssignmentPrefix} + unmarshalItemFunc = backendItemToIdentityCenterAccountAssignment default: return nil, trace.NotImplemented("%s not implemented at ListResources", req.ResourceType) } @@ -1761,6 +1768,35 @@ 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 +} + +func backendItemToIdentityCenterAccountAssignment(item backend.Item) (types.ResourceWithLabels, error) { + assignment, err := services.UnmarshalProtoResource[*identitycenterv1.AccountAssignment]( + item.Value, + services.WithExpires(item.Expires), + services.WithRevision(item.Revision), + ) + if err != nil { + return nil, trace.Wrap(err) + } + return types.Resource153ToUnifiedResource( + services.IdentityCenterAccountAssignment{AccountAssignment: assignment}, + ), nil +} + const ( reverseTunnelsPrefix = "reverseTunnels" tunnelConnectionsPrefix = "tunnelConnections" diff --git a/lib/services/matchers.go b/lib/services/matchers.go index 19d543ef022c4..b0724b0f1c8ff 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.KindIdentityCenterAccountAssignment: specResource = resource case types.KindKubeServer: if seenMap != nil { diff --git a/lib/services/notifications_cache.go b/lib/services/notifications_cache.go index a071431648b4b..227aecf25df4b 100644 --- a/lib/services/notifications_cache.go +++ b/lib/services/notifications_cache.go @@ -23,7 +23,6 @@ import ( "fmt" "io" "log/slog" - "reflect" "sync" "time" @@ -36,6 +35,7 @@ import ( apiutils "github.com/gravitational/teleport/api/utils" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/utils" + logutils "github.com/gravitational/teleport/lib/utils/log" "github.com/gravitational/teleport/lib/utils/sortcache" ) @@ -456,14 +456,14 @@ func (c *UserNotificationCache) processEventsAndUpdateCurrent(ctx context.Contex // to transform the notification into a legacy resource. We now have to use Unwrap() to get the original RFD153-style notification out and add it to the cache. resource153, ok := event.Resource.(types.Resource153Unwrapper) if !ok { - slog.WarnContext(ctx, "Unexpected resource type in event (expected types.Resource153Unwrapper)", "resource_type", reflect.TypeOf(resource153)) + slog.WarnContext(ctx, "Unexpected resource type in event (expected types.Resource153Unwrapper)", "resource_type", logutils.TypeAttr(resource153)) continue } resource := resource153.Unwrap() notification, ok := resource.(*notificationsv1.Notification) if !ok { - slog.WarnContext(ctx, "Unexpected resource type in event (expected *notificationsv1.Notification)", "resource_type", reflect.TypeOf(resource)) + slog.WarnContext(ctx, "Unexpected resource type in event (expected *notificationsv1.Notification)", "resource_type", logutils.TypeAttr(resource)) continue } if evicted := cache.Put(notification); evicted > 1 { @@ -487,14 +487,14 @@ func (c *GlobalNotificationCache) processEventsAndUpdateCurrent(ctx context.Cont case types.OpPut: resource153, ok := event.Resource.(types.Resource153Unwrapper) if !ok { - slog.WarnContext(ctx, "Unexpected resource type in event (expected types.Resource153Unwrapper)", "resource_type", reflect.TypeOf(resource153)) + slog.WarnContext(ctx, "Unexpected resource type in event (expected types.Resource153Unwrapper)", "resource_type", logutils.TypeAttr(resource153)) continue } resource := resource153.Unwrap() globalNotification, ok := resource.(*notificationsv1.GlobalNotification) if !ok { - slog.WarnContext(ctx, "Unexpected resource type in event (expected *notificationsv1.GlobalNotification)", "resource_type", reflect.TypeOf(resource)) + slog.WarnContext(ctx, "Unexpected resource type in event (expected *notificationsv1.GlobalNotification)", "resource_type", logutils.TypeAttr(resource)) continue } if evicted := cache.Put(globalNotification); evicted > 1 { 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/resource.go b/lib/services/resource.go index fdb886e0a25ca..d2fba666fa6fd 100644 --- a/lib/services/resource.go +++ b/lib/services/resource.go @@ -175,7 +175,7 @@ func ParseShortcut(in string) (string, error) { return types.KindKubeServer, nil case types.KindLock, "locks": return types.KindLock, nil - case types.KindDatabaseServer: + case types.KindDatabaseServer, "db_servers": return types.KindDatabaseServer, nil case types.KindNetworkRestrictions: return types.KindNetworkRestrictions, nil @@ -185,7 +185,7 @@ func ParseShortcut(in string) (string, error) { return types.KindApp, nil case types.KindAppServer, "app_servers": return types.KindAppServer, nil - case types.KindWindowsDesktopService, "windows_service", "win_desktop_service", "win_service": + case types.KindWindowsDesktopService, "windows_service", "win_desktop_service", "win_service", "windows_desktop_services": return types.KindWindowsDesktopService, nil case types.KindWindowsDesktop, "win_desktop": return types.KindWindowsDesktop, nil diff --git a/lib/services/role.go b/lib/services/role.go index 60891a725e3bd..ad3ea438c2b51 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -2555,6 +2555,19 @@ func rbacDebugLogger() (debugEnabled bool, debugf func(format string, args ...in return } +// resourceRequiresLabelMatching decides if a resource requires label matching +// when making RBAC access decisions. +func resourceRequiresLabelMatching(r AccessCheckable) bool { + // Some resources do not need label matching when assessing whether the user + // should be granted access. Enable it by default, but turn it off in the + // special cases. + switch r.GetKind() { + case types.KindIdentityCenterAccount, types.KindIdentityCenterAccountAssignment: + return false + } + return true +} + func (set RoleSet) checkAccess(r AccessCheckable, traits wrappers.Traits, state AccessState, matchers ...RoleMatcher) error { // Note: logging in this function only happens in debug mode. This is because // adding logging to this function (which is called on every resource returned @@ -2566,6 +2579,7 @@ func (set RoleSet) checkAccess(r AccessCheckable, traits wrappers.Traits, state return ErrSessionMFARequired } + requiresLabelMatching := resourceRequiresLabelMatching(r) namespace := types.ProcessNamespace(r.GetMetadata().Namespace) // Additional message depending on kind of resource @@ -2588,18 +2602,20 @@ func (set RoleSet) checkAccess(r AccessCheckable, traits wrappers.Traits, state if !matchNamespace { continue } - - matchLabels, labelsMessage, err := checkRoleLabelsMatch(types.Deny, role, traits, r, isDebugEnabled) - if err != nil { - return trace.Wrap(err) - } - if matchLabels { - debugf("Access to %v %q denied, deny rule in role %q matched; match(namespace=%v, %s)", - r.GetKind(), r.GetName(), role.GetName(), namespaceMessage, labelsMessage) - return trace.AccessDenied("access to %v denied. User does not have permissions. %v", - r.GetKind(), additionalDeniedMessage) + if requiresLabelMatching { + matchLabels, labelsMessage, err := checkRoleLabelsMatch(types.Deny, role, traits, r, isDebugEnabled) + if err != nil { + return trace.Wrap(err) + } + if matchLabels { + debugf("Access to %v %q denied, deny rule in role %q matched; match(namespace=%v, %s)", + r.GetKind(), r.GetName(), role.GetName(), namespaceMessage, labelsMessage) + return trace.AccessDenied("access to %v denied. User does not have permissions. %v", + r.GetKind(), additionalDeniedMessage) + } + } else { + debugf("Role label matching skipped for %v %q", r.GetKind(), r.GetName()) } - // Deny rules are greedy on purpose. They will always match if // at least one of the matchers returns true. matchMatchers, matchersMessage, err := RoleMatchers(matchers).MatchAny(role, types.Deny) @@ -2633,17 +2649,21 @@ func (set RoleSet) checkAccess(r AccessCheckable, traits wrappers.Traits, state continue } - matchLabels, labelsMessage, err := checkRoleLabelsMatch(types.Allow, role, traits, r, isDebugEnabled) - if err != nil { - return trace.Wrap(err) - } + if requiresLabelMatching { + matchLabels, labelsMessage, err := checkRoleLabelsMatch(types.Allow, role, traits, r, isDebugEnabled) + if err != nil { + return trace.Wrap(err) + } - if !matchLabels { - if isDebugEnabled { - errs = append(errs, trace.AccessDenied("role=%v, match(%s)", - role.GetName(), labelsMessage)) + if !matchLabels { + if isDebugEnabled { + errs = append(errs, trace.AccessDenied("role=%v, match(%s)", + role.GetName(), labelsMessage)) + } + continue } - continue + } else { + debugf("Role label matching skipped for %v %q", r.GetKind(), r.GetName()) } // Allow rules are not greedy. They will match only if all of the diff --git a/lib/services/unified_resource.go b/lib/services/unified_resource.go index 7c06471b9d3a6..31582e9dbc3ea 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.KindIdentityCenterAccountAssignment, } // UnifiedResourceCacheConfig is used to configure a UnifiedResourceCache @@ -352,6 +356,8 @@ type ResourceGetter interface { WindowsDesktopGetter KubernetesServerGetter SAMLIdpServiceProviderGetter + IdentityCenterAccountGetter + IdentityCenterAccountAssignmentGetter } // newWatcher starts and returns a new resource watcher for unified resources. @@ -455,6 +461,16 @@ func (c *UnifiedResourceCache) getResourcesAndUpdateCurrent(ctx context.Context) return trace.Wrap(err) } + newICAccounts, err := c.getIdentityCenterAccounts(ctx) + if err != nil { + return trace.Wrap(err) + } + + newICAccountAssignments, err := c.getIdentityCenterAccountAssignments(ctx) + if err != nil { + return trace.Wrap(err) + } + c.rw.Lock() defer c.rw.Unlock() // empty the trees @@ -470,6 +486,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[resource](c, newICAccountAssignments) c.stale = false c.defineCollectorAsInitialized() return nil @@ -581,6 +599,46 @@ 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) getIdentityCenterAccountAssignments(ctx context.Context) ([]resource, error) { + var accounts []resource + var pageRequest pagination.PageRequestToken + for { + resultsPage, nextPage, err := c.ListAccountAssignments(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 +} + // 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,33 @@ 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)) + + case IdentityCenterAccountAssignment: + 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 +963,30 @@ 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.KindIdentityCenterAccountAssignment: + unwrapper, ok := resource.(types.Resource153Unwrapper) + if !ok { + return nil, trace.BadParameter("%s has invalid type %T", resourceKind, resource) + } + assignment, ok := unwrapper.Unwrap().(IdentityCenterAccountAssignment) + if !ok { + return nil, trace.BadParameter( + "Unexpected type for Identity Center Account Assignment: %T", + unwrapper) + } + + protoResource = &proto.PaginatedResource{ + Resource: proto.PackICAccountAssignment(assignment.AccountAssignment), + RequiresRequest: requiresRequest, + } + default: return nil, trace.NotImplemented("resource type %s doesn't support pagination", resource.GetKind()) } @@ -886,6 +994,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..70229739b48d9 100644 --- a/lib/services/unified_resource_test.go +++ b/lib/services/unified_resource_test.go @@ -35,8 +35,11 @@ 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" @@ -55,17 +58,26 @@ func TestUnifiedResourceWatcher(t *testing.T) { services.Presence services.WindowsDesktops services.SAMLIdPServiceProviders + services.IdentityCenterAccounts + services.IdentityCenterAccountAssignments types.Events } samlService, err := local.NewSAMLIdPServiceProviderService(bk) require.NoError(t, err) + icService, err := local.NewIdentityCenterService(local.IdentityCenterServiceConfig{ + Backend: bk, + }) + require.NoError(t, err) + clt := &client{ - Presence: local.NewPresenceService(bk), - WindowsDesktops: local.NewWindowsDesktopService(bk), - SAMLIdPServiceProviders: samlService, - Events: local.NewEventsService(bk), + Presence: local.NewPresenceService(bk), + WindowsDesktops: local.NewWindowsDesktopService(bk), + SAMLIdPServiceProviders: samlService, + Events: local.NewEventsService(bk), + IdentityCenterAccounts: icService, + IdentityCenterAccountAssignments: icService, } // Add node to the backend. node := newNodeServer(t, "node1", "hostname1", "127.0.0.1:22", false /*tunnel*/) @@ -142,8 +154,14 @@ func TestUnifiedResourceWatcher(t *testing.T) { err = clt.UpsertWindowsDesktop(ctx, win) require.NoError(t, err) + icAcct := newICAccount(t, ctx, clt) + icAcctAssignment := newICAccountAssignment(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, + types.Resource153ToUnifiedResource(icAcct), + types.Resource153ToUnifiedResource(icAcctAssignment), + } assert.Eventually(t, func() bool { res, err = w.GetUnifiedResources(ctx) return len(res) == len(expectedRes) @@ -156,6 +174,21 @@ 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{}, + identitycenterv1.AccountAssignment{}, + identitycenterv1.AccountAssignmentSpec{}), )) // // Update and remove some resources. @@ -166,7 +199,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, + types.Resource153ToUnifiedResource(icAcct), + types.Resource153ToUnifiedResource(icAcctAssignment)} + assert.Eventually(t, func() bool { res, err = w.GetUnifiedResources(ctx) require.NoError(t, err) @@ -182,6 +218,22 @@ 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{}, + identitycenterv1.AccountAssignment{}, + identitycenterv1.AccountAssignmentSpec{}), + // Ignore order. cmpopts.SortSlices(func(a, b types.ResourceWithLabels) bool { return a.GetName() < b.GetName() }), )) @@ -199,17 +251,26 @@ func TestUnifiedResourceWatcher_PreventDuplicates(t *testing.T) { services.Presence services.WindowsDesktops services.SAMLIdPServiceProviders + services.IdentityCenterAccountGetter + services.IdentityCenterAccountAssignments types.Events } samlService, err := local.NewSAMLIdPServiceProviderService(bk) require.NoError(t, err) + icService, err := local.NewIdentityCenterService(local.IdentityCenterServiceConfig{ + Backend: bk, + }) + require.NoError(t, err) + clt := &client{ - Presence: local.NewPresenceService(bk), - WindowsDesktops: local.NewWindowsDesktopService(bk), - SAMLIdPServiceProviders: samlService, - Events: local.NewEventsService(bk), + Presence: local.NewPresenceService(bk), + WindowsDesktops: local.NewWindowsDesktopService(bk), + SAMLIdPServiceProviders: samlService, + Events: local.NewEventsService(bk), + IdentityCenterAccountGetter: icService, + IdentityCenterAccountAssignments: icService, } w, err := services.NewUnifiedResourceCache(ctx, services.UnifiedResourceCacheConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ @@ -255,17 +316,26 @@ func TestUnifiedResourceWatcher_DeleteEvent(t *testing.T) { services.Presence services.WindowsDesktops services.SAMLIdPServiceProviders + services.IdentityCenterAccounts + services.IdentityCenterAccountAssignments types.Events } samlService, err := local.NewSAMLIdPServiceProviderService(bk) require.NoError(t, err) + icService, err := local.NewIdentityCenterService(local.IdentityCenterServiceConfig{ + Backend: bk, + }) + require.NoError(t, err) + clt := &client{ - Presence: local.NewPresenceService(bk), - WindowsDesktops: local.NewWindowsDesktopService(bk), - SAMLIdPServiceProviders: samlService, - Events: local.NewEventsService(bk), + Presence: local.NewPresenceService(bk), + WindowsDesktops: local.NewWindowsDesktopService(bk), + SAMLIdPServiceProviders: samlService, + Events: local.NewEventsService(bk), + IdentityCenterAccounts: icService, + IdentityCenterAccountAssignments: icService, } w, err := services.NewUnifiedResourceCache(ctx, services.UnifiedResourceCacheConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ @@ -360,9 +430,12 @@ func TestUnifiedResourceWatcher_DeleteEvent(t *testing.T) { require.NoError(t, err) _, err = clt.UpsertKubernetesServer(ctx, kubeServer) require.NoError(t, err) + + icAcct := newICAccount(t, ctx, clt) + assert.Eventually(t, func() bool { res, _ := w.GetUnifiedResources(ctx) - return len(res) == 6 + return len(res) == 7 }, 5*time.Second, 10*time.Millisecond, "Timed out waiting for unified resources to be added") // delete everything @@ -378,6 +451,8 @@ 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) assert.Eventually(t, func() bool { res, _ := w.GetUnifiedResources(ctx) @@ -440,3 +515,67 @@ const testEntityDescriptor = ` ` + +func newICAccount(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.OriginAWSIdentityCenter, + }, + }, + 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 +} + +func newICAccountAssignment(t *testing.T, ctx context.Context, svc services.IdentityCenterAccountAssignments) services.IdentityCenterAccountAssignment { + t.Helper() + + assignment, err := svc.CreateAccountAssignment(ctx, services.IdentityCenterAccountAssignment{ + AccountAssignment: &identitycenterv1.AccountAssignment{ + Kind: types.KindIdentityCenterAccountAssignment, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: t.Name(), + Labels: map[string]string{ + types.OriginLabel: common.OriginAWSIdentityCenter, + }, + }, + Spec: &identitycenterv1.AccountAssignmentSpec{ + Display: "Admin access on Production", + PermissionSet: &identitycenterv1.PermissionSetInfo{ + Arn: "arn:aws::::ps-Admin", + Name: "Admin", + AssignmentId: "production--admin", + }, + AccountName: "Production", + AccountId: "99999999", + }, + }}) + require.NoError(t, err, "creating Identity Center Account Assignment") + return assignment +} diff --git a/lib/services/useracl.go b/lib/services/useracl.go index 5ec6fe73f1ce8..4a6c39b554ee5 100644 --- a/lib/services/useracl.go +++ b/lib/services/useracl.go @@ -116,6 +116,10 @@ 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"` + // FileTransferAccess defines the ability to perform remote file operations via SCP or SFTP + FileTransferAccess bool `json:"fileTransferAccess"` } func hasAccess(roleSet RoleSet, ctx *Context, kind string, verbs ...string) bool { @@ -208,6 +212,7 @@ func NewUserACL(user types.User, userRoles RoleSet, features proto.Features, des crownJewelAccess := newAccess(userRoles, ctx, types.KindCrownJewel) userTasksAccess := newAccess(userRoles, ctx, types.KindUserTask) reviewRequests := userRoles.MaybeCanReviewRequests() + fileTransferAccess := userRoles.CanCopyFiles() var auditQuery ResourceAccess var securityReports ResourceAccess @@ -216,6 +221,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 +264,7 @@ func NewUserACL(user types.User, userRoles RoleSet, features proto.Features, des AccessMonitoringRule: accessMonitoringRules, CrownJewel: crownJewelAccess, AccessGraphSettings: accessGraphSettings, + Contact: contact, + FileTransferAccess: fileTransferAccess, } } 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/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/db/access_test.go b/lib/srv/db/access_test.go index 37848ea294c8e..f4e77b0d63294 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" @@ -2145,7 +2144,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 +2157,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 +2169,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) diff --git a/lib/srv/db/spanner/test.go b/lib/srv/db/spanner/test.go index 4a7b5378766cd..44b74085c05bf 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,13 +93,13 @@ 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(), } @@ -86,7 +111,10 @@ func makeTestClient(ctx context.Context, config common.TestClientConfig, useTLS 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 5a32da6b02786..ed092859f5c42 100644 --- a/lib/srv/desktop/rdp/rdpclient/Cargo.toml +++ b/lib/srv/desktop/rdp/rdpclient/Cargo.toml @@ -42,7 +42,7 @@ picky = { version = "7.0.0-rc.9", 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/client.go b/lib/srv/desktop/rdp/rdpclient/client.go index 1642f6a3368b3..ca8ad121e81f9 100644 --- a/lib/srv/desktop/rdp/rdpclient/client.go +++ b/lib/srv/desktop/rdp/rdpclient/client.go @@ -232,7 +232,7 @@ func (c *Client) readClientUsername() error { } u, ok := msg.(tdp.ClientUsername) if !ok { - c.cfg.Logger.DebugContext(context.Background(), fmt.Sprintf("Expected ClientUsername message, got %T", msg)) + c.cfg.Logger.DebugContext(context.Background(), "Received unexpected ClientUsername message", "message_type", logutils.TypeAttr(msg)) continue } c.cfg.Logger.DebugContext(context.Background(), "Got RDP username", "username", u.Username) 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..5568d2b20d5a1 100644 --- a/lib/srv/desktop/windows_server.go +++ b/lib/srv/desktop/windows_server.go @@ -60,6 +60,7 @@ import ( "github.com/gravitational/teleport/lib/srv/desktop/tdp" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" + logutils "github.com/gravitational/teleport/lib/utils/log" ) const ( @@ -1140,7 +1141,7 @@ func (s *WindowsService) makeTDPReceiveHandler( if e.Size() > libevents.MaxProtoMessageSizeBytes { // screen spec, mouse button, and mouse move are fixed size messages, // so they cannot exceed the maximum size - s.cfg.Logger.WarnContext(ctx, "refusing to record message", "len", len(b), "type", fmt.Sprintf("%T", m)) + s.cfg.Logger.WarnContext(ctx, "refusing to record message", "len", len(b), "type", logutils.TypeAttr(m)) } else { if err := libevents.SetupAndRecordEvent(ctx, recorder, e); err != nil { s.cfg.Logger.WarnContext(ctx, "could not record desktop recording event", "error", err) diff --git a/lib/teleterm/clusters/cluster.go b/lib/teleterm/clusters/cluster.go index 3924941cdac9a..3899dc64fadff 100644 --- a/lib/teleterm/clusters/cluster.go +++ b/lib/teleterm/clusters/cluster.go @@ -213,6 +213,7 @@ func (c *Cluster) GetWithDetails(ctx context.Context, authClient authclient.Clie Dbs: convertToAPIResourceAccess(userACL.DBServers), Kubeservers: convertToAPIResourceAccess(userACL.KubeServers), AccessRequests: convertToAPIResourceAccess(userACL.AccessRequests), + ReviewRequests: userACL.ReviewRequests, } withDetails := &ClusterWithDetails{ diff --git a/lib/teleterm/daemon/daemon.go b/lib/teleterm/daemon/daemon.go index 19724daceb6b3..13f12f4dfa253 100644 --- a/lib/teleterm/daemon/daemon.go +++ b/lib/teleterm/daemon/daemon.go @@ -1131,10 +1131,14 @@ func (s *Service) AuthenticateWebDevice(ctx context.Context, rootClusterURI uri. } devicesClient := proxyClient.CurrentCluster().DevicesClient() - ceremony := dtauthn.NewCeremony() - confirmationToken, err := ceremony.RunWeb(ctx, devicesClient, &devicepb.DeviceWebToken{ - Id: req.DeviceWebToken.Id, - Token: req.DeviceWebToken.Token, + var confirmationToken *devicepb.DeviceConfirmationToken + err = clusters.AddMetadataToRetryableError(ctx, func() error { + ceremony := dtauthn.NewCeremony() + confirmationToken, err = ceremony.RunWeb(ctx, devicesClient, &devicepb.DeviceWebToken{ + Id: req.DeviceWebToken.Id, + Token: req.DeviceWebToken.Token, + }) + return trace.Wrap(err) }) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/usagereporter/teleport/usagereporter.go b/lib/usagereporter/teleport/usagereporter.go index f9a410fa0ad62..b33d51877df75 100644 --- a/lib/usagereporter/teleport/usagereporter.go +++ b/lib/usagereporter/teleport/usagereporter.go @@ -112,6 +112,7 @@ func (t *StreamingUsageReporter) AnonymizeAndSubmit(events ...Anonymizable) { req := e.Anonymize(t.anonymizer) req.Timestamp = timestamppb.New(t.clock.Now()) req.ClusterName = t.anonymizer.AnonymizeString(t.clusterName.GetClusterName()) + req.TeleportVersion = teleport.Version t.usageReporter.AddEventsToQueue(&req) } } 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/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/web/apiserver.go b/lib/web/apiserver.go index e74e92e635540..cf2b6aa76ced5 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -975,6 +975,7 @@ func (h *Handler) bindDefaultEndpoints() { h.GET("/webapi/sites/:site/integrations/:name", h.WithClusterAuth(h.integrationsGet)) h.PUT("/webapi/sites/:site/integrations/:name", h.WithClusterAuth(h.integrationsUpdate)) h.GET("/webapi/sites/:site/integrations/:name/stats", h.WithClusterAuth(h.integrationStats)) + h.GET("/webapi/sites/:site/integrations/:name/discoveryrules", h.WithClusterAuth(h.integrationDiscoveryRules)) h.DELETE("/webapi/sites/:site/integrations/:name_or_subkind", h.WithClusterAuth(h.integrationsDelete)) // GET the Microsoft Teams plugin app.zip file. @@ -1244,7 +1245,7 @@ func (h *Handler) getUserContext(w http.ResponseWriter, r *http.Request, p httpr if err != nil { return nil, trace.Wrap(err) } - if !pingResp.LicenseExpiry.IsZero() { + if pingResp.LicenseExpiry != nil && !pingResp.LicenseExpiry.IsZero() { userContext.Cluster.LicenseExpiry = pingResp.LicenseExpiry } diff --git a/lib/web/conn_upgrade.go b/lib/web/conn_upgrade.go index df8c4684dcfc7..7a081aa9ea975 100644 --- a/lib/web/conn_upgrade.go +++ b/lib/web/conn_upgrade.go @@ -109,7 +109,7 @@ func (h *Handler) upgradeALPNWebSocket(w http.ResponseWriter, r *http.Request, u } wsConn, err := upgrader.Upgrade(w, r, nil) if err != nil { - h.logger.DebugContext(r.Context(), "Failed to upgrade weboscket.", "error", err) + h.logger.DebugContext(r.Context(), "Failed to upgrade WebSocket.", "error", err) return nil, trace.Wrap(err) } defer wsConn.Close() diff --git a/lib/web/integrations.go b/lib/web/integrations.go index 4693418dd3b9d..6705afcf8dc48 100644 --- a/lib/web/integrations.go +++ b/lib/web/integrations.go @@ -36,6 +36,7 @@ import ( "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/httplib" "github.com/gravitational/teleport/lib/reversetunnelclient" + libui "github.com/gravitational/teleport/lib/ui" "github.com/gravitational/teleport/lib/web/ui" ) @@ -319,6 +320,109 @@ func rulesWithIntegration(dc *discoveryconfig.DiscoveryConfig, matcherType strin return ret } +// integrationDiscoveryRules returns the Discovery Rules that are using a given integration. +// A Discovery Rule is just like a DiscoveryConfig Matcher, except that it breaks down by region. +// So, if a Matcher exists for two regions, that will be represented as two Rules. +func (h *Handler) integrationDiscoveryRules(w http.ResponseWriter, r *http.Request, p httprouter.Params, sctx *SessionContext, site reversetunnelclient.RemoteSite) (interface{}, error) { + integrationName := p.ByName("name") + if integrationName == "" { + return nil, trace.BadParameter("an integration name is required") + } + + values := r.URL.Query() + startKey := values.Get("startKey") + resourceType := values.Get("resourceType") + + clt, err := sctx.GetUserClient(r.Context(), site) + if err != nil { + return nil, trace.Wrap(err) + } + + ig, err := clt.GetIntegration(r.Context(), integrationName) + if err != nil { + return nil, trace.Wrap(err) + } + + rules, err := collectAutoDiscoveryRules(r.Context(), ig.GetName(), startKey, resourceType, clt.DiscoveryConfigClient()) + if err != nil { + return nil, trace.Wrap(err) + } + + return rules, nil +} + +// collectAutoDiscoveryRules will iterate over all DiscoveryConfigs's Matchers and collect the Discovery Rules that exist in them for the given integration. +// It can also be filtered by Matcher Type (eg ec2, rds, eks) +// A Discovery Rule is a close match to a DiscoveryConfig's Matcher, except that it will count as many rules as regions exist. +// Eg if a DiscoveryConfig's Matcher has two regions, then it will output two (almost equal) Rules, one for each Region. +func collectAutoDiscoveryRules( + ctx context.Context, + integrationName string, + nextPage string, + resourceTypeFilter string, + clt interface { + ListDiscoveryConfigs(ctx context.Context, pageSize int, nextToken string) ([]*discoveryconfig.DiscoveryConfig, string, error) + }, +) (ui.IntegrationDiscoveryRules, error) { + const ( + maxPerPage = 100 + ) + var ret ui.IntegrationDiscoveryRules + for { + discoveryConfigs, nextToken, err := clt.ListDiscoveryConfigs(ctx, 0, nextPage) + if err != nil { + return ret, trace.Wrap(err) + } + for _, dc := range discoveryConfigs { + lastSync := &dc.Status.LastSyncTime + if lastSync.IsZero() { + lastSync = nil + } + + for _, matcher := range dc.Spec.AWS { + if matcher.Integration != integrationName { + continue + } + + for _, resourceType := range matcher.Types { + if resourceTypeFilter != "" && resourceType != resourceTypeFilter { + continue + } + + for _, region := range matcher.Regions { + uiLables := make([]libui.Label, 0, len(matcher.Tags)) + for labelKey, labelValues := range matcher.Tags { + for _, labelValue := range labelValues { + uiLables = append(uiLables, libui.Label{ + Name: labelKey, + Value: labelValue, + }) + } + } + ret.Rules = append(ret.Rules, ui.IntegrationDiscoveryRule{ + ResourceType: resourceType, + Region: region, + LabelMatcher: uiLables, + DiscoveryConfig: dc.GetName(), + LastSync: lastSync, + }) + } + } + } + } + + ret.NextKey = nextToken + + if nextToken == "" || len(ret.Rules) > maxPerPage { + break + } + + nextPage = nextToken + } + + return ret, nil +} + // integrationsList returns a page of Integrations func (h *Handler) integrationsList(w http.ResponseWriter, r *http.Request, p httprouter.Params, sctx *SessionContext, site reversetunnelclient.RemoteSite) (interface{}, error) { clt, err := sctx.GetUserClient(r.Context(), site) diff --git a/lib/web/integrations_awsoidc.go b/lib/web/integrations_awsoidc.go index 39ebb250a9452..331df6ba78dd1 100644 --- a/lib/web/integrations_awsoidc.go +++ b/lib/web/integrations_awsoidc.go @@ -35,6 +35,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" integrationv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" "github.com/gravitational/teleport/api/types" @@ -49,6 +50,7 @@ import ( "github.com/gravitational/teleport/lib/reversetunnelclient" "github.com/gravitational/teleport/lib/services" libutils "github.com/gravitational/teleport/lib/utils" + awsutils "github.com/gravitational/teleport/lib/utils/aws" "github.com/gravitational/teleport/lib/utils/oidc" "github.com/gravitational/teleport/lib/web/scripts/oneoff" "github.com/gravitational/teleport/lib/web/ui" @@ -984,7 +986,16 @@ func (h *Handler) awsOIDCCreateAWSAppAccess(w http.ResponseWriter, r *http.Reque publicAddr := libutils.DefaultAppPublicAddr(integrationName, h.PublicProxyAddr()) - appServer, err := types.NewAppServerForAWSOIDCIntegration(integrationName, h.cfg.HostUUID, publicAddr) + parsedRoleARN, err := awsutils.ParseRoleARN(ig.GetAWSOIDCIntegrationSpec().RoleARN) + if err != nil { + return nil, trace.Wrap(err) + } + + labels := map[string]string{ + constants.AWSAccountIDLabel: parsedRoleARN.AccountID, + } + + appServer, err := types.NewAppServerForAWSOIDCIntegration(integrationName, h.cfg.HostUUID, publicAddr, labels) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/web/integrations_awsoidc_test.go b/lib/web/integrations_awsoidc_test.go index 200d68ef7d9a0..9b2660fe36e99 100644 --- a/lib/web/integrations_awsoidc_test.go +++ b/lib/web/integrations_awsoidc_test.go @@ -1067,7 +1067,7 @@ func TestAWSOIDCAppAccessAppServerCreationDeletion(t *testing.T) { myIntegration, err := types.NewIntegrationAWSOIDC(types.Metadata{ Name: "my-integration", }, &types.AWSOIDCIntegrationSpecV1{ - RoleARN: "some-arn-role", + RoleARN: "arn:aws:iam::123456789012:role/teleport", }) require.NoError(t, err) @@ -1094,7 +1094,8 @@ func TestAWSOIDCAppAccessAppServerCreationDeletion(t *testing.T) { Kind: types.KindAppServer, Version: types.V3, Metadata: types.Metadata{ - Name: "my-integration", + Name: "my-integration", + Labels: map[string]string{"aws_account_id": "123456789012"}, }, Spec: types.AppServerSpecV3{ Version: api.Version, @@ -1103,7 +1104,8 @@ func TestAWSOIDCAppAccessAppServerCreationDeletion(t *testing.T) { Kind: types.KindApp, Version: types.V3, Metadata: types.Metadata{ - Name: "my-integration", + Name: "my-integration", + Labels: map[string]string{"aws_account_id": "123456789012"}, }, Spec: types.AppSpecV3{ URI: "https://console.aws.amazon.com", @@ -1133,7 +1135,7 @@ func TestAWSOIDCAppAccessAppServerCreationDeletion(t *testing.T) { myIntegrationWithAccountID, err := types.NewIntegrationAWSOIDC(types.Metadata{ Name: "123456789012", }, &types.AWSOIDCIntegrationSpecV1{ - RoleARN: "some-arn-role", + RoleARN: "arn:aws:iam::123456789012:role/teleport", }) require.NoError(t, err) diff --git a/lib/web/intgrations_test.go b/lib/web/integrations_test.go similarity index 64% rename from lib/web/intgrations_test.go rename to lib/web/integrations_test.go index f60eabd623041..9719de251d0ec 100644 --- a/lib/web/intgrations_test.go +++ b/lib/web/integrations_test.go @@ -24,12 +24,15 @@ import ( "testing" "time" + "github.com/google/uuid" "github.com/stretchr/testify/require" discoveryconfigv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/discoveryconfig/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/discoveryconfig" + "github.com/gravitational/teleport/api/types/header" "github.com/gravitational/teleport/lib/services" + libui "github.com/gravitational/teleport/lib/ui" "github.com/gravitational/teleport/lib/web/ui" ) @@ -212,6 +215,142 @@ func TestCollectAWSOIDCAutoDiscoverStats(t *testing.T) { }) } +func TestCollectAutoDiscoveryRules(t *testing.T) { + ctx := context.Background() + integrationName := "my-integration" + + t.Run("without discovery configs, returns no rules", func(t *testing.T) { + clt := &mockDiscoveryConfigsGetter{ + discoveryConfigs: make([]*discoveryconfig.DiscoveryConfig, 0), + } + + gotRules, err := collectAutoDiscoveryRules(ctx, integrationName, "", "", clt) + require.NoError(t, err) + expectedRules := ui.IntegrationDiscoveryRules{} + require.Equal(t, expectedRules, gotRules) + }) + + t.Run("collects multiple discovery configs", func(t *testing.T) { + syncTime := time.Now() + dcForEC2 := &discoveryconfig.DiscoveryConfig{ + ResourceHeader: header.ResourceHeader{Metadata: header.Metadata{ + Name: uuid.NewString(), + }}, + Spec: discoveryconfig.Spec{AWS: []types.AWSMatcher{{ + Integration: integrationName, + Types: []string{"ec2"}, + Regions: []string{"us-east-1"}, + Tags: types.Labels{"*": []string{"*"}}, + }}}, + Status: discoveryconfig.Status{ + LastSyncTime: syncTime, + }, + } + dcForRDS := &discoveryconfig.DiscoveryConfig{ + ResourceHeader: header.ResourceHeader{Metadata: header.Metadata{ + Name: uuid.NewString(), + }}, + Spec: discoveryconfig.Spec{AWS: []types.AWSMatcher{{ + Integration: integrationName, + Types: []string{"rds"}, + Regions: []string{"us-east-1", "us-east-2"}, + Tags: types.Labels{ + "env": []string{"dev", "prod"}, + }, + }}}, + Status: discoveryconfig.Status{ + LastSyncTime: syncTime, + }, + } + dcForEKS := &discoveryconfig.DiscoveryConfig{ + ResourceHeader: header.ResourceHeader{Metadata: header.Metadata{ + Name: uuid.NewString(), + }}, + Spec: discoveryconfig.Spec{AWS: []types.AWSMatcher{{ + Integration: integrationName, + Types: []string{"eks"}, + Regions: []string{"us-east-1"}, + Tags: types.Labels{"*": []string{"*"}}, + }}}, + Status: discoveryconfig.Status{ + LastSyncTime: syncTime, + }, + } + dcForEKSWithoutStatus := &discoveryconfig.DiscoveryConfig{ + ResourceHeader: header.ResourceHeader{Metadata: header.Metadata{ + Name: uuid.NewString(), + }}, + Spec: discoveryconfig.Spec{AWS: []types.AWSMatcher{{ + Integration: integrationName, + Types: []string{"eks"}, + Regions: []string{"eu-west-1"}, + Tags: types.Labels{"*": []string{"*"}}, + }}}, + } + clt := &mockDiscoveryConfigsGetter{ + discoveryConfigs: []*discoveryconfig.DiscoveryConfig{ + dcForEC2, + dcForRDS, + dcForEKS, + dcForEKSWithoutStatus, + }, + } + + got, err := collectAutoDiscoveryRules(ctx, integrationName, "", "", clt) + require.NoError(t, err) + expectedRules := []ui.IntegrationDiscoveryRule{ + { + ResourceType: "ec2", + Region: "us-east-1", + LabelMatcher: []libui.Label{ + {Name: "*", Value: "*"}, + }, + DiscoveryConfig: dcForEC2.GetName(), + LastSync: &syncTime, + }, + { + ResourceType: "eks", + Region: "us-east-1", + LabelMatcher: []libui.Label{ + {Name: "*", Value: "*"}, + }, + DiscoveryConfig: dcForEKS.GetName(), + LastSync: &syncTime, + }, + { + ResourceType: "eks", + Region: "eu-west-1", + LabelMatcher: []libui.Label{ + {Name: "*", Value: "*"}, + }, + DiscoveryConfig: dcForEKSWithoutStatus.GetName(), + }, + { + ResourceType: "rds", + Region: "us-east-1", + LabelMatcher: []libui.Label{ + {Name: "env", Value: "dev"}, + {Name: "env", Value: "prod"}, + }, + DiscoveryConfig: dcForRDS.GetName(), + LastSync: &syncTime, + }, + { + ResourceType: "rds", + Region: "us-east-2", + LabelMatcher: []libui.Label{ + {Name: "env", Value: "dev"}, + {Name: "env", Value: "prod"}, + }, + DiscoveryConfig: dcForRDS.GetName(), + LastSync: &syncTime, + }, + } + require.Empty(t, got.NextKey) + require.ElementsMatch(t, expectedRules, got.Rules) + }) +} + type mockDiscoveryConfigsGetter struct { discoveryConfigs []*discoveryconfig.DiscoveryConfig } 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/lib/web/ui/integration.go b/lib/web/ui/integration.go index 3c0aab3c817d8..913f22c647947 100644 --- a/lib/web/ui/integration.go +++ b/lib/web/ui/integration.go @@ -96,6 +96,31 @@ type ResourceTypeSummary struct { ECSDatabaseServiceCount int `json:"ecsDatabaseServiceCount,omitempty"` } +// IntegrationDiscoveryRule describes a discovery rule associated with an integration. +type IntegrationDiscoveryRule struct { + // ResourceType indicates the type of resource that this rule targets. + // This is the same value that is set in DiscoveryConfig.AWS..Types + // Example: ec2, rds, eks + ResourceType string `json:"resourceType,omitempty"` + // Region where this rule applies to. + Region string `json:"region,omitempty"` + // LabelMatcher is the set of labels that are used to filter the resources before trying to auto-enroll them. + LabelMatcher []ui.Label `json:"labelMatcher,omitempty"` + // DiscoveryConfig is the name of the DiscoveryConfig that created this rule. + DiscoveryConfig string `json:"discoveryConfig,omitempty"` + // LastSync contains the time when this rule was used. + // If empty, it indicates that the rule is not being used. + LastSync *time.Time `json:"lastSync,omitempty"` +} + +// IntegrationDiscoveryRules contains the list of discovery rules for a given Integration. +type IntegrationDiscoveryRules struct { + // Rules is the list of integration rules. + Rules []IntegrationDiscoveryRule `json:"rules"` + // NextKey is the position to resume listing rules. + NextKey string `json:"nextKey,omitempty"` +} + // Integration describes Integration fields type Integration struct { // Name is the Integration name. diff --git a/proto/prehog/v1alpha/teleport.proto b/proto/prehog/v1alpha/teleport.proto index 3f3218ad3a3ca..219ec68a10114 100644 --- a/proto/prehog/v1alpha/teleport.proto +++ b/proto/prehog/v1alpha/teleport.proto @@ -1480,6 +1480,13 @@ message SubmitEventRequest { // PostHog timestamp google.protobuf.Timestamp timestamp = 2; + // teleport_version is the version of the Teleport auth server that submitted + // the event, without the "v" prefix. + // For example: 16.4.7 + // + // PostHog property: tp.teleport_version + string teleport_version = 95; + // the event being submitted oneof event { UserLoginEvent user_login = 3; @@ -1625,6 +1632,8 @@ message SubmitEventRequest { SessionRecordingAccessEvent session_recording_access = 93; UserTaskStateEvent user_task_state = 94; + + // note that 95 is used for "teleport_version" above. } reserved 8; // UIOnboardGetStartedClickEvent diff --git a/proto/teleport/lib/teleterm/v1/cluster.proto b/proto/teleport/lib/teleterm/v1/cluster.proto index f0bafaf348419..8663547ab2cfd 100644 --- a/proto/teleport/lib/teleterm/v1/cluster.proto +++ b/proto/teleport/lib/teleterm/v1/cluster.proto @@ -141,6 +141,8 @@ message ACL { ResourceAccess recorded_sessions = 13; // active_sessions defines access to active sessions. ResourceAccess active_sessions = 14; + // review_requests defines the ability to review requests + bool review_requests = 15; } // ResourceAccess describes access verbs diff --git a/tool/tctl/common/auth_command.go b/tool/tctl/common/auth_command.go index 141a38e8fe46d..44e24f54b8ef2 100644 --- a/tool/tctl/common/auth_command.go +++ b/tool/tctl/common/auth_command.go @@ -88,15 +88,11 @@ type AuthCommand struct { streamTarfile bool identityWriter identityfile.ConfigWriter - rotateGracePeriod time.Duration - rotateType string - rotateManualMode bool - rotateTargetPhase string + authRotate authRotateCommand authGenerate *kingpin.CmdClause authExport *kingpin.CmdClause authSign *kingpin.CmdClause - authRotate *kingpin.CmdClause authLS *kingpin.CmdClause authCRL *kingpin.CmdClause // testInsecureSkipVerify is used to skip TLS verification during tests @@ -155,13 +151,7 @@ func (a *AuthCommand) Initialize(app *kingpin.Application, config *servicecfg.Co a.authSign.Flag("windows-sid", `Optional Security Identifier to embed in the certificate. Only used when --format is set to "windows"`).StringVar(&a.windowsSID) a.authSign.Flag("omit-cdp", `Omit CRL Distribution Points from the cert. Only used when --format is set to "windows"`).BoolVar(&a.omitCDP) - a.authRotate = auth.Command("rotate", "Rotate certificate authorities in the cluster.") - a.authRotate.Flag("grace-period", "Grace period keeps previous certificate authorities signatures valid, if set to 0 will force users to re-login and nodes to re-register."). - Default(fmt.Sprintf("%v", defaults.RotationGracePeriod)). - DurationVar(&a.rotateGracePeriod) - a.authRotate.Flag("manual", "Activate manual rotation , set rotation phases manually").BoolVar(&a.rotateManualMode) - a.authRotate.Flag("type", fmt.Sprintf("Certificate authority to rotate, one of: %s", strings.Join(getCertAuthTypes(), ", "))).Required().EnumVar(&a.rotateType, getCertAuthTypes()...) - a.authRotate.Flag("phase", fmt.Sprintf("Target rotation phase to set, used in manual rotation, one of: %v", strings.Join(types.RotatePhases, ", "))).StringVar(&a.rotateTargetPhase) + a.authRotate.Initialize(auth) a.authLS = auth.Command("ls", "List connected auth servers.") a.authLS.Flag("format", "Output format: 'yaml', 'json' or 'text'").Default(teleport.YAML).StringVar(&a.format) @@ -173,6 +163,9 @@ func (a *AuthCommand) Initialize(app *kingpin.Application, config *servicecfg.Co // TryRun takes the CLI command as an argument (like "auth gen") and executes it // or returns match=false if 'cmd' does not belong to it func (a *AuthCommand) TryRun(ctx context.Context, cmd string, client *authclient.Client) (match bool, err error) { + if match, err := a.authRotate.TryRun(ctx, cmd, client); match || err != nil { + return match, trace.Wrap(err) + } switch cmd { case a.authGenerate.FullCommand(): err = a.GenerateKeys(ctx, client) @@ -180,8 +173,6 @@ func (a *AuthCommand) TryRun(ctx context.Context, cmd string, client *authclient err = a.ExportAuthorities(ctx, client) case a.authSign.FullCommand(): err = a.GenerateAndSignKeys(ctx, client) - case a.authRotate.FullCommand(): - err = a.RotateCertAuthority(ctx, client) case a.authLS.FullCommand(): err = a.ListAuthServers(ctx, client) case a.authCRL.FullCommand(): @@ -427,30 +418,6 @@ func (a *AuthCommand) generateSnowflakeKey(ctx context.Context, clusterAPI certi writeHelperMessageDBmTLS(a.helperMsgDst(), filesWritten, "", a.outputFormat, "", a.streamTarfile)) } -// RotateCertAuthority starts or restarts certificate authority rotation process -func (a *AuthCommand) RotateCertAuthority(ctx context.Context, client *authclient.Client) error { - req := types.RotateRequest{ - Type: types.CertAuthType(a.rotateType), - GracePeriod: &a.rotateGracePeriod, - TargetPhase: a.rotateTargetPhase, - } - if a.rotateManualMode { - req.Mode = types.RotationModeManual - } else { - req.Mode = types.RotationModeAuto - } - if err := client.RotateCertAuthority(ctx, req); err != nil { - return err - } - if a.rotateTargetPhase != "" { - fmt.Printf("Updated rotation phase to %q. To check status use 'tctl status'\n", a.rotateTargetPhase) - } else { - fmt.Printf("Initiated certificate authority rotation. To check status use 'tctl status'\n") - } - - return nil -} - // ListAuthServers prints a list of connected auth servers func (a *AuthCommand) ListAuthServers(ctx context.Context, clusterAPI *authclient.Client) error { servers, err := clusterAPI.GetAuthServers() diff --git a/tool/tctl/common/auth_rotate_command.go b/tool/tctl/common/auth_rotate_command.go new file mode 100644 index 0000000000000..02a0d3205d9fc --- /dev/null +++ b/tool/tctl/common/auth_rotate_command.go @@ -0,0 +1,1347 @@ +/* + * 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 ( + "cmp" + "context" + "fmt" + "io" + "log/slog" + "os" + "strings" + "sync" + "time" + + "github.com/alecthomas/kingpin/v2" + "github.com/charmbracelet/bubbles/help" + "github.com/charmbracelet/bubbles/key" + "github.com/charmbracelet/bubbles/spinner" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/huh" + "github.com/charmbracelet/lipgloss" + "github.com/gravitational/trace" + "github.com/sirupsen/logrus" + "golang.org/x/term" + + apiclient "github.com/gravitational/teleport/api/client" + "github.com/gravitational/teleport/api/client/proto" + apidefaults "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/teleport/api/mfa" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils/prompt" + "github.com/gravitational/teleport/lib/auth/authclient" + libmfa "github.com/gravitational/teleport/lib/client/mfa" + "github.com/gravitational/teleport/lib/defaults" + logutils "github.com/gravitational/teleport/lib/utils/log" +) + +const ( + updateInterval = 3 * time.Second + maxWidth = 80 +) + +type authRotateCommand struct { + cmd *kingpin.CmdClause + interactiveMode bool + manualMode bool + caType string + targetPhase string + gracePeriod time.Duration +} + +func (c *authRotateCommand) Initialize(authCmd *kingpin.CmdClause) { + c.cmd = authCmd.Command("rotate", "Rotate certificate authorities in the cluster. Starts in interactive mode by default, provide --type to manually send rotation requests.") + c.cmd.Flag("interactive", "Enable interactive mode").BoolVar(&c.interactiveMode) + c.cmd.Flag("manual", "Activate manual rotation, set rotation phases manually").BoolVar(&c.manualMode) + c.cmd.Flag("type", fmt.Sprintf("Certificate authority to rotate, one of: %s", strings.Join(getCertAuthTypes(), ", "))).EnumVar(&c.caType, getCertAuthTypes()...) + c.cmd.Flag("phase", fmt.Sprintf("Target rotation phase to set, used in manual rotation, one of: %v", strings.Join(types.RotatePhases, ", "))).StringVar(&c.targetPhase) + c.cmd.Flag("grace-period", "Grace period keeps previous certificate authorities signatures valid, if set to 0 will force users to re-login and nodes to re-register."). + Default(fmt.Sprintf("%v", defaults.RotationGracePeriod)). + DurationVar(&c.gracePeriod) +} + +func (c *authRotateCommand) TryRun(ctx context.Context, cmd string, client *authclient.Client) (match bool, err error) { + if c.cmd.FullCommand() == cmd { + return true, trace.Wrap(c.Run(ctx, client)) + } + return false, nil +} + +func (c *authRotateCommand) Run(ctx context.Context, client *authclient.Client) error { + if c.interactiveMode { + return trace.Wrap(c.runInteractive(ctx, client)) + } + if !c.manualMode && c.caType == "" && c.targetPhase == "" && c.gracePeriod == defaults.RotationGracePeriod { + // If the user passed zero arguments, default to interactive mode. + if !term.IsTerminal(int(os.Stdin.Fd())) { + return trace.BadParameter("required flag --type not provided, not starting interactive mode because stdin does not appear to be a terminal") + } + return trace.Wrap(c.runInteractive(ctx, client)) + } + + return trace.Wrap(c.runNoninteractive(ctx, client)) +} + +func (c *authRotateCommand) runNoninteractive(ctx context.Context, client *authclient.Client) error { + if c.caType == "" { + return trace.BadParameter("required flag --type not provided") + } + req := types.RotateRequest{ + Type: types.CertAuthType(c.caType), + TargetPhase: c.targetPhase, + GracePeriod: &c.gracePeriod, + } + if c.manualMode { + req.Mode = types.RotationModeManual + } else { + req.Mode = types.RotationModeAuto + } + if err := client.RotateCertAuthority(ctx, req); err != nil { + return trace.Wrap(err) + } + if c.targetPhase != "" { + fmt.Printf("Updated rotation phase to %q. To check status use 'tctl status'\n", c.targetPhase) + } else { + fmt.Printf("Initiated certificate authority rotation. To check status use 'tctl status'\n") + } + return nil +} + +func (c *authRotateCommand) runInteractive(ctx context.Context, client *authclient.Client) error { + pingResp, err := client.Ping(ctx) + if err != nil { + return trace.Wrap(err, "failed to ping cluster") + } + m := newRotateModel(client, pingResp, types.CertAuthType(c.caType)) + p := tea.NewProgram(m, tea.WithContext(ctx)) + _, err = p.Run() + return trace.Wrap(err) +} + +type authRotateStyle struct { + formTheme *huh.Theme + normal lipgloss.Style + title lipgloss.Style + highlight lipgloss.Style + errorMessage lipgloss.Style +} + +var formTheme = huh.ThemeBase16() +var authRotateTheme = authRotateStyle{ + formTheme: formTheme, + normal: lipgloss.NewStyle(), + title: formTheme.Focused.Title, + highlight: formTheme.Focused.SelectedOption, + errorMessage: formTheme.Focused.ErrorMessage.SetString(""), +} + +type rotateModel struct { + client *authclient.Client + pingResp proto.PingResponse + + logsModel *writerModel + rotateStatusModel *rotateStatusModel + caTypeModel *caTypeModel + currentPhaseModel *currentPhaseModel + waitForCurrentPhaseReadyModel *waitForReadyModel + targetPhaseModel *targetPhaseModel + confirmed bool + sendRotateRequestModel *sendRotateRequestModel + mfaPromptModel *writerModel + waitForTargetPhaseReadyModel *waitForReadyModel + continueBinding key.Binding + newBinding key.Binding + quitBinding key.Binding + help help.Model +} + +func newRotateModel(client *authclient.Client, pingResp proto.PingResponse, caType types.CertAuthType) *rotateModel { + m := &rotateModel{ + client: client, + pingResp: pingResp, + logsModel: newWriterModel(authRotateTheme.normal), + rotateStatusModel: newRotateStatusModel(client, pingResp), + caTypeModel: newCATypeModel(caType), + mfaPromptModel: newWriterModel(authRotateTheme.errorMessage), + continueBinding: key.NewBinding(key.WithKeys("c"), key.WithHelp("c", "continue rotating selected CA")), + newBinding: key.NewBinding(key.WithKeys("n"), key.WithHelp("n", "rotate a new CA")), + quitBinding: key.NewBinding(key.WithKeys("q", "ctrl+c"), key.WithHelp("q", "quit")), + help: help.New(), + } + if caType != "" { + m.currentPhaseModel = newCurrentPhaseModel(client, pingResp, caType) + } + setupLoggers(m.logsModel) + setupMFAPrompt(client, pingResp, m.mfaPromptModel) + return m +} + +// Init implements [tea.Model]. It is the first function that will be called by +// bubbletea. +func (m *rotateModel) Init() tea.Cmd { + cmds := []tea.Cmd{ + m.rotateStatusModel.init(), + m.caTypeModel.init(), + } + if m.currentPhaseModel != nil { + cmds = append(cmds, m.currentPhaseModel.init()) + } + return tea.Batch(cmds...) +} + +// Update implements [tea.Model], it is called every time a message is received. +// The update method reacts to the message and updates the state of the model. +// All messages are passed to the update method of all active submodels, each model +// may optionally return a [tea.Cmd] to trigger future updates with new messages. +func (m *rotateModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + var cmds []tea.Cmd + switch msg := msg.(type) { + case tea.KeyMsg: + switch { + case key.Matches(msg, m.quitBinding): + return m, tea.Quit + } + } + + cmds = append(cmds, m.rotateStatusModel.update(msg)) + + cmds = append(cmds, m.caTypeModel.update(msg)) + if m.caTypeModel.caType == "" { + // Return early if the user hasn't picked a CA type yet. + return m, tea.Batch(cmds...) + } + + // Now that we have a CA type, init the current phase model if we haven't yet. + if m.currentPhaseModel == nil { + m.currentPhaseModel = newCurrentPhaseModel(m.client, m.pingResp, m.caTypeModel.caType) + cmds = append(cmds, m.currentPhaseModel.init()) + } + cmds = append(cmds, m.currentPhaseModel.update(msg)) + if m.currentPhaseModel.phase == "" { + // Return early if we haven't got the current phase yet. + return m, tea.Batch(cmds...) + } + + // Now that we've got the current phase, init the waitForCurrentPhaseReady + // model if we haven't yet and the current phase is not standby. + if m.waitForCurrentPhaseReadyModel == nil && m.currentPhaseModel.phase != "standby" { + m.waitForCurrentPhaseReadyModel = newWaitForReadyModel(m.client, m.currentPhaseModel.caID, m.currentPhaseModel.phase) + cmds = append(cmds, m.waitForCurrentPhaseReadyModel.init()) + } + if m.waitForCurrentPhaseReadyModel != nil { + cmds = append(cmds, m.waitForCurrentPhaseReadyModel.update(msg)) + if !m.waitForCurrentPhaseReadyModel.ready() { + // Return early if the current phase is not ready yet. + return m, tea.Batch(cmds...) + } + } + + // Now that we know the current phase, init the target phase model if we haven't yet. + if m.targetPhaseModel == nil { + m.targetPhaseModel = newTargetPhaseModel(m.caTypeModel.caType, m.currentPhaseModel.phase) + cmds = append(cmds, m.targetPhaseModel.init()) + } + cmds = append(cmds, m.targetPhaseModel.update(msg)) + if m.targetPhaseModel.targetPhase == "" { + // Return early if we haven't got the target phase yet. + return m, tea.Batch(cmds...) + } + + // Wait for the user to confirm the rotate request. + if !m.confirmed { + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.String() { + case "n", "N": + // Go back to the beginning. + m = newRotateModel(m.client, m.pingResp, "") + return m, m.Init() + case "y", "Y": + m.confirmed = true + default: + return m, tea.Batch(cmds...) + } + default: + return m, tea.Batch(cmds...) + } + } + + // Now that we got user confirmation, send the rotate request. + if m.sendRotateRequestModel == nil { + m.sendRotateRequestModel = newSendRotateRequestModel(m.client, m.caTypeModel.caType, m.targetPhaseModel.targetPhase) + cmds = append(cmds, m.sendRotateRequestModel.init()) + return m, tea.Batch(cmds...) + } + cmds = append(cmds, m.sendRotateRequestModel.update(msg)) + if !m.sendRotateRequestModel.success { + // Return early if the rotate request hasn't been successfully sent yet. + return m, tea.Batch(cmds...) + } + + // Now that we've sent the rotate request, init the waitForTargetPhaseReady model if we haven't yet. + if m.waitForTargetPhaseReadyModel == nil { + m.waitForTargetPhaseReadyModel = newWaitForReadyModel(m.client, m.currentPhaseModel.caID, m.targetPhaseModel.targetPhase) + cmds = append(cmds, m.waitForTargetPhaseReadyModel.init()) + } + cmds = append(cmds, m.waitForTargetPhaseReadyModel.update(msg)) + + // If we've made it this far, let the user restart with the keybinds. + switch msg := msg.(type) { + case tea.KeyMsg: + switch { + case key.Matches(msg, m.continueBinding): + newModel := newRotateModel(m.client, m.pingResp, m.caTypeModel.caType) + newModel.waitForCurrentPhaseReadyModel = m.waitForTargetPhaseReadyModel + return newModel, newModel.Init() + case key.Matches(msg, m.newBinding): + newModel := newRotateModel(m.client, m.pingResp, "") + return newModel, newModel.Init() + } + } + + return m, tea.Batch(cmds...) +} + +// View implements [tea.Model], it renders the program's UI, which is just a +// string. The view is rendered after every Update. +func (m *rotateModel) View() string { + var sb strings.Builder + writeln(&sb, m.logsModel.view()) + writeln(&sb, m.rotateStatusModel.view()) + writeln(&sb, m.caTypeModel.view()) + if m.caTypeModel.caType == "" { + return sb.String() + } + + writeln(&sb, m.currentPhaseModel.view()) + if m.currentPhaseModel.phase == "" { + return sb.String() + } + + if m.waitForCurrentPhaseReadyModel != nil && !m.confirmed { + writeln(&sb, m.waitForCurrentPhaseReadyModel.view()) + if !m.waitForCurrentPhaseReadyModel.ready() { + return sb.String() + } + } + + writeln(&sb, m.targetPhaseModel.view()) + if m.targetPhaseModel.targetPhase == "" { + return sb.String() + } + + sb.WriteString(authRotateTheme.normal.Render("Send request to rotate ")) + sb.WriteString(authRotateTheme.highlight.Render(string(m.caTypeModel.caType))) + sb.WriteString(authRotateTheme.normal.Render(" CA to ")) + sb.WriteString(authRotateTheme.highlight.Render(m.targetPhaseModel.targetPhase)) + sb.WriteString(authRotateTheme.normal.Render(" phase? (y/n): ")) + if !m.confirmed { + return sb.String() + } + writeln(&sb, authRotateTheme.highlight.PaddingBottom(1).Render("y")) + + writeln(&sb, m.sendRotateRequestModel.view()) + if !m.sendRotateRequestModel.success { + if mfaPrompt := m.mfaPromptModel.view(); len(mfaPrompt) > 0 { + writeln(&sb, mfaPrompt) + } + return sb.String() + } + + writeln(&sb, m.waitForTargetPhaseReadyModel.view()) + if !m.waitForTargetPhaseReadyModel.ready() { + return sb.String() + } + + helpBindings := []key.Binding{m.continueBinding, m.newBinding, m.quitBinding} + if m.waitForTargetPhaseReadyModel.targetPhase == "standby" { + helpBindings = helpBindings[1:] + } + writeln(&sb, authRotateTheme.normal.Render(m.help.ShortHelpView(helpBindings))) + + return sb.String() +} + +type rotateStatusModel struct { + client *authclient.Client + pingResp proto.PingResponse + spinner spinner.Model + + status *statusModel + err error +} + +func newRotateStatusModel(client *authclient.Client, pingResp proto.PingResponse) *rotateStatusModel { + status, err := newStatusModel(context.TODO(), client, pingResp) + return &rotateStatusModel{ + client: client, + pingResp: pingResp, + spinner: spinner.New(spinner.WithSpinner(spinner.Spinner{ + Frames: []string{"", ".", "..", "...", "...", "...", "...", "...", "..", ".", ""}, + FPS: time.Second / 8, + })), + status: status, + err: trace.Wrap(err), + } +} + +func (m *rotateStatusModel) updateRotateStatus(_ time.Time) tea.Msg { + rotateStatus, err := newStatusModel(context.TODO(), m.client, m.pingResp) + if err != nil { + return newTaggedMsg(err, rotateStatusTag{}) + } + return newTaggedMsg(rotateStatus, rotateStatusTag{}) +} + +type rotateStatusTag struct{} + +func (m *rotateStatusModel) init() tea.Cmd { + return tea.Batch( + tea.Tick(updateInterval, m.updateRotateStatus), + m.spinner.Tick) +} + +func (m *rotateStatusModel) update(msg tea.Msg) tea.Cmd { + msg, ok := matchTaggedMsg(msg, rotateStatusTag{}) + if !ok { + s, msg := m.spinner.Update(msg) + m.spinner = s + return msg + } + switch msg := msg.(type) { + case error: + m.err = trace.Wrap(msg) + case *statusModel: + m.status = msg + } + return tea.Tick(updateInterval, m.updateRotateStatus) +} + +func (m *rotateStatusModel) view() string { + if m.err != nil { + return authRotateTheme.errorMessage.Render("Error fetching cluster status:", m.err.Error()) + } + + var table strings.Builder + m.status.renderText(&table, false /*debug*/) + + var sb strings.Builder + sb.WriteString(authRotateTheme.title.Render("Current status")) + writeln(&sb, authRotateTheme.title.Render(m.spinner.View())) + sb.WriteString(authRotateTheme.normal. + Render(table.String())) + return sb.String() +} + +type caTypeModel struct { + caType types.CertAuthType + form *huh.Form +} + +func newCATypeModel(caType types.CertAuthType) *caTypeModel { + return &caTypeModel{ + caType: caType, + form: newSelectForm("Choose CA to rotate:", types.CertAuthTypes...), + } +} + +func (m *caTypeModel) init() tea.Cmd { + if m.caType != "" { + return nil + } + return m.form.Init() +} + +func (m *caTypeModel) update(msg tea.Msg) tea.Cmd { + if m.caType != "" { + return nil + } + form, cmd := m.form.Update(msg) + m.form = form.(*huh.Form) + if m.form.State == huh.StateCompleted { + m.caType = m.form.Get("selected").(types.CertAuthType) + } + return cmd +} + +func (m *caTypeModel) view() string { + if m.caType == "" { + return m.form.View() + } + var sb strings.Builder + sb.WriteString(authRotateTheme.normal.Render("Rotating the ")) + sb.WriteString(authRotateTheme.highlight.Render(string(m.caType))) + sb.WriteString(authRotateTheme.normal.Render(" CA.")) + return sb.String() +} + +type currentPhaseModel struct { + client *authclient.Client + pingResp proto.PingResponse + + spinner spinner.Model + caType types.CertAuthType + caID types.CertAuthID + phase string + err error +} + +func newCurrentPhaseModel(client *authclient.Client, pingResp proto.PingResponse, caType types.CertAuthType) *currentPhaseModel { + return ¤tPhaseModel{ + client: client, + pingResp: pingResp, + spinner: spinner.New(spinner.WithSpinner(spinner.Dot)), + caType: caType, + } +} + +func (m *currentPhaseModel) init() tea.Cmd { + return tea.Batch(m.getCurrentPhase, m.spinner.Tick) +} + +func (m *currentPhaseModel) getCurrentPhase() tea.Msg { + m.caID = types.CertAuthID{ + Type: m.caType, + DomainName: m.pingResp.ClusterName, + } + ca, err := m.client.GetCertAuthority(context.TODO(), m.caID, false /*loadSigningKeys*/) + if err != nil { + return newTaggedMsg(trace.Wrap(err, "failed to fetch CA status"), currentPhaseTag{}) + } + return newTaggedMsg(cmp.Or(ca.GetRotation().Phase, "standby"), currentPhaseTag{}) +} + +type currentPhaseTag struct{} + +func (m *currentPhaseModel) update(msg tea.Msg) tea.Cmd { + if m.phase != "" { + // Already got the current phase, no need for more updates. + return nil + } + msg, ok := matchTaggedMsg(msg, currentPhaseTag{}) + if !ok { + s, cmd := m.spinner.Update(msg) + m.spinner = s + return cmd + } + switch msg := msg.(type) { + case string: + m.phase = msg + case error: + m.err = trace.Wrap(msg) + return tea.Quit + } + return nil +} + +func (m *currentPhaseModel) view() string { + if m.phase == "" { + var sb strings.Builder + sb.WriteString(authRotateTheme.highlight.Render(m.spinner.View())) + sb.WriteString(authRotateTheme.normal.Render("Fetching current CA rotation phase")) + return sb.String() + } + var sb strings.Builder + sb.WriteString(authRotateTheme.normal.Render("Current rotation phase is ")) + sb.WriteString(authRotateTheme.highlight.Render(m.phase)) + sb.WriteString(authRotateTheme.normal.Render(".")) + if remaining := remainingPhases(m.phase); len(remaining) > 0 { + sb.WriteString(authRotateTheme.normal.Render("\nRemaining phases: ")) + for len(remaining) > 1 { + phase := remaining[0] + remaining = remaining[1:] + sb.WriteString(authRotateTheme.highlight.Render(phase)) + sb.WriteString(authRotateTheme.normal.Render(", ")) + } + sb.WriteString(authRotateTheme.highlight.Render(remaining[0])) + sb.WriteString(authRotateTheme.normal.Render(".")) + } + return sb.String() +} + +type targetPhaseModel struct { + caType types.CertAuthType + currentPhase string + targetPhase string + form *huh.Form +} + +func newTargetPhaseModel(caType types.CertAuthType, currentPhase string) *targetPhaseModel { + options := nextPhases(currentPhase) + if len(options) == 1 { + return &targetPhaseModel{ + caType: caType, + currentPhase: currentPhase, + targetPhase: options[0], + } + } + return &targetPhaseModel{ + caType: caType, + currentPhase: currentPhase, + form: newSelectForm("Select target phase:", options...), + } +} + +func (m *targetPhaseModel) init() tea.Cmd { + if m.form == nil { + return nil + } + return m.form.Init() +} + +func (m *targetPhaseModel) update(msg tea.Msg) tea.Cmd { + if m.targetPhase != "" { + return nil + } + form, cmd := m.form.Update(msg) + m.form = form.(*huh.Form) + if m.form.State == huh.StateCompleted { + m.targetPhase = m.form.GetString("selected") + } + return cmd +} + +func (m *targetPhaseModel) view() string { + if m.targetPhase == "" { + return m.form.View() + } + var sb strings.Builder + sb.WriteString(authRotateTheme.normal.Render("Target rotation phase is ")) + sb.WriteString(authRotateTheme.highlight.Render(m.targetPhase)) + writeln(&sb, authRotateTheme.normal.Render(".")) + sb.WriteString(authRotateTheme.normal.Width(maxWidth). + MarginTop(1).MarginBottom(1).MarginLeft(2). + Render(phaseHelpText(m.caType, m.currentPhase, m.targetPhase))) + return sb.String() +} + +type sendRotateRequestModel struct { + client *authclient.Client + spinner spinner.Model + caType types.CertAuthType + targetPhase string + success bool + err error +} + +type sendRotateRequestTag struct{} + +func newSendRotateRequestModel(client *authclient.Client, caType types.CertAuthType, targetPhase string) *sendRotateRequestModel { + return &sendRotateRequestModel{ + client: client, + spinner: spinner.New(spinner.WithSpinner(spinner.Dot)), + caType: caType, + targetPhase: targetPhase, + } +} + +func (m *sendRotateRequestModel) sendRotateRequest() tea.Msg { + err := m.client.RotateCertAuthority(context.TODO(), types.RotateRequest{ + Type: m.caType, + TargetPhase: m.targetPhase, + Mode: types.RotationModeManual, + }) + return newTaggedMsg(trace.Wrap(err), sendRotateRequestTag{}) +} + +func (m *sendRotateRequestModel) init() tea.Cmd { + return tea.Batch(m.sendRotateRequest, m.spinner.Tick) +} + +func (m *sendRotateRequestModel) update(msg tea.Msg) tea.Cmd { + if m.success { + return nil + } + msg, ok := matchTaggedMsg(msg, sendRotateRequestTag{}) + if !ok { + s, cmd := m.spinner.Update(msg) + m.spinner = s + return cmd + } + switch msg := msg.(type) { + case error: + m.err = trace.Wrap(msg) + } + if m.err == nil { + m.success = true + } + return nil +} + +func (m *sendRotateRequestModel) view() string { + if m.err != nil { + return authRotateTheme.errorMessage.Render("Error sending rotate request:", m.err.Error()) + } + if !m.success { + var sb strings.Builder + sb.WriteString(authRotateTheme.highlight.Render(m.spinner.View())) + sb.WriteString(authRotateTheme.normal.Render("Sending CA rotation request")) + return sb.String() + } + var sb strings.Builder + sb.WriteString(authRotateTheme.highlight.Render("âś“ ")) + switch m.targetPhase { + case "init": + sb.WriteString(authRotateTheme.normal.Render("Initiated certificate authority rotation.")) + default: + sb.WriteString(authRotateTheme.normal.Render("Updated rotation phase to ")) + sb.WriteString(authRotateTheme.highlight.Render(m.targetPhase)) + sb.WriteString(authRotateTheme.normal.Render(".")) + } + return sb.String() +} + +type writerModel struct { + style lipgloss.Style + buf []byte + mu sync.Mutex +} + +func newWriterModel(style lipgloss.Style) *writerModel { + return &writerModel{style: style} +} + +func (m *writerModel) view() string { + m.mu.Lock() + defer m.mu.Unlock() + if len(m.buf) == 0 { + return "" + } + // This will always be printed by the caller with writeln, remove trailing + // newlines if present. + b := m.buf + if b[len(b)-1] == '\n' { + b = b[:len(b)-1] + } + return m.style.Render(string(b)) +} + +func (m *writerModel) Write(b []byte) (int, error) { + m.mu.Lock() + defer m.mu.Unlock() + m.buf = append(m.buf, b...) + return len(b), nil +} + +type waitForReadyModel struct { + client *authclient.Client + targetPhase string + kindReadyModels []*waitForKindReadyModel + manualSteps []string + acknowledged bool + skipped bool + acknowledgeBinding key.Binding + skipBinding key.Binding + quitBinding key.Binding + help help.Model +} + +func newWaitForReadyModel(client *authclient.Client, caID types.CertAuthID, targetPhase string) *waitForReadyModel { + m := &waitForReadyModel{ + client: client, + targetPhase: targetPhase, + manualSteps: manualSteps(caID.Type, targetPhase), + acknowledgeBinding: key.NewBinding(key.WithKeys("a"), key.WithHelp("a", "acknowledge manual steps completed")), + skipBinding: key.NewBinding(key.WithKeys("s"), key.WithHelp("s", "skip all checks (unsafe)")), + quitBinding: key.NewBinding(key.WithKeys("q"), key.WithHelp("q", "quit")), + help: help.New(), + } + if caID.Type != types.HostCA { + return m + } + m.kindReadyModels = []*waitForKindReadyModel{ + newWaitForKindReadyModel( + targetPhase, "auth_servers", adaptServerGetter(client.GetAuthServers)).withMinReady(1), + newWaitForKindReadyModel( + targetPhase, "proxies", adaptServerGetter(client.GetProxies)), + newWaitForKindReadyModel( + targetPhase, "nodes", adaptServerGetter(func() ([]types.Server, error) { + return apiclient.GetAllResources[types.Server](context.TODO(), client, &proto.ListResourcesRequest{ + ResourceType: types.KindNode, + Namespace: apidefaults.Namespace, + PredicateExpression: `resource.sub_kind == ""`, + }) + })), + newWaitForKindReadyModel( + targetPhase, "app_servers", adaptServerGetter(func() ([]types.AppServer, error) { + return client.GetApplicationServers(context.TODO(), apidefaults.Namespace) + })), + newWaitForKindReadyModel( + targetPhase, "db_servers", adaptServerGetter(func() ([]types.DatabaseServer, error) { + return client.GetDatabaseServers(context.TODO(), apidefaults.Namespace) + })), + newWaitForKindReadyModel( + targetPhase, "kube_servers", adaptServerGetter(func() ([]types.KubeServer, error) { + return client.GetKubernetesServers(context.TODO()) + })), + } + return m +} + +func adaptServerGetter[T rotatable](f func() ([]T, error)) func() ([]rotatable, error) { + return func() ([]rotatable, error) { + servers, err := f() + if err != nil { + return nil, trace.Wrap(err) + } + out := make([]rotatable, len(servers)) + for i, server := range servers { + out[i] = server + } + return out, nil + } +} + +func (m *waitForReadyModel) ready() bool { + if m.skipped { + return true + } + if len(m.manualSteps) > 0 && !m.acknowledged { + return false + } + for _, kindReadyModel := range m.kindReadyModels { + if !kindReadyModel.ready() { + return false + } + } + return true +} + +func (m *waitForReadyModel) init() tea.Cmd { + var cmds []tea.Cmd + for _, kindReadyModel := range m.kindReadyModels { + cmds = append(cmds, kindReadyModel.init()) + } + return tea.Batch(cmds...) +} + +func (m *waitForReadyModel) update(msg tea.Msg) tea.Cmd { + if m.ready() { + return nil + } + switch msg := msg.(type) { + case tea.KeyMsg: + switch { + case key.Matches(msg, m.acknowledgeBinding): + m.acknowledged = true + case key.Matches(msg, m.skipBinding): + m.skipped = true + for _, kindReadyModel := range m.kindReadyModels { + kindReadyModel.skipped = true + } + } + } + var cmds []tea.Cmd + for i := range m.kindReadyModels { + if m.kindReadyModels[i].ready() { + continue + } + cmds = append(cmds, m.kindReadyModels[i].update(msg)) + } + return tea.Batch(cmds...) +} + +func (m *waitForReadyModel) view() string { + var sb strings.Builder + for _, kindReadyModel := range m.kindReadyModels { + writeln(&sb, kindReadyModel.view()) + } + manualStepPrefix := authRotateTheme.errorMessage.Render("! ") + if m.acknowledged { + manualStepPrefix = authRotateTheme.highlight.Render("âś“ ") + } + for _, manualStep := range m.manualSteps { + writeln(&sb, lipgloss.JoinHorizontal(0, + manualStepPrefix, + authRotateTheme.normal.Width(maxWidth-2).Render(manualStep), + )) + } + if !m.ready() { + helpKeys := []key.Binding{m.acknowledgeBinding, m.skipBinding, m.quitBinding} + if m.acknowledged { + helpKeys = helpKeys[1:] + } + writeln(&sb, authRotateTheme.normal.PaddingTop(1).Render( + m.help.ShortHelpView(helpKeys), + )) + } + return sb.String() +} + +type readyStatus struct { + totalCount, readyCount int +} + +type waitForKindReadyModel struct { + targetPhase string + desc string + getter func() ([]rotatable, error) + minReady int + spinner spinner.Model + readyStatus readyStatus + err error + gotFirstResponse bool + skipped bool +} + +type rotatable interface { + GetRotation() types.Rotation +} + +func newWaitForKindReadyModel(targetPhase string, desc string, getter func() ([]rotatable, error)) *waitForKindReadyModel { + return &waitForKindReadyModel{ + targetPhase: targetPhase, + desc: desc, + getter: getter, + spinner: spinner.New(spinner.WithSpinner(spinner.Dot)), + } +} + +func (m *waitForKindReadyModel) withMinReady(n int) *waitForKindReadyModel { + m.minReady = n + return m +} + +func (m *waitForKindReadyModel) getKindServersStatus() tea.Msg { + servers, err := m.getter() + if err != nil { + return newTaggedMsg(trace.Wrap(err), m.desc) + } + ready := 0 + for _, server := range servers { + phase := server.GetRotation().Phase + if phase == m.targetPhase || m.targetPhase == "standby" && phase == "" { + ready++ + } + } + return newTaggedMsg(readyStatus{totalCount: len(servers), readyCount: ready}, m.desc) +} + +func (m *waitForKindReadyModel) ready() bool { + return m.gotFirstResponse && + m.readyStatus.readyCount >= m.minReady && + m.readyStatus.readyCount == m.readyStatus.totalCount +} + +func (m *waitForKindReadyModel) init() tea.Cmd { + return tea.Batch(m.getKindServersStatus, m.spinner.Tick) +} + +func (m *waitForKindReadyModel) update(msg tea.Msg) tea.Cmd { + msg, ok := matchTaggedMsg(msg, m.desc) + if !ok { + s, cmd := m.spinner.Update(msg) + m.spinner = s + return cmd + } + switch msg := msg.(type) { + case error: + m.err = trace.Wrap(msg) + return tea.Tick(updateInterval, func(time.Time) tea.Msg { return m.getKindServersStatus() }) + case readyStatus: + m.gotFirstResponse = true + m.err = nil + m.readyStatus = msg + if m.ready() { + return nil + } + return tea.Tick(updateInterval, func(time.Time) tea.Msg { return m.getKindServersStatus() }) + } + return nil +} + +func (m *waitForKindReadyModel) view() string { + if m.err != nil { + var sb strings.Builder + sb.WriteString(authRotateTheme.errorMessage.Render("x ")) + sb.WriteString(authRotateTheme.normal.Render("Error fetching ")) + sb.WriteString(authRotateTheme.highlight.Render(m.desc)) + sb.WriteString(authRotateTheme.normal.Render(" status: ")) + sb.WriteString(authRotateTheme.errorMessage.Render(m.err.Error())) + return sb.String() + } + if m.ready() { + var sb strings.Builder + sb.WriteString(authRotateTheme.highlight.Render("âś“ ")) + if m.readyStatus.totalCount == 0 { + sb.WriteString(authRotateTheme.normal.Render("No ")) + sb.WriteString(authRotateTheme.highlight.Render(m.desc)) + sb.WriteString(authRotateTheme.normal.Render(" found.")) + return sb.String() + } + sb.WriteString(authRotateTheme.normal.Render("All ")) + sb.WriteString(authRotateTheme.highlight.Render(m.desc)) + sb.WriteString(authRotateTheme.normal.Render(" are in the ")) + sb.WriteString(authRotateTheme.highlight.Render(m.targetPhase)) + sb.WriteString(authRotateTheme.normal.Render( + fmt.Sprintf(" phase (%d/%d).", m.readyStatus.readyCount, m.readyStatus.totalCount))) + return sb.String() + } + var sb strings.Builder + if m.skipped { + sb.WriteString(authRotateTheme.errorMessage.Render("! ")) + } else { + sb.WriteString(authRotateTheme.highlight.Render(m.spinner.View())) + } + if m.gotFirstResponse { + if m.skipped { + sb.WriteString(authRotateTheme.normal.Render("Skipped waiting for ")) + } else { + sb.WriteString(authRotateTheme.normal.Render("Waiting for ")) + } + sb.WriteString(authRotateTheme.highlight.Render(m.desc)) + sb.WriteString(authRotateTheme.normal.Render(" to enter ")) + sb.WriteString(authRotateTheme.highlight.Render(m.targetPhase)) + sb.WriteString(authRotateTheme.normal.Render(fmt.Sprintf(" phase (%d/%d). ", + m.readyStatus.readyCount, m.readyStatus.totalCount))) + } else { + if m.skipped { + sb.WriteString(authRotateTheme.normal.Render("Skipped checking current rotation phase of ")) + } else { + sb.WriteString(authRotateTheme.normal.Render("Checking current rotation phase of ")) + } + sb.WriteString(authRotateTheme.highlight.Render(m.desc)) + sb.WriteString(authRotateTheme.normal.Render(". ")) + } + sb.WriteString(authRotateTheme.normal.Render(fmt.Sprintf("Run 'tctl get %s' to check status.", m.desc))) + return sb.String() + +} + +type taggedMsg[T comparable] struct { + msg tea.Msg + tag T +} + +func newTaggedMsg[T comparable](msg tea.Msg, tag T) taggedMsg[T] { + return taggedMsg[T]{ + msg: msg, + tag: tag, + } +} + +func matchTaggedMsg[T comparable](msg tea.Msg, tag T) (tea.Msg, bool) { + if msg, ok := msg.(taggedMsg[T]); ok && msg.tag == tag { + return msg.msg, true + } + return msg, false +} + +func phaseHelpText(caType types.CertAuthType, currentPhase, targetPhase string) string { + var sb strings.Builder + switch targetPhase { + case "init": + initPhaseHelpText(&sb, caType) + case "update_clients": + updateClientsPhaseHelpText(&sb, caType) + case "update_servers": + updateServersPhaseHelpText(&sb, caType) + case "rollback": + rollbackPhaseHelpText(&sb) + case "standby": + standbyPhaseHelpText(&sb, caType, currentPhase) + } + return sb.String() +} + +func initPhaseHelpText(sb *strings.Builder, caType types.CertAuthType) { + sb.WriteString("The init phase initiates a new Certificate Authority (CA) rotation. ") + sb.WriteString("New CA key pairs and certificates will be generated and must be trusted but will not yet be used.") + switch caType { + case types.HostCA: + sb.WriteString("\nDuring this phase all Teleport services will automatically begin to trust the new SSH host key and X509 CA certificate.") + } +} + +func updateClientsPhaseHelpText(sb *strings.Builder, caType types.CertAuthType) { + sb.WriteString("In the update_clients phase the new CA keys become the active signing keys for all new certificates issued by the CA. ") + sb.WriteString("Clients will immediately begin to use their new certificates, but servers will continue to use their original certificates.") + switch caType { + case types.HostCA: + sb.WriteString("\nDuring this phase, all Teleport services will automatically retrieve new certificates issued by the new CA.") + case types.OpenSSHCA: + sb.WriteString("\nAll new connections to OpenSSH hosts will begin to use certificates issued by the new CA keys.") + case types.UserCA: + sb.WriteString("\nAll new connections to Windows desktops will begin to use certificates issued by the new CA certificate. ") + case types.DatabaseClientCA: + sb.WriteString("\nAll new database connections will begin to use certificates issued by the new CA certificate.") + default: + sb.WriteString("\nAll client certificates issued by this CA must be re-issued before proceeding to the update_servers phase.") + } +} + +func updateServersPhaseHelpText(sb *strings.Builder, caType types.CertAuthType) { + sb.WriteString("In the update_servers phase servers will begin to use certificates issued by the new CA.") +} + +func rollbackPhaseHelpText(sb *strings.Builder) { + sb.WriteString("In the rollback phase the original CA keys become the active signing keys for all new certificates issued by the CA. ") + sb.WriteString("The new CA certificates/keys remain trusted until proceeding to the standby phase.") +} + +func standbyPhaseHelpText(sb *strings.Builder, caType types.CertAuthType, previousPhase string) { + sb.WriteString("The standby phase completes the ") + switch previousPhase { + case "rollback": + sb.WriteString("rollback") + default: + sb.WriteString("rotation") + } + sb.WriteByte('.') + + switch caType { + case types.HostCA: + sb.WriteString("\nAfter entering the standby phase all Teleport Services will stop trusting the ") + switch previousPhase { + case "rollback": + sb.WriteString("new CA and exclusively trust the original CA") + default: + sb.WriteString("old CA") + } + sb.WriteString(" X509 certificate and SSH key.") + } +} + +func manualSteps(caType types.CertAuthType, phase string) []string { + const trustedClusterStep = "Wait up to 30 minutes for any root or leaf clusters to follow the rotation." + const remoteReloginStep = "If you are currently using tctl remotely and logged in with tsh, you must log out and log back in." + const offlineNodesStep = "If any Teleport services may currently be offline, wait for them to come online and follow the rotation." + switch caType { + case types.HostCA: + switch phase { + case "init": + return []string{offlineNodesStep, trustedClusterStep} + case "update_clients": + return []string{offlineNodesStep, trustedClusterStep, remoteReloginStep} + case "update_servers": + return []string{ + "Any OpenSSH hosts must be issued new host certificates signed by the new CA.", + offlineNodesStep, + trustedClusterStep, + } + case "rollback": + return []string{ + "Any OpenSSH host certificates reissued during the rotation must be reissued again to revert to the original issuing CA.", + offlineNodesStep, + trustedClusterStep, + } + case "standby": + return []string{offlineNodesStep, trustedClusterStep} + } + case types.OpenSSHCA: + switch phase { + case "init": + return []string{ + "Any OpenSSH hosts must be updated to trust both the new and old CA keys.", + trustedClusterStep, + } + case "update_clients": + return []string{trustedClusterStep} + case "update_servers": + return []string{trustedClusterStep} + case "rollback": + return []string{ + "Any OpenSSH hosts updated to trust the new CA keys during the update_servers phase should be reverted to only trust the original CA keys.", + trustedClusterStep, + } + case "standby": + return []string{ + "Any OpenSSH hosts should be updated to stop trusting the CA keys that have now been rotated out.", + trustedClusterStep, + } + } + case types.UserCA: + switch phase { + case "init": + return []string{ + "All Windows desktops must be updated to trust both the new and old CA certificates.", + trustedClusterStep, + } + case "update_clients": + return []string{trustedClusterStep} + case "update_servers": + return []string{ + "Wait up to 30 hours for all user sessions to expire, or else users may have to log out and log back in.", + trustedClusterStep, + remoteReloginStep, + } + case "rollback": + return []string{ + "Any Windows desktops updated to trust the new CA certificate during the update_servers phase should be reverted to only trust the original CA certificate.", + trustedClusterStep, + } + case "standby": + return []string{ + "All Windows desktops should be updated to stop trusting the CA certificates that have now been rotated out.", + trustedClusterStep, + } + } + case types.DatabaseCA: + switch phase { + case "init": + return []string{ + "If you also need to rotate the db_client CA, rotate it to the init phase now to reconfigure self-hosted databases with new server certificates and trusted client CAs simultaneously.", + "All self-hosted databases must be issued new certificates signed by the new CA.", + } + case "rollback": + return []string{"Any self-hosted database certificates reissued during the rotation must be reissued again to revert to the original issuing CA."} + } + case types.DatabaseClientCA: + switch phase { + case "init": + return []string{ + "If you also need to rotate the db_client CA, rotate it to the init phase now to reconfigure self-hosted databases with new server certificates and trusted client CAs simultaneously.", + "All self-hosted databases must be updated to trust both the new and old CA certificates.", + } + case "standby": + return []string{"All self-hosted databases should be updated to stop trusting the CA certificates that have now been rotated out."} + } + case types.SAMLIDPCA: + switch phase { + case "update_clients": + return []string{"Any service providers that rely on the SAML IdP must by updated to trust the new CA, follow the SAML IdP guide: https://goteleport.com/docs/admin-guides/access-controls/idps/saml-guide/"} + case "rollback": + return []string{"Any service provider configuration changes made during the rotation must be reverted."} + } + case types.OIDCIdPCA: + // No manual steps required. + return nil + case types.SPIFFECA: + // TODO(strideynet): populate any known manual steps during SPIFFE CA rotation. + fallthrough + case types.OktaCA: + // TODO(smallinsky): populate any known manual steps during Okta CA rotation. + fallthrough + default: + return []string{"Consult the CA rotation docs for any manual steps that may be required: https://goteleport.com/docs/admin-guides/management/operations/ca-rotation/"} + } + return nil +} + +func nextPhases(currentPhase string) []string { + switch currentPhase { + case "standby": + return []string{"init"} + case "init": + return []string{"update_clients", "rollback"} + case "update_clients": + return []string{"update_servers", "rollback"} + case "update_servers": + return []string{"standby", "rollback"} + case "rollback": + return []string{"standby"} + } + return nil +} + +var ( + optimisticPhases = [...]string{"init", "update_clients", "update_servers", "standby"} +) + +func remainingPhases(afterPhase string) []string { + switch afterPhase { + case "standby": + return optimisticPhases[:] + case "init": + return optimisticPhases[1:] + case "update_clients": + return optimisticPhases[2:] + case "update_servers": + return optimisticPhases[3:] + case "rollback": + return []string{"standby"} + } + return nil +} + +func writeln(sb *strings.Builder, s string) { + sb.WriteString(s) + sb.WriteByte('\n') +} + +func setupLoggers(logWriter io.Writer) { + slog.SetDefault(slog.New(logutils.NewSlogTextHandler( + logWriter, + logutils.SlogTextHandlerConfig{EnableColors: true}, + ))) + logrus.StandardLogger().SetOutput(logWriter) +} + +func setupMFAPrompt(client *authclient.Client, pingResp proto.PingResponse, promptWriter io.Writer) { + client.SetMFAPromptConstructor(func(opts ...mfa.PromptOpt) mfa.Prompt { + promptCfg := libmfa.NewPromptConfig(pingResp.ProxyPublicAddr, opts...) + return libmfa.NewCLIPrompt(&libmfa.CLIPromptConfig{ + PromptConfig: *promptCfg, + Writer: promptWriter, + StdinFunc: func() prompt.StdinReader { + return brokenStdinReader{} + }, + }) + }) +} + +var errNoStdin = fmt.Errorf("interactive CA rotation does not support reading passwords from stdin") + +// brokenStdinReader implements [prompt.StdinReader] and returns errNoStdin for +// all methods. Currently this should be unnecessary because MFA for admin +// actions only applies when the only MFA method is webauthn, which should never +// prompt for a password. If we ever enable MFA for admin actions with OTP, +// we'll hit this error instead of bubbletea competing for stdin with the +// password prompt. +type brokenStdinReader struct{} + +func (brokenStdinReader) IsTerminal() bool { return true } +func (brokenStdinReader) ReadContext(_ context.Context) ([]byte, error) { return nil, errNoStdin } +func (brokenStdinReader) ReadPassword(_ context.Context) ([]byte, error) { return nil, errNoStdin } + +func newSelectForm[T comparable](title string, options ...T) *huh.Form { + keyMap := huh.NewDefaultKeyMap() + keyMap.Quit = key.NewBinding(key.WithKeys("q"), key.WithHelp("q", "quit")) + selectField := &fieldWithKeyBinds{ + Field: huh.NewSelect[T](). + Key("selected"). + Options(huh.NewOptions(options...)...). + Title(title), + keyBinds: []key.Binding{ + keyMap.Select.Up, + keyMap.Select.Down, + keyMap.Select.Submit, + keyMap.Quit, + }, + } + return huh.NewForm( + huh.NewGroup(selectField).WithKeyMap(keyMap), + ).WithTheme(authRotateTheme.formTheme) +} + +type fieldWithKeyBinds struct { + huh.Field + keyBinds []key.Binding +} + +func (f *fieldWithKeyBinds) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + field, cmd := f.Field.Update(msg) + f.Field = field.(huh.Field) + return f, cmd +} + +func (f *fieldWithKeyBinds) KeyBinds() []key.Binding { + return f.keyBinds +} diff --git a/tool/tctl/common/resource_command_test.go b/tool/tctl/common/resource_command_test.go index a3dd729d72477..b3e13e9bffb6d 100644 --- a/tool/tctl/common/resource_command_test.go +++ b/tool/tctl/common/resource_command_test.go @@ -1939,11 +1939,15 @@ func testCreateAppServer(t *testing.T, clt *authclient.Client) { kind: app_server metadata: name: my-integration + labels: + account_id: "123456789012" spec: app: kind: app metadata: name: my-integration + labels: + account_id: "123456789012" spec: uri: https://console.aws.amazon.com integration: my-integration @@ -1987,7 +1991,7 @@ version: v3 appServers := mustDecodeJSON[[]*types.AppServerV3](t, buf) require.Len(t, appServers, 1) - expectedAppServer, err := types.NewAppServerForAWSOIDCIntegration("my-integration", "c6cfe5c2-653f-4e5d-a914-bfac5a7baf38", "integration.example.com") + expectedAppServer, err := types.NewAppServerForAWSOIDCIntegration("my-integration", "c6cfe5c2-653f-4e5d-a914-bfac5a7baf38", "integration.example.com", map[string]string{"account_id": "123456789012"}) require.NoError(t, err) require.Empty(t, cmp.Diff( expectedAppServer, diff --git a/tool/tctl/common/status_command.go b/tool/tctl/common/status_command.go index 40f6e90f2f63f..38f19c79ca71e 100644 --- a/tool/tctl/common/status_command.go +++ b/tool/tctl/common/status_command.go @@ -72,22 +72,12 @@ func (c *StatusCommand) TryRun(ctx context.Context, cmd string, client *authclie // Status is called to execute "status" CLI command. func (c *StatusCommand) Status(ctx context.Context, client *authclient.Client) error { - pingRsp, err := client.Ping(ctx) + pingResp, err := client.Ping(ctx) if err != nil { return trace.Wrap(err) } - var authorities []types.CertAuthority - for _, caType := range types.CertAuthTypes { - cas, err := client.GetCertAuthorities(ctx, caType, false) - if err != nil { - slog.WarnContext(ctx, "Failed to fetch CA.", "type", caType, "error", err) - continue - } - authorities = append(authorities, cas...) - } - - status, err := newStatusModel(pingRsp, authorities) + status, err := newStatusModel(ctx, client, pingResp) if err != nil { return trace.Wrap(err) } @@ -102,18 +92,23 @@ type statusModel struct { authorities []*authorityStatusModel } -func newStatusModel(pingResp proto.PingResponse, authorities []types.CertAuthority) (*statusModel, error) { +func newStatusModel(ctx context.Context, client *authclient.Client, pingResp proto.PingResponse) (*statusModel, error) { + var authorities []types.CertAuthority + for _, caType := range types.CertAuthTypes { + cas, err := client.GetCertAuthorities(ctx, caType, false) + if err != nil { + slog.WarnContext(ctx, "Failed to fetch CA", "type", caType, "error", err) + continue + } + authorities = append(authorities, cas...) + } cluster, err := newClusterStatusModel(pingResp, authorities) if err != nil { return nil, trace.Wrap(err) } authorityModels := make([]*authorityStatusModel, 0, len(authorities)) for _, authority := range authorities { - authorityStatus, err := newAuthorityStatusModel(authority) - if err != nil { - return nil, trace.Wrap(err) - } - authorityModels = append(authorityModels, authorityStatus) + authorityModels = append(authorityModels, newAuthorityStatusModel(authority)) } return &statusModel{ cluster: cluster, @@ -132,7 +127,7 @@ func (m *statusModel) renderText(w io.Writer, debug bool) error { summaryTable.AddRow([]string{"", caPin}) } } - if _, err := io.Copy(w, summaryTable.AsBuffer()); err != nil { + if err := summaryTable.WriteTo(w); err != nil { return trace.Wrap(err) } fmt.Fprintln(w, "") @@ -163,8 +158,7 @@ func (m *statusModel) renderText(w io.Writer, debug bool) error { keysTable.AddRow(row) } } - _, err := io.Copy(w, keysTable.AsBuffer()) - return trace.Wrap(err) + return trace.Wrap(keysTable.WriteTo(w)) } // sortRows sorts the rows by each column left to right. @@ -215,14 +209,14 @@ type authorityStatusModel struct { additionalTrustedKeys []*authorityKeyModel } -func newAuthorityStatusModel(authority types.CertAuthority) (*authorityStatusModel, error) { +func newAuthorityStatusModel(authority types.CertAuthority) *authorityStatusModel { return &authorityStatusModel{ clusterName: authority.GetClusterName(), authorityType: authority.GetType(), rotationStatus: authority.GetRotation(), activeKeys: newAuthorityKeyModels(authority.GetActiveKeys()), additionalTrustedKeys: newAuthorityKeyModels(authority.GetAdditionalTrustedKeys()), - }, nil + } } type authorityKeyModel struct { 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/mfa.go b/tool/tsh/common/mfa.go index c540cce3b1228..404be014e1c0f 100644 --- a/tool/tsh/common/mfa.go +++ b/tool/tsh/common/mfa.go @@ -197,12 +197,14 @@ type mfaAddCommand struct { devName string devType string - // allowPasswordless is initially true if --allow-passwordless is set, false - // if not explicitly requested. - // It can only be set by users if wancli.IsFIDO2Available() is true. + // allowPasswordless and allowPasswordlessSet hold the state of the + // --(no-)allow-passwordless flag. + // + // allowPasswordless can only be set by users if wancli.IsFIDO2Available() is + // true. // Note that Touch ID registrations are always passwordless-capable, // regardless of other settings. - allowPasswordless bool + allowPasswordless, allowPasswordlessSet bool } func newMFAAddCommand(parent *kingpin.CmdClause) *mfaAddCommand { @@ -213,7 +215,9 @@ func newMFAAddCommand(parent *kingpin.CmdClause) *mfaAddCommand { c.Flag("type", fmt.Sprintf("Type of the new MFA device (%s)", strings.Join(defaultDeviceTypes, ", "))). EnumVar(&c.devType, defaultDeviceTypes...) if wancli.IsFIDO2Available() { - c.Flag("allow-passwordless", "Allow passwordless logins").BoolVar(&c.allowPasswordless) + c.Flag("allow-passwordless", "Allow passwordless logins"). + IsSetByUser(&c.allowPasswordlessSet). + BoolVar(&c.allowPasswordless) } return c } @@ -265,9 +269,7 @@ func (c *mfaAddCommand) run(cf *CLIConf) error { switch c.devType { case webauthnDeviceType: // Ask the user? - // c.allowPasswordless=false at this point only means that the flag wasn't - // explicitly set. - if !c.allowPasswordless && wancli.IsFIDO2Available() { + if !c.allowPasswordlessSet && wancli.IsFIDO2Available() { answer, err := prompt.PickOne(ctx, os.Stdout, prompt.Stdin(), "Allow passwordless logins", []string{"YES", "NO"}) if err != nil { return trace.Wrap(err) diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index 8c51c89641eda..eaf30fba729b2 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -2823,13 +2823,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 +2863,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 +5303,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 +5420,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/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/SlideTabs/SlideTabs.story.tsx b/web/packages/design/src/SlideTabs/SlideTabs.story.tsx index 46ff166c5cef7..bb3eb8c49818a 100644 --- a/web/packages/design/src/SlideTabs/SlideTabs.story.tsx +++ b/web/packages/design/src/SlideTabs/SlideTabs.story.tsx @@ -18,17 +18,40 @@ import React, { useState } from 'react'; -import { SlideTabs } from './SlideTabs'; +import * as Icon from 'design/Icon'; +import Flex from 'design/Flex'; + +import { SlideTabs, TabSpec } from './SlideTabs'; export default { title: 'Design/SlideTabs', }; +const threeSimpleTabs = [ + { key: 'aws', title: 'aws' }, + { key: 'automatically', title: 'automatically' }, + { key: 'manually', title: 'manually' }, +]; + +const fiveSimpleTabs = [ + { key: 'step1', title: 'step1' }, + { key: 'step2', title: 'step2' }, + { key: 'step3', title: 'step3' }, + { key: 'step4', title: 'step4' }, + { key: 'step5', title: 'step5' }, +]; + +const titlesWithIcons = [ + { key: 'alarm', icon: Icon.AlarmRing, title: 'Clocks' }, + { key: 'bots', icon: Icon.Bots, title: 'Bots' }, + { key: 'check', icon: Icon.Check, title: 'Checkmarks' }, +]; + export const ThreeTabs = () => { const [activeIndex, setActiveIndex] = useState(0); return ( @@ -39,7 +62,7 @@ export const FiveTabs = () => { const [activeIndex, setActiveIndex] = useState(0); return ( @@ -47,45 +70,148 @@ export const FiveTabs = () => { }; export const Round = () => { - const [activeIndex, setActiveIndex] = useState(0); + const [activeIndex1, setActiveIndex1] = useState(0); + const [activeIndex2, setActiveIndex2] = useState(0); return ( - + + + + ); }; export const Medium = () => { - const [activeIndex, setActiveIndex] = useState(0); + const [activeIndex1, setActiveIndex1] = useState(0); + const [activeIndex2, setActiveIndex2] = useState(0); return ( - + + + + ); }; -export const LoadingTab = () => { +export const Small = () => { + const [activeIndex1, setActiveIndex1] = useState(0); + const [activeIndex2, setActiveIndex2] = useState(0); return ( - null} - activeIndex={1} - isProcessing={true} - /> + + + + + + ); +}; + +export const StatusIcons = () => { + const [activeIndex, setActiveIndex] = useState(0); + const tabs: TabSpec[] = [ + { key: 'warning', title: 'warning', status: { kind: 'warning' } }, + { key: 'danger', title: 'danger', status: { kind: 'danger' } }, + { key: 'neutral', title: 'neutral', status: { kind: 'neutral' } }, + ]; + return ( + + + + + ); }; export const DisabledTab = () => { return ( null} activeIndex={1} disabled={true} diff --git a/web/packages/design/src/SlideTabs/SlideTabs.test.tsx b/web/packages/design/src/SlideTabs/SlideTabs.test.tsx index 12034f7b5f8aa..fe4137f34b28b 100644 --- a/web/packages/design/src/SlideTabs/SlideTabs.test.tsx +++ b/web/packages/design/src/SlideTabs/SlideTabs.test.tsx @@ -21,13 +21,19 @@ import { screen } from '@testing-library/react'; import { render, userEvent } from 'design/utils/testing'; -import { SlideTabs } from './SlideTabs'; +import * as Icon from 'design/Icon'; + +import { SlideTabs, SlideTabsProps } from './SlideTabs'; describe('design/SlideTabs', () => { it('renders the supplied number of tabs(3)', () => { render( {}} activeIndex={0} /> @@ -35,15 +41,21 @@ describe('design/SlideTabs', () => { expect(screen.getAllByRole('tab')).toHaveLength(3); - expect(screen.getByLabelText('aws')).toBeInTheDocument(); - expect(screen.getByLabelText('automatically')).toBeInTheDocument(); - expect(screen.getByLabelText('manually')).toBeInTheDocument(); + expect(getTab('aws')).toBeInTheDocument(); + expect(getTab('automatically')).toBeInTheDocument(); + expect(getTab('manually')).toBeInTheDocument(); }); it('renders the supplied number of tabs(5)', () => { render( {}} activeIndex={0} /> @@ -51,44 +63,75 @@ describe('design/SlideTabs', () => { expect(screen.getAllByRole('tab')).toHaveLength(5); - expect(screen.getByLabelText('aws')).toBeInTheDocument(); - expect(screen.getByLabelText('automatically')).toBeInTheDocument(); - expect(screen.getByLabelText('manually')).toBeInTheDocument(); - expect(screen.getByLabelText('apple')).toBeInTheDocument(); - expect(screen.getByLabelText('purple')).toBeInTheDocument(); - }); - - it('respects a custom form name', () => { - const { container } = render( - {}} - activeIndex={0} - /> - ); - - // eslint-disable-next-line testing-library/no-container, testing-library/no-node-access - expect(container.querySelectorAll('input[name=pineapple]')).toHaveLength(3); + expect(getTab('aws')).toBeInTheDocument(); + expect(getTab('automatically')).toBeInTheDocument(); + expect(getTab('manually')).toBeInTheDocument(); + expect(getTab('apple')).toBeInTheDocument(); + expect(getTab('purple')).toBeInTheDocument(); }); test('onChange highlights the tab clicked', async () => { render(); // First tab is selected by default. - expect(screen.getByRole('tab', { name: 'first' })).toHaveClass('selected'); + expect(getTab('first')).toHaveClass('selected'); // Select the second tab. await userEvent.click(screen.getByText('second')); - expect(screen.getByRole('tab', { name: 'second' })).toHaveClass('selected'); + expect(getTab('second')).toHaveClass('selected'); + + expect(getTab('first')).not.toHaveClass('selected'); + }); - expect(screen.getByRole('tab', { name: 'first' })).not.toHaveClass( - 'selected' + test('keyboard navigation and accessibility', async () => { + const user = userEvent.setup(); + render( + ); + expect(getTab('first')).not.toHaveFocus(); + expect(getTab('second')).not.toHaveFocus(); + + getTab('first').focus(); + expect(getTab('first')).toHaveAttribute('aria-selected', 'true'); + expect(getTab('first')).toHaveAttribute('aria-controls', 'tabpanel-1'); + expect(getTab('second')).toHaveAttribute('aria-selected', 'false'); + expect(getTab('second')).toHaveAttribute('aria-controls', 'tabpanel-2'); + + await user.keyboard('{Right}'); + expect(getTab('first')).toHaveAttribute('aria-selected', 'false'); + expect(getTab('second')).toHaveAttribute('aria-selected', 'true'); + expect(getTab('second')).toHaveFocus(); + + // Should be a no-op. + await user.keyboard('{Right}'); + expect(getTab('first')).toHaveAttribute('aria-selected', 'false'); + expect(getTab('second')).toHaveAttribute('aria-selected', 'true'); + expect(getTab('second')).toHaveFocus(); + + await user.keyboard('{Left}'); + expect(getTab('first')).toHaveAttribute('aria-selected', 'true'); + expect(getTab('second')).toHaveAttribute('aria-selected', 'false'); + expect(getTab('first')).toHaveFocus(); + + // Should be a no-op. + await user.keyboard('{Left}'); + expect(getTab('first')).toHaveAttribute('aria-selected', 'true'); + expect(getTab('second')).toHaveAttribute('aria-selected', 'false'); + expect(getTab('first')).toHaveFocus(); }); }); -const Component = () => { +const Component = (props: Partial) => { const [activeIndex, setActiveIndex] = useState(0); return ( @@ -96,6 +139,9 @@ const Component = () => { onChange={setActiveIndex} tabs={['first', 'second']} activeIndex={activeIndex} + {...props} /> ); }; + +const getTab = (name: string) => screen.getByRole('tab', { name }); diff --git a/web/packages/design/src/SlideTabs/SlideTabs.tsx b/web/packages/design/src/SlideTabs/SlideTabs.tsx index 59f636fb8f0f7..9a81f79fd99ac 100644 --- a/web/packages/design/src/SlideTabs/SlideTabs.tsx +++ b/web/packages/design/src/SlideTabs/SlideTabs.tsx @@ -16,65 +16,148 @@ * along with this program. If not, see . */ -import React from 'react'; -import styled from 'styled-components'; +import React, { useEffect, useRef } from 'react'; +import styled, { useTheme } from 'styled-components'; -import { Indicator, Text } from '..'; +import { Flex, Indicator } from 'design'; +import { IconProps } from 'design/Icon/Icon'; +import { HoverTooltip } from 'design/Tooltip'; +import { Position } from 'design/Popover/Popover'; +import { StatusIcon, StatusKind } from 'design/StatusIcon'; export function SlideTabs({ appearance = 'square', activeIndex = 0, - name = 'slide-tab', onChange, - size = 'xlarge', + size = 'large', tabs, isProcessing = false, disabled = false, -}: props) { + fitContent = false, + hideStatusIconOnActiveTab, +}: SlideTabsProps) { + const theme = useTheme(); + const activeTab = useRef(null); + const tabContainer = useRef(null); + + useEffect(() => { + // Note: this is important for accessibility; the screen reader may ignore + // tab changing if we focus the tab list, and not the tab. + if (tabContainer.current?.contains?.(document.activeElement)) { + activeTab.current?.focus(); + } + }, [activeIndex]); + + function handleKeyDown(e: React.KeyboardEvent) { + if (e.key === 'ArrowRight' && activeIndex < tabs.length - 1) { + onChange(activeIndex + 1); + } + if (e.key === 'ArrowLeft' && activeIndex > 0) { + onChange(activeIndex - 1); + } + } + + // The component structure was designed according to + // https://www.w3.org/WAI/ARIA/apg/patterns/tabs/examples/tabs-automatic/. return ( - - - {tabs.map((tabName, tabIndex) => { + // A container that displays background and sets up padding for the slider + // area. It's separate from the tab list itself, since we need to + // absolutely position the slider relative to this container's content box, + // and not its padding box. So we set up padding if needed on this one, and + // then position the slider against the tab list. + + + {tabs.map((tabSpec, tabIndex) => { const selected = tabIndex === activeIndex; - let onClick; + const { + key, + title, + icon: Icon, + ariaLabel, + controls, + tooltip: { + content: tooltipContent, + position: tooltipPosition, + } = {}, + status: { kind: statusKind, ariaLabel: statusAriaLabel } = {}, + } = toFullTabSpec(tabSpec, tabIndex); + const statusIconColorActive = hideStatusIconOnActiveTab + ? 'transparent' + : theme.colors.text.primaryInverse; + + let onClick = undefined; if (!disabled && !isProcessing) { - onClick = (e: React.MouseEvent) => { + onClick = (e: React.MouseEvent) => { e.preventDefault(); onChange(tabIndex); }; } + return ( - - - {selected && isProcessing && } - {tabName} - - - + + {/* We need a separate tab content component, since the status + icon, when displayed, shouldn't take up space to prevent + layout jumping. TabContent serves as a positioning anchor + whose left edge is the left edge of the content (not the tab + button, which can be much wider). */} + + + + + {Icon && } + {title} + + + ); })} - - + {/* The tab slider is positioned absolutely and appears below the + actual tab button. The outer component is responsible for + establishing the part of parent's width where the slider appears, + and the internal slider may (or may not, depending on the control + size) include additional padding that separates tabs. */} + + + + ); } -type props = { +export type SlideTabsProps = { /** * The style to render the selector in. */ @@ -83,11 +166,6 @@ type props = { * The index that you'd like to select on the initial render. */ activeIndex: number; - /** - * The name you'd like to use for the form if using multiple tabs on the page. - * Default: "slide-tab" - */ - name?: string; /** * To be notified when the selected tab changes supply it with this fn. */ @@ -95,11 +173,11 @@ type props = { /** * The size to render the selector in. */ - size?: 'xlarge' | 'medium'; + size?: Size; /** - * A list of tab names that you'd like displayed in the list of tabs. + * A list of tab specs that you'd like displayed in the list of tabs. */ - tabs: string[]; + tabs: TabSpec[]; /** * If true, renders a spinner and disables clicking on the tabs. * @@ -112,77 +190,254 @@ type props = { * If true, disables pointer events. */ disabled?: boolean; + /** + * If true, the control doesn't take as much horizontal space as possible, + * but instead wraps its contents. + */ + fitContent?: boolean; + /** + * Hides the status icon on active tab. Note that this is not the same as + * simply making some tab's `tabSpec.status` field set conditionally on + * whether that tab is active or not. Using this field provides a smooth + * animation for transitions between active and inactive state. + */ + hideStatusIconOnActiveTab?: boolean; }; -export type TabComponent = { - name: string; - component: React.ReactNode; +/** + * Definition of a tab. If it's a string, it denotes a title displayed on the + * tab. It's recommended to use a full object with tab panel ID for better + * accessibility. + * + * TODO(bl-nero): remove the string option once Enterprise is migrated to + * simplify it a bit. + */ +export type TabSpec = string | FullTabSpec; + +type FullTabSpec = TabContentSpec & { + /** Iteration key for the tab. */ + key: React.Key; + /** + * ID of the controlled element for accessibility, perhaps autogenerated + * with an `useId()` hook. The indicated element should have a `role` + * attribute set to "tabpanel". + */ + controls?: string; + tooltip?: { + content: React.ReactNode; + position?: Position; + }; + /** + * An icon that will be displayed on the side. The layout will stay the same + * whether the icon is there or not. If `isProcessing` prop is set to `true`, + * the icon for an active tab is replaced by a spinner. + */ + status?: { + kind: StatusKind; + ariaLabel?: string; + }; }; -const Wrapper = styled.div` +/** + * Tab content. Either an icon with a mandatory accessible label, or a + * decorative icon with accompanying text. + */ +type TabContentSpec = + | { + /** Title displayed on the tab. */ + title: string; + ariaLabel?: never; + /** Icon displayed on the tab. */ + icon?: React.ComponentType; + } + | { + title?: never; + /** Accessible label for the tab. */ + ariaLabel: string; + /** Icon displayed on the tab. */ + icon: React.ComponentType; + }; + +function toFullTabSpec(spec: TabSpec, index: number): FullTabSpec { + if (typeof spec !== 'string') return spec; + return { + key: index, + title: spec, + }; +} + +function StatusIconOrSpinner({ + showSpinner, + statusKind, + size, + color, + ariaLabel, +}: { + showSpinner: boolean; + statusKind: StatusKind | undefined; + size: Size; + color: string | undefined; + ariaLabel: string | undefined; +}) { + if (showSpinner) { + return ; + } + + // This is one of these rare cases when there is a difference between + // property being undefined and not present at all: undefined props would + // override the default ones, but we want it them to interfere at all. + const optionalProps: { color?: string; 'aria-label'?: string } = {}; + if (color !== undefined) { + optionalProps.color = color; + } + if (ariaLabel !== undefined) { + optionalProps['aria-label'] = ariaLabel; + } + + if (!statusKind) { + return null; + } + + return ( + + ); +} + +const TabSliderInner = styled.div<{ appearance: Appearance }>` + height: 100%; + background-color: ${({ theme }) => theme.colors.brand}; + border-radius: ${props => (props.appearance === 'square' ? '8px' : '60px')}; +`; + +const Wrapper = styled.div<{ + fitContent: boolean; + size: Size; + appearance: Appearance; +}>` position: relative; + ${props => (props.fitContent ? 'width: fit-content;' : '')} + /* + * For the small size, we don't use paddings between tab buttons. Therefore, + * the area of tab list is evenly divided into segments, and we anchor the + * slider relative to the box with horizontal padding. With larger sizes, we + * expect to have some distance between the tab buttons. It means that the + * positions of the slider, expressed as relative to what the padding box + * would be, are no longer proportional to the tab index (there is distance + * between the tabs, but no distance on the left of the first tab and on the + * right of the last tab). Therefore, to calculate the position of slider as + * a percentage of its container's width, we set the wrapper's horizontal + * padding to 0, thus giving us a couple of pixels of breathing room; now we + * can go back to using a linear formula to calculate the slider position. + * This lack of padding will be then compensated for by adjusting tab button + * margins appropriately. + */ + padding: ${props => (props.size === 'small' ? '4px 4px' : '8px 0')}; + background-color: ${props => props.theme.colors.interactive.tonal.neutral[0]}; + border-radius: ${props => (props.appearance === 'square' ? '8px' : '60px')}; + + &:has(:focus-visible) ${TabSliderInner} { + outline: 2px solid ${props => props.theme.colors.brand}; + outline-offset: 1px; + } `; -const TabLabel = styled.label<{ - itemCount: number; +const tabButtonHeight = ({ size }: { size: Size }) => { + switch (size) { + case 'large': + return { height: '40px' }; + case 'medium': + return { height: '36px' }; + case 'small': + return { height: '32px' }; + } +}; + +const TabButton = styled.button<{ processing?: boolean; disabled?: boolean; + selected?: boolean; + size: Size; }>` + /* Reset the button styles. */ + font-family: inherit; + text-decoration: inherit; + outline: none; + border: none; + background: transparent; + padding: ${props => (props.size === 'small' ? '8px 8px' : '8px 16px')}; + + ${props => props.theme.typography.body2} + cursor: ${p => (p.processing || p.disabled ? 'default' : 'pointer')}; display: flex; + align-items: center; justify-content: center; - padding: 10px; - width: ${props => 100 / props.itemCount}%; z-index: 1; /* Ensures that the label is above the background slider. */ opacity: ${p => (p.processing || p.disabled ? 0.5 : 1)}; -`; + ${tabButtonHeight} + /* + * Using similar logic as with wrapper padding, we compensate for the lack of + * thereof with button margins if needed. + */ + margin: 0 ${props => (props.size === 'small' ? '0' : '8px')}; + color: ${props => + props.selected + ? props.theme.colors.text.primaryInverse + : props.theme.colors.text.main}; -const TabInput = styled.input` - display: none; + transition: color 0.2s ease-in 0s; `; type Appearance = 'square' | 'round'; -type Size = 'xlarge' | 'medium'; +type Size = 'large' | 'medium' | 'small'; const TabSlider = styled.div<{ - appearance: Appearance; itemCount: number; size: Size; activeIndex: number; }>` - background-color: ${({ theme }) => theme.colors.brand}; - border-radius: ${props => (props.appearance === 'square' ? '8px' : '60px')}; - box-shadow: 0px 2px 6px rgba(12, 12, 14, 0.1); - height: ${props => (props.size === 'xlarge' ? '56px' : '40px')}; - left: calc(${props => (100 / props.itemCount) * props.activeIndex}% + 8px); - margin: ${props => - props.size === 'xlarge' ? '12px 12px 12px 0' : '4px 4px 4px 0'}; + box-sizing: border-box; position: absolute; + left: ${props => (100 / props.itemCount) * props.activeIndex}%; top: 0; - transition: all 0.3s ease; - width: calc(${props => 100 / props.itemCount}% - 16px); + bottom: 0; + width: ${props => 100 / props.itemCount}%; + padding: 0 ${props => (props.size === 'small' ? '0' : '8px')}; + transition: + all 0.3s ease, + outline 0s, + outline-offset 0s; `; -const TabNav = styled.nav<{ appearance: Appearance; size: Size }>` +const TabList = styled.div<{ itemCount: number }>` + position: relative; align-items: center; - background-color: ${props => props.theme.colors.spotBackground[0]}; - border-radius: ${props => (props.appearance === 'square' ? '8px' : '60px')}; - display: flex; - height: ${props => (props.size === 'xlarge' ? '80px' : '47px')}; + /* + * Grid display allows us to allocate equal amount of space for every tab + * (which is important for calculating the slider position) and at the same + * time support the "fit content" mode. (It's impossible to do in the flex + * layout.) + */ + display: grid; + grid-template-columns: repeat(${props => props.itemCount}, 1fr); justify-content: space-around; color: ${props => props.theme.colors.text.main}; - .selected { - color: ${props => props.theme.colors.text.primaryInverse}; - transition: color 0.2s ease-in 0s; - } `; const Spinner = styled(Indicator)` color: ${p => p.theme.colors.levels.deep}; +`; + +const StatusIconContainer = styled.div` position: absolute; - left: -${p => p.theme.space[4]}px; + left: -${p => p.theme.space[5]}px; `; -const Box = styled.div` +const TabContent = styled(Flex)` position: relative; `; diff --git a/web/packages/design/src/StatusIcon/StatusIcon.story.tsx b/web/packages/design/src/StatusIcon/StatusIcon.story.tsx new file mode 100644 index 0000000000000..5c9897c6d3896 --- /dev/null +++ b/web/packages/design/src/StatusIcon/StatusIcon.story.tsx @@ -0,0 +1,44 @@ +/** + * 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 . + */ + +import { StoryObj } from '@storybook/react'; + +import Flex from 'design/Flex'; + +import { StatusIcon } from '.'; + +export default { + title: 'Design', +}; + +export const Story: StoryObj = { + name: 'StatusIcon', + render() { + return ( + + {(['neutral', 'danger', 'info', 'warning', 'success'] as const).map( + status => ( + + {status} + + ) + )} + + ); + }, +}; diff --git a/web/packages/design/src/StatusIcon/StatusIcon.tsx b/web/packages/design/src/StatusIcon/StatusIcon.tsx new file mode 100644 index 0000000000000..08fe46a020b22 --- /dev/null +++ b/web/packages/design/src/StatusIcon/StatusIcon.tsx @@ -0,0 +1,78 @@ +/** + * 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 . + */ + +import React from 'react'; + +import { useTheme } from 'styled-components'; + +import * as Icon from 'design/Icon'; +import { IconProps } from 'design/Icon/Icon'; + +export type StatusKind = 'neutral' | 'danger' | 'info' | 'warning' | 'success'; + +export const StatusIcon = ({ + kind, + customIcon: CustomIcon, + ...otherProps +}: { + kind: StatusKind; + customIcon?: React.ComponentType; +} & IconProps) => { + const commonProps = { role: 'graphics-symbol', ...otherProps }; + const theme = useTheme(); + + if (CustomIcon) { + return ; + } + switch (kind) { + case 'success': + return ( + + ); + case 'danger': + return ( + + ); + case 'info': + return ( + + ); + case 'warning': + return ( + + ); + case 'neutral': + return ; + } +}; diff --git a/web/packages/design/src/StatusIcon/index.ts b/web/packages/design/src/StatusIcon/index.ts new file mode 100644 index 0000000000000..7c674b723d6af --- /dev/null +++ b/web/packages/design/src/StatusIcon/index.ts @@ -0,0 +1,19 @@ +/** + * 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 . + */ + +export { StatusIcon, type StatusKind } from './StatusIcon'; diff --git a/web/packages/shared/components/ToolTip/HoverTooltip.tsx b/web/packages/design/src/Tooltip/HoverTooltip.tsx similarity index 98% rename from web/packages/shared/components/ToolTip/HoverTooltip.tsx rename to web/packages/design/src/Tooltip/HoverTooltip.tsx index e9e16bba58359..6dbaab58bdf0a 100644 --- a/web/packages/shared/components/ToolTip/HoverTooltip.tsx +++ b/web/packages/design/src/Tooltip/HoverTooltip.tsx @@ -18,6 +18,7 @@ import React, { PropsWithChildren, useState } from 'react'; import styled, { useTheme } from 'styled-components'; + import { Popover, Flex, Text } from 'design'; import { JustifyContentProps, FlexBasisProps } from 'design/system'; @@ -64,6 +65,7 @@ export const HoverTooltip: React.FC< // whether we want to show the tooltip. if ( target instanceof Element && + target.parentElement && target.scrollWidth > target.parentElement.offsetWidth ) { setAnchorEl(event.currentTarget); @@ -75,7 +77,7 @@ export const HoverTooltip: React.FC< } function handlePopoverClose() { - setAnchorEl(null); + setAnchorEl(undefined); } // Don't render the tooltip if the content is undefined. diff --git a/web/packages/shared/components/ToolTip/ToolTip.story.tsx b/web/packages/design/src/Tooltip/IconTooltip.story.tsx similarity index 82% rename from web/packages/shared/components/ToolTip/ToolTip.story.tsx rename to web/packages/design/src/Tooltip/IconTooltip.story.tsx index 1830fc4902e12..8062ae357752a 100644 --- a/web/packages/shared/components/ToolTip/ToolTip.story.tsx +++ b/web/packages/design/src/Tooltip/IconTooltip.story.tsx @@ -17,17 +17,19 @@ */ import React from 'react'; -import { Text, Flex, ButtonPrimary } from 'design'; import styled, { useTheme } from 'styled-components'; + +import { Text, Flex, ButtonPrimary } from 'design'; import { P } from 'design/Text/Text'; -import { logos } from 'teleport/components/LogoHero/LogoHero'; +import AGPLLogoLight from 'design/assets/images/agpl-light.svg'; +import AGPLLogoDark from 'design/assets/images/agpl-dark.svg'; -import { ToolTipInfo } from './ToolTip'; +import { IconTooltip } from './IconTooltip'; import { HoverTooltip } from './HoverTooltip'; export default { - title: 'Shared/ToolTip', + title: 'Design/Tooltip', }; export const ShortContent = () => ( @@ -36,25 +38,25 @@ export const ShortContent = () => ( Hover the icon - "some popover content" + "some popover content"
Hover the icon - "some popover content" + "some popover content"
Hover the icon - "some popover content" + "some popover content"
Hover the icon - "some popover content" + "some popover content"
); @@ -65,13 +67,18 @@ const Grid = styled.div` grid-template-rows: repeat(3, 100px); `; +const logos = { + light: AGPLLogoLight, + dark: AGPLLogoDark, +}; + export const LongContent = () => { const theme = useTheme(); return ( <> Hover the icon - +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim @@ -84,7 +91,7 @@ export const LongContent = () => { cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

-
+

Here's some content that shouldn't interfere with the semi-transparent @@ -92,7 +99,7 @@ export const LongContent = () => {

- +
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim @@ -113,7 +120,7 @@ export const WithMutedIconColor = () => ( Hover the icon - "some popover content" + "some popover content" ); @@ -122,7 +129,7 @@ export const WithKindWarning = () => ( Hover the icon - "some popover content" + "some popover content" ); @@ -131,7 +138,7 @@ export const WithKindError = () => ( Hover the icon - "some popover content" + "some popover content" ); diff --git a/web/packages/shared/components/ToolTip/ToolTip.tsx b/web/packages/design/src/Tooltip/IconTooltip.tsx similarity index 95% rename from web/packages/shared/components/ToolTip/ToolTip.tsx rename to web/packages/design/src/Tooltip/IconTooltip.tsx index f80a3a6342b91..e7434272fe6f3 100644 --- a/web/packages/shared/components/ToolTip/ToolTip.tsx +++ b/web/packages/design/src/Tooltip/IconTooltip.tsx @@ -27,7 +27,7 @@ import { anchorOriginForPosition, transformOriginForPosition } from './shared'; type ToolTipKind = 'info' | 'warning' | 'error'; -export const ToolTipInfo: React.FC< +export const IconTooltip: React.FC< PropsWithChildren<{ trigger?: 'click' | 'hover'; position?: Position; @@ -46,15 +46,15 @@ export const ToolTipInfo: React.FC< kind = 'info', }) => { const theme = useTheme(); - const [anchorEl, setAnchorEl] = useState(); + const [anchorEl, setAnchorEl] = useState(); const open = Boolean(anchorEl); - function handlePopoverOpen(event) { + function handlePopoverOpen(event: React.MouseEvent) { setAnchorEl(event.currentTarget); } function handlePopoverClose() { - setAnchorEl(null); + setAnchorEl(undefined); } const triggerOnHoverProps = { @@ -121,8 +121,6 @@ const ToolTipIcon = ({ return ; case 'error': return ; - default: - kind satisfies never; } }; diff --git a/web/packages/teleterm/src/ui/ModalsHost/modals/AuthenticateWebDevice/AuthenticateWebDevice.story.tsx b/web/packages/design/src/Tooltip/index.ts similarity index 55% rename from web/packages/teleterm/src/ui/ModalsHost/modals/AuthenticateWebDevice/AuthenticateWebDevice.story.tsx rename to web/packages/design/src/Tooltip/index.ts index b6f35a6e673f2..1be43077b8952 100644 --- a/web/packages/teleterm/src/ui/ModalsHost/modals/AuthenticateWebDevice/AuthenticateWebDevice.story.tsx +++ b/web/packages/design/src/Tooltip/index.ts @@ -16,24 +16,5 @@ * along with this program. If not, see . */ -import React from 'react'; - -import { makeRootCluster } from 'teleterm/services/tshd/testHelpers'; -import { MockAppContextProvider } from 'teleterm/ui/fixtures/MockAppContextProvider'; - -import { AuthenticateWebDevice } from './AuthenticateWebDevice'; - -export default { - title: 'Teleterm/ModalsHost/AuthenticateWebDevice', -}; - -export const Dialog = () => ( - - {}} - onCancel={() => {}} - onAuthorize={async () => {}} - /> - -); +export { IconTooltip } from './IconTooltip'; +export { HoverTooltip } from './HoverTooltip'; diff --git a/web/packages/shared/components/ToolTip/shared.tsx b/web/packages/design/src/Tooltip/shared.tsx similarity index 100% rename from web/packages/shared/components/ToolTip/shared.tsx rename to web/packages/design/src/Tooltip/shared.tsx diff --git a/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx b/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx index 998245bbc58da..35cfac569c462 100644 --- a/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx +++ b/web/packages/shared/components/AccessRequests/AccessDuration/AccessDurationRequest.tsx @@ -19,8 +19,9 @@ import React from 'react'; import { Flex, LabelInput, Text } from 'design'; +import { IconTooltip } from 'design/Tooltip'; + import Select, { Option } from 'shared/components/Select'; -import { ToolTipInfo } from 'shared/components/ToolTip'; export function AccessDurationRequest({ maxDuration, @@ -35,11 +36,11 @@ export function AccessDurationRequest({ Access Duration - + How long you would be given elevated privileges. Note that the time it takes to approve this request will be subtracted from the duration you requested. - + Access Request Lifetime - + The max duration of an access request, starting from its creation, until it expires. - + {getFormattedDurationTxt({ diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx index 775c10f356267..fd4bc1578869d 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx @@ -39,6 +39,8 @@ import { ArrowBack, ChevronDown, ChevronRight, Warning } from 'design/Icon'; import Table, { Cell } from 'design/DataTable'; import { Danger } from 'design/Alert'; +import { HoverTooltip } from 'design/Tooltip'; + import Validation, { useRule, Validator } from 'shared/components/Validation'; import { Attempt } from 'shared/hooks/useAttemptNext'; import { pluralize } from 'shared/utils/text'; @@ -47,7 +49,6 @@ import { FieldCheckbox } from 'shared/components/FieldCheckbox'; import { mergeRefs } from 'shared/libs/mergeRefs'; import { TextSelectCopyMulti } from 'shared/components/TextSelectCopy'; import { RequestableResourceKind } from 'shared/components/AccessRequests/NewRequest/resource'; -import { HoverTooltip } from 'shared/components/ToolTip'; import { CreateRequest } from '../../Shared/types'; import { AssumeStartTime } from '../../AssumeStartTime/AssumeStartTime'; diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.tsx index 6a93e92656ac0..c21e4295c3afc 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestReview/RequestReview.tsx @@ -22,12 +22,13 @@ import { ButtonPrimary, Text, Box, Alert, Flex, Label, H3 } from 'design'; import { Warning } from 'design/Icon'; import { Radio } from 'design/RadioGroup'; +import { HoverTooltip } from 'design/Tooltip'; + import Validation, { Validator } from 'shared/components/Validation'; import { FieldSelect } from 'shared/components/FieldSelect'; import { Option } from 'shared/components/Select'; import { Attempt } from 'shared/hooks/useAsync'; import { requiredField } from 'shared/components/Validation/rules'; -import { HoverTooltip } from 'shared/components/ToolTip'; import { FieldTextArea } from 'shared/components/FieldTextArea'; import { AccessRequest, RequestState } from 'shared/services/accessRequests'; diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.test.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.test.tsx new file mode 100644 index 0000000000000..1ee774c4d75ae --- /dev/null +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.test.tsx @@ -0,0 +1,71 @@ +/** + * 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 . + */ + +import { render, screen } from 'design/utils/testing'; + +import { makeEmptyAttempt, makeSuccessAttempt } from 'shared/hooks/useAsync'; + +import { requestRolePending } from '../../fixtures'; + +import { RequestView, RequestViewProps } from './RequestView'; +import { RequestFlags } from './types'; + +const sampleFlags: RequestFlags = { + canAssume: false, + isAssumed: false, + canDelete: false, + canReview: true, + ownRequest: false, + isPromoted: false, +}; + +const props: RequestViewProps = { + user: 'loggedInUsername', + fetchRequestAttempt: makeSuccessAttempt(requestRolePending), + submitReviewAttempt: makeEmptyAttempt(), + getFlags: () => sampleFlags, + confirmDelete: false, + toggleConfirmDelete: () => null, + submitReview: () => null, + assumeRole: () => null, + fetchSuggestedAccessListsAttempt: makeSuccessAttempt([]), + assumeRoleAttempt: makeEmptyAttempt(), + assumeAccessList: () => null, + deleteRequestAttempt: makeEmptyAttempt(), + deleteRequest: () => null, +}; + +const reviewBoxText = `${props.user} - add a review`; + +test('renders review box if user can review', async () => { + render(); + expect(screen.getByText(reviewBoxText)).toBeInTheDocument(); +}); + +test('does not render review box if user cannot review', async () => { + render( + ({ + ...sampleFlags, + canReview: false, + })} + /> + ); + expect(screen.queryByText(reviewBoxText)).not.toBeInTheDocument(); +}); diff --git a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx index 3bebbf52fc0b4..9a3e424787378 100644 --- a/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx +++ b/web/packages/shared/components/AccessRequests/ReviewRequests/RequestView/RequestView.tsx @@ -42,7 +42,8 @@ import { displayDateWithPrefixedTime } from 'design/datetime'; import { LabelKind } from 'design/LabelState/LabelState'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; + import { hasFinished, Attempt } from 'shared/hooks/useAsync'; import { diff --git a/web/packages/shared/components/AccessRequests/Shared/Shared.tsx b/web/packages/shared/components/AccessRequests/Shared/Shared.tsx index 97bf6987b2d6e..2159f6309c95e 100644 --- a/web/packages/shared/components/AccessRequests/Shared/Shared.tsx +++ b/web/packages/shared/components/AccessRequests/Shared/Shared.tsx @@ -21,7 +21,8 @@ import { ButtonPrimary, Text, Box, ButtonIcon, Menu } from 'design'; import { Info } from 'design/Icon'; import { displayDateWithPrefixedTime } from 'design/datetime'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; + import { AccessRequest } from 'shared/services/accessRequests'; export function PromotedMessage({ diff --git a/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx b/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx index 6800783daba6a..ea37fe2de003d 100644 --- a/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx +++ b/web/packages/shared/components/AdvancedSearchToggle/AdvancedSearchToggle.tsx @@ -22,7 +22,7 @@ import { Text, Toggle, Link, Flex, H2 } from 'design'; import { P } from 'design/Text/Text'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; const GUIDE_URL = 'https://goteleport.com/docs/reference/predicate-language/#resource-filtering'; @@ -44,9 +44,9 @@ export function AdvancedSearchToggle(props: { > Advanced - + - + ); } diff --git a/web/packages/shared/components/ClusterDropdown/ClusterDropdown.tsx b/web/packages/shared/components/ClusterDropdown/ClusterDropdown.tsx index eb9babb16f43c..60846510fe90d 100644 --- a/web/packages/shared/components/ClusterDropdown/ClusterDropdown.tsx +++ b/web/packages/shared/components/ClusterDropdown/ClusterDropdown.tsx @@ -24,7 +24,7 @@ import { ChevronDown } from 'design/Icon'; import cfg from 'teleport/config'; import { Cluster } from 'teleport/services/clusters'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; export interface ClusterDropdownProps { clusterLoader: ClusterLoader; diff --git a/web/packages/shared/components/FieldInput/FieldInput.tsx b/web/packages/shared/components/FieldInput/FieldInput.tsx index e8fceadf12214..1ea08bf39ed8f 100644 --- a/web/packages/shared/components/FieldInput/FieldInput.tsx +++ b/web/packages/shared/components/FieldInput/FieldInput.tsx @@ -28,8 +28,9 @@ import styled, { useTheme } from 'styled-components'; import { IconProps } from 'design/Icon/Icon'; import { InputMode, InputSize, InputType } from 'design/Input'; +import { IconTooltip } from 'design/Tooltip'; + import { useRule } from 'shared/components/Validation'; -import { ToolTipInfo } from 'shared/components/ToolTip'; const FieldInput = forwardRef( ( @@ -113,7 +114,7 @@ const FieldInput = forwardRef( > {label} - + ) : ( <>{label} diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx index 5362236a8b24d..2f798d4d923d1 100644 --- a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx @@ -20,6 +20,12 @@ import React, { useState } from 'react'; import Box from 'design/Box'; +import { Button } from 'design/Button'; + +import Validation from 'shared/components/Validation'; + +import { arrayOf, requiredField } from '../Validation/rules'; + import { FieldMultiInput } from './FieldMultiInput'; export default { @@ -30,7 +36,21 @@ export function Story() { const [items, setItems] = useState([]); return ( - + + {({ validator }) => ( + <> + + + + )} + ); } diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx index ce023a071053a..89b191e1e5b2d 100644 --- a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx @@ -19,20 +19,36 @@ import userEvent from '@testing-library/user-event'; import React, { useState } from 'react'; -import { render, screen } from 'design/utils/testing'; +import { act, render, screen } from 'design/utils/testing'; + +import Validation, { Validator } from 'shared/components/Validation'; + +import { arrayOf, requiredField } from '../Validation/rules'; import { FieldMultiInput, FieldMultiInputProps } from './FieldMultiInput'; const TestFieldMultiInput = ({ onChange, + refValidator, ...rest -}: Partial) => { +}: Partial & { + refValidator?: (v: Validator) => void; +}) => { const [items, setItems] = useState([]); const handleChange = (it: string[]) => { setItems(it); onChange?.(it); }; - return ; + return ( + + {({ validator }) => { + refValidator?.(validator); + return ( + + ); + }} + + ); }; test('adding, editing, and removing items', async () => { @@ -69,3 +85,35 @@ test('keyboard handling', async () => { await user.keyboard('{Enter}bananas'); expect(onChange).toHaveBeenLastCalledWith(['apples', 'bananas', 'oranges']); }); + +test('validation', async () => { + const user = userEvent.setup(); + let validator: Validator; + render( + { + validator = v; + }} + rule={arrayOf(requiredField('required'))} + /> + ); + + act(() => validator.validate()); + expect(validator.state.valid).toBe(true); + expect(screen.getByRole('textbox')).toHaveAccessibleDescription(''); + + await user.click(screen.getByRole('button', { name: 'Add More' })); + await user.type(screen.getAllByRole('textbox')[1], 'foo'); + act(() => validator.validate()); + expect(validator.state.valid).toBe(false); + expect(screen.getAllByRole('textbox')[0]).toHaveAccessibleDescription( + 'required' + ); + expect(screen.getAllByRole('textbox')[1]).toHaveAccessibleDescription(''); + + await user.type(screen.getAllByRole('textbox')[0], 'foo'); + act(() => validator.validate()); + expect(validator.state.valid).toBe(true); + expect(screen.getAllByRole('textbox')[0]).toHaveAccessibleDescription(''); + expect(screen.getAllByRole('textbox')[1]).toHaveAccessibleDescription(''); +}); diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx index e1dbace8c97d5..48a12d403f313 100644 --- a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx @@ -21,15 +21,35 @@ import { ButtonSecondary } from 'design/Button'; import ButtonIcon from 'design/ButtonIcon'; import Flex from 'design/Flex'; import * as Icon from 'design/Icon'; -import Input from 'design/Input'; import { useRef } from 'react'; import styled, { useTheme } from 'styled-components'; +import { + precomputed, + Rule, + ValidationResult, +} from 'shared/components/Validation/rules'; +import { useRule } from 'shared/components/Validation'; + +import FieldInput from '../FieldInput'; + +type StringListValidationResult = ValidationResult & { + /** + * A list of validation results, one per list item. Note: results are + * optional just because `useRule` by default returns only + * `ValidationResult`. For the actual validation, it's not optional; if it's + * undefined, or there are fewer results in this list than the list items, + * the corresponding items will be treated as valid. + */ + results?: ValidationResult[]; +}; + export type FieldMultiInputProps = { label?: string; value: string[]; disabled?: boolean; onChange?(val: string[]): void; + rule?: Rule; }; /** @@ -45,7 +65,13 @@ export function FieldMultiInput({ value, disabled, onChange, + rule = defaultRule, }: FieldMultiInputProps) { + // It's important to first validate, and then treat an empty array as a + // single-item list with an empty string, since this "synthetic" empty + // string is technically not a part of the model and should not be + // validated. + const validationResult: StringListValidationResult = useRule(rule(value)); if (value.length === 0) { value = ['']; } @@ -90,8 +116,11 @@ export function FieldMultiInput({ // procedure whose complexity would probably outweigh the benefits). - onChange?.( @@ -99,6 +128,7 @@ export function FieldMultiInput({ ) } onKeyDown={e => handleKeyDown(i, e)} + mb={0} /> () => ({ valid: true }); + const Fieldset = styled.fieldset` border: none; margin: 0; diff --git a/web/packages/shared/components/FieldSelect/FieldSelect.story.tsx b/web/packages/shared/components/FieldSelect/FieldSelect.story.tsx index cecfa4e84dac0..dde0dc2b97dce 100644 --- a/web/packages/shared/components/FieldSelect/FieldSelect.story.tsx +++ b/web/packages/shared/components/FieldSelect/FieldSelect.story.tsx @@ -53,7 +53,10 @@ export function Default() { return ( {({ validator }) => { - validator.validate(); + // Prevent rendering loop. + if (!validator.state.validating) { + validator.validate(); + } return ( () => ({ valid: true }); @@ -95,7 +96,7 @@ export const FieldSelectWrapper = ({ {toolTipContent ? ( {label} - + ) : ( label diff --git a/web/packages/shared/components/FieldTextArea/FieldTextArea.tsx b/web/packages/shared/components/FieldTextArea/FieldTextArea.tsx index 545ef4d56ce17..c8bd7a1e0439d 100644 --- a/web/packages/shared/components/FieldTextArea/FieldTextArea.tsx +++ b/web/packages/shared/components/FieldTextArea/FieldTextArea.tsx @@ -27,9 +27,10 @@ import { TextAreaSize } from 'design/TextArea'; import { BoxProps } from 'design/Box'; +import { IconTooltip } from 'design/Tooltip'; + import { useRule } from 'shared/components/Validation'; -import { ToolTipInfo } from '../ToolTip'; import { HelperTextLine } from '../FieldInput/FieldInput'; export type FieldTextAreaProps = BoxProps & { @@ -140,7 +141,7 @@ export const FieldTextArea = forwardRef< > {label} - + ) : ( <>{label} diff --git a/web/packages/shared/components/FileTransfer/FileTransferActionBar.test.tsx b/web/packages/shared/components/FileTransfer/FileTransferActionBar.test.tsx new file mode 100644 index 0000000000000..9f948abeda683 --- /dev/null +++ b/web/packages/shared/components/FileTransfer/FileTransferActionBar.test.tsx @@ -0,0 +1,44 @@ +/** + * 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 . + */ + +import { render, screen } from 'design/utils/testing'; + +import { FileTransferActionBar } from './FileTransferActionBar'; +import { FileTransferContextProvider } from './FileTransferContextProvider'; + +test('file transfer bar is enabled by default', async () => { + render( + + + + ); + + expect(screen.getByTitle('Download files')).toBeEnabled(); + expect(screen.getByTitle('Upload files')).toBeEnabled(); +}); + +test('file transfer is disable if no access', async () => { + render( + + + + ); + + expect(screen.getByTitle('Download files')).toBeDisabled(); + expect(screen.getByTitle('Upload files')).toBeDisabled(); +}); diff --git a/web/packages/shared/components/FileTransfer/FileTransferActionBar.tsx b/web/packages/shared/components/FileTransfer/FileTransferActionBar.tsx index de894ca2e0d89..74c0616f8add0 100644 --- a/web/packages/shared/components/FileTransfer/FileTransferActionBar.tsx +++ b/web/packages/shared/components/FileTransfer/FileTransferActionBar.tsx @@ -17,40 +17,59 @@ */ import React from 'react'; -import { Flex, ButtonIcon } from 'design'; +import { Flex, ButtonIcon, Text } from 'design'; import * as Icons from 'design/Icon'; +import { HoverTooltip } from 'design/Tooltip'; import { useFileTransferContext } from './FileTransferContextProvider'; type FileTransferActionBarProps = { isConnected: boolean; + // if any role has `options.ssh_file_copy: true` without any other role having `false` (false overrides). + hasAccess: boolean; }; export function FileTransferActionBar({ isConnected, + hasAccess, }: FileTransferActionBarProps) { const fileTransferContext = useFileTransferContext(); const areFileTransferButtonsDisabled = - fileTransferContext.openedDialog || !isConnected; + fileTransferContext.openedDialog || !isConnected || !hasAccess; return ( - + You are missing the{' '} + + ssh_file_copy + {' '} + role option. + + ) : null + } > - - - - - + + + + + + + ); } diff --git a/web/packages/shared/components/MissingPermissionsTooltip/MissingPermissionsTooltip.tsx b/web/packages/shared/components/MissingPermissionsTooltip/MissingPermissionsTooltip.tsx new file mode 100644 index 0000000000000..aaef46ec0baf6 --- /dev/null +++ b/web/packages/shared/components/MissingPermissionsTooltip/MissingPermissionsTooltip.tsx @@ -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 . + */ + +import { Box, Text, Flex } from 'design'; + +export const MissingPermissionsTooltip = ({ + missingPermissions, +}: { + missingPermissions: string[]; +}) => { + return ( + + You do not have all of the required permissions. + + Missing permissions: + + {missingPermissions.map(perm => ( + {perm} + ))} + + + + ); +}; diff --git a/web/packages/shared/components/MissingPermissionsTooltip/index.ts b/web/packages/shared/components/MissingPermissionsTooltip/index.ts new file mode 100644 index 0000000000000..26c2679b0e46f --- /dev/null +++ b/web/packages/shared/components/MissingPermissionsTooltip/index.ts @@ -0,0 +1,19 @@ +/** + * 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 . + */ + +export { MissingPermissionsTooltip } from './MissingPermissionsTooltip'; diff --git a/web/packages/shared/components/ToolTip/index.ts b/web/packages/shared/components/ToolTip/index.ts index c6518cad9b297..f1be185cb4ae6 100644 --- a/web/packages/shared/components/ToolTip/index.ts +++ b/web/packages/shared/components/ToolTip/index.ts @@ -16,5 +16,10 @@ * along with this program. If not, see . */ -export { ToolTipInfo } from './ToolTip'; -export { HoverTooltip } from './HoverTooltip'; +export { + /** @deprecated Use `TooltipInfo` from `design/Tooltip` */ + IconTooltip as ToolTipInfo, + + /** @deprecated Use `HoverTooltip` from `design/Tooltip` */ + HoverTooltip, +} from 'design/Tooltip'; diff --git a/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.tsx b/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.tsx index 8268c8b71d599..b592e0acddca0 100644 --- a/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.tsx +++ b/web/packages/shared/components/UnifiedResources/CardsView/ResourceCard.tsx @@ -26,7 +26,7 @@ import { ResourceIcon } from 'design/ResourceIcon'; import { makeLabelTag } from 'teleport/components/formatters'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { ResourceItemProps } from '../types'; import { PinButton } from '../shared/PinButton'; diff --git a/web/packages/shared/components/UnifiedResources/FilterPanel.tsx b/web/packages/shared/components/UnifiedResources/FilterPanel.tsx index 85a5643891cd7..eb3763d7a5ae7 100644 --- a/web/packages/shared/components/UnifiedResources/FilterPanel.tsx +++ b/web/packages/shared/components/UnifiedResources/FilterPanel.tsx @@ -36,7 +36,7 @@ import { import { ViewMode } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { ResourceAvailabilityFilter, FilterKind } from './UnifiedResources'; import { diff --git a/web/packages/shared/components/UnifiedResources/ListView/ResourceListItem.tsx b/web/packages/shared/components/UnifiedResources/ListView/ResourceListItem.tsx index 0f2a34024536a..582a7c5ece831 100644 --- a/web/packages/shared/components/UnifiedResources/ListView/ResourceListItem.tsx +++ b/web/packages/shared/components/UnifiedResources/ListView/ResourceListItem.tsx @@ -26,7 +26,7 @@ import { ResourceIcon } from 'design/ResourceIcon'; import { makeLabelTag } from 'teleport/components/formatters'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { ResourceItemProps } from '../types'; import { PinButton } from '../shared/PinButton'; diff --git a/web/packages/shared/components/UnifiedResources/ResourceTab.tsx b/web/packages/shared/components/UnifiedResources/ResourceTab.tsx index 2533e2a203165..2deb131ffcde9 100644 --- a/web/packages/shared/components/UnifiedResources/ResourceTab.tsx +++ b/web/packages/shared/components/UnifiedResources/ResourceTab.tsx @@ -20,7 +20,7 @@ import React from 'react'; import styled from 'styled-components'; import { Box, Text } from 'design'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { PINNING_NOT_SUPPORTED_MESSAGE } from './UnifiedResources'; diff --git a/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx b/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx index 5426b0d908a74..a9f0699018d42 100644 --- a/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx +++ b/web/packages/shared/components/UnifiedResources/UnifiedResources.tsx @@ -43,7 +43,8 @@ import { AvailableResourceMode, } from 'gen-proto-ts/teleport/userpreferences/v1/unified_resource_preferences_pb'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; + import { makeEmptyAttempt, makeSuccessAttempt, diff --git a/web/packages/shared/components/UnifiedResources/shared/CopyButton.tsx b/web/packages/shared/components/UnifiedResources/shared/CopyButton.tsx index a3a1a4ad12be6..43b9cb2217165 100644 --- a/web/packages/shared/components/UnifiedResources/shared/CopyButton.tsx +++ b/web/packages/shared/components/UnifiedResources/shared/CopyButton.tsx @@ -22,7 +22,7 @@ import ButtonIcon from 'design/ButtonIcon'; import { Check, Copy } from 'design/Icon'; import { copyToClipboard } from 'design/utils/copyToClipboard'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; export function CopyButton({ name, diff --git a/web/packages/shared/components/UnifiedResources/shared/PinButton.tsx b/web/packages/shared/components/UnifiedResources/shared/PinButton.tsx index 1eedee2db68a2..cde3b87142c04 100644 --- a/web/packages/shared/components/UnifiedResources/shared/PinButton.tsx +++ b/web/packages/shared/components/UnifiedResources/shared/PinButton.tsx @@ -21,7 +21,7 @@ import React, { useRef } from 'react'; import { PushPinFilled, PushPin } from 'design/Icon'; import ButtonIcon from 'design/ButtonIcon'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { PinningSupport } from '../types'; diff --git a/web/packages/shared/components/Validation/Validation.jsx b/web/packages/shared/components/Validation/Validation.jsx deleted file mode 100644 index 352a386bc35fd..0000000000000 --- a/web/packages/shared/components/Validation/Validation.jsx +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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 . - */ - -import React from 'react'; - -import { isObject } from 'shared/utils/highbar'; - -import Logger from '../../libs/logger'; - -const logger = Logger.create('validation'); - -// Validator handles input validation -export default class Validator { - valid = true; - - constructor() { - // store subscribers - this._subs = []; - } - - // adds a callback to the list of subscribers - subscribe(cb) { - this._subs.push(cb); - } - - // removes a callback from the list of subscribers - unsubscribe(cb) { - const index = this._subs.indexOf(cb); - if (index > -1) { - this._subs.splice(index, 1); - } - } - - addResult(result) { - // result can be a boolean value or an object - let isValid = false; - if (isObject(result)) { - isValid = result.valid; - } else { - logger.error(`rule should return a valid object`); - } - - this.valid = this.valid && Boolean(isValid); - } - - reset() { - this.valid = true; - this.validating = false; - } - - validate() { - this.reset(); - this.validating = true; - this._subs.forEach(cb => { - try { - cb(); - } catch (err) { - logger.error(err); - } - }); - - return this.valid; - } -} - -const ValidationContext = React.createContext({}); - -export function Validation(props) { - const [validator] = React.useState(() => new Validator()); - // handle render functions - const children = - typeof props.children === 'function' - ? props.children({ validator }) - : props.children; - - return ( - - {children} - - ); -} - -export function useValidation() { - const value = React.useContext(ValidationContext); - if (!(value instanceof Validator)) { - logger.warn('Missing Validation Context declaration'); - } - - return value; -} diff --git a/web/packages/shared/components/Validation/Validation.test.tsx b/web/packages/shared/components/Validation/Validation.test.tsx index 19f40a8d44986..a933e9d916af9 100644 --- a/web/packages/shared/components/Validation/Validation.test.tsx +++ b/web/packages/shared/components/Validation/Validation.test.tsx @@ -17,32 +17,22 @@ */ import React from 'react'; +import { render, fireEvent, screen, act } from 'design/utils/testing'; -import { render, fireEvent, screen } from 'design/utils/testing'; +import Validator, { Result, Validation, useValidation } from './Validation'; -import Logger from '../../libs/logger'; - -import Validator, { Validation, useValidation } from './Validation'; - -jest.mock('../../libs/logger', () => { - const mockLogger = { - error: jest.fn(), - warn: jest.fn(), - }; - - return { - create: () => mockLogger, - }; +afterEach(() => { + jest.restoreAllMocks(); }); -test('methods of Validator: sub, unsub, validate', () => { +test('methods of Validator: addRuleCallback, removeRuleCallback, validate', () => { const mockCb1 = jest.fn(); const mockCb2 = jest.fn(); const validator = new Validator(); // test suscribe - validator.subscribe(mockCb1); - validator.subscribe(mockCb2); + validator.addRuleCallback(mockCb1); + validator.addRuleCallback(mockCb2); // test validate runs all subscribed cb's expect(validator.validate()).toBe(true); @@ -51,42 +41,42 @@ test('methods of Validator: sub, unsub, validate', () => { jest.clearAllMocks(); // test unsubscribe method removes correct cb - validator.unsubscribe(mockCb2); + validator.removeRuleCallback(mockCb2); expect(validator.validate()).toBe(true); expect(mockCb1).toHaveBeenCalledTimes(1); expect(mockCb2).toHaveBeenCalledTimes(0); }); test('methods of Validator: addResult, reset', () => { + const consoleError = jest.spyOn(console, 'error').mockImplementation(); const validator = new Validator(); // test addResult for nil object const result = null; validator.addResult(result); - expect(Logger.create().error).toHaveBeenCalledTimes(1); + expect(consoleError).toHaveBeenCalledTimes(1); // test addResult for boolean validator.addResult(true); - expect(validator.valid).toBe(false); + expect(validator.state.valid).toBe(false); // test addResult with incorrect object - let resultObj = {}; - validator.addResult(resultObj); - expect(validator.valid).toBe(false); + validator.addResult({} as Result); + expect(validator.state.valid).toBe(false); // test addResult with correct object with "valid" prop from prior test set to false - resultObj = { valid: true }; + let resultObj = { valid: true }; validator.addResult(resultObj); - expect(validator.valid).toBe(false); + expect(validator.state.valid).toBe(false); // test reset validator.reset(); - expect(validator.valid).toBe(true); - expect(validator.validating).toBe(false); + expect(validator.state.valid).toBe(true); + expect(validator.state.validating).toBe(false); // test addResult with correct object with "valid" prop reset to true validator.addResult(resultObj); - expect(validator.valid).toBe(true); + expect(validator.state.valid).toBe(true); }); test('trigger validation via useValidation hook', () => { @@ -102,7 +92,7 @@ test('trigger validation via useValidation hook', () => { ); fireEvent.click(screen.getByRole('button')); - expect(validator.validating).toBe(true); + expect(validator.state.validating).toBe(true); }); test('trigger validation via render function', () => { @@ -122,5 +112,56 @@ test('trigger validation via render function', () => { ); fireEvent.click(screen.getByRole('button')); - expect(validator.validating).toBe(true); + expect(validator.state.validating).toBe(true); +}); + +test('rendering validation result via useValidation hook', () => { + let validator: Validator; + const TestComponent = () => { + validator = useValidation(); + return ( + <> +
Validating: {String(validator.state.validating)}
+
Valid: {String(validator.state.valid)}
+ + ); + }; + render( + + + + ); + validator.addRuleCallback(() => validator.addResult({ valid: false })); + + expect(screen.getByText('Validating: false')).toBeInTheDocument(); + expect(screen.getByText('Valid: true')).toBeInTheDocument(); + + act(() => validator.validate()); + expect(screen.getByText('Validating: true')).toBeInTheDocument(); + expect(screen.getByText('Valid: false')).toBeInTheDocument(); +}); + +test('rendering validation result via render function', () => { + let validator: Validator; + render( + + {props => { + validator = props.validator; + return ( + <> +
Validating: {String(validator.state.validating)}
+
Valid: {String(validator.state.valid)}
+ + ); + }} +
+ ); + validator.addRuleCallback(() => validator.addResult({ valid: false })); + + expect(screen.getByText('Validating: false')).toBeInTheDocument(); + expect(screen.getByText('Valid: true')).toBeInTheDocument(); + + act(() => validator.validate()); + expect(screen.getByText('Validating: true')).toBeInTheDocument(); + expect(screen.getByText('Valid: false')).toBeInTheDocument(); }); diff --git a/web/packages/shared/components/Validation/Validation.tsx b/web/packages/shared/components/Validation/Validation.tsx new file mode 100644 index 0000000000000..6450c2915a61d --- /dev/null +++ b/web/packages/shared/components/Validation/Validation.tsx @@ -0,0 +1,192 @@ +/* + * 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 . + */ + +import React from 'react'; + +import { Logger } from 'design/logger'; + +import { isObject } from 'shared/utils/highbar'; +import { Store, useStore } from 'shared/libs/stores'; + +import { ValidationResult } from './rules'; + +const logger = new Logger('validation'); + +/** A per-rule callback that will be executed during validation. */ +type RuleCallback = () => void; + +export type Result = ValidationResult | boolean; + +type ValidatorState = { + /** Indicates whether the last validation was successful. */ + valid: boolean; + /** + * Indicates whether the validator has been activated by a call to + * `validate`. + */ + validating: boolean; +}; + +/** A store that handles input validation and makes its results accessible. */ +export default class Validator extends Store { + state = { + valid: true, + validating: false, + }; + + /** + * @deprecated For temporary Enterprise compatibility only. Use {@link state} + * instead. + */ + valid = true; + + /** Callbacks that will be executed upon validation. */ + private ruleCallbacks: RuleCallback[] = []; + + /** Adds a rule callback that will be executed upon validation. */ + addRuleCallback(cb: RuleCallback) { + this.ruleCallbacks.push(cb); + } + + /** Removes a rule callback. */ + removeRuleCallback(cb: RuleCallback) { + const index = this.ruleCallbacks.indexOf(cb); + if (index > -1) { + this.ruleCallbacks.splice(index, 1); + } + } + + addResult(result: Result) { + // result can be a boolean value or an object + let isValid = false; + if (isObject(result)) { + isValid = result.valid; + } else { + logger.error(`rule should return a valid object`); + } + + const valid = this.state.valid && Boolean(isValid); + this.setState({ valid }); + this.valid = valid; + } + + reset() { + this.setState({ + valid: true, + validating: false, + }); + this.valid = true; + } + + validate() { + this.reset(); + this.setState({ validating: true }); + for (const cb of this.ruleCallbacks) { + try { + cb(); + } catch (err) { + logger.error(err); + } + } + + return this.state.valid; + } +} + +const ValidationContext = React.createContext(undefined); + +type ValidationRenderFunction = (arg: { + validator: Validator; +}) => React.ReactNode; + +/** + * Installs a validation context that provides a {@link Validator} store. The + * store can be retrieved either through {@link useValidation} hook or by a + * render callback, e.g.: + * + * ``` + * function Component() { + * return ( + * + * {({validator}) => ( + * <> + * (...) + * + * + * )} + * + * ); + * } + * ``` + * + * The simplest way to use validation is validating on the view layer: just use + * a `rule` prop with `FieldInput` or a similar component and pass a rule like + * `requiredField`. + * + * Unfortunately, due to architectural limitations, this will not work well in + * scenarios where information about validity about given field or group of + * fields is required outside that field. In cases like this, the best option + * is to validate the model during render time on the top level (for example, + * execute an entire set of rules on a model using `runRules`). The result of + * model validation will then contain information about the validity of each + * field. It can then be used wherever it's needed, and also attached to + * appropriate inputs with a `precomputed` validation rule. Example: + * + * ``` + * function Component(model: Model) { + * const rules = { + * name: requiredField('required'), + * email: requiredEmailLike, + * } + * const validationResult = runRules(model, rules); + * } + * ``` + * + * Note that, as this example shows clearly, the validator itself, despite its + * name, doesn't really validate anything -- it merely aggregates validation + * results. Also it's worth mentioning that the validator will not do it + * without our help -- each validated field needs to be actually attached to a + * field, even if using a `precomputed` rule, for this to work. The validation + * callbacks registered by validation rules on the particular fields are the + * actual points where the errors are consumed by the validator. + */ +export function Validation(props: { + children?: React.ReactNode | ValidationRenderFunction; +}) { + const [validator] = React.useState(() => new Validator()); + useStore(validator); + // handle render functions + const children = + typeof props.children === 'function' + ? props.children({ validator }) + : props.children; + + return ( + + {children} + + ); +} + +export function useValidation(): Validator { + const validator = React.useContext(ValidationContext); + if (!validator) { + throw new Error('useValidation() called without a validation context'); + } + return useStore(validator); +} diff --git a/web/packages/shared/components/Validation/rules.test.ts b/web/packages/shared/components/Validation/rules.test.ts index a07b16fb7aaa7..07ee1bf434d01 100644 --- a/web/packages/shared/components/Validation/rules.test.ts +++ b/web/packages/shared/components/Validation/rules.test.ts @@ -25,6 +25,8 @@ import { requiredEmailLike, requiredIamRoleName, requiredPort, + runRules, + arrayOf, } from './rules'; describe('requiredField', () => { @@ -153,3 +155,60 @@ describe('requiredPort', () => { expect(requiredPort(port)()).toEqual(expected); }); }); + +test('runRules', () => { + expect( + runRules( + { foo: 'val1', bar: 'val2', irrelevant: undefined }, + { foo: requiredField('no foo'), bar: requiredField('no bar') } + ) + ).toEqual({ + valid: true, + fields: { + foo: { valid: true, message: '' }, + bar: { valid: true, message: '' }, + }, + }); + + expect( + runRules( + { foo: '', bar: 'val2', irrelevant: undefined }, + { foo: requiredField('no foo'), bar: requiredField('no bar') } + ) + ).toEqual({ + valid: false, + fields: { + foo: { valid: false, message: 'no foo' }, + bar: { valid: true, message: '' }, + }, + }); +}); + +test.each([ + { + name: 'invalid', + items: ['a', '', 'c'], + expected: { + valid: false, + results: [ + { valid: true, message: '' }, + { valid: false, message: 'required' }, + { valid: true, message: '' }, + ], + }, + }, + { + name: 'valid', + items: ['a', 'b', 'c'], + expected: { + valid: true, + results: [ + { valid: true, message: '' }, + { valid: true, message: '' }, + { valid: true, message: '' }, + ], + }, + }, +])('arrayOf: $name', ({ items, expected }) => { + expect(arrayOf(requiredField('required'))(items)()).toEqual(expected); +}); diff --git a/web/packages/shared/components/Validation/rules.ts b/web/packages/shared/components/Validation/rules.ts index 52063d67fce99..545f28a348fce 100644 --- a/web/packages/shared/components/Validation/rules.ts +++ b/web/packages/shared/components/Validation/rules.ts @@ -31,6 +31,8 @@ export interface ValidationResult { */ export type Rule = (value: T) => () => R; +type RuleResult = ReturnType>; + /** * requiredField checks for empty strings and arrays. * @@ -280,6 +282,83 @@ const requiredAll = return { valid: true }; }; +/** A result of the {@link arrayOf} validation rule. */ +export type ArrayValidationResult = ValidationResult & { + /** Results of validating each separate item. */ + results: R[]; +}; + +/** Validates an array by executing given rule on each of its elements. */ +const arrayOf = + ( + elementRule: Rule + ): Rule> => + (values: T[]) => + () => { + const results = values.map(v => elementRule(v)()); + return { results: results, valid: results.every(r => r.valid) }; + }; + +/** + * Passes a precomputed validation result instead of computing it inside the + * rule. + * + * This rule is a hacky way to allow the validation engine to operate with + * validation results computed outside of the validator's validation cycle. See + * the `Validation` component's documentation for more information about where + * this is useful and a detailed usage example. + */ +const precomputed = + (res: ValidationResult): Rule => + () => + () => + res; + +/** + * A set of rules to be executed using `runRules` on a model object. The rule + * set contains a subset of keys of the object. + */ +export type RuleSet = Record< + K, + Rule +>; + +/** A result of executing a set of rules on a model object. */ +export type RuleSetValidationResult> = { + valid: boolean; + /** + * Each member of the `fields` object corresponds to a rule from within the + * rule set and contains the result of validating a model field of the same + * name. + */ + fields: { [k in keyof R]: RuleResult }; // Record; +}; + +/** + * Executes a set of rules on a model object, producing a precomputed + * validation result that can be used with `precomputed` rule to inject to + * field components, but also allows for consuming the validation data outside + * these fields. + * + * `K` is the subset of model field names. + * `M` is the validated model. + */ +export const runRules = >( + model: M, + rules: RuleSet +): RuleSetValidationResult> => { + const fields = {} as { + [k in keyof RuleSet]: RuleResult[k]>; + }; + let valid = true; + for (const key in rules) { + const modelValue = model[key]; + fields[key] = rules[key](modelValue)(); + valid &&= fields[key].valid; + } + return { fields, valid }; +}; + export { requiredToken, requiredPassword, @@ -292,4 +371,6 @@ export { requiredMatchingRoleNameAndRoleArn, validAwsIAMRoleName, requiredPort, + arrayOf, + precomputed, }; diff --git a/web/packages/shared/components/Validation/useRule.js b/web/packages/shared/components/Validation/useRule.js index ad0ca82157cbf..e8d2a77e391ae 100644 --- a/web/packages/shared/components/Validation/useRule.js +++ b/web/packages/shared/components/Validation/useRule.js @@ -39,7 +39,7 @@ export default function useRule(cb) { // register to validation context to be called on cb() React.useEffect(() => { function onValidate() { - if (validator.validating) { + if (validator.state.validating) { const result = cb(); validator.addResult(result); rerender({}); @@ -47,18 +47,18 @@ export default function useRule(cb) { } // subscribe to store changes - validator.subscribe(onValidate); + validator.addRuleCallback(onValidate); // unsubscribe on unmount function cleanup() { - validator.unsubscribe(onValidate); + validator.removeRuleCallback(onValidate); } return cleanup; }, [cb]); // if validation has been requested, cb right away. - if (validator.validating) { + if (validator.state.validating) { return cb(); } diff --git a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx index d403cb036f23d..4f480fd516b40 100644 --- a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx +++ b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx @@ -195,6 +195,7 @@ const EventIconMap: Record = { [eventCodes.CLIENT_DISCONNECT]: Icons.Info, [eventCodes.PORTFORWARD]: Icons.Info, [eventCodes.PORTFORWARD_FAILURE]: Icons.Info, + [eventCodes.PORTFORWARD_STOP]: Icons.Info, [eventCodes.SUBSYSTEM]: Icons.Info, [eventCodes.SUBSYSTEM_FAILURE]: Icons.Info, [eventCodes.LOCK_CREATED]: Icons.Lock, diff --git a/web/packages/teleport/src/Bots/List/Bots.tsx b/web/packages/teleport/src/Bots/List/Bots.tsx index be383fbd32997..594a1840d7c52 100644 --- a/web/packages/teleport/src/Bots/List/Bots.tsx +++ b/web/packages/teleport/src/Bots/List/Bots.tsx @@ -19,7 +19,7 @@ import React, { useEffect, useState } from 'react'; import { useAttemptNext } from 'shared/hooks'; import { Link } from 'react-router-dom'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { Alert, Box, Button, Indicator } from 'design'; import { diff --git a/web/packages/teleport/src/Console/DocumentKubeExec/KubeExecDataDialog.tsx b/web/packages/teleport/src/Console/DocumentKubeExec/KubeExecDataDialog.tsx index 36b8b7a505820..e8261cdf026c3 100644 --- a/web/packages/teleport/src/Console/DocumentKubeExec/KubeExecDataDialog.tsx +++ b/web/packages/teleport/src/Console/DocumentKubeExec/KubeExecDataDialog.tsx @@ -35,7 +35,7 @@ import { import Validation from 'shared/components/Validation'; import FieldInput from 'shared/components/FieldInput'; import { requiredField } from 'shared/components/Validation/rules'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; type Props = { onClose(): void; @@ -123,11 +123,11 @@ function KubeExecDataDialog({ onClose, onExec }: Props) { Interactive shell - + You can start an interactive shell and have a bidirectional communication with the target pod, or you can run one-off command and see its output. - +
diff --git a/web/packages/teleport/src/Console/DocumentNodes/DocumentNodes.tsx b/web/packages/teleport/src/Console/DocumentNodes/DocumentNodes.tsx index f76058c7b3941..93c5691848897 100644 --- a/web/packages/teleport/src/Console/DocumentNodes/DocumentNodes.tsx +++ b/web/packages/teleport/src/Console/DocumentNodes/DocumentNodes.tsx @@ -47,8 +47,6 @@ export default function DocumentNodes(props: Props) { params, setParams, setSort, - pathname, - replaceHistory, fetchStatus, attempt, createSshSession, @@ -112,8 +110,6 @@ export default function DocumentNodes(props: Props) { params={params} setParams={setParams} setSort={setSort} - pathname={pathname} - replaceHistory={replaceHistory} onLabelClick={onLabelClick} /> )} diff --git a/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.test.tsx b/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.test.tsx new file mode 100644 index 0000000000000..0003326ef754f --- /dev/null +++ b/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.test.tsx @@ -0,0 +1,68 @@ +/** + * 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 . + */ + +import { render, screen } from 'design/utils/testing'; +import { MemoryRouter } from 'react-router'; +import 'jest-canvas-mock'; + +import { allAccessAcl } from 'teleport/mocks/contexts'; + +import ConsoleContext from '../consoleContext'; +import ConsoleContextProvider from '../consoleContextProvider'; + +import DocumentSsh from '.'; + +test('file transfer buttons are disabled if user does not have access', async () => { + const ctx = new ConsoleContext(); + ctx.storeUser.setState({ + acl: { ...allAccessAcl, fileTransferAccess: false }, + }); + render(); + expect(screen.getByTitle('Download files')).toBeDisabled(); +}); + +test('file transfer buttons are enabled if user has access', async () => { + const ctx = new ConsoleContext(); + ctx.storeUser.setState({ + acl: allAccessAcl, + }); + render(); + expect(screen.getByTitle('Download files')).toBeEnabled(); +}); + +function Component({ ctx }: { ctx: ConsoleContext }) { + return ( + + + + + + ); +} diff --git a/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.tsx b/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.tsx index 8a81c4ec6031b..01138ab3c70bf 100644 --- a/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.tsx +++ b/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.tsx @@ -36,6 +36,8 @@ import { useMfa } from 'teleport/lib/useMfa'; import Document from '../Document'; +import { useConsoleContext } from '../consoleContextProvider'; + import { Terminal, TerminalRef } from './Terminal'; import useSshSession from './useSshSession'; import { useFileTransfer } from './useFileTransfer'; @@ -49,6 +51,8 @@ export default function DocumentSshWrapper(props: PropTypes) { } function DocumentSsh({ doc, visible }: PropTypes) { + const ctx = useConsoleContext(); + const hasFileTransferAccess = ctx.storeUser.hasFileTransferAccess(); const terminalRef = useRef(); const { tty, status, closeDocument, session } = useSshSession(doc); const [showSearch, setShowSearch] = useState(false); @@ -130,7 +134,10 @@ function DocumentSsh({ doc, visible }: PropTypes) { return ( - + {status === 'loading' && ( diff --git a/web/packages/teleport/src/DesktopSession/TopBar.tsx b/web/packages/teleport/src/DesktopSession/TopBar.tsx index 9ab12b523067d..dcd5beaec4881 100644 --- a/web/packages/teleport/src/DesktopSession/TopBar.tsx +++ b/web/packages/teleport/src/DesktopSession/TopBar.tsx @@ -21,7 +21,7 @@ import { useTheme } from 'styled-components'; import { Text, TopNav, Flex } from 'design'; import { Clipboard, FolderShared } from 'design/Icon'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import ActionMenu from './ActionMenu'; import { AlertDropdown } from './AlertDropdown'; diff --git a/web/packages/teleport/src/Discover/AwsMangementConsole/CreateAppAccess/CreateAppAccess.tsx b/web/packages/teleport/src/Discover/AwsMangementConsole/CreateAppAccess/CreateAppAccess.tsx index 4f0b1ea32146c..2c357df859a58 100644 --- a/web/packages/teleport/src/Discover/AwsMangementConsole/CreateAppAccess/CreateAppAccess.tsx +++ b/web/packages/teleport/src/Discover/AwsMangementConsole/CreateAppAccess/CreateAppAccess.tsx @@ -21,7 +21,7 @@ import styled from 'styled-components'; import { Box, Flex, Link, Mark, H3 } from 'design'; import TextEditor from 'shared/components/TextEditor'; import { Danger } from 'design/Alert'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import { useAsync } from 'shared/hooks/useAsync'; import { P } from 'design/Text/Text'; @@ -81,7 +81,7 @@ export function CreateAppAccess() {

First configure your AWS IAM permissions

- + The following IAM permissions will be added as an inline policy named {IAM_POLICY_NAME} to IAM role{' '} {iamRoleName} @@ -94,7 +94,7 @@ export function CreateAppAccess() { />
- +

Run the command below on your{' '} diff --git a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSecurityGroups.tsx b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSecurityGroups.tsx index cc5ed4bb590b4..1717a082208ba 100644 --- a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSecurityGroups.tsx +++ b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSecurityGroups.tsx @@ -21,7 +21,7 @@ import React, { useState, useEffect } from 'react'; import { Text, Flex, Box, Indicator, ButtonSecondary, Subtitle3 } from 'design'; import * as Icons from 'design/Icon'; import { FetchStatus } from 'design/DataTable/types'; -import { HoverTooltip, ToolTipInfo } from 'shared/components/ToolTip'; +import { HoverTooltip, IconTooltip } from 'design/Tooltip'; import useAttempt from 'shared/hooks/useAttemptNext'; import { getErrMessage } from 'shared/utils/errorType'; import { pluralize } from 'shared/utils/text'; @@ -126,7 +126,7 @@ export const SelectSecurityGroups = ({ <> Select ECS Security Groups - + Select ECS security group(s) based on the following requirements:

    @@ -141,7 +141,7 @@ export const SelectSecurityGroups = ({
- +

diff --git a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSubnetIds.tsx b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSubnetIds.tsx index 785ec15fbda9e..8a6e93a0491b1 100644 --- a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSubnetIds.tsx +++ b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/SelectSubnetIds.tsx @@ -29,7 +29,7 @@ import { } from 'design'; import * as Icons from 'design/Icon'; import { FetchStatus } from 'design/DataTable/types'; -import { HoverTooltip, ToolTipInfo } from 'shared/components/ToolTip'; +import { HoverTooltip, IconTooltip } from 'design/Tooltip'; import { pluralize } from 'shared/utils/text'; import useAttempt from 'shared/hooks/useAttemptNext'; import { getErrMessage } from 'shared/utils/errorType'; @@ -121,12 +121,12 @@ export function SelectSubnetIds({ <> Select ECS Subnets - + A subnet has an outbound internet route if it has a route to an internet gateway or a NAT gateway in a public subnet. - + diff --git a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx index 204e30b3e79d1..617d10ba79790 100644 --- a/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx +++ b/web/packages/teleport/src/Discover/Database/EnrollRdsDatabase/AutoDiscoverToggle.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { Box, Toggle } from 'design'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; export function AutoDiscoverToggle({ wantAutoDiscover, @@ -40,11 +40,11 @@ export function AutoDiscoverToggle({ Auto-enroll all databases for the selected VPC - + Auto-enroll will automatically identify all RDS databases (e.g. PostgreSQL, MySQL, Aurora) from the selected VPC and register them as database resources in your infrastructure. - + ); diff --git a/web/packages/teleport/src/Discover/Database/TestConnection/TestConnection.tsx b/web/packages/teleport/src/Discover/Database/TestConnection/TestConnection.tsx index 4d1e1b8ab9829..20ce37bbea8c0 100644 --- a/web/packages/teleport/src/Discover/Database/TestConnection/TestConnection.tsx +++ b/web/packages/teleport/src/Discover/Database/TestConnection/TestConnection.tsx @@ -43,7 +43,7 @@ import { StyledBox, useConnectionDiagnostic, } from '../../Shared'; -import { DatabaseEngine } from '../../SelectResource'; +import { DatabaseEngine, getDatabaseProtocol } from '../../SelectResource'; export function TestConnection() { const { resourceSpec, agentMeta } = useDiscover(); @@ -185,8 +185,7 @@ export function TestConnection() { isDisabled={ attempt.status === 'processing' || nameOpts.length === 0 } - // Database name is required for Postgres. - isClearable={dbEngine !== DatabaseEngine.Postgres} + isClearable={!isDbNameRequired(dbEngine)} /> Enable Kubernetes App Discovery - + Teleport's Kubernetes App Discovery will automatically identify and enroll to Teleport HTTP applications running inside a Kubernetes cluster. - + Auto-enroll all EKS clusters for selected region - + Auto-enroll will automatically identify all EKS clusters from the selected region and register them as Kubernetes resources in your infrastructure. - + {showTable && ( diff --git a/web/packages/teleport/src/Discover/SelectResource/databases.tsx b/web/packages/teleport/src/Discover/SelectResource/databases.tsx index a959b7ac1b176..2299f166ab105 100644 --- a/web/packages/teleport/src/Discover/SelectResource/databases.tsx +++ b/web/packages/teleport/src/Discover/SelectResource/databases.tsx @@ -274,7 +274,7 @@ export const DATABASES_UNGUIDED: ResourceSpec[] = [ { dbMeta: { location: DatabaseLocation.SelfHosted, - engine: DatabaseEngine.CoackroachDb, + engine: DatabaseEngine.CockroachDb, }, name: 'CockroachDB', keywords: [...selfhostedKeywords, 'cockroachdb'], @@ -421,13 +421,32 @@ export function getDatabaseProtocol(engine: DatabaseEngine): DbProtocol { switch (engine) { case DatabaseEngine.Postgres: case DatabaseEngine.AuroraPostgres: + case DatabaseEngine.Redshift: return 'postgres'; case DatabaseEngine.MySql: case DatabaseEngine.AuroraMysql: return 'mysql'; + case DatabaseEngine.MongoDb: + return 'mongodb'; + case DatabaseEngine.Redis: + return 'redis'; + case DatabaseEngine.CockroachDb: + return 'cockroachdb'; + case DatabaseEngine.SqlServer: + return 'sqlserver'; + case DatabaseEngine.Snowflake: + return 'snowflake'; + case DatabaseEngine.Cassandra: + return 'cassandra'; + case DatabaseEngine.ElasticSearch: + return 'elasticsearch'; + case DatabaseEngine.DynamoDb: + return 'dynamodb'; + case DatabaseEngine.Doc: + return '' as any; + default: + engine satisfies never; } - - return '' as any; } export function getDefaultDatabasePort(engine: DatabaseEngine): string { diff --git a/web/packages/teleport/src/Discover/SelectResource/types.ts b/web/packages/teleport/src/Discover/SelectResource/types.ts index 34a8b1d2a1d8d..151f01d98c9c7 100644 --- a/web/packages/teleport/src/Discover/SelectResource/types.ts +++ b/web/packages/teleport/src/Discover/SelectResource/types.ts @@ -51,7 +51,7 @@ export enum DatabaseEngine { AuroraMysql, MongoDb, Redis, - CoackroachDb, + CockroachDb, SqlServer, Snowflake, Cassandra, diff --git a/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx b/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx index 6a7245bacf798..6846a09779e53 100644 --- a/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx +++ b/web/packages/teleport/src/Discover/Server/DiscoveryConfigSsm/DiscoveryConfigSsm.tsx @@ -30,7 +30,7 @@ import { import styled from 'styled-components'; import { Danger, Info } from 'design/Alert'; import TextEditor from 'shared/components/TextEditor'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import FieldInput from 'shared/components/FieldInput'; import { Rule } from 'shared/components/Validation/rules'; import Validation, { Validator } from 'shared/components/Validation'; @@ -317,7 +317,7 @@ export function DiscoveryConfigSsm() { {' '} to configure your IAM permissions.

- + The following IAM permissions will be added as an inline policy named {IAM_POLICY_NAME} to IAM role{' '} {arnResourceName} @@ -330,7 +330,7 @@ export function DiscoveryConfigSsm() { />
- + Auto-enroll all EC2 instances for selected region - + Auto-enroll will automatically identify all EC2 instances from the selected region and register them as node resources in your infrastructure. - + {wantAutoDiscover && ( diff --git a/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx b/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx index 4c491191152b8..0c244462b7507 100644 --- a/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx +++ b/web/packages/teleport/src/Discover/Shared/Aws/ConfigureIamPerms.tsx @@ -21,7 +21,7 @@ import styled from 'styled-components'; import { Flex, Link, Box, H3 } from 'design'; import { assertUnreachable } from 'shared/utils/assertUnreachable'; import TextEditor from 'shared/components/TextEditor'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import { P } from 'design/Text/Text'; @@ -179,11 +179,11 @@ export function ConfigureIamPerms({ <>

Configure your AWS IAM permissions

- + The following IAM permissions will be added as an inline policy named {iamPolicyName} to IAM role {iamRoleName} {editor} - +

{msg} Run the command below on your{' '} diff --git a/web/packages/teleport/src/Discover/Shared/ConfigureDiscoveryService/ConfigureDiscoveryServiceDirections.tsx b/web/packages/teleport/src/Discover/Shared/ConfigureDiscoveryService/ConfigureDiscoveryServiceDirections.tsx index 9017c990205f4..1b56b2d69e270 100644 --- a/web/packages/teleport/src/Discover/Shared/ConfigureDiscoveryService/ConfigureDiscoveryServiceDirections.tsx +++ b/web/packages/teleport/src/Discover/Shared/ConfigureDiscoveryService/ConfigureDiscoveryServiceDirections.tsx @@ -18,7 +18,7 @@ import { Box, Flex, Input, Text, Mark, H3, Subtitle3 } from 'design'; import styled from 'styled-components'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import React from 'react'; @@ -71,7 +71,7 @@ discovery_service: Auto-enrolling requires you to configure a{' '} Discovery Service - +
@@ -100,7 +100,7 @@ discovery_service:

Step 2

Define a Discovery Group name{' '} - + diff --git a/web/packages/teleport/src/Discover/Shared/SecurityGroupPicker/SecurityGroupPicker.tsx b/web/packages/teleport/src/Discover/Shared/SecurityGroupPicker/SecurityGroupPicker.tsx index 7b66604e54a51..890eeee6cc60a 100644 --- a/web/packages/teleport/src/Discover/Shared/SecurityGroupPicker/SecurityGroupPicker.tsx +++ b/web/packages/teleport/src/Discover/Shared/SecurityGroupPicker/SecurityGroupPicker.tsx @@ -23,7 +23,7 @@ import Table, { Cell } from 'design/DataTable'; import { Danger } from 'design/Alert'; import { CheckboxInput } from 'design/Checkbox'; import { FetchStatus } from 'design/DataTable/types'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import { Attempt } from 'shared/hooks/useAttemptNext'; @@ -163,13 +163,13 @@ export const SecurityGroupPicker = ({ if (sg.recommended && sg.tips?.length) { return ( - +
    {sg.tips.map((tip, index) => (
  • {tip}
  • ))}
-
+
); } diff --git a/web/packages/teleport/src/Integrations/Enroll/AwsOidc/ConfigureAwsOidcSummary.tsx b/web/packages/teleport/src/Integrations/Enroll/AwsOidc/ConfigureAwsOidcSummary.tsx index aecd67c00d114..b99521e8719ae 100644 --- a/web/packages/teleport/src/Integrations/Enroll/AwsOidc/ConfigureAwsOidcSummary.tsx +++ b/web/packages/teleport/src/Integrations/Enroll/AwsOidc/ConfigureAwsOidcSummary.tsx @@ -20,7 +20,7 @@ import React from 'react'; import styled from 'styled-components'; import { Flex, Box, H3, Text } from 'design'; import TextEditor from 'shared/components/TextEditor'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import useStickyClusterId from 'teleport/useStickyClusterId'; @@ -61,7 +61,7 @@ export function ConfigureAwsOidcSummary({ }`; return ( - +

Running the command in AWS CloudShell does the following:

1. Configures an AWS IAM OIDC Identity Provider (IdP) @@ -76,7 +76,7 @@ export function ConfigureAwsOidcSummary({ /> -
+ ); } diff --git a/web/packages/teleport/src/Integrations/Enroll/AwsOidc/S3BucketConfiguration.tsx b/web/packages/teleport/src/Integrations/Enroll/AwsOidc/S3BucketConfiguration.tsx index a225196d65dfc..47452f3aa720e 100644 --- a/web/packages/teleport/src/Integrations/Enroll/AwsOidc/S3BucketConfiguration.tsx +++ b/web/packages/teleport/src/Integrations/Enroll/AwsOidc/S3BucketConfiguration.tsx @@ -19,7 +19,7 @@ import React from 'react'; import { Text, Flex } from 'design'; import FieldInput from 'shared/components/FieldInput'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; export function S3BucketConfiguration({ s3Bucket, @@ -32,11 +32,11 @@ export function S3BucketConfiguration({ <> Amazon S3 Location - + Deprecated. Amazon is now validating the IdP certificate against a list of root CAs. Storing the OpenID Configuration in S3 is no longer required, and should be removed to improve security. - + { {getStatusCodeTitle(item.statusCode)} {statusDescription && ( - {statusDescription} + {statusDescription} )} diff --git a/web/packages/teleport/src/JoinTokens/JoinTokens.tsx b/web/packages/teleport/src/JoinTokens/JoinTokens.tsx index 46e9100feab8b..862085cfd0157 100644 --- a/web/packages/teleport/src/JoinTokens/JoinTokens.tsx +++ b/web/packages/teleport/src/JoinTokens/JoinTokens.tsx @@ -42,7 +42,7 @@ import Dialog, { } from 'design/Dialog'; import { MenuButton } from 'shared/components/MenuAction'; import { Attempt, useAsync } from 'shared/hooks/useAsync'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { CopyButton } from 'shared/components/UnifiedResources/shared/CopyButton'; import { useTeleport } from 'teleport'; diff --git a/web/packages/teleport/src/JoinTokens/UpsertJoinTokenDialog.tsx b/web/packages/teleport/src/JoinTokens/UpsertJoinTokenDialog.tsx index 6daef672649c6..357c6a3d59471 100644 --- a/web/packages/teleport/src/JoinTokens/UpsertJoinTokenDialog.tsx +++ b/web/packages/teleport/src/JoinTokens/UpsertJoinTokenDialog.tsx @@ -29,7 +29,7 @@ import { Alert, } from 'design'; import styled from 'styled-components'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { Cross } from 'design/Icon'; import Validation from 'shared/components/Validation'; import FieldInput from 'shared/components/FieldInput'; diff --git a/web/packages/teleport/src/Navigation/Navigation.tsx b/web/packages/teleport/src/Navigation/Navigation.tsx index 6450c575114bf..e50295ea5a1f9 100644 --- a/web/packages/teleport/src/Navigation/Navigation.tsx +++ b/web/packages/teleport/src/Navigation/Navigation.tsx @@ -21,7 +21,7 @@ import styled, { useTheme } from 'styled-components'; import { matchPath, useLocation, useHistory } from 'react-router'; import { Box, Text, Flex } from 'design'; -import { ToolTipInfo } from 'shared/components/ToolTip'; +import { IconTooltip } from 'design/Tooltip'; import cfg from 'teleport/config'; import { @@ -195,9 +195,9 @@ function LicenseFooter({ {title} - + {infoContent} - + {subText} diff --git a/web/packages/teleport/src/Navigation/SideNavigation/Section.tsx b/web/packages/teleport/src/Navigation/SideNavigation/Section.tsx index 8217106d5fd20..eb9d10c111b82 100644 --- a/web/packages/teleport/src/Navigation/SideNavigation/Section.tsx +++ b/web/packages/teleport/src/Navigation/SideNavigation/Section.tsx @@ -23,7 +23,7 @@ import styled, { css, useTheme } from 'styled-components'; import { Box, ButtonIcon, Flex, P2, Text } from 'design'; import { Theme } from 'design/theme'; import { ArrowLineLeft } from 'design/Icon'; -import { HoverTooltip, ToolTipInfo } from 'shared/components/ToolTip'; +import { HoverTooltip, IconTooltip } from 'design/Tooltip'; import cfg from 'teleport/config'; @@ -470,9 +470,9 @@ function LicenseFooter({ {title} - + {infoContent} - + {subText} diff --git a/web/packages/teleport/src/Notifications/Notifications.tsx b/web/packages/teleport/src/Notifications/Notifications.tsx index ada3dd3761af1..b64d1460e8041 100644 --- a/web/packages/teleport/src/Notifications/Notifications.tsx +++ b/web/packages/teleport/src/Notifications/Notifications.tsx @@ -24,7 +24,7 @@ import { Alert, Box, Flex, Indicator, Text } from 'design'; import { Notification as NotificationIcon, BellRinging } from 'design/Icon'; import Logger from 'shared/libs/logger'; import { useRefClickOutside } from 'shared/hooks/useRefClickOutside'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import { useInfiniteScroll, diff --git a/web/packages/teleport/src/Roles/RoleEditor/EditorHeader.tsx b/web/packages/teleport/src/Roles/RoleEditor/EditorHeader.tsx index 37059aee38594..2ee25880cedad 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/EditorHeader.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/EditorHeader.tsx @@ -17,20 +17,32 @@ */ import React from 'react'; -import { Flex, ButtonText, H2 } from 'design'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { Flex, ButtonText, H2, Indicator, Box } from 'design'; +import { HoverTooltip } from 'design/Tooltip'; import { Trash } from 'design/Icon'; import useTeleport from 'teleport/useTeleport'; import { Role } from 'teleport/services/resources'; +import { EditorTab, EditorTabs } from './EditorTabs'; + /** Renders a header button with role name and delete button. */ export const EditorHeader = ({ role = null, onDelete, + selectedEditorTab, + onEditorTabChange, + isProcessing, + standardEditorId, + yamlEditorId, }: { - onDelete?(): void; role?: Role; + onDelete(): void; + selectedEditorTab: EditorTab; + onEditorTabChange(t: EditorTab): void; + isProcessing: boolean; + standardEditorId: string; + yamlEditorId: string; }) => { const ctx = useTeleport(); const isCreating = !role; @@ -38,8 +50,24 @@ export const EditorHeader = ({ const hasDeleteAccess = ctx.storeUser.getRoleAccess().remove; return ( - -

{isCreating ? 'Create a New Role' : role?.metadata.name}

+ + +

+ {isCreating + ? 'Create a New Role' + : `Edit Role ${role?.metadata.name}`} +

+
+ + {isProcessing && } + + {!isCreating && ( { + const standardLabel = 'Switch to standard editor'; + const yamlLabel = 'Switch to YAML editor'; return ( ); }; diff --git a/web/packages/teleport/src/Roles/RoleEditor/RoleEditor.test.tsx b/web/packages/teleport/src/Roles/RoleEditor/RoleEditor.test.tsx index 235a0d83782a6..1376c078e80ff 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/RoleEditor.test.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/RoleEditor.test.tsx @@ -75,10 +75,7 @@ afterEach(() => { test('rendering and switching tabs for new role', async () => { render(); - expect(screen.getByRole('tab', { name: 'Standard' })).toHaveAttribute( - 'aria-selected', - 'true' - ); + expect(getStandardEditorTab()).toHaveAttribute('aria-selected', 'true'); expect( screen.queryByRole('button', { name: /Reset to Standard Settings/i }) ).not.toBeInTheDocument(); @@ -86,7 +83,7 @@ test('rendering and switching tabs for new role', async () => { expect(screen.getByLabelText('Description')).toHaveValue(''); expect(screen.getByRole('button', { name: 'Create Role' })).toBeEnabled(); - await user.click(screen.getByRole('tab', { name: 'YAML' })); + await user.click(getYamlEditorTab()); expect(fromFauxYaml(await getTextEditorContents())).toEqual( withDefaults({ kind: 'role', @@ -103,7 +100,7 @@ test('rendering and switching tabs for new role', async () => { ); expect(screen.getByRole('button', { name: 'Create Role' })).toBeEnabled(); - await user.click(screen.getByRole('tab', { name: 'Standard' })); + await user.click(getStandardEditorTab()); await screen.findByLabelText('Role Name'); expect( screen.queryByRole('button', { name: /Reset to Standard Settings/i }) @@ -127,14 +124,11 @@ test('rendering and switching tabs for a non-standard role', async () => { originalRole={{ object: originalRole, yaml: originalYaml }} /> ); - expect(screen.getByRole('tab', { name: 'YAML' })).toHaveAttribute( - 'aria-selected', - 'true' - ); + expect(getYamlEditorTab()).toHaveAttribute('aria-selected', 'true'); expect(fromFauxYaml(await getTextEditorContents())).toEqual(originalRole); expect(screen.getByRole('button', { name: 'Update Role' })).toBeDisabled(); - await user.click(screen.getByRole('tab', { name: 'Standard' })); + await user.click(getStandardEditorTab()); expect( screen.getByRole('button', { name: 'Reset to Standard Settings' }) ).toBeVisible(); @@ -142,12 +136,12 @@ test('rendering and switching tabs for a non-standard role', async () => { expect(screen.getByLabelText('Description')).toHaveValue(''); expect(screen.getByRole('button', { name: 'Update Role' })).toBeDisabled(); - await user.click(screen.getByRole('tab', { name: 'YAML' })); + await user.click(getYamlEditorTab()); expect(fromFauxYaml(await getTextEditorContents())).toEqual(originalRole); expect(screen.getByRole('button', { name: 'Update Role' })).toBeDisabled(); // Switch once again, reset to standard - await user.click(screen.getByRole('tab', { name: 'Standard' })); + await user.click(getStandardEditorTab()); expect(screen.getByRole('button', { name: 'Update Role' })).toBeDisabled(); await user.click( screen.getByRole('button', { name: 'Reset to Standard Settings' }) @@ -155,13 +149,35 @@ test('rendering and switching tabs for a non-standard role', async () => { expect(screen.getByRole('button', { name: 'Update Role' })).toBeEnabled(); await user.type(screen.getByLabelText('Description'), 'some description'); - await user.click(screen.getByRole('tab', { name: 'YAML' })); + await user.click(getYamlEditorTab()); const editorContents = fromFauxYaml(await getTextEditorContents()); expect(editorContents.metadata.description).toBe('some description'); expect(editorContents.spec.deny).toEqual({}); expect(screen.getByRole('button', { name: 'Update Role' })).toBeEnabled(); }); +test('no double conversions when clicking already active tabs', async () => { + render(); + await user.click(getYamlEditorTab()); + await user.click(getStandardEditorTab()); + await user.type(screen.getByLabelText('Role Name'), '_2'); + await user.click(getStandardEditorTab()); + expect(screen.getByLabelText('Role Name')).toHaveValue('new_role_name_2'); + + await user.click(getYamlEditorTab()); + await user.clear(await findTextEditor()); + await user.type( + await findTextEditor(), + // Note: this is actually correct JSON syntax; the testing library uses + // braces for special keys, so we need to use double opening braces. + '{{"kind":"role", metadata:{{"name":"new_role_name_3"}}' + ); + await user.click(getYamlEditorTab()); + expect(await getTextEditorContents()).toBe( + '{"kind":"role", metadata:{"name":"new_role_name_3"}}' + ); +}); + test('canceling standard editor', async () => { const onCancel = jest.fn(); render(); @@ -175,7 +191,7 @@ test('canceling standard editor', async () => { test('canceling yaml editor', async () => { const onCancel = jest.fn(); render(); - await user.click(screen.getByRole('tab', { name: 'YAML' })); + await user.click(getYamlEditorTab()); await user.click(screen.getByRole('button', { name: 'Cancel' })); expect(onCancel).toHaveBeenCalled(); expect(userEventService.captureUserEvent).toHaveBeenCalledWith({ @@ -222,7 +238,7 @@ test('saving a new role after editing as YAML', async () => { render(); expect(screen.getByRole('button', { name: 'Create Role' })).toBeEnabled(); - await user.click(screen.getByRole('tab', { name: 'YAML' })); + await user.click(getYamlEditorTab()); await user.clear(await findTextEditor()); await user.type(await findTextEditor(), '{{"foo":"bar"}'); await user.click(screen.getByRole('button', { name: 'Create Role' })); @@ -247,7 +263,7 @@ test('error while yamlifying', async () => { .spyOn(yamlService, 'stringify') .mockRejectedValue(new Error('me no speak yaml')); render(); - await user.click(screen.getByRole('tab', { name: 'YAML' })); + await user.click(getYamlEditorTab()); expect(screen.getByText('me no speak yaml')).toBeVisible(); }); @@ -256,8 +272,8 @@ test('error while parsing', async () => { .spyOn(yamlService, 'parse') .mockRejectedValue(new Error('me no speak yaml')); render(); - await user.click(screen.getByRole('tab', { name: 'YAML' })); - await user.click(screen.getByRole('tab', { name: 'Standard' })); + await user.click(getYamlEditorTab()); + await user.click(getStandardEditorTab()); expect(screen.getByText('me no speak yaml')).toBeVisible(); }); @@ -280,6 +296,12 @@ const TestRoleEditor = (props: RoleEditorProps) => { ); }; +const getStandardEditorTab = () => + screen.getByRole('tab', { name: 'Switch to standard editor' }); + +const getYamlEditorTab = () => + screen.getByRole('tab', { name: 'Switch to YAML editor' }); + const findTextEditor = async () => within(await screen.findByTestId('text-editor-container')).getByRole( 'textbox' diff --git a/web/packages/teleport/src/Roles/RoleEditor/RoleEditor.tsx b/web/packages/teleport/src/Roles/RoleEditor/RoleEditor.tsx index cadef43e0ce26..38e2902ac2878 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/RoleEditor.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/RoleEditor.tsx @@ -16,8 +16,8 @@ * along with this program. If not, see . */ -import { Alert, Box, Flex } from 'design'; -import React, { useState } from 'react'; +import { Alert, Flex } from 'design'; +import React, { useId, useState } from 'react'; import { useAsync } from 'shared/hooks/useAsync'; import { Role, RoleWithYaml } from 'teleport/services/resources'; @@ -32,7 +32,7 @@ import { roleToRoleEditorModel as roleToRoleEditorModel, } from './standardmodel'; import { YamlEditorModel } from './yamlmodel'; -import { EditorTab, EditorTabs } from './EditorTabs'; +import { EditorTab } from './EditorTabs'; import { EditorHeader } from './EditorHeader'; import { StandardEditor } from './StandardEditor'; import { YamlEditor } from './YamlEditor'; @@ -59,6 +59,12 @@ export const RoleEditor = ({ onSave, onDelete, }: RoleEditorProps) => { + const idPrefix = useId(); + // These IDs are needed to connect accessibility attributes between the + // standard/YAML tab switcher and the switched panels. + const standardEditorId = `${idPrefix}-standard`; + const yamlEditorId = `${idPrefix}-yaml`; + const [standardModel, setStandardModel] = useState( () => { const role = originalRole?.object ?? newRole(); @@ -114,6 +120,10 @@ export const RoleEditor = ({ saveAttempt.status === 'processing'; async function onTabChange(activeIndex: EditorTab) { + // The code below is not idempotent, so we need to protect ourselves from + // an accidental model replacement. + if (activeIndex === selectedEditorTab) return; + switch (activeIndex) { case EditorTab.Standard: { if (!yamlModel.content) { @@ -160,7 +170,15 @@ export const RoleEditor = ({ return ( - + {saveAttempt.status === 'error' && ( {saveAttempt.statusText} @@ -176,32 +194,29 @@ export const RoleEditor = ({ {yamlifyAttempt.statusText} )} - - - {selectedEditorTab === EditorTab.Standard && ( - handleSave({ object })} - onCancel={handleCancel} - standardEditorModel={standardModel} - isProcessing={isProcessing} - onChange={setStandardModel} - /> +
+ handleSave({ object })} + onCancel={handleCancel} + standardEditorModel={standardModel} + isProcessing={isProcessing} + onChange={setStandardModel} + /> +
)} {selectedEditorTab === EditorTab.Yaml && ( - void (await handleSave({ yaml }))} - isProcessing={isProcessing} - onCancel={handleCancel} - originalRole={originalRole} - /> + + void (await handleSave({ yaml }))} + isProcessing={isProcessing} + onCancel={handleCancel} + originalRole={originalRole} + /> + )}
); diff --git a/web/packages/teleport/src/Roles/RoleEditor/Shared.tsx b/web/packages/teleport/src/Roles/RoleEditor/Shared.tsx index e6cece6752920..3652e87a537ca 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/Shared.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/Shared.tsx @@ -17,7 +17,7 @@ */ import { Box, ButtonPrimary, ButtonSecondary, Flex } from 'design'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import useTeleport from 'teleport/useTeleport'; diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.test.tsx b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.test.tsx index 4497cbea441d7..59a7af9928081 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.test.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.test.tsx @@ -19,8 +19,8 @@ import { render, screen, userEvent } from 'design/utils/testing'; import React, { useState } from 'react'; -import { within } from '@testing-library/react'; -import Validation from 'shared/components/Validation'; +import { act, within } from '@testing-library/react'; +import Validation, { Validator } from 'shared/components/Validation'; import selectEvent from 'react-select-event'; import TeleportContextProvider from 'teleport/TeleportContextProvider'; @@ -48,6 +48,7 @@ import { StandardEditorProps, WindowsDesktopAccessSpecSection, } from './StandardEditor'; +import { validateAccessSpec } from './validation'; const TestStandardEditor = (props: Partial) => { const ctx = createTeleportContext(); @@ -72,6 +73,8 @@ test('adding and removing sections', async () => { const user = userEvent.setup(); render(); expect(getAllSectionNames()).toEqual(['Role Metadata']); + await user.click(screen.getByRole('tab', { name: 'Resources' })); + expect(getAllSectionNames()).toEqual([]); await user.click( screen.getByRole('button', { name: 'Add New Specifications' }) @@ -85,7 +88,7 @@ test('adding and removing sections', async () => { ]); await user.click(screen.getByRole('menuitem', { name: 'Servers' })); - expect(getAllSectionNames()).toEqual(['Role Metadata', 'Servers']); + expect(getAllSectionNames()).toEqual(['Servers']); await user.click( screen.getByRole('button', { name: 'Add New Specifications' }) @@ -98,25 +101,21 @@ test('adding and removing sections', async () => { ]); await user.click(screen.getByRole('menuitem', { name: 'Kubernetes' })); - expect(getAllSectionNames()).toEqual([ - 'Role Metadata', - 'Servers', - 'Kubernetes', - ]); + expect(getAllSectionNames()).toEqual(['Servers', 'Kubernetes']); await user.click( within(getSectionByName('Servers')).getByRole('button', { name: 'Remove section', }) ); - expect(getAllSectionNames()).toEqual(['Role Metadata', 'Kubernetes']); + expect(getAllSectionNames()).toEqual(['Kubernetes']); await user.click( within(getSectionByName('Kubernetes')).getByRole('button', { name: 'Remove section', }) ); - expect(getAllSectionNames()).toEqual(['Role Metadata']); + expect(getAllSectionNames()).toEqual([]); }); test('collapsed sections still apply validation', async () => { @@ -137,6 +136,24 @@ test('collapsed sections still apply validation', async () => { expect(onSave).toHaveBeenCalled(); }); +test('invisible tabs still apply validation', async () => { + const user = userEvent.setup(); + const onSave = jest.fn(); + render(); + // Intentionally cause a validation error. + await user.clear(screen.getByLabelText('Role Name')); + // Switch to a different tab. + await user.click(screen.getByRole('tab', { name: 'Resources' })); + await user.click(screen.getByRole('button', { name: 'Create Role' })); + expect(onSave).not.toHaveBeenCalled(); + + // Switch back, make it valid. + await user.click(screen.getByRole('tab', { name: 'Invalid data Overview' })); + await user.type(screen.getByLabelText('Role Name'), 'foo'); + await user.click(screen.getByRole('button', { name: 'Create Role' })); + expect(onSave).toHaveBeenCalled(); +}); + const getAllMenuItemNames = () => screen.queryAllByRole('menuitem').map(m => m.textContent); @@ -152,67 +169,105 @@ const StatefulSection = ({ defaultValue, component: Component, onChange, + validatorRef, }: { defaultValue: S; - component: React.ComponentType>; + component: React.ComponentType>; onChange(spec: S): void; + validatorRef?(v: Validator): void; }) => { const [model, setModel] = useState(defaultValue); + const validation = validateAccessSpec(model); return ( - { - setModel(spec); - onChange(spec); - }} - /> + {({ validator }) => { + validatorRef?.(validator); + return ( + { + setModel(spec); + onChange(spec); + }} + /> + ); + }} ); }; -test('ServerAccessSpecSection', async () => { - const user = userEvent.setup(); - const onChange = jest.fn(); - render( - - component={ServerAccessSpecSection} - defaultValue={newAccessSpec('node')} - onChange={onChange} - /> - ); - await user.click(screen.getByRole('button', { name: 'Add a Label' })); - await user.type(screen.getByPlaceholderText('label key'), 'some-key'); - await user.type(screen.getByPlaceholderText('label value'), 'some-value'); - await selectEvent.create(screen.getByLabelText('Logins'), 'root', { - createOptionText: 'Login: root', - }); - await selectEvent.create(screen.getByLabelText('Logins'), 'some-user', { - createOptionText: 'Login: some-user', +describe('ServerAccessSpecSection', () => { + const setup = () => { + const onChange = jest.fn(); + let validator: Validator; + render( + + component={ServerAccessSpecSection} + defaultValue={newAccessSpec('node')} + onChange={onChange} + validatorRef={v => { + validator = v; + }} + /> + ); + return { user: userEvent.setup(), onChange, validator }; + }; + + test('editing', async () => { + const { user, onChange } = setup(); + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + await user.type(screen.getByPlaceholderText('label key'), 'some-key'); + await user.type(screen.getByPlaceholderText('label value'), 'some-value'); + await selectEvent.create(screen.getByLabelText('Logins'), 'root', { + createOptionText: 'Login: root', + }); + await selectEvent.create(screen.getByLabelText('Logins'), 'some-user', { + createOptionText: 'Login: some-user', + }); + + expect(onChange).toHaveBeenLastCalledWith({ + kind: 'node', + labels: [{ name: 'some-key', value: 'some-value' }], + logins: [ + expect.objectContaining({ label: 'root', value: 'root' }), + expect.objectContaining({ label: 'some-user', value: 'some-user' }), + ], + } as ServerAccessSpec); }); - expect(onChange).toHaveBeenLastCalledWith({ - kind: 'node', - labels: [{ name: 'some-key', value: 'some-value' }], - logins: [ - expect.objectContaining({ label: 'root', value: 'root' }), - expect.objectContaining({ label: 'some-user', value: 'some-user' }), - ], - } as ServerAccessSpec); + test('validation', async () => { + const { user, validator } = setup(); + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + await selectEvent.create(screen.getByLabelText('Logins'), '*', { + createOptionText: 'Login: *', + }); + act(() => validator.validate()); + expect( + screen.getByPlaceholderText('label key') + ).toHaveAccessibleDescription('required'); + expect( + screen.getByText('Wildcard is not allowed in logins') + ).toBeInTheDocument(); + }); }); describe('KubernetesAccessSpecSection', () => { const setup = () => { const onChange = jest.fn(); + let validator: Validator; render( component={KubernetesAccessSpecSection} defaultValue={newAccessSpec('kube_cluster')} onChange={onChange} + validatorRef={v => { + validator = v; + }} /> ); - return { user: userEvent.setup(), onChange }; + return { user: userEvent.setup(), onChange, validator }; }; test('editing the spec', async () => { @@ -319,105 +374,199 @@ describe('KubernetesAccessSpecSection', () => { expect.objectContaining({ resources: [] }) ); }); + + test('validation', async () => { + const { user, validator } = setup(); + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + await user.click(screen.getByRole('button', { name: 'Add a Resource' })); + await user.clear(screen.getByLabelText('Name')); + await user.clear(screen.getByLabelText('Namespace')); + act(() => validator.validate()); + expect( + screen.getByPlaceholderText('label key') + ).toHaveAccessibleDescription('required'); + expect(screen.getByLabelText('Name')).toHaveAccessibleDescription( + 'Resource name is required, use "*" for any resource' + ); + expect(screen.getByLabelText('Namespace')).toHaveAccessibleDescription( + 'Namespace is required for resources of this kind' + ); + }); }); -test('AppAccessSpecSection', async () => { - const user = userEvent.setup(); - const onChange = jest.fn(); - render( - - component={AppAccessSpecSection} - defaultValue={newAccessSpec('app')} - onChange={onChange} - /> - ); +describe('AppAccessSpecSection', () => { + const setup = () => { + const onChange = jest.fn(); + let validator: Validator; + render( + + component={AppAccessSpecSection} + defaultValue={newAccessSpec('app')} + onChange={onChange} + validatorRef={v => { + validator = v; + }} + /> + ); + return { user: userEvent.setup(), onChange, validator }; + }; - await user.click(screen.getByRole('button', { name: 'Add a Label' })); - await user.type(screen.getByPlaceholderText('label key'), 'env'); - await user.type(screen.getByPlaceholderText('label value'), 'prod'); - await user.type( + const awsRoleArn = () => within(screen.getByRole('group', { name: 'AWS Role ARNs' })).getByRole( 'textbox' - ), - 'arn:aws:iam::123456789012:role/admin' - ); - await user.type( + ); + const azureIdentity = () => within(screen.getByRole('group', { name: 'Azure Identities' })).getByRole( 'textbox' - ), - '/subscriptions/1020304050607-cafe-8090-a0b0c0d0e0f0/resourceGroups/example-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/admin' - ); - await user.type( + ); + const gcpServiceAccount = () => within( screen.getByRole('group', { name: 'GCP Service Accounts' }) - ).getByRole('textbox'), - 'admin@some-project.iam.gserviceaccount.com' - ); - expect(onChange).toHaveBeenLastCalledWith({ - kind: 'app', - labels: [{ name: 'env', value: 'prod' }], - awsRoleARNs: ['arn:aws:iam::123456789012:role/admin'], - azureIdentities: [ - '/subscriptions/1020304050607-cafe-8090-a0b0c0d0e0f0/resourceGroups/example-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/admin', - ], - gcpServiceAccounts: ['admin@some-project.iam.gserviceaccount.com'], - } as AppAccessSpec); -}); + ).getByRole('textbox'); -test('DatabaseAccessSpecSection', async () => { - const user = userEvent.setup(); - const onChange = jest.fn(); - render( - - component={DatabaseAccessSpecSection} - defaultValue={newAccessSpec('db')} - onChange={onChange} - /> - ); + test('editing', async () => { + const { user, onChange } = setup(); + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + await user.type(screen.getByPlaceholderText('label key'), 'env'); + await user.type(screen.getByPlaceholderText('label value'), 'prod'); + await user.type(awsRoleArn(), 'arn:aws:iam::123456789012:role/admin'); + await user.type( + azureIdentity(), + '/subscriptions/1020304050607-cafe-8090-a0b0c0d0e0f0/resourceGroups/example-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/admin' + ); + await user.type( + gcpServiceAccount(), + 'admin@some-project.iam.gserviceaccount.com' + ); + expect(onChange).toHaveBeenLastCalledWith({ + kind: 'app', + labels: [{ name: 'env', value: 'prod' }], + awsRoleARNs: ['arn:aws:iam::123456789012:role/admin'], + azureIdentities: [ + '/subscriptions/1020304050607-cafe-8090-a0b0c0d0e0f0/resourceGroups/example-resource-group/providers/Microsoft.ManagedIdentity/userAssignedIdentities/admin', + ], + gcpServiceAccounts: ['admin@some-project.iam.gserviceaccount.com'], + } as AppAccessSpec); + }); - await user.click(screen.getByRole('button', { name: 'Add a Label' })); - await user.type(screen.getByPlaceholderText('label key'), 'env'); - await user.type(screen.getByPlaceholderText('label value'), 'prod'); - await selectEvent.create(screen.getByLabelText('Database Names'), 'stuff', { - createOptionText: 'Database Name: stuff', + test('validation', async () => { + const { user, validator } = setup(); + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + await user.type(awsRoleArn(), '*'); + await user.type(azureIdentity(), '*'); + await user.type(gcpServiceAccount(), '*'); + act(() => validator.validate()); + expect( + screen.getByPlaceholderText('label key') + ).toHaveAccessibleDescription('required'); + expect(awsRoleArn()).toHaveAccessibleDescription( + 'Wildcard is not allowed in AWS role ARNs' + ); + expect(azureIdentity()).toHaveAccessibleDescription( + 'Wildcard is not allowed in Azure identities' + ); + expect(gcpServiceAccount()).toHaveAccessibleDescription( + 'Wildcard is not allowed in GCP service accounts' + ); }); - await selectEvent.create(screen.getByLabelText('Database Users'), 'mary', { - createOptionText: 'Database User: mary', +}); + +describe('DatabaseAccessSpecSection', () => { + const setup = () => { + const onChange = jest.fn(); + let validator: Validator; + render( + + component={DatabaseAccessSpecSection} + defaultValue={newAccessSpec('db')} + onChange={onChange} + validatorRef={v => { + validator = v; + }} + /> + ); + return { user: userEvent.setup(), onChange, validator }; + }; + + test('editing', async () => { + const { user, onChange } = setup(); + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + await user.type(screen.getByPlaceholderText('label key'), 'env'); + await user.type(screen.getByPlaceholderText('label value'), 'prod'); + await selectEvent.create(screen.getByLabelText('Database Names'), 'stuff', { + createOptionText: 'Database Name: stuff', + }); + await selectEvent.create(screen.getByLabelText('Database Users'), 'mary', { + createOptionText: 'Database User: mary', + }); + await selectEvent.create(screen.getByLabelText('Database Roles'), 'admin', { + createOptionText: 'Database Role: admin', + }); + expect(onChange).toHaveBeenLastCalledWith({ + kind: 'db', + labels: [{ name: 'env', value: 'prod' }], + names: [expect.objectContaining({ label: 'stuff', value: 'stuff' })], + roles: [expect.objectContaining({ label: 'admin', value: 'admin' })], + users: [expect.objectContaining({ label: 'mary', value: 'mary' })], + } as DatabaseAccessSpec); }); - await selectEvent.create(screen.getByLabelText('Database Roles'), 'admin', { - createOptionText: 'Database Role: admin', + + test('validation', async () => { + const { user, validator } = setup(); + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + await selectEvent.create(screen.getByLabelText('Database Roles'), '*', { + createOptionText: 'Database Role: *', + }); + act(() => validator.validate()); + expect( + screen.getByPlaceholderText('label key') + ).toHaveAccessibleDescription('required'); + expect( + screen.getByText('Wildcard is not allowed in database roles') + ).toBeInTheDocument(); }); - expect(onChange).toHaveBeenLastCalledWith({ - kind: 'db', - labels: [{ name: 'env', value: 'prod' }], - names: [expect.objectContaining({ label: 'stuff', value: 'stuff' })], - roles: [expect.objectContaining({ label: 'admin', value: 'admin' })], - users: [expect.objectContaining({ label: 'mary', value: 'mary' })], - } as DatabaseAccessSpec); }); -test('WindowsDesktopAccessSpecSection', async () => { - const user = userEvent.setup(); - const onChange = jest.fn(); - render( - - component={WindowsDesktopAccessSpecSection} - defaultValue={newAccessSpec('windows_desktop')} - onChange={onChange} - /> - ); +describe('WindowsDesktopAccessSpecSection', () => { + const setup = () => { + const onChange = jest.fn(); + let validator: Validator; + render( + + component={WindowsDesktopAccessSpecSection} + defaultValue={newAccessSpec('windows_desktop')} + onChange={onChange} + validatorRef={v => { + validator = v; + }} + /> + ); + return { user: userEvent.setup(), onChange, validator }; + }; - await user.click(screen.getByRole('button', { name: 'Add a Label' })); - await user.type(screen.getByPlaceholderText('label key'), 'os'); - await user.type(screen.getByPlaceholderText('label value'), 'win-xp'); - await selectEvent.create(screen.getByLabelText('Logins'), 'julio', { - createOptionText: 'Login: julio', + test('editing', async () => { + const { user, onChange } = setup(); + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + await user.type(screen.getByPlaceholderText('label key'), 'os'); + await user.type(screen.getByPlaceholderText('label value'), 'win-xp'); + await selectEvent.create(screen.getByLabelText('Logins'), 'julio', { + createOptionText: 'Login: julio', + }); + expect(onChange).toHaveBeenLastCalledWith({ + kind: 'windows_desktop', + labels: [{ name: 'os', value: 'win-xp' }], + logins: [expect.objectContaining({ label: 'julio', value: 'julio' })], + } as WindowsDesktopAccessSpec); + }); + + test('validation', async () => { + const { user, validator } = setup(); + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + act(() => validator.validate()); + expect( + screen.getByPlaceholderText('label key') + ).toHaveAccessibleDescription('required'); }); - expect(onChange).toHaveBeenLastCalledWith({ - kind: 'windows_desktop', - labels: [{ name: 'os', value: 'win-xp' }], - logins: [expect.objectContaining({ label: 'julio', value: 'julio' })], - } as WindowsDesktopAccessSpec); }); const reactSelectValueContainer = (input: HTMLInputElement) => diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx index 01789e1f2f837..bf1567ee235cd 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React, { useState } from 'react'; +import React, { useId, useState } from 'react'; import { Box, ButtonIcon, @@ -28,21 +28,25 @@ import { Text, } from 'design'; import FieldInput from 'shared/components/FieldInput'; -import Validation, { Validator } from 'shared/components/Validation'; -import { requiredField } from 'shared/components/Validation/rules'; +import Validation, { + useValidation, + Validator, +} from 'shared/components/Validation'; +import { + precomputed, + ValidationResult, +} from 'shared/components/Validation/rules'; import * as Icon from 'design/Icon'; -import { HoverTooltip, ToolTipInfo } from 'shared/components/ToolTip'; +import { HoverTooltip, IconTooltip } from 'design/Tooltip'; import styled, { useTheme } from 'styled-components'; - import { MenuButton, MenuItem } from 'shared/components/MenuAction'; - import { FieldSelect, FieldSelectCreatable, } from 'shared/components/FieldSelect'; +import { SlideTabs } from 'design/SlideTabs'; import { Role, RoleWithYaml } from 'teleport/services/resources'; - import { LabelsInput } from 'teleport/components/LabelsInput'; import { FieldMultiInput } from '../../../../shared/components/FieldMultiInput/FieldMultiInput'; @@ -66,6 +70,17 @@ import { DatabaseAccessSpec, WindowsDesktopAccessSpec, } from './standardmodel'; +import { + validateRoleEditorModel, + MetadataValidationResult, + AccessSpecValidationResult, + ServerSpecValidationResult, + KubernetesSpecValidationResult, + KubernetesResourceValidationResult, + AppSpecValidationResult, + DatabaseSpecValidationResult, + WindowsDesktopSpecValidationResult, +} from './validation'; import { EditorSaveCancelButton } from './Shared'; import { RequiresResetToStandard } from './RequiresResetToStandard'; @@ -92,12 +107,27 @@ export const StandardEditor = ({ }: StandardEditorProps) => { const isEditing = !!originalRole; const { roleModel } = standardEditorModel; + const validation = validateRoleEditorModel(roleModel); /** All spec kinds except those that are already in the role. */ const allowedSpecKinds = allAccessSpecKinds.filter(k => roleModel.accessSpecs.every(as => as.kind !== k) ); + enum StandardEditorTab { + Overview, + Resources, + AdminRules, + Options, + } + + const [currentTab, setCurrentTab] = useState(StandardEditorTab.Overview); + const idPrefix = useId(); + const overviewTabId = `${idPrefix}-overview`; + const resourcesTabId = `${idPrefix}-resources`; + const adminRulesTabId = `${idPrefix}-admin-rules`; + const optionsTabId = `${idPrefix}-options`; + function handleSave(validator: Validator) { if (!validator.validate()) { return; @@ -169,53 +199,113 @@ export const StandardEditor = ({ mute={standardEditorModel.roleModel.requiresReset} data-testid="standard-editor" > - + + !s.valid) + ? validationErrorTabStatus + : undefined, + }, + { + key: StandardEditorTab.AdminRules, + title: 'Admin Rules', + controls: adminRulesTabId, + }, + { + key: StandardEditorTab.Options, + title: 'Options', + controls: optionsTabId, + }, + ]} + activeIndex={currentTab} + onChange={setCurrentTab} + /> + +
handleChange({ ...roleModel, metadata })} /> - {roleModel.accessSpecs.map(spec => ( - setAccessSpec(value)} - onRemove={() => removeAccessSpec(spec.kind)} - /> - ))} - - - - Add New Specifications - - } - buttonProps={{ - size: 'medium', - fill: 'filled', - disabled: isProcessing || allowedSpecKinds.length === 0, - }} - > - {allowedSpecKinds.map(kind => ( - addAccessSpec(kind)}> - {specSections[kind].title} - - ))} - - - +
+
+ + {roleModel.accessSpecs.map((spec, i) => { + const validationResult = validation.accessSpecs[i]; + return ( + setAccessSpec(value)} + onRemove={() => removeAccessSpec(spec.kind)} + /> + ); + })} + + + + Add New Specifications + + } + buttonProps={{ + size: 'medium', + fill: 'filled', + disabled: isProcessing || allowedSpecKinds.length === 0, + }} + > + {allowedSpecKinds.map(kind => ( + addAccessSpec(kind)}> + {specSections[kind].title} + + ))} + + + +
handleSave(validator)} @@ -233,28 +323,36 @@ export const StandardEditor = ({ ); }; -export type SectionProps = { +export type SectionProps = { value: T; isProcessing: boolean; + validation?: V; onChange?(value: T): void; }; +const validationErrorTabStatus = { + kind: 'danger', + ariaLabel: 'Invalid data', +} as const; + const MetadataSection = ({ value, isProcessing, + validation, onChange, -}: SectionProps) => ( +}: SectionProps) => (
onChange({ ...value, name: e.target.value })} /> ) => { const theme = useTheme(); const [expanded, setExpanded] = useState(true); const ExpandIcon = expanded ? Icon.Minus : Icon.Plus; const expandTooltip = expanded ? 'Collapse' : 'Expand'; + const validator = useValidation(); const handleExpand = (e: React.MouseEvent) => { // Don't let handle the event, we'll do it ourselves to keep @@ -311,7 +412,11 @@ const Section = ({ as="details" open={expanded} border={1} - borderColor={theme.colors.interactive.tonal.neutral[0]} + borderColor={ + validator.state.validating && !validation.valid + ? theme.colors.interactive.solid.danger.default + : theme.colors.interactive.tonal.neutral[0] + } borderRadius={3} >

{title}

- {tooltip && {tooltip}} + {tooltip && {tooltip}}
{removable && ( >; + component: React.ComponentType>; } > = { kube_cluster: { @@ -409,12 +514,16 @@ const specSections: Record< * A generic access spec section. Details are rendered by components from the * `specSections` map. */ -const AccessSpecSection = ({ +const AccessSpecSection = < + T extends AccessSpec, + V extends AccessSpecValidationResult, +>({ value, isProcessing, + validation, onChange, onRemove, -}: SectionProps & { +}: SectionProps & { onRemove?(): void; }) => { const { component: Body, title, tooltip } = specSections[value.kind]; @@ -425,8 +534,14 @@ const AccessSpecSection = ({ onRemove={onRemove} tooltip={tooltip} isProcessing={isProcessing} + validation={validation} > - +
); }; @@ -434,8 +549,9 @@ const AccessSpecSection = ({ export function ServerAccessSpecSection({ value, isProcessing, + validation, onChange, -}: SectionProps) { +}: SectionProps) { return ( <> @@ -445,6 +561,7 @@ export function ServerAccessSpecSection({ disableBtns={isProcessing} labels={value.labels} setLabels={labels => onChange?.({ ...value, labels })} + rule={precomputed(validation.fields.labels)} /> onChange?.({ ...value, logins })} + rule={precomputed(validation.fields.logins)} mt={3} mb={0} /> @@ -467,8 +585,9 @@ export function ServerAccessSpecSection({ export function KubernetesAccessSpecSection({ value, isProcessing, + validation, onChange, -}: SectionProps) { +}: SectionProps) { return ( <> onChange?.({ ...value, labels })} /> @@ -498,6 +618,7 @@ export function KubernetesAccessSpecSection({ onChange?.({ @@ -540,11 +661,13 @@ export function KubernetesAccessSpecSection({ function KubernetesResourceView({ value, + validation, isProcessing, onChange, onRemove, }: { value: KubernetesResourceModel; + validation: KubernetesResourceValidationResult; isProcessing: boolean; onChange(m: KubernetesResourceModel): void; onRemove(): void; @@ -590,6 +713,7 @@ function KubernetesResourceView({ } disabled={isProcessing} value={name} + rule={precomputed(validation.name)} onChange={e => onChange?.({ ...value, name: e.target.value })} /> onChange?.({ ...value, namespace: e.target.value })} /> ) { +}: SectionProps) { return ( @@ -632,6 +758,7 @@ export function AppAccessSpecSection({ disableBtns={isProcessing} labels={value.labels} setLabels={labels => onChange?.({ ...value, labels })} + rule={precomputed(validation.fields.labels)} /> onChange?.({ ...value, awsRoleARNs: arns })} + rule={precomputed(validation.fields.awsRoleARNs)} /> onChange?.({ ...value, azureIdentities: ids })} + rule={precomputed(validation.fields.azureIdentities)} /> onChange?.({ ...value, gcpServiceAccounts: accts })} + rule={precomputed(validation.fields.gcpServiceAccounts)} /> ); @@ -659,8 +789,9 @@ export function AppAccessSpecSection({ export function DatabaseAccessSpecSection({ value, isProcessing, + validation, onChange, -}: SectionProps) { +}: SectionProps) { return ( <> @@ -671,6 +802,7 @@ export function DatabaseAccessSpecSection({ disableBtns={isProcessing} labels={value.labels} setLabels={labels => onChange?.({ ...value, labels })} + rule={precomputed(validation.fields.labels)} /> onChange?.({ ...value, roles })} + rule={precomputed(validation.fields.roles)} mb={0} /> @@ -730,8 +863,9 @@ export function DatabaseAccessSpecSection({ export function WindowsDesktopAccessSpecSection({ value, isProcessing, + validation, onChange, -}: SectionProps) { +}: SectionProps) { return ( <> @@ -742,6 +876,7 @@ export function WindowsDesktopAccessSpecSection({ disableBtns={isProcessing} labels={value.labels} setLabels={labels => onChange?.({ ...value, labels })} + rule={precomputed(validation.fields.labels)} /> ; -type KubernetesResourceKind = - | '*' - | 'pod' - | 'secret' - | 'configmap' - | 'namespace' - | 'service' - | 'serviceaccount' - | 'kube_node' - | 'persistentvolume' - | 'persistentvolumeclaim' - | 'deployment' - | 'replicaset' - | 'statefulset' - | 'daemonset' - | 'clusterrole' - | 'kube_role' - | 'clusterrolebinding' - | 'rolebinding' - | 'cronjob' - | 'job' - | 'certificatesigningrequest' - | 'ingress'; /** * All possible resource kind drop-down options. This array needs to be kept in @@ -172,19 +151,6 @@ export const kubernetesResourceKindOptions: KubernetesResourceKindOption[] = [ ]; type KubernetesVerbOption = Option; -type KubernetesVerb = - | '*' - | 'get' - | 'create' - | 'update' - | 'patch' - | 'delete' - | 'list' - | 'watch' - | 'deletecollection' - | 'exec' - | 'portforward'; - /** * All possible Kubernetes verb drop-down options. This array needs to be kept * in sync with `KubernetesVerbs` in `api/types/constants.go. @@ -590,7 +556,7 @@ export function labelsModelToLabels(uiLabels: UILabel[]): Labels { return labels; } -function optionsToStrings(opts: readonly Option[]): string[] { +function optionsToStrings(opts: readonly Option[]): T[] { return opts.map(opt => opt.value); } diff --git a/web/packages/teleport/src/Roles/RoleEditor/validation.ts b/web/packages/teleport/src/Roles/RoleEditor/validation.ts new file mode 100644 index 0000000000000..95cde89ed036c --- /dev/null +++ b/web/packages/teleport/src/Roles/RoleEditor/validation.ts @@ -0,0 +1,168 @@ +/** + * 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 . + */ + +import { + arrayOf, + requiredField, + RuleSetValidationResult, + runRules, + ValidationResult, +} from 'shared/components/Validation/rules'; + +import { Option } from 'shared/components/Select'; + +import { KubernetesResourceKind } from 'teleport/services/resources'; + +import { nonEmptyLabels } from 'teleport/components/LabelsInput/LabelsInput'; + +import { + AccessSpec, + KubernetesResourceModel, + MetadataModel, + RoleEditorModel, +} from './standardmodel'; + +const kubernetesClusterWideResourceKinds: KubernetesResourceKind[] = [ + 'namespace', + 'kube_node', + 'persistentvolume', + 'clusterrole', + 'clusterrolebinding', + 'certificatesigningrequest', +]; + +export function validateRoleEditorModel({ + metadata, + accessSpecs, +}: RoleEditorModel) { + return { + metadata: validateMetadata(metadata), + accessSpecs: accessSpecs.map(validateAccessSpec), + }; +} + +function validateMetadata(model: MetadataModel): MetadataValidationResult { + return runRules(model, metadataRules); +} + +const metadataRules = { name: requiredField('Role name is required') }; +export type MetadataValidationResult = RuleSetValidationResult< + typeof metadataRules +>; + +export function validateAccessSpec( + spec: AccessSpec +): AccessSpecValidationResult { + const { kind } = spec; + switch (kind) { + case 'kube_cluster': + return runRules(spec, kubernetesValidationRules); + case 'node': + return runRules(spec, serverValidationRules); + case 'app': + return runRules(spec, appSpecValidationRules); + case 'db': + return runRules(spec, databaseSpecValidationRules); + case 'windows_desktop': + return runRules(spec, windowsDesktopSpecValidationRules); + default: + kind satisfies never; + } +} + +export type AccessSpecValidationResult = + | ServerSpecValidationResult + | KubernetesSpecValidationResult + | AppSpecValidationResult + | DatabaseSpecValidationResult + | WindowsDesktopSpecValidationResult; + +const validKubernetesResource = (res: KubernetesResourceModel) => () => { + const name = requiredField( + 'Resource name is required, use "*" for any resource' + )(res.name)(); + const namespace = kubernetesClusterWideResourceKinds.includes(res.kind.value) + ? { valid: true } + : requiredField('Namespace is required for resources of this kind')( + res.namespace + )(); + return { + valid: name.valid && namespace.valid, + name, + namespace, + }; +}; +export type KubernetesResourceValidationResult = { + name: ValidationResult; + namespace: ValidationResult; +}; + +const kubernetesValidationRules = { + labels: nonEmptyLabels, + resources: arrayOf(validKubernetesResource), +}; +export type KubernetesSpecValidationResult = RuleSetValidationResult< + typeof kubernetesValidationRules +>; + +const noWildcard = (message: string) => (value: string) => () => { + const valid = value !== '*'; + return { valid, message: valid ? '' : message }; +}; + +const noWildcardOptions = (message: string) => (options: Option[]) => () => { + const valid = options.every(o => o.value !== '*'); + return { valid, message: valid ? '' : message }; +}; + +const serverValidationRules = { + labels: nonEmptyLabels, + logins: noWildcardOptions('Wildcard is not allowed in logins'), +}; +export type ServerSpecValidationResult = RuleSetValidationResult< + typeof serverValidationRules +>; + +const appSpecValidationRules = { + labels: nonEmptyLabels, + awsRoleARNs: arrayOf(noWildcard('Wildcard is not allowed in AWS role ARNs')), + azureIdentities: arrayOf( + noWildcard('Wildcard is not allowed in Azure identities') + ), + gcpServiceAccounts: arrayOf( + noWildcard('Wildcard is not allowed in GCP service accounts') + ), +}; +export type AppSpecValidationResult = RuleSetValidationResult< + typeof appSpecValidationRules +>; + +const databaseSpecValidationRules = { + labels: nonEmptyLabels, + roles: noWildcardOptions('Wildcard is not allowed in database roles'), +}; +export type DatabaseSpecValidationResult = RuleSetValidationResult< + typeof databaseSpecValidationRules +>; + +const windowsDesktopSpecValidationRules = { + labels: nonEmptyLabels, +}; +export type WindowsDesktopSpecValidationResult = RuleSetValidationResult< + typeof windowsDesktopSpecValidationRules +>; diff --git a/web/packages/teleport/src/Roles/RoleList/RoleList.tsx b/web/packages/teleport/src/Roles/RoleList/RoleList.tsx index d537eba3a43ad..5641442e43d78 100644 --- a/web/packages/teleport/src/Roles/RoleList/RoleList.tsx +++ b/web/packages/teleport/src/Roles/RoleList/RoleList.tsx @@ -24,6 +24,7 @@ import { SearchPanel } from 'shared/components/Search'; import { SeversidePagination } from 'teleport/components/hooks/useServersidePagination'; import { RoleResource } from 'teleport/services/resources'; +import { Access } from 'teleport/services/user'; export function RoleList({ onEdit, @@ -31,13 +32,18 @@ export function RoleList({ onSearchChange, search, serversidePagination, + rolesAcl, }: { onEdit(id: string): void; onDelete(id: string): void; onSearchChange(search: string): void; search: string; serversidePagination: SeversidePagination; + rolesAcl: Access; }) { + const canEdit = rolesAcl.edit; + const canDelete = rolesAcl.remove; + return ( ( onEdit(role.id)} onDelete={() => onDelete(role.id)} /> @@ -80,12 +88,22 @@ export function RoleList({ ); } -const ActionCell = (props: { onEdit(): void; onDelete(): void }) => { +const ActionCell = (props: { + canEdit: boolean; + canDelete: boolean; + onEdit(): void; + onDelete(): void; +}) => { + if (!(props.canEdit || props.canDelete)) { + return ; + } return ( - Edit... - Delete... + {props.canEdit && Edit} + {props.canDelete && ( + Delete + )} ); diff --git a/web/packages/teleport/src/Roles/Roles.story.tsx b/web/packages/teleport/src/Roles/Roles.story.tsx index c0d197a8f0196..f5be3186c0eaf 100644 --- a/web/packages/teleport/src/Roles/Roles.story.tsx +++ b/web/packages/teleport/src/Roles/Roles.story.tsx @@ -81,4 +81,11 @@ const sample = { remove: () => null, create: () => null, update: () => null, + rolesAcl: { + list: true, + create: true, + remove: true, + edit: true, + read: true, + }, }; diff --git a/web/packages/teleport/src/Roles/Roles.test.tsx b/web/packages/teleport/src/Roles/Roles.test.tsx new file mode 100644 index 0000000000000..1edae5ee235e6 --- /dev/null +++ b/web/packages/teleport/src/Roles/Roles.test.tsx @@ -0,0 +1,211 @@ +/** + * 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 . + */ + +import { MemoryRouter } from 'react-router'; +import { render, screen, fireEvent, waitFor } from 'design/utils/testing'; + +import { ContextProvider } from 'teleport'; +import { createTeleportContext } from 'teleport/mocks/contexts'; + +import { Roles } from './Roles'; +import { State } from './useRoles'; + +describe('Roles list', () => { + const defaultState: State = { + create: jest.fn(), + fetch: jest.fn(), + remove: jest.fn(), + update: jest.fn(), + rolesAcl: { + read: true, + remove: true, + create: true, + edit: true, + list: true, + }, + }; + + beforeEach(() => { + jest.spyOn(defaultState, 'fetch').mockResolvedValue({ + startKey: '', + items: [ + { + content: '', + id: '1', + kind: 'role', + name: 'cool-role', + description: 'coolest-role', + }, + ], + }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + test('button is enabled if user has create perms', async () => { + const ctx = createTeleportContext(); + render( + + + + + + ); + + await waitFor(() => { + expect(screen.getByTestId('create_new_role_button')).toBeEnabled(); + }); + }); + + test('displays disabled create button', async () => { + const ctx = createTeleportContext(); + const testState = { + ...defaultState, + rolesAcl: { + ...defaultState.rolesAcl, + create: false, + }, + }; + + render( + + + + + + ); + + await waitFor(() => { + expect(screen.getByTestId('create_new_role_button')).toBeDisabled(); + }); + }); + + test('all options available', async () => { + const ctx = createTeleportContext(); + + render( + + + + + + ); + + await waitFor(() => { + expect( + screen.getByRole('button', { name: /options/i }) + ).toBeInTheDocument(); + }); + const optionsButton = screen.getByRole('button', { name: /options/i }); + fireEvent.click(optionsButton); + const menuItems = screen.queryAllByRole('menuitem'); + expect(menuItems).toHaveLength(2); + }); + + test('hides edit button if no access', async () => { + const ctx = createTeleportContext(); + const testState = { + ...defaultState, + rolesAcl: { + ...defaultState.rolesAcl, + edit: false, + }, + }; + + render( + + + + + + ); + + await waitFor(() => { + expect( + screen.getByRole('button', { name: /options/i }) + ).toBeInTheDocument(); + }); + const optionsButton = screen.getByRole('button', { name: /options/i }); + fireEvent.click(optionsButton); + const menuItems = screen.queryAllByRole('menuitem'); + expect(menuItems).toHaveLength(1); + expect(menuItems.every(item => item.textContent.includes('Edit'))).not.toBe( + true + ); + }); + + test('hides delete button if no access', async () => { + const ctx = createTeleportContext(); + const testState = { + ...defaultState, + rolesAcl: { + ...defaultState.rolesAcl, + remove: false, + }, + }; + + render( + + + + + + ); + + await waitFor(() => { + expect( + screen.getByRole('button', { name: /options/i }) + ).toBeInTheDocument(); + }); + const optionsButton = screen.getByRole('button', { name: /options/i }); + fireEvent.click(optionsButton); + const menuItems = screen.queryAllByRole('menuitem'); + expect(menuItems).toHaveLength(1); + expect( + menuItems.every(item => item.textContent.includes('Delete')) + ).not.toBe(true); + }); + + test('hides Options button if no permissions to edit or delete', async () => { + const ctx = createTeleportContext(); + const testState = { + ...defaultState, + rolesAcl: { + ...defaultState.rolesAcl, + remove: false, + edit: false, + }, + }; + + render( + + + + + + ); + + await waitFor(() => { + expect(screen.getByText('cool-role')).toBeInTheDocument(); + }); + const menuItems = screen.queryAllByRole('menuitem'); + expect(menuItems).toHaveLength(0); + }); +}); diff --git a/web/packages/teleport/src/Roles/Roles.tsx b/web/packages/teleport/src/Roles/Roles.tsx index d04034b475609..9f98116131706 100644 --- a/web/packages/teleport/src/Roles/Roles.tsx +++ b/web/packages/teleport/src/Roles/Roles.tsx @@ -22,6 +22,8 @@ import { P } from 'design/Text/Text'; import { useAsync } from 'shared/hooks/useAsync'; import { Danger } from 'design/Alert'; import { useTheme } from 'styled-components'; +import { MissingPermissionsTooltip } from 'shared/components/MissingPermissionsTooltip'; +import { HoverTooltip } from 'design/Tooltip'; import { FeatureBox, @@ -55,7 +57,7 @@ export function RolesContainer() { const useNewRoleEditor = storageService.getUseNewRoleEditor(); export function Roles(props: State) { - const { remove, create, update, fetch } = props; + const { remove, create, update, fetch, rolesAcl } = props; const [search, setSearch] = useState(''); const serverSidePagination = useServerSidePagination({ @@ -142,36 +144,54 @@ export function Roles(props: State) { } } + const canCreate = rolesAcl.create; + return ( - + Roles - + + {serverSidePagination.attempt.status === 'failed' && ( )} - + @@ -279,7 +299,7 @@ function RoleEditorAdapter({ p={4} borderLeft={1} borderColor={theme.colors.interactive.tonal.neutral[0]} - width="900px" + width="700px" > {convertAttempt.status === 'processing' && ( ) { return ctx.resourceService.createRole(await toYaml(role)); } @@ -45,6 +47,7 @@ export function useRoles(ctx: TeleportContext) { create, update, remove, + rolesAcl, }; } diff --git a/web/packages/teleport/src/TopBar/TopBar.tsx b/web/packages/teleport/src/TopBar/TopBar.tsx index 20c828f7c5510..e19e71ca780cd 100644 --- a/web/packages/teleport/src/TopBar/TopBar.tsx +++ b/web/packages/teleport/src/TopBar/TopBar.tsx @@ -23,7 +23,7 @@ import { Flex, Image, Text, TopNav } from 'design'; import { matchPath, useHistory } from 'react-router'; import { Theme } from 'design/theme/themes/types'; import { ArrowLeft, Download, Server, SlidersVertical } from 'design/Icon'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import useTeleport from 'teleport/useTeleport'; import { UserMenuNav } from 'teleport/components/UserMenuNav'; diff --git a/web/packages/teleport/src/TopBar/TopBarSideNav.tsx b/web/packages/teleport/src/TopBar/TopBarSideNav.tsx index c787f984fa763..54b8b95bcd8e2 100644 --- a/web/packages/teleport/src/TopBar/TopBarSideNav.tsx +++ b/web/packages/teleport/src/TopBar/TopBarSideNav.tsx @@ -22,7 +22,7 @@ import { Link } from 'react-router-dom'; import { Flex, Image, TopNav } from 'design'; import { matchPath, useHistory } from 'react-router'; import { Theme } from 'design/theme/themes/types'; -import { HoverTooltip } from 'shared/components/ToolTip'; +import { HoverTooltip } from 'design/Tooltip'; import useTeleport from 'teleport/useTeleport'; import { UserMenuNav } from 'teleport/components/UserMenuNav'; diff --git a/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx b/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx index 8ca13cd5ce0a4..0e2b314736e12 100644 --- a/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx +++ b/web/packages/teleport/src/UnifiedResources/UnifiedResources.tsx @@ -46,7 +46,6 @@ import { import { useNoMinWidth } from 'teleport/Main'; import AgentButtonAdd from 'teleport/components/AgentButtonAdd'; import { SearchResource } from 'teleport/Discover/SelectResource'; -import { encodeUrlQueryParams } from 'teleport/components/hooks/useUrlFiltering'; import Empty, { EmptyStateInfo } from 'teleport/components/Empty'; import { FeatureFlags } from 'teleport/types'; import { UnifiedResource } from 'teleport/services/agents'; @@ -132,7 +131,7 @@ export function ClusterResources({ const canCreate = teleCtx.storeUser.getTokenAccess().create; const [loadClusterError, setLoadClusterError] = useState(''); - const { params, setParams, replaceHistory, pathname } = useUrlFiltering( + const { params, setParams } = useUrlFiltering( { sort: { fieldName: 'name', @@ -274,22 +273,7 @@ export function ClusterResources({ ) || , }, }))} - setParams={newParams => { - setParams(newParams); - const isAdvancedSearch = !!newParams.query; - replaceHistory( - encodeUrlQueryParams({ - pathname, - searchString: isAdvancedSearch - ? newParams.query - : newParams.search, - sort: newParams.sort, - kinds: newParams.kinds, - isAdvancedSearch, - pinnedOnly: newParams.pinnedOnly, - }) - ); - }} + setParams={setParams} Header={ <> - + } diff --git a/web/packages/teleport/src/Users/UserList/UserList.tsx b/web/packages/teleport/src/Users/UserList/UserList.tsx index 34fb89d08e426..00ad7f5de34cf 100644 --- a/web/packages/teleport/src/Users/UserList/UserList.tsx +++ b/web/packages/teleport/src/Users/UserList/UserList.tsx @@ -20,7 +20,7 @@ import React from 'react'; import { Cell, LabelCell } from 'design/DataTable'; import { MenuButton, MenuItem } from 'shared/components/MenuAction'; -import { User, UserOrigin } from 'teleport/services/user'; +import { Access, User, UserOrigin } from 'teleport/services/user'; import { ClientSearcheableTableWithQueryParamSupport } from 'teleport/components/ClientSearcheableTableWithQueryParamSupport'; export default function UserList({ @@ -29,6 +29,7 @@ export default function UserList({ onEdit, onDelete, onReset, + usersAcl, }: Props) { return ( ( void; onReset: (user: User) => void; onDelete: (user: User) => void; + acl: Access; }) => { + const canEdit = acl.edit; + const canDelete = acl.remove; + + if (!(canEdit || canDelete)) { + return ; + } + if (user.isBot || !user.isLocal) { return ; } @@ -131,11 +142,15 @@ const ActionCell = ({ return ( - onEdit(user)}>Edit... - onReset(user)}> - Reset Authentication... - - onDelete(user)}>Delete... + {canEdit && onEdit(user)}>Edit...} + {canEdit && ( + onReset(user)}> + Reset Authentication... + + )} + {canDelete && ( + onDelete(user)}>Delete... + )} ); @@ -147,4 +162,7 @@ type Props = { onEdit(user: User): void; onDelete(user: User): void; onReset(user: User): void; + // determines if the viewer is able to edit/delete users. This is used + // to conditionally render the edit/delete buttons in the ActionCell + usersAcl: Access; }; diff --git a/web/packages/teleport/src/Users/Users.story.tsx b/web/packages/teleport/src/Users/Users.story.tsx index fc905715582c2..eaccc82097e9a 100644 --- a/web/packages/teleport/src/Users/Users.story.tsx +++ b/web/packages/teleport/src/Users/Users.story.tsx @@ -149,4 +149,12 @@ const sample = { EmailPasswordReset: null, showMauInfo: false, onDismissUsersMauNotice: () => null, + canEditUsers: true, + usersAcl: { + read: true, + edit: false, + remove: true, + list: true, + create: true, + }, }; diff --git a/web/packages/teleport/src/Users/Users.test.tsx b/web/packages/teleport/src/Users/Users.test.tsx index 154047002d29e..0d5d02ee7e710 100644 --- a/web/packages/teleport/src/Users/Users.test.tsx +++ b/web/packages/teleport/src/Users/Users.test.tsx @@ -18,14 +18,23 @@ import React from 'react'; import { MemoryRouter } from 'react-router'; -import { render, screen, userEvent } from 'design/utils/testing'; +import { render, screen, userEvent, fireEvent } from 'design/utils/testing'; import { ContextProvider } from 'teleport'; import { createTeleportContext } from 'teleport/mocks/contexts'; +import { Access } from 'teleport/services/user'; import { Users } from './Users'; import { State } from './useUsers'; +const defaultAcl: Access = { + read: true, + edit: true, + remove: true, + list: true, + create: true, +}; + describe('invite collaborators integration', () => { const ctx = createTeleportContext(); @@ -59,6 +68,7 @@ describe('invite collaborators integration', () => { EmailPasswordReset: null, showMauInfo: false, onDismissUsersMauNotice: () => null, + usersAcl: defaultAcl, }; }); @@ -138,6 +148,7 @@ test('Users not equal to MAU Notice', async () => { EmailPasswordReset: null, showMauInfo: true, onDismissUsersMauNotice: jest.fn(), + usersAcl: defaultAcl, }; const user = userEvent.setup(); @@ -192,6 +203,7 @@ describe('email password reset integration', () => { EmailPasswordReset: null, showMauInfo: false, onDismissUsersMauNotice: () => null, + usersAcl: defaultAcl, }; }); @@ -232,3 +244,158 @@ describe('email password reset integration', () => { expect(screen.getByTestId('new-reset-ui')).toBeInTheDocument(); }); }); + +describe('permission handling', () => { + const ctx = createTeleportContext(); + + let props: State; + beforeEach(() => { + props = { + attempt: { + message: 'success', + isSuccess: true, + isProcessing: false, + isFailed: false, + }, + users: [ + { + name: 'tester', + roles: [], + isLocal: true, + }, + ], + fetchRoles: () => Promise.resolve([]), + operation: { + type: 'reset', + user: { name: 'alice@example.com', roles: ['foo'] }, + }, + + onStartCreate: () => undefined, + onStartDelete: () => undefined, + onStartEdit: () => undefined, + onStartReset: () => undefined, + onStartInviteCollaborators: () => undefined, + onClose: () => undefined, + onDelete: () => undefined, + onCreate: () => undefined, + onUpdate: () => undefined, + onReset: () => undefined, + onInviteCollaboratorsClose: () => undefined, + InviteCollaborators: null, + inviteCollaboratorsOpen: false, + onEmailPasswordResetClose: () => undefined, + EmailPasswordReset: null, + showMauInfo: false, + onDismissUsersMauNotice: () => null, + usersAcl: defaultAcl, + }; + }); + + test('displays a disabled Create Users button if lacking permissions', async () => { + const testProps = { + ...props, + usersAcl: { + ...defaultAcl, + edit: false, + }, + }; + render( + + + + + + ); + + expect(screen.getByTestId('create_new_users_button')).toBeDisabled(); + }); + + test('edit and reset options not available in the menu', async () => { + const testProps = { + ...props, + usersAcl: { + ...defaultAcl, + edit: false, + }, + }; + render( + + + + + + ); + + const optionsButton = screen.getByRole('button', { name: /options/i }); + fireEvent.click(optionsButton); + const menuItems = screen.queryAllByRole('menuitem'); + expect(menuItems).toHaveLength(1); + expect(menuItems.some(item => item.textContent.includes('Delete'))).toBe( + true + ); + }); + + test('all options are available in the menu', async () => { + const testProps = { + ...props, + usersAcl: { + read: true, + list: true, + edit: true, + create: true, + remove: true, + }, + }; + render( + + + + + + ); + + expect(screen.getByText('tester')).toBeInTheDocument(); + const optionsButton = screen.getByRole('button', { name: /options/i }); + fireEvent.click(optionsButton); + const menuItems = screen.queryAllByRole('menuitem'); + expect(menuItems).toHaveLength(3); + expect(menuItems.some(item => item.textContent.includes('Delete'))).toBe( + true + ); + expect( + menuItems.some(item => item.textContent.includes('Reset Auth')) + ).toBe(true); + expect(menuItems.some(item => item.textContent.includes('Edit'))).toBe( + true + ); + }); + + test('delete is not available in menu', async () => { + const testProps = { + ...props, + usersAcl: { + read: true, + list: true, + edit: true, + create: true, + remove: false, + }, + }; + render( + + + + + + ); + + expect(screen.getByText('tester')).toBeInTheDocument(); + const optionsButton = screen.getByRole('button', { name: /options/i }); + fireEvent.click(optionsButton); + const menuItems = screen.queryAllByRole('menuitem'); + expect(menuItems).toHaveLength(2); + expect( + menuItems.every(item => item.textContent.includes('Delete')) + ).not.toBe(true); + }); +}); diff --git a/web/packages/teleport/src/Users/Users.tsx b/web/packages/teleport/src/Users/Users.tsx index f36b8d70bf6d0..16c007045752c 100644 --- a/web/packages/teleport/src/Users/Users.tsx +++ b/web/packages/teleport/src/Users/Users.tsx @@ -17,7 +17,8 @@ */ import React from 'react'; -import { Indicator, Box, Alert, Button, Link } from 'design'; +import { Indicator, Text, Flex, Box, Alert, Button, Link } from 'design'; +import { HoverTooltip } from 'shared/components/ToolTip'; import { FeatureBox, @@ -46,6 +47,7 @@ export function Users(props: State) { onStartDelete, onStartEdit, onStartReset, + usersAcl, showMauInfo, onDismissUsersMauNotice, onClose, @@ -60,22 +62,68 @@ export function Users(props: State) { EmailPasswordReset, onEmailPasswordResetClose, } = props; + + const requiredPermissions = Object.entries(usersAcl) + .map(([key, value]) => { + if (key === 'edit') { + return { value, label: 'update' }; + } + if (key === 'create') { + return { value, label: 'create' }; + } + }) + .filter(Boolean); + + const isMissingPermissions = requiredPermissions.some(v => !v.value); + return ( - + Users {attempt.isSuccess && ( <> {!InviteCollaborators && ( - + + )} {InviteCollaborators && (