// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.32.0
// 	protoc        v3.21.12
// source: coverage_service.proto

package v1

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)
)

type CoverageRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*CoverageRequest) ProtoMessage() {}

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

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

	FileName      *string  `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3,oneof" json:"file_name,omitempty"`
	BuilderName   *string  `protobuf:"bytes,2,opt,name=builder_name,json=builderName,proto3,oneof" json:"builder_name,omitempty"`
	TestSuiteName []string `protobuf:"bytes,3,rep,name=test_suite_name,json=testSuiteName,proto3" json:"test_suite_name,omitempty"`
}

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

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

func (*CoverageResponse) ProtoMessage() {}

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

func (x *CoverageResponse) GetFileName() string {
	if x != nil && x.FileName != nil {
		return *x.FileName
	}
	return ""
}

func (x *CoverageResponse) GetBuilderName() string {
	if x != nil && x.BuilderName != nil {
		return *x.BuilderName
	}
	return ""
}

func (x *CoverageResponse) GetTestSuiteName() []string {
	if x != nil {
		return x.TestSuiteName
	}
	return nil
}

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

	Responses []*CoverageResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
}

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

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

func (*CoverageAllResponses) ProtoMessage() {}

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

func (x *CoverageAllResponses) GetResponses() []*CoverageResponse {
	if x != nil {
		return x.Responses
	}
	return nil
}

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

	FileName    *string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3,oneof" json:"file_name,omitempty"`
	BuilderName *string `protobuf:"bytes,2,opt,name=builder_name,json=builderName,proto3,oneof" json:"builder_name,omitempty"`
}

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

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

func (*CoverageListRequest) ProtoMessage() {}

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

func (x *CoverageListRequest) GetFileName() string {
	if x != nil && x.FileName != nil {
		return *x.FileName
	}
	return ""
}

func (x *CoverageListRequest) GetBuilderName() string {
	if x != nil && x.BuilderName != nil {
		return *x.BuilderName
	}
	return ""
}

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

	Status     *string  `protobuf:"bytes,1,opt,name=status,proto3,oneof" json:"status,omitempty"`
	TestSuites []string `protobuf:"bytes,2,rep,name=test_suites,json=testSuites,proto3" json:"test_suites,omitempty"`
}

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

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

func (*CoverageListResponse) ProtoMessage() {}

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

func (x *CoverageListResponse) GetStatus() string {
	if x != nil && x.Status != nil {
		return *x.Status
	}
	return ""
}

func (x *CoverageListResponse) GetTestSuites() []string {
	if x != nil {
		return x.TestSuites
	}
	return nil
}

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

	FileName      *string  `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3,oneof" json:"file_name,omitempty"`
	BuilderName   *string  `protobuf:"bytes,2,opt,name=builder_name,json=builderName,proto3,oneof" json:"builder_name,omitempty"`
	TestSuiteName []string `protobuf:"bytes,3,rep,name=test_suite_name,json=testSuiteName,proto3" json:"test_suite_name,omitempty"`
}

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

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

func (*CoverageChangeRequest) ProtoMessage() {}

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

func (x *CoverageChangeRequest) GetFileName() string {
	if x != nil && x.FileName != nil {
		return *x.FileName
	}
	return ""
}

func (x *CoverageChangeRequest) GetBuilderName() string {
	if x != nil && x.BuilderName != nil {
		return *x.BuilderName
	}
	return ""
}

func (x *CoverageChangeRequest) GetTestSuiteName() []string {
	if x != nil {
		return x.TestSuiteName
	}
	return nil
}

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

	Status  *string `protobuf:"bytes,1,opt,name=status,proto3,oneof" json:"status,omitempty"`
	Message *string `protobuf:"bytes,2,opt,name=message,proto3,oneof" json:"message,omitempty"`
}

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

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

func (*CoverageChangeResponse) ProtoMessage() {}

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

func (x *CoverageChangeResponse) GetStatus() string {
	if x != nil && x.Status != nil {
		return *x.Status
	}
	return ""
}

func (x *CoverageChangeResponse) GetMessage() string {
	if x != nil && x.Message != nil {
		return *x.Message
	}
	return ""
}

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

	TestSuiteName *string  `protobuf:"bytes,1,opt,name=test_suite_name,json=testSuiteName,proto3,oneof" json:"test_suite_name,omitempty"`
	TestCaseName  []string `protobuf:"bytes,2,rep,name=test_case_name,json=testCaseName,proto3" json:"test_case_name,omitempty"`
}

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

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

func (*TestSuite) ProtoMessage() {}

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

func (x *TestSuite) GetTestSuiteName() string {
	if x != nil && x.TestSuiteName != nil {
		return *x.TestSuiteName
	}
	return ""
}

func (x *TestSuite) GetTestCaseName() []string {
	if x != nil {
		return x.TestCaseName
	}
	return nil
}

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

	// Name of the builder.
	BuilderName *string `protobuf:"bytes,1,opt,name=builder_name,json=builderName,proto3,oneof" json:"builder_name,omitempty"`
	// Architecture of the builder.
	Architecture *string `protobuf:"bytes,2,opt,name=architecture,proto3,oneof" json:"architecture,omitempty"`
	// OS of the builder.
	Os *string `protobuf:"bytes,3,opt,name=os,proto3,oneof" json:"os,omitempty"`
	// Test suites that are part of the builder.
	TestSuite []*TestSuite `protobuf:"bytes,4,rep,name=test_suite,json=testSuite,proto3" json:"test_suite,omitempty"`
}

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

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

func (*Builder) ProtoMessage() {}

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

func (x *Builder) GetBuilderName() string {
	if x != nil && x.BuilderName != nil {
		return *x.BuilderName
	}
	return ""
}

func (x *Builder) GetArchitecture() string {
	if x != nil && x.Architecture != nil {
		return *x.Architecture
	}
	return ""
}

func (x *Builder) GetOs() string {
	if x != nil && x.Os != nil {
		return *x.Os
	}
	return ""
}

func (x *Builder) GetTestSuite() []*TestSuite {
	if x != nil {
		return x.TestSuite
	}
	return nil
}

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

	// Name of the file.
	FileName *string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3,oneof" json:"file_name,omitempty"`
	// Name of the builder.
	BuilderName *string `protobuf:"bytes,2,opt,name=builder_name,json=builderName,proto3,oneof" json:"builder_name,omitempty"`
	// Name of test suite.
	TestSuiteName []string `protobuf:"bytes,3,rep,name=test_suite_name,json=testSuiteName,proto3" json:"test_suite_name,omitempty"`
}

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

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

func (*TestSuiteMap) ProtoMessage() {}

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

func (x *TestSuiteMap) GetFileName() string {
	if x != nil && x.FileName != nil {
		return *x.FileName
	}
	return ""
}

func (x *TestSuiteMap) GetBuilderName() string {
	if x != nil && x.BuilderName != nil {
		return *x.BuilderName
	}
	return ""
}

func (x *TestSuiteMap) GetTestSuiteName() []string {
	if x != nil {
		return x.TestSuiteName
	}
	return nil
}

var File_coverage_service_proto protoreflect.FileDescriptor

var file_coverage_service_proto_rawDesc = []byte{
	0x0a, 0x16, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69,
	0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61,
	0x67, 0x65, 0x2e, 0x76, 0x31, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67,
	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x76,
	0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a,
	0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x48, 0x00, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12,
	0x26, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72,
	0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09,
	0x52, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42,
	0x0c, 0x0a, 0x0a, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0f, 0x0a,
	0x0d, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x53,
	0x0a, 0x14, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6f, 0x76, 0x65,
	0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x73, 0x22, 0x7e, 0x0a, 0x13, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x4c,
	0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x09, 0x66, 0x69,
	0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52,
	0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d,
	0x65, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61,
	0x6d, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x6e,
	0x61, 0x6d, 0x65, 0x22, 0x5f, 0x0a, 0x14, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x4c,
	0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x73,
	0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73,
	0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x74,
	0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74,
	0x61, 0x74, 0x75, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67,
	0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20,
	0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x48, 0x00, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01,
	0x12, 0x26, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28,
	0x09, 0x52, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65,
	0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0f,
	0x0a, 0x0d, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22,
	0x6b, 0x0a, 0x16, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67,
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61,
	0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61,
	0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61,
	0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
	0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x72, 0x0a, 0x09,
	0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x0f, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x4e,
	0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63,
	0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c,
	0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10,
	0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
	0x22, 0xcf, 0x01, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0c,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d,
	0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63,
	0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x61, 0x72,
	0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a,
	0x02, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x02, 0x6f, 0x73, 0x88,
	0x01, 0x01, 0x12, 0x35, 0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65,
	0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67,
	0x65, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x52, 0x09,
	0x74, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x62, 0x75,
	0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x61,
	0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f,
	0x6f, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x0c, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65,
	0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61,
	0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72,
	0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a,
	0x0f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74,
	0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e,
	0x61, 0x6d, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f,
	0x6e, 0x61, 0x6d, 0x65, 0x32, 0xec, 0x02, 0x0a, 0x0f, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67,
	0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x50, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41,
	0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61,
	0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65,
	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x41, 0x6c, 0x6c, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65,
	0x74, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x76,
	0x65, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67,
	0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x63,
	0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x76, 0x65, 0x72,
	0x61, 0x67, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
	0x00, 0x12, 0x57, 0x0a, 0x0a, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x12,
	0x22, 0x2e, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f,
	0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76,
	0x31, 0x2e, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x44, 0x65,
	0x6c, 0x65, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x76, 0x65, 0x72,
	0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x43,
	0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63,
	0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x76, 0x65, 0x72,
	0x61, 0x67, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x22, 0x00, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x6f, 0x2e, 0x73, 0x6b, 0x69, 0x61, 0x2e, 0x6f,
	0x72, 0x67, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x76, 0x65,
	0x72, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_coverage_service_proto_rawDescOnce sync.Once
	file_coverage_service_proto_rawDescData = file_coverage_service_proto_rawDesc
)

func file_coverage_service_proto_rawDescGZIP() []byte {
	file_coverage_service_proto_rawDescOnce.Do(func() {
		file_coverage_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_coverage_service_proto_rawDescData)
	})
	return file_coverage_service_proto_rawDescData
}

var file_coverage_service_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
var file_coverage_service_proto_goTypes = []interface{}{
	(*CoverageRequest)(nil),        // 0: coverage.v1.CoverageRequest
	(*CoverageResponse)(nil),       // 1: coverage.v1.CoverageResponse
	(*CoverageAllResponses)(nil),   // 2: coverage.v1.CoverageAllResponses
	(*CoverageListRequest)(nil),    // 3: coverage.v1.CoverageListRequest
	(*CoverageListResponse)(nil),   // 4: coverage.v1.CoverageListResponse
	(*CoverageChangeRequest)(nil),  // 5: coverage.v1.CoverageChangeRequest
	(*CoverageChangeResponse)(nil), // 6: coverage.v1.CoverageChangeResponse
	(*TestSuite)(nil),              // 7: coverage.v1.TestSuite
	(*Builder)(nil),                // 8: coverage.v1.Builder
	(*TestSuiteMap)(nil),           // 9: coverage.v1.TestSuiteMap
}
var file_coverage_service_proto_depIdxs = []int32{
	1, // 0: coverage.v1.CoverageAllResponses.responses:type_name -> coverage.v1.CoverageResponse
	7, // 1: coverage.v1.Builder.test_suite:type_name -> coverage.v1.TestSuite
	0, // 2: coverage.v1.CoverageService.GetAllFiles:input_type -> coverage.v1.CoverageRequest
	3, // 3: coverage.v1.CoverageService.GetTestSuite:input_type -> coverage.v1.CoverageListRequest
	5, // 4: coverage.v1.CoverageService.InsertFile:input_type -> coverage.v1.CoverageChangeRequest
	5, // 5: coverage.v1.CoverageService.DeleteFile:input_type -> coverage.v1.CoverageChangeRequest
	2, // 6: coverage.v1.CoverageService.GetAllFiles:output_type -> coverage.v1.CoverageAllResponses
	4, // 7: coverage.v1.CoverageService.GetTestSuite:output_type -> coverage.v1.CoverageListResponse
	6, // 8: coverage.v1.CoverageService.InsertFile:output_type -> coverage.v1.CoverageChangeResponse
	6, // 9: coverage.v1.CoverageService.DeleteFile:output_type -> coverage.v1.CoverageChangeResponse
	6, // [6:10] is the sub-list for method output_type
	2, // [2:6] is the sub-list for method input_type
	2, // [2:2] is the sub-list for extension type_name
	2, // [2:2] is the sub-list for extension extendee
	0, // [0:2] is the sub-list for field type_name
}

func init() { file_coverage_service_proto_init() }
func file_coverage_service_proto_init() {
	if File_coverage_service_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_coverage_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CoverageRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_coverage_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CoverageResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_coverage_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CoverageAllResponses); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_coverage_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CoverageListRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_coverage_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CoverageListResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_coverage_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CoverageChangeRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_coverage_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CoverageChangeResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_coverage_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestSuite); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_coverage_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Builder); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_coverage_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestSuiteMap); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_coverage_service_proto_msgTypes[1].OneofWrappers = []interface{}{}
	file_coverage_service_proto_msgTypes[3].OneofWrappers = []interface{}{}
	file_coverage_service_proto_msgTypes[4].OneofWrappers = []interface{}{}
	file_coverage_service_proto_msgTypes[5].OneofWrappers = []interface{}{}
	file_coverage_service_proto_msgTypes[6].OneofWrappers = []interface{}{}
	file_coverage_service_proto_msgTypes[7].OneofWrappers = []interface{}{}
	file_coverage_service_proto_msgTypes[8].OneofWrappers = []interface{}{}
	file_coverage_service_proto_msgTypes[9].OneofWrappers = []interface{}{}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_coverage_service_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   10,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_coverage_service_proto_goTypes,
		DependencyIndexes: file_coverage_service_proto_depIdxs,
		MessageInfos:      file_coverage_service_proto_msgTypes,
	}.Build()
	File_coverage_service_proto = out.File
	file_coverage_service_proto_rawDesc = nil
	file_coverage_service_proto_goTypes = nil
	file_coverage_service_proto_depIdxs = nil
}
