// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/automl/v1beta1/detection.proto

package automl

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	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

// Annotation details for image object detection.
type ImageObjectDetectionAnnotation struct {
	// Output only. The rectangle representing the object location.
	BoundingBox *BoundingPoly `protobuf:"bytes,1,opt,name=bounding_box,json=boundingBox,proto3" json:"bounding_box,omitempty"`
	// Output only. The confidence that this annotation is positive for the parent example,
	// value in [0, 1], higher means higher positivity confidence.
	Score                float32  `protobuf:"fixed32,2,opt,name=score,proto3" json:"score,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ImageObjectDetectionAnnotation proto.InternalMessageInfo

func (m *ImageObjectDetectionAnnotation) GetBoundingBox() *BoundingPoly {
	if m != nil {
		return m.BoundingBox
	}
	return nil
}

func (m *ImageObjectDetectionAnnotation) GetScore() float32 {
	if m != nil {
		return m.Score
	}
	return 0
}

// Annotation details for video object tracking.
type VideoObjectTrackingAnnotation struct {
	// Optional. The instance of the object, expressed as a positive integer. Used to tell
	// apart objects of the same type (i.e. AnnotationSpec) when multiple are
	// present on a single example.
	// NOTE: Instance ID prediction quality is not a part of model evaluation and
	// is done as best effort. Especially in cases when an entity goes
	// off-screen for a longer time (minutes), when it comes back it may be given
	// a new instance ID.
	InstanceId string `protobuf:"bytes,1,opt,name=instance_id,json=instanceId,proto3" json:"instance_id,omitempty"`
	// Required. A time (frame) of a video to which this annotation pertains.
	// Represented as the duration since the video's start.
	TimeOffset *duration.Duration `protobuf:"bytes,2,opt,name=time_offset,json=timeOffset,proto3" json:"time_offset,omitempty"`
	// Required. The rectangle representing the object location on the frame (i.e.
	// at the time_offset of the video).
	BoundingBox *BoundingPoly `protobuf:"bytes,3,opt,name=bounding_box,json=boundingBox,proto3" json:"bounding_box,omitempty"`
	// Output only. The confidence that this annotation is positive for the video at
	// the time_offset, value in [0, 1], higher means higher positivity
	// confidence. For annotations created by the user the score is 1. When
	// user approves an annotation, the original float score is kept (and not
	// changed to 1).
	Score                float32  `protobuf:"fixed32,4,opt,name=score,proto3" json:"score,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_VideoObjectTrackingAnnotation proto.InternalMessageInfo

func (m *VideoObjectTrackingAnnotation) GetInstanceId() string {
	if m != nil {
		return m.InstanceId
	}
	return ""
}

func (m *VideoObjectTrackingAnnotation) GetTimeOffset() *duration.Duration {
	if m != nil {
		return m.TimeOffset
	}
	return nil
}

func (m *VideoObjectTrackingAnnotation) GetBoundingBox() *BoundingPoly {
	if m != nil {
		return m.BoundingBox
	}
	return nil
}

func (m *VideoObjectTrackingAnnotation) GetScore() float32 {
	if m != nil {
		return m.Score
	}
	return 0
}

// Bounding box matching model metrics for a single intersection-over-union
// threshold and multiple label match confidence thresholds.
type BoundingBoxMetricsEntry struct {
	// Output only. The intersection-over-union threshold value used to compute
	// this metrics entry.
	IouThreshold float32 `protobuf:"fixed32,1,opt,name=iou_threshold,json=iouThreshold,proto3" json:"iou_threshold,omitempty"`
	// Output only. The mean average precision, most often close to au_prc.
	MeanAveragePrecision float32 `protobuf:"fixed32,2,opt,name=mean_average_precision,json=meanAveragePrecision,proto3" json:"mean_average_precision,omitempty"`
	// Output only. Metrics for each label-match confidence_threshold from
	// 0.05,0.10,...,0.95,0.96,0.97,0.98,0.99. Precision-recall curve is
	// derived from them.
	ConfidenceMetricsEntries []*BoundingBoxMetricsEntry_ConfidenceMetricsEntry `protobuf:"bytes,3,rep,name=confidence_metrics_entries,json=confidenceMetricsEntries,proto3" json:"confidence_metrics_entries,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}                                          `json:"-"`
	XXX_unrecognized         []byte                                            `json:"-"`
	XXX_sizecache            int32                                             `json:"-"`
}

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

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

var xxx_messageInfo_BoundingBoxMetricsEntry proto.InternalMessageInfo

func (m *BoundingBoxMetricsEntry) GetIouThreshold() float32 {
	if m != nil {
		return m.IouThreshold
	}
	return 0
}

func (m *BoundingBoxMetricsEntry) GetMeanAveragePrecision() float32 {
	if m != nil {
		return m.MeanAveragePrecision
	}
	return 0
}

func (m *BoundingBoxMetricsEntry) GetConfidenceMetricsEntries() []*BoundingBoxMetricsEntry_ConfidenceMetricsEntry {
	if m != nil {
		return m.ConfidenceMetricsEntries
	}
	return nil
}

// Metrics for a single confidence threshold.
type BoundingBoxMetricsEntry_ConfidenceMetricsEntry struct {
	// Output only. The confidence threshold value used to compute the metrics.
	ConfidenceThreshold float32 `protobuf:"fixed32,1,opt,name=confidence_threshold,json=confidenceThreshold,proto3" json:"confidence_threshold,omitempty"`
	// Output only. Recall under the given confidence threshold.
	Recall float32 `protobuf:"fixed32,2,opt,name=recall,proto3" json:"recall,omitempty"`
	// Output only. Precision under the given confidence threshold.
	Precision float32 `protobuf:"fixed32,3,opt,name=precision,proto3" json:"precision,omitempty"`
	// Output only. The harmonic mean of recall and precision.
	F1Score              float32  `protobuf:"fixed32,4,opt,name=f1_score,json=f1Score,proto3" json:"f1_score,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BoundingBoxMetricsEntry_ConfidenceMetricsEntry proto.InternalMessageInfo

func (m *BoundingBoxMetricsEntry_ConfidenceMetricsEntry) GetConfidenceThreshold() float32 {
	if m != nil {
		return m.ConfidenceThreshold
	}
	return 0
}

func (m *BoundingBoxMetricsEntry_ConfidenceMetricsEntry) GetRecall() float32 {
	if m != nil {
		return m.Recall
	}
	return 0
}

func (m *BoundingBoxMetricsEntry_ConfidenceMetricsEntry) GetPrecision() float32 {
	if m != nil {
		return m.Precision
	}
	return 0
}

func (m *BoundingBoxMetricsEntry_ConfidenceMetricsEntry) GetF1Score() float32 {
	if m != nil {
		return m.F1Score
	}
	return 0
}

// Model evaluation metrics for image object detection problems.
// Evaluates prediction quality of labeled bounding boxes.
type ImageObjectDetectionEvaluationMetrics struct {
	// Output only. The total number of bounding boxes (i.e. summed over all
	// images) the ground truth used to create this evaluation had.
	EvaluatedBoundingBoxCount int32 `protobuf:"varint,1,opt,name=evaluated_bounding_box_count,json=evaluatedBoundingBoxCount,proto3" json:"evaluated_bounding_box_count,omitempty"`
	// Output only. The bounding boxes match metrics for each
	// Intersection-over-union threshold 0.05,0.10,...,0.95,0.96,0.97,0.98,0.99
	// and each label confidence threshold 0.05,0.10,...,0.95,0.96,0.97,0.98,0.99
	// pair.
	BoundingBoxMetricsEntries []*BoundingBoxMetricsEntry `protobuf:"bytes,2,rep,name=bounding_box_metrics_entries,json=boundingBoxMetricsEntries,proto3" json:"bounding_box_metrics_entries,omitempty"`
	// Output only. The single metric for bounding boxes evaluation:
	// the mean_average_precision averaged over all bounding_box_metrics_entries.
	BoundingBoxMeanAveragePrecision float32  `protobuf:"fixed32,3,opt,name=bounding_box_mean_average_precision,json=boundingBoxMeanAveragePrecision,proto3" json:"bounding_box_mean_average_precision,omitempty"`
	XXX_NoUnkeyedLiteral            struct{} `json:"-"`
	XXX_unrecognized                []byte   `json:"-"`
	XXX_sizecache                   int32    `json:"-"`
}

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

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

var xxx_messageInfo_ImageObjectDetectionEvaluationMetrics proto.InternalMessageInfo

func (m *ImageObjectDetectionEvaluationMetrics) GetEvaluatedBoundingBoxCount() int32 {
	if m != nil {
		return m.EvaluatedBoundingBoxCount
	}
	return 0
}

func (m *ImageObjectDetectionEvaluationMetrics) GetBoundingBoxMetricsEntries() []*BoundingBoxMetricsEntry {
	if m != nil {
		return m.BoundingBoxMetricsEntries
	}
	return nil
}

func (m *ImageObjectDetectionEvaluationMetrics) GetBoundingBoxMeanAveragePrecision() float32 {
	if m != nil {
		return m.BoundingBoxMeanAveragePrecision
	}
	return 0
}

// Model evaluation metrics for video object tracking problems.
// Evaluates prediction quality of both labeled bounding boxes and labeled
// tracks (i.e. series of bounding boxes sharing same label and instance ID).
type VideoObjectTrackingEvaluationMetrics struct {
	// Output only. The number of video frames used to create this evaluation.
	EvaluatedFrameCount int32 `protobuf:"varint,1,opt,name=evaluated_frame_count,json=evaluatedFrameCount,proto3" json:"evaluated_frame_count,omitempty"`
	// Output only. The total number of bounding boxes (i.e. summed over all
	// frames) the ground truth used to create this evaluation had.
	EvaluatedBoundingBoxCount int32 `protobuf:"varint,2,opt,name=evaluated_bounding_box_count,json=evaluatedBoundingBoxCount,proto3" json:"evaluated_bounding_box_count,omitempty"`
	// Output only. The bounding boxes match metrics for each
	// Intersection-over-union threshold 0.05,0.10,...,0.95,0.96,0.97,0.98,0.99
	// and each label confidence threshold 0.05,0.10,...,0.95,0.96,0.97,0.98,0.99
	// pair.
	BoundingBoxMetricsEntries []*BoundingBoxMetricsEntry `protobuf:"bytes,4,rep,name=bounding_box_metrics_entries,json=boundingBoxMetricsEntries,proto3" json:"bounding_box_metrics_entries,omitempty"`
	// Output only. The single metric for bounding boxes evaluation:
	// the mean_average_precision averaged over all bounding_box_metrics_entries.
	BoundingBoxMeanAveragePrecision float32  `protobuf:"fixed32,6,opt,name=bounding_box_mean_average_precision,json=boundingBoxMeanAveragePrecision,proto3" json:"bounding_box_mean_average_precision,omitempty"`
	XXX_NoUnkeyedLiteral            struct{} `json:"-"`
	XXX_unrecognized                []byte   `json:"-"`
	XXX_sizecache                   int32    `json:"-"`
}

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

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

var xxx_messageInfo_VideoObjectTrackingEvaluationMetrics proto.InternalMessageInfo

func (m *VideoObjectTrackingEvaluationMetrics) GetEvaluatedFrameCount() int32 {
	if m != nil {
		return m.EvaluatedFrameCount
	}
	return 0
}

func (m *VideoObjectTrackingEvaluationMetrics) GetEvaluatedBoundingBoxCount() int32 {
	if m != nil {
		return m.EvaluatedBoundingBoxCount
	}
	return 0
}

func (m *VideoObjectTrackingEvaluationMetrics) GetBoundingBoxMetricsEntries() []*BoundingBoxMetricsEntry {
	if m != nil {
		return m.BoundingBoxMetricsEntries
	}
	return nil
}

func (m *VideoObjectTrackingEvaluationMetrics) GetBoundingBoxMeanAveragePrecision() float32 {
	if m != nil {
		return m.BoundingBoxMeanAveragePrecision
	}
	return 0
}

func init() {
	proto.RegisterType((*ImageObjectDetectionAnnotation)(nil), "google.cloud.automl.v1beta1.ImageObjectDetectionAnnotation")
	proto.RegisterType((*VideoObjectTrackingAnnotation)(nil), "google.cloud.automl.v1beta1.VideoObjectTrackingAnnotation")
	proto.RegisterType((*BoundingBoxMetricsEntry)(nil), "google.cloud.automl.v1beta1.BoundingBoxMetricsEntry")
	proto.RegisterType((*BoundingBoxMetricsEntry_ConfidenceMetricsEntry)(nil), "google.cloud.automl.v1beta1.BoundingBoxMetricsEntry.ConfidenceMetricsEntry")
	proto.RegisterType((*ImageObjectDetectionEvaluationMetrics)(nil), "google.cloud.automl.v1beta1.ImageObjectDetectionEvaluationMetrics")
	proto.RegisterType((*VideoObjectTrackingEvaluationMetrics)(nil), "google.cloud.automl.v1beta1.VideoObjectTrackingEvaluationMetrics")
}

func init() {
	proto.RegisterFile("google/cloud/automl/v1beta1/detection.proto", fileDescriptor_85c92c72aeb2dfbd)
}

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