// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/binaryauthorization/v1beta1/service.proto

package binaryauthorization

import (
	context "context"
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	empty "github.com/golang/protobuf/ptypes/empty"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Request message for [BinauthzManagementService.GetPolicy][].
type GetPolicyRequest struct {
	// Required. The resource name of the [policy][google.cloud.binaryauthorization.v1beta1.Policy] to retrieve,
	// in the format `projects/*/policy`.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetPolicyRequest) Reset()         { *m = GetPolicyRequest{} }
func (m *GetPolicyRequest) String() string { return proto.CompactTextString(m) }
func (*GetPolicyRequest) ProtoMessage()    {}
func (*GetPolicyRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b5f16bed3f845be4, []int{0}
}

func (m *GetPolicyRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetPolicyRequest.Unmarshal(m, b)
}
func (m *GetPolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetPolicyRequest.Marshal(b, m, deterministic)
}
func (m *GetPolicyRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetPolicyRequest.Merge(m, src)
}
func (m *GetPolicyRequest) XXX_Size() int {
	return xxx_messageInfo_GetPolicyRequest.Size(m)
}
func (m *GetPolicyRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_GetPolicyRequest.DiscardUnknown(m)
}

var xxx_messageInfo_GetPolicyRequest proto.InternalMessageInfo

func (m *GetPolicyRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for [BinauthzManagementService.UpdatePolicy][].
type UpdatePolicyRequest struct {
	// Required. A new or updated [policy][google.cloud.binaryauthorization.v1beta1.Policy] value. The service will
	// overwrite the [policy name][google.cloud.binaryauthorization.v1beta1.Policy.name] field with the resource name in
	// the request URL, in the format `projects/*/policy`.
	Policy               *Policy  `protobuf:"bytes,1,opt,name=policy,proto3" json:"policy,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UpdatePolicyRequest) Reset()         { *m = UpdatePolicyRequest{} }
func (m *UpdatePolicyRequest) String() string { return proto.CompactTextString(m) }
func (*UpdatePolicyRequest) ProtoMessage()    {}
func (*UpdatePolicyRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b5f16bed3f845be4, []int{1}
}

func (m *UpdatePolicyRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UpdatePolicyRequest.Unmarshal(m, b)
}
func (m *UpdatePolicyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UpdatePolicyRequest.Marshal(b, m, deterministic)
}
func (m *UpdatePolicyRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UpdatePolicyRequest.Merge(m, src)
}
func (m *UpdatePolicyRequest) XXX_Size() int {
	return xxx_messageInfo_UpdatePolicyRequest.Size(m)
}
func (m *UpdatePolicyRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_UpdatePolicyRequest.DiscardUnknown(m)
}

var xxx_messageInfo_UpdatePolicyRequest proto.InternalMessageInfo

func (m *UpdatePolicyRequest) GetPolicy() *Policy {
	if m != nil {
		return m.Policy
	}
	return nil
}

// Request message for [BinauthzManagementService.CreateAttestor][].
type CreateAttestorRequest struct {
	// Required. The parent of this [attestor][google.cloud.binaryauthorization.v1beta1.Attestor].
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The [attestors][google.cloud.binaryauthorization.v1beta1.Attestor] ID.
	AttestorId string `protobuf:"bytes,2,opt,name=attestor_id,json=attestorId,proto3" json:"attestor_id,omitempty"`
	// Required. The initial [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] value. The service will
	// overwrite the [attestor name][google.cloud.binaryauthorization.v1beta1.Attestor.name] field with the resource name,
	// in the format `projects/*/attestors/*`.
	Attestor             *Attestor `protobuf:"bytes,3,opt,name=attestor,proto3" json:"attestor,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *CreateAttestorRequest) Reset()         { *m = CreateAttestorRequest{} }
func (m *CreateAttestorRequest) String() string { return proto.CompactTextString(m) }
func (*CreateAttestorRequest) ProtoMessage()    {}
func (*CreateAttestorRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b5f16bed3f845be4, []int{2}
}

func (m *CreateAttestorRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateAttestorRequest.Unmarshal(m, b)
}
func (m *CreateAttestorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateAttestorRequest.Marshal(b, m, deterministic)
}
func (m *CreateAttestorRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateAttestorRequest.Merge(m, src)
}
func (m *CreateAttestorRequest) XXX_Size() int {
	return xxx_messageInfo_CreateAttestorRequest.Size(m)
}
func (m *CreateAttestorRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateAttestorRequest.DiscardUnknown(m)
}

var xxx_messageInfo_CreateAttestorRequest proto.InternalMessageInfo

func (m *CreateAttestorRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateAttestorRequest) GetAttestorId() string {
	if m != nil {
		return m.AttestorId
	}
	return ""
}

func (m *CreateAttestorRequest) GetAttestor() *Attestor {
	if m != nil {
		return m.Attestor
	}
	return nil
}

// Request message for [BinauthzManagementService.GetAttestor][].
type GetAttestorRequest struct {
	// Required. The name of the [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] to retrieve, in the format
	// `projects/*/attestors/*`.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetAttestorRequest) Reset()         { *m = GetAttestorRequest{} }
func (m *GetAttestorRequest) String() string { return proto.CompactTextString(m) }
func (*GetAttestorRequest) ProtoMessage()    {}
func (*GetAttestorRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b5f16bed3f845be4, []int{3}
}

func (m *GetAttestorRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetAttestorRequest.Unmarshal(m, b)
}
func (m *GetAttestorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetAttestorRequest.Marshal(b, m, deterministic)
}
func (m *GetAttestorRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetAttestorRequest.Merge(m, src)
}
func (m *GetAttestorRequest) XXX_Size() int {
	return xxx_messageInfo_GetAttestorRequest.Size(m)
}
func (m *GetAttestorRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_GetAttestorRequest.DiscardUnknown(m)
}

var xxx_messageInfo_GetAttestorRequest proto.InternalMessageInfo

func (m *GetAttestorRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// Request message for [BinauthzManagementService.UpdateAttestor][].
type UpdateAttestorRequest struct {
	// Required. The updated [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] value. The service will
	// overwrite the [attestor name][google.cloud.binaryauthorization.v1beta1.Attestor.name] field with the resource name
	// in the request URL, in the format `projects/*/attestors/*`.
	Attestor             *Attestor `protobuf:"bytes,1,opt,name=attestor,proto3" json:"attestor,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *UpdateAttestorRequest) Reset()         { *m = UpdateAttestorRequest{} }
func (m *UpdateAttestorRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateAttestorRequest) ProtoMessage()    {}
func (*UpdateAttestorRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b5f16bed3f845be4, []int{4}
}

func (m *UpdateAttestorRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UpdateAttestorRequest.Unmarshal(m, b)
}
func (m *UpdateAttestorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UpdateAttestorRequest.Marshal(b, m, deterministic)
}
func (m *UpdateAttestorRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UpdateAttestorRequest.Merge(m, src)
}
func (m *UpdateAttestorRequest) XXX_Size() int {
	return xxx_messageInfo_UpdateAttestorRequest.Size(m)
}
func (m *UpdateAttestorRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_UpdateAttestorRequest.DiscardUnknown(m)
}

var xxx_messageInfo_UpdateAttestorRequest proto.InternalMessageInfo

func (m *UpdateAttestorRequest) GetAttestor() *Attestor {
	if m != nil {
		return m.Attestor
	}
	return nil
}

// Request message for [BinauthzManagementService.ListAttestors][].
type ListAttestorsRequest struct {
	// Required. The resource name of the project associated with the
	// [attestors][google.cloud.binaryauthorization.v1beta1.Attestor], in the format `projects/*`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Requested page size. The server may return fewer results than requested. If
	// unspecified, the server will pick an appropriate default.
	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// A token identifying a page of results the server should return. Typically,
	// this is the value of [ListAttestorsResponse.next_page_token][google.cloud.binaryauthorization.v1beta1.ListAttestorsResponse.next_page_token] returned
	// from the previous call to the `ListAttestors` method.
	PageToken            string   `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListAttestorsRequest) Reset()         { *m = ListAttestorsRequest{} }
func (m *ListAttestorsRequest) String() string { return proto.CompactTextString(m) }
func (*ListAttestorsRequest) ProtoMessage()    {}
func (*ListAttestorsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b5f16bed3f845be4, []int{5}
}

func (m *ListAttestorsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListAttestorsRequest.Unmarshal(m, b)
}
func (m *ListAttestorsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListAttestorsRequest.Marshal(b, m, deterministic)
}
func (m *ListAttestorsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListAttestorsRequest.Merge(m, src)
}
func (m *ListAttestorsRequest) XXX_Size() int {
	return xxx_messageInfo_ListAttestorsRequest.Size(m)
}
func (m *ListAttestorsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_ListAttestorsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_ListAttestorsRequest proto.InternalMessageInfo

func (m *ListAttestorsRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListAttestorsRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListAttestorsRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

// Response message for [BinauthzManagementService.ListAttestors][].
type ListAttestorsResponse struct {
	// The list of [attestors][google.cloud.binaryauthorization.v1beta1.Attestor].
	Attestors []*Attestor `protobuf:"bytes,1,rep,name=attestors,proto3" json:"attestors,omitempty"`
	// A token to retrieve the next page of results. Pass this value in the
	// [ListAttestorsRequest.page_token][google.cloud.binaryauthorization.v1beta1.ListAttestorsRequest.page_token] field in the subsequent call to the
	// `ListAttestors` method to retrieve the next page of results.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListAttestorsResponse) Reset()         { *m = ListAttestorsResponse{} }
func (m *ListAttestorsResponse) String() string { return proto.CompactTextString(m) }
func (*ListAttestorsResponse) ProtoMessage()    {}
func (*ListAttestorsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_b5f16bed3f845be4, []int{6}
}

func (m *ListAttestorsResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListAttestorsResponse.Unmarshal(m, b)
}
func (m *ListAttestorsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListAttestorsResponse.Marshal(b, m, deterministic)
}
func (m *ListAttestorsResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListAttestorsResponse.Merge(m, src)
}
func (m *ListAttestorsResponse) XXX_Size() int {
	return xxx_messageInfo_ListAttestorsResponse.Size(m)
}
func (m *ListAttestorsResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_ListAttestorsResponse.DiscardUnknown(m)
}

var xxx_messageInfo_ListAttestorsResponse proto.InternalMessageInfo

func (m *ListAttestorsResponse) GetAttestors() []*Attestor {
	if m != nil {
		return m.Attestors
	}
	return nil
}

func (m *ListAttestorsResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// Request message for [BinauthzManagementService.DeleteAttestor][].
type DeleteAttestorRequest struct {
	// Required. The name of the [attestors][google.cloud.binaryauthorization.v1beta1.Attestor] to delete, in the format
	// `projects/*/attestors/*`.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeleteAttestorRequest) Reset()         { *m = DeleteAttestorRequest{} }
func (m *DeleteAttestorRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteAttestorRequest) ProtoMessage()    {}
func (*DeleteAttestorRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b5f16bed3f845be4, []int{7}
}

func (m *DeleteAttestorRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeleteAttestorRequest.Unmarshal(m, b)
}
func (m *DeleteAttestorRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeleteAttestorRequest.Marshal(b, m, deterministic)
}
func (m *DeleteAttestorRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeleteAttestorRequest.Merge(m, src)
}
func (m *DeleteAttestorRequest) XXX_Size() int {
	return xxx_messageInfo_DeleteAttestorRequest.Size(m)
}
func (m *DeleteAttestorRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_DeleteAttestorRequest.DiscardUnknown(m)
}

var xxx_messageInfo_DeleteAttestorRequest proto.InternalMessageInfo

func (m *DeleteAttestorRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func init() {
	proto.RegisterType((*GetPolicyRequest)(nil), "google.cloud.binaryauthorization.v1beta1.GetPolicyRequest")
	proto.RegisterType((*UpdatePolicyRequest)(nil), "google.cloud.binaryauthorization.v1beta1.UpdatePolicyRequest")
	proto.RegisterType((*CreateAttestorRequest)(nil), "google.cloud.binaryauthorization.v1beta1.CreateAttestorRequest")
	proto.RegisterType((*GetAttestorRequest)(nil), "google.cloud.binaryauthorization.v1beta1.GetAttestorRequest")
	proto.RegisterType((*UpdateAttestorRequest)(nil), "google.cloud.binaryauthorization.v1beta1.UpdateAttestorRequest")
	proto.RegisterType((*ListAttestorsRequest)(nil), "google.cloud.binaryauthorization.v1beta1.ListAttestorsRequest")
	proto.RegisterType((*ListAttestorsResponse)(nil), "google.cloud.binaryauthorization.v1beta1.ListAttestorsResponse")
	proto.RegisterType((*DeleteAttestorRequest)(nil), "google.cloud.binaryauthorization.v1beta1.DeleteAttestorRequest")
}

func init() {
	proto.RegisterFile("google/cloud/binaryauthorization/v1beta1/service.proto", fileDescriptor_b5f16bed3f845be4)
}

var fileDescriptor_b5f16bed3f845be4 = []byte{
	// 872 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4f, 0x6f, 0xe3, 0x44,
	0x1c, 0xd5, 0xa4, 0x50, 0x35, 0x13, 0x5a, 0xd0, 0x40, 0x20, 0xb8, 0x20, 0x8a, 0x41, 0x55, 0x68,
	0xa9, 0xa7, 0x49, 0xc5, 0x1f, 0xa5, 0x94, 0xca, 0x81, 0xaa, 0x42, 0xb4, 0x52, 0x95, 0x42, 0x25,
	0x40, 0x28, 0x9d, 0x24, 0x53, 0xd7, 0xe0, 0x78, 0x8c, 0x3d, 0x69, 0x69, 0x50, 0x2f, 0x7c, 0x83,
	0xd5, 0x7e, 0x80, 0xdd, 0xfb, 0xde, 0xf7, 0x03, 0xec, 0x6d, 0x77, 0x6f, 0xdb, 0x5b, 0xa4, 0xd5,
	0xf6, 0xb0, 0x1f, 0x62, 0xb5, 0xa7, 0x95, 0x67, 0x6c, 0xc7, 0x49, 0xdd, 0xd6, 0x89, 0xba, 0xb7,
	0x64, 0x7e, 0xf3, 0x7b, 0xf3, 0xde, 0xbc, 0x9f, 0x9f, 0x06, 0x7e, 0x6d, 0x30, 0x66, 0x58, 0x14,
	0x37, 0x2d, 0xd6, 0x69, 0xe1, 0x86, 0x69, 0x13, 0xf7, 0x84, 0x74, 0xf8, 0x21, 0x73, 0xcd, 0x2e,
	0xe1, 0x26, 0xb3, 0xf1, 0x51, 0xa9, 0x41, 0x39, 0x29, 0x61, 0x8f, 0xba, 0x47, 0x66, 0x93, 0x6a,
	0x8e, 0xcb, 0x38, 0x43, 0x45, 0xd9, 0xa7, 0x89, 0x3e, 0x2d, 0xa1, 0x4f, 0x0b, 0xfa, 0x94, 0x8f,
	0x82, 0x13, 0x88, 0x63, 0x62, 0x62, 0xdb, 0x8c, 0x8b, 0xb2, 0x27, 0x71, 0x94, 0x0f, 0x62, 0xd5,
	0xa6, 0x65, 0x52, 0x9b, 0x07, 0x85, 0x4f, 0x62, 0x85, 0x03, 0x93, 0x5a, 0xad, 0x7a, 0x83, 0x1e,
	0x92, 0x23, 0x93, 0xb9, 0xc1, 0x86, 0x0f, 0x63, 0x1b, 0x5c, 0xea, 0xb1, 0x8e, 0x1b, 0x92, 0x53,
	0xbe, 0x4d, 0x2d, 0x2a, 0x6c, 0x0c, 0xe9, 0xcc, 0x06, 0x9d, 0xe2, 0x5f, 0xa3, 0x73, 0x80, 0x69,
	0xdb, 0xe1, 0x27, 0xb2, 0xa8, 0xfe, 0x06, 0xdf, 0xd9, 0xa4, 0x7c, 0x87, 0x59, 0x66, 0xf3, 0xa4,
	0x46, 0xff, 0xe9, 0x50, 0x8f, 0xa3, 0x0d, 0xf8, 0x86, 0x4d, 0xda, 0xb4, 0x00, 0xe6, 0x40, 0x31,
	0x5b, 0x2d, 0x9d, 0xeb, 0x99, 0x97, 0xfa, 0x22, 0xfc, 0x22, 0xe9, 0x42, 0x24, 0x34, 0x71, 0x4c,
	0x4f, 0x6b, 0xb2, 0x36, 0x0e, 0x70, 0x44, 0xbb, 0xda, 0x82, 0xef, 0xfe, 0xea, 0xb4, 0x08, 0xa7,
	0x83, 0xe8, 0xdb, 0x70, 0xd2, 0x11, 0x0b, 0x02, 0x3f, 0x57, 0x5e, 0xd6, 0xd2, 0x5e, 0xbb, 0x26,
	0x81, 0xaa, 0x13, 0xe7, 0x7a, 0xa6, 0x16, 0x80, 0xa8, 0xcf, 0x00, 0xcc, 0xff, 0xe0, 0x52, 0xc2,
	0xa9, 0xce, 0x39, 0xf5, 0x38, 0x73, 0xc3, 0x83, 0x7e, 0x86, 0x93, 0x0e, 0x71, 0xa9, 0xcd, 0x03,
	0x21, 0x2b, 0x42, 0xc8, 0x12, 0x5c, 0x14, 0x07, 0x85, 0xb7, 0xd4, 0x26, 0x36, 0x31, 0xa8, 0x7b,
	0x41, 0x89, 0xcb, 0xfe, 0xa2, 0x4d, 0x5e, 0x0b, 0x20, 0xd0, 0xe7, 0x30, 0x47, 0x02, 0xfc, 0xba,
	0xd9, 0x2a, 0x64, 0x04, 0xa2, 0x20, 0x02, 0xc3, 0xf5, 0x9f, 0x5a, 0x68, 0x17, 0x4e, 0x85, 0xff,
	0x0a, 0x13, 0x42, 0x5d, 0x39, 0xbd, 0xba, 0x90, 0xbf, 0x84, 0x8d, 0x80, 0xd4, 0x3f, 0x21, 0xda,
	0xa4, 0x7c, 0x58, 0xdd, 0xe6, 0x80, 0x49, 0x91, 0xb6, 0x14, 0x26, 0x45, 0x48, 0xd2, 0x26, 0x0b,
	0xe6, 0xa5, 0x4d, 0xc3, 0x27, 0xc4, 0xc5, 0x80, 0x9b, 0x12, 0x73, 0x07, 0xc0, 0xf7, 0xb6, 0x4c,
	0x2f, 0x92, 0xe3, 0xbd, 0x16, 0xb7, 0x66, 0x61, 0xd6, 0x21, 0x06, 0xad, 0x7b, 0x66, 0x97, 0x0a,
	0xaf, 0xde, 0xac, 0x4d, 0xf9, 0x0b, 0xbb, 0x66, 0x97, 0xa2, 0x8f, 0x21, 0x14, 0x45, 0xce, 0xfe,
	0xa6, 0xb6, 0xb0, 0x29, 0x5b, 0x13, 0xdb, 0x7f, 0xf1, 0x17, 0xd4, 0x5b, 0x00, 0xe6, 0x87, 0x18,
	0x7a, 0x0e, 0xb3, 0x3d, 0x8a, 0x76, 0x60, 0x36, 0xd4, 0xe1, 0x15, 0xc0, 0xdc, 0xc4, 0x78, 0x37,
	0x52, 0xeb, 0x83, 0xa0, 0x79, 0xf8, 0xb6, 0x4d, 0xff, 0xe5, 0xf5, 0x18, 0x1f, 0x31, 0x59, 0xb5,
	0x69, 0x7f, 0x79, 0x27, 0xe2, 0xb4, 0x0f, 0xf3, 0x3f, 0x52, 0x8b, 0x5e, 0xf4, 0xe8, 0xa6, 0xa6,
	0xa0, 0xfc, 0x38, 0x07, 0xe7, 0xaa, 0xa6, 0xed, 0xb7, 0x74, 0xb7, 0xc5, 0x25, 0xb7, 0xa9, 0xcd,
	0x77, 0x65, 0x3e, 0xee, 0x95, 0xaa, 0xbe, 0x04, 0x74, 0x0f, 0xc0, 0x6c, 0x94, 0x16, 0xa8, 0x92,
	0x5e, 0xfb, 0x70, 0xc4, 0x28, 0x23, 0x7f, 0xf4, 0xea, 0x72, 0x4f, 0x17, 0x4c, 0xff, 0x3f, 0x7b,
	0x7e, 0x3b, 0xf3, 0x19, 0xfa, 0x34, 0x8a, 0xbb, 0xff, 0xfc, 0xd5, 0x35, 0x47, 0x4e, 0x80, 0x87,
	0x17, 0xb0, 0x0c, 0x86, 0x53, 0xf4, 0x00, 0xc0, 0xb7, 0xe2, 0x01, 0x84, 0xd6, 0xd2, 0x1f, 0x9a,
	0x10, 0x5c, 0x63, 0x70, 0xd6, 0x7b, 0x7a, 0x10, 0x53, 0x82, 0x75, 0x59, 0x29, 0xf6, 0x59, 0xcb,
	0x75, 0xed, 0x12, 0xf2, 0x95, 0xa0, 0x0f, 0x3d, 0x05, 0x70, 0x66, 0x30, 0xde, 0xd0, 0x7a, 0x7a,
	0x1e, 0x89, 0xc1, 0xa8, 0x8c, 0x31, 0xb4, 0xea, 0x5e, 0x4f, 0x9f, 0x95, 0x1f, 0xd7, 0x97, 0xb1,
	0x1c, 0x8c, 0x7e, 0x4b, 0x7d, 0xea, 0x7c, 0x4c, 0x9f, 0xd8, 0x1c, 0x93, 0x76, 0x8a, 0xa3, 0xb9,
	0xaf, 0x44, 0x79, 0x80, 0xee, 0x03, 0x98, 0x8b, 0xa5, 0x1b, 0xfa, 0x6e, 0xa4, 0xa1, 0xba, 0x09,
	0x65, 0x5f, 0xc5, 0x07, 0xab, 0x88, 0xe6, 0x2f, 0x1f, 0xac, 0x88, 0x3f, 0x5e, 0x38, 0x45, 0x67,
	0x00, 0xce, 0x0c, 0xe6, 0xe6, 0x28, 0xc6, 0x24, 0x26, 0xee, 0x58, 0xf4, 0xb7, 0x7a, 0xfa, 0xd4,
	0x80, 0x0b, 0xab, 0x0a, 0xee, 0x4b, 0x08, 0x2b, 0xda, 0x55, 0x5a, 0x62, 0x76, 0x3c, 0x04, 0x70,
	0x7a, 0x20, 0xfc, 0xd0, 0xf7, 0xe9, 0x39, 0x25, 0xe5, 0xba, 0xb2, 0x3e, 0x76, 0xbf, 0x4c, 0x5d,
	0xf5, 0x1b, 0xff, 0x23, 0x12, 0xc3, 0x74, 0xd1, 0xa1, 0xab, 0x86, 0x0c, 0xdd, 0x05, 0x70, 0x66,
	0x30, 0x35, 0x47, 0x71, 0x28, 0x31, 0x6f, 0x95, 0xf7, 0x43, 0x80, 0xf0, 0x31, 0xa5, 0x6d, 0xf8,
	0x8f, 0xa9, 0xa1, 0x21, 0x5a, 0x48, 0x39, 0x44, 0xca, 0xde, 0x23, 0x5d, 0xbd, 0x3e, 0xab, 0x9f,
	0xe8, 0xda, 0x21, 0xe7, 0x8e, 0x57, 0xc1, 0xf8, 0xf8, 0xf8, 0x78, 0x38, 0xc8, 0xfd, 0x4e, 0xf9,
	0x2a, 0x5c, 0x72, 0x2c, 0xc2, 0x0f, 0x98, 0xdb, 0xae, 0xee, 0xff, 0xfe, 0x47, 0xc0, 0xd3, 0x60,
	0x16, 0xb1, 0x0d, 0x8d, 0xb9, 0x06, 0x36, 0xa8, 0x2d, 0x58, 0xe3, 0x3e, 0xc0, 0xf5, 0xaf, 0xc9,
	0xd5, 0x84, 0xda, 0x0b, 0x00, 0x1a, 0x93, 0x02, 0x6a, 0xe5, 0x55, 0x00, 0x00, 0x00, 0xff, 0xff,
	0x9e, 0xc6, 0x20, 0x53, 0x6c, 0x0b, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// BinauthzManagementServiceV1Beta1Client is the client API for BinauthzManagementServiceV1Beta1 service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type BinauthzManagementServiceV1Beta1Client interface {
	// A [policy][google.cloud.binaryauthorization.v1beta1.Policy] specifies the [attestors][google.cloud.binaryauthorization.v1beta1.Attestor] that must attest to
	// a container image, before the project is allowed to deploy that
	// image. There is at most one policy per project. All image admission
	// requests are permitted if a project has no policy.
	//
	// Gets the [policy][google.cloud.binaryauthorization.v1beta1.Policy] for this project. Returns a default
	// [policy][google.cloud.binaryauthorization.v1beta1.Policy] if the project does not have one.
	GetPolicy(ctx context.Context, in *GetPolicyRequest, opts ...grpc.CallOption) (*Policy, error)
	// Creates or updates a project's [policy][google.cloud.binaryauthorization.v1beta1.Policy], and returns a copy of the
	// new [policy][google.cloud.binaryauthorization.v1beta1.Policy]. A policy is always updated as a whole, to avoid race
	// conditions with concurrent policy enforcement (or management!)
	// requests. Returns NOT_FOUND if the project does not exist, INVALID_ARGUMENT
	// if the request is malformed.
	UpdatePolicy(ctx context.Context, in *UpdatePolicyRequest, opts ...grpc.CallOption) (*Policy, error)
	// Creates an [attestor][google.cloud.binaryauthorization.v1beta1.Attestor], and returns a copy of the new
	// [attestor][google.cloud.binaryauthorization.v1beta1.Attestor]. Returns NOT_FOUND if the project does not exist,
	// INVALID_ARGUMENT if the request is malformed, ALREADY_EXISTS if the
	// [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] already exists.
	CreateAttestor(ctx context.Context, in *CreateAttestorRequest, opts ...grpc.CallOption) (*Attestor, error)
	// Gets an [attestor][google.cloud.binaryauthorization.v1beta1.Attestor].
	// Returns NOT_FOUND if the [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] does not exist.
	GetAttestor(ctx context.Context, in *GetAttestorRequest, opts ...grpc.CallOption) (*Attestor, error)
	// Updates an [attestor][google.cloud.binaryauthorization.v1beta1.Attestor].
	// Returns NOT_FOUND if the [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] does not exist.
	UpdateAttestor(ctx context.Context, in *UpdateAttestorRequest, opts ...grpc.CallOption) (*Attestor, error)
	// Lists [attestors][google.cloud.binaryauthorization.v1beta1.Attestor].
	// Returns INVALID_ARGUMENT if the project does not exist.
	ListAttestors(ctx context.Context, in *ListAttestorsRequest, opts ...grpc.CallOption) (*ListAttestorsResponse, error)
	// Deletes an [attestor][google.cloud.binaryauthorization.v1beta1.Attestor]. Returns NOT_FOUND if the
	// [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] does not exist.
	DeleteAttestor(ctx context.Context, in *DeleteAttestorRequest, opts ...grpc.CallOption) (*empty.Empty, error)
}

type binauthzManagementServiceV1Beta1Client struct {
	cc grpc.ClientConnInterface
}

func NewBinauthzManagementServiceV1Beta1Client(cc grpc.ClientConnInterface) BinauthzManagementServiceV1Beta1Client {
	return &binauthzManagementServiceV1Beta1Client{cc}
}

func (c *binauthzManagementServiceV1Beta1Client) GetPolicy(ctx context.Context, in *GetPolicyRequest, opts ...grpc.CallOption) (*Policy, error) {
	out := new(Policy)
	err := c.cc.Invoke(ctx, "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/GetPolicy", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binauthzManagementServiceV1Beta1Client) UpdatePolicy(ctx context.Context, in *UpdatePolicyRequest, opts ...grpc.CallOption) (*Policy, error) {
	out := new(Policy)
	err := c.cc.Invoke(ctx, "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/UpdatePolicy", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binauthzManagementServiceV1Beta1Client) CreateAttestor(ctx context.Context, in *CreateAttestorRequest, opts ...grpc.CallOption) (*Attestor, error) {
	out := new(Attestor)
	err := c.cc.Invoke(ctx, "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/CreateAttestor", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binauthzManagementServiceV1Beta1Client) GetAttestor(ctx context.Context, in *GetAttestorRequest, opts ...grpc.CallOption) (*Attestor, error) {
	out := new(Attestor)
	err := c.cc.Invoke(ctx, "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/GetAttestor", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binauthzManagementServiceV1Beta1Client) UpdateAttestor(ctx context.Context, in *UpdateAttestorRequest, opts ...grpc.CallOption) (*Attestor, error) {
	out := new(Attestor)
	err := c.cc.Invoke(ctx, "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/UpdateAttestor", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binauthzManagementServiceV1Beta1Client) ListAttestors(ctx context.Context, in *ListAttestorsRequest, opts ...grpc.CallOption) (*ListAttestorsResponse, error) {
	out := new(ListAttestorsResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/ListAttestors", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *binauthzManagementServiceV1Beta1Client) DeleteAttestor(ctx context.Context, in *DeleteAttestorRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/DeleteAttestor", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// BinauthzManagementServiceV1Beta1Server is the server API for BinauthzManagementServiceV1Beta1 service.
type BinauthzManagementServiceV1Beta1Server interface {
	// A [policy][google.cloud.binaryauthorization.v1beta1.Policy] specifies the [attestors][google.cloud.binaryauthorization.v1beta1.Attestor] that must attest to
	// a container image, before the project is allowed to deploy that
	// image. There is at most one policy per project. All image admission
	// requests are permitted if a project has no policy.
	//
	// Gets the [policy][google.cloud.binaryauthorization.v1beta1.Policy] for this project. Returns a default
	// [policy][google.cloud.binaryauthorization.v1beta1.Policy] if the project does not have one.
	GetPolicy(context.Context, *GetPolicyRequest) (*Policy, error)
	// Creates or updates a project's [policy][google.cloud.binaryauthorization.v1beta1.Policy], and returns a copy of the
	// new [policy][google.cloud.binaryauthorization.v1beta1.Policy]. A policy is always updated as a whole, to avoid race
	// conditions with concurrent policy enforcement (or management!)
	// requests. Returns NOT_FOUND if the project does not exist, INVALID_ARGUMENT
	// if the request is malformed.
	UpdatePolicy(context.Context, *UpdatePolicyRequest) (*Policy, error)
	// Creates an [attestor][google.cloud.binaryauthorization.v1beta1.Attestor], and returns a copy of the new
	// [attestor][google.cloud.binaryauthorization.v1beta1.Attestor]. Returns NOT_FOUND if the project does not exist,
	// INVALID_ARGUMENT if the request is malformed, ALREADY_EXISTS if the
	// [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] already exists.
	CreateAttestor(context.Context, *CreateAttestorRequest) (*Attestor, error)
	// Gets an [attestor][google.cloud.binaryauthorization.v1beta1.Attestor].
	// Returns NOT_FOUND if the [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] does not exist.
	GetAttestor(context.Context, *GetAttestorRequest) (*Attestor, error)
	// Updates an [attestor][google.cloud.binaryauthorization.v1beta1.Attestor].
	// Returns NOT_FOUND if the [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] does not exist.
	UpdateAttestor(context.Context, *UpdateAttestorRequest) (*Attestor, error)
	// Lists [attestors][google.cloud.binaryauthorization.v1beta1.Attestor].
	// Returns INVALID_ARGUMENT if the project does not exist.
	ListAttestors(context.Context, *ListAttestorsRequest) (*ListAttestorsResponse, error)
	// Deletes an [attestor][google.cloud.binaryauthorization.v1beta1.Attestor]. Returns NOT_FOUND if the
	// [attestor][google.cloud.binaryauthorization.v1beta1.Attestor] does not exist.
	DeleteAttestor(context.Context, *DeleteAttestorRequest) (*empty.Empty, error)
}

// UnimplementedBinauthzManagementServiceV1Beta1Server can be embedded to have forward compatible implementations.
type UnimplementedBinauthzManagementServiceV1Beta1Server struct {
}

func (*UnimplementedBinauthzManagementServiceV1Beta1Server) GetPolicy(ctx context.Context, req *GetPolicyRequest) (*Policy, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetPolicy not implemented")
}
func (*UnimplementedBinauthzManagementServiceV1Beta1Server) UpdatePolicy(ctx context.Context, req *UpdatePolicyRequest) (*Policy, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UpdatePolicy not implemented")
}
func (*UnimplementedBinauthzManagementServiceV1Beta1Server) CreateAttestor(ctx context.Context, req *CreateAttestorRequest) (*Attestor, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CreateAttestor not implemented")
}
func (*UnimplementedBinauthzManagementServiceV1Beta1Server) GetAttestor(ctx context.Context, req *GetAttestorRequest) (*Attestor, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetAttestor not implemented")
}
func (*UnimplementedBinauthzManagementServiceV1Beta1Server) UpdateAttestor(ctx context.Context, req *UpdateAttestorRequest) (*Attestor, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UpdateAttestor not implemented")
}
func (*UnimplementedBinauthzManagementServiceV1Beta1Server) ListAttestors(ctx context.Context, req *ListAttestorsRequest) (*ListAttestorsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ListAttestors not implemented")
}
func (*UnimplementedBinauthzManagementServiceV1Beta1Server) DeleteAttestor(ctx context.Context, req *DeleteAttestorRequest) (*empty.Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method DeleteAttestor not implemented")
}

func RegisterBinauthzManagementServiceV1Beta1Server(s *grpc.Server, srv BinauthzManagementServiceV1Beta1Server) {
	s.RegisterService(&_BinauthzManagementServiceV1Beta1_serviceDesc, srv)
}

func _BinauthzManagementServiceV1Beta1_GetPolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetPolicyRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinauthzManagementServiceV1Beta1Server).GetPolicy(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/GetPolicy",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinauthzManagementServiceV1Beta1Server).GetPolicy(ctx, req.(*GetPolicyRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinauthzManagementServiceV1Beta1_UpdatePolicy_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdatePolicyRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinauthzManagementServiceV1Beta1Server).UpdatePolicy(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/UpdatePolicy",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinauthzManagementServiceV1Beta1Server).UpdatePolicy(ctx, req.(*UpdatePolicyRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinauthzManagementServiceV1Beta1_CreateAttestor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateAttestorRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinauthzManagementServiceV1Beta1Server).CreateAttestor(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/CreateAttestor",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinauthzManagementServiceV1Beta1Server).CreateAttestor(ctx, req.(*CreateAttestorRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinauthzManagementServiceV1Beta1_GetAttestor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetAttestorRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinauthzManagementServiceV1Beta1Server).GetAttestor(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/GetAttestor",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinauthzManagementServiceV1Beta1Server).GetAttestor(ctx, req.(*GetAttestorRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinauthzManagementServiceV1Beta1_UpdateAttestor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateAttestorRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinauthzManagementServiceV1Beta1Server).UpdateAttestor(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/UpdateAttestor",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinauthzManagementServiceV1Beta1Server).UpdateAttestor(ctx, req.(*UpdateAttestorRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinauthzManagementServiceV1Beta1_ListAttestors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListAttestorsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinauthzManagementServiceV1Beta1Server).ListAttestors(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/ListAttestors",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinauthzManagementServiceV1Beta1Server).ListAttestors(ctx, req.(*ListAttestorsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _BinauthzManagementServiceV1Beta1_DeleteAttestor_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteAttestorRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(BinauthzManagementServiceV1Beta1Server).DeleteAttestor(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1/DeleteAttestor",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(BinauthzManagementServiceV1Beta1Server).DeleteAttestor(ctx, req.(*DeleteAttestorRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _BinauthzManagementServiceV1Beta1_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.cloud.binaryauthorization.v1beta1.BinauthzManagementServiceV1Beta1",
	HandlerType: (*BinauthzManagementServiceV1Beta1Server)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetPolicy",
			Handler:    _BinauthzManagementServiceV1Beta1_GetPolicy_Handler,
		},
		{
			MethodName: "UpdatePolicy",
			Handler:    _BinauthzManagementServiceV1Beta1_UpdatePolicy_Handler,
		},
		{
			MethodName: "CreateAttestor",
			Handler:    _BinauthzManagementServiceV1Beta1_CreateAttestor_Handler,
		},
		{
			MethodName: "GetAttestor",
			Handler:    _BinauthzManagementServiceV1Beta1_GetAttestor_Handler,
		},
		{
			MethodName: "UpdateAttestor",
			Handler:    _BinauthzManagementServiceV1Beta1_UpdateAttestor_Handler,
		},
		{
			MethodName: "ListAttestors",
			Handler:    _BinauthzManagementServiceV1Beta1_ListAttestors_Handler,
		},
		{
			MethodName: "DeleteAttestor",
			Handler:    _BinauthzManagementServiceV1Beta1_DeleteAttestor_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/cloud/binaryauthorization/v1beta1/service.proto",
}
