// Copyright 2020 The Chromium OS 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.25.0-devel
// 	protoc        v3.6.1
// source: test_platform/phosphorus/fetchcrashes.proto

package phosphorus

import (
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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

// Values should be consistent with https://aip.dev/216
type FetchCrashesResponse_State int32

const (
	// Should not be used.
	FetchCrashesResponse_STATE_UNSPECIFIED FetchCrashesResponse_State = 0
	// FetchCrashes succeeded.
	FetchCrashesResponse_SUCCEEDED FetchCrashesResponse_State = 1
	// FetchCrashes failed.
	FetchCrashesResponse_FAILED FetchCrashesResponse_State = 2
	// FetchCrashes hit the requested timeout.
	FetchCrashesResponse_TIMED_OUT FetchCrashesResponse_State = 3
	// FetchCrashes was aborted externally.
	FetchCrashesResponse_ABORTED FetchCrashesResponse_State = 4
)

// Enum value maps for FetchCrashesResponse_State.
var (
	FetchCrashesResponse_State_name = map[int32]string{
		0: "STATE_UNSPECIFIED",
		1: "SUCCEEDED",
		2: "FAILED",
		3: "TIMED_OUT",
		4: "ABORTED",
	}
	FetchCrashesResponse_State_value = map[string]int32{
		"STATE_UNSPECIFIED": 0,
		"SUCCEEDED":         1,
		"FAILED":            2,
		"TIMED_OUT":         3,
		"ABORTED":           4,
	}
)

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

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

func (FetchCrashesResponse_State) Descriptor() protoreflect.EnumDescriptor {
	return file_test_platform_phosphorus_fetchcrashes_proto_enumTypes[0].Descriptor()
}

func (FetchCrashesResponse_State) Type() protoreflect.EnumType {
	return &file_test_platform_phosphorus_fetchcrashes_proto_enumTypes[0]
}

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

// Deprecated: Use FetchCrashesResponse_State.Descriptor instead.
func (FetchCrashesResponse_State) EnumDescriptor() ([]byte, []int) {
	return file_test_platform_phosphorus_fetchcrashes_proto_rawDescGZIP(), []int{2, 0}
}

// FetchCrashesRequest defines the input of `phosphorus fetchcrashes`.
type FetchCrashesRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Config      *Config `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	DutHostname string  `protobuf:"bytes,2,opt,name=dut_hostname,json=dutHostname,proto3" json:"dut_hostname,omitempty"`
	// Hard deadline for execution.
	//
	// FetchCrashes execution should abort beyond this deadline.
	Deadline *timestamp.Timestamp `protobuf:"bytes,3,opt,name=deadline,proto3" json:"deadline,omitempty"`
	// If set, upload crashes.
	// Currently, the command is a no-op if this is false, though eventually it
	// may save crashes to output directories.
	UploadCrashes bool `protobuf:"varint,4,opt,name=upload_crashes,json=uploadCrashes,proto3" json:"upload_crashes,omitempty"`
	// If set, upload crashes to http://crash-staging instead of http://crash.
	// Useful for testing.
	//
	// Deprecated: Do not use.
	UseStaging bool `protobuf:"varint,5,opt,name=use_staging,json=useStaging,proto3" json:"use_staging,omitempty"`
}

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

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

func (*FetchCrashesRequest) ProtoMessage() {}

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

func (x *FetchCrashesRequest) GetConfig() *Config {
	if x != nil {
		return x.Config
	}
	return nil
}

func (x *FetchCrashesRequest) GetDutHostname() string {
	if x != nil {
		return x.DutHostname
	}
	return ""
}

func (x *FetchCrashesRequest) GetDeadline() *timestamp.Timestamp {
	if x != nil {
		return x.Deadline
	}
	return nil
}

func (x *FetchCrashesRequest) GetUploadCrashes() bool {
	if x != nil {
		return x.UploadCrashes
	}
	return false
}

// Deprecated: Do not use.
func (x *FetchCrashesRequest) GetUseStaging() bool {
	if x != nil {
		return x.UseStaging
	}
	return false
}

// CrashSummary defines details of crashes that will be easily accessible to
// callers always.
type CrashSummary struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of the crashing executable.
	ExecName string `protobuf:"bytes,1,opt,name=exec_name,json=execName,proto3" json:"exec_name,omitempty"`
	// If uploads were on, URL at which this crash can be found.
	UploadUrl string `protobuf:"bytes,2,opt,name=upload_url,json=uploadUrl,proto3" json:"upload_url,omitempty"`
	// Name of the integration test that was running when this crash happened, if
	// any.
	InProgressIntegrationTest string `protobuf:"bytes,3,opt,name=in_progress_integration_test,json=inProgressIntegrationTest,proto3" json:"in_progress_integration_test,omitempty"`
	// Crash signature (may not be populated for all crash types).
	Sig string `protobuf:"bytes,4,opt,name=sig,proto3" json:"sig,omitempty"`
	// Base part of crash filename in out dir. All files associated with the crash
	// will start with this string.
	// (e.g. chrome.20201202.130102.12345.4567)
	FilenameBase string `protobuf:"bytes,5,opt,name=filename_base,json=filenameBase,proto3" json:"filename_base,omitempty"`
}

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

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

func (*CrashSummary) ProtoMessage() {}

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

func (x *CrashSummary) GetExecName() string {
	if x != nil {
		return x.ExecName
	}
	return ""
}

func (x *CrashSummary) GetUploadUrl() string {
	if x != nil {
		return x.UploadUrl
	}
	return ""
}

func (x *CrashSummary) GetInProgressIntegrationTest() string {
	if x != nil {
		return x.InProgressIntegrationTest
	}
	return ""
}

func (x *CrashSummary) GetSig() string {
	if x != nil {
		return x.Sig
	}
	return ""
}

func (x *CrashSummary) GetFilenameBase() string {
	if x != nil {
		return x.FilenameBase
	}
	return ""
}

// FetchCrashesResponse defines the output of `phosphorus fetch-crashes`.
type FetchCrashesResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// `phosphorus fetch-crashes` exits with exit code 0 unless there is an
	// infrastructure failure. When the exit code is 0, `state` indicates the
	// best known state of the prejob execution (see comments on State enum).
	State FetchCrashesResponse_State `protobuf:"varint,1,opt,name=state,proto3,enum=test_platform.phosphorus.FetchCrashesResponse_State" json:"state,omitempty"`
	// Details on the uploaded crashes.
	Crashes []*CrashSummary `protobuf:"bytes,2,rep,name=crashes,proto3" json:"crashes,omitempty"`
	// Names of crashes that are present only in RTD output
	CrashesRtdOnly []string `protobuf:"bytes,4,rep,name=crashes_rtd_only,json=crashesRtdOnly,proto3" json:"crashes_rtd_only,omitempty"`
	// Names of crashes that are present only in FetchCrashes output
	CrashesTlsOnly []string `protobuf:"bytes,5,rep,name=crashes_tls_only,json=crashesTlsOnly,proto3" json:"crashes_tls_only,omitempty"`
}

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

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

func (*FetchCrashesResponse) ProtoMessage() {}

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

func (x *FetchCrashesResponse) GetState() FetchCrashesResponse_State {
	if x != nil {
		return x.State
	}
	return FetchCrashesResponse_STATE_UNSPECIFIED
}

func (x *FetchCrashesResponse) GetCrashes() []*CrashSummary {
	if x != nil {
		return x.Crashes
	}
	return nil
}

func (x *FetchCrashesResponse) GetCrashesRtdOnly() []string {
	if x != nil {
		return x.CrashesRtdOnly
	}
	return nil
}

func (x *FetchCrashesResponse) GetCrashesTlsOnly() []string {
	if x != nil {
		return x.CrashesTlsOnly
	}
	return nil
}

var File_test_platform_phosphorus_fetchcrashes_proto protoreflect.FileDescriptor

var file_test_platform_phosphorus_fetchcrashes_proto_rawDesc = []byte{
	0x0a, 0x2b, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2f, 0x66, 0x65, 0x74, 0x63, 0x68,
	0x63, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f,
	0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
	0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72,
	0x75, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0xf6, 0x01, 0x0a, 0x13, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72,
	0x75, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x75, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x75, 0x74, 0x48, 0x6f, 0x73, 0x74,
	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
	0x6d, 0x70, 0x52, 0x08, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x25, 0x0a, 0x0e,
	0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x04,
	0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x72, 0x61, 0x73,
	0x68, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x69,
	0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x75, 0x73,
	0x65, 0x53, 0x74, 0x61, 0x67, 0x69, 0x6e, 0x67, 0x22, 0xc2, 0x01, 0x0a, 0x0c, 0x43, 0x72, 0x61,
	0x73, 0x68, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x65,
	0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x78,
	0x65, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64,
	0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75, 0x70, 0x6c, 0x6f,
	0x61, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x3f, 0x0a, 0x1c, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x67,
	0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x69, 0x6e, 0x50,
	0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x69, 0x67, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65,
	0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0c, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x61, 0x73, 0x65, 0x22, 0xcf, 0x02,
	0x0a, 0x14, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73,
	0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61,
	0x74, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x63, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x02, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2e, 0x43,
	0x72, 0x61, 0x73, 0x68, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x07, 0x63, 0x72, 0x61,
	0x73, 0x68, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x5f,
	0x72, 0x74, 0x64, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e,
	0x63, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x52, 0x74, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x28,
	0x0a, 0x10, 0x63, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x6f, 0x6e,
	0x6c, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x72, 0x61, 0x73, 0x68, 0x65,
	0x73, 0x54, 0x6c, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x22, 0x55, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74,
	0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43,
	0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45,
	0x44, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54,
	0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x04, 0x42,
	0x44, 0x5a, 0x42, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f,
	0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e,
	0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x68, 0x6f, 0x73, 0x70,
	0x68, 0x6f, 0x72, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_phosphorus_fetchcrashes_proto_rawDescOnce sync.Once
	file_test_platform_phosphorus_fetchcrashes_proto_rawDescData = file_test_platform_phosphorus_fetchcrashes_proto_rawDesc
)

func file_test_platform_phosphorus_fetchcrashes_proto_rawDescGZIP() []byte {
	file_test_platform_phosphorus_fetchcrashes_proto_rawDescOnce.Do(func() {
		file_test_platform_phosphorus_fetchcrashes_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_phosphorus_fetchcrashes_proto_rawDescData)
	})
	return file_test_platform_phosphorus_fetchcrashes_proto_rawDescData
}

var file_test_platform_phosphorus_fetchcrashes_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_test_platform_phosphorus_fetchcrashes_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_test_platform_phosphorus_fetchcrashes_proto_goTypes = []interface{}{
	(FetchCrashesResponse_State)(0), // 0: test_platform.phosphorus.FetchCrashesResponse.State
	(*FetchCrashesRequest)(nil),     // 1: test_platform.phosphorus.FetchCrashesRequest
	(*CrashSummary)(nil),            // 2: test_platform.phosphorus.CrashSummary
	(*FetchCrashesResponse)(nil),    // 3: test_platform.phosphorus.FetchCrashesResponse
	(*Config)(nil),                  // 4: test_platform.phosphorus.Config
	(*timestamp.Timestamp)(nil),     // 5: google.protobuf.Timestamp
}
var file_test_platform_phosphorus_fetchcrashes_proto_depIdxs = []int32{
	4, // 0: test_platform.phosphorus.FetchCrashesRequest.config:type_name -> test_platform.phosphorus.Config
	5, // 1: test_platform.phosphorus.FetchCrashesRequest.deadline:type_name -> google.protobuf.Timestamp
	0, // 2: test_platform.phosphorus.FetchCrashesResponse.state:type_name -> test_platform.phosphorus.FetchCrashesResponse.State
	2, // 3: test_platform.phosphorus.FetchCrashesResponse.crashes:type_name -> test_platform.phosphorus.CrashSummary
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_test_platform_phosphorus_fetchcrashes_proto_init() }
func file_test_platform_phosphorus_fetchcrashes_proto_init() {
	if File_test_platform_phosphorus_fetchcrashes_proto != nil {
		return
	}
	file_test_platform_phosphorus_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_phosphorus_fetchcrashes_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FetchCrashesRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_fetchcrashes_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CrashSummary); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_phosphorus_fetchcrashes_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FetchCrashesResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_phosphorus_fetchcrashes_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_phosphorus_fetchcrashes_proto_goTypes,
		DependencyIndexes: file_test_platform_phosphorus_fetchcrashes_proto_depIdxs,
		EnumInfos:         file_test_platform_phosphorus_fetchcrashes_proto_enumTypes,
		MessageInfos:      file_test_platform_phosphorus_fetchcrashes_proto_msgTypes,
	}.Build()
	File_test_platform_phosphorus_fetchcrashes_proto = out.File
	file_test_platform_phosphorus_fetchcrashes_proto_rawDesc = nil
	file_test_platform_phosphorus_fetchcrashes_proto_goTypes = nil
	file_test_platform_phosphorus_fetchcrashes_proto_depIdxs = nil
}
