// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/income_range_type.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

// The type of demographic income ranges (e.g. between 0% to 50%).
type IncomeRangeTypeEnum_IncomeRangeType int32

const (
	// Not specified.
	IncomeRangeTypeEnum_UNSPECIFIED IncomeRangeTypeEnum_IncomeRangeType = 0
	// Used for return value only. Represents value unknown in this version.
	IncomeRangeTypeEnum_UNKNOWN IncomeRangeTypeEnum_IncomeRangeType = 1
	// 0%-50%.
	IncomeRangeTypeEnum_INCOME_RANGE_0_50 IncomeRangeTypeEnum_IncomeRangeType = 510001
	// 50% to 60%.
	IncomeRangeTypeEnum_INCOME_RANGE_50_60 IncomeRangeTypeEnum_IncomeRangeType = 510002
	// 60% to 70%.
	IncomeRangeTypeEnum_INCOME_RANGE_60_70 IncomeRangeTypeEnum_IncomeRangeType = 510003
	// 70% to 80%.
	IncomeRangeTypeEnum_INCOME_RANGE_70_80 IncomeRangeTypeEnum_IncomeRangeType = 510004
	// 80% to 90%.
	IncomeRangeTypeEnum_INCOME_RANGE_80_90 IncomeRangeTypeEnum_IncomeRangeType = 510005
	// Greater than 90%.
	IncomeRangeTypeEnum_INCOME_RANGE_90_UP IncomeRangeTypeEnum_IncomeRangeType = 510006
	// Undetermined income range.
	IncomeRangeTypeEnum_INCOME_RANGE_UNDETERMINED IncomeRangeTypeEnum_IncomeRangeType = 510000
)

var IncomeRangeTypeEnum_IncomeRangeType_name = map[int32]string{
	0:      "UNSPECIFIED",
	1:      "UNKNOWN",
	510001: "INCOME_RANGE_0_50",
	510002: "INCOME_RANGE_50_60",
	510003: "INCOME_RANGE_60_70",
	510004: "INCOME_RANGE_70_80",
	510005: "INCOME_RANGE_80_90",
	510006: "INCOME_RANGE_90_UP",
	510000: "INCOME_RANGE_UNDETERMINED",
}

var IncomeRangeTypeEnum_IncomeRangeType_value = map[string]int32{
	"UNSPECIFIED":               0,
	"UNKNOWN":                   1,
	"INCOME_RANGE_0_50":         510001,
	"INCOME_RANGE_50_60":        510002,
	"INCOME_RANGE_60_70":        510003,
	"INCOME_RANGE_70_80":        510004,
	"INCOME_RANGE_80_90":        510005,
	"INCOME_RANGE_90_UP":        510006,
	"INCOME_RANGE_UNDETERMINED": 510000,
}

func (x IncomeRangeTypeEnum_IncomeRangeType) String() string {
	return proto.EnumName(IncomeRangeTypeEnum_IncomeRangeType_name, int32(x))
}

func (IncomeRangeTypeEnum_IncomeRangeType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_bf3d5076be1ea19c, []int{0, 0}
}

// Container for enum describing the type of demographic income ranges.
type IncomeRangeTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_IncomeRangeTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.IncomeRangeTypeEnum_IncomeRangeType", IncomeRangeTypeEnum_IncomeRangeType_name, IncomeRangeTypeEnum_IncomeRangeType_value)
	proto.RegisterType((*IncomeRangeTypeEnum)(nil), "google.ads.googleads.v3.enums.IncomeRangeTypeEnum")
}

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

var fileDescriptor_bf3d5076be1ea19c = []byte{
	// 384 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0xdb, 0xaa, 0xd3, 0x40,
	0x18, 0x85, 0x4d, 0x04, 0x85, 0xd9, 0x17, 0x7b, 0x8c, 0x82, 0x07, 0xdc, 0x84, 0xf6, 0x01, 0x26,
	0x03, 0xa1, 0xa7, 0xf1, 0x2a, 0x6d, 0xc7, 0x12, 0xa4, 0xd3, 0x50, 0x9b, 0x0a, 0x12, 0x18, 0x62,
	0x13, 0x42, 0xa0, 0x99, 0x09, 0x9d, 0xb4, 0xd0, 0x6b, 0x5f, 0xa0, 0xcf, 0xe0, 0xa5, 0x57, 0x9e,
	0x1f, 0xc2, 0x37, 0x51, 0x5f, 0x42, 0x92, 0xd8, 0x42, 0x4b, 0xdc, 0x37, 0xc3, 0xe2, 0xff, 0xfe,
	0xb5, 0x18, 0xd6, 0x0f, 0x3a, 0x89, 0x94, 0xc9, 0x3a, 0xb6, 0xc2, 0x48, 0x59, 0xb5, 0x2c, 0xd5,
	0xce, 0xb6, 0x62, 0xb1, 0xcd, 0x94, 0x95, 0x8a, 0x95, 0xcc, 0x62, 0xbe, 0x09, 0x45, 0x12, 0xf3,
	0x62, 0x9f, 0xc7, 0x28, 0xdf, 0xc8, 0x42, 0x1a, 0x37, 0xf5, 0x2e, 0x0a, 0x23, 0x85, 0x4e, 0x36,
	0xb4, 0xb3, 0x51, 0x65, 0x7b, 0xf6, 0xfc, 0x98, 0x9a, 0xa7, 0x56, 0x28, 0x84, 0x2c, 0xc2, 0x22,
	0x95, 0x42, 0xd5, 0xe6, 0xf6, 0x7b, 0x1d, 0x3c, 0x74, 0xab, 0xe0, 0x79, 0x99, 0xbb, 0xd8, 0xe7,
	0x31, 0x15, 0xdb, 0xac, 0xfd, 0x47, 0x03, 0xd7, 0x17, 0x73, 0xe3, 0x1a, 0x5c, 0xf9, 0xec, 0xb5,
	0x47, 0x47, 0xee, 0x4b, 0x97, 0x8e, 0xe1, 0x1d, 0xe3, 0x0a, 0xdc, 0xf7, 0xd9, 0x2b, 0x36, 0x7b,
	0xc3, 0xa0, 0x66, 0x3c, 0x06, 0x0f, 0x5c, 0x36, 0x9a, 0x4d, 0x29, 0x9f, 0x3b, 0x6c, 0x42, 0x39,
	0xe6, 0x1d, 0x0c, 0x3f, 0x1f, 0x4c, 0xe3, 0x09, 0x30, 0xce, 0x40, 0x07, 0xf3, 0x2e, 0x86, 0x5f,
	0x1a, 0x48, 0x17, 0xf3, 0x1e, 0x86, 0x5f, 0x1b, 0x48, 0x0f, 0xf3, 0x3e, 0x86, 0xdf, 0x1a, 0x48,
	0x1f, 0xf3, 0x01, 0x86, 0xdf, 0x1b, 0xc8, 0x00, 0x73, 0xdf, 0x83, 0x3f, 0x0e, 0xa6, 0x61, 0x82,
	0xa7, 0x67, 0xc4, 0x67, 0x63, 0xba, 0xa0, 0xf3, 0xa9, 0xcb, 0xe8, 0x18, 0x7e, 0x3a, 0x98, 0xc3,
	0x5f, 0x1a, 0x68, 0xad, 0x64, 0x86, 0x6e, 0x6d, 0x72, 0xf8, 0xe8, 0xa2, 0x10, 0xaf, 0x6c, 0xd0,
	0xd3, 0xde, 0x0e, 0xff, 0xd9, 0x12, 0xb9, 0x0e, 0x45, 0x82, 0xe4, 0x26, 0xb1, 0x92, 0x58, 0x54,
	0xfd, 0x1e, 0xef, 0x98, 0xa7, 0xea, 0x3f, 0x67, 0x7d, 0x51, 0xbd, 0x1f, 0xf4, 0xbb, 0x13, 0xc7,
	0xf9, 0xa8, 0xdf, 0x4c, 0xea, 0x28, 0x27, 0x52, 0xa8, 0x96, 0xa5, 0x5a, 0xda, 0xa8, 0x3c, 0x8a,
	0xfa, 0x79, 0xe4, 0x81, 0x13, 0xa9, 0xe0, 0xc4, 0x83, 0xa5, 0x1d, 0x54, 0xfc, 0xb7, 0xde, 0xaa,
	0x87, 0x84, 0x38, 0x91, 0x22, 0xe4, 0xb4, 0x41, 0xc8, 0xd2, 0x26, 0xa4, 0xda, 0x79, 0x77, 0xaf,
	0xfa, 0x98, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, 0xad, 0xd1, 0x51, 0xd6, 0x6e, 0x02, 0x00, 0x00,
}
