// Copyright 2022 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.21.5
// source: relui.proto

package protos

import (
	reflect "reflect"
	sync "sync"

	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// The type of artifact signing request.
type SignArtifactRequest_BuildType int32

const (
	SignArtifactRequest_BUILD_TYPE_UNSPECIFIED SignArtifactRequest_BuildType = 0
	SignArtifactRequest_BUILD_TYPE_MACOS       SignArtifactRequest_BuildType = 1
	SignArtifactRequest_BUILD_TYPE_WINDOWS     SignArtifactRequest_BuildType = 2
	SignArtifactRequest_BUILD_TYPE_GPG         SignArtifactRequest_BuildType = 3
)

// Enum value maps for SignArtifactRequest_BuildType.
var (
	SignArtifactRequest_BuildType_name = map[int32]string{
		0: "BUILD_TYPE_UNSPECIFIED",
		1: "BUILD_TYPE_MACOS",
		2: "BUILD_TYPE_WINDOWS",
		3: "BUILD_TYPE_GPG",
	}
	SignArtifactRequest_BuildType_value = map[string]int32{
		"BUILD_TYPE_UNSPECIFIED": 0,
		"BUILD_TYPE_MACOS":       1,
		"BUILD_TYPE_WINDOWS":     2,
		"BUILD_TYPE_GPG":         3,
	}
)

func (x SignArtifactRequest_BuildType) Enum() *SignArtifactRequest_BuildType {
	p := new(SignArtifactRequest_BuildType)
	*p = x
	return p
}

func (x SignArtifactRequest_BuildType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (SignArtifactRequest_BuildType) Descriptor() protoreflect.EnumDescriptor {
	return file_relui_proto_enumTypes[0].Descriptor()
}

func (SignArtifactRequest_BuildType) Type() protoreflect.EnumType {
	return &file_relui_proto_enumTypes[0]
}

func (x SignArtifactRequest_BuildType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use SignArtifactRequest_BuildType.Descriptor instead.
func (SignArtifactRequest_BuildType) EnumDescriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{1, 0}
}

// Request an action from the signing client.
type SigningRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the request. This would normally reside within
	// the metadata. This is primarily used to route requests between
	// caller/responder. The server and client must use the same id for each
	// corresponging request.
	MessageId string `protobuf:"bytes,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
	// Request type for the signing client.
	//
	// Types that are assignable to RequestOneof:
	//
	//	*SigningRequest_Sign
	//	*SigningRequest_Status
	//	*SigningRequest_Cancel
	RequestOneof isSigningRequest_RequestOneof `protobuf_oneof:"request_oneof"`
}

func (x *SigningRequest) Reset() {
	*x = SigningRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SigningRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SigningRequest) ProtoMessage() {}

func (x *SigningRequest) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[0]
	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 SigningRequest.ProtoReflect.Descriptor instead.
func (*SigningRequest) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{0}
}

func (x *SigningRequest) GetMessageId() string {
	if x != nil {
		return x.MessageId
	}
	return ""
}

func (m *SigningRequest) GetRequestOneof() isSigningRequest_RequestOneof {
	if m != nil {
		return m.RequestOneof
	}
	return nil
}

func (x *SigningRequest) GetSign() *SignArtifactRequest {
	if x, ok := x.GetRequestOneof().(*SigningRequest_Sign); ok {
		return x.Sign
	}
	return nil
}

func (x *SigningRequest) GetStatus() *SignArtifactStatusRequest {
	if x, ok := x.GetRequestOneof().(*SigningRequest_Status); ok {
		return x.Status
	}
	return nil
}

func (x *SigningRequest) GetCancel() *SignArtifactCancelRequest {
	if x, ok := x.GetRequestOneof().(*SigningRequest_Cancel); ok {
		return x.Cancel
	}
	return nil
}

type isSigningRequest_RequestOneof interface {
	isSigningRequest_RequestOneof()
}

type SigningRequest_Sign struct {
	Sign *SignArtifactRequest `protobuf:"bytes,2,opt,name=sign,proto3,oneof"`
}

type SigningRequest_Status struct {
	Status *SignArtifactStatusRequest `protobuf:"bytes,3,opt,name=status,proto3,oneof"`
}

type SigningRequest_Cancel struct {
	Cancel *SignArtifactCancelRequest `protobuf:"bytes,4,opt,name=cancel,proto3,oneof"`
}

func (*SigningRequest_Sign) isSigningRequest_RequestOneof() {}

func (*SigningRequest_Status) isSigningRequest_RequestOneof() {}

func (*SigningRequest_Cancel) isSigningRequest_RequestOneof() {}

// Request to sign a release artifact.
type SignArtifactRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	BuildType SignArtifactRequest_BuildType `protobuf:"varint,1,opt,name=build_type,json=buildType,proto3,enum=protos.SignArtifactRequest_BuildType" json:"build_type,omitempty"`
	// The GCS URI for the artifact that should be signed.
	// This artifact must reside in the agreed upon private
	// GCS bucket.
	//
	// There must be at least one entry, and
	// each one points to an individual file.
	// For example, "gs://golang-release-staging/relui-scratch/<...>/go123.linux-amd64.tar.gz".
	GcsUri []string `protobuf:"bytes,2,rep,name=gcs_uri,json=gcsUri,proto3" json:"gcs_uri,omitempty"`
}

func (x *SignArtifactRequest) Reset() {
	*x = SignArtifactRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SignArtifactRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SignArtifactRequest) ProtoMessage() {}

func (x *SignArtifactRequest) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[1]
	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 SignArtifactRequest.ProtoReflect.Descriptor instead.
func (*SignArtifactRequest) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{1}
}

func (x *SignArtifactRequest) GetBuildType() SignArtifactRequest_BuildType {
	if x != nil {
		return x.BuildType
	}
	return SignArtifactRequest_BUILD_TYPE_UNSPECIFIED
}

func (x *SignArtifactRequest) GetGcsUri() []string {
	if x != nil {
		return x.GcsUri
	}
	return nil
}

// Request for an update on an existing signing request.
type SignArtifactStatusRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the signing job.
	JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"`
}

func (x *SignArtifactStatusRequest) Reset() {
	*x = SignArtifactStatusRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SignArtifactStatusRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SignArtifactStatusRequest) ProtoMessage() {}

func (x *SignArtifactStatusRequest) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[2]
	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 SignArtifactStatusRequest.ProtoReflect.Descriptor instead.
func (*SignArtifactStatusRequest) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{2}
}

func (x *SignArtifactStatusRequest) GetJobId() string {
	if x != nil {
		return x.JobId
	}
	return ""
}

// Request to stop a previous signing request sooner if possible.
type SignArtifactCancelRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the signing job.
	JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"`
}

func (x *SignArtifactCancelRequest) Reset() {
	*x = SignArtifactCancelRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SignArtifactCancelRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SignArtifactCancelRequest) ProtoMessage() {}

func (x *SignArtifactCancelRequest) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[3]
	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 SignArtifactCancelRequest.ProtoReflect.Descriptor instead.
func (*SignArtifactCancelRequest) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{3}
}

func (x *SignArtifactCancelRequest) GetJobId() string {
	if x != nil {
		return x.JobId
	}
	return ""
}

// The status of the signing request.
type SigningStatus struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the request. This would normally reside within
	// the metadata. This is primarily used to route requests between
	// caller/responder. The server and client must use the same id for each
	// corresponging request.
	MessageId string `protobuf:"bytes,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"`
	// The status type of the signing request.
	//
	// Types that are assignable to StatusOneof:
	//
	//	*SigningStatus_NotFound
	//	*SigningStatus_Started
	//	*SigningStatus_Running
	//	*SigningStatus_Failed
	//	*SigningStatus_Completed
	StatusOneof isSigningStatus_StatusOneof `protobuf_oneof:"status_oneof"`
}

func (x *SigningStatus) Reset() {
	*x = SigningStatus{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SigningStatus) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SigningStatus) ProtoMessage() {}

func (x *SigningStatus) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[4]
	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 SigningStatus.ProtoReflect.Descriptor instead.
func (*SigningStatus) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{4}
}

func (x *SigningStatus) GetMessageId() string {
	if x != nil {
		return x.MessageId
	}
	return ""
}

func (m *SigningStatus) GetStatusOneof() isSigningStatus_StatusOneof {
	if m != nil {
		return m.StatusOneof
	}
	return nil
}

func (x *SigningStatus) GetNotFound() *StatusNotFound {
	if x, ok := x.GetStatusOneof().(*SigningStatus_NotFound); ok {
		return x.NotFound
	}
	return nil
}

func (x *SigningStatus) GetStarted() *StatusStarted {
	if x, ok := x.GetStatusOneof().(*SigningStatus_Started); ok {
		return x.Started
	}
	return nil
}

func (x *SigningStatus) GetRunning() *StatusRunning {
	if x, ok := x.GetStatusOneof().(*SigningStatus_Running); ok {
		return x.Running
	}
	return nil
}

func (x *SigningStatus) GetFailed() *StatusFailed {
	if x, ok := x.GetStatusOneof().(*SigningStatus_Failed); ok {
		return x.Failed
	}
	return nil
}

func (x *SigningStatus) GetCompleted() *StatusCompleted {
	if x, ok := x.GetStatusOneof().(*SigningStatus_Completed); ok {
		return x.Completed
	}
	return nil
}

type isSigningStatus_StatusOneof interface {
	isSigningStatus_StatusOneof()
}

type SigningStatus_NotFound struct {
	NotFound *StatusNotFound `protobuf:"bytes,3,opt,name=not_found,json=notFound,proto3,oneof"`
}

type SigningStatus_Started struct {
	Started *StatusStarted `protobuf:"bytes,4,opt,name=started,proto3,oneof"`
}

type SigningStatus_Running struct {
	Running *StatusRunning `protobuf:"bytes,5,opt,name=running,proto3,oneof"`
}

type SigningStatus_Failed struct {
	Failed *StatusFailed `protobuf:"bytes,6,opt,name=failed,proto3,oneof"`
}

type SigningStatus_Completed struct {
	Completed *StatusCompleted `protobuf:"bytes,7,opt,name=completed,proto3,oneof"`
}

func (*SigningStatus_NotFound) isSigningStatus_StatusOneof() {}

func (*SigningStatus_Started) isSigningStatus_StatusOneof() {}

func (*SigningStatus_Running) isSigningStatus_StatusOneof() {}

func (*SigningStatus_Failed) isSigningStatus_StatusOneof() {}

func (*SigningStatus_Completed) isSigningStatus_StatusOneof() {}

// The signing status for a signing request which does not exist.
type StatusNotFound struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *StatusNotFound) Reset() {
	*x = StatusNotFound{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *StatusNotFound) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*StatusNotFound) ProtoMessage() {}

func (x *StatusNotFound) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[5]
	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 StatusNotFound.ProtoReflect.Descriptor instead.
func (*StatusNotFound) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{5}
}

// The signing status for an in progress signing request.
type StatusStarted struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// unique identifier for the signing job that started.
	JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"`
}

func (x *StatusStarted) Reset() {
	*x = StatusStarted{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *StatusStarted) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*StatusStarted) ProtoMessage() {}

func (x *StatusStarted) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[6]
	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 StatusStarted.ProtoReflect.Descriptor instead.
func (*StatusStarted) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{6}
}

func (x *StatusStarted) GetJobId() string {
	if x != nil {
		return x.JobId
	}
	return ""
}

type StatusRunning struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Details about the signing request status.
	Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
}

func (x *StatusRunning) Reset() {
	*x = StatusRunning{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *StatusRunning) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*StatusRunning) ProtoMessage() {}

func (x *StatusRunning) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[7]
	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 StatusRunning.ProtoReflect.Descriptor instead.
func (*StatusRunning) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{7}
}

func (x *StatusRunning) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

// The signing status for a failed signing request.
type StatusFailed struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Details about the signing request status.
	Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
}

func (x *StatusFailed) Reset() {
	*x = StatusFailed{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *StatusFailed) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*StatusFailed) ProtoMessage() {}

func (x *StatusFailed) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[8]
	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 StatusFailed.ProtoReflect.Descriptor instead.
func (*StatusFailed) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{8}
}

func (x *StatusFailed) GetDescription() string {
	if x != nil {
		return x.Description
	}
	return ""
}

// The signing status for a successfully completed signing request.
type StatusCompleted struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The GCS URIs of the signed artifact(s),
	// each one pointing to an individual file.
	// For example, "gs://golang-release-staging/relui-scratch/<...>/go123.linux-amd64.tar.gz".
	GcsUri []string `protobuf:"bytes,1,rep,name=gcs_uri,json=gcsUri,proto3" json:"gcs_uri,omitempty"`
}

func (x *StatusCompleted) Reset() {
	*x = StatusCompleted{}
	if protoimpl.UnsafeEnabled {
		mi := &file_relui_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *StatusCompleted) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*StatusCompleted) ProtoMessage() {}

func (x *StatusCompleted) ProtoReflect() protoreflect.Message {
	mi := &file_relui_proto_msgTypes[9]
	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 StatusCompleted.ProtoReflect.Descriptor instead.
func (*StatusCompleted) Descriptor() ([]byte, []int) {
	return file_relui_proto_rawDescGZIP(), []int{9}
}

func (x *StatusCompleted) GetGcsUri() []string {
	if x != nil {
		return x.GcsUri
	}
	return nil
}

var File_relui_proto protoreflect.FileDescriptor

var file_relui_proto_rawDesc = []byte{
	0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x75, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e,
	0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73,
	0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65,
	0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53,
	0x69, 0x67, 0x6e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x48, 0x00, 0x52, 0x04, 0x73, 0x69, 0x67, 0x6e, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74,
	0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52,
	0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x63, 0x61, 0x6e, 0x63, 0x65,
	0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73,
	0x2e, 0x53, 0x69, 0x67, 0x6e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6e,
	0x63, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x06, 0x63, 0x61,
	0x6e, 0x63, 0x65, 0x6c, 0x42, 0x0f, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f,
	0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0xdf, 0x01, 0x0a, 0x13, 0x53, 0x69, 0x67, 0x6e, 0x41, 0x72,
	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a,
	0x0a, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x25, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x41,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54,
	0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x63, 0x73, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x02,
	0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x63, 0x73, 0x55, 0x72, 0x69, 0x22, 0x69, 0x0a, 0x09,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x49,
	0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46,
	0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x54,
	0x59, 0x50, 0x45, 0x5f, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x42,
	0x55, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57,
	0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x54, 0x59, 0x50,
	0x45, 0x5f, 0x47, 0x50, 0x47, 0x10, 0x03, 0x22, 0x32, 0x0a, 0x19, 0x53, 0x69, 0x67, 0x6e, 0x41,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x19, 0x53,
	0x69, 0x67, 0x6e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x63, 0x65,
	0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f,
	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22,
	0xc4, 0x02, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75,
	0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64,
	0x12, 0x35, 0x0a, 0x09, 0x6e, 0x6f, 0x74, 0x5f, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61,
	0x74, 0x75, 0x73, 0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x00, 0x52, 0x08, 0x6e,
	0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74,
	0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x48,
	0x00, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x75,
	0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x75, 0x6e, 0x6e, 0x69,
	0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a,
	0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x61, 0x69,
	0x6c, 0x65, 0x64, 0x48, 0x00, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x37, 0x0a,
	0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x6d,
	0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x10, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x4e, 0x6f, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x26, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74,
	0x75, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62,
	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64,
	0x22, 0x31, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e,
	0x67, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
	0x69, 0x6f, 0x6e, 0x22, 0x30, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x61, 0x69,
	0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69,
	0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69,
	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43,
	0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x63, 0x73, 0x5f,
	0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x67, 0x63, 0x73, 0x55, 0x72,
	0x69, 0x32, 0x5c, 0x0a, 0x0e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76,
	0x69, 0x63, 0x65, 0x12, 0x4a, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x69, 0x67,
	0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x75,
	0x73, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x69,
	0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42,
	0x2a, 0x5a, 0x28, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x78, 0x2f,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x72,
	0x65, 0x6c, 0x75, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x33,
}

var (
	file_relui_proto_rawDescOnce sync.Once
	file_relui_proto_rawDescData = file_relui_proto_rawDesc
)

func file_relui_proto_rawDescGZIP() []byte {
	file_relui_proto_rawDescOnce.Do(func() {
		file_relui_proto_rawDescData = protoimpl.X.CompressGZIP(file_relui_proto_rawDescData)
	})
	return file_relui_proto_rawDescData
}

var file_relui_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_relui_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
var file_relui_proto_goTypes = []interface{}{
	(SignArtifactRequest_BuildType)(0), // 0: protos.SignArtifactRequest.BuildType
	(*SigningRequest)(nil),             // 1: protos.SigningRequest
	(*SignArtifactRequest)(nil),        // 2: protos.SignArtifactRequest
	(*SignArtifactStatusRequest)(nil),  // 3: protos.SignArtifactStatusRequest
	(*SignArtifactCancelRequest)(nil),  // 4: protos.SignArtifactCancelRequest
	(*SigningStatus)(nil),              // 5: protos.SigningStatus
	(*StatusNotFound)(nil),             // 6: protos.StatusNotFound
	(*StatusStarted)(nil),              // 7: protos.StatusStarted
	(*StatusRunning)(nil),              // 8: protos.StatusRunning
	(*StatusFailed)(nil),               // 9: protos.StatusFailed
	(*StatusCompleted)(nil),            // 10: protos.StatusCompleted
}
var file_relui_proto_depIdxs = []int32{
	2,  // 0: protos.SigningRequest.sign:type_name -> protos.SignArtifactRequest
	3,  // 1: protos.SigningRequest.status:type_name -> protos.SignArtifactStatusRequest
	4,  // 2: protos.SigningRequest.cancel:type_name -> protos.SignArtifactCancelRequest
	0,  // 3: protos.SignArtifactRequest.build_type:type_name -> protos.SignArtifactRequest.BuildType
	6,  // 4: protos.SigningStatus.not_found:type_name -> protos.StatusNotFound
	7,  // 5: protos.SigningStatus.started:type_name -> protos.StatusStarted
	8,  // 6: protos.SigningStatus.running:type_name -> protos.StatusRunning
	9,  // 7: protos.SigningStatus.failed:type_name -> protos.StatusFailed
	10, // 8: protos.SigningStatus.completed:type_name -> protos.StatusCompleted
	5,  // 9: protos.ReleaseService.UpdateSigningStatus:input_type -> protos.SigningStatus
	1,  // 10: protos.ReleaseService.UpdateSigningStatus:output_type -> protos.SigningRequest
	10, // [10:11] is the sub-list for method output_type
	9,  // [9:10] is the sub-list for method input_type
	9,  // [9:9] is the sub-list for extension type_name
	9,  // [9:9] is the sub-list for extension extendee
	0,  // [0:9] is the sub-list for field type_name
}

func init() { file_relui_proto_init() }
func file_relui_proto_init() {
	if File_relui_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_relui_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SigningRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SignArtifactRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SignArtifactStatusRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SignArtifactCancelRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SigningStatus); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusNotFound); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusStarted); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusRunning); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusFailed); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_relui_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StatusCompleted); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_relui_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*SigningRequest_Sign)(nil),
		(*SigningRequest_Status)(nil),
		(*SigningRequest_Cancel)(nil),
	}
	file_relui_proto_msgTypes[4].OneofWrappers = []interface{}{
		(*SigningStatus_NotFound)(nil),
		(*SigningStatus_Started)(nil),
		(*SigningStatus_Running)(nil),
		(*SigningStatus_Failed)(nil),
		(*SigningStatus_Completed)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_relui_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   10,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_relui_proto_goTypes,
		DependencyIndexes: file_relui_proto_depIdxs,
		EnumInfos:         file_relui_proto_enumTypes,
		MessageInfos:      file_relui_proto_msgTypes,
	}.Build()
	File_relui_proto = out.File
	file_relui_proto_rawDesc = nil
	file_relui_proto_goTypes = nil
	file_relui_proto_depIdxs = nil
}
