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

// Enum containing the possible UserInterestTaxonomyTypes.
type UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType int32

const (
	// Not specified.
	UserInterestTaxonomyTypeEnum_UNSPECIFIED UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 0
	// Used for return value only. Represents value unknown in this version.
	UserInterestTaxonomyTypeEnum_UNKNOWN UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 1
	// The affinity for this user interest.
	UserInterestTaxonomyTypeEnum_AFFINITY UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 2
	// The market for this user interest.
	UserInterestTaxonomyTypeEnum_IN_MARKET UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 3
	// Users known to have installed applications in the specified categories.
	UserInterestTaxonomyTypeEnum_MOBILE_APP_INSTALL_USER UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 4
	// The geographical location of the interest-based vertical.
	UserInterestTaxonomyTypeEnum_VERTICAL_GEO UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 5
	// User interest criteria for new smart phone users.
	UserInterestTaxonomyTypeEnum_NEW_SMART_PHONE_USER UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType = 6
)

var UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "AFFINITY",
	3: "IN_MARKET",
	4: "MOBILE_APP_INSTALL_USER",
	5: "VERTICAL_GEO",
	6: "NEW_SMART_PHONE_USER",
}

var UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_value = map[string]int32{
	"UNSPECIFIED":             0,
	"UNKNOWN":                 1,
	"AFFINITY":                2,
	"IN_MARKET":               3,
	"MOBILE_APP_INSTALL_USER": 4,
	"VERTICAL_GEO":            5,
	"NEW_SMART_PHONE_USER":    6,
}

func (x UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType) String() string {
	return proto.EnumName(UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_name, int32(x))
}

func (UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_75f124a452fd711d, []int{0, 0}
}

// Message describing a UserInterestTaxonomyType.
type UserInterestTaxonomyTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UserInterestTaxonomyTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType", UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_name, UserInterestTaxonomyTypeEnum_UserInterestTaxonomyType_value)
	proto.RegisterType((*UserInterestTaxonomyTypeEnum)(nil), "google.ads.googleads.v3.enums.UserInterestTaxonomyTypeEnum")
}

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

var fileDescriptor_75f124a452fd711d = []byte{
	// 386 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0x4d, 0x6e, 0xd4, 0x30,
	0x18, 0x25, 0x29, 0x14, 0x70, 0x8b, 0x88, 0x2c, 0x24, 0x2a, 0xe8, 0x2c, 0xda, 0x03, 0x38, 0x8b,
	0xec, 0xcc, 0x02, 0x39, 0xc5, 0x33, 0x58, 0xcd, 0x38, 0x51, 0xfe, 0x2a, 0x50, 0x24, 0x2b, 0x10,
	0x2b, 0x8a, 0xd4, 0xd8, 0x51, 0x9c, 0xa9, 0x98, 0xcb, 0xb0, 0x60, 0xc9, 0x25, 0xd8, 0x73, 0x14,
	0x96, 0x9c, 0x00, 0x25, 0x99, 0x99, 0xdd, 0xb0, 0xb1, 0x9e, 0xfc, 0x7e, 0x3e, 0xfb, 0x7d, 0xe0,
	0x7d, 0xad, 0x75, 0x7d, 0x2f, 0xdd, 0xb2, 0x32, 0xee, 0x0c, 0x47, 0xf4, 0xe0, 0xb9, 0x52, 0x6d,
	0x5a, 0xe3, 0x6e, 0x8c, 0xec, 0x45, 0xa3, 0x06, 0xd9, 0x4b, 0x33, 0x88, 0xa1, 0xfc, 0xa6, 0x95,
	0x6e, 0xb7, 0x62, 0xd8, 0x76, 0x12, 0x75, 0xbd, 0x1e, 0x34, 0x5c, 0xcc, 0x2e, 0x54, 0x56, 0x06,
	0x1d, 0x02, 0xd0, 0x83, 0x87, 0xa6, 0x80, 0x37, 0x97, 0xfb, 0xfc, 0xae, 0x71, 0x4b, 0xa5, 0xf4,
	0x50, 0x0e, 0x8d, 0x56, 0x66, 0x36, 0x5f, 0xff, 0xb2, 0xc0, 0x65, 0x66, 0x64, 0xcf, 0x76, 0x13,
	0xd2, 0xdd, 0x80, 0x74, 0xdb, 0x49, 0xaa, 0x36, 0xed, 0xf5, 0x77, 0x0b, 0x5c, 0x1c, 0x13, 0xc0,
	0x97, 0xe0, 0x2c, 0xe3, 0x49, 0x44, 0x6f, 0xd8, 0x92, 0xd1, 0x0f, 0xce, 0x23, 0x78, 0x06, 0x9e,
	0x66, 0xfc, 0x96, 0x87, 0x77, 0xdc, 0xb1, 0xe0, 0x39, 0x78, 0x46, 0x96, 0x4b, 0xc6, 0x59, 0xfa,
	0xc9, 0xb1, 0xe1, 0x0b, 0xf0, 0x9c, 0x71, 0xb1, 0x26, 0xf1, 0x2d, 0x4d, 0x9d, 0x13, 0xf8, 0x16,
	0xbc, 0x5e, 0x87, 0x3e, 0x0b, 0xa8, 0x20, 0x51, 0x24, 0x18, 0x4f, 0x52, 0x12, 0x04, 0x22, 0x4b,
	0x68, 0xec, 0x3c, 0x86, 0x0e, 0x38, 0xcf, 0x69, 0x9c, 0xb2, 0x1b, 0x12, 0x88, 0x15, 0x0d, 0x9d,
	0x27, 0xf0, 0x02, 0xbc, 0xe2, 0xf4, 0x4e, 0x24, 0x6b, 0x12, 0xa7, 0x22, 0xfa, 0x18, 0x72, 0x3a,
	0x6b, 0x4f, 0xfd, 0xbf, 0x16, 0xb8, 0xfa, 0xaa, 0x5b, 0xf4, 0xdf, 0x16, 0xfc, 0xc5, 0xb1, 0x3f,
	0x44, 0x63, 0x0d, 0x91, 0xf5, 0xd9, 0xdf, 0xf9, 0x6b, 0x7d, 0x5f, 0xaa, 0x1a, 0xe9, 0xbe, 0x76,
	0x6b, 0xa9, 0xa6, 0x92, 0xf6, 0x6b, 0xe9, 0x1a, 0x73, 0x64, 0x4b, 0xef, 0xa6, 0xf3, 0x87, 0x7d,
	0xb2, 0x22, 0xe4, 0xa7, 0xbd, 0x58, 0xcd, 0x51, 0xa4, 0x32, 0x68, 0x86, 0x23, 0xca, 0x3d, 0x34,
	0x16, 0x6a, 0x7e, 0xef, 0xf9, 0x82, 0x54, 0xa6, 0x38, 0xf0, 0x45, 0xee, 0x15, 0x13, 0xff, 0xc7,
	0xbe, 0x9a, 0x2f, 0x31, 0x26, 0x95, 0xc1, 0xf8, 0xa0, 0xc0, 0x38, 0xf7, 0x30, 0x9e, 0x34, 0x5f,
	0x4e, 0xa7, 0x87, 0x79, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x9d, 0x9d, 0x43, 0x8f, 0x3d, 0x02,
	0x00, 0x00,
}
