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

package resources

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

// A gender view.
type GenderView struct {
	// The resource name of the gender view.
	// Gender view resource names have the form:
	//
	// `customers/{customer_id}/genderViews/{ad_group_id}~{criterion_id}`
	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 *GenderView) Reset()         { *m = GenderView{} }
func (m *GenderView) String() string { return proto.CompactTextString(m) }
func (*GenderView) ProtoMessage()    {}
func (*GenderView) Descriptor() ([]byte, []int) {
	return fileDescriptor_374a728b177a8cfa, []int{0}
}

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

var xxx_messageInfo_GenderView proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*GenderView)(nil), "google.ads.googleads.v3.resources.GenderView")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/resources/gender_view.proto", fileDescriptor_374a728b177a8cfa)
}

var fileDescriptor_374a728b177a8cfa = []byte{
	// 310 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0xc1, 0x4a, 0x33, 0x31,
	0x14, 0x85, 0x99, 0xfe, 0xf0, 0x83, 0x41, 0x11, 0xba, 0xd2, 0xe2, 0xc2, 0x5a, 0x0a, 0xae, 0x92,
	0x45, 0x76, 0x71, 0x95, 0x6e, 0x0a, 0x2e, 0xa4, 0x14, 0x1c, 0x44, 0x06, 0x4a, 0x9c, 0x84, 0x30,
	0xd0, 0xc9, 0x2d, 0xb9, 0xd3, 0x76, 0x51, 0xfa, 0x04, 0xbe, 0x85, 0x4b, 0x1f, 0xc5, 0x47, 0xe9,
	0x33, 0xb8, 0x90, 0x69, 0x9a, 0xb4, 0x2b, 0xdd, 0x1d, 0x72, 0xbf, 0x73, 0xee, 0x3d, 0x21, 0xdc,
	0x02, 0xd8, 0xb9, 0x61, 0x4a, 0x23, 0x0b, 0xb2, 0x55, 0x2b, 0xce, 0xbc, 0x41, 0x58, 0xfa, 0xd2,
	0x20, 0xb3, 0xc6, 0x69, 0xe3, 0x67, 0xab, 0xca, 0xac, 0xe9, 0xc2, 0x43, 0x03, 0xdd, 0x7e, 0x20,
	0xa9, 0xd2, 0x48, 0x93, 0x89, 0xae, 0x38, 0x4d, 0xa6, 0xde, 0x75, 0xcc, 0x5d, 0x54, 0x29, 0x2a,
	0xb8, 0x7b, 0x37, 0x27, 0x23, 0xe5, 0x1c, 0x34, 0xaa, 0xa9, 0xc0, 0x61, 0x98, 0xde, 0xbd, 0x67,
	0x84, 0x8c, 0xf7, 0x1b, 0xf3, 0xca, 0xac, 0xbb, 0x03, 0x72, 0x11, 0xed, 0x33, 0xa7, 0x6a, 0x73,
	0x95, 0xdd, 0x66, 0xf7, 0x67, 0xd3, 0xf3, 0xf8, 0xf8, 0xa4, 0x6a, 0x23, 0x5e, 0x76, 0xf2, 0x99,
	0x0c, 0x8e, 0x97, 0x1c, 0xd4, 0xa2, 0x42, 0x5a, 0x42, 0xcd, 0x4e, 0xe2, 0x68, 0xb9, 0xc4, 0x06,
	0x6a, 0xe3, 0x91, 0x6d, 0xa2, 0xdc, 0x1e, 0x1a, 0xb6, 0x00, 0xb2, 0xcd, 0x49, 0xdd, 0xed, 0xe8,
	0x3b, 0x23, 0xc3, 0x12, 0x6a, 0xfa, 0x67, 0xe1, 0xd1, 0xe5, 0x71, 0xcb, 0xa4, 0x2d, 0x32, 0xc9,
	0x5e, 0x1f, 0x0f, 0x2e, 0x0b, 0x73, 0xe5, 0x2c, 0x05, 0x6f, 0xdb, 0x4d, 0xfb, 0x9a, 0xec, 0x78,
	0xe2, 0x2f, 0x5f, 0xff, 0x90, 0xd4, 0x47, 0xe7, 0xdf, 0x58, 0xca, 0xcf, 0x4e, 0x7f, 0x1c, 0x22,
	0xa5, 0x46, 0x1a, 0x64, 0xab, 0x72, 0x4e, 0xa7, 0x91, 0xfc, 0x8a, 0x4c, 0x21, 0x35, 0x16, 0x89,
	0x29, 0x72, 0x5e, 0x24, 0x66, 0xd7, 0x19, 0x86, 0x81, 0x10, 0x52, 0xa3, 0x10, 0x89, 0x12, 0x22,
	0xe7, 0x42, 0x24, 0xee, 0xed, 0xff, 0xfe, 0x58, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0xcc, 0xc5,
	0x56, 0x57, 0x26, 0x02, 0x00, 0x00,
}
