From 8ab104263176568bb71e3deee2ff492d0bb1f35d Mon Sep 17 00:00:00 2001 From: Nick Petrovic <4001122+nickpetrovic@users.noreply.github.com> Date: Sun, 22 Dec 2024 00:54:37 -0500 Subject: [PATCH] initial multipart transfer --- deploy/fly-io/.dockerignore | 2 + deploy/fly-io/Dockerfile | 10 + deploy/fly-io/fly.toml | 47 + deploy/fly-io/start.sh | 37 + pkg/common/config.default.yaml | 5 + pkg/gateway/gateway.proto | 87 +- pkg/gateway/services/file.go | 268 +++ pkg/types/config.go | 8 + proto/gateway.pb.go | 2196 +++++++++++++++------ proto/gateway_grpc.pb.go | 212 +- sdk/src/beta9/channel.py | 33 +- sdk/src/beta9/cli/main.py | 2 + sdk/src/beta9/cli/volume.py | 76 +- sdk/src/beta9/clients/gateway/__init__.py | 124 ++ sdk/src/beta9/multipart.py | 337 ++++ sdk/src/beta9/terminal.py | 52 +- 16 files changed, 2887 insertions(+), 609 deletions(-) create mode 100644 deploy/fly-io/.dockerignore create mode 100644 deploy/fly-io/Dockerfile create mode 100644 deploy/fly-io/fly.toml create mode 100755 deploy/fly-io/start.sh create mode 100644 pkg/gateway/services/file.go create mode 100644 sdk/src/beta9/multipart.py diff --git a/deploy/fly-io/.dockerignore b/deploy/fly-io/.dockerignore new file mode 100644 index 000000000..132f7d869 --- /dev/null +++ b/deploy/fly-io/.dockerignore @@ -0,0 +1,2 @@ +* +!start.sh diff --git a/deploy/fly-io/Dockerfile b/deploy/fly-io/Dockerfile new file mode 100644 index 000000000..2afd83663 --- /dev/null +++ b/deploy/fly-io/Dockerfile @@ -0,0 +1,10 @@ +FROM ubuntu:24.04 + +RUN apt-get update && apt-get install -y curl +RUN curl -fsSL https://d.juicefs.com/install | sh - +RUN curl -fsSL https://tailscale.com/install.sh | sh - + +WORKDIR /app +COPY . . + +ENTRYPOINT ["/app/start.sh"] diff --git a/deploy/fly-io/fly.toml b/deploy/fly-io/fly.toml new file mode 100644 index 000000000..37cedbffb --- /dev/null +++ b/deploy/fly-io/fly.toml @@ -0,0 +1,47 @@ +app = 'data-stage-beam-cloud' +primary_region = 'iad' +kill_signal = 'SIGTERM' + +[build] + +[deploy] + strategy = 'immediate' + +[env] + JFS_ADDRESS = '0.0.0.0:9000' + +[http_service] + internal_port = 9000 + force_https = true + auto_start_machines = true + auto_stop_machines = 'off' + + [http_service.concurrency] + type = 'requests' + hard_limit = 30000 + soft_limit = 30000 + + [http_service.tls_options] + versions = ['TLSv1.2', 'TLSv1.3'] + default_self_signed = false + + [http_service.http_options] + idle_timeout = 900 + + [http_service.http_options.response] + pristine = true + +[checks] + [checks.app] + port = 9000 + type = 'http' + interval = '15s' + timeout = '5s' + grace_period = '30s' + method = 'get' + path = '/minio/health/live' + +[[vm]] + cpus = 2 + cpu_kind = 'shared' + memory = '2gb' diff --git a/deploy/fly-io/start.sh b/deploy/fly-io/start.sh new file mode 100755 index 000000000..3e4602c4c --- /dev/null +++ b/deploy/fly-io/start.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# tailscale +tailscaled --port=41641 --socket=/var/run/tailscale/tailscaled.sock --state=/var/lib/tailscale/tailscaled.state & +tailscale up --authkey=${TAILSCALE_AUTHKEY} --ssh --reset --accept-routes + +while [ -z "$(tailscale ip 2>/dev/null)" ]; do + echo "Waiting for Tailscale to fully establish a connection..." + sleep 1 +done + +# juicefs +JUICEFS_ADDRESS=${JUICEFS_ADDRESS:-0.0.0.0:9000} +JUICEFS_BLOCK_SIZE=${JUICEFS_ADDRESS:-4096} +JUICEFS_BUFFER_SIZE=${JUICEFS_BUFFER_SIZE:-300} +JUICEFS_CACHE_SIZE=${JUICEFS_CACHE_SIZE:-0} +JUICEFS_PREFETCH=${JUICEFS_PREFETCH:-1} + +juicefs format \ + --storage=s3 \ + --bucket=${JUICEFS_BUCKET} \ + --access-key=${JUICEFS_ACCESS_KEY} \ + --secret-key=${JUICEFS_SECRET_KEY} \ + --block-size=${JUICEFS_BLOCK_SIZE} \ + --no-update \ + ${JUICEFS_REDIS_URI} \ + ${JUICEFS_NAME} + +juicefs gateway \ + --storage="s3" \ + --bucket=${JUICEFS_BUCKET} \ + --buffer-size=${JUICEFS_BUFFER_SIZE} \ + --cache-size=${JUICEFS_CACHE_SIZE} \ + --prefetch=${JUICEFS_PREFETCH} \ + --no-usage-report \ + ${JUICEFS_REDIS_URI} \ + ${JUICEFS_ADDRESS} diff --git a/pkg/common/config.default.yaml b/pkg/common/config.default.yaml index bcca17ef2..2f8fdee48 100644 --- a/pkg/common/config.default.yaml +++ b/pkg/common/config.default.yaml @@ -56,6 +56,11 @@ gateway: memory: 32768 maxReplicas: 10 maxGpuCount: 2 +fileService: + endpointUrl: https://data-stage-beam-cloud.fly.dev + bucketName: beta9-fs + accessKey: + secretKey: imageService: localCacheEnabled: true registryStore: local diff --git a/pkg/gateway/gateway.proto b/pkg/gateway/gateway.proto index 4e155f6df..9006f6063 100644 --- a/pkg/gateway/gateway.proto +++ b/pkg/gateway/gateway.proto @@ -17,6 +17,12 @@ service GatewayService { rpc ReplaceObjectContent(ReplaceObjectContentRequest) returns (ReplaceObjectContentResponse) {} + // Multipart Upload + rpc CreatePresignedURL(CreatePresignedURLRequest) returns (CreatePresignedURLResponse) {} + rpc CreateMultipartUpload(CreateMultipartUploadRequest) returns (CreateMultipartUploadResponse) {} + rpc CompleteMultipartUpload(CompleteMultipartUploadRequest) returns (CompleteMultipartUploadResponse) {} + rpc AbortMultipartUpload(AbortMultipartUploadRequest) returns (AbortMultipartUploadResponse) {} + // Containers rpc ListContainers(ListContainersRequest) returns (ListContainersResponse) {} rpc StopContainer(StopContainerRequest) returns (StopContainerResponse) {} @@ -517,4 +523,83 @@ message ExportWorkspaceConfigResponse { string gateway_grpc_url = 3; int32 gateway_grpc_port = 4; string workspace_id = 5; -} \ No newline at end of file +} + +message PresignedURLParams { + string upload_id = 1; + uint32 part_number = 2; + + uint64 content_length = 3; + string content_type = 4; +} + +enum PresignedURLMethod { + GetObject = 0; + PutObject = 1; + HeadObject = 2; + UploadPart = 3; +} + +message CreatePresignedURLRequest { + string volume_name = 1; + string volume_path = 2; + uint32 expires = 3; + + PresignedURLMethod method = 4; + PresignedURLParams params = 5; +} + +message CreatePresignedURLResponse { + bool ok = 1; + string err_msg = 2; + string url = 3; +} + +message CreateMultipartUploadRequest { + string volume_name = 1; + string volume_path = 2; + uint64 chunk_size = 3; + uint64 file_size = 4; +} + +message FileUploadPart { + uint32 number = 1; + uint64 start = 2; + uint64 end = 3; + string url = 4; +} + +message CreateMultipartUploadResponse { + bool ok = 1; + string err_msg = 2; + string upload_id = 3; + repeated FileUploadPart file_upload_parts = 4; +} + +message CompletedPart { + uint32 number = 1; + string etag = 2; +} + +message CompleteMultipartUploadRequest { + string upload_id = 1; + string volume_name = 2; + string volume_path = 3; + repeated CompletedPart completed_parts = 4; +} + +message CompleteMultipartUploadResponse { + bool ok = 1; + string err_msg = 2; +} + +message AbortMultipartUploadRequest { + string upload_id = 1; + string volume_name = 2; + string volume_path = 3; +} + +message AbortMultipartUploadResponse { + bool ok = 1; + string err_msg = 2; +} diff --git a/pkg/gateway/services/file.go b/pkg/gateway/services/file.go new file mode 100644 index 000000000..0d96f0e12 --- /dev/null +++ b/pkg/gateway/services/file.go @@ -0,0 +1,268 @@ +package gatewayservices + +import ( + "context" + "errors" + "math" + "path/filepath" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/beam-cloud/beta9/pkg/auth" + pb "github.com/beam-cloud/beta9/proto" +) + +const ( + presignedUrlDefaultExpires = 300 // 5 minutes + presignedUrlMaxExpires = 604800 // 1 week +) + +func (gws *GatewayService) getS3Client() *s3.Client { + return s3.New(s3.Options{ + Credentials: credentials.NewStaticCredentialsProvider( + gws.appConfig.FileService.AccessKey, + gws.appConfig.FileService.SecretKey, + "", + ), + BaseEndpoint: aws.String(gws.appConfig.FileService.EndpointURL), + UsePathStyle: true, + Region: "-", + }) +} + +func joinCleanPath(parts ...string) string { + for i, part := range parts { + parts[i] = filepath.Clean(part) + } + + return filepath.Join(parts...) +} + +func (gws *GatewayService) CreatePresignedURL(ctx context.Context, in *pb.CreatePresignedURLRequest) (*pb.CreatePresignedURLResponse, error) { + authInfo, _ := auth.AuthInfoFromContext(ctx) + + volume, err := gws.backendRepo.GetVolume(ctx, authInfo.Workspace.Id, in.VolumeName) + if err != nil { + return &pb.CreatePresignedURLResponse{ + Ok: false, + ErrMsg: err.Error(), + }, nil + } + + if in.Expires == 0 { + in.Expires = presignedUrlDefaultExpires + } + if in.Expires > presignedUrlMaxExpires { + in.Expires = presignedUrlMaxExpires + } + + if in.Params == nil { + in.Params = &pb.PresignedURLParams{} + } + + var ( + req *v4.PresignedHTTPRequest + key = joinCleanPath("volumes", authInfo.Workspace.Name, volume.ExternalId, in.VolumePath) + presignClient = s3.NewPresignClient(gws.getS3Client()) + options = []func(*s3.PresignOptions){ + s3.WithPresignExpires(time.Duration(in.Expires) * time.Second), + } + ) + + switch in.Method { + case pb.PresignedURLMethod_HeadObject: + req, err = presignClient.PresignHeadObject( + ctx, &s3.HeadObjectInput{ + Bucket: aws.String(gws.appConfig.FileService.BucketName), + Key: aws.String(key), + }, + options..., + ) + case pb.PresignedURLMethod_GetObject: + req, err = presignClient.PresignGetObject( + ctx, &s3.GetObjectInput{ + Bucket: aws.String(gws.appConfig.FileService.BucketName), + Key: aws.String(key), + }, + options..., + ) + case pb.PresignedURLMethod_PutObject: + req, err = presignClient.PresignPutObject( + ctx, &s3.PutObjectInput{ + Bucket: aws.String(gws.appConfig.FileService.BucketName), + Key: aws.String(key), + ContentType: aws.String(in.Params.ContentType), + ContentLength: aws.Int64(int64(in.Params.ContentLength)), + }, + options..., + ) + case pb.PresignedURLMethod_UploadPart: + req, err = presignClient.PresignUploadPart( + ctx, &s3.UploadPartInput{ + Bucket: aws.String(gws.appConfig.FileService.BucketName), + Key: aws.String(key), + PartNumber: aws.Int32(int32(in.Params.PartNumber)), + UploadId: aws.String(in.Params.UploadId), + }, + options..., + ) + default: + err = errors.New("Unsupported Method") + } + + if err != nil { + return &pb.CreatePresignedURLResponse{ + Ok: false, + ErrMsg: err.Error(), + }, nil + } + + return &pb.CreatePresignedURLResponse{ + Ok: true, + Url: req.URL, + }, nil +} + +func (gws *GatewayService) CreateMultipartUpload(ctx context.Context, in *pb.CreateMultipartUploadRequest) (*pb.CreateMultipartUploadResponse, error) { + authInfo, _ := auth.AuthInfoFromContext(ctx) + + volume, err := gws.backendRepo.GetVolume(ctx, authInfo.Workspace.Id, in.VolumeName) + if err != nil { + return &pb.CreateMultipartUploadResponse{ + Ok: false, + ErrMsg: err.Error(), + }, nil + } + + s3Client := gws.getS3Client() + + response, err := s3Client.CreateMultipartUpload(ctx, &s3.CreateMultipartUploadInput{ + Bucket: aws.String(gws.appConfig.FileService.BucketName), + Key: aws.String(joinCleanPath("volumes", authInfo.Workspace.Name, volume.ExternalId, in.VolumePath)), + Expires: aws.Time(time.Now().Add(time.Minute)), + }) + if err != nil { + return &pb.CreateMultipartUploadResponse{ + Ok: false, + ErrMsg: err.Error(), + }, nil + } + + total_parts := math.Ceil(float64(in.FileSize) / float64(in.ChunkSize)) + upload_parts := make([]*pb.FileUploadPart, int(total_parts)) + + for i := range upload_parts { + res, err := gws.CreatePresignedURL(ctx, &pb.CreatePresignedURLRequest{ + VolumeName: in.VolumeName, + VolumePath: in.VolumePath, + Expires: presignedUrlMaxExpires, + Method: pb.PresignedURLMethod_UploadPart, + Params: &pb.PresignedURLParams{ + UploadId: *response.UploadId, + PartNumber: uint32(i + 1), + ContentLength: in.ChunkSize, + }, + }) + if err != nil { + gws.AbortMultipartUpload(ctx, &pb.AbortMultipartUploadRequest{ + UploadId: *response.UploadId, + VolumeName: in.VolumeName, + VolumePath: in.VolumePath, + }) + + return &pb.CreateMultipartUploadResponse{ + Ok: false, + ErrMsg: err.Error(), + }, nil + } + + upload_parts[i] = &pb.FileUploadPart{ + Number: uint32(i + 1), + Start: uint64(i) * in.ChunkSize, + End: uint64(math.Min(float64(uint64(i+1)*in.ChunkSize), float64(in.FileSize))), + Url: res.Url, + } + } + + return &pb.CreateMultipartUploadResponse{ + Ok: true, + UploadId: *response.UploadId, + FileUploadParts: upload_parts, + }, nil +} + +func (gws *GatewayService) CompleteMultipartUpload(ctx context.Context, in *pb.CompleteMultipartUploadRequest) (*pb.CompleteMultipartUploadResponse, error) { + authInfo, _ := auth.AuthInfoFromContext(ctx) + + volume, err := gws.backendRepo.GetVolume(ctx, authInfo.Workspace.Id, in.VolumeName) + if err != nil { + return &pb.CompleteMultipartUploadResponse{ + Ok: false, + ErrMsg: err.Error(), + }, nil + } + + s3Client := gws.getS3Client() + _, err = s3Client.CompleteMultipartUpload(ctx, &s3.CompleteMultipartUploadInput{ + Bucket: aws.String(gws.appConfig.FileService.BucketName), + Key: aws.String(joinCleanPath("volumes", authInfo.Workspace.Name, volume.ExternalId, in.VolumePath)), + UploadId: aws.String(in.UploadId), + MultipartUpload: &types.CompletedMultipartUpload{ + Parts: func() []types.CompletedPart { + parts := make([]types.CompletedPart, len(in.CompletedParts)) + for i, part := range in.CompletedParts { + parts[i] = types.CompletedPart{ + ETag: aws.String(part.Etag), + PartNumber: aws.Int32(int32(part.Number)), + } + } + return parts + }(), + }, + }) + + if err != nil { + return &pb.CompleteMultipartUploadResponse{ + Ok: false, + ErrMsg: err.Error(), + }, nil + } + + return &pb.CompleteMultipartUploadResponse{ + Ok: true, + }, nil +} + +func (gws *GatewayService) AbortMultipartUpload(ctx context.Context, in *pb.AbortMultipartUploadRequest) (*pb.AbortMultipartUploadResponse, error) { + authInfo, _ := auth.AuthInfoFromContext(ctx) + + volume, err := gws.backendRepo.GetVolume(ctx, authInfo.Workspace.Id, in.VolumeName) + if err != nil { + return &pb.AbortMultipartUploadResponse{ + Ok: false, + ErrMsg: err.Error(), + }, nil + } + + s3Client := gws.getS3Client() + + _, err = s3Client.AbortMultipartUpload(ctx, &s3.AbortMultipartUploadInput{ + Bucket: aws.String(gws.appConfig.FileService.BucketName), + Key: aws.String(joinCleanPath("volumes", authInfo.Workspace.Name, volume.ExternalId, in.VolumePath)), + UploadId: aws.String(in.UploadId), + }) + if err != nil { + return &pb.AbortMultipartUploadResponse{ + Ok: false, + ErrMsg: err.Error(), + }, nil + } + + return &pb.AbortMultipartUploadResponse{ + Ok: true, + }, nil +} diff --git a/pkg/types/config.go b/pkg/types/config.go index 744557d27..9108f628a 100644 --- a/pkg/types/config.go +++ b/pkg/types/config.go @@ -15,6 +15,7 @@ type AppConfig struct { PrettyLogs bool `key:"prettyLogs" json:"pretty_logs"` Database DatabaseConfig `key:"database" json:"database"` GatewayService GatewayServiceConfig `key:"gateway" json:"gateway_service"` + FileService FileServiceConfig `key:"fileService" json:"file_service"` ImageService ImageServiceConfig `key:"imageservice" json:"image_service"` Storage StorageConfig `key:"storage" json:"storage"` Worker WorkerConfig `key:"worker" json:"worker"` @@ -122,6 +123,13 @@ type GatewayServiceConfig struct { StubLimits StubLimits `key:"stubLimits" json:"stub_limits"` } +type FileServiceConfig struct { + EndpointURL string `key:"endpointUrl" json:"endpoint_url"` + BucketName string `key:"bucketName" json:"bucket_name"` + AccessKey string `key:"accessKey" json:"access_key"` + SecretKey string `key:"secretKey" json:"secret_key"` +} + type ImageServiceConfig struct { LocalCacheEnabled bool `key:"localCacheEnabled" json:"local_cache_enabled"` RegistryStore string `key:"registryStore" json:"registry_store"` diff --git a/proto/gateway.pb.go b/proto/gateway.pb.go index e7e588f08..c23a7e992 100644 --- a/proto/gateway.pb.go +++ b/proto/gateway.pb.go @@ -70,6 +70,58 @@ func (ReplaceObjectContentOperation) EnumDescriptor() ([]byte, []int) { return file_gateway_proto_rawDescGZIP(), []int{0} } +type PresignedURLMethod int32 + +const ( + PresignedURLMethod_GetObject PresignedURLMethod = 0 + PresignedURLMethod_PutObject PresignedURLMethod = 1 + PresignedURLMethod_HeadObject PresignedURLMethod = 2 + PresignedURLMethod_UploadPart PresignedURLMethod = 3 +) + +// Enum value maps for PresignedURLMethod. +var ( + PresignedURLMethod_name = map[int32]string{ + 0: "GetObject", + 1: "PutObject", + 2: "HeadObject", + 3: "UploadPart", + } + PresignedURLMethod_value = map[string]int32{ + "GetObject": 0, + "PutObject": 1, + "HeadObject": 2, + "UploadPart": 3, + } +) + +func (x PresignedURLMethod) Enum() *PresignedURLMethod { + p := new(PresignedURLMethod) + *p = x + return p +} + +func (x PresignedURLMethod) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PresignedURLMethod) Descriptor() protoreflect.EnumDescriptor { + return file_gateway_proto_enumTypes[1].Descriptor() +} + +func (PresignedURLMethod) Type() protoreflect.EnumType { + return &file_gateway_proto_enumTypes[1] +} + +func (x PresignedURLMethod) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PresignedURLMethod.Descriptor instead. +func (PresignedURLMethod) EnumDescriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{1} +} + type AuthorizeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5086,235 +5138,960 @@ func (x *ExportWorkspaceConfigResponse) GetWorkspaceId() string { return "" } -var File_gateway_proto protoreflect.FileDescriptor +type PresignedURLParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -var file_gateway_proto_rawDesc = []byte{ - 0x0a, 0x0d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x12, 0x0a, 0x10, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x80, 0x01, - 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, - 0x22, 0x2e, 0x0a, 0x12, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x22, 0x7e, 0x0a, 0x13, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, - 0x22, 0x38, 0x0a, 0x0e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x27, 0x0a, 0x11, 0x48, 0x65, - 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, - 0x61, 0x73, 0x68, 0x22, 0xb8, 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, - 0x69, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x78, 0x69, 0x73, - 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, - 0x40, 0x0a, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xad, - 0x01, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0f, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, - 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x5d, - 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xcc, 0x01, - 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, - 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x19, - 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, - 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x44, 0x69, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x2e, 0x0a, 0x1c, - 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0xfd, 0x01, 0x0a, - 0x09, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, - 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, - 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, - 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, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x17, 0x0a, 0x15, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x79, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x32, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, - 0x22, 0x39, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x15, 0x53, - 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, - 0x67, 0x22, 0x4e, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, - 0x64, 0x22, 0x23, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0xed, 0x01, 0x0a, 0x0e, 0x45, 0x6e, 0x64, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x73, 0x6b, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, - 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6b, 0x65, - 0x65, 0x70, 0x5f, 0x77, 0x61, 0x72, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6b, 0x65, 0x65, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x53, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x21, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x24, 0x0a, 0x0a, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, - 0xbb, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb9, 0x03, - 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, - 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x05, 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 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, 0x07, 0x65, 0x6e, 0x64, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, - 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, - 0x74, 0x18, 0x0b, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, - 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 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, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x77, 0x0a, 0x11, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, - 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x22, 0x2d, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x22, 0x3c, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, - 0x7a, 0x0a, 0x06, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, - 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xc9, 0x01, 0x0a, 0x10, - 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, - 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, - 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, - 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, - 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x1f, 0x0a, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x56, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x77, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x6f, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, - 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x22, 0x59, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, - 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xfc, 0x06, 0x0a, - 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, + UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + PartNumber uint32 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + ContentLength uint64 `protobuf:"varint,3,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` + ContentType string `protobuf:"bytes,4,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` +} + +func (x *PresignedURLParams) Reset() { + *x = PresignedURLParams{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PresignedURLParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PresignedURLParams) ProtoMessage() {} + +func (x *PresignedURLParams) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[75] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PresignedURLParams.ProtoReflect.Descriptor instead. +func (*PresignedURLParams) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{75} +} + +func (x *PresignedURLParams) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +func (x *PresignedURLParams) GetPartNumber() uint32 { + if x != nil { + return x.PartNumber + } + return 0 +} + +func (x *PresignedURLParams) GetContentLength() uint64 { + if x != nil { + return x.ContentLength + } + return 0 +} + +func (x *PresignedURLParams) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +type CreatePresignedURLRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeName string `protobuf:"bytes,1,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"` + VolumePath string `protobuf:"bytes,2,opt,name=volume_path,json=volumePath,proto3" json:"volume_path,omitempty"` + Expires uint32 `protobuf:"varint,3,opt,name=expires,proto3" json:"expires,omitempty"` + Method PresignedURLMethod `protobuf:"varint,4,opt,name=method,proto3,enum=gateway.PresignedURLMethod" json:"method,omitempty"` + Params *PresignedURLParams `protobuf:"bytes,5,opt,name=params,proto3" json:"params,omitempty"` +} + +func (x *CreatePresignedURLRequest) Reset() { + *x = CreatePresignedURLRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreatePresignedURLRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreatePresignedURLRequest) ProtoMessage() {} + +func (x *CreatePresignedURLRequest) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[76] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreatePresignedURLRequest.ProtoReflect.Descriptor instead. +func (*CreatePresignedURLRequest) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{76} +} + +func (x *CreatePresignedURLRequest) GetVolumeName() string { + if x != nil { + return x.VolumeName + } + return "" +} + +func (x *CreatePresignedURLRequest) GetVolumePath() string { + if x != nil { + return x.VolumePath + } + return "" +} + +func (x *CreatePresignedURLRequest) GetExpires() uint32 { + if x != nil { + return x.Expires + } + return 0 +} + +func (x *CreatePresignedURLRequest) GetMethod() PresignedURLMethod { + if x != nil { + return x.Method + } + return PresignedURLMethod_GetObject +} + +func (x *CreatePresignedURLRequest) GetParams() *PresignedURLParams { + if x != nil { + return x.Params + } + return nil +} + +type CreatePresignedURLResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` +} + +func (x *CreatePresignedURLResponse) Reset() { + *x = CreatePresignedURLResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[77] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreatePresignedURLResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreatePresignedURLResponse) ProtoMessage() {} + +func (x *CreatePresignedURLResponse) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[77] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreatePresignedURLResponse.ProtoReflect.Descriptor instead. +func (*CreatePresignedURLResponse) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{77} +} + +func (x *CreatePresignedURLResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *CreatePresignedURLResponse) GetErrMsg() string { + if x != nil { + return x.ErrMsg + } + return "" +} + +func (x *CreatePresignedURLResponse) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +type CreateMultipartUploadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + VolumeName string `protobuf:"bytes,1,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"` + VolumePath string `protobuf:"bytes,2,opt,name=volume_path,json=volumePath,proto3" json:"volume_path,omitempty"` + ChunkSize uint64 `protobuf:"varint,3,opt,name=chunk_size,json=chunkSize,proto3" json:"chunk_size,omitempty"` + FileSize uint64 `protobuf:"varint,4,opt,name=file_size,json=fileSize,proto3" json:"file_size,omitempty"` +} + +func (x *CreateMultipartUploadRequest) Reset() { + *x = CreateMultipartUploadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[78] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateMultipartUploadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateMultipartUploadRequest) ProtoMessage() {} + +func (x *CreateMultipartUploadRequest) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[78] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateMultipartUploadRequest.ProtoReflect.Descriptor instead. +func (*CreateMultipartUploadRequest) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{78} +} + +func (x *CreateMultipartUploadRequest) GetVolumeName() string { + if x != nil { + return x.VolumeName + } + return "" +} + +func (x *CreateMultipartUploadRequest) GetVolumePath() string { + if x != nil { + return x.VolumePath + } + return "" +} + +func (x *CreateMultipartUploadRequest) GetChunkSize() uint64 { + if x != nil { + return x.ChunkSize + } + return 0 +} + +func (x *CreateMultipartUploadRequest) GetFileSize() uint64 { + if x != nil { + return x.FileSize + } + return 0 +} + +type FileUploadPart struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Number uint32 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` + Start uint64 `protobuf:"varint,2,opt,name=start,proto3" json:"start,omitempty"` + End uint64 `protobuf:"varint,3,opt,name=end,proto3" json:"end,omitempty"` + Url string `protobuf:"bytes,4,opt,name=url,proto3" json:"url,omitempty"` +} + +func (x *FileUploadPart) Reset() { + *x = FileUploadPart{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[79] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileUploadPart) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileUploadPart) ProtoMessage() {} + +func (x *FileUploadPart) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[79] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FileUploadPart.ProtoReflect.Descriptor instead. +func (*FileUploadPart) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{79} +} + +func (x *FileUploadPart) GetNumber() uint32 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *FileUploadPart) GetStart() uint64 { + if x != nil { + return x.Start + } + return 0 +} + +func (x *FileUploadPart) GetEnd() uint64 { + if x != nil { + return x.End + } + return 0 +} + +func (x *FileUploadPart) GetUrl() string { + if x != nil { + return x.Url + } + return "" +} + +type CreateMultipartUploadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` + UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + FileUploadParts []*FileUploadPart `protobuf:"bytes,4,rep,name=file_upload_parts,json=fileUploadParts,proto3" json:"file_upload_parts,omitempty"` +} + +func (x *CreateMultipartUploadResponse) Reset() { + *x = CreateMultipartUploadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateMultipartUploadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateMultipartUploadResponse) ProtoMessage() {} + +func (x *CreateMultipartUploadResponse) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[80] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateMultipartUploadResponse.ProtoReflect.Descriptor instead. +func (*CreateMultipartUploadResponse) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{80} +} + +func (x *CreateMultipartUploadResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *CreateMultipartUploadResponse) GetErrMsg() string { + if x != nil { + return x.ErrMsg + } + return "" +} + +func (x *CreateMultipartUploadResponse) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +func (x *CreateMultipartUploadResponse) GetFileUploadParts() []*FileUploadPart { + if x != nil { + return x.FileUploadParts + } + return nil +} + +type CompletedPart struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Number uint32 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` + Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` +} + +func (x *CompletedPart) Reset() { + *x = CompletedPart{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[81] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CompletedPart) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CompletedPart) ProtoMessage() {} + +func (x *CompletedPart) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[81] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CompletedPart.ProtoReflect.Descriptor instead. +func (*CompletedPart) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{81} +} + +func (x *CompletedPart) GetNumber() uint32 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *CompletedPart) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +type CompleteMultipartUploadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + VolumeName string `protobuf:"bytes,2,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"` + VolumePath string `protobuf:"bytes,3,opt,name=volume_path,json=volumePath,proto3" json:"volume_path,omitempty"` + CompletedParts []*CompletedPart `protobuf:"bytes,4,rep,name=completed_parts,json=completedParts,proto3" json:"completed_parts,omitempty"` +} + +func (x *CompleteMultipartUploadRequest) Reset() { + *x = CompleteMultipartUploadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[82] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CompleteMultipartUploadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CompleteMultipartUploadRequest) ProtoMessage() {} + +func (x *CompleteMultipartUploadRequest) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[82] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CompleteMultipartUploadRequest.ProtoReflect.Descriptor instead. +func (*CompleteMultipartUploadRequest) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{82} +} + +func (x *CompleteMultipartUploadRequest) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +func (x *CompleteMultipartUploadRequest) GetVolumeName() string { + if x != nil { + return x.VolumeName + } + return "" +} + +func (x *CompleteMultipartUploadRequest) GetVolumePath() string { + if x != nil { + return x.VolumePath + } + return "" +} + +func (x *CompleteMultipartUploadRequest) GetCompletedParts() []*CompletedPart { + if x != nil { + return x.CompletedParts + } + return nil +} + +type CompleteMultipartUploadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` +} + +func (x *CompleteMultipartUploadResponse) Reset() { + *x = CompleteMultipartUploadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[83] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CompleteMultipartUploadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CompleteMultipartUploadResponse) ProtoMessage() {} + +func (x *CompleteMultipartUploadResponse) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[83] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CompleteMultipartUploadResponse.ProtoReflect.Descriptor instead. +func (*CompleteMultipartUploadResponse) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{83} +} + +func (x *CompleteMultipartUploadResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *CompleteMultipartUploadResponse) GetErrMsg() string { + if x != nil { + return x.ErrMsg + } + return "" +} + +type AbortMultipartUploadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UploadId string `protobuf:"bytes,1,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + VolumeName string `protobuf:"bytes,2,opt,name=volume_name,json=volumeName,proto3" json:"volume_name,omitempty"` + VolumePath string `protobuf:"bytes,3,opt,name=volume_path,json=volumePath,proto3" json:"volume_path,omitempty"` +} + +func (x *AbortMultipartUploadRequest) Reset() { + *x = AbortMultipartUploadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[84] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AbortMultipartUploadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AbortMultipartUploadRequest) ProtoMessage() {} + +func (x *AbortMultipartUploadRequest) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[84] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AbortMultipartUploadRequest.ProtoReflect.Descriptor instead. +func (*AbortMultipartUploadRequest) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{84} +} + +func (x *AbortMultipartUploadRequest) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +func (x *AbortMultipartUploadRequest) GetVolumeName() string { + if x != nil { + return x.VolumeName + } + return "" +} + +func (x *AbortMultipartUploadRequest) GetVolumePath() string { + if x != nil { + return x.VolumePath + } + return "" +} + +type AbortMultipartUploadResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` + ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg,proto3" json:"err_msg,omitempty"` +} + +func (x *AbortMultipartUploadResponse) Reset() { + *x = AbortMultipartUploadResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_gateway_proto_msgTypes[85] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AbortMultipartUploadResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AbortMultipartUploadResponse) ProtoMessage() {} + +func (x *AbortMultipartUploadResponse) ProtoReflect() protoreflect.Message { + mi := &file_gateway_proto_msgTypes[85] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AbortMultipartUploadResponse.ProtoReflect.Descriptor instead. +func (*AbortMultipartUploadResponse) Descriptor() ([]byte, []int) { + return file_gateway_proto_rawDescGZIP(), []int{85} +} + +func (x *AbortMultipartUploadResponse) GetOk() bool { + if x != nil { + return x.Ok + } + return false +} + +func (x *AbortMultipartUploadResponse) GetErrMsg() string { + if x != nil { + return x.ErrMsg + } + return "" +} + +var File_gateway_proto protoreflect.FileDescriptor + +var file_gateway_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x12, 0x0a, 0x10, 0x41, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x80, 0x01, + 0x0a, 0x11, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, + 0x22, 0x2e, 0x0a, 0x12, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0x7e, 0x0a, 0x13, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, + 0x22, 0x38, 0x0a, 0x0e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x27, 0x0a, 0x11, 0x48, 0x65, + 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, + 0x61, 0x73, 0x68, 0x22, 0xb8, 0x01, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, + 0x40, 0x0a, 0x0f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xad, + 0x01, 0x0a, 0x10, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x0f, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, + 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x5d, + 0x0a, 0x11, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x22, 0xcc, 0x01, + 0x0a, 0x1b, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x19, + 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, + 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x44, 0x69, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x36, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x70, 0x22, 0x2e, 0x0a, 0x1c, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0xfd, 0x01, 0x0a, + 0x09, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x17, 0x0a, + 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3d, + 0x0a, 0x0c, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, + 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, 0x0b, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x64, 0x22, 0x17, 0x0a, 0x15, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x79, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x32, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, + 0x22, 0x39, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x22, 0x44, 0x0a, 0x15, 0x53, + 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, + 0x67, 0x22, 0x4e, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x23, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0xed, 0x01, 0x0a, 0x0e, 0x45, 0x6e, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x73, 0x6b, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x61, + 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x6b, 0x65, + 0x65, 0x70, 0x5f, 0x77, 0x61, 0x72, 0x6d, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6b, 0x65, 0x65, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x53, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, 0x21, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x24, 0x0a, 0x0a, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, + 0xbb, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x4f, 0x0a, 0x0c, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb9, 0x03, + 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x05, 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, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x35, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 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, 0x07, 0x65, 0x6e, 0x64, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x75, 0x62, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x73, 0x74, 0x75, 0x62, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x73, 0x74, 0x75, 0x62, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x0b, 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, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 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, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x77, 0x0a, 0x11, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, + 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x22, 0x2d, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x22, 0x3c, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, + 0x7a, 0x0a, 0x06, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, + 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xc9, 0x01, 0x0a, 0x10, + 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, + 0x21, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x75, 0x72, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x55, + 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, + 0x61, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x72, + 0x65, 0x61, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x1f, 0x0a, 0x09, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x56, 0x61, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x77, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x6f, + 0x73, 0x63, 0x61, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x6d, 0x61, + 0x78, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x50, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x22, 0x59, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, + 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x74, 0x74, 0x6c, 0x22, 0xfc, 0x06, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, @@ -5727,164 +6504,285 @@ var file_gateway_proto_rawDesc = []byte{ 0x0f, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x72, 0x70, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x49, 0x64, 0x2a, 0x41, 0x0a, 0x1d, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4d, - 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x32, 0xe3, 0x12, 0x0a, 0x0e, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4a, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1b, + 0x65, 0x49, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x12, 0x50, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, + 0x64, 0x55, 0x52, 0x4c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x70, 0x61, + 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x22, 0xe1, 0x01, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x06, + 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x55, 0x52, 0x4c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x12, 0x33, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x72, 0x65, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x52, 0x4c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x57, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x50, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x10, 0x0a, + 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, + 0x9c, 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x62, + 0x0a, 0x0e, 0x46, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x65, 0x6e, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x22, 0xaa, 0x01, 0x0a, 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x1b, 0x0a, + 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x11, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x46, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x0f, + 0x66, 0x69, 0x6c, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x73, 0x22, + 0x3b, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0xc0, 0x01, 0x0a, + 0x1e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, + 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x3f, + 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, + 0x0e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x73, 0x22, + 0x4a, 0x0a, 0x1f, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, + 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, 0x73, 0x67, 0x22, 0x7c, 0x0a, 0x1b, 0x41, + 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, 0x6d, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x47, 0x0a, 0x1c, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x17, 0x0a, 0x07, 0x65, 0x72, 0x72, + 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x72, 0x72, 0x4d, + 0x73, 0x67, 0x2a, 0x41, 0x0a, 0x1d, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x09, 0x0a, 0x05, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, + 0x56, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x52, 0x0a, 0x12, 0x50, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x55, 0x52, 0x4c, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x0d, 0x0a, 0x09, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x48, 0x65, 0x61, + 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x10, 0x03, 0x32, 0x85, 0x16, 0x0a, 0x0e, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x44, 0x0a, 0x09, + 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x0a, 0x48, - 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x0f, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x19, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x65, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x53, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, - 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x45, 0x6e, - 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x53, 0x74, 0x6f, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x54, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, - 0x74, 0x75, 0x62, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, - 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x53, 0x74, 0x75, 0x62, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, - 0x06, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, - 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x57, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, - 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1c, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0d, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x1d, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0a, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, + 0x0a, 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1a, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, + 0x0f, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x65, 0x0a, 0x14, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x5f, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x52, 0x4c, 0x12, 0x22, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, + 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x25, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, + 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x27, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x28, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x65, 0x0a, + 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x24, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0d, 0x53, 0x74, 0x6f, + 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x09, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3c, 0x0a, 0x07, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x17, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x6e, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, + 0x09, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x53, 0x74, 0x6f, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x42, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x19, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x75, 0x62, 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x0a, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x12, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, - 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x48, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, - 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x43, 0x6f, - 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x55, 0x6e, 0x63, 0x6f, 0x72, - 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x44, 0x72, - 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x25, 0x2e, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x23, 0x5a, 0x21, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x65, 0x61, 0x6d, 0x2d, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x75, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x39, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x47, + 0x65, 0x74, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, + 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, + 0x53, 0x74, 0x6f, 0x70, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x42, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x19, 0x2e, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4e, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x45, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1a, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4b, 0x0a, 0x0c, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, + 0x1c, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, + 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, + 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1e, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x55, 0x6e, 0x63, 0x6f, 0x72, 0x64, 0x6f, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x48, 0x0a, 0x0b, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1b, + 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, + 0x72, 0x6b, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x25, 0x2e, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x42, 0x23, 0x5a, 0x21, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x62, 0x65, 0x61, 0x6d, 0x2d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x62, 0x65, 0x74, 0x61, 0x39, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5899,195 +6797,219 @@ func file_gateway_proto_rawDescGZIP() []byte { return file_gateway_proto_rawDescData } -var file_gateway_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_gateway_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 90) var file_gateway_proto_goTypes = []interface{}{ - (ReplaceObjectContentOperation)(0), // 0: gateway.ReplaceObjectContentOperation - (*AuthorizeRequest)(nil), // 1: gateway.AuthorizeRequest - (*AuthorizeResponse)(nil), // 2: gateway.AuthorizeResponse - (*SignPayloadRequest)(nil), // 3: gateway.SignPayloadRequest - (*SignPayloadResponse)(nil), // 4: gateway.SignPayloadResponse - (*ObjectMetadata)(nil), // 5: gateway.ObjectMetadata - (*HeadObjectRequest)(nil), // 6: gateway.HeadObjectRequest - (*HeadObjectResponse)(nil), // 7: gateway.HeadObjectResponse - (*PutObjectRequest)(nil), // 8: gateway.PutObjectRequest - (*PutObjectResponse)(nil), // 9: gateway.PutObjectResponse - (*ReplaceObjectContentRequest)(nil), // 10: gateway.ReplaceObjectContentRequest - (*ReplaceObjectContentResponse)(nil), // 11: gateway.ReplaceObjectContentResponse - (*Container)(nil), // 12: gateway.Container - (*ListContainersRequest)(nil), // 13: gateway.ListContainersRequest - (*ListContainersResponse)(nil), // 14: gateway.ListContainersResponse - (*StopContainerRequest)(nil), // 15: gateway.StopContainerRequest - (*StopContainerResponse)(nil), // 16: gateway.StopContainerResponse - (*StartTaskRequest)(nil), // 17: gateway.StartTaskRequest - (*StartTaskResponse)(nil), // 18: gateway.StartTaskResponse - (*EndTaskRequest)(nil), // 19: gateway.EndTaskRequest - (*EndTaskResponse)(nil), // 20: gateway.EndTaskResponse - (*StringList)(nil), // 21: gateway.StringList - (*ListTasksRequest)(nil), // 22: gateway.ListTasksRequest - (*Task)(nil), // 23: gateway.Task - (*ListTasksResponse)(nil), // 24: gateway.ListTasksResponse - (*StopTasksRequest)(nil), // 25: gateway.StopTasksRequest - (*StopTasksResponse)(nil), // 26: gateway.StopTasksResponse - (*Volume)(nil), // 27: gateway.Volume - (*MountPointConfig)(nil), // 28: gateway.MountPointConfig - (*SecretVar)(nil), // 29: gateway.SecretVar - (*Autoscaler)(nil), // 30: gateway.Autoscaler - (*TaskPolicy)(nil), // 31: gateway.TaskPolicy - (*GetOrCreateStubRequest)(nil), // 32: gateway.GetOrCreateStubRequest - (*GetOrCreateStubResponse)(nil), // 33: gateway.GetOrCreateStubResponse - (*DeployStubRequest)(nil), // 34: gateway.DeployStubRequest - (*DeployStubResponse)(nil), // 35: gateway.DeployStubResponse - (*Deployment)(nil), // 36: gateway.Deployment - (*ListDeploymentsRequest)(nil), // 37: gateway.ListDeploymentsRequest - (*ListDeploymentsResponse)(nil), // 38: gateway.ListDeploymentsResponse - (*StopDeploymentRequest)(nil), // 39: gateway.StopDeploymentRequest - (*StopDeploymentResponse)(nil), // 40: gateway.StopDeploymentResponse - (*DeleteDeploymentRequest)(nil), // 41: gateway.DeleteDeploymentRequest - (*DeleteDeploymentResponse)(nil), // 42: gateway.DeleteDeploymentResponse - (*Pool)(nil), // 43: gateway.Pool - (*ListPoolsRequest)(nil), // 44: gateway.ListPoolsRequest - (*ListPoolsResponse)(nil), // 45: gateway.ListPoolsResponse - (*Machine)(nil), // 46: gateway.Machine - (*MachineMetrics)(nil), // 47: gateway.MachineMetrics - (*ListMachinesRequest)(nil), // 48: gateway.ListMachinesRequest - (*ListMachinesResponse)(nil), // 49: gateway.ListMachinesResponse - (*CreateMachineRequest)(nil), // 50: gateway.CreateMachineRequest - (*CreateMachineResponse)(nil), // 51: gateway.CreateMachineResponse - (*DeleteMachineRequest)(nil), // 52: gateway.DeleteMachineRequest - (*DeleteMachineResponse)(nil), // 53: gateway.DeleteMachineResponse - (*Token)(nil), // 54: gateway.Token - (*ListTokensRequest)(nil), // 55: gateway.ListTokensRequest - (*ListTokensResponse)(nil), // 56: gateway.ListTokensResponse - (*CreateTokenRequest)(nil), // 57: gateway.CreateTokenRequest - (*CreateTokenResponse)(nil), // 58: gateway.CreateTokenResponse - (*ToggleTokenRequest)(nil), // 59: gateway.ToggleTokenRequest - (*ToggleTokenResponse)(nil), // 60: gateway.ToggleTokenResponse - (*DeleteTokenRequest)(nil), // 61: gateway.DeleteTokenRequest - (*DeleteTokenResponse)(nil), // 62: gateway.DeleteTokenResponse - (*GetURLRequest)(nil), // 63: gateway.GetURLRequest - (*GetURLResponse)(nil), // 64: gateway.GetURLResponse - (*Worker)(nil), // 65: gateway.Worker - (*ListWorkersRequest)(nil), // 66: gateway.ListWorkersRequest - (*ListWorkersResponse)(nil), // 67: gateway.ListWorkersResponse - (*CordonWorkerRequest)(nil), // 68: gateway.CordonWorkerRequest - (*CordonWorkerResponse)(nil), // 69: gateway.CordonWorkerResponse - (*UncordonWorkerRequest)(nil), // 70: gateway.UncordonWorkerRequest - (*UncordonWorkerResponse)(nil), // 71: gateway.UncordonWorkerResponse - (*DrainWorkerRequest)(nil), // 72: gateway.DrainWorkerRequest - (*DrainWorkerResponse)(nil), // 73: gateway.DrainWorkerResponse - (*ExportWorkspaceConfigRequest)(nil), // 74: gateway.ExportWorkspaceConfigRequest - (*ExportWorkspaceConfigResponse)(nil), // 75: gateway.ExportWorkspaceConfigResponse - nil, // 76: gateway.ListTasksRequest.FiltersEntry - nil, // 77: gateway.ListDeploymentsRequest.FiltersEntry - nil, // 78: gateway.ListPoolsRequest.FiltersEntry - nil, // 79: gateway.ListMachinesResponse.GpusEntry - (*timestamppb.Timestamp)(nil), // 80: google.protobuf.Timestamp + (ReplaceObjectContentOperation)(0), // 0: gateway.ReplaceObjectContentOperation + (PresignedURLMethod)(0), // 1: gateway.PresignedURLMethod + (*AuthorizeRequest)(nil), // 2: gateway.AuthorizeRequest + (*AuthorizeResponse)(nil), // 3: gateway.AuthorizeResponse + (*SignPayloadRequest)(nil), // 4: gateway.SignPayloadRequest + (*SignPayloadResponse)(nil), // 5: gateway.SignPayloadResponse + (*ObjectMetadata)(nil), // 6: gateway.ObjectMetadata + (*HeadObjectRequest)(nil), // 7: gateway.HeadObjectRequest + (*HeadObjectResponse)(nil), // 8: gateway.HeadObjectResponse + (*PutObjectRequest)(nil), // 9: gateway.PutObjectRequest + (*PutObjectResponse)(nil), // 10: gateway.PutObjectResponse + (*ReplaceObjectContentRequest)(nil), // 11: gateway.ReplaceObjectContentRequest + (*ReplaceObjectContentResponse)(nil), // 12: gateway.ReplaceObjectContentResponse + (*Container)(nil), // 13: gateway.Container + (*ListContainersRequest)(nil), // 14: gateway.ListContainersRequest + (*ListContainersResponse)(nil), // 15: gateway.ListContainersResponse + (*StopContainerRequest)(nil), // 16: gateway.StopContainerRequest + (*StopContainerResponse)(nil), // 17: gateway.StopContainerResponse + (*StartTaskRequest)(nil), // 18: gateway.StartTaskRequest + (*StartTaskResponse)(nil), // 19: gateway.StartTaskResponse + (*EndTaskRequest)(nil), // 20: gateway.EndTaskRequest + (*EndTaskResponse)(nil), // 21: gateway.EndTaskResponse + (*StringList)(nil), // 22: gateway.StringList + (*ListTasksRequest)(nil), // 23: gateway.ListTasksRequest + (*Task)(nil), // 24: gateway.Task + (*ListTasksResponse)(nil), // 25: gateway.ListTasksResponse + (*StopTasksRequest)(nil), // 26: gateway.StopTasksRequest + (*StopTasksResponse)(nil), // 27: gateway.StopTasksResponse + (*Volume)(nil), // 28: gateway.Volume + (*MountPointConfig)(nil), // 29: gateway.MountPointConfig + (*SecretVar)(nil), // 30: gateway.SecretVar + (*Autoscaler)(nil), // 31: gateway.Autoscaler + (*TaskPolicy)(nil), // 32: gateway.TaskPolicy + (*GetOrCreateStubRequest)(nil), // 33: gateway.GetOrCreateStubRequest + (*GetOrCreateStubResponse)(nil), // 34: gateway.GetOrCreateStubResponse + (*DeployStubRequest)(nil), // 35: gateway.DeployStubRequest + (*DeployStubResponse)(nil), // 36: gateway.DeployStubResponse + (*Deployment)(nil), // 37: gateway.Deployment + (*ListDeploymentsRequest)(nil), // 38: gateway.ListDeploymentsRequest + (*ListDeploymentsResponse)(nil), // 39: gateway.ListDeploymentsResponse + (*StopDeploymentRequest)(nil), // 40: gateway.StopDeploymentRequest + (*StopDeploymentResponse)(nil), // 41: gateway.StopDeploymentResponse + (*DeleteDeploymentRequest)(nil), // 42: gateway.DeleteDeploymentRequest + (*DeleteDeploymentResponse)(nil), // 43: gateway.DeleteDeploymentResponse + (*Pool)(nil), // 44: gateway.Pool + (*ListPoolsRequest)(nil), // 45: gateway.ListPoolsRequest + (*ListPoolsResponse)(nil), // 46: gateway.ListPoolsResponse + (*Machine)(nil), // 47: gateway.Machine + (*MachineMetrics)(nil), // 48: gateway.MachineMetrics + (*ListMachinesRequest)(nil), // 49: gateway.ListMachinesRequest + (*ListMachinesResponse)(nil), // 50: gateway.ListMachinesResponse + (*CreateMachineRequest)(nil), // 51: gateway.CreateMachineRequest + (*CreateMachineResponse)(nil), // 52: gateway.CreateMachineResponse + (*DeleteMachineRequest)(nil), // 53: gateway.DeleteMachineRequest + (*DeleteMachineResponse)(nil), // 54: gateway.DeleteMachineResponse + (*Token)(nil), // 55: gateway.Token + (*ListTokensRequest)(nil), // 56: gateway.ListTokensRequest + (*ListTokensResponse)(nil), // 57: gateway.ListTokensResponse + (*CreateTokenRequest)(nil), // 58: gateway.CreateTokenRequest + (*CreateTokenResponse)(nil), // 59: gateway.CreateTokenResponse + (*ToggleTokenRequest)(nil), // 60: gateway.ToggleTokenRequest + (*ToggleTokenResponse)(nil), // 61: gateway.ToggleTokenResponse + (*DeleteTokenRequest)(nil), // 62: gateway.DeleteTokenRequest + (*DeleteTokenResponse)(nil), // 63: gateway.DeleteTokenResponse + (*GetURLRequest)(nil), // 64: gateway.GetURLRequest + (*GetURLResponse)(nil), // 65: gateway.GetURLResponse + (*Worker)(nil), // 66: gateway.Worker + (*ListWorkersRequest)(nil), // 67: gateway.ListWorkersRequest + (*ListWorkersResponse)(nil), // 68: gateway.ListWorkersResponse + (*CordonWorkerRequest)(nil), // 69: gateway.CordonWorkerRequest + (*CordonWorkerResponse)(nil), // 70: gateway.CordonWorkerResponse + (*UncordonWorkerRequest)(nil), // 71: gateway.UncordonWorkerRequest + (*UncordonWorkerResponse)(nil), // 72: gateway.UncordonWorkerResponse + (*DrainWorkerRequest)(nil), // 73: gateway.DrainWorkerRequest + (*DrainWorkerResponse)(nil), // 74: gateway.DrainWorkerResponse + (*ExportWorkspaceConfigRequest)(nil), // 75: gateway.ExportWorkspaceConfigRequest + (*ExportWorkspaceConfigResponse)(nil), // 76: gateway.ExportWorkspaceConfigResponse + (*PresignedURLParams)(nil), // 77: gateway.PresignedURLParams + (*CreatePresignedURLRequest)(nil), // 78: gateway.CreatePresignedURLRequest + (*CreatePresignedURLResponse)(nil), // 79: gateway.CreatePresignedURLResponse + (*CreateMultipartUploadRequest)(nil), // 80: gateway.CreateMultipartUploadRequest + (*FileUploadPart)(nil), // 81: gateway.FileUploadPart + (*CreateMultipartUploadResponse)(nil), // 82: gateway.CreateMultipartUploadResponse + (*CompletedPart)(nil), // 83: gateway.CompletedPart + (*CompleteMultipartUploadRequest)(nil), // 84: gateway.CompleteMultipartUploadRequest + (*CompleteMultipartUploadResponse)(nil), // 85: gateway.CompleteMultipartUploadResponse + (*AbortMultipartUploadRequest)(nil), // 86: gateway.AbortMultipartUploadRequest + (*AbortMultipartUploadResponse)(nil), // 87: gateway.AbortMultipartUploadResponse + nil, // 88: gateway.ListTasksRequest.FiltersEntry + nil, // 89: gateway.ListDeploymentsRequest.FiltersEntry + nil, // 90: gateway.ListPoolsRequest.FiltersEntry + nil, // 91: gateway.ListMachinesResponse.GpusEntry + (*timestamppb.Timestamp)(nil), // 92: google.protobuf.Timestamp } var file_gateway_proto_depIdxs = []int32{ - 5, // 0: gateway.HeadObjectResponse.object_metadata:type_name -> gateway.ObjectMetadata - 5, // 1: gateway.PutObjectRequest.object_metadata:type_name -> gateway.ObjectMetadata + 6, // 0: gateway.HeadObjectResponse.object_metadata:type_name -> gateway.ObjectMetadata + 6, // 1: gateway.PutObjectRequest.object_metadata:type_name -> gateway.ObjectMetadata 0, // 2: gateway.ReplaceObjectContentRequest.op:type_name -> gateway.ReplaceObjectContentOperation - 80, // 3: gateway.Container.scheduled_at:type_name -> google.protobuf.Timestamp - 12, // 4: gateway.ListContainersResponse.containers:type_name -> gateway.Container - 76, // 5: gateway.ListTasksRequest.filters:type_name -> gateway.ListTasksRequest.FiltersEntry - 80, // 6: gateway.Task.started_at:type_name -> google.protobuf.Timestamp - 80, // 7: gateway.Task.ended_at:type_name -> google.protobuf.Timestamp - 80, // 8: gateway.Task.created_at:type_name -> google.protobuf.Timestamp - 80, // 9: gateway.Task.updated_at:type_name -> google.protobuf.Timestamp - 23, // 10: gateway.ListTasksResponse.tasks:type_name -> gateway.Task - 28, // 11: gateway.Volume.config:type_name -> gateway.MountPointConfig - 27, // 12: gateway.GetOrCreateStubRequest.volumes:type_name -> gateway.Volume - 29, // 13: gateway.GetOrCreateStubRequest.secrets:type_name -> gateway.SecretVar - 30, // 14: gateway.GetOrCreateStubRequest.autoscaler:type_name -> gateway.Autoscaler - 31, // 15: gateway.GetOrCreateStubRequest.task_policy:type_name -> gateway.TaskPolicy - 80, // 16: gateway.Deployment.created_at:type_name -> google.protobuf.Timestamp - 80, // 17: gateway.Deployment.updated_at:type_name -> google.protobuf.Timestamp - 77, // 18: gateway.ListDeploymentsRequest.filters:type_name -> gateway.ListDeploymentsRequest.FiltersEntry - 36, // 19: gateway.ListDeploymentsResponse.deployments:type_name -> gateway.Deployment - 78, // 20: gateway.ListPoolsRequest.filters:type_name -> gateway.ListPoolsRequest.FiltersEntry - 43, // 21: gateway.ListPoolsResponse.pools:type_name -> gateway.Pool - 47, // 22: gateway.Machine.machine_metrics:type_name -> gateway.MachineMetrics - 46, // 23: gateway.ListMachinesResponse.machines:type_name -> gateway.Machine - 79, // 24: gateway.ListMachinesResponse.gpus:type_name -> gateway.ListMachinesResponse.GpusEntry - 46, // 25: gateway.CreateMachineResponse.machine:type_name -> gateway.Machine - 80, // 26: gateway.Token.created_at:type_name -> google.protobuf.Timestamp - 80, // 27: gateway.Token.updated_at:type_name -> google.protobuf.Timestamp - 54, // 28: gateway.ListTokensResponse.tokens:type_name -> gateway.Token - 54, // 29: gateway.CreateTokenResponse.token:type_name -> gateway.Token - 54, // 30: gateway.ToggleTokenResponse.token:type_name -> gateway.Token - 12, // 31: gateway.Worker.active_containers:type_name -> gateway.Container - 65, // 32: gateway.ListWorkersResponse.workers:type_name -> gateway.Worker - 21, // 33: gateway.ListTasksRequest.FiltersEntry.value:type_name -> gateway.StringList - 21, // 34: gateway.ListDeploymentsRequest.FiltersEntry.value:type_name -> gateway.StringList - 21, // 35: gateway.ListPoolsRequest.FiltersEntry.value:type_name -> gateway.StringList - 1, // 36: gateway.GatewayService.Authorize:input_type -> gateway.AuthorizeRequest - 3, // 37: gateway.GatewayService.SignPayload:input_type -> gateway.SignPayloadRequest - 6, // 38: gateway.GatewayService.HeadObject:input_type -> gateway.HeadObjectRequest - 8, // 39: gateway.GatewayService.PutObject:input_type -> gateway.PutObjectRequest - 8, // 40: gateway.GatewayService.PutObjectStream:input_type -> gateway.PutObjectRequest - 10, // 41: gateway.GatewayService.ReplaceObjectContent:input_type -> gateway.ReplaceObjectContentRequest - 13, // 42: gateway.GatewayService.ListContainers:input_type -> gateway.ListContainersRequest - 15, // 43: gateway.GatewayService.StopContainer:input_type -> gateway.StopContainerRequest - 17, // 44: gateway.GatewayService.StartTask:input_type -> gateway.StartTaskRequest - 19, // 45: gateway.GatewayService.EndTask:input_type -> gateway.EndTaskRequest - 25, // 46: gateway.GatewayService.StopTasks:input_type -> gateway.StopTasksRequest - 22, // 47: gateway.GatewayService.ListTasks:input_type -> gateway.ListTasksRequest - 32, // 48: gateway.GatewayService.GetOrCreateStub:input_type -> gateway.GetOrCreateStubRequest - 34, // 49: gateway.GatewayService.DeployStub:input_type -> gateway.DeployStubRequest - 63, // 50: gateway.GatewayService.GetURL:input_type -> gateway.GetURLRequest - 37, // 51: gateway.GatewayService.ListDeployments:input_type -> gateway.ListDeploymentsRequest - 39, // 52: gateway.GatewayService.StopDeployment:input_type -> gateway.StopDeploymentRequest - 41, // 53: gateway.GatewayService.DeleteDeployment:input_type -> gateway.DeleteDeploymentRequest - 44, // 54: gateway.GatewayService.ListPools:input_type -> gateway.ListPoolsRequest - 48, // 55: gateway.GatewayService.ListMachines:input_type -> gateway.ListMachinesRequest - 50, // 56: gateway.GatewayService.CreateMachine:input_type -> gateway.CreateMachineRequest - 52, // 57: gateway.GatewayService.DeleteMachine:input_type -> gateway.DeleteMachineRequest - 55, // 58: gateway.GatewayService.ListTokens:input_type -> gateway.ListTokensRequest - 57, // 59: gateway.GatewayService.CreateToken:input_type -> gateway.CreateTokenRequest - 59, // 60: gateway.GatewayService.ToggleToken:input_type -> gateway.ToggleTokenRequest - 61, // 61: gateway.GatewayService.DeleteToken:input_type -> gateway.DeleteTokenRequest - 66, // 62: gateway.GatewayService.ListWorkers:input_type -> gateway.ListWorkersRequest - 68, // 63: gateway.GatewayService.CordonWorker:input_type -> gateway.CordonWorkerRequest - 70, // 64: gateway.GatewayService.UncordonWorker:input_type -> gateway.UncordonWorkerRequest - 72, // 65: gateway.GatewayService.DrainWorker:input_type -> gateway.DrainWorkerRequest - 74, // 66: gateway.GatewayService.ExportWorkspaceConfig:input_type -> gateway.ExportWorkspaceConfigRequest - 2, // 67: gateway.GatewayService.Authorize:output_type -> gateway.AuthorizeResponse - 4, // 68: gateway.GatewayService.SignPayload:output_type -> gateway.SignPayloadResponse - 7, // 69: gateway.GatewayService.HeadObject:output_type -> gateway.HeadObjectResponse - 9, // 70: gateway.GatewayService.PutObject:output_type -> gateway.PutObjectResponse - 9, // 71: gateway.GatewayService.PutObjectStream:output_type -> gateway.PutObjectResponse - 11, // 72: gateway.GatewayService.ReplaceObjectContent:output_type -> gateway.ReplaceObjectContentResponse - 14, // 73: gateway.GatewayService.ListContainers:output_type -> gateway.ListContainersResponse - 16, // 74: gateway.GatewayService.StopContainer:output_type -> gateway.StopContainerResponse - 18, // 75: gateway.GatewayService.StartTask:output_type -> gateway.StartTaskResponse - 20, // 76: gateway.GatewayService.EndTask:output_type -> gateway.EndTaskResponse - 26, // 77: gateway.GatewayService.StopTasks:output_type -> gateway.StopTasksResponse - 24, // 78: gateway.GatewayService.ListTasks:output_type -> gateway.ListTasksResponse - 33, // 79: gateway.GatewayService.GetOrCreateStub:output_type -> gateway.GetOrCreateStubResponse - 35, // 80: gateway.GatewayService.DeployStub:output_type -> gateway.DeployStubResponse - 64, // 81: gateway.GatewayService.GetURL:output_type -> gateway.GetURLResponse - 38, // 82: gateway.GatewayService.ListDeployments:output_type -> gateway.ListDeploymentsResponse - 40, // 83: gateway.GatewayService.StopDeployment:output_type -> gateway.StopDeploymentResponse - 42, // 84: gateway.GatewayService.DeleteDeployment:output_type -> gateway.DeleteDeploymentResponse - 45, // 85: gateway.GatewayService.ListPools:output_type -> gateway.ListPoolsResponse - 49, // 86: gateway.GatewayService.ListMachines:output_type -> gateway.ListMachinesResponse - 51, // 87: gateway.GatewayService.CreateMachine:output_type -> gateway.CreateMachineResponse - 53, // 88: gateway.GatewayService.DeleteMachine:output_type -> gateway.DeleteMachineResponse - 56, // 89: gateway.GatewayService.ListTokens:output_type -> gateway.ListTokensResponse - 58, // 90: gateway.GatewayService.CreateToken:output_type -> gateway.CreateTokenResponse - 60, // 91: gateway.GatewayService.ToggleToken:output_type -> gateway.ToggleTokenResponse - 62, // 92: gateway.GatewayService.DeleteToken:output_type -> gateway.DeleteTokenResponse - 67, // 93: gateway.GatewayService.ListWorkers:output_type -> gateway.ListWorkersResponse - 69, // 94: gateway.GatewayService.CordonWorker:output_type -> gateway.CordonWorkerResponse - 71, // 95: gateway.GatewayService.UncordonWorker:output_type -> gateway.UncordonWorkerResponse - 73, // 96: gateway.GatewayService.DrainWorker:output_type -> gateway.DrainWorkerResponse - 75, // 97: gateway.GatewayService.ExportWorkspaceConfig:output_type -> gateway.ExportWorkspaceConfigResponse - 67, // [67:98] is the sub-list for method output_type - 36, // [36:67] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 92, // 3: gateway.Container.scheduled_at:type_name -> google.protobuf.Timestamp + 13, // 4: gateway.ListContainersResponse.containers:type_name -> gateway.Container + 88, // 5: gateway.ListTasksRequest.filters:type_name -> gateway.ListTasksRequest.FiltersEntry + 92, // 6: gateway.Task.started_at:type_name -> google.protobuf.Timestamp + 92, // 7: gateway.Task.ended_at:type_name -> google.protobuf.Timestamp + 92, // 8: gateway.Task.created_at:type_name -> google.protobuf.Timestamp + 92, // 9: gateway.Task.updated_at:type_name -> google.protobuf.Timestamp + 24, // 10: gateway.ListTasksResponse.tasks:type_name -> gateway.Task + 29, // 11: gateway.Volume.config:type_name -> gateway.MountPointConfig + 28, // 12: gateway.GetOrCreateStubRequest.volumes:type_name -> gateway.Volume + 30, // 13: gateway.GetOrCreateStubRequest.secrets:type_name -> gateway.SecretVar + 31, // 14: gateway.GetOrCreateStubRequest.autoscaler:type_name -> gateway.Autoscaler + 32, // 15: gateway.GetOrCreateStubRequest.task_policy:type_name -> gateway.TaskPolicy + 92, // 16: gateway.Deployment.created_at:type_name -> google.protobuf.Timestamp + 92, // 17: gateway.Deployment.updated_at:type_name -> google.protobuf.Timestamp + 89, // 18: gateway.ListDeploymentsRequest.filters:type_name -> gateway.ListDeploymentsRequest.FiltersEntry + 37, // 19: gateway.ListDeploymentsResponse.deployments:type_name -> gateway.Deployment + 90, // 20: gateway.ListPoolsRequest.filters:type_name -> gateway.ListPoolsRequest.FiltersEntry + 44, // 21: gateway.ListPoolsResponse.pools:type_name -> gateway.Pool + 48, // 22: gateway.Machine.machine_metrics:type_name -> gateway.MachineMetrics + 47, // 23: gateway.ListMachinesResponse.machines:type_name -> gateway.Machine + 91, // 24: gateway.ListMachinesResponse.gpus:type_name -> gateway.ListMachinesResponse.GpusEntry + 47, // 25: gateway.CreateMachineResponse.machine:type_name -> gateway.Machine + 92, // 26: gateway.Token.created_at:type_name -> google.protobuf.Timestamp + 92, // 27: gateway.Token.updated_at:type_name -> google.protobuf.Timestamp + 55, // 28: gateway.ListTokensResponse.tokens:type_name -> gateway.Token + 55, // 29: gateway.CreateTokenResponse.token:type_name -> gateway.Token + 55, // 30: gateway.ToggleTokenResponse.token:type_name -> gateway.Token + 13, // 31: gateway.Worker.active_containers:type_name -> gateway.Container + 66, // 32: gateway.ListWorkersResponse.workers:type_name -> gateway.Worker + 1, // 33: gateway.CreatePresignedURLRequest.method:type_name -> gateway.PresignedURLMethod + 77, // 34: gateway.CreatePresignedURLRequest.params:type_name -> gateway.PresignedURLParams + 81, // 35: gateway.CreateMultipartUploadResponse.file_upload_parts:type_name -> gateway.FileUploadPart + 83, // 36: gateway.CompleteMultipartUploadRequest.completed_parts:type_name -> gateway.CompletedPart + 22, // 37: gateway.ListTasksRequest.FiltersEntry.value:type_name -> gateway.StringList + 22, // 38: gateway.ListDeploymentsRequest.FiltersEntry.value:type_name -> gateway.StringList + 22, // 39: gateway.ListPoolsRequest.FiltersEntry.value:type_name -> gateway.StringList + 2, // 40: gateway.GatewayService.Authorize:input_type -> gateway.AuthorizeRequest + 4, // 41: gateway.GatewayService.SignPayload:input_type -> gateway.SignPayloadRequest + 7, // 42: gateway.GatewayService.HeadObject:input_type -> gateway.HeadObjectRequest + 9, // 43: gateway.GatewayService.PutObject:input_type -> gateway.PutObjectRequest + 9, // 44: gateway.GatewayService.PutObjectStream:input_type -> gateway.PutObjectRequest + 11, // 45: gateway.GatewayService.ReplaceObjectContent:input_type -> gateway.ReplaceObjectContentRequest + 78, // 46: gateway.GatewayService.CreatePresignedURL:input_type -> gateway.CreatePresignedURLRequest + 80, // 47: gateway.GatewayService.CreateMultipartUpload:input_type -> gateway.CreateMultipartUploadRequest + 84, // 48: gateway.GatewayService.CompleteMultipartUpload:input_type -> gateway.CompleteMultipartUploadRequest + 86, // 49: gateway.GatewayService.AbortMultipartUpload:input_type -> gateway.AbortMultipartUploadRequest + 14, // 50: gateway.GatewayService.ListContainers:input_type -> gateway.ListContainersRequest + 16, // 51: gateway.GatewayService.StopContainer:input_type -> gateway.StopContainerRequest + 18, // 52: gateway.GatewayService.StartTask:input_type -> gateway.StartTaskRequest + 20, // 53: gateway.GatewayService.EndTask:input_type -> gateway.EndTaskRequest + 26, // 54: gateway.GatewayService.StopTasks:input_type -> gateway.StopTasksRequest + 23, // 55: gateway.GatewayService.ListTasks:input_type -> gateway.ListTasksRequest + 33, // 56: gateway.GatewayService.GetOrCreateStub:input_type -> gateway.GetOrCreateStubRequest + 35, // 57: gateway.GatewayService.DeployStub:input_type -> gateway.DeployStubRequest + 64, // 58: gateway.GatewayService.GetURL:input_type -> gateway.GetURLRequest + 38, // 59: gateway.GatewayService.ListDeployments:input_type -> gateway.ListDeploymentsRequest + 40, // 60: gateway.GatewayService.StopDeployment:input_type -> gateway.StopDeploymentRequest + 42, // 61: gateway.GatewayService.DeleteDeployment:input_type -> gateway.DeleteDeploymentRequest + 45, // 62: gateway.GatewayService.ListPools:input_type -> gateway.ListPoolsRequest + 49, // 63: gateway.GatewayService.ListMachines:input_type -> gateway.ListMachinesRequest + 51, // 64: gateway.GatewayService.CreateMachine:input_type -> gateway.CreateMachineRequest + 53, // 65: gateway.GatewayService.DeleteMachine:input_type -> gateway.DeleteMachineRequest + 56, // 66: gateway.GatewayService.ListTokens:input_type -> gateway.ListTokensRequest + 58, // 67: gateway.GatewayService.CreateToken:input_type -> gateway.CreateTokenRequest + 60, // 68: gateway.GatewayService.ToggleToken:input_type -> gateway.ToggleTokenRequest + 62, // 69: gateway.GatewayService.DeleteToken:input_type -> gateway.DeleteTokenRequest + 67, // 70: gateway.GatewayService.ListWorkers:input_type -> gateway.ListWorkersRequest + 69, // 71: gateway.GatewayService.CordonWorker:input_type -> gateway.CordonWorkerRequest + 71, // 72: gateway.GatewayService.UncordonWorker:input_type -> gateway.UncordonWorkerRequest + 73, // 73: gateway.GatewayService.DrainWorker:input_type -> gateway.DrainWorkerRequest + 75, // 74: gateway.GatewayService.ExportWorkspaceConfig:input_type -> gateway.ExportWorkspaceConfigRequest + 3, // 75: gateway.GatewayService.Authorize:output_type -> gateway.AuthorizeResponse + 5, // 76: gateway.GatewayService.SignPayload:output_type -> gateway.SignPayloadResponse + 8, // 77: gateway.GatewayService.HeadObject:output_type -> gateway.HeadObjectResponse + 10, // 78: gateway.GatewayService.PutObject:output_type -> gateway.PutObjectResponse + 10, // 79: gateway.GatewayService.PutObjectStream:output_type -> gateway.PutObjectResponse + 12, // 80: gateway.GatewayService.ReplaceObjectContent:output_type -> gateway.ReplaceObjectContentResponse + 79, // 81: gateway.GatewayService.CreatePresignedURL:output_type -> gateway.CreatePresignedURLResponse + 82, // 82: gateway.GatewayService.CreateMultipartUpload:output_type -> gateway.CreateMultipartUploadResponse + 85, // 83: gateway.GatewayService.CompleteMultipartUpload:output_type -> gateway.CompleteMultipartUploadResponse + 87, // 84: gateway.GatewayService.AbortMultipartUpload:output_type -> gateway.AbortMultipartUploadResponse + 15, // 85: gateway.GatewayService.ListContainers:output_type -> gateway.ListContainersResponse + 17, // 86: gateway.GatewayService.StopContainer:output_type -> gateway.StopContainerResponse + 19, // 87: gateway.GatewayService.StartTask:output_type -> gateway.StartTaskResponse + 21, // 88: gateway.GatewayService.EndTask:output_type -> gateway.EndTaskResponse + 27, // 89: gateway.GatewayService.StopTasks:output_type -> gateway.StopTasksResponse + 25, // 90: gateway.GatewayService.ListTasks:output_type -> gateway.ListTasksResponse + 34, // 91: gateway.GatewayService.GetOrCreateStub:output_type -> gateway.GetOrCreateStubResponse + 36, // 92: gateway.GatewayService.DeployStub:output_type -> gateway.DeployStubResponse + 65, // 93: gateway.GatewayService.GetURL:output_type -> gateway.GetURLResponse + 39, // 94: gateway.GatewayService.ListDeployments:output_type -> gateway.ListDeploymentsResponse + 41, // 95: gateway.GatewayService.StopDeployment:output_type -> gateway.StopDeploymentResponse + 43, // 96: gateway.GatewayService.DeleteDeployment:output_type -> gateway.DeleteDeploymentResponse + 46, // 97: gateway.GatewayService.ListPools:output_type -> gateway.ListPoolsResponse + 50, // 98: gateway.GatewayService.ListMachines:output_type -> gateway.ListMachinesResponse + 52, // 99: gateway.GatewayService.CreateMachine:output_type -> gateway.CreateMachineResponse + 54, // 100: gateway.GatewayService.DeleteMachine:output_type -> gateway.DeleteMachineResponse + 57, // 101: gateway.GatewayService.ListTokens:output_type -> gateway.ListTokensResponse + 59, // 102: gateway.GatewayService.CreateToken:output_type -> gateway.CreateTokenResponse + 61, // 103: gateway.GatewayService.ToggleToken:output_type -> gateway.ToggleTokenResponse + 63, // 104: gateway.GatewayService.DeleteToken:output_type -> gateway.DeleteTokenResponse + 68, // 105: gateway.GatewayService.ListWorkers:output_type -> gateway.ListWorkersResponse + 70, // 106: gateway.GatewayService.CordonWorker:output_type -> gateway.CordonWorkerResponse + 72, // 107: gateway.GatewayService.UncordonWorker:output_type -> gateway.UncordonWorkerResponse + 74, // 108: gateway.GatewayService.DrainWorker:output_type -> gateway.DrainWorkerResponse + 76, // 109: gateway.GatewayService.ExportWorkspaceConfig:output_type -> gateway.ExportWorkspaceConfigResponse + 75, // [75:110] is the sub-list for method output_type + 40, // [40:75] is the sub-list for method input_type + 40, // [40:40] is the sub-list for extension type_name + 40, // [40:40] is the sub-list for extension extendee + 0, // [0:40] is the sub-list for field type_name } func init() { file_gateway_proto_init() } @@ -6996,6 +7918,138 @@ func file_gateway_proto_init() { return nil } } + file_gateway_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PresignedURLParams); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreatePresignedURLRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreatePresignedURLResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateMultipartUploadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FileUploadPart); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateMultipartUploadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CompletedPart); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CompleteMultipartUploadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CompleteMultipartUploadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AbortMultipartUploadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_gateway_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AbortMultipartUploadResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_gateway_proto_msgTypes[26].OneofWrappers = []interface{}{} file_gateway_proto_msgTypes[53].OneofWrappers = []interface{}{} @@ -7004,8 +8058,8 @@ func file_gateway_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_gateway_proto_rawDesc, - NumEnums: 1, - NumMessages: 79, + NumEnums: 2, + NumMessages: 90, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/gateway_grpc.pb.go b/proto/gateway_grpc.pb.go index 7babece9e..f6dc83a20 100644 --- a/proto/gateway_grpc.pb.go +++ b/proto/gateway_grpc.pb.go @@ -19,37 +19,41 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - GatewayService_Authorize_FullMethodName = "/gateway.GatewayService/Authorize" - GatewayService_SignPayload_FullMethodName = "/gateway.GatewayService/SignPayload" - GatewayService_HeadObject_FullMethodName = "/gateway.GatewayService/HeadObject" - GatewayService_PutObject_FullMethodName = "/gateway.GatewayService/PutObject" - GatewayService_PutObjectStream_FullMethodName = "/gateway.GatewayService/PutObjectStream" - GatewayService_ReplaceObjectContent_FullMethodName = "/gateway.GatewayService/ReplaceObjectContent" - GatewayService_ListContainers_FullMethodName = "/gateway.GatewayService/ListContainers" - GatewayService_StopContainer_FullMethodName = "/gateway.GatewayService/StopContainer" - GatewayService_StartTask_FullMethodName = "/gateway.GatewayService/StartTask" - GatewayService_EndTask_FullMethodName = "/gateway.GatewayService/EndTask" - GatewayService_StopTasks_FullMethodName = "/gateway.GatewayService/StopTasks" - GatewayService_ListTasks_FullMethodName = "/gateway.GatewayService/ListTasks" - GatewayService_GetOrCreateStub_FullMethodName = "/gateway.GatewayService/GetOrCreateStub" - GatewayService_DeployStub_FullMethodName = "/gateway.GatewayService/DeployStub" - GatewayService_GetURL_FullMethodName = "/gateway.GatewayService/GetURL" - GatewayService_ListDeployments_FullMethodName = "/gateway.GatewayService/ListDeployments" - GatewayService_StopDeployment_FullMethodName = "/gateway.GatewayService/StopDeployment" - GatewayService_DeleteDeployment_FullMethodName = "/gateway.GatewayService/DeleteDeployment" - GatewayService_ListPools_FullMethodName = "/gateway.GatewayService/ListPools" - GatewayService_ListMachines_FullMethodName = "/gateway.GatewayService/ListMachines" - GatewayService_CreateMachine_FullMethodName = "/gateway.GatewayService/CreateMachine" - GatewayService_DeleteMachine_FullMethodName = "/gateway.GatewayService/DeleteMachine" - GatewayService_ListTokens_FullMethodName = "/gateway.GatewayService/ListTokens" - GatewayService_CreateToken_FullMethodName = "/gateway.GatewayService/CreateToken" - GatewayService_ToggleToken_FullMethodName = "/gateway.GatewayService/ToggleToken" - GatewayService_DeleteToken_FullMethodName = "/gateway.GatewayService/DeleteToken" - GatewayService_ListWorkers_FullMethodName = "/gateway.GatewayService/ListWorkers" - GatewayService_CordonWorker_FullMethodName = "/gateway.GatewayService/CordonWorker" - GatewayService_UncordonWorker_FullMethodName = "/gateway.GatewayService/UncordonWorker" - GatewayService_DrainWorker_FullMethodName = "/gateway.GatewayService/DrainWorker" - GatewayService_ExportWorkspaceConfig_FullMethodName = "/gateway.GatewayService/ExportWorkspaceConfig" + GatewayService_Authorize_FullMethodName = "/gateway.GatewayService/Authorize" + GatewayService_SignPayload_FullMethodName = "/gateway.GatewayService/SignPayload" + GatewayService_HeadObject_FullMethodName = "/gateway.GatewayService/HeadObject" + GatewayService_PutObject_FullMethodName = "/gateway.GatewayService/PutObject" + GatewayService_PutObjectStream_FullMethodName = "/gateway.GatewayService/PutObjectStream" + GatewayService_ReplaceObjectContent_FullMethodName = "/gateway.GatewayService/ReplaceObjectContent" + GatewayService_CreatePresignedURL_FullMethodName = "/gateway.GatewayService/CreatePresignedURL" + GatewayService_CreateMultipartUpload_FullMethodName = "/gateway.GatewayService/CreateMultipartUpload" + GatewayService_CompleteMultipartUpload_FullMethodName = "/gateway.GatewayService/CompleteMultipartUpload" + GatewayService_AbortMultipartUpload_FullMethodName = "/gateway.GatewayService/AbortMultipartUpload" + GatewayService_ListContainers_FullMethodName = "/gateway.GatewayService/ListContainers" + GatewayService_StopContainer_FullMethodName = "/gateway.GatewayService/StopContainer" + GatewayService_StartTask_FullMethodName = "/gateway.GatewayService/StartTask" + GatewayService_EndTask_FullMethodName = "/gateway.GatewayService/EndTask" + GatewayService_StopTasks_FullMethodName = "/gateway.GatewayService/StopTasks" + GatewayService_ListTasks_FullMethodName = "/gateway.GatewayService/ListTasks" + GatewayService_GetOrCreateStub_FullMethodName = "/gateway.GatewayService/GetOrCreateStub" + GatewayService_DeployStub_FullMethodName = "/gateway.GatewayService/DeployStub" + GatewayService_GetURL_FullMethodName = "/gateway.GatewayService/GetURL" + GatewayService_ListDeployments_FullMethodName = "/gateway.GatewayService/ListDeployments" + GatewayService_StopDeployment_FullMethodName = "/gateway.GatewayService/StopDeployment" + GatewayService_DeleteDeployment_FullMethodName = "/gateway.GatewayService/DeleteDeployment" + GatewayService_ListPools_FullMethodName = "/gateway.GatewayService/ListPools" + GatewayService_ListMachines_FullMethodName = "/gateway.GatewayService/ListMachines" + GatewayService_CreateMachine_FullMethodName = "/gateway.GatewayService/CreateMachine" + GatewayService_DeleteMachine_FullMethodName = "/gateway.GatewayService/DeleteMachine" + GatewayService_ListTokens_FullMethodName = "/gateway.GatewayService/ListTokens" + GatewayService_CreateToken_FullMethodName = "/gateway.GatewayService/CreateToken" + GatewayService_ToggleToken_FullMethodName = "/gateway.GatewayService/ToggleToken" + GatewayService_DeleteToken_FullMethodName = "/gateway.GatewayService/DeleteToken" + GatewayService_ListWorkers_FullMethodName = "/gateway.GatewayService/ListWorkers" + GatewayService_CordonWorker_FullMethodName = "/gateway.GatewayService/CordonWorker" + GatewayService_UncordonWorker_FullMethodName = "/gateway.GatewayService/UncordonWorker" + GatewayService_DrainWorker_FullMethodName = "/gateway.GatewayService/DrainWorker" + GatewayService_ExportWorkspaceConfig_FullMethodName = "/gateway.GatewayService/ExportWorkspaceConfig" ) // GatewayServiceClient is the client API for GatewayService service. @@ -64,6 +68,11 @@ type GatewayServiceClient interface { PutObject(ctx context.Context, in *PutObjectRequest, opts ...grpc.CallOption) (*PutObjectResponse, error) PutObjectStream(ctx context.Context, opts ...grpc.CallOption) (GatewayService_PutObjectStreamClient, error) ReplaceObjectContent(ctx context.Context, in *ReplaceObjectContentRequest, opts ...grpc.CallOption) (*ReplaceObjectContentResponse, error) + // Multipart Upload + CreatePresignedURL(ctx context.Context, in *CreatePresignedURLRequest, opts ...grpc.CallOption) (*CreatePresignedURLResponse, error) + CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadRequest, opts ...grpc.CallOption) (*CreateMultipartUploadResponse, error) + CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadRequest, opts ...grpc.CallOption) (*CompleteMultipartUploadResponse, error) + AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadRequest, opts ...grpc.CallOption) (*AbortMultipartUploadResponse, error) // Containers ListContainers(ctx context.Context, in *ListContainersRequest, opts ...grpc.CallOption) (*ListContainersResponse, error) StopContainer(ctx context.Context, in *StopContainerRequest, opts ...grpc.CallOption) (*StopContainerResponse, error) @@ -187,6 +196,42 @@ func (c *gatewayServiceClient) ReplaceObjectContent(ctx context.Context, in *Rep return out, nil } +func (c *gatewayServiceClient) CreatePresignedURL(ctx context.Context, in *CreatePresignedURLRequest, opts ...grpc.CallOption) (*CreatePresignedURLResponse, error) { + out := new(CreatePresignedURLResponse) + err := c.cc.Invoke(ctx, GatewayService_CreatePresignedURL_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gatewayServiceClient) CreateMultipartUpload(ctx context.Context, in *CreateMultipartUploadRequest, opts ...grpc.CallOption) (*CreateMultipartUploadResponse, error) { + out := new(CreateMultipartUploadResponse) + err := c.cc.Invoke(ctx, GatewayService_CreateMultipartUpload_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gatewayServiceClient) CompleteMultipartUpload(ctx context.Context, in *CompleteMultipartUploadRequest, opts ...grpc.CallOption) (*CompleteMultipartUploadResponse, error) { + out := new(CompleteMultipartUploadResponse) + err := c.cc.Invoke(ctx, GatewayService_CompleteMultipartUpload_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *gatewayServiceClient) AbortMultipartUpload(ctx context.Context, in *AbortMultipartUploadRequest, opts ...grpc.CallOption) (*AbortMultipartUploadResponse, error) { + out := new(AbortMultipartUploadResponse) + err := c.cc.Invoke(ctx, GatewayService_AbortMultipartUpload_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *gatewayServiceClient) ListContainers(ctx context.Context, in *ListContainersRequest, opts ...grpc.CallOption) (*ListContainersResponse, error) { out := new(ListContainersResponse) err := c.cc.Invoke(ctx, GatewayService_ListContainers_FullMethodName, in, out, opts...) @@ -424,6 +469,11 @@ type GatewayServiceServer interface { PutObject(context.Context, *PutObjectRequest) (*PutObjectResponse, error) PutObjectStream(GatewayService_PutObjectStreamServer) error ReplaceObjectContent(context.Context, *ReplaceObjectContentRequest) (*ReplaceObjectContentResponse, error) + // Multipart Upload + CreatePresignedURL(context.Context, *CreatePresignedURLRequest) (*CreatePresignedURLResponse, error) + CreateMultipartUpload(context.Context, *CreateMultipartUploadRequest) (*CreateMultipartUploadResponse, error) + CompleteMultipartUpload(context.Context, *CompleteMultipartUploadRequest) (*CompleteMultipartUploadResponse, error) + AbortMultipartUpload(context.Context, *AbortMultipartUploadRequest) (*AbortMultipartUploadResponse, error) // Containers ListContainers(context.Context, *ListContainersRequest) (*ListContainersResponse, error) StopContainer(context.Context, *StopContainerRequest) (*StopContainerResponse, error) @@ -483,6 +533,18 @@ func (UnimplementedGatewayServiceServer) PutObjectStream(GatewayService_PutObjec func (UnimplementedGatewayServiceServer) ReplaceObjectContent(context.Context, *ReplaceObjectContentRequest) (*ReplaceObjectContentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ReplaceObjectContent not implemented") } +func (UnimplementedGatewayServiceServer) CreatePresignedURL(context.Context, *CreatePresignedURLRequest) (*CreatePresignedURLResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreatePresignedURL not implemented") +} +func (UnimplementedGatewayServiceServer) CreateMultipartUpload(context.Context, *CreateMultipartUploadRequest) (*CreateMultipartUploadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateMultipartUpload not implemented") +} +func (UnimplementedGatewayServiceServer) CompleteMultipartUpload(context.Context, *CompleteMultipartUploadRequest) (*CompleteMultipartUploadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CompleteMultipartUpload not implemented") +} +func (UnimplementedGatewayServiceServer) AbortMultipartUpload(context.Context, *AbortMultipartUploadRequest) (*AbortMultipartUploadResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AbortMultipartUpload not implemented") +} func (UnimplementedGatewayServiceServer) ListContainers(context.Context, *ListContainersRequest) (*ListContainersResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListContainers not implemented") } @@ -687,6 +749,78 @@ func _GatewayService_ReplaceObjectContent_Handler(srv interface{}, ctx context.C return interceptor(ctx, in, info, handler) } +func _GatewayService_CreatePresignedURL_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreatePresignedURLRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).CreatePresignedURL(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_CreatePresignedURL_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).CreatePresignedURL(ctx, req.(*CreatePresignedURLRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GatewayService_CreateMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateMultipartUploadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).CreateMultipartUpload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_CreateMultipartUpload_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).CreateMultipartUpload(ctx, req.(*CreateMultipartUploadRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GatewayService_CompleteMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CompleteMultipartUploadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).CompleteMultipartUpload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_CompleteMultipartUpload_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).CompleteMultipartUpload(ctx, req.(*CompleteMultipartUploadRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GatewayService_AbortMultipartUpload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AbortMultipartUploadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GatewayServiceServer).AbortMultipartUpload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: GatewayService_AbortMultipartUpload_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GatewayServiceServer).AbortMultipartUpload(ctx, req.(*AbortMultipartUploadRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _GatewayService_ListContainers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListContainersRequest) if err := dec(in); err != nil { @@ -1164,6 +1298,22 @@ var GatewayService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ReplaceObjectContent", Handler: _GatewayService_ReplaceObjectContent_Handler, }, + { + MethodName: "CreatePresignedURL", + Handler: _GatewayService_CreatePresignedURL_Handler, + }, + { + MethodName: "CreateMultipartUpload", + Handler: _GatewayService_CreateMultipartUpload_Handler, + }, + { + MethodName: "CompleteMultipartUpload", + Handler: _GatewayService_CompleteMultipartUpload_Handler, + }, + { + MethodName: "AbortMultipartUpload", + Handler: _GatewayService_AbortMultipartUpload_Handler, + }, { MethodName: "ListContainers", Handler: _GatewayService_ListContainers_Handler, diff --git a/sdk/src/beta9/channel.py b/sdk/src/beta9/channel.py index d5193ecc4..f8331b843 100644 --- a/sdk/src/beta9/channel.py +++ b/sdk/src/beta9/channel.py @@ -3,7 +3,7 @@ import traceback from abc import ABC, abstractmethod from contextlib import contextmanager -from typing import Any, Callable, Generator, List, NewType, Optional, Tuple, cast +from typing import Any, Callable, Generator, List, NewType, Optional, Sequence, Tuple, cast import grpc from grpc import ChannelCredentials, RpcError @@ -18,6 +18,7 @@ ConfigContext, SDKSettings, get_config_context, + get_settings, load_config, prompt_for_config_context, save_config, @@ -25,13 +26,41 @@ from .exceptions import RunnerException +def channel_reconnect_event(connect_status: grpc.ChannelConnectivity) -> None: + if connect_status not in ( + grpc.ChannelConnectivity.CONNECTING, + grpc.ChannelConnectivity.IDLE, + grpc.ChannelConnectivity.READY, + grpc.ChannelConnectivity.SHUTDOWN, + ): + terminal.warn("Connection lost, reconnecting...") + + +def get_user_agent() -> str: + from importlib import metadata + + package_name = get_settings().name.lower() + return f"{package_name}/{metadata.version(package_name)}" + + class Channel(InterceptorChannel): def __init__( self, addr: str, token: Optional[str] = None, credentials: Optional[ChannelCredentials] = None, + options: Optional[Sequence[Tuple[str, Any]]] = None, + retry: Tuple[Callable[[grpc.ChannelConnectivity], None], bool] = ( + channel_reconnect_event, + True, + ), ): + if options is None: + options = [] + + options = [opt for opt in options if "grpc.secondary_user_agent" not in opt[0]] + options.append(("grpc.secondary_user_agent", get_user_agent())) + if credentials is not None: channel = grpc.secure_channel(addr, credentials) elif addr.endswith("443"): @@ -39,6 +68,8 @@ def __init__( else: channel = grpc.insecure_channel(addr) + channel.subscribe(*retry) + interceptor = AuthTokenInterceptor(token) super().__init__(channel=channel, interceptor=interceptor) diff --git a/sdk/src/beta9/cli/main.py b/sdk/src/beta9/cli/main.py index 8a7168825..47630a1f6 100644 --- a/sdk/src/beta9/cli/main.py +++ b/sdk/src/beta9/cli/main.py @@ -25,6 +25,8 @@ click.formatting.FORCED_WIDTH = shutil.get_terminal_size().columns +os.environ["GRPC_VERBOSITY"] = os.getenv("GRPC_VERBOSITY") or "ERROR" + class CLI: """ diff --git a/sdk/src/beta9/cli/volume.py b/sdk/src/beta9/cli/volume.py index e29ba46c5..a5bafff8b 100644 --- a/sdk/src/beta9/cli/volume.py +++ b/sdk/src/beta9/cli/volume.py @@ -1,11 +1,12 @@ +import functools import glob from pathlib import Path -from typing import Iterable, List, Union +from typing import Iterable, List, Union, cast import click from rich.table import Column, Table, box -from .. import terminal +from .. import multipart, terminal from ..channel import ServiceClient from ..clients.volume import ( CopyPathRequest, @@ -21,7 +22,8 @@ ListVolumesResponse, MovePathRequest, ) -from ..terminal import pluralize +from ..multipart import ProgressCallback +from ..terminal import StyledProgress, pluralize from . import extraclick from .extraclick import ClickCommonGroup, ClickManagementGroup @@ -95,6 +97,74 @@ def ls(service: ServiceClient, remote_path: str): terminal.print(table) +@common.command( + help="Download contents from a volume.", +) +@click.argument( + "volume_name", + type=click.STRING, + required=True, +) +@click.argument( + "remote_path", + type=click.STRING, + required=True, +) +@click.argument( + "local_path", + type=click.Path(path_type=Path), + required=True, +) +@extraclick.pass_service_client +def download(service: ServiceClient, volume_name: str, remote_path: str, local_path: Path): + try: + with StyledProgress() as p: + task_id = p.add_task(local_path) + callback = cast(ProgressCallback, functools.partial(p.update, task_id=task_id)) + + multipart.download(service, volume_name, remote_path, local_path, callback) + + except KeyboardInterrupt: + terminal.warn("\rDownload cancelled") + + except Exception as e: + terminal.error(f"\rDownload failed: {e}") + + +@common.command( + help="Upload contents from a volume.", +) +@click.argument( + "local_path", + type=click.Path(path_type=Path), + required=True, +) +@click.argument( + "volume_name", + type=click.STRING, + required=True, +) +@click.argument( + "remote_path", + type=click.STRING, + required=True, +) +@extraclick.pass_service_client +def upload(service: ServiceClient, local_path: Path, volume_name: str, remote_path: str): + try: + with StyledProgress() as p: + task_id = p.add_task(local_path) + callback = cast(ProgressCallback, functools.partial(p.update, task_id=task_id)) + + multipart.upload(service, local_path, volume_name, remote_path, callback) + + except KeyboardInterrupt: + terminal.warn("\rUpload cancelled") + + except Exception as e: + terminal.error(f"\rUpload failed: {e}") + + @common.command( help="Copy contents to a volume.", epilog=""" diff --git a/sdk/src/beta9/clients/gateway/__init__.py b/sdk/src/beta9/clients/gateway/__init__.py index 6fb6217b5..f24ffdfe3 100644 --- a/sdk/src/beta9/clients/gateway/__init__.py +++ b/sdk/src/beta9/clients/gateway/__init__.py @@ -35,6 +35,13 @@ class ReplaceObjectContentOperation(betterproto.Enum): MOVED = 2 +class PresignedUrlMethod(betterproto.Enum): + GetObject = 0 + PutObject = 1 + HeadObject = 2 + UploadPart = 3 + + @dataclass(eq=False, repr=False) class AuthorizeRequest(betterproto.Message): pass @@ -613,6 +620,87 @@ class ExportWorkspaceConfigResponse(betterproto.Message): workspace_id: str = betterproto.string_field(5) +@dataclass(eq=False, repr=False) +class PresignedUrlParams(betterproto.Message): + upload_id: str = betterproto.string_field(1) + part_number: int = betterproto.uint32_field(2) + content_length: int = betterproto.uint64_field(3) + content_type: str = betterproto.string_field(4) + + +@dataclass(eq=False, repr=False) +class CreatePresignedUrlRequest(betterproto.Message): + volume_name: str = betterproto.string_field(1) + volume_path: str = betterproto.string_field(2) + expires: int = betterproto.uint32_field(3) + method: "PresignedUrlMethod" = betterproto.enum_field(4) + params: "PresignedUrlParams" = betterproto.message_field(5) + + +@dataclass(eq=False, repr=False) +class CreatePresignedUrlResponse(betterproto.Message): + ok: bool = betterproto.bool_field(1) + err_msg: str = betterproto.string_field(2) + url: str = betterproto.string_field(3) + + +@dataclass(eq=False, repr=False) +class CreateMultipartUploadRequest(betterproto.Message): + volume_name: str = betterproto.string_field(1) + volume_path: str = betterproto.string_field(2) + chunk_size: int = betterproto.uint64_field(3) + file_size: int = betterproto.uint64_field(4) + + +@dataclass(eq=False, repr=False) +class FileUploadPart(betterproto.Message): + number: int = betterproto.uint32_field(1) + start: int = betterproto.uint64_field(2) + end: int = betterproto.uint64_field(3) + url: str = betterproto.string_field(4) + + +@dataclass(eq=False, repr=False) +class CreateMultipartUploadResponse(betterproto.Message): + ok: bool = betterproto.bool_field(1) + err_msg: str = betterproto.string_field(2) + upload_id: str = betterproto.string_field(3) + file_upload_parts: List["FileUploadPart"] = betterproto.message_field(4) + + +@dataclass(eq=False, repr=False) +class CompletedPart(betterproto.Message): + number: int = betterproto.uint32_field(1) + etag: str = betterproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class CompleteMultipartUploadRequest(betterproto.Message): + upload_id: str = betterproto.string_field(1) + volume_name: str = betterproto.string_field(2) + volume_path: str = betterproto.string_field(3) + completed_parts: List["CompletedPart"] = betterproto.message_field(4) + + +@dataclass(eq=False, repr=False) +class CompleteMultipartUploadResponse(betterproto.Message): + ok: bool = betterproto.bool_field(1) + err_msg: str = betterproto.string_field(2) + + +@dataclass(eq=False, repr=False) +class AbortMultipartUploadRequest(betterproto.Message): + upload_id: str = betterproto.string_field(1) + volume_name: str = betterproto.string_field(2) + volume_path: str = betterproto.string_field(3) + + +@dataclass(eq=False, repr=False) +class AbortMultipartUploadResponse(betterproto.Message): + ok: bool = betterproto.bool_field(1) + err_msg: str = betterproto.string_field(2) + + class GatewayServiceStub(SyncServiceStub): def authorize(self, authorize_request: "AuthorizeRequest") -> "AuthorizeResponse": return self._unary_unary( @@ -668,6 +756,42 @@ def replace_object_content( ReplaceObjectContentResponse, )(replace_object_content_request) + def create_presigned_url( + self, create_presigned_url_request: "CreatePresignedUrlRequest" + ) -> "CreatePresignedUrlResponse": + return self._unary_unary( + "/gateway.GatewayService/CreatePresignedURL", + CreatePresignedUrlRequest, + CreatePresignedUrlResponse, + )(create_presigned_url_request) + + def create_multipart_upload( + self, create_multipart_upload_request: "CreateMultipartUploadRequest" + ) -> "CreateMultipartUploadResponse": + return self._unary_unary( + "/gateway.GatewayService/CreateMultipartUpload", + CreateMultipartUploadRequest, + CreateMultipartUploadResponse, + )(create_multipart_upload_request) + + def complete_multipart_upload( + self, complete_multipart_upload_request: "CompleteMultipartUploadRequest" + ) -> "CompleteMultipartUploadResponse": + return self._unary_unary( + "/gateway.GatewayService/CompleteMultipartUpload", + CompleteMultipartUploadRequest, + CompleteMultipartUploadResponse, + )(complete_multipart_upload_request) + + def abort_multipart_upload( + self, abort_multipart_upload_request: "AbortMultipartUploadRequest" + ) -> "AbortMultipartUploadResponse": + return self._unary_unary( + "/gateway.GatewayService/AbortMultipartUpload", + AbortMultipartUploadRequest, + AbortMultipartUploadResponse, + )(abort_multipart_upload_request) + def list_containers( self, list_containers_request: "ListContainersRequest" ) -> "ListContainersResponse": diff --git a/sdk/src/beta9/multipart.py b/sdk/src/beta9/multipart.py new file mode 100644 index 000000000..b82d9e4fc --- /dev/null +++ b/sdk/src/beta9/multipart.py @@ -0,0 +1,337 @@ +import concurrent.futures +import io +import math +import os +import signal +import tempfile +import time +from concurrent.futures import ProcessPoolExecutor +from contextlib import ExitStack +from functools import wraps +from multiprocessing import Manager +from os import PathLike +from pathlib import Path +from queue import Queue +from threading import local +from typing import Callable, Final, List, NamedTuple, Optional, Protocol, Sequence, TypeVar + +import requests +from requests import Session +from typing_extensions import ParamSpec + +from .channel import ServiceClient +from .clients.gateway import ( + AbortMultipartUploadRequest, + CompletedPart, + CompleteMultipartUploadRequest, + CreateMultipartUploadRequest, + CreatePresignedUrlRequest, + FileUploadPart, + PresignedUrlMethod, +) + +__all__ = ["upload", "download"] + +_max_workers = 6 +_process_local = local() +_request_timeout = 3 # seconds + + +UPLOAD_CHUNK_SIZE: Final = 4 * 1024 * 1024 +DOWNLOAD_CHUNK_SIZE: Final = 32 * 1024 * 1024 + + +class ProgressCallback(Protocol): + def __call__(self, total: int, advance: int) -> None: ... + + +P = ParamSpec("P") +R = TypeVar("R") + + +def retry( + times: int, base_delay: float = 0.1, max_delay: float = 10.0 +) -> Callable[[Callable[P, R]], Callable[P, R]]: + def decorator(func: Callable[P, R]) -> Callable[P, R]: + @wraps(func) + def wrapper(*args: P.args, **kwargs: P.kwargs) -> R: + delay = base_delay + last_exception = None + + for attempt in range(times): + try: + return func(*args, **kwargs) + except Exception as e: + last_exception = e + if attempt < times - 1: + time.sleep(min(delay, max_delay)) + delay *= 2 + + raise Exception(f"Failed after {times} retries: {last_exception}") + + return wrapper + + return decorator + + +def _get_session() -> Session: + if not hasattr(_process_local, "session"): + _process_local.session = requests.Session() + return _process_local.session + + +def _init_worker(): + signal.signal(signal.SIGINT, lambda *_: os.kill(os.getpid(), signal.SIGTERM)) + + +@retry(times=10) +def _upload_part(file_path: Path, file_part: FileUploadPart, queue: Queue) -> CompletedPart: + session = _get_session() + + chunk = _get_file_chunk(file_path, file_part.start, file_part.end) + chunk_size = len(chunk) + + class QueueBuffer(io.BytesIO): + def read(self, size: Optional[int] = -1) -> bytes: + b = super().read(size) + queue.put(len(b), block=False) + return b + + try: + response = session.put( + url=file_part.url, + data=QueueBuffer(chunk), + headers={ + "Content-Length": str(chunk_size), + }, + ) + response.raise_for_status() + except Exception as e: + raise RuntimeError(f"Failed to upload part {file_part.number}: {e}") + + return CompletedPart(number=file_part.number, etag=response.headers["ETag"]) + + +def _get_file_chunk(file_path: Path, start: int, end: int) -> bytes: + with open(file_path, "rb") as f: + f.seek(start) + return f.read(end - start) + + +def upload( + service: ServiceClient, + file_path: Path, + volume_name: str, + volume_path: str, + callback: Optional[ProgressCallback] = None, + chunk_size: int = UPLOAD_CHUNK_SIZE, +): + """ + Upload a file to the volume using multipart upload. + """ + # Initialize multipart upload + file_size = file_path.stat().st_size + initial = retry(times=3)(service.gateway.create_multipart_upload)( + CreateMultipartUploadRequest( + volume_name=volume_name, + volume_path=volume_path, + chunk_size=chunk_size, + file_size=file_size, + ) + ) + if not initial.ok: + raise RuntimeError(f"Failed to initialize upload: {initial.err_msg}") + + # Start multipart upload + try: + with ExitStack() as stack: + manager = stack.enter_context(Manager()) + executor = stack.enter_context( + ProcessPoolExecutor(_max_workers, initializer=_init_worker) + ) + + queue = manager.Queue() + + futures = [ + executor.submit(_upload_part, file_path, part, queue) + for part in initial.file_upload_parts + ] + + finished = 0 + while finished < file_size: + uploaded = queue.get() + finished += uploaded + if callback: + callback(total=file_size, advance=uploaded) + + parts = [future.result() for future in concurrent.futures.as_completed(futures)] + parts.sort(key=lambda part: part.number) + + # Complete multipart upload + completed = retry(times=3)(service.gateway.complete_multipart_upload)( + CompleteMultipartUploadRequest( + upload_id=initial.upload_id, + volume_name=volume_name, + volume_path=volume_path, + completed_parts=parts, + ) + ) + if not completed.ok: + raise RuntimeError(f"Failed to complete upload: {completed.err_msg}") + + except (Exception, KeyboardInterrupt): + service.gateway.abort_multipart_upload( + AbortMultipartUploadRequest( + upload_id=initial.upload_id, volume_name=volume_name, volume_path=volume_path + ) + ) + raise + + +class FileChunk(NamedTuple): + number: int + path: Path + + +class FileRange(NamedTuple): + number: int + start: int + end: int + + +@retry(times=3) +def _get_file_size(url: str) -> int: + session = _get_session() + + response = session.head(url) + if response.status_code != 200: + raise RuntimeError(f"Failed to get file size: {response.status_code} {response.text}") + + return int(response.headers["Content-Length"]) + + +def _calculate_ranges(file_size: int, chunk_size: int) -> List[FileRange]: + """ + Calculate byte ranges for a file based on the chunk size. + + Args: + file_size: Size of the file in bytes. + chunk_size: Size of each chunk in bytes. + + Returns: + List of byte ranges. + """ + ranges = math.ceil(file_size / chunk_size) + return [ + FileRange( + number=i + 1, + start=i * chunk_size, + end=min(file_size - 1, (i + 1) * chunk_size - 1), + ) + for i in range(ranges) + ] + + +@retry(times=10) +def _download_chunk( + url: str, + file_range: FileRange, + output_dir: Path, + queue: Queue, +) -> FileChunk: + """ + Download a byte range of a file from a URL. + """ + session = _get_session() + headers = {"Range": f"bytes={file_range.start}-{file_range.end}"} + + try: + response = session.get(url=url, headers=headers, stream=True, timeout=_request_timeout) + response.raise_for_status() + + path = output_dir / f"data_{file_range.number}" + with open(path, "wb") as file: + for chunk in response.iter_content(chunk_size=1024 * 1024): + queue.put(file.write(chunk), block=False) + except Exception as e: + raise RuntimeError( + f"Failed to download {file_range.number}, range {file_range.start}-{file_range.end}: {e}" + ) + + return FileChunk(number=file_range.number, path=path) + + +def _merge_file_chunks(file_path: PathLike, file_chunks: Sequence[FileChunk]) -> None: + """ + Merge file chunks into a single file then delete the chunks. + """ + with open(file_path, "wb") as merged_file: + for chunk in file_chunks: + with open(chunk.path, "rb") as chunk_file: + merged_file.write(chunk_file.read()) + os.remove(chunk.path) + + +def download( + service: ServiceClient, + volume_name: str, + volume_path: str, + file_path: Path, + callback: Optional[ProgressCallback] = None, + chunk_size: int = DOWNLOAD_CHUNK_SIZE, +) -> None: + """ + Download a file from the volume to the local filesystem. + """ + file_path.parent.mkdir(parents=True, exist_ok=True) + + # Calculate byte ranges + presigned = retry(3)(service.gateway.create_presigned_url)( + CreatePresignedUrlRequest( + volume_name=volume_name, + volume_path=volume_path, + expires=30, + method=PresignedUrlMethod.HeadObject, + ) + ) + if not presigned.ok: + raise RuntimeError(presigned.err_msg) + + file_size = _get_file_size(presigned.url) + file_ranges = _calculate_ranges(file_size, chunk_size) + + # Download and merge file ranges + presigned = retry(3)(service.gateway.create_presigned_url)( + CreatePresignedUrlRequest( + volume_name=volume_name, + volume_path=volume_path, + expires=7200, + method=PresignedUrlMethod.GetObject, + ) + ) + if not presigned.ok: + raise RuntimeError(presigned.err_msg) + + with ExitStack() as stack: + manager = stack.enter_context(Manager()) + temp_dir = stack.enter_context(tempfile.TemporaryDirectory()) + executor = stack.enter_context(ProcessPoolExecutor(_max_workers, initializer=_init_worker)) + + queue = manager.Queue() + + futures = [ + executor.submit(_download_chunk, presigned.url, file_range, Path(temp_dir), queue) + for file_range in file_ranges + ] + + finished = 0 + while finished < file_size: + downloaded = queue.get() + finished += downloaded + if callback: + callback(total=file_size, advance=downloaded) + + chunks = [future.result() for future in concurrent.futures.as_completed(futures)] + chunks.sort(key=lambda chunk: chunk.number) + + _merge_file_chunks(file_path, chunks) diff --git a/sdk/src/beta9/terminal.py b/sdk/src/beta9/terminal.py index 787ff92a2..fa58faa56 100644 --- a/sdk/src/beta9/terminal.py +++ b/sdk/src/beta9/terminal.py @@ -2,7 +2,9 @@ import sys import threading from contextlib import contextmanager -from typing import Any, Generator, Literal, Optional, Sequence, Tuple +from io import BytesIO +from os import PathLike +from typing import Any, Generator, Literal, Optional, Sequence, Tuple, Union import rich import rich.columns @@ -12,6 +14,14 @@ from rich.console import Console from rich.control import STRIP_CONTROL_CODES as _STRIP_CONTROL_CODES from rich.markup import escape +from rich.progress import ( + BarColumn, + DownloadColumn, + Progress, + TextColumn, + TimeRemainingColumn, + TransferSpeedColumn, +) from rich.progress import open as _progress_open from rich.text import Text @@ -100,7 +110,7 @@ def progress(task_name: str) -> Generator[rich.status.Status, None, None]: _current_status = None -def progress_open(file, mode, **kwargs): +def progress_open(file: Union[str, PathLike, bytes], mode: str, **kwargs: Any) -> BytesIO: options = dict( complete_style="green", finished_style="slate_blue1", @@ -166,3 +176,41 @@ def pluralize(seq: Sequence, suffix: str = "s") -> Tuple[int, str]: def reset_terminal() -> None: _console.show_cursor() + + +def progress_description(name: str, max_width: Optional[int] = None): + max_desc_width = max_width or len(name) + if len(name) > max_desc_width: + text = f"...{name[-(max_desc_width - 3):]}" + else: + text = name.ljust(max_desc_width) + + return escape(f"[{text}]") + + +class CustomProgress(Progress): + def add_task(self, description: Any, total: int = 0, *args, **kwargs): + return super().add_task( + progress_description(str(description)), total=total, *args, **kwargs + ) + + +def StyledProgress() -> CustomProgress: + """ + Return a styled progress bar with custom columns. + """ + return CustomProgress( + *[ + TextColumn("[progress.description]{task.description}"), + BarColumn( + complete_style="green", + finished_style="slate_blue1", + ), + DownloadColumn(binary_units=True), + TransferSpeedColumn(), + TimeRemainingColumn(elapsed_when_finished=True), + ], + auto_refresh=True, + refresh_per_second=60, + disable=False, + )