// Code generated by protoc-gen-go. DO NOT EDIT.
// source: go.chromium.org/luci/starlark/starlarkproto/testprotos/test.proto

package testprotos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	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 Enum int32

const (
	Enum_ENUM_DEFAULT Enum = 0
	Enum_ENUM_VAL_1   Enum = 1
)

var Enum_name = map[int32]string{
	0: "ENUM_DEFAULT",
	1: "ENUM_VAL_1",
}

var Enum_value = map[string]int32{
	"ENUM_DEFAULT": 0,
	"ENUM_VAL_1":   1,
}

func (x Enum) String() string {
	return proto.EnumName(Enum_name, int32(x))
}

func (Enum) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_15b36de02fb5cc42, []int{0}
}

type Complex_InnerEnum int32

const (
	Complex_UNKNOWN    Complex_InnerEnum = 0
	Complex_ENUM_VAL_1 Complex_InnerEnum = 1
)

var Complex_InnerEnum_name = map[int32]string{
	0: "UNKNOWN",
	1: "ENUM_VAL_1",
}

var Complex_InnerEnum_value = map[string]int32{
	"UNKNOWN":    0,
	"ENUM_VAL_1": 1,
}

func (x Complex_InnerEnum) String() string {
	return proto.EnumName(Complex_InnerEnum_name, int32(x))
}

func (Complex_InnerEnum) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_15b36de02fb5cc42, []int{3, 0}
}

type SimpleFields struct {
	I64                  int64    `protobuf:"varint,1,opt,name=i64,proto3" json:"i64,omitempty"`
	I64Rep               []int64  `protobuf:"varint,2,rep,packed,name=i64_rep,json=i64Rep,proto3" json:"i64_rep,omitempty"`
	I32                  int32    `protobuf:"varint,3,opt,name=i32,proto3" json:"i32,omitempty"`
	Ui64                 uint64   `protobuf:"varint,4,opt,name=ui64,proto3" json:"ui64,omitempty"`
	Ui32                 uint32   `protobuf:"varint,5,opt,name=ui32,proto3" json:"ui32,omitempty"`
	B                    bool     `protobuf:"varint,6,opt,name=b,proto3" json:"b,omitempty"`
	F32                  float32  `protobuf:"fixed32,7,opt,name=f32,proto3" json:"f32,omitempty"`
	F64                  float64  `protobuf:"fixed64,8,opt,name=f64,proto3" json:"f64,omitempty"`
	S                    string   `protobuf:"bytes,9,opt,name=s,proto3" json:"s,omitempty"`
	Bs                   []byte   `protobuf:"bytes,10,opt,name=bs,proto3" json:"bs,omitempty"`
	BsRep                [][]byte `protobuf:"bytes,11,rep,name=bs_rep,json=bsRep,proto3" json:"bs_rep,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SimpleFields proto.InternalMessageInfo

func (m *SimpleFields) GetI64() int64 {
	if m != nil {
		return m.I64
	}
	return 0
}

func (m *SimpleFields) GetI64Rep() []int64 {
	if m != nil {
		return m.I64Rep
	}
	return nil
}

func (m *SimpleFields) GetI32() int32 {
	if m != nil {
		return m.I32
	}
	return 0
}

func (m *SimpleFields) GetUi64() uint64 {
	if m != nil {
		return m.Ui64
	}
	return 0
}

func (m *SimpleFields) GetUi32() uint32 {
	if m != nil {
		return m.Ui32
	}
	return 0
}

func (m *SimpleFields) GetB() bool {
	if m != nil {
		return m.B
	}
	return false
}

func (m *SimpleFields) GetF32() float32 {
	if m != nil {
		return m.F32
	}
	return 0
}

func (m *SimpleFields) GetF64() float64 {
	if m != nil {
		return m.F64
	}
	return 0
}

func (m *SimpleFields) GetS() string {
	if m != nil {
		return m.S
	}
	return ""
}

func (m *SimpleFields) GetBs() []byte {
	if m != nil {
		return m.Bs
	}
	return nil
}

func (m *SimpleFields) GetBsRep() [][]byte {
	if m != nil {
		return m.BsRep
	}
	return nil
}

type MessageFields struct {
	Single               *Simple   `protobuf:"bytes,1,opt,name=single,proto3" json:"single,omitempty"`
	Rep                  []*Simple `protobuf:"bytes,2,rep,name=rep,proto3" json:"rep,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_MessageFields proto.InternalMessageInfo

func (m *MessageFields) GetSingle() *Simple {
	if m != nil {
		return m.Single
	}
	return nil
}

func (m *MessageFields) GetRep() []*Simple {
	if m != nil {
		return m.Rep
	}
	return nil
}

type Simple struct {
	I                    int64    `protobuf:"varint,1,opt,name=i,proto3" json:"i,omitempty"`
	ManyI                []int64  `protobuf:"varint,2,rep,packed,name=many_i,json=manyI,proto3" json:"many_i,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Simple proto.InternalMessageInfo

func (m *Simple) GetI() int64 {
	if m != nil {
		return m.I
	}
	return 0
}

func (m *Simple) GetManyI() []int64 {
	if m != nil {
		return m.ManyI
	}
	return nil
}

type Complex struct {
	I64       int64                   `protobuf:"varint,1,opt,name=i64,proto3" json:"i64,omitempty"`
	I64Rep    []int64                 `protobuf:"varint,2,rep,packed,name=i64_rep,json=i64Rep,proto3" json:"i64_rep,omitempty"`
	EnumVal   Complex_InnerEnum       `protobuf:"varint,3,opt,name=enum_val,json=enumVal,proto3,enum=testprotos.Complex_InnerEnum" json:"enum_val,omitempty"`
	MsgVal    *Complex_InnerMessage   `protobuf:"bytes,4,opt,name=msg_val,json=msgVal,proto3" json:"msg_val,omitempty"`
	MsgValRep []*Complex_InnerMessage `protobuf:"bytes,5,rep,name=msg_val_rep,json=msgValRep,proto3" json:"msg_val_rep,omitempty"`
	// Types that are valid to be assigned to OneofVal:
	//	*Complex_Simple
	//	*Complex_InnerMsg
	OneofVal             isComplex_OneofVal `protobuf_oneof:"oneof_val"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_Complex proto.InternalMessageInfo

func (m *Complex) GetI64() int64 {
	if m != nil {
		return m.I64
	}
	return 0
}

func (m *Complex) GetI64Rep() []int64 {
	if m != nil {
		return m.I64Rep
	}
	return nil
}

func (m *Complex) GetEnumVal() Complex_InnerEnum {
	if m != nil {
		return m.EnumVal
	}
	return Complex_UNKNOWN
}

func (m *Complex) GetMsgVal() *Complex_InnerMessage {
	if m != nil {
		return m.MsgVal
	}
	return nil
}

func (m *Complex) GetMsgValRep() []*Complex_InnerMessage {
	if m != nil {
		return m.MsgValRep
	}
	return nil
}

type isComplex_OneofVal interface {
	isComplex_OneofVal()
}

type Complex_Simple struct {
	Simple *Simple `protobuf:"bytes,6,opt,name=simple,proto3,oneof"`
}

type Complex_InnerMsg struct {
	InnerMsg *Complex_InnerMessage `protobuf:"bytes,7,opt,name=inner_msg,json=innerMsg,proto3,oneof"`
}

func (*Complex_Simple) isComplex_OneofVal() {}

func (*Complex_InnerMsg) isComplex_OneofVal() {}

func (m *Complex) GetOneofVal() isComplex_OneofVal {
	if m != nil {
		return m.OneofVal
	}
	return nil
}

func (m *Complex) GetSimple() *Simple {
	if x, ok := m.GetOneofVal().(*Complex_Simple); ok {
		return x.Simple
	}
	return nil
}

func (m *Complex) GetInnerMsg() *Complex_InnerMessage {
	if x, ok := m.GetOneofVal().(*Complex_InnerMsg); ok {
		return x.InnerMsg
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Complex) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Complex_Simple)(nil),
		(*Complex_InnerMsg)(nil),
	}
}

type Complex_InnerMessage struct {
	I                    int64    `protobuf:"varint,1,opt,name=i,proto3" json:"i,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Complex_InnerMessage proto.InternalMessageInfo

func (m *Complex_InnerMessage) GetI() int64 {
	if m != nil {
		return m.I
	}
	return 0
}

type RefsOtherProtos struct {
	AnotherMsg           *AnotherMessage      `protobuf:"bytes,1,opt,name=another_msg,json=anotherMsg,proto3" json:"another_msg,omitempty"`
	Ts                   *timestamp.Timestamp `protobuf:"bytes,2,opt,name=ts,proto3" json:"ts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_RefsOtherProtos proto.InternalMessageInfo

func (m *RefsOtherProtos) GetAnotherMsg() *AnotherMessage {
	if m != nil {
		return m.AnotherMsg
	}
	return nil
}

func (m *RefsOtherProtos) GetTs() *timestamp.Timestamp {
	if m != nil {
		return m.Ts
	}
	return nil
}

type MapWithPrimitiveType struct {
	M                    map[string]int64 `protobuf:"bytes,1,rep,name=m,proto3" json:"m,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_MapWithPrimitiveType proto.InternalMessageInfo

func (m *MapWithPrimitiveType) GetM() map[string]int64 {
	if m != nil {
		return m.M
	}
	return nil
}

type MapWithMessageType struct {
	M                    map[string]*Simple `protobuf:"bytes,1,rep,name=m,proto3" json:"m,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 *MapWithMessageType) Reset()         { *m = MapWithMessageType{} }
func (m *MapWithMessageType) String() string { return proto.CompactTextString(m) }
func (*MapWithMessageType) ProtoMessage()    {}
func (*MapWithMessageType) Descriptor() ([]byte, []int) {
	return fileDescriptor_15b36de02fb5cc42, []int{6}
}

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

var xxx_messageInfo_MapWithMessageType proto.InternalMessageInfo

func (m *MapWithMessageType) GetM() map[string]*Simple {
	if m != nil {
		return m.M
	}
	return nil
}

func init() {
	proto.RegisterEnum("testprotos.Enum", Enum_name, Enum_value)
	proto.RegisterEnum("testprotos.Complex_InnerEnum", Complex_InnerEnum_name, Complex_InnerEnum_value)
	proto.RegisterType((*SimpleFields)(nil), "testprotos.SimpleFields")
	proto.RegisterType((*MessageFields)(nil), "testprotos.MessageFields")
	proto.RegisterType((*Simple)(nil), "testprotos.Simple")
	proto.RegisterType((*Complex)(nil), "testprotos.Complex")
	proto.RegisterType((*Complex_InnerMessage)(nil), "testprotos.Complex.InnerMessage")
	proto.RegisterType((*RefsOtherProtos)(nil), "testprotos.RefsOtherProtos")
	proto.RegisterType((*MapWithPrimitiveType)(nil), "testprotos.MapWithPrimitiveType")
	proto.RegisterMapType((map[string]int64)(nil), "testprotos.MapWithPrimitiveType.MEntry")
	proto.RegisterType((*MapWithMessageType)(nil), "testprotos.MapWithMessageType")
	proto.RegisterMapType((map[string]*Simple)(nil), "testprotos.MapWithMessageType.MEntry")
}

func init() {
	proto.RegisterFile("go.chromium.org/luci/starlark/starlarkproto/testprotos/test.proto", fileDescriptor_15b36de02fb5cc42)
}

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