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

package enums

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

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

// Enum describing possible bid modifier sources.
type BidModifierSourceEnum_BidModifierSource int32

const (
	// Not specified.
	BidModifierSourceEnum_UNSPECIFIED BidModifierSourceEnum_BidModifierSource = 0
	// Used for return value only. Represents value unknown in this version.
	BidModifierSourceEnum_UNKNOWN BidModifierSourceEnum_BidModifierSource = 1
	// The bid modifier is specified at the campaign level, on the campaign
	// level criterion.
	BidModifierSourceEnum_CAMPAIGN BidModifierSourceEnum_BidModifierSource = 2
	// The bid modifier is specified (overridden) at the ad group level.
	BidModifierSourceEnum_AD_GROUP BidModifierSourceEnum_BidModifierSource = 3
)

var BidModifierSourceEnum_BidModifierSource_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "CAMPAIGN",
	3: "AD_GROUP",
}

var BidModifierSourceEnum_BidModifierSource_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"CAMPAIGN":    2,
	"AD_GROUP":    3,
}

func (x BidModifierSourceEnum_BidModifierSource) String() string {
	return proto.EnumName(BidModifierSourceEnum_BidModifierSource_name, int32(x))
}

func (BidModifierSourceEnum_BidModifierSource) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c0b718d07dc79201, []int{0, 0}
}

// Container for enum describing possible bid modifier sources.
type BidModifierSourceEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BidModifierSourceEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.BidModifierSourceEnum_BidModifierSource", BidModifierSourceEnum_BidModifierSource_name, BidModifierSourceEnum_BidModifierSource_value)
	proto.RegisterType((*BidModifierSourceEnum)(nil), "google.ads.googleads.v3.enums.BidModifierSourceEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/bid_modifier_source.proto", fileDescriptor_c0b718d07dc79201)
}

var fileDescriptor_c0b718d07dc79201 = []byte{
	// 307 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
	0x1c, 0x76, 0x1d, 0xa8, 0x64, 0x82, 0xb5, 0xa0, 0x07, 0x71, 0x87, 0xed, 0x01, 0x92, 0x43, 0x0e,
	0x42, 0x3c, 0xa5, 0xdb, 0x2c, 0x43, 0xd6, 0x15, 0xc7, 0x26, 0x48, 0x61, 0x74, 0x4b, 0x17, 0x02,
	0x6b, 0x52, 0x9a, 0x76, 0x0f, 0xe4, 0xd1, 0x47, 0xf1, 0x51, 0xf4, 0x25, 0xa4, 0xc9, 0xda, 0xcb,
	0xd0, 0x4b, 0xf8, 0x92, 0xef, 0x4f, 0xbe, 0xdf, 0x0f, 0x3c, 0x72, 0xa5, 0xf8, 0x3e, 0x45, 0x09,
	0xd3, 0xc8, 0xc2, 0x1a, 0x1d, 0x30, 0x4a, 0x65, 0x95, 0x69, 0xb4, 0x11, 0x6c, 0x9d, 0x29, 0x26,
	0x76, 0x22, 0x2d, 0xd6, 0x5a, 0x55, 0xc5, 0x36, 0x85, 0x79, 0xa1, 0x4a, 0xe5, 0xf5, 0xad, 0x1a,
	0x26, 0x4c, 0xc3, 0xd6, 0x08, 0x0f, 0x18, 0x1a, 0xe3, 0xfd, 0x43, 0x93, 0x9b, 0x0b, 0x94, 0x48,
	0xa9, 0xca, 0xa4, 0x14, 0x4a, 0x6a, 0x6b, 0x1e, 0xee, 0xc0, 0xad, 0x2f, 0xd8, 0xec, 0x18, 0xbc,
	0x30, 0xb9, 0x13, 0x59, 0x65, 0xc3, 0x19, 0xb8, 0x39, 0x21, 0xbc, 0x6b, 0xd0, 0x5b, 0x86, 0x8b,
	0x68, 0x32, 0x9a, 0x3e, 0x4f, 0x27, 0x63, 0xf7, 0xcc, 0xeb, 0x81, 0x8b, 0x65, 0xf8, 0x12, 0xce,
	0xdf, 0x42, 0xb7, 0xe3, 0x5d, 0x81, 0xcb, 0x11, 0x9d, 0x45, 0x74, 0x1a, 0x84, 0xae, 0x53, 0xdf,
	0xe8, 0x78, 0x1d, 0xbc, 0xce, 0x97, 0x91, 0xdb, 0xf5, 0x7f, 0x3a, 0x60, 0xb0, 0x55, 0x19, 0xfc,
	0xb7, 0xab, 0x7f, 0x77, 0xf2, 0x65, 0x54, 0xb7, 0x8c, 0x3a, 0xef, 0xfe, 0xd1, 0xc8, 0xd5, 0x3e,
	0x91, 0x1c, 0xaa, 0x82, 0x23, 0x9e, 0x4a, 0x33, 0x43, 0xb3, 0xad, 0x5c, 0xe8, 0x3f, 0x96, 0xf7,
	0x64, 0xce, 0x0f, 0xa7, 0x1b, 0x50, 0xfa, 0xe9, 0xf4, 0x03, 0x1b, 0x45, 0x99, 0x86, 0x16, 0xd6,
	0x68, 0x85, 0x61, 0x3d, 0xb7, 0xfe, 0x6a, 0xf8, 0x98, 0x32, 0x1d, 0xb7, 0x7c, 0xbc, 0xc2, 0xb1,
	0xe1, 0xbf, 0x9d, 0x81, 0x7d, 0x24, 0x84, 0x32, 0x4d, 0x48, 0xab, 0x20, 0x64, 0x85, 0x09, 0x31,
	0x9a, 0xcd, 0xb9, 0x29, 0x86, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xa0, 0xda, 0xa4, 0xcb, 0xd4,
	0x01, 0x00, 0x00,
}
