// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/services/keyword_plan_service.proto

package services

import (
	context "context"
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	common "google.golang.org/genproto/googleapis/ads/googleads/v3/common"
	resources "google.golang.org/genproto/googleapis/ads/googleads/v3/resources"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	status "google.golang.org/genproto/googleapis/rpc/status"
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status1 "google.golang.org/grpc/status"
)

// 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

// Request message for [KeywordPlanService.GetKeywordPlan][google.ads.googleads.v3.services.KeywordPlanService.GetKeywordPlan].
type GetKeywordPlanRequest struct {
	// Required. The resource name of the plan to fetch.
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetKeywordPlanRequest proto.InternalMessageInfo

func (m *GetKeywordPlanRequest) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

// Request message for [KeywordPlanService.MutateKeywordPlans][google.ads.googleads.v3.services.KeywordPlanService.MutateKeywordPlans].
type MutateKeywordPlansRequest struct {
	// Required. The ID of the customer whose keyword plans are being modified.
	CustomerId string `protobuf:"bytes,1,opt,name=customer_id,json=customerId,proto3" json:"customer_id,omitempty"`
	// Required. The list of operations to perform on individual keyword plans.
	Operations []*KeywordPlanOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"`
	// If true, successful operations will be carried out and invalid
	// operations will return errors. If false, all operations will be carried
	// out in one transaction if and only if they are all valid.
	// Default is false.
	PartialFailure bool `protobuf:"varint,3,opt,name=partial_failure,json=partialFailure,proto3" json:"partial_failure,omitempty"`
	// If true, the request is validated but not executed. Only errors are
	// returned, not results.
	ValidateOnly         bool     `protobuf:"varint,4,opt,name=validate_only,json=validateOnly,proto3" json:"validate_only,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MutateKeywordPlansRequest proto.InternalMessageInfo

func (m *MutateKeywordPlansRequest) GetCustomerId() string {
	if m != nil {
		return m.CustomerId
	}
	return ""
}

func (m *MutateKeywordPlansRequest) GetOperations() []*KeywordPlanOperation {
	if m != nil {
		return m.Operations
	}
	return nil
}

func (m *MutateKeywordPlansRequest) GetPartialFailure() bool {
	if m != nil {
		return m.PartialFailure
	}
	return false
}

func (m *MutateKeywordPlansRequest) GetValidateOnly() bool {
	if m != nil {
		return m.ValidateOnly
	}
	return false
}

// A single operation (create, update, remove) on a keyword plan.
type KeywordPlanOperation struct {
	// The FieldMask that determines which resource fields are modified in an
	// update.
	UpdateMask *field_mask.FieldMask `protobuf:"bytes,4,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	// The mutate operation.
	//
	// Types that are valid to be assigned to Operation:
	//	*KeywordPlanOperation_Create
	//	*KeywordPlanOperation_Update
	//	*KeywordPlanOperation_Remove
	Operation            isKeywordPlanOperation_Operation `protobuf_oneof:"operation"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

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

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

var xxx_messageInfo_KeywordPlanOperation proto.InternalMessageInfo

func (m *KeywordPlanOperation) GetUpdateMask() *field_mask.FieldMask {
	if m != nil {
		return m.UpdateMask
	}
	return nil
}

type isKeywordPlanOperation_Operation interface {
	isKeywordPlanOperation_Operation()
}

type KeywordPlanOperation_Create struct {
	Create *resources.KeywordPlan `protobuf:"bytes,1,opt,name=create,proto3,oneof"`
}

type KeywordPlanOperation_Update struct {
	Update *resources.KeywordPlan `protobuf:"bytes,2,opt,name=update,proto3,oneof"`
}

type KeywordPlanOperation_Remove struct {
	Remove string `protobuf:"bytes,3,opt,name=remove,proto3,oneof"`
}

func (*KeywordPlanOperation_Create) isKeywordPlanOperation_Operation() {}

func (*KeywordPlanOperation_Update) isKeywordPlanOperation_Operation() {}

func (*KeywordPlanOperation_Remove) isKeywordPlanOperation_Operation() {}

func (m *KeywordPlanOperation) GetOperation() isKeywordPlanOperation_Operation {
	if m != nil {
		return m.Operation
	}
	return nil
}

func (m *KeywordPlanOperation) GetCreate() *resources.KeywordPlan {
	if x, ok := m.GetOperation().(*KeywordPlanOperation_Create); ok {
		return x.Create
	}
	return nil
}

func (m *KeywordPlanOperation) GetUpdate() *resources.KeywordPlan {
	if x, ok := m.GetOperation().(*KeywordPlanOperation_Update); ok {
		return x.Update
	}
	return nil
}

func (m *KeywordPlanOperation) GetRemove() string {
	if x, ok := m.GetOperation().(*KeywordPlanOperation_Remove); ok {
		return x.Remove
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*KeywordPlanOperation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*KeywordPlanOperation_Create)(nil),
		(*KeywordPlanOperation_Update)(nil),
		(*KeywordPlanOperation_Remove)(nil),
	}
}

// Response message for a keyword plan mutate.
type MutateKeywordPlansResponse struct {
	// Errors that pertain to operation failures in the partial failure mode.
	// Returned only when partial_failure = true and all errors occur inside the
	// operations. If any errors occur outside the operations (e.g. auth errors),
	// we return an RPC level error.
	PartialFailureError *status.Status `protobuf:"bytes,3,opt,name=partial_failure_error,json=partialFailureError,proto3" json:"partial_failure_error,omitempty"`
	// All results for the mutate.
	Results              []*MutateKeywordPlansResult `protobuf:"bytes,2,rep,name=results,proto3" json:"results,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_MutateKeywordPlansResponse proto.InternalMessageInfo

func (m *MutateKeywordPlansResponse) GetPartialFailureError() *status.Status {
	if m != nil {
		return m.PartialFailureError
	}
	return nil
}

func (m *MutateKeywordPlansResponse) GetResults() []*MutateKeywordPlansResult {
	if m != nil {
		return m.Results
	}
	return nil
}

// The result for the keyword plan mutate.
type MutateKeywordPlansResult struct {
	// Returned for successful operations.
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MutateKeywordPlansResult proto.InternalMessageInfo

func (m *MutateKeywordPlansResult) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

// Request message for [KeywordPlanService.GenerateForecastMetrics][google.ads.googleads.v3.services.KeywordPlanService.GenerateForecastMetrics].
type GenerateForecastMetricsRequest struct {
	// Required. The resource name of the keyword plan to be forecasted.
	KeywordPlan          string   `protobuf:"bytes,1,opt,name=keyword_plan,json=keywordPlan,proto3" json:"keyword_plan,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GenerateForecastMetricsRequest proto.InternalMessageInfo

func (m *GenerateForecastMetricsRequest) GetKeywordPlan() string {
	if m != nil {
		return m.KeywordPlan
	}
	return ""
}

// Response message for [KeywordPlanService.GenerateForecastMetrics][google.ads.googleads.v3.services.KeywordPlanService.GenerateForecastMetrics].
type GenerateForecastMetricsResponse struct {
	// List of campaign forecasts.
	// One maximum.
	CampaignForecasts []*KeywordPlanCampaignForecast `protobuf:"bytes,1,rep,name=campaign_forecasts,json=campaignForecasts,proto3" json:"campaign_forecasts,omitempty"`
	// List of ad group forecasts.
	AdGroupForecasts []*KeywordPlanAdGroupForecast `protobuf:"bytes,2,rep,name=ad_group_forecasts,json=adGroupForecasts,proto3" json:"ad_group_forecasts,omitempty"`
	// List of keyword forecasts.
	KeywordForecasts     []*KeywordPlanKeywordForecast `protobuf:"bytes,3,rep,name=keyword_forecasts,json=keywordForecasts,proto3" json:"keyword_forecasts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_GenerateForecastMetricsResponse proto.InternalMessageInfo

func (m *GenerateForecastMetricsResponse) GetCampaignForecasts() []*KeywordPlanCampaignForecast {
	if m != nil {
		return m.CampaignForecasts
	}
	return nil
}

func (m *GenerateForecastMetricsResponse) GetAdGroupForecasts() []*KeywordPlanAdGroupForecast {
	if m != nil {
		return m.AdGroupForecasts
	}
	return nil
}

func (m *GenerateForecastMetricsResponse) GetKeywordForecasts() []*KeywordPlanKeywordForecast {
	if m != nil {
		return m.KeywordForecasts
	}
	return nil
}

// A campaign forecast.
type KeywordPlanCampaignForecast struct {
	// The resource name of the Keyword Plan campaign related to the forecast.
	//
	// `customers/{customer_id}/keywordPlanCampaigns/{keyword+plan_campaign_id}`
	KeywordPlanCampaign *wrappers.StringValue `protobuf:"bytes,1,opt,name=keyword_plan_campaign,json=keywordPlanCampaign,proto3" json:"keyword_plan_campaign,omitempty"`
	// The forecast for the Keyword Plan campaign.
	CampaignForecast     *ForecastMetrics `protobuf:"bytes,2,opt,name=campaign_forecast,json=campaignForecast,proto3" json:"campaign_forecast,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *KeywordPlanCampaignForecast) Reset()         { *m = KeywordPlanCampaignForecast{} }
func (m *KeywordPlanCampaignForecast) String() string { return proto.CompactTextString(m) }
func (*KeywordPlanCampaignForecast) ProtoMessage()    {}
func (*KeywordPlanCampaignForecast) Descriptor() ([]byte, []int) {
	return fileDescriptor_512873c5d5249363, []int{7}
}

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

var xxx_messageInfo_KeywordPlanCampaignForecast proto.InternalMessageInfo

func (m *KeywordPlanCampaignForecast) GetKeywordPlanCampaign() *wrappers.StringValue {
	if m != nil {
		return m.KeywordPlanCampaign
	}
	return nil
}

func (m *KeywordPlanCampaignForecast) GetCampaignForecast() *ForecastMetrics {
	if m != nil {
		return m.CampaignForecast
	}
	return nil
}

// An ad group forecast.
type KeywordPlanAdGroupForecast struct {
	// The resource name of the Keyword Plan ad group related to the forecast.
	//
	// `customers/{customer_id}/keywordPlanAdGroups/{keyword_plan_ad_group_id}`
	KeywordPlanAdGroup *wrappers.StringValue `protobuf:"bytes,1,opt,name=keyword_plan_ad_group,json=keywordPlanAdGroup,proto3" json:"keyword_plan_ad_group,omitempty"`
	// The forecast for the Keyword Plan ad group.
	AdGroupForecast      *ForecastMetrics `protobuf:"bytes,2,opt,name=ad_group_forecast,json=adGroupForecast,proto3" json:"ad_group_forecast,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *KeywordPlanAdGroupForecast) Reset()         { *m = KeywordPlanAdGroupForecast{} }
func (m *KeywordPlanAdGroupForecast) String() string { return proto.CompactTextString(m) }
func (*KeywordPlanAdGroupForecast) ProtoMessage()    {}
func (*KeywordPlanAdGroupForecast) Descriptor() ([]byte, []int) {
	return fileDescriptor_512873c5d5249363, []int{8}
}

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

var xxx_messageInfo_KeywordPlanAdGroupForecast proto.InternalMessageInfo

func (m *KeywordPlanAdGroupForecast) GetKeywordPlanAdGroup() *wrappers.StringValue {
	if m != nil {
		return m.KeywordPlanAdGroup
	}
	return nil
}

func (m *KeywordPlanAdGroupForecast) GetAdGroupForecast() *ForecastMetrics {
	if m != nil {
		return m.AdGroupForecast
	}
	return nil
}

// A keyword forecast.
type KeywordPlanKeywordForecast struct {
	// The resource name of the Keyword Plan keyword related to the forecast.
	//
	// `customers/{customer_id}/keywordPlanAdGroupKeywords/{keyword_plan_ad_group_keyword_id}`
	KeywordPlanAdGroupKeyword *wrappers.StringValue `protobuf:"bytes,1,opt,name=keyword_plan_ad_group_keyword,json=keywordPlanAdGroupKeyword,proto3" json:"keyword_plan_ad_group_keyword,omitempty"`
	// The forecast for the Keyword Plan keyword.
	KeywordForecast      *ForecastMetrics `protobuf:"bytes,2,opt,name=keyword_forecast,json=keywordForecast,proto3" json:"keyword_forecast,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *KeywordPlanKeywordForecast) Reset()         { *m = KeywordPlanKeywordForecast{} }
func (m *KeywordPlanKeywordForecast) String() string { return proto.CompactTextString(m) }
func (*KeywordPlanKeywordForecast) ProtoMessage()    {}
func (*KeywordPlanKeywordForecast) Descriptor() ([]byte, []int) {
	return fileDescriptor_512873c5d5249363, []int{9}
}

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

var xxx_messageInfo_KeywordPlanKeywordForecast proto.InternalMessageInfo

func (m *KeywordPlanKeywordForecast) GetKeywordPlanAdGroupKeyword() *wrappers.StringValue {
	if m != nil {
		return m.KeywordPlanAdGroupKeyword
	}
	return nil
}

func (m *KeywordPlanKeywordForecast) GetKeywordForecast() *ForecastMetrics {
	if m != nil {
		return m.KeywordForecast
	}
	return nil
}

// Forecast metrics.
type ForecastMetrics struct {
	// Impressions
	Impressions *wrappers.DoubleValue `protobuf:"bytes,1,opt,name=impressions,proto3" json:"impressions,omitempty"`
	// Ctr
	Ctr *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=ctr,proto3" json:"ctr,omitempty"`
	// AVG cpc
	AverageCpc *wrappers.Int64Value `protobuf:"bytes,3,opt,name=average_cpc,json=averageCpc,proto3" json:"average_cpc,omitempty"`
	// Clicks
	Clicks *wrappers.DoubleValue `protobuf:"bytes,5,opt,name=clicks,proto3" json:"clicks,omitempty"`
	// Cost
	CostMicros           *wrappers.Int64Value `protobuf:"bytes,6,opt,name=cost_micros,json=costMicros,proto3" json:"cost_micros,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *ForecastMetrics) Reset()         { *m = ForecastMetrics{} }
func (m *ForecastMetrics) String() string { return proto.CompactTextString(m) }
func (*ForecastMetrics) ProtoMessage()    {}
func (*ForecastMetrics) Descriptor() ([]byte, []int) {
	return fileDescriptor_512873c5d5249363, []int{10}
}

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

var xxx_messageInfo_ForecastMetrics proto.InternalMessageInfo

func (m *ForecastMetrics) GetImpressions() *wrappers.DoubleValue {
	if m != nil {
		return m.Impressions
	}
	return nil
}

func (m *ForecastMetrics) GetCtr() *wrappers.DoubleValue {
	if m != nil {
		return m.Ctr
	}
	return nil
}

func (m *ForecastMetrics) GetAverageCpc() *wrappers.Int64Value {
	if m != nil {
		return m.AverageCpc
	}
	return nil
}

func (m *ForecastMetrics) GetClicks() *wrappers.DoubleValue {
	if m != nil {
		return m.Clicks
	}
	return nil
}

func (m *ForecastMetrics) GetCostMicros() *wrappers.Int64Value {
	if m != nil {
		return m.CostMicros
	}
	return nil
}

// Request message for [KeywordPlanService.GenerateHistoricalMetrics][google.ads.googleads.v3.services.KeywordPlanService.GenerateHistoricalMetrics].
type GenerateHistoricalMetricsRequest struct {
	// Required. The resource name of the keyword plan of which historical metrics are
	// requested.
	KeywordPlan          string   `protobuf:"bytes,1,opt,name=keyword_plan,json=keywordPlan,proto3" json:"keyword_plan,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GenerateHistoricalMetricsRequest) Reset()         { *m = GenerateHistoricalMetricsRequest{} }
func (m *GenerateHistoricalMetricsRequest) String() string { return proto.CompactTextString(m) }
func (*GenerateHistoricalMetricsRequest) ProtoMessage()    {}
func (*GenerateHistoricalMetricsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_512873c5d5249363, []int{11}
}

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

var xxx_messageInfo_GenerateHistoricalMetricsRequest proto.InternalMessageInfo

func (m *GenerateHistoricalMetricsRequest) GetKeywordPlan() string {
	if m != nil {
		return m.KeywordPlan
	}
	return ""
}

// Response message for [KeywordPlanService.GenerateHistoricalMetrics][google.ads.googleads.v3.services.KeywordPlanService.GenerateHistoricalMetrics].
type GenerateHistoricalMetricsResponse struct {
	// List of keyword historical metrics.
	Metrics              []*KeywordPlanKeywordHistoricalMetrics `protobuf:"bytes,1,rep,name=metrics,proto3" json:"metrics,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
	XXX_unrecognized     []byte                                 `json:"-"`
	XXX_sizecache        int32                                  `json:"-"`
}

func (m *GenerateHistoricalMetricsResponse) Reset()         { *m = GenerateHistoricalMetricsResponse{} }
func (m *GenerateHistoricalMetricsResponse) String() string { return proto.CompactTextString(m) }
func (*GenerateHistoricalMetricsResponse) ProtoMessage()    {}
func (*GenerateHistoricalMetricsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_512873c5d5249363, []int{12}
}

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

var xxx_messageInfo_GenerateHistoricalMetricsResponse proto.InternalMessageInfo

func (m *GenerateHistoricalMetricsResponse) GetMetrics() []*KeywordPlanKeywordHistoricalMetrics {
	if m != nil {
		return m.Metrics
	}
	return nil
}

// A keyword historical metrics.
type KeywordPlanKeywordHistoricalMetrics struct {
	// The text of the query associated with one or more ad_group_keywords in the
	// plan.
	//
	// Note that we de-dupe your keywords list, eliminating close variants before
	// returning the plan's keywords as text. For example, if your plan originally
	// contained the keywords 'car' and 'cars', the returned search query will
	// only contain 'car'.
	SearchQuery *wrappers.StringValue `protobuf:"bytes,1,opt,name=search_query,json=searchQuery,proto3" json:"search_query,omitempty"`
	// The historical metrics for the query associated with one or more
	// ad_group_keywords in the plan.
	KeywordMetrics       *common.KeywordPlanHistoricalMetrics `protobuf:"bytes,2,opt,name=keyword_metrics,json=keywordMetrics,proto3" json:"keyword_metrics,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

func (m *KeywordPlanKeywordHistoricalMetrics) Reset()         { *m = KeywordPlanKeywordHistoricalMetrics{} }
func (m *KeywordPlanKeywordHistoricalMetrics) String() string { return proto.CompactTextString(m) }
func (*KeywordPlanKeywordHistoricalMetrics) ProtoMessage()    {}
func (*KeywordPlanKeywordHistoricalMetrics) Descriptor() ([]byte, []int) {
	return fileDescriptor_512873c5d5249363, []int{13}
}

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

var xxx_messageInfo_KeywordPlanKeywordHistoricalMetrics proto.InternalMessageInfo

func (m *KeywordPlanKeywordHistoricalMetrics) GetSearchQuery() *wrappers.StringValue {
	if m != nil {
		return m.SearchQuery
	}
	return nil
}

func (m *KeywordPlanKeywordHistoricalMetrics) GetKeywordMetrics() *common.KeywordPlanHistoricalMetrics {
	if m != nil {
		return m.KeywordMetrics
	}
	return nil
}

func init() {
	proto.RegisterType((*GetKeywordPlanRequest)(nil), "google.ads.googleads.v3.services.GetKeywordPlanRequest")
	proto.RegisterType((*MutateKeywordPlansRequest)(nil), "google.ads.googleads.v3.services.MutateKeywordPlansRequest")
	proto.RegisterType((*KeywordPlanOperation)(nil), "google.ads.googleads.v3.services.KeywordPlanOperation")
	proto.RegisterType((*MutateKeywordPlansResponse)(nil), "google.ads.googleads.v3.services.MutateKeywordPlansResponse")
	proto.RegisterType((*MutateKeywordPlansResult)(nil), "google.ads.googleads.v3.services.MutateKeywordPlansResult")
	proto.RegisterType((*GenerateForecastMetricsRequest)(nil), "google.ads.googleads.v3.services.GenerateForecastMetricsRequest")
	proto.RegisterType((*GenerateForecastMetricsResponse)(nil), "google.ads.googleads.v3.services.GenerateForecastMetricsResponse")
	proto.RegisterType((*KeywordPlanCampaignForecast)(nil), "google.ads.googleads.v3.services.KeywordPlanCampaignForecast")
	proto.RegisterType((*KeywordPlanAdGroupForecast)(nil), "google.ads.googleads.v3.services.KeywordPlanAdGroupForecast")
	proto.RegisterType((*KeywordPlanKeywordForecast)(nil), "google.ads.googleads.v3.services.KeywordPlanKeywordForecast")
	proto.RegisterType((*ForecastMetrics)(nil), "google.ads.googleads.v3.services.ForecastMetrics")
	proto.RegisterType((*GenerateHistoricalMetricsRequest)(nil), "google.ads.googleads.v3.services.GenerateHistoricalMetricsRequest")
	proto.RegisterType((*GenerateHistoricalMetricsResponse)(nil), "google.ads.googleads.v3.services.GenerateHistoricalMetricsResponse")
	proto.RegisterType((*KeywordPlanKeywordHistoricalMetrics)(nil), "google.ads.googleads.v3.services.KeywordPlanKeywordHistoricalMetrics")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/services/keyword_plan_service.proto", fileDescriptor_512873c5d5249363)
}

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// KeywordPlanServiceClient is the client API for KeywordPlanService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type KeywordPlanServiceClient interface {
	// Returns the requested plan in full detail.
	GetKeywordPlan(ctx context.Context, in *GetKeywordPlanRequest, opts ...grpc.CallOption) (*resources.KeywordPlan, error)
	// Creates, updates, or removes keyword plans. Operation statuses are
	// returned.
	MutateKeywordPlans(ctx context.Context, in *MutateKeywordPlansRequest, opts ...grpc.CallOption) (*MutateKeywordPlansResponse, error)
	// Returns the requested Keyword Plan forecasts.
	GenerateForecastMetrics(ctx context.Context, in *GenerateForecastMetricsRequest, opts ...grpc.CallOption) (*GenerateForecastMetricsResponse, error)
	// Returns the requested Keyword Plan historical metrics.
	GenerateHistoricalMetrics(ctx context.Context, in *GenerateHistoricalMetricsRequest, opts ...grpc.CallOption) (*GenerateHistoricalMetricsResponse, error)
}

type keywordPlanServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewKeywordPlanServiceClient(cc grpc.ClientConnInterface) KeywordPlanServiceClient {
	return &keywordPlanServiceClient{cc}
}

func (c *keywordPlanServiceClient) GetKeywordPlan(ctx context.Context, in *GetKeywordPlanRequest, opts ...grpc.CallOption) (*resources.KeywordPlan, error) {
	out := new(resources.KeywordPlan)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanService/GetKeywordPlan", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *keywordPlanServiceClient) MutateKeywordPlans(ctx context.Context, in *MutateKeywordPlansRequest, opts ...grpc.CallOption) (*MutateKeywordPlansResponse, error) {
	out := new(MutateKeywordPlansResponse)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanService/MutateKeywordPlans", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *keywordPlanServiceClient) GenerateForecastMetrics(ctx context.Context, in *GenerateForecastMetricsRequest, opts ...grpc.CallOption) (*GenerateForecastMetricsResponse, error) {
	out := new(GenerateForecastMetricsResponse)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanService/GenerateForecastMetrics", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *keywordPlanServiceClient) GenerateHistoricalMetrics(ctx context.Context, in *GenerateHistoricalMetricsRequest, opts ...grpc.CallOption) (*GenerateHistoricalMetricsResponse, error) {
	out := new(GenerateHistoricalMetricsResponse)
	err := c.cc.Invoke(ctx, "/google.ads.googleads.v3.services.KeywordPlanService/GenerateHistoricalMetrics", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// KeywordPlanServiceServer is the server API for KeywordPlanService service.
type KeywordPlanServiceServer interface {
	// Returns the requested plan in full detail.
	GetKeywordPlan(context.Context, *GetKeywordPlanRequest) (*resources.KeywordPlan, error)
	// Creates, updates, or removes keyword plans. Operation statuses are
	// returned.
	MutateKeywordPlans(context.Context, *MutateKeywordPlansRequest) (*MutateKeywordPlansResponse, error)
	// Returns the requested Keyword Plan forecasts.
	GenerateForecastMetrics(context.Context, *GenerateForecastMetricsRequest) (*GenerateForecastMetricsResponse, error)
	// Returns the requested Keyword Plan historical metrics.
	GenerateHistoricalMetrics(context.Context, *GenerateHistoricalMetricsRequest) (*GenerateHistoricalMetricsResponse, error)
}

// UnimplementedKeywordPlanServiceServer can be embedded to have forward compatible implementations.
type UnimplementedKeywordPlanServiceServer struct {
}

func (*UnimplementedKeywordPlanServiceServer) GetKeywordPlan(ctx context.Context, req *GetKeywordPlanRequest) (*resources.KeywordPlan, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetKeywordPlan not implemented")
}
func (*UnimplementedKeywordPlanServiceServer) MutateKeywordPlans(ctx context.Context, req *MutateKeywordPlansRequest) (*MutateKeywordPlansResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method MutateKeywordPlans not implemented")
}
func (*UnimplementedKeywordPlanServiceServer) GenerateForecastMetrics(ctx context.Context, req *GenerateForecastMetricsRequest) (*GenerateForecastMetricsResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GenerateForecastMetrics not implemented")
}
func (*UnimplementedKeywordPlanServiceServer) GenerateHistoricalMetrics(ctx context.Context, req *GenerateHistoricalMetricsRequest) (*GenerateHistoricalMetricsResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GenerateHistoricalMetrics not implemented")
}

func RegisterKeywordPlanServiceServer(s *grpc.Server, srv KeywordPlanServiceServer) {
	s.RegisterService(&_KeywordPlanService_serviceDesc, srv)
}

func _KeywordPlanService_GetKeywordPlan_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetKeywordPlanRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(KeywordPlanServiceServer).GetKeywordPlan(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanService/GetKeywordPlan",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(KeywordPlanServiceServer).GetKeywordPlan(ctx, req.(*GetKeywordPlanRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _KeywordPlanService_MutateKeywordPlans_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(MutateKeywordPlansRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(KeywordPlanServiceServer).MutateKeywordPlans(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanService/MutateKeywordPlans",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(KeywordPlanServiceServer).MutateKeywordPlans(ctx, req.(*MutateKeywordPlansRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _KeywordPlanService_GenerateForecastMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GenerateForecastMetricsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(KeywordPlanServiceServer).GenerateForecastMetrics(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanService/GenerateForecastMetrics",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(KeywordPlanServiceServer).GenerateForecastMetrics(ctx, req.(*GenerateForecastMetricsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _KeywordPlanService_GenerateHistoricalMetrics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GenerateHistoricalMetricsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(KeywordPlanServiceServer).GenerateHistoricalMetrics(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.ads.googleads.v3.services.KeywordPlanService/GenerateHistoricalMetrics",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(KeywordPlanServiceServer).GenerateHistoricalMetrics(ctx, req.(*GenerateHistoricalMetricsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _KeywordPlanService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.ads.googleads.v3.services.KeywordPlanService",
	HandlerType: (*KeywordPlanServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GetKeywordPlan",
			Handler:    _KeywordPlanService_GetKeywordPlan_Handler,
		},
		{
			MethodName: "MutateKeywordPlans",
			Handler:    _KeywordPlanService_MutateKeywordPlans_Handler,
		},
		{
			MethodName: "GenerateForecastMetrics",
			Handler:    _KeywordPlanService_GenerateForecastMetrics_Handler,
		},
		{
			MethodName: "GenerateHistoricalMetrics",
			Handler:    _KeywordPlanService_GenerateHistoricalMetrics_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/ads/googleads/v3/services/keyword_plan_service.proto",
}
