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

package config

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	test_runner "go.chromium.org/chromiumos/infra/proto/go/test_platform/migration/test_runner"
	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

// Config defined configuration parameters of cros_test_platform.
type Config struct {
	SkylabSwarming      *Config_Swarming     `protobuf:"bytes,1,opt,name=skylab_swarming,json=skylabSwarming,proto3" json:"skylab_swarming,omitempty"`
	SkylabIsolate       *Config_Isolate      `protobuf:"bytes,3,opt,name=skylab_isolate,json=skylabIsolate,proto3" json:"skylab_isolate,omitempty"`
	SkylabWorker        *Config_SkylabWorker `protobuf:"bytes,4,opt,name=skylab_worker,json=skylabWorker,proto3" json:"skylab_worker,omitempty"`
	Versioning          *Config_Versioning   `protobuf:"bytes,7,opt,name=versioning,proto3" json:"versioning,omitempty"`
	TestRunner          *Config_TestRunner   `protobuf:"bytes,8,opt,name=test_runner,json=testRunner,proto3" json:"test_runner,omitempty"`
	TestRunnerMigration *test_runner.Config  `protobuf:"bytes,9,opt,name=test_runner_migration,json=testRunnerMigration,proto3" json:"test_runner_migration,omitempty"`
	// The PubSub topic, to which CTP sends build ID when the build starts
	// and ends.
	Pubsub               *Config_PubSub `protobuf:"bytes,10,opt,name=pubsub,proto3" json:"pubsub,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_Config proto.InternalMessageInfo

func (m *Config) GetSkylabSwarming() *Config_Swarming {
	if m != nil {
		return m.SkylabSwarming
	}
	return nil
}

func (m *Config) GetSkylabIsolate() *Config_Isolate {
	if m != nil {
		return m.SkylabIsolate
	}
	return nil
}

func (m *Config) GetSkylabWorker() *Config_SkylabWorker {
	if m != nil {
		return m.SkylabWorker
	}
	return nil
}

func (m *Config) GetVersioning() *Config_Versioning {
	if m != nil {
		return m.Versioning
	}
	return nil
}

func (m *Config) GetTestRunner() *Config_TestRunner {
	if m != nil {
		return m.TestRunner
	}
	return nil
}

func (m *Config) GetTestRunnerMigration() *test_runner.Config {
	if m != nil {
		return m.TestRunnerMigration
	}
	return nil
}

func (m *Config) GetPubsub() *Config_PubSub {
	if m != nil {
		return m.Pubsub
	}
	return nil
}

// Swarming defines configuration parameters related to a swarming instance.
type Config_Swarming struct {
	Server               string   `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
	AuthJsonPath         string   `protobuf:"bytes,2,opt,name=auth_json_path,json=authJsonPath,proto3" json:"auth_json_path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Swarming proto.InternalMessageInfo

func (m *Config_Swarming) GetServer() string {
	if m != nil {
		return m.Server
	}
	return ""
}

func (m *Config_Swarming) GetAuthJsonPath() string {
	if m != nil {
		return m.AuthJsonPath
	}
	return ""
}

// Isolate defines configuration parameters related to an isolate instance.
type Config_Isolate struct {
	AuthJsonPath         string   `protobuf:"bytes,1,opt,name=auth_json_path,json=authJsonPath,proto3" json:"auth_json_path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Isolate proto.InternalMessageInfo

func (m *Config_Isolate) GetAuthJsonPath() string {
	if m != nil {
		return m.AuthJsonPath
	}
	return ""
}

// SkylabWorker defines configuration parameters related to
// skylab_swarming_worker.
type Config_SkylabWorker struct {
	// LUCI project for tasks; e.g. "chromeos"
	LuciProject string `protobuf:"bytes,1,opt,name=luci_project,json=luciProject,proto3" json:"luci_project,omitempty"`
	// LogDog host for test task logs, e.g. luci-logdog.appspot.com
	LogDogHost           string   `protobuf:"bytes,2,opt,name=log_dog_host,json=logDogHost,proto3" json:"log_dog_host,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_SkylabWorker proto.InternalMessageInfo

func (m *Config_SkylabWorker) GetLuciProject() string {
	if m != nil {
		return m.LuciProject
	}
	return ""
}

func (m *Config_SkylabWorker) GetLogDogHost() string {
	if m != nil {
		return m.LogDogHost
	}
	return ""
}

// Versioning defines configuration parameters dictating which versions of
// the downstream components to use.
type Config_Versioning struct {
	CrosTestPlatformBinary *Config_Versioning_CrosTestPlatformBinary `protobuf:"bytes,1,opt,name=cros_test_platform_binary,json=crosTestPlatformBinary,proto3" json:"cros_test_platform_binary,omitempty"`
	XXX_NoUnkeyedLiteral   struct{}                                  `json:"-"`
	XXX_unrecognized       []byte                                    `json:"-"`
	XXX_sizecache          int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_Config_Versioning proto.InternalMessageInfo

func (m *Config_Versioning) GetCrosTestPlatformBinary() *Config_Versioning_CrosTestPlatformBinary {
	if m != nil {
		return m.CrosTestPlatformBinary
	}
	return nil
}

// CrosTestPlatformBinary describes which cros_test_platform version to
// use.
type Config_Versioning_CrosTestPlatformBinary struct {
	// Use the CIPD version with this label.
	CipdLabel            string   `protobuf:"bytes,1,opt,name=cipd_label,json=cipdLabel,proto3" json:"cipd_label,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Versioning_CrosTestPlatformBinary proto.InternalMessageInfo

func (m *Config_Versioning_CrosTestPlatformBinary) GetCipdLabel() string {
	if m != nil {
		return m.CipdLabel
	}
	return ""
}

// Buildbucket defines configuration parameters of a builder.
type Config_Buildbucket struct {
	// Buildbucket host, e.g. "cr-buildbucket.appspot.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Project+bucket+builder serves as a unique builder identifier, see
	// BuilderID in the build proto:
	// https://cs.chromium.org/search/?q=f:build.proto+BuilderID
	Project              string   `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	Bucket               string   `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"`
	Builder              string   `protobuf:"bytes,4,opt,name=builder,proto3" json:"builder,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Buildbucket proto.InternalMessageInfo

func (m *Config_Buildbucket) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *Config_Buildbucket) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *Config_Buildbucket) GetBucket() string {
	if m != nil {
		return m.Bucket
	}
	return ""
}

func (m *Config_Buildbucket) GetBuilder() string {
	if m != nil {
		return m.Builder
	}
	return ""
}

// PubSub defines the configuration parameters for PubSub topic.
type Config_PubSub struct {
	Project              string   `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	Topic                string   `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_PubSub proto.InternalMessageInfo

func (m *Config_PubSub) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *Config_PubSub) GetTopic() string {
	if m != nil {
		return m.Topic
	}
	return ""
}

// TestRunner defines configuration parameters related to the test_runner
// recipe.
type Config_TestRunner struct {
	Buildbucket *Config_Buildbucket `protobuf:"bytes,1,opt,name=buildbucket,proto3" json:"buildbucket,omitempty"`
	// The PubSub topic to which Buildbucket sends the update of test runner build.
	Pubsub               *Config_PubSub `protobuf:"bytes,2,opt,name=pubsub,proto3" json:"pubsub,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_Config_TestRunner proto.InternalMessageInfo

func (m *Config_TestRunner) GetBuildbucket() *Config_Buildbucket {
	if m != nil {
		return m.Buildbucket
	}
	return nil
}

func (m *Config_TestRunner) GetPubsub() *Config_PubSub {
	if m != nil {
		return m.Pubsub
	}
	return nil
}

func init() {
	proto.RegisterType((*Config)(nil), "test_platform.config.Config")
	proto.RegisterType((*Config_Swarming)(nil), "test_platform.config.Config.Swarming")
	proto.RegisterType((*Config_Isolate)(nil), "test_platform.config.Config.Isolate")
	proto.RegisterType((*Config_SkylabWorker)(nil), "test_platform.config.Config.SkylabWorker")
	proto.RegisterType((*Config_Versioning)(nil), "test_platform.config.Config.Versioning")
	proto.RegisterType((*Config_Versioning_CrosTestPlatformBinary)(nil), "test_platform.config.Config.Versioning.CrosTestPlatformBinary")
	proto.RegisterType((*Config_Buildbucket)(nil), "test_platform.config.Config.Buildbucket")
	proto.RegisterType((*Config_PubSub)(nil), "test_platform.config.Config.PubSub")
	proto.RegisterType((*Config_TestRunner)(nil), "test_platform.config.Config.TestRunner")
}

func init() { proto.RegisterFile("test_platform/config/config.proto", fileDescriptor_2c858eded7d7f900) }

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