// Copyright 2019 Google LLC.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/monitoring/dashboard/v1/xychart.proto

package dashboard

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// The types of plotting strategies for data sets.
type XyChart_DataSet_PlotType int32

const (
	// Plot type is unspecified. The view will default to `LINE`.
	XyChart_DataSet_PLOT_TYPE_UNSPECIFIED XyChart_DataSet_PlotType = 0
	// The data is plotted as a set of lines (one line per series).
	XyChart_DataSet_LINE XyChart_DataSet_PlotType = 1
	// The data is plotted as a set of filled areas (one area per series),
	// with the areas stacked vertically (the base of each area is the top of
	// its predecessor, and the base of the first area is the X axis). Since
	// the areas do not overlap, each is filled with a different opaque color.
	XyChart_DataSet_STACKED_AREA XyChart_DataSet_PlotType = 2
	// The data is plotted as a set of rectangular boxes (one box per series),
	// with the boxes stacked vertically (the base of each box is the top of
	// its predecessor, and the base of the first box is the X axis). Since
	// the boxes do not overlap, each is filled with a different opaque color.
	XyChart_DataSet_STACKED_BAR XyChart_DataSet_PlotType = 3
	// The data is plotted as a heatmap. The series being plotted must have a
	// `DISTRIBUTION` value type. The value of each bucket in the distribution
	// is displayed as a color. This type is not currently available in the
	// Stackdriver Monitoring application.
	XyChart_DataSet_HEATMAP XyChart_DataSet_PlotType = 4
)

// Enum value maps for XyChart_DataSet_PlotType.
var (
	XyChart_DataSet_PlotType_name = map[int32]string{
		0: "PLOT_TYPE_UNSPECIFIED",
		1: "LINE",
		2: "STACKED_AREA",
		3: "STACKED_BAR",
		4: "HEATMAP",
	}
	XyChart_DataSet_PlotType_value = map[string]int32{
		"PLOT_TYPE_UNSPECIFIED": 0,
		"LINE":                  1,
		"STACKED_AREA":          2,
		"STACKED_BAR":           3,
		"HEATMAP":               4,
	}
)

func (x XyChart_DataSet_PlotType) Enum() *XyChart_DataSet_PlotType {
	p := new(XyChart_DataSet_PlotType)
	*p = x
	return p
}

func (x XyChart_DataSet_PlotType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (XyChart_DataSet_PlotType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_monitoring_dashboard_v1_xychart_proto_enumTypes[0].Descriptor()
}

func (XyChart_DataSet_PlotType) Type() protoreflect.EnumType {
	return &file_google_monitoring_dashboard_v1_xychart_proto_enumTypes[0]
}

func (x XyChart_DataSet_PlotType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use XyChart_DataSet_PlotType.Descriptor instead.
func (XyChart_DataSet_PlotType) EnumDescriptor() ([]byte, []int) {
	return file_google_monitoring_dashboard_v1_xychart_proto_rawDescGZIP(), []int{0, 0, 0}
}

// Types of scales used in axes.
type XyChart_Axis_Scale int32

const (
	// Scale is unspecified. The view will default to `LINEAR`.
	XyChart_Axis_SCALE_UNSPECIFIED XyChart_Axis_Scale = 0
	// Linear scale.
	XyChart_Axis_LINEAR XyChart_Axis_Scale = 1
	// Logarithmic scale (base 10).
	XyChart_Axis_LOG10 XyChart_Axis_Scale = 2
)

// Enum value maps for XyChart_Axis_Scale.
var (
	XyChart_Axis_Scale_name = map[int32]string{
		0: "SCALE_UNSPECIFIED",
		1: "LINEAR",
		2: "LOG10",
	}
	XyChart_Axis_Scale_value = map[string]int32{
		"SCALE_UNSPECIFIED": 0,
		"LINEAR":            1,
		"LOG10":             2,
	}
)

func (x XyChart_Axis_Scale) Enum() *XyChart_Axis_Scale {
	p := new(XyChart_Axis_Scale)
	*p = x
	return p
}

func (x XyChart_Axis_Scale) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (XyChart_Axis_Scale) Descriptor() protoreflect.EnumDescriptor {
	return file_google_monitoring_dashboard_v1_xychart_proto_enumTypes[1].Descriptor()
}

func (XyChart_Axis_Scale) Type() protoreflect.EnumType {
	return &file_google_monitoring_dashboard_v1_xychart_proto_enumTypes[1]
}

func (x XyChart_Axis_Scale) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use XyChart_Axis_Scale.Descriptor instead.
func (XyChart_Axis_Scale) EnumDescriptor() ([]byte, []int) {
	return file_google_monitoring_dashboard_v1_xychart_proto_rawDescGZIP(), []int{0, 1, 0}
}

// Chart mode options.
type ChartOptions_Mode int32

const (
	// Mode is unspecified. The view will default to `COLOR`.
	ChartOptions_MODE_UNSPECIFIED ChartOptions_Mode = 0
	// The chart distinguishes data series using different color. Line
	// colors may get reused when there are many lines in the chart.
	ChartOptions_COLOR ChartOptions_Mode = 1
	// The chart uses the Stackdriver x-ray mode, in which each
	// data set is plotted using the same semi-transparent color.
	ChartOptions_X_RAY ChartOptions_Mode = 2
	// The chart displays statistics such as average, median, 95th percentile,
	// and more.
	ChartOptions_STATS ChartOptions_Mode = 3
)

// Enum value maps for ChartOptions_Mode.
var (
	ChartOptions_Mode_name = map[int32]string{
		0: "MODE_UNSPECIFIED",
		1: "COLOR",
		2: "X_RAY",
		3: "STATS",
	}
	ChartOptions_Mode_value = map[string]int32{
		"MODE_UNSPECIFIED": 0,
		"COLOR":            1,
		"X_RAY":            2,
		"STATS":            3,
	}
)

func (x ChartOptions_Mode) Enum() *ChartOptions_Mode {
	p := new(ChartOptions_Mode)
	*p = x
	return p
}

func (x ChartOptions_Mode) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ChartOptions_Mode) Descriptor() protoreflect.EnumDescriptor {
	return file_google_monitoring_dashboard_v1_xychart_proto_enumTypes[2].Descriptor()
}

func (ChartOptions_Mode) Type() protoreflect.EnumType {
	return &file_google_monitoring_dashboard_v1_xychart_proto_enumTypes[2]
}

func (x ChartOptions_Mode) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ChartOptions_Mode.Descriptor instead.
func (ChartOptions_Mode) EnumDescriptor() ([]byte, []int) {
	return file_google_monitoring_dashboard_v1_xychart_proto_rawDescGZIP(), []int{1, 0}
}

// A chart that displays data on a 2D (X and Y axes) plane.
type XyChart struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The data displayed in this chart.
	DataSets []*XyChart_DataSet `protobuf:"bytes,1,rep,name=data_sets,json=dataSets,proto3" json:"data_sets,omitempty"`
	// The duration used to display a comparison chart. A comparison chart
	// simultaneously shows values from two similar-length time periods
	// (e.g., week-over-week metrics).
	// The duration must be positive, and it can only be applied to charts with
	// data sets of LINE plot type.
	TimeshiftDuration *duration.Duration `protobuf:"bytes,4,opt,name=timeshift_duration,json=timeshiftDuration,proto3" json:"timeshift_duration,omitempty"`
	// Threshold lines drawn horizontally across the chart.
	Thresholds []*Threshold `protobuf:"bytes,5,rep,name=thresholds,proto3" json:"thresholds,omitempty"`
	// The properties applied to the X axis.
	XAxis *XyChart_Axis `protobuf:"bytes,6,opt,name=x_axis,json=xAxis,proto3" json:"x_axis,omitempty"`
	// The properties applied to the Y axis.
	YAxis *XyChart_Axis `protobuf:"bytes,7,opt,name=y_axis,json=yAxis,proto3" json:"y_axis,omitempty"`
	// Display options for the chart.
	ChartOptions *ChartOptions `protobuf:"bytes,8,opt,name=chart_options,json=chartOptions,proto3" json:"chart_options,omitempty"`
}

func (x *XyChart) Reset() {
	*x = XyChart{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *XyChart) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*XyChart) ProtoMessage() {}

func (x *XyChart) ProtoReflect() protoreflect.Message {
	mi := &file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use XyChart.ProtoReflect.Descriptor instead.
func (*XyChart) Descriptor() ([]byte, []int) {
	return file_google_monitoring_dashboard_v1_xychart_proto_rawDescGZIP(), []int{0}
}

func (x *XyChart) GetDataSets() []*XyChart_DataSet {
	if x != nil {
		return x.DataSets
	}
	return nil
}

func (x *XyChart) GetTimeshiftDuration() *duration.Duration {
	if x != nil {
		return x.TimeshiftDuration
	}
	return nil
}

func (x *XyChart) GetThresholds() []*Threshold {
	if x != nil {
		return x.Thresholds
	}
	return nil
}

func (x *XyChart) GetXAxis() *XyChart_Axis {
	if x != nil {
		return x.XAxis
	}
	return nil
}

func (x *XyChart) GetYAxis() *XyChart_Axis {
	if x != nil {
		return x.YAxis
	}
	return nil
}

func (x *XyChart) GetChartOptions() *ChartOptions {
	if x != nil {
		return x.ChartOptions
	}
	return nil
}

// Options to control visual rendering of a chart.
type ChartOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The chart mode.
	Mode ChartOptions_Mode `protobuf:"varint,1,opt,name=mode,proto3,enum=google.monitoring.dashboard.v1.ChartOptions_Mode" json:"mode,omitempty"`
}

func (x *ChartOptions) Reset() {
	*x = ChartOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChartOptions) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChartOptions) ProtoMessage() {}

func (x *ChartOptions) ProtoReflect() protoreflect.Message {
	mi := &file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ChartOptions.ProtoReflect.Descriptor instead.
func (*ChartOptions) Descriptor() ([]byte, []int) {
	return file_google_monitoring_dashboard_v1_xychart_proto_rawDescGZIP(), []int{1}
}

func (x *ChartOptions) GetMode() ChartOptions_Mode {
	if x != nil {
		return x.Mode
	}
	return ChartOptions_MODE_UNSPECIFIED
}

// Groups a time series query definition with charting options.
type XyChart_DataSet struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Fields for querying time series data from the
	// Stackdriver metrics API.
	TimeSeriesQuery *TimeSeriesQuery `protobuf:"bytes,1,opt,name=time_series_query,json=timeSeriesQuery,proto3" json:"time_series_query,omitempty"`
	// How this data should be plotted on the chart.
	PlotType XyChart_DataSet_PlotType `protobuf:"varint,2,opt,name=plot_type,json=plotType,proto3,enum=google.monitoring.dashboard.v1.XyChart_DataSet_PlotType" json:"plot_type,omitempty"`
	// A template string for naming `TimeSeries` in the resulting data set.
	// This should be a string with interpolations of the form ${label_name},
	// which will resolve to the label's value.
	LegendTemplate string `protobuf:"bytes,3,opt,name=legend_template,json=legendTemplate,proto3" json:"legend_template,omitempty"`
	// Optional. The lower bound on data point frequency for this data set, implemented by
	// specifying the minimum alignment period to use in a time series query
	// For example, if the data is published once every 10 minutes, the
	// `min_alignment_period` should be at least 10 minutes. It would not
	// make sense to fetch and align data at one minute intervals.
	MinAlignmentPeriod *duration.Duration `protobuf:"bytes,4,opt,name=min_alignment_period,json=minAlignmentPeriod,proto3" json:"min_alignment_period,omitempty"`
}

func (x *XyChart_DataSet) Reset() {
	*x = XyChart_DataSet{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *XyChart_DataSet) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*XyChart_DataSet) ProtoMessage() {}

func (x *XyChart_DataSet) ProtoReflect() protoreflect.Message {
	mi := &file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use XyChart_DataSet.ProtoReflect.Descriptor instead.
func (*XyChart_DataSet) Descriptor() ([]byte, []int) {
	return file_google_monitoring_dashboard_v1_xychart_proto_rawDescGZIP(), []int{0, 0}
}

func (x *XyChart_DataSet) GetTimeSeriesQuery() *TimeSeriesQuery {
	if x != nil {
		return x.TimeSeriesQuery
	}
	return nil
}

func (x *XyChart_DataSet) GetPlotType() XyChart_DataSet_PlotType {
	if x != nil {
		return x.PlotType
	}
	return XyChart_DataSet_PLOT_TYPE_UNSPECIFIED
}

func (x *XyChart_DataSet) GetLegendTemplate() string {
	if x != nil {
		return x.LegendTemplate
	}
	return ""
}

func (x *XyChart_DataSet) GetMinAlignmentPeriod() *duration.Duration {
	if x != nil {
		return x.MinAlignmentPeriod
	}
	return nil
}

// A chart axis.
type XyChart_Axis struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The label of the axis.
	Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
	// The axis scale. By default, a linear scale is used.
	Scale XyChart_Axis_Scale `protobuf:"varint,2,opt,name=scale,proto3,enum=google.monitoring.dashboard.v1.XyChart_Axis_Scale" json:"scale,omitempty"`
}

func (x *XyChart_Axis) Reset() {
	*x = XyChart_Axis{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *XyChart_Axis) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*XyChart_Axis) ProtoMessage() {}

func (x *XyChart_Axis) ProtoReflect() protoreflect.Message {
	mi := &file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use XyChart_Axis.ProtoReflect.Descriptor instead.
func (*XyChart_Axis) Descriptor() ([]byte, []int) {
	return file_google_monitoring_dashboard_v1_xychart_proto_rawDescGZIP(), []int{0, 1}
}

func (x *XyChart_Axis) GetLabel() string {
	if x != nil {
		return x.Label
	}
	return ""
}

func (x *XyChart_Axis) GetScale() XyChart_Axis_Scale {
	if x != nil {
		return x.Scale
	}
	return XyChart_Axis_SCALE_UNSPECIFIED
}

var File_google_monitoring_dashboard_v1_xychart_proto protoreflect.FileDescriptor

var file_google_monitoring_dashboard_v1_xychart_proto_rawDesc = []byte{
	0x0a, 0x2c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72,
	0x69, 0x6e, 0x67, 0x2f, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f, 0x76, 0x31,
	0x2f, 0x78, 0x79, 0x63, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,
	0x67, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x1a, 0x1f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64,
	0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x2c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69,
	0x6e, 0x67, 0x2f, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f, 0x76, 0x31, 0x2f,
	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64,
	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x85, 0x08,
	0x0a, 0x07, 0x58, 0x79, 0x43, 0x68, 0x61, 0x72, 0x74, 0x12, 0x4c, 0x0a, 0x09, 0x64, 0x61, 0x74,
	0x61, 0x5f, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,
	0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x58, 0x79,
	0x43, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x65, 0x74, 0x52, 0x08, 0x64,
	0x61, 0x74, 0x61, 0x53, 0x65, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x74, 0x69, 0x6d, 0x65, 0x73,
	0x68, 0x69, 0x66, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11,
	0x74, 0x69, 0x6d, 0x65, 0x73, 0x68, 0x69, 0x66, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x12, 0x49, 0x0a, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x18,
	0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,
	0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f,
	0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64,
	0x52, 0x0a, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x12, 0x43, 0x0a, 0x06,
	0x78, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67,
	0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x58, 0x79,
	0x43, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x78, 0x69, 0x73, 0x52, 0x05, 0x78, 0x41, 0x78, 0x69,
	0x73, 0x12, 0x43, 0x0a, 0x06, 0x79, 0x5f, 0x61, 0x78, 0x69, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74,
	0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e,
	0x76, 0x31, 0x2e, 0x58, 0x79, 0x43, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x78, 0x69, 0x73, 0x52,
	0x05, 0x79, 0x41, 0x78, 0x69, 0x73, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x68, 0x61, 0x72, 0x74, 0x5f,
	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e,
	0x67, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43,
	0x68, 0x61, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0c, 0x63, 0x68, 0x61,
	0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x99, 0x03, 0x0a, 0x07, 0x44, 0x61,
	0x74, 0x61, 0x53, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x65,
	0x72, 0x69, 0x65, 0x73, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f,
	0x72, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2e, 0x76,
	0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72,
	0x79, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65,
	0x72, 0x79, 0x12, 0x55, 0x0a, 0x09, 0x70, 0x6c, 0x6f, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d,
	0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f,
	0x61, 0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x58, 0x79, 0x43, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x44,
	0x61, 0x74, 0x61, 0x53, 0x65, 0x74, 0x2e, 0x50, 0x6c, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52,
	0x08, 0x70, 0x6c, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6c, 0x65, 0x67,
	0x65, 0x6e, 0x64, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0e, 0x6c, 0x65, 0x67, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
	0x74, 0x65, 0x12, 0x50, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x6d,
	0x65, 0x6e, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
	0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x01,
	0x52, 0x12, 0x6d, 0x69, 0x6e, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65,
	0x72, 0x69, 0x6f, 0x64, 0x22, 0x5f, 0x0a, 0x08, 0x50, 0x6c, 0x6f, 0x74, 0x54, 0x79, 0x70, 0x65,
	0x12, 0x19, 0x0a, 0x15, 0x50, 0x4c, 0x4f, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e,
	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4c,
	0x49, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x43, 0x4b, 0x45, 0x44,
	0x5f, 0x41, 0x52, 0x45, 0x41, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x41, 0x43, 0x4b,
	0x45, 0x44, 0x5f, 0x42, 0x41, 0x52, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x45, 0x41, 0x54,
	0x4d, 0x41, 0x50, 0x10, 0x04, 0x1a, 0x9d, 0x01, 0x0a, 0x04, 0x41, 0x78, 0x69, 0x73, 0x12, 0x14,
	0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c,
	0x61, 0x62, 0x65, 0x6c, 0x12, 0x48, 0x0a, 0x05, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e,
	0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72,
	0x64, 0x2e, 0x76, 0x31, 0x2e, 0x58, 0x79, 0x43, 0x68, 0x61, 0x72, 0x74, 0x2e, 0x41, 0x78, 0x69,
	0x73, 0x2e, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x52, 0x05, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x22, 0x35,
	0x0a, 0x05, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x43, 0x41, 0x4c, 0x45,
	0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a,
	0x0a, 0x06, 0x4c, 0x49, 0x4e, 0x45, 0x41, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x4f,
	0x47, 0x31, 0x30, 0x10, 0x02, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4f,
	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f,
	0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61,
	0x72, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x3d, 0x0a,
	0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e,
	0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x43,
	0x4f, 0x4c, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x58, 0x5f, 0x52, 0x41, 0x59, 0x10,
	0x02, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41, 0x54, 0x53, 0x10, 0x03, 0x42, 0xa8, 0x01, 0x0a,
	0x22, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x6d, 0x6f, 0x6e, 0x69,
	0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64,
	0x2e, 0x76, 0x31, 0x42, 0x0c, 0x58, 0x79, 0x43, 0x68, 0x61, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74,
	0x6f, 0x50, 0x01, 0x5a, 0x47, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61,
	0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x6d, 0x6f, 0x6e, 0x69, 0x74,
	0x6f, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f,
	0x76, 0x31, 0x3b, 0x64, 0x61, 0x73, 0x68, 0x62, 0x6f, 0x61, 0x72, 0x64, 0xea, 0x02, 0x28, 0x47,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x4d, 0x6f,
	0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x44, 0x61, 0x73, 0x68, 0x62, 0x6f,
	0x61, 0x72, 0x64, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_monitoring_dashboard_v1_xychart_proto_rawDescOnce sync.Once
	file_google_monitoring_dashboard_v1_xychart_proto_rawDescData = file_google_monitoring_dashboard_v1_xychart_proto_rawDesc
)

func file_google_monitoring_dashboard_v1_xychart_proto_rawDescGZIP() []byte {
	file_google_monitoring_dashboard_v1_xychart_proto_rawDescOnce.Do(func() {
		file_google_monitoring_dashboard_v1_xychart_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_monitoring_dashboard_v1_xychart_proto_rawDescData)
	})
	return file_google_monitoring_dashboard_v1_xychart_proto_rawDescData
}

var file_google_monitoring_dashboard_v1_xychart_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_google_monitoring_dashboard_v1_xychart_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_google_monitoring_dashboard_v1_xychart_proto_goTypes = []interface{}{
	(XyChart_DataSet_PlotType)(0), // 0: google.monitoring.dashboard.v1.XyChart.DataSet.PlotType
	(XyChart_Axis_Scale)(0),       // 1: google.monitoring.dashboard.v1.XyChart.Axis.Scale
	(ChartOptions_Mode)(0),        // 2: google.monitoring.dashboard.v1.ChartOptions.Mode
	(*XyChart)(nil),               // 3: google.monitoring.dashboard.v1.XyChart
	(*ChartOptions)(nil),          // 4: google.monitoring.dashboard.v1.ChartOptions
	(*XyChart_DataSet)(nil),       // 5: google.monitoring.dashboard.v1.XyChart.DataSet
	(*XyChart_Axis)(nil),          // 6: google.monitoring.dashboard.v1.XyChart.Axis
	(*duration.Duration)(nil),     // 7: google.protobuf.Duration
	(*Threshold)(nil),             // 8: google.monitoring.dashboard.v1.Threshold
	(*TimeSeriesQuery)(nil),       // 9: google.monitoring.dashboard.v1.TimeSeriesQuery
}
var file_google_monitoring_dashboard_v1_xychart_proto_depIdxs = []int32{
	5,  // 0: google.monitoring.dashboard.v1.XyChart.data_sets:type_name -> google.monitoring.dashboard.v1.XyChart.DataSet
	7,  // 1: google.monitoring.dashboard.v1.XyChart.timeshift_duration:type_name -> google.protobuf.Duration
	8,  // 2: google.monitoring.dashboard.v1.XyChart.thresholds:type_name -> google.monitoring.dashboard.v1.Threshold
	6,  // 3: google.monitoring.dashboard.v1.XyChart.x_axis:type_name -> google.monitoring.dashboard.v1.XyChart.Axis
	6,  // 4: google.monitoring.dashboard.v1.XyChart.y_axis:type_name -> google.monitoring.dashboard.v1.XyChart.Axis
	4,  // 5: google.monitoring.dashboard.v1.XyChart.chart_options:type_name -> google.monitoring.dashboard.v1.ChartOptions
	2,  // 6: google.monitoring.dashboard.v1.ChartOptions.mode:type_name -> google.monitoring.dashboard.v1.ChartOptions.Mode
	9,  // 7: google.monitoring.dashboard.v1.XyChart.DataSet.time_series_query:type_name -> google.monitoring.dashboard.v1.TimeSeriesQuery
	0,  // 8: google.monitoring.dashboard.v1.XyChart.DataSet.plot_type:type_name -> google.monitoring.dashboard.v1.XyChart.DataSet.PlotType
	7,  // 9: google.monitoring.dashboard.v1.XyChart.DataSet.min_alignment_period:type_name -> google.protobuf.Duration
	1,  // 10: google.monitoring.dashboard.v1.XyChart.Axis.scale:type_name -> google.monitoring.dashboard.v1.XyChart.Axis.Scale
	11, // [11:11] is the sub-list for method output_type
	11, // [11:11] is the sub-list for method input_type
	11, // [11:11] is the sub-list for extension type_name
	11, // [11:11] is the sub-list for extension extendee
	0,  // [0:11] is the sub-list for field type_name
}

func init() { file_google_monitoring_dashboard_v1_xychart_proto_init() }
func file_google_monitoring_dashboard_v1_xychart_proto_init() {
	if File_google_monitoring_dashboard_v1_xychart_proto != nil {
		return
	}
	file_google_monitoring_dashboard_v1_metrics_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*XyChart); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChartOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*XyChart_DataSet); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_monitoring_dashboard_v1_xychart_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*XyChart_Axis); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_monitoring_dashboard_v1_xychart_proto_rawDesc,
			NumEnums:      3,
			NumMessages:   4,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_monitoring_dashboard_v1_xychart_proto_goTypes,
		DependencyIndexes: file_google_monitoring_dashboard_v1_xychart_proto_depIdxs,
		EnumInfos:         file_google_monitoring_dashboard_v1_xychart_proto_enumTypes,
		MessageInfos:      file_google_monitoring_dashboard_v1_xychart_proto_msgTypes,
	}.Build()
	File_google_monitoring_dashboard_v1_xychart_proto = out.File
	file_google_monitoring_dashboard_v1_xychart_proto_rawDesc = nil
	file_google_monitoring_dashboard_v1_xychart_proto_goTypes = nil
	file_google_monitoring_dashboard_v1_xychart_proto_depIdxs = nil
}
