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

package tests

import (
	fmt "fmt"

	proto "github.com/golang/protobuf/proto"

	math "math"

	timestamp "github.com/golang/protobuf/ptypes/timestamp"

	v1 "google.golang.org/genproto/googleapis/firestore/v1"
)

// 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.ProtoPackageIsVersion2 // please upgrade the proto package

type DocChange_Kind int32

const (
	DocChange_KIND_UNSPECIFIED DocChange_Kind = 0
	DocChange_ADDED            DocChange_Kind = 1
	DocChange_REMOVED          DocChange_Kind = 2
	DocChange_MODIFIED         DocChange_Kind = 3
)

var DocChange_Kind_name = map[int32]string{
	0: "KIND_UNSPECIFIED",
	1: "ADDED",
	2: "REMOVED",
	3: "MODIFIED",
}
var DocChange_Kind_value = map[string]int32{
	"KIND_UNSPECIFIED": 0,
	"ADDED":            1,
	"REMOVED":          2,
	"MODIFIED":         3,
}

func (x DocChange_Kind) String() string {
	return proto.EnumName(DocChange_Kind_name, int32(x))
}
func (DocChange_Kind) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{19, 0}
}

// A collection of tests.
type TestSuite struct {
	Tests                []*Test  `protobuf:"bytes,1,rep,name=tests,proto3" json:"tests,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TestSuite) Reset()         { *m = TestSuite{} }
func (m *TestSuite) String() string { return proto.CompactTextString(m) }
func (*TestSuite) ProtoMessage()    {}
func (*TestSuite) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{0}
}
func (m *TestSuite) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestSuite.Unmarshal(m, b)
}
func (m *TestSuite) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestSuite.Marshal(b, m, deterministic)
}
func (dst *TestSuite) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestSuite.Merge(dst, src)
}
func (m *TestSuite) XXX_Size() int {
	return xxx_messageInfo_TestSuite.Size(m)
}
func (m *TestSuite) XXX_DiscardUnknown() {
	xxx_messageInfo_TestSuite.DiscardUnknown(m)
}

var xxx_messageInfo_TestSuite proto.InternalMessageInfo

func (m *TestSuite) GetTests() []*Test {
	if m != nil {
		return m.Tests
	}
	return nil
}

// A Test describes a single client method call and its expected result.
type Test struct {
	Description string `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
	// Types that are valid to be assigned to Test:
	//	*Test_Get
	//	*Test_Create
	//	*Test_Set
	//	*Test_Update
	//	*Test_UpdatePaths
	//	*Test_Delete
	//	*Test_Query
	//	*Test_Listen
	Test                 isTest_Test `protobuf_oneof:"test"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *Test) Reset()         { *m = Test{} }
func (m *Test) String() string { return proto.CompactTextString(m) }
func (*Test) ProtoMessage()    {}
func (*Test) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{1}
}
func (m *Test) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Test.Unmarshal(m, b)
}
func (m *Test) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Test.Marshal(b, m, deterministic)
}
func (dst *Test) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Test.Merge(dst, src)
}
func (m *Test) XXX_Size() int {
	return xxx_messageInfo_Test.Size(m)
}
func (m *Test) XXX_DiscardUnknown() {
	xxx_messageInfo_Test.DiscardUnknown(m)
}

var xxx_messageInfo_Test proto.InternalMessageInfo

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

type isTest_Test interface {
	isTest_Test()
}

type Test_Get struct {
	Get *GetTest `protobuf:"bytes,2,opt,name=get,proto3,oneof"`
}

type Test_Create struct {
	Create *CreateTest `protobuf:"bytes,3,opt,name=create,proto3,oneof"`
}

type Test_Set struct {
	Set *SetTest `protobuf:"bytes,4,opt,name=set,proto3,oneof"`
}

type Test_Update struct {
	Update *UpdateTest `protobuf:"bytes,5,opt,name=update,proto3,oneof"`
}

type Test_UpdatePaths struct {
	UpdatePaths *UpdatePathsTest `protobuf:"bytes,6,opt,name=update_paths,json=updatePaths,proto3,oneof"`
}

type Test_Delete struct {
	Delete *DeleteTest `protobuf:"bytes,7,opt,name=delete,proto3,oneof"`
}

type Test_Query struct {
	Query *QueryTest `protobuf:"bytes,8,opt,name=query,proto3,oneof"`
}

type Test_Listen struct {
	Listen *ListenTest `protobuf:"bytes,9,opt,name=listen,proto3,oneof"`
}

func (*Test_Get) isTest_Test() {}

func (*Test_Create) isTest_Test() {}

func (*Test_Set) isTest_Test() {}

func (*Test_Update) isTest_Test() {}

func (*Test_UpdatePaths) isTest_Test() {}

func (*Test_Delete) isTest_Test() {}

func (*Test_Query) isTest_Test() {}

func (*Test_Listen) isTest_Test() {}

func (m *Test) GetTest() isTest_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *Test) GetGet() *GetTest {
	if x, ok := m.GetTest().(*Test_Get); ok {
		return x.Get
	}
	return nil
}

func (m *Test) GetCreate() *CreateTest {
	if x, ok := m.GetTest().(*Test_Create); ok {
		return x.Create
	}
	return nil
}

func (m *Test) GetSet() *SetTest {
	if x, ok := m.GetTest().(*Test_Set); ok {
		return x.Set
	}
	return nil
}

func (m *Test) GetUpdate() *UpdateTest {
	if x, ok := m.GetTest().(*Test_Update); ok {
		return x.Update
	}
	return nil
}

func (m *Test) GetUpdatePaths() *UpdatePathsTest {
	if x, ok := m.GetTest().(*Test_UpdatePaths); ok {
		return x.UpdatePaths
	}
	return nil
}

func (m *Test) GetDelete() *DeleteTest {
	if x, ok := m.GetTest().(*Test_Delete); ok {
		return x.Delete
	}
	return nil
}

func (m *Test) GetQuery() *QueryTest {
	if x, ok := m.GetTest().(*Test_Query); ok {
		return x.Query
	}
	return nil
}

func (m *Test) GetListen() *ListenTest {
	if x, ok := m.GetTest().(*Test_Listen); ok {
		return x.Listen
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*Test) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _Test_OneofMarshaler, _Test_OneofUnmarshaler, _Test_OneofSizer, []interface{}{
		(*Test_Get)(nil),
		(*Test_Create)(nil),
		(*Test_Set)(nil),
		(*Test_Update)(nil),
		(*Test_UpdatePaths)(nil),
		(*Test_Delete)(nil),
		(*Test_Query)(nil),
		(*Test_Listen)(nil),
	}
}

func _Test_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*Test)
	// test
	switch x := m.Test.(type) {
	case *Test_Get:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Get); err != nil {
			return err
		}
	case *Test_Create:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Create); err != nil {
			return err
		}
	case *Test_Set:
		b.EncodeVarint(4<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Set); err != nil {
			return err
		}
	case *Test_Update:
		b.EncodeVarint(5<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Update); err != nil {
			return err
		}
	case *Test_UpdatePaths:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.UpdatePaths); err != nil {
			return err
		}
	case *Test_Delete:
		b.EncodeVarint(7<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Delete); err != nil {
			return err
		}
	case *Test_Query:
		b.EncodeVarint(8<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Query); err != nil {
			return err
		}
	case *Test_Listen:
		b.EncodeVarint(9<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Listen); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("Test.Test has unexpected type %T", x)
	}
	return nil
}

func _Test_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*Test)
	switch tag {
	case 2: // test.get
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(GetTest)
		err := b.DecodeMessage(msg)
		m.Test = &Test_Get{msg}
		return true, err
	case 3: // test.create
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(CreateTest)
		err := b.DecodeMessage(msg)
		m.Test = &Test_Create{msg}
		return true, err
	case 4: // test.set
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(SetTest)
		err := b.DecodeMessage(msg)
		m.Test = &Test_Set{msg}
		return true, err
	case 5: // test.update
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(UpdateTest)
		err := b.DecodeMessage(msg)
		m.Test = &Test_Update{msg}
		return true, err
	case 6: // test.update_paths
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(UpdatePathsTest)
		err := b.DecodeMessage(msg)
		m.Test = &Test_UpdatePaths{msg}
		return true, err
	case 7: // test.delete
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(DeleteTest)
		err := b.DecodeMessage(msg)
		m.Test = &Test_Delete{msg}
		return true, err
	case 8: // test.query
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(QueryTest)
		err := b.DecodeMessage(msg)
		m.Test = &Test_Query{msg}
		return true, err
	case 9: // test.listen
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(ListenTest)
		err := b.DecodeMessage(msg)
		m.Test = &Test_Listen{msg}
		return true, err
	default:
		return false, nil
	}
}

func _Test_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*Test)
	// test
	switch x := m.Test.(type) {
	case *Test_Get:
		s := proto.Size(x.Get)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Test_Create:
		s := proto.Size(x.Create)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Test_Set:
		s := proto.Size(x.Set)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Test_Update:
		s := proto.Size(x.Update)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Test_UpdatePaths:
		s := proto.Size(x.UpdatePaths)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Test_Delete:
		s := proto.Size(x.Delete)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Test_Query:
		s := proto.Size(x.Query)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Test_Listen:
		s := proto.Size(x.Listen)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Call to the DocumentRef.Get method.
type GetTest struct {
	// The path of the doc, e.g. "projects/projectID/databases/(default)/documents/C/d"
	DocRefPath string `protobuf:"bytes,1,opt,name=doc_ref_path,json=docRefPath,proto3" json:"doc_ref_path,omitempty"`
	// The request that the call should send to the Firestore service.
	Request              *v1.GetDocumentRequest `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *GetTest) Reset()         { *m = GetTest{} }
func (m *GetTest) String() string { return proto.CompactTextString(m) }
func (*GetTest) ProtoMessage()    {}
func (*GetTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{2}
}
func (m *GetTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GetTest.Unmarshal(m, b)
}
func (m *GetTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GetTest.Marshal(b, m, deterministic)
}
func (dst *GetTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GetTest.Merge(dst, src)
}
func (m *GetTest) XXX_Size() int {
	return xxx_messageInfo_GetTest.Size(m)
}
func (m *GetTest) XXX_DiscardUnknown() {
	xxx_messageInfo_GetTest.DiscardUnknown(m)
}

var xxx_messageInfo_GetTest proto.InternalMessageInfo

func (m *GetTest) GetDocRefPath() string {
	if m != nil {
		return m.DocRefPath
	}
	return ""
}

func (m *GetTest) GetRequest() *v1.GetDocumentRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

// Call to DocumentRef.Create.
type CreateTest struct {
	// The path of the doc, e.g. "projects/projectID/databases/(default)/documents/C/d"
	DocRefPath string `protobuf:"bytes,1,opt,name=doc_ref_path,json=docRefPath,proto3" json:"doc_ref_path,omitempty"`
	// The data passed to Create, as JSON. The strings "Delete" and "ServerTimestamp"
	// denote the two special sentinel values. Values that could be interpreted as integers
	// (i.e. digit strings) should be treated as integers.
	JsonData string `protobuf:"bytes,2,opt,name=json_data,json=jsonData,proto3" json:"json_data,omitempty"`
	// The request that the call should generate.
	Request *v1.CommitRequest `protobuf:"bytes,3,opt,name=request,proto3" json:"request,omitempty"`
	// If true, the call should result in an error without generating a request.
	// If this is true, request should not be set.
	IsError              bool     `protobuf:"varint,4,opt,name=is_error,json=isError,proto3" json:"is_error,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateTest) Reset()         { *m = CreateTest{} }
func (m *CreateTest) String() string { return proto.CompactTextString(m) }
func (*CreateTest) ProtoMessage()    {}
func (*CreateTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{3}
}
func (m *CreateTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_CreateTest.Unmarshal(m, b)
}
func (m *CreateTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_CreateTest.Marshal(b, m, deterministic)
}
func (dst *CreateTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_CreateTest.Merge(dst, src)
}
func (m *CreateTest) XXX_Size() int {
	return xxx_messageInfo_CreateTest.Size(m)
}
func (m *CreateTest) XXX_DiscardUnknown() {
	xxx_messageInfo_CreateTest.DiscardUnknown(m)
}

var xxx_messageInfo_CreateTest proto.InternalMessageInfo

func (m *CreateTest) GetDocRefPath() string {
	if m != nil {
		return m.DocRefPath
	}
	return ""
}

func (m *CreateTest) GetJsonData() string {
	if m != nil {
		return m.JsonData
	}
	return ""
}

func (m *CreateTest) GetRequest() *v1.CommitRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *CreateTest) GetIsError() bool {
	if m != nil {
		return m.IsError
	}
	return false
}

// A call to DocumentRef.Set.
type SetTest struct {
	DocRefPath           string            `protobuf:"bytes,1,opt,name=doc_ref_path,json=docRefPath,proto3" json:"doc_ref_path,omitempty"`
	Option               *SetOption        `protobuf:"bytes,2,opt,name=option,proto3" json:"option,omitempty"`
	JsonData             string            `protobuf:"bytes,3,opt,name=json_data,json=jsonData,proto3" json:"json_data,omitempty"`
	Request              *v1.CommitRequest `protobuf:"bytes,4,opt,name=request,proto3" json:"request,omitempty"`
	IsError              bool              `protobuf:"varint,5,opt,name=is_error,json=isError,proto3" json:"is_error,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *SetTest) Reset()         { *m = SetTest{} }
func (m *SetTest) String() string { return proto.CompactTextString(m) }
func (*SetTest) ProtoMessage()    {}
func (*SetTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{4}
}
func (m *SetTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SetTest.Unmarshal(m, b)
}
func (m *SetTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SetTest.Marshal(b, m, deterministic)
}
func (dst *SetTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SetTest.Merge(dst, src)
}
func (m *SetTest) XXX_Size() int {
	return xxx_messageInfo_SetTest.Size(m)
}
func (m *SetTest) XXX_DiscardUnknown() {
	xxx_messageInfo_SetTest.DiscardUnknown(m)
}

var xxx_messageInfo_SetTest proto.InternalMessageInfo

func (m *SetTest) GetDocRefPath() string {
	if m != nil {
		return m.DocRefPath
	}
	return ""
}

func (m *SetTest) GetOption() *SetOption {
	if m != nil {
		return m.Option
	}
	return nil
}

func (m *SetTest) GetJsonData() string {
	if m != nil {
		return m.JsonData
	}
	return ""
}

func (m *SetTest) GetRequest() *v1.CommitRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *SetTest) GetIsError() bool {
	if m != nil {
		return m.IsError
	}
	return false
}

// A call to the form of DocumentRef.Update that represents the data as a map
// or dictionary.
type UpdateTest struct {
	DocRefPath           string            `protobuf:"bytes,1,opt,name=doc_ref_path,json=docRefPath,proto3" json:"doc_ref_path,omitempty"`
	Precondition         *v1.Precondition  `protobuf:"bytes,2,opt,name=precondition,proto3" json:"precondition,omitempty"`
	JsonData             string            `protobuf:"bytes,3,opt,name=json_data,json=jsonData,proto3" json:"json_data,omitempty"`
	Request              *v1.CommitRequest `protobuf:"bytes,4,opt,name=request,proto3" json:"request,omitempty"`
	IsError              bool              `protobuf:"varint,5,opt,name=is_error,json=isError,proto3" json:"is_error,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *UpdateTest) Reset()         { *m = UpdateTest{} }
func (m *UpdateTest) String() string { return proto.CompactTextString(m) }
func (*UpdateTest) ProtoMessage()    {}
func (*UpdateTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{5}
}
func (m *UpdateTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UpdateTest.Unmarshal(m, b)
}
func (m *UpdateTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UpdateTest.Marshal(b, m, deterministic)
}
func (dst *UpdateTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UpdateTest.Merge(dst, src)
}
func (m *UpdateTest) XXX_Size() int {
	return xxx_messageInfo_UpdateTest.Size(m)
}
func (m *UpdateTest) XXX_DiscardUnknown() {
	xxx_messageInfo_UpdateTest.DiscardUnknown(m)
}

var xxx_messageInfo_UpdateTest proto.InternalMessageInfo

func (m *UpdateTest) GetDocRefPath() string {
	if m != nil {
		return m.DocRefPath
	}
	return ""
}

func (m *UpdateTest) GetPrecondition() *v1.Precondition {
	if m != nil {
		return m.Precondition
	}
	return nil
}

func (m *UpdateTest) GetJsonData() string {
	if m != nil {
		return m.JsonData
	}
	return ""
}

func (m *UpdateTest) GetRequest() *v1.CommitRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *UpdateTest) GetIsError() bool {
	if m != nil {
		return m.IsError
	}
	return false
}

// A call to the form of DocumentRef.Update that represents the data as a list
// of field paths and their values.
type UpdatePathsTest struct {
	DocRefPath   string           `protobuf:"bytes,1,opt,name=doc_ref_path,json=docRefPath,proto3" json:"doc_ref_path,omitempty"`
	Precondition *v1.Precondition `protobuf:"bytes,2,opt,name=precondition,proto3" json:"precondition,omitempty"`
	// parallel sequences: field_paths[i] corresponds to json_values[i]
	FieldPaths           []*FieldPath      `protobuf:"bytes,3,rep,name=field_paths,json=fieldPaths,proto3" json:"field_paths,omitempty"`
	JsonValues           []string          `protobuf:"bytes,4,rep,name=json_values,json=jsonValues,proto3" json:"json_values,omitempty"`
	Request              *v1.CommitRequest `protobuf:"bytes,5,opt,name=request,proto3" json:"request,omitempty"`
	IsError              bool              `protobuf:"varint,6,opt,name=is_error,json=isError,proto3" json:"is_error,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *UpdatePathsTest) Reset()         { *m = UpdatePathsTest{} }
func (m *UpdatePathsTest) String() string { return proto.CompactTextString(m) }
func (*UpdatePathsTest) ProtoMessage()    {}
func (*UpdatePathsTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{6}
}
func (m *UpdatePathsTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UpdatePathsTest.Unmarshal(m, b)
}
func (m *UpdatePathsTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UpdatePathsTest.Marshal(b, m, deterministic)
}
func (dst *UpdatePathsTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UpdatePathsTest.Merge(dst, src)
}
func (m *UpdatePathsTest) XXX_Size() int {
	return xxx_messageInfo_UpdatePathsTest.Size(m)
}
func (m *UpdatePathsTest) XXX_DiscardUnknown() {
	xxx_messageInfo_UpdatePathsTest.DiscardUnknown(m)
}

var xxx_messageInfo_UpdatePathsTest proto.InternalMessageInfo

func (m *UpdatePathsTest) GetDocRefPath() string {
	if m != nil {
		return m.DocRefPath
	}
	return ""
}

func (m *UpdatePathsTest) GetPrecondition() *v1.Precondition {
	if m != nil {
		return m.Precondition
	}
	return nil
}

func (m *UpdatePathsTest) GetFieldPaths() []*FieldPath {
	if m != nil {
		return m.FieldPaths
	}
	return nil
}

func (m *UpdatePathsTest) GetJsonValues() []string {
	if m != nil {
		return m.JsonValues
	}
	return nil
}

func (m *UpdatePathsTest) GetRequest() *v1.CommitRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *UpdatePathsTest) GetIsError() bool {
	if m != nil {
		return m.IsError
	}
	return false
}

// A call to DocmentRef.Delete
type DeleteTest struct {
	DocRefPath           string            `protobuf:"bytes,1,opt,name=doc_ref_path,json=docRefPath,proto3" json:"doc_ref_path,omitempty"`
	Precondition         *v1.Precondition  `protobuf:"bytes,2,opt,name=precondition,proto3" json:"precondition,omitempty"`
	Request              *v1.CommitRequest `protobuf:"bytes,3,opt,name=request,proto3" json:"request,omitempty"`
	IsError              bool              `protobuf:"varint,4,opt,name=is_error,json=isError,proto3" json:"is_error,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *DeleteTest) Reset()         { *m = DeleteTest{} }
func (m *DeleteTest) String() string { return proto.CompactTextString(m) }
func (*DeleteTest) ProtoMessage()    {}
func (*DeleteTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{7}
}
func (m *DeleteTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeleteTest.Unmarshal(m, b)
}
func (m *DeleteTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeleteTest.Marshal(b, m, deterministic)
}
func (dst *DeleteTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeleteTest.Merge(dst, src)
}
func (m *DeleteTest) XXX_Size() int {
	return xxx_messageInfo_DeleteTest.Size(m)
}
func (m *DeleteTest) XXX_DiscardUnknown() {
	xxx_messageInfo_DeleteTest.DiscardUnknown(m)
}

var xxx_messageInfo_DeleteTest proto.InternalMessageInfo

func (m *DeleteTest) GetDocRefPath() string {
	if m != nil {
		return m.DocRefPath
	}
	return ""
}

func (m *DeleteTest) GetPrecondition() *v1.Precondition {
	if m != nil {
		return m.Precondition
	}
	return nil
}

func (m *DeleteTest) GetRequest() *v1.CommitRequest {
	if m != nil {
		return m.Request
	}
	return nil
}

func (m *DeleteTest) GetIsError() bool {
	if m != nil {
		return m.IsError
	}
	return false
}

// An option to the DocumentRef.Set call.
type SetOption struct {
	All                  bool         `protobuf:"varint,1,opt,name=all,proto3" json:"all,omitempty"`
	Fields               []*FieldPath `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *SetOption) Reset()         { *m = SetOption{} }
func (m *SetOption) String() string { return proto.CompactTextString(m) }
func (*SetOption) ProtoMessage()    {}
func (*SetOption) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{8}
}
func (m *SetOption) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SetOption.Unmarshal(m, b)
}
func (m *SetOption) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SetOption.Marshal(b, m, deterministic)
}
func (dst *SetOption) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SetOption.Merge(dst, src)
}
func (m *SetOption) XXX_Size() int {
	return xxx_messageInfo_SetOption.Size(m)
}
func (m *SetOption) XXX_DiscardUnknown() {
	xxx_messageInfo_SetOption.DiscardUnknown(m)
}

var xxx_messageInfo_SetOption proto.InternalMessageInfo

func (m *SetOption) GetAll() bool {
	if m != nil {
		return m.All
	}
	return false
}

func (m *SetOption) GetFields() []*FieldPath {
	if m != nil {
		return m.Fields
	}
	return nil
}

type QueryTest struct {
	CollPath             string              `protobuf:"bytes,1,opt,name=coll_path,json=collPath,proto3" json:"coll_path,omitempty"`
	Clauses              []*Clause           `protobuf:"bytes,2,rep,name=clauses,proto3" json:"clauses,omitempty"`
	Query                *v1.StructuredQuery `protobuf:"bytes,3,opt,name=query,proto3" json:"query,omitempty"`
	IsError              bool                `protobuf:"varint,4,opt,name=is_error,json=isError,proto3" json:"is_error,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *QueryTest) Reset()         { *m = QueryTest{} }
func (m *QueryTest) String() string { return proto.CompactTextString(m) }
func (*QueryTest) ProtoMessage()    {}
func (*QueryTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{9}
}
func (m *QueryTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_QueryTest.Unmarshal(m, b)
}
func (m *QueryTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_QueryTest.Marshal(b, m, deterministic)
}
func (dst *QueryTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_QueryTest.Merge(dst, src)
}
func (m *QueryTest) XXX_Size() int {
	return xxx_messageInfo_QueryTest.Size(m)
}
func (m *QueryTest) XXX_DiscardUnknown() {
	xxx_messageInfo_QueryTest.DiscardUnknown(m)
}

var xxx_messageInfo_QueryTest proto.InternalMessageInfo

func (m *QueryTest) GetCollPath() string {
	if m != nil {
		return m.CollPath
	}
	return ""
}

func (m *QueryTest) GetClauses() []*Clause {
	if m != nil {
		return m.Clauses
	}
	return nil
}

func (m *QueryTest) GetQuery() *v1.StructuredQuery {
	if m != nil {
		return m.Query
	}
	return nil
}

func (m *QueryTest) GetIsError() bool {
	if m != nil {
		return m.IsError
	}
	return false
}

type Clause struct {
	// Types that are valid to be assigned to Clause:
	//	*Clause_Select
	//	*Clause_Where
	//	*Clause_OrderBy
	//	*Clause_Offset
	//	*Clause_Limit
	//	*Clause_StartAt
	//	*Clause_StartAfter
	//	*Clause_EndAt
	//	*Clause_EndBefore
	Clause               isClause_Clause `protobuf_oneof:"clause"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *Clause) Reset()         { *m = Clause{} }
func (m *Clause) String() string { return proto.CompactTextString(m) }
func (*Clause) ProtoMessage()    {}
func (*Clause) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{10}
}
func (m *Clause) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Clause.Unmarshal(m, b)
}
func (m *Clause) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Clause.Marshal(b, m, deterministic)
}
func (dst *Clause) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Clause.Merge(dst, src)
}
func (m *Clause) XXX_Size() int {
	return xxx_messageInfo_Clause.Size(m)
}
func (m *Clause) XXX_DiscardUnknown() {
	xxx_messageInfo_Clause.DiscardUnknown(m)
}

var xxx_messageInfo_Clause proto.InternalMessageInfo

type isClause_Clause interface {
	isClause_Clause()
}

type Clause_Select struct {
	Select *Select `protobuf:"bytes,1,opt,name=select,proto3,oneof"`
}

type Clause_Where struct {
	Where *Where `protobuf:"bytes,2,opt,name=where,proto3,oneof"`
}

type Clause_OrderBy struct {
	OrderBy *OrderBy `protobuf:"bytes,3,opt,name=order_by,json=orderBy,proto3,oneof"`
}

type Clause_Offset struct {
	Offset int32 `protobuf:"varint,4,opt,name=offset,proto3,oneof"`
}

type Clause_Limit struct {
	Limit int32 `protobuf:"varint,5,opt,name=limit,proto3,oneof"`
}

type Clause_StartAt struct {
	StartAt *Cursor `protobuf:"bytes,6,opt,name=start_at,json=startAt,proto3,oneof"`
}

type Clause_StartAfter struct {
	StartAfter *Cursor `protobuf:"bytes,7,opt,name=start_after,json=startAfter,proto3,oneof"`
}

type Clause_EndAt struct {
	EndAt *Cursor `protobuf:"bytes,8,opt,name=end_at,json=endAt,proto3,oneof"`
}

type Clause_EndBefore struct {
	EndBefore *Cursor `protobuf:"bytes,9,opt,name=end_before,json=endBefore,proto3,oneof"`
}

func (*Clause_Select) isClause_Clause() {}

func (*Clause_Where) isClause_Clause() {}

func (*Clause_OrderBy) isClause_Clause() {}

func (*Clause_Offset) isClause_Clause() {}

func (*Clause_Limit) isClause_Clause() {}

func (*Clause_StartAt) isClause_Clause() {}

func (*Clause_StartAfter) isClause_Clause() {}

func (*Clause_EndAt) isClause_Clause() {}

func (*Clause_EndBefore) isClause_Clause() {}

func (m *Clause) GetClause() isClause_Clause {
	if m != nil {
		return m.Clause
	}
	return nil
}

func (m *Clause) GetSelect() *Select {
	if x, ok := m.GetClause().(*Clause_Select); ok {
		return x.Select
	}
	return nil
}

func (m *Clause) GetWhere() *Where {
	if x, ok := m.GetClause().(*Clause_Where); ok {
		return x.Where
	}
	return nil
}

func (m *Clause) GetOrderBy() *OrderBy {
	if x, ok := m.GetClause().(*Clause_OrderBy); ok {
		return x.OrderBy
	}
	return nil
}

func (m *Clause) GetOffset() int32 {
	if x, ok := m.GetClause().(*Clause_Offset); ok {
		return x.Offset
	}
	return 0
}

func (m *Clause) GetLimit() int32 {
	if x, ok := m.GetClause().(*Clause_Limit); ok {
		return x.Limit
	}
	return 0
}

func (m *Clause) GetStartAt() *Cursor {
	if x, ok := m.GetClause().(*Clause_StartAt); ok {
		return x.StartAt
	}
	return nil
}

func (m *Clause) GetStartAfter() *Cursor {
	if x, ok := m.GetClause().(*Clause_StartAfter); ok {
		return x.StartAfter
	}
	return nil
}

func (m *Clause) GetEndAt() *Cursor {
	if x, ok := m.GetClause().(*Clause_EndAt); ok {
		return x.EndAt
	}
	return nil
}

func (m *Clause) GetEndBefore() *Cursor {
	if x, ok := m.GetClause().(*Clause_EndBefore); ok {
		return x.EndBefore
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*Clause) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _Clause_OneofMarshaler, _Clause_OneofUnmarshaler, _Clause_OneofSizer, []interface{}{
		(*Clause_Select)(nil),
		(*Clause_Where)(nil),
		(*Clause_OrderBy)(nil),
		(*Clause_Offset)(nil),
		(*Clause_Limit)(nil),
		(*Clause_StartAt)(nil),
		(*Clause_StartAfter)(nil),
		(*Clause_EndAt)(nil),
		(*Clause_EndBefore)(nil),
	}
}

func _Clause_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*Clause)
	// clause
	switch x := m.Clause.(type) {
	case *Clause_Select:
		b.EncodeVarint(1<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Select); err != nil {
			return err
		}
	case *Clause_Where:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.Where); err != nil {
			return err
		}
	case *Clause_OrderBy:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.OrderBy); err != nil {
			return err
		}
	case *Clause_Offset:
		b.EncodeVarint(4<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Offset))
	case *Clause_Limit:
		b.EncodeVarint(5<<3 | proto.WireVarint)
		b.EncodeVarint(uint64(x.Limit))
	case *Clause_StartAt:
		b.EncodeVarint(6<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.StartAt); err != nil {
			return err
		}
	case *Clause_StartAfter:
		b.EncodeVarint(7<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.StartAfter); err != nil {
			return err
		}
	case *Clause_EndAt:
		b.EncodeVarint(8<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.EndAt); err != nil {
			return err
		}
	case *Clause_EndBefore:
		b.EncodeVarint(9<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.EndBefore); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("Clause.Clause has unexpected type %T", x)
	}
	return nil
}

func _Clause_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*Clause)
	switch tag {
	case 1: // clause.select
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Select)
		err := b.DecodeMessage(msg)
		m.Clause = &Clause_Select{msg}
		return true, err
	case 2: // clause.where
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Where)
		err := b.DecodeMessage(msg)
		m.Clause = &Clause_Where{msg}
		return true, err
	case 3: // clause.order_by
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(OrderBy)
		err := b.DecodeMessage(msg)
		m.Clause = &Clause_OrderBy{msg}
		return true, err
	case 4: // clause.offset
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Clause = &Clause_Offset{int32(x)}
		return true, err
	case 5: // clause.limit
		if wire != proto.WireVarint {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeVarint()
		m.Clause = &Clause_Limit{int32(x)}
		return true, err
	case 6: // clause.start_at
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Cursor)
		err := b.DecodeMessage(msg)
		m.Clause = &Clause_StartAt{msg}
		return true, err
	case 7: // clause.start_after
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Cursor)
		err := b.DecodeMessage(msg)
		m.Clause = &Clause_StartAfter{msg}
		return true, err
	case 8: // clause.end_at
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Cursor)
		err := b.DecodeMessage(msg)
		m.Clause = &Clause_EndAt{msg}
		return true, err
	case 9: // clause.end_before
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(Cursor)
		err := b.DecodeMessage(msg)
		m.Clause = &Clause_EndBefore{msg}
		return true, err
	default:
		return false, nil
	}
}

func _Clause_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*Clause)
	// clause
	switch x := m.Clause.(type) {
	case *Clause_Select:
		s := proto.Size(x.Select)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Clause_Where:
		s := proto.Size(x.Where)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Clause_OrderBy:
		s := proto.Size(x.OrderBy)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Clause_Offset:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.Offset))
	case *Clause_Limit:
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(x.Limit))
	case *Clause_StartAt:
		s := proto.Size(x.StartAt)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Clause_StartAfter:
		s := proto.Size(x.StartAfter)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Clause_EndAt:
		s := proto.Size(x.EndAt)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case *Clause_EndBefore:
		s := proto.Size(x.EndBefore)
		n += 1 // tag and wire
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

type Select struct {
	Fields               []*FieldPath `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *Select) Reset()         { *m = Select{} }
func (m *Select) String() string { return proto.CompactTextString(m) }
func (*Select) ProtoMessage()    {}
func (*Select) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{11}
}
func (m *Select) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Select.Unmarshal(m, b)
}
func (m *Select) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Select.Marshal(b, m, deterministic)
}
func (dst *Select) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Select.Merge(dst, src)
}
func (m *Select) XXX_Size() int {
	return xxx_messageInfo_Select.Size(m)
}
func (m *Select) XXX_DiscardUnknown() {
	xxx_messageInfo_Select.DiscardUnknown(m)
}

var xxx_messageInfo_Select proto.InternalMessageInfo

func (m *Select) GetFields() []*FieldPath {
	if m != nil {
		return m.Fields
	}
	return nil
}

type Where struct {
	Path                 *FieldPath `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	Op                   string     `protobuf:"bytes,2,opt,name=op,proto3" json:"op,omitempty"`
	JsonValue            string     `protobuf:"bytes,3,opt,name=json_value,json=jsonValue,proto3" json:"json_value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Where) Reset()         { *m = Where{} }
func (m *Where) String() string { return proto.CompactTextString(m) }
func (*Where) ProtoMessage()    {}
func (*Where) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{12}
}
func (m *Where) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Where.Unmarshal(m, b)
}
func (m *Where) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Where.Marshal(b, m, deterministic)
}
func (dst *Where) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Where.Merge(dst, src)
}
func (m *Where) XXX_Size() int {
	return xxx_messageInfo_Where.Size(m)
}
func (m *Where) XXX_DiscardUnknown() {
	xxx_messageInfo_Where.DiscardUnknown(m)
}

var xxx_messageInfo_Where proto.InternalMessageInfo

func (m *Where) GetPath() *FieldPath {
	if m != nil {
		return m.Path
	}
	return nil
}

func (m *Where) GetOp() string {
	if m != nil {
		return m.Op
	}
	return ""
}

func (m *Where) GetJsonValue() string {
	if m != nil {
		return m.JsonValue
	}
	return ""
}

type OrderBy struct {
	Path                 *FieldPath `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	Direction            string     `protobuf:"bytes,2,opt,name=direction,proto3" json:"direction,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *OrderBy) Reset()         { *m = OrderBy{} }
func (m *OrderBy) String() string { return proto.CompactTextString(m) }
func (*OrderBy) ProtoMessage()    {}
func (*OrderBy) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{13}
}
func (m *OrderBy) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OrderBy.Unmarshal(m, b)
}
func (m *OrderBy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OrderBy.Marshal(b, m, deterministic)
}
func (dst *OrderBy) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OrderBy.Merge(dst, src)
}
func (m *OrderBy) XXX_Size() int {
	return xxx_messageInfo_OrderBy.Size(m)
}
func (m *OrderBy) XXX_DiscardUnknown() {
	xxx_messageInfo_OrderBy.DiscardUnknown(m)
}

var xxx_messageInfo_OrderBy proto.InternalMessageInfo

func (m *OrderBy) GetPath() *FieldPath {
	if m != nil {
		return m.Path
	}
	return nil
}

func (m *OrderBy) GetDirection() string {
	if m != nil {
		return m.Direction
	}
	return ""
}

type Cursor struct {
	// one of:
	DocSnapshot          *DocSnapshot `protobuf:"bytes,1,opt,name=doc_snapshot,json=docSnapshot,proto3" json:"doc_snapshot,omitempty"`
	JsonValues           []string     `protobuf:"bytes,2,rep,name=json_values,json=jsonValues,proto3" json:"json_values,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *Cursor) Reset()         { *m = Cursor{} }
func (m *Cursor) String() string { return proto.CompactTextString(m) }
func (*Cursor) ProtoMessage()    {}
func (*Cursor) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{14}
}
func (m *Cursor) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Cursor.Unmarshal(m, b)
}
func (m *Cursor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Cursor.Marshal(b, m, deterministic)
}
func (dst *Cursor) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Cursor.Merge(dst, src)
}
func (m *Cursor) XXX_Size() int {
	return xxx_messageInfo_Cursor.Size(m)
}
func (m *Cursor) XXX_DiscardUnknown() {
	xxx_messageInfo_Cursor.DiscardUnknown(m)
}

var xxx_messageInfo_Cursor proto.InternalMessageInfo

func (m *Cursor) GetDocSnapshot() *DocSnapshot {
	if m != nil {
		return m.DocSnapshot
	}
	return nil
}

func (m *Cursor) GetJsonValues() []string {
	if m != nil {
		return m.JsonValues
	}
	return nil
}

type DocSnapshot struct {
	Path                 string   `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	JsonData             string   `protobuf:"bytes,2,opt,name=json_data,json=jsonData,proto3" json:"json_data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DocSnapshot) Reset()         { *m = DocSnapshot{} }
func (m *DocSnapshot) String() string { return proto.CompactTextString(m) }
func (*DocSnapshot) ProtoMessage()    {}
func (*DocSnapshot) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{15}
}
func (m *DocSnapshot) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DocSnapshot.Unmarshal(m, b)
}
func (m *DocSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DocSnapshot.Marshal(b, m, deterministic)
}
func (dst *DocSnapshot) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DocSnapshot.Merge(dst, src)
}
func (m *DocSnapshot) XXX_Size() int {
	return xxx_messageInfo_DocSnapshot.Size(m)
}
func (m *DocSnapshot) XXX_DiscardUnknown() {
	xxx_messageInfo_DocSnapshot.DiscardUnknown(m)
}

var xxx_messageInfo_DocSnapshot proto.InternalMessageInfo

func (m *DocSnapshot) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *DocSnapshot) GetJsonData() string {
	if m != nil {
		return m.JsonData
	}
	return ""
}

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

func (m *FieldPath) Reset()         { *m = FieldPath{} }
func (m *FieldPath) String() string { return proto.CompactTextString(m) }
func (*FieldPath) ProtoMessage()    {}
func (*FieldPath) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{16}
}
func (m *FieldPath) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FieldPath.Unmarshal(m, b)
}
func (m *FieldPath) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FieldPath.Marshal(b, m, deterministic)
}
func (dst *FieldPath) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FieldPath.Merge(dst, src)
}
func (m *FieldPath) XXX_Size() int {
	return xxx_messageInfo_FieldPath.Size(m)
}
func (m *FieldPath) XXX_DiscardUnknown() {
	xxx_messageInfo_FieldPath.DiscardUnknown(m)
}

var xxx_messageInfo_FieldPath proto.InternalMessageInfo

func (m *FieldPath) GetField() []string {
	if m != nil {
		return m.Field
	}
	return nil
}

// A test of the Listen streaming RPC (a.k.a. FireStore watch).
// If the sequence of responses is provided to the implementation,
// it should produce the sequence of snapshots.
// If is_error is true, an error should occur after the snapshots.
//
// The tests assume that the query is
// Collection("projects/projectID/databases/(default)/documents/C").OrderBy("a", Ascending)
//
// The watch target ID used in these tests is 1. Test interpreters
// should either change their client's ID for testing,
// or change the ID in the tests before running them.
type ListenTest struct {
	Responses            []*v1.ListenResponse `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	Snapshots            []*Snapshot          `protobuf:"bytes,2,rep,name=snapshots,proto3" json:"snapshots,omitempty"`
	IsError              bool                 `protobuf:"varint,3,opt,name=is_error,json=isError,proto3" json:"is_error,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *ListenTest) Reset()         { *m = ListenTest{} }
func (m *ListenTest) String() string { return proto.CompactTextString(m) }
func (*ListenTest) ProtoMessage()    {}
func (*ListenTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{17}
}
func (m *ListenTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ListenTest.Unmarshal(m, b)
}
func (m *ListenTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ListenTest.Marshal(b, m, deterministic)
}
func (dst *ListenTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ListenTest.Merge(dst, src)
}
func (m *ListenTest) XXX_Size() int {
	return xxx_messageInfo_ListenTest.Size(m)
}
func (m *ListenTest) XXX_DiscardUnknown() {
	xxx_messageInfo_ListenTest.DiscardUnknown(m)
}

var xxx_messageInfo_ListenTest proto.InternalMessageInfo

func (m *ListenTest) GetResponses() []*v1.ListenResponse {
	if m != nil {
		return m.Responses
	}
	return nil
}

func (m *ListenTest) GetSnapshots() []*Snapshot {
	if m != nil {
		return m.Snapshots
	}
	return nil
}

func (m *ListenTest) GetIsError() bool {
	if m != nil {
		return m.IsError
	}
	return false
}

type Snapshot struct {
	Docs                 []*v1.Document       `protobuf:"bytes,1,rep,name=docs,proto3" json:"docs,omitempty"`
	Changes              []*DocChange         `protobuf:"bytes,2,rep,name=changes,proto3" json:"changes,omitempty"`
	ReadTime             *timestamp.Timestamp `protobuf:"bytes,3,opt,name=read_time,json=readTime,proto3" json:"read_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *Snapshot) Reset()         { *m = Snapshot{} }
func (m *Snapshot) String() string { return proto.CompactTextString(m) }
func (*Snapshot) ProtoMessage()    {}
func (*Snapshot) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{18}
}
func (m *Snapshot) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Snapshot.Unmarshal(m, b)
}
func (m *Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Snapshot.Marshal(b, m, deterministic)
}
func (dst *Snapshot) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Snapshot.Merge(dst, src)
}
func (m *Snapshot) XXX_Size() int {
	return xxx_messageInfo_Snapshot.Size(m)
}
func (m *Snapshot) XXX_DiscardUnknown() {
	xxx_messageInfo_Snapshot.DiscardUnknown(m)
}

var xxx_messageInfo_Snapshot proto.InternalMessageInfo

func (m *Snapshot) GetDocs() []*v1.Document {
	if m != nil {
		return m.Docs
	}
	return nil
}

func (m *Snapshot) GetChanges() []*DocChange {
	if m != nil {
		return m.Changes
	}
	return nil
}

func (m *Snapshot) GetReadTime() *timestamp.Timestamp {
	if m != nil {
		return m.ReadTime
	}
	return nil
}

type DocChange struct {
	Kind                 DocChange_Kind `protobuf:"varint,1,opt,name=kind,proto3,enum=tests.DocChange_Kind" json:"kind,omitempty"`
	Doc                  *v1.Document   `protobuf:"bytes,2,opt,name=doc,proto3" json:"doc,omitempty"`
	OldIndex             int32          `protobuf:"varint,3,opt,name=old_index,json=oldIndex,proto3" json:"old_index,omitempty"`
	NewIndex             int32          `protobuf:"varint,4,opt,name=new_index,json=newIndex,proto3" json:"new_index,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *DocChange) Reset()         { *m = DocChange{} }
func (m *DocChange) String() string { return proto.CompactTextString(m) }
func (*DocChange) ProtoMessage()    {}
func (*DocChange) Descriptor() ([]byte, []int) {
	return fileDescriptor_test_3f755a975e4c199e, []int{19}
}
func (m *DocChange) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DocChange.Unmarshal(m, b)
}
func (m *DocChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DocChange.Marshal(b, m, deterministic)
}
func (dst *DocChange) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DocChange.Merge(dst, src)
}
func (m *DocChange) XXX_Size() int {
	return xxx_messageInfo_DocChange.Size(m)
}
func (m *DocChange) XXX_DiscardUnknown() {
	xxx_messageInfo_DocChange.DiscardUnknown(m)
}

var xxx_messageInfo_DocChange proto.InternalMessageInfo

func (m *DocChange) GetKind() DocChange_Kind {
	if m != nil {
		return m.Kind
	}
	return DocChange_KIND_UNSPECIFIED
}

func (m *DocChange) GetDoc() *v1.Document {
	if m != nil {
		return m.Doc
	}
	return nil
}

func (m *DocChange) GetOldIndex() int32 {
	if m != nil {
		return m.OldIndex
	}
	return 0
}

func (m *DocChange) GetNewIndex() int32 {
	if m != nil {
		return m.NewIndex
	}
	return 0
}

func init() {
	proto.RegisterType((*TestSuite)(nil), "tests.TestSuite")
	proto.RegisterType((*Test)(nil), "tests.Test")
	proto.RegisterType((*GetTest)(nil), "tests.GetTest")
	proto.RegisterType((*CreateTest)(nil), "tests.CreateTest")
	proto.RegisterType((*SetTest)(nil), "tests.SetTest")
	proto.RegisterType((*UpdateTest)(nil), "tests.UpdateTest")
	proto.RegisterType((*UpdatePathsTest)(nil), "tests.UpdatePathsTest")
	proto.RegisterType((*DeleteTest)(nil), "tests.DeleteTest")
	proto.RegisterType((*SetOption)(nil), "tests.SetOption")
	proto.RegisterType((*QueryTest)(nil), "tests.QueryTest")
	proto.RegisterType((*Clause)(nil), "tests.Clause")
	proto.RegisterType((*Select)(nil), "tests.Select")
	proto.RegisterType((*Where)(nil), "tests.Where")
	proto.RegisterType((*OrderBy)(nil), "tests.OrderBy")
	proto.RegisterType((*Cursor)(nil), "tests.Cursor")
	proto.RegisterType((*DocSnapshot)(nil), "tests.DocSnapshot")
	proto.RegisterType((*FieldPath)(nil), "tests.FieldPath")
	proto.RegisterType((*ListenTest)(nil), "tests.ListenTest")
	proto.RegisterType((*Snapshot)(nil), "tests.Snapshot")
	proto.RegisterType((*DocChange)(nil), "tests.DocChange")
	proto.RegisterEnum("tests.DocChange_Kind", DocChange_Kind_name, DocChange_Kind_value)
}

func init() { proto.RegisterFile("test.proto", fileDescriptor_test_3f755a975e4c199e) }

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