// Code generated by protoc-gen-go. DO NOT EDIT.
// source: traceservice.proto

package traceservice

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

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

type Empty struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Empty proto.InternalMessageInfo

// CommitID identifies one commit, or trybot try.
type CommitID struct {
	// The id of a commit, either a git hash, or a Reitveld patch id.
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// The source of the commit, either a git branch name, or a Reitveld issue id.
	Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"`
	// The timestamp of the commit or trybot patch.
	Timestamp            int64    `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CommitID proto.InternalMessageInfo

func (m *CommitID) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *CommitID) GetSource() string {
	if m != nil {
		return m.Source
	}
	return ""
}

func (m *CommitID) GetTimestamp() int64 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

// Params are the key-value pairs for a single trace.
//
// All of the key-value parameters should be present, the ones used to
// construct the traceid, along with optional parameters.
type Params struct {
	Params               map[string]string `protobuf:"bytes,1,rep,name=params,proto3" json:"params,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Params proto.InternalMessageInfo

func (m *Params) GetParams() map[string]string {
	if m != nil {
		return m.Params
	}
	return nil
}

type MissingParamsRequest struct {
	Traceids             []string `protobuf:"bytes,1,rep,name=traceids,proto3" json:"traceids,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MissingParamsRequest proto.InternalMessageInfo

func (m *MissingParamsRequest) GetTraceids() []string {
	if m != nil {
		return m.Traceids
	}
	return nil
}

type MissingParamsResponse struct {
	Traceids             []string `protobuf:"bytes,1,rep,name=traceids,proto3" json:"traceids,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MissingParamsResponse proto.InternalMessageInfo

func (m *MissingParamsResponse) GetTraceids() []string {
	if m != nil {
		return m.Traceids
	}
	return nil
}

type ParamsPair struct {
	Key                  string            `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Params               map[string]string `protobuf:"bytes,2,rep,name=params,proto3" json:"params,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_ParamsPair proto.InternalMessageInfo

func (m *ParamsPair) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

func (m *ParamsPair) GetParams() map[string]string {
	if m != nil {
		return m.Params
	}
	return nil
}

type AddParamsRequest struct {
	Params               []*ParamsPair `protobuf:"bytes,4,rep,name=params,proto3" json:"params,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_AddParamsRequest proto.InternalMessageInfo

func (m *AddParamsRequest) GetParams() []*ParamsPair {
	if m != nil {
		return m.Params
	}
	return nil
}

// StoredEntry is used to serialize the Params to be stored in the BoltBD.
type StoredEntry struct {
	Params               *Params  `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_StoredEntry proto.InternalMessageInfo

func (m *StoredEntry) GetParams() *Params {
	if m != nil {
		return m.Params
	}
	return nil
}

type ValuePair struct {
	Key                  string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Value                []byte   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ValuePair) Reset()         { *m = ValuePair{} }
func (m *ValuePair) String() string { return proto.CompactTextString(m) }
func (*ValuePair) ProtoMessage()    {}
func (*ValuePair) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{8}
}

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

var xxx_messageInfo_ValuePair proto.InternalMessageInfo

func (m *ValuePair) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

func (m *ValuePair) GetValue() []byte {
	if m != nil {
		return m.Value
	}
	return nil
}

type AddRequest struct {
	// The id of the commit/trybot we are adding data about.
	Commitid             *CommitID    `protobuf:"bytes,1,opt,name=commitid,proto3" json:"commitid,omitempty"`
	Values               []*ValuePair `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *AddRequest) Reset()         { *m = AddRequest{} }
func (m *AddRequest) String() string { return proto.CompactTextString(m) }
func (*AddRequest) ProtoMessage()    {}
func (*AddRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{9}
}

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

var xxx_messageInfo_AddRequest proto.InternalMessageInfo

func (m *AddRequest) GetCommitid() *CommitID {
	if m != nil {
		return m.Commitid
	}
	return nil
}

func (m *AddRequest) GetValues() []*ValuePair {
	if m != nil {
		return m.Values
	}
	return nil
}

type ListRequest struct {
	// begin is the unix timestamp to start searching from.
	Begin int64 `protobuf:"varint,1,opt,name=begin,proto3" json:"begin,omitempty"`
	// end is the unix timestamp to search to (inclusive).
	End                  int64    `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListRequest) Reset()         { *m = ListRequest{} }
func (m *ListRequest) String() string { return proto.CompactTextString(m) }
func (*ListRequest) ProtoMessage()    {}
func (*ListRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{10}
}

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

var xxx_messageInfo_ListRequest proto.InternalMessageInfo

func (m *ListRequest) GetBegin() int64 {
	if m != nil {
		return m.Begin
	}
	return 0
}

func (m *ListRequest) GetEnd() int64 {
	if m != nil {
		return m.End
	}
	return 0
}

type ListResponse struct {
	// A list of CommitIDs that fall between the given timestamps in
	// ListRequest.
	Commitids            []*CommitID `protobuf:"bytes,3,rep,name=commitids,proto3" json:"commitids,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *ListResponse) Reset()         { *m = ListResponse{} }
func (m *ListResponse) String() string { return proto.CompactTextString(m) }
func (*ListResponse) ProtoMessage()    {}
func (*ListResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{11}
}

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

var xxx_messageInfo_ListResponse proto.InternalMessageInfo

func (m *ListResponse) GetCommitids() []*CommitID {
	if m != nil {
		return m.Commitids
	}
	return nil
}

type GetValuesRequest struct {
	Commitid             *CommitID `protobuf:"bytes,1,opt,name=commitid,proto3" json:"commitid,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *GetValuesRequest) Reset()         { *m = GetValuesRequest{} }
func (m *GetValuesRequest) String() string { return proto.CompactTextString(m) }
func (*GetValuesRequest) ProtoMessage()    {}
func (*GetValuesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{12}
}

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

var xxx_messageInfo_GetValuesRequest proto.InternalMessageInfo

func (m *GetValuesRequest) GetCommitid() *CommitID {
	if m != nil {
		return m.Commitid
	}
	return nil
}

type GetValuesResponse struct {
	Values               []*ValuePair `protobuf:"bytes,4,rep,name=values,proto3" json:"values,omitempty"`
	Md5                  string       `protobuf:"bytes,5,opt,name=md5,proto3" json:"md5,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *GetValuesResponse) Reset()         { *m = GetValuesResponse{} }
func (m *GetValuesResponse) String() string { return proto.CompactTextString(m) }
func (*GetValuesResponse) ProtoMessage()    {}
func (*GetValuesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{13}
}

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

var xxx_messageInfo_GetValuesResponse proto.InternalMessageInfo

func (m *GetValuesResponse) GetValues() []*ValuePair {
	if m != nil {
		return m.Values
	}
	return nil
}

func (m *GetValuesResponse) GetMd5() string {
	if m != nil {
		return m.Md5
	}
	return ""
}

type GetParamsRequest struct {
	// A list of traceids.
	Traceids             []string `protobuf:"bytes,1,rep,name=traceids,proto3" json:"traceids,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetParamsRequest) Reset()         { *m = GetParamsRequest{} }
func (m *GetParamsRequest) String() string { return proto.CompactTextString(m) }
func (*GetParamsRequest) ProtoMessage()    {}
func (*GetParamsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{14}
}

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

var xxx_messageInfo_GetParamsRequest proto.InternalMessageInfo

func (m *GetParamsRequest) GetTraceids() []string {
	if m != nil {
		return m.Traceids
	}
	return nil
}

type GetParamsResponse struct {
	Params               []*ParamsPair `protobuf:"bytes,4,rep,name=params,proto3" json:"params,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *GetParamsResponse) Reset()         { *m = GetParamsResponse{} }
func (m *GetParamsResponse) String() string { return proto.CompactTextString(m) }
func (*GetParamsResponse) ProtoMessage()    {}
func (*GetParamsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{15}
}

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

var xxx_messageInfo_GetParamsResponse proto.InternalMessageInfo

func (m *GetParamsResponse) GetParams() []*ParamsPair {
	if m != nil {
		return m.Params
	}
	return nil
}

type GetValuesRawResponse struct {
	// Raw byte slice that can be decoded with NewCommitInfo.
	Value                []byte   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	Md5                  string   `protobuf:"bytes,2,opt,name=md5,proto3" json:"md5,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetValuesRawResponse) Reset()         { *m = GetValuesRawResponse{} }
func (m *GetValuesRawResponse) String() string { return proto.CompactTextString(m) }
func (*GetValuesRawResponse) ProtoMessage()    {}
func (*GetValuesRawResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{16}
}

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

var xxx_messageInfo_GetValuesRawResponse proto.InternalMessageInfo

func (m *GetValuesRawResponse) GetValue() []byte {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *GetValuesRawResponse) GetMd5() string {
	if m != nil {
		return m.Md5
	}
	return ""
}

type GetTraceIDsRequest struct {
	Id                   []uint64 `protobuf:"varint,1,rep,packed,name=id,proto3" json:"id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetTraceIDsRequest) Reset()         { *m = GetTraceIDsRequest{} }
func (m *GetTraceIDsRequest) String() string { return proto.CompactTextString(m) }
func (*GetTraceIDsRequest) ProtoMessage()    {}
func (*GetTraceIDsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{17}
}

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

var xxx_messageInfo_GetTraceIDsRequest proto.InternalMessageInfo

func (m *GetTraceIDsRequest) GetId() []uint64 {
	if m != nil {
		return m.Id
	}
	return nil
}

type TraceIDPair struct {
	Id64                 uint64   `protobuf:"varint,1,opt,name=id64,proto3" json:"id64,omitempty"`
	Id                   string   `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TraceIDPair) Reset()         { *m = TraceIDPair{} }
func (m *TraceIDPair) String() string { return proto.CompactTextString(m) }
func (*TraceIDPair) ProtoMessage()    {}
func (*TraceIDPair) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{18}
}

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

var xxx_messageInfo_TraceIDPair proto.InternalMessageInfo

func (m *TraceIDPair) GetId64() uint64 {
	if m != nil {
		return m.Id64
	}
	return 0
}

func (m *TraceIDPair) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

type GetTraceIDsResponse struct {
	Ids                  []*TraceIDPair `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *GetTraceIDsResponse) Reset()         { *m = GetTraceIDsResponse{} }
func (m *GetTraceIDsResponse) String() string { return proto.CompactTextString(m) }
func (*GetTraceIDsResponse) ProtoMessage()    {}
func (*GetTraceIDsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{19}
}

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

var xxx_messageInfo_GetTraceIDsResponse proto.InternalMessageInfo

func (m *GetTraceIDsResponse) GetIds() []*TraceIDPair {
	if m != nil {
		return m.Ids
	}
	return nil
}

type CommitMD5 struct {
	Commitid             *CommitID `protobuf:"bytes,1,opt,name=commitid,proto3" json:"commitid,omitempty"`
	Md5                  string    `protobuf:"bytes,2,opt,name=md5,proto3" json:"md5,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *CommitMD5) Reset()         { *m = CommitMD5{} }
func (m *CommitMD5) String() string { return proto.CompactTextString(m) }
func (*CommitMD5) ProtoMessage()    {}
func (*CommitMD5) Descriptor() ([]byte, []int) {
	return fileDescriptor_6a33e1f1de7a389e, []int{20}
}

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

var xxx_messageInfo_CommitMD5 proto.InternalMessageInfo

func (m *CommitMD5) GetCommitid() *CommitID {
	if m != nil {
		return m.Commitid
	}
	return nil
}

func (m *CommitMD5) GetMd5() string {
	if m != nil {
		return m.Md5
	}
	return ""
}

func init() {
	proto.RegisterType((*Empty)(nil), "traceservice.Empty")
	proto.RegisterType((*CommitID)(nil), "traceservice.CommitID")
	proto.RegisterType((*Params)(nil), "traceservice.Params")
	proto.RegisterMapType((map[string]string)(nil), "traceservice.Params.ParamsEntry")
	proto.RegisterType((*MissingParamsRequest)(nil), "traceservice.MissingParamsRequest")
	proto.RegisterType((*MissingParamsResponse)(nil), "traceservice.MissingParamsResponse")
	proto.RegisterType((*ParamsPair)(nil), "traceservice.ParamsPair")
	proto.RegisterMapType((map[string]string)(nil), "traceservice.ParamsPair.ParamsEntry")
	proto.RegisterType((*AddParamsRequest)(nil), "traceservice.AddParamsRequest")
	proto.RegisterType((*StoredEntry)(nil), "traceservice.StoredEntry")
	proto.RegisterType((*ValuePair)(nil), "traceservice.ValuePair")
	proto.RegisterType((*AddRequest)(nil), "traceservice.AddRequest")
	proto.RegisterType((*ListRequest)(nil), "traceservice.ListRequest")
	proto.RegisterType((*ListResponse)(nil), "traceservice.ListResponse")
	proto.RegisterType((*GetValuesRequest)(nil), "traceservice.GetValuesRequest")
	proto.RegisterType((*GetValuesResponse)(nil), "traceservice.GetValuesResponse")
	proto.RegisterType((*GetParamsRequest)(nil), "traceservice.GetParamsRequest")
	proto.RegisterType((*GetParamsResponse)(nil), "traceservice.GetParamsResponse")
	proto.RegisterType((*GetValuesRawResponse)(nil), "traceservice.GetValuesRawResponse")
	proto.RegisterType((*GetTraceIDsRequest)(nil), "traceservice.GetTraceIDsRequest")
	proto.RegisterType((*TraceIDPair)(nil), "traceservice.TraceIDPair")
	proto.RegisterType((*GetTraceIDsResponse)(nil), "traceservice.GetTraceIDsResponse")
	proto.RegisterType((*CommitMD5)(nil), "traceservice.CommitMD5")
}

func init() { proto.RegisterFile("traceservice.proto", fileDescriptor_6a33e1f1de7a389e) }

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

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

// 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.SupportPackageIsVersion4

// TraceServiceClient is the client API for TraceService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type TraceServiceClient interface {
	// Returns a list of traceids that don't have Params stored in the datastore.
	MissingParams(ctx context.Context, in *MissingParamsRequest, opts ...grpc.CallOption) (*MissingParamsResponse, error)
	// Adds Params for a set of traceids.
	AddParams(ctx context.Context, in *AddParamsRequest, opts ...grpc.CallOption) (*Empty, error)
	// Adds data for a set of traces for a particular commitid.
	Add(ctx context.Context, in *AddRequest, opts ...grpc.CallOption) (*Empty, error)
	// List returns all the CommitIDs that exist in the given time range.
	List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error)
	// GetValues returns all the trace values stored for the given CommitID.
	GetValues(ctx context.Context, in *GetValuesRequest, opts ...grpc.CallOption) (*GetValuesResponse, error)
	// GetParams returns the Params for all of the given traces.
	GetParams(ctx context.Context, in *GetParamsRequest, opts ...grpc.CallOption) (*GetParamsResponse, error)
	// GetValuesRaw returns all the trace values stored for the given CommitID in
	// the raw format stored in BoltDB. The decoding can be done by calling
	// NewCommitInfo() on the returned byte slice.
	GetValuesRaw(ctx context.Context, in *GetValuesRequest, opts ...grpc.CallOption) (*GetValuesRawResponse, error)
	// GetTraceIDs returns the traceids for the given trace64ids. These are used
	// in decoding the bytes returned from GetValuesRaw.
	GetTraceIDs(ctx context.Context, in *GetTraceIDsRequest, opts ...grpc.CallOption) (*GetTraceIDsResponse, error)
	// Ping should always succeed. Used to test if the service is up and
	// running.
	Ping(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
}

type traceServiceClient struct {
	cc *grpc.ClientConn
}

func NewTraceServiceClient(cc *grpc.ClientConn) TraceServiceClient {
	return &traceServiceClient{cc}
}

func (c *traceServiceClient) MissingParams(ctx context.Context, in *MissingParamsRequest, opts ...grpc.CallOption) (*MissingParamsResponse, error) {
	out := new(MissingParamsResponse)
	err := c.cc.Invoke(ctx, "/traceservice.TraceService/MissingParams", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *traceServiceClient) AddParams(ctx context.Context, in *AddParamsRequest, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/traceservice.TraceService/AddParams", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *traceServiceClient) Add(ctx context.Context, in *AddRequest, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/traceservice.TraceService/Add", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *traceServiceClient) List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) {
	out := new(ListResponse)
	err := c.cc.Invoke(ctx, "/traceservice.TraceService/List", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *traceServiceClient) GetValues(ctx context.Context, in *GetValuesRequest, opts ...grpc.CallOption) (*GetValuesResponse, error) {
	out := new(GetValuesResponse)
	err := c.cc.Invoke(ctx, "/traceservice.TraceService/GetValues", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *traceServiceClient) GetParams(ctx context.Context, in *GetParamsRequest, opts ...grpc.CallOption) (*GetParamsResponse, error) {
	out := new(GetParamsResponse)
	err := c.cc.Invoke(ctx, "/traceservice.TraceService/GetParams", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *traceServiceClient) GetValuesRaw(ctx context.Context, in *GetValuesRequest, opts ...grpc.CallOption) (*GetValuesRawResponse, error) {
	out := new(GetValuesRawResponse)
	err := c.cc.Invoke(ctx, "/traceservice.TraceService/GetValuesRaw", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *traceServiceClient) GetTraceIDs(ctx context.Context, in *GetTraceIDsRequest, opts ...grpc.CallOption) (*GetTraceIDsResponse, error) {
	out := new(GetTraceIDsResponse)
	err := c.cc.Invoke(ctx, "/traceservice.TraceService/GetTraceIDs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *traceServiceClient) Ping(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/traceservice.TraceService/Ping", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// TraceServiceServer is the server API for TraceService service.
type TraceServiceServer interface {
	// Returns a list of traceids that don't have Params stored in the datastore.
	MissingParams(context.Context, *MissingParamsRequest) (*MissingParamsResponse, error)
	// Adds Params for a set of traceids.
	AddParams(context.Context, *AddParamsRequest) (*Empty, error)
	// Adds data for a set of traces for a particular commitid.
	Add(context.Context, *AddRequest) (*Empty, error)
	// List returns all the CommitIDs that exist in the given time range.
	List(context.Context, *ListRequest) (*ListResponse, error)
	// GetValues returns all the trace values stored for the given CommitID.
	GetValues(context.Context, *GetValuesRequest) (*GetValuesResponse, error)
	// GetParams returns the Params for all of the given traces.
	GetParams(context.Context, *GetParamsRequest) (*GetParamsResponse, error)
	// GetValuesRaw returns all the trace values stored for the given CommitID in
	// the raw format stored in BoltDB. The decoding can be done by calling
	// NewCommitInfo() on the returned byte slice.
	GetValuesRaw(context.Context, *GetValuesRequest) (*GetValuesRawResponse, error)
	// GetTraceIDs returns the traceids for the given trace64ids. These are used
	// in decoding the bytes returned from GetValuesRaw.
	GetTraceIDs(context.Context, *GetTraceIDsRequest) (*GetTraceIDsResponse, error)
	// Ping should always succeed. Used to test if the service is up and
	// running.
	Ping(context.Context, *Empty) (*Empty, error)
}

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

func (*UnimplementedTraceServiceServer) MissingParams(ctx context.Context, req *MissingParamsRequest) (*MissingParamsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method MissingParams not implemented")
}
func (*UnimplementedTraceServiceServer) AddParams(ctx context.Context, req *AddParamsRequest) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method AddParams not implemented")
}
func (*UnimplementedTraceServiceServer) Add(ctx context.Context, req *AddRequest) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Add not implemented")
}
func (*UnimplementedTraceServiceServer) List(ctx context.Context, req *ListRequest) (*ListResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method List not implemented")
}
func (*UnimplementedTraceServiceServer) GetValues(ctx context.Context, req *GetValuesRequest) (*GetValuesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetValues not implemented")
}
func (*UnimplementedTraceServiceServer) GetParams(ctx context.Context, req *GetParamsRequest) (*GetParamsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetParams not implemented")
}
func (*UnimplementedTraceServiceServer) GetValuesRaw(ctx context.Context, req *GetValuesRequest) (*GetValuesRawResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetValuesRaw not implemented")
}
func (*UnimplementedTraceServiceServer) GetTraceIDs(ctx context.Context, req *GetTraceIDsRequest) (*GetTraceIDsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetTraceIDs not implemented")
}
func (*UnimplementedTraceServiceServer) Ping(ctx context.Context, req *Empty) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented")
}

func RegisterTraceServiceServer(s *grpc.Server, srv TraceServiceServer) {
	s.RegisterService(&_TraceService_serviceDesc, srv)
}

func _TraceService_MissingParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(MissingParamsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TraceServiceServer).MissingParams(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/traceservice.TraceService/MissingParams",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TraceServiceServer).MissingParams(ctx, req.(*MissingParamsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TraceService_AddParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AddParamsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TraceServiceServer).AddParams(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/traceservice.TraceService/AddParams",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TraceServiceServer).AddParams(ctx, req.(*AddParamsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TraceService_Add_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AddRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TraceServiceServer).Add(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/traceservice.TraceService/Add",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TraceServiceServer).Add(ctx, req.(*AddRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TraceService_List_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TraceServiceServer).List(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/traceservice.TraceService/List",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TraceServiceServer).List(ctx, req.(*ListRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TraceService_GetValues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetValuesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TraceServiceServer).GetValues(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/traceservice.TraceService/GetValues",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TraceServiceServer).GetValues(ctx, req.(*GetValuesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TraceService_GetParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetParamsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TraceServiceServer).GetParams(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/traceservice.TraceService/GetParams",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TraceServiceServer).GetParams(ctx, req.(*GetParamsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TraceService_GetValuesRaw_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetValuesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TraceServiceServer).GetValuesRaw(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/traceservice.TraceService/GetValuesRaw",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TraceServiceServer).GetValuesRaw(ctx, req.(*GetValuesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TraceService_GetTraceIDs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetTraceIDsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TraceServiceServer).GetTraceIDs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/traceservice.TraceService/GetTraceIDs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TraceServiceServer).GetTraceIDs(ctx, req.(*GetTraceIDsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TraceService_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TraceServiceServer).Ping(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/traceservice.TraceService/Ping",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TraceServiceServer).Ping(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

var _TraceService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "traceservice.TraceService",
	HandlerType: (*TraceServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "MissingParams",
			Handler:    _TraceService_MissingParams_Handler,
		},
		{
			MethodName: "AddParams",
			Handler:    _TraceService_AddParams_Handler,
		},
		{
			MethodName: "Add",
			Handler:    _TraceService_Add_Handler,
		},
		{
			MethodName: "List",
			Handler:    _TraceService_List_Handler,
		},
		{
			MethodName: "GetValues",
			Handler:    _TraceService_GetValues_Handler,
		},
		{
			MethodName: "GetParams",
			Handler:    _TraceService_GetParams_Handler,
		},
		{
			MethodName: "GetValuesRaw",
			Handler:    _TraceService_GetValuesRaw_Handler,
		},
		{
			MethodName: "GetTraceIDs",
			Handler:    _TraceService_GetTraceIDs_Handler,
		},
		{
			MethodName: "Ping",
			Handler:    _TraceService_Ping_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "traceservice.proto",
}
