// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto

package recaptchaenterprise

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

	proto "github.com/golang/protobuf/proto"
	empty "github.com/golang/protobuf/ptypes/empty"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	field_mask "google.golang.org/genproto/protobuf/field_mask"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "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

// Enum that reprensents the types of annotations.
type AnnotateAssessmentRequest_Annotation int32

const (
	// Default unspecified type.
	AnnotateAssessmentRequest_ANNOTATION_UNSPECIFIED AnnotateAssessmentRequest_Annotation = 0
	// Provides information that the event turned out to be legitimate.
	AnnotateAssessmentRequest_LEGITIMATE AnnotateAssessmentRequest_Annotation = 1
	// Provides information that the event turned out to be fraudulent.
	AnnotateAssessmentRequest_FRAUDULENT AnnotateAssessmentRequest_Annotation = 2
)

var AnnotateAssessmentRequest_Annotation_name = map[int32]string{
	0: "ANNOTATION_UNSPECIFIED",
	1: "LEGITIMATE",
	2: "FRAUDULENT",
}

var AnnotateAssessmentRequest_Annotation_value = map[string]int32{
	"ANNOTATION_UNSPECIFIED": 0,
	"LEGITIMATE":             1,
	"FRAUDULENT":             2,
}

func (x AnnotateAssessmentRequest_Annotation) String() string {
	return proto.EnumName(AnnotateAssessmentRequest_Annotation_name, int32(x))
}

func (AnnotateAssessmentRequest_Annotation) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_72b3da91aae1398d, []int{1, 0}
}

// LINT.IfChange(classification_reason)
// Reasons contributing to the risk analysis verdict.
type Assessment_ClassificationReason int32

const (
	// Default unspecified type.
	Assessment_CLASSIFICATION_REASON_UNSPECIFIED Assessment_ClassificationReason = 0
	// Interactions matched the behavior of an automated agent.
	Assessment_AUTOMATION Assessment_ClassificationReason = 1
	// The event originated from an illegitimate environment.
	Assessment_UNEXPECTED_ENVIRONMENT Assessment_ClassificationReason = 2
	// Traffic volume from the event source is higher than normal.
	Assessment_TOO_MUCH_TRAFFIC Assessment_ClassificationReason = 3
	// Interactions with the site were significantly different than expected
	// patterns.
	Assessment_UNEXPECTED_USAGE_PATTERNS Assessment_ClassificationReason = 4
	// Too little traffic has been received from this site thus far to generate
	// quality risk analysis.
	Assessment_LOW_CONFIDENCE_SCORE Assessment_ClassificationReason = 5
)

var Assessment_ClassificationReason_name = map[int32]string{
	0: "CLASSIFICATION_REASON_UNSPECIFIED",
	1: "AUTOMATION",
	2: "UNEXPECTED_ENVIRONMENT",
	3: "TOO_MUCH_TRAFFIC",
	4: "UNEXPECTED_USAGE_PATTERNS",
	5: "LOW_CONFIDENCE_SCORE",
}

var Assessment_ClassificationReason_value = map[string]int32{
	"CLASSIFICATION_REASON_UNSPECIFIED": 0,
	"AUTOMATION":                        1,
	"UNEXPECTED_ENVIRONMENT":            2,
	"TOO_MUCH_TRAFFIC":                  3,
	"UNEXPECTED_USAGE_PATTERNS":         4,
	"LOW_CONFIDENCE_SCORE":              5,
}

func (x Assessment_ClassificationReason) String() string {
	return proto.EnumName(Assessment_ClassificationReason_name, int32(x))
}

func (Assessment_ClassificationReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_72b3da91aae1398d, []int{3, 0}
}

// LINT.IfChange
// Enum that represents the types of invalid token reasons.
type TokenProperties_InvalidReason int32

const (
	// Default unspecified type.
	TokenProperties_INVALID_REASON_UNSPECIFIED TokenProperties_InvalidReason = 0
	// If the failure reason was not accounted for.
	TokenProperties_UNKNOWN_INVALID_REASON TokenProperties_InvalidReason = 1
	// The provided user verification token was malformed.
	TokenProperties_MALFORMED TokenProperties_InvalidReason = 2
	// The user verification token had expired.
	TokenProperties_EXPIRED TokenProperties_InvalidReason = 3
	// The user verification had already been seen.
	TokenProperties_DUPE TokenProperties_InvalidReason = 4
	// The user verification token did not match the provided site key.
	// This may be a configuration error (e.g. development keys used in
	// production) or end users trying to use verification tokens from other
	// sites.
	TokenProperties_SITE_MISMATCH TokenProperties_InvalidReason = 5
	// The user verification token was not present.  It is a required input.
	TokenProperties_MISSING TokenProperties_InvalidReason = 6
)

var TokenProperties_InvalidReason_name = map[int32]string{
	0: "INVALID_REASON_UNSPECIFIED",
	1: "UNKNOWN_INVALID_REASON",
	2: "MALFORMED",
	3: "EXPIRED",
	4: "DUPE",
	5: "SITE_MISMATCH",
	6: "MISSING",
}

var TokenProperties_InvalidReason_value = map[string]int32{
	"INVALID_REASON_UNSPECIFIED": 0,
	"UNKNOWN_INVALID_REASON":     1,
	"MALFORMED":                  2,
	"EXPIRED":                    3,
	"DUPE":                       4,
	"SITE_MISMATCH":              5,
	"MISSING":                    6,
}

func (x TokenProperties_InvalidReason) String() string {
	return proto.EnumName(TokenProperties_InvalidReason_name, int32(x))
}

func (TokenProperties_InvalidReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_72b3da91aae1398d, []int{5, 0}
}

// Enum that represents the integration types for web keys.
type WebKeySettings_IntegrationType int32

const (
	// Default type that indicates this enum hasn't been specified. This is not
	// a valid IntegrationType, one of the other types must be specified
	// instead.
	WebKeySettings_INTEGRATION_TYPE_UNSPECIFIED WebKeySettings_IntegrationType = 0
	// Only used to produce scores. It doesn't display the "I'm not a robot"
	// checkbox and never shows captcha challenges.
	WebKeySettings_SCORE_ONLY WebKeySettings_IntegrationType = 1
	// Displays the "I'm not a robot" checkbox and may show captcha challenges
	// after it is checked.
	WebKeySettings_CHECKBOX_CHALLENGE WebKeySettings_IntegrationType = 2
	// Doesn't display the "I'm not a robot" checkbox, but may show captcha
	// challenges after risk analysis.
	WebKeySettings_INVISIBLE_CHALLENGE WebKeySettings_IntegrationType = 3
)

var WebKeySettings_IntegrationType_name = map[int32]string{
	0: "INTEGRATION_TYPE_UNSPECIFIED",
	1: "SCORE_ONLY",
	2: "CHECKBOX_CHALLENGE",
	3: "INVISIBLE_CHALLENGE",
}

var WebKeySettings_IntegrationType_value = map[string]int32{
	"INTEGRATION_TYPE_UNSPECIFIED": 0,
	"SCORE_ONLY":                   1,
	"CHECKBOX_CHALLENGE":           2,
	"INVISIBLE_CHALLENGE":          3,
}

func (x WebKeySettings_IntegrationType) String() string {
	return proto.EnumName(WebKeySettings_IntegrationType_name, int32(x))
}

func (WebKeySettings_IntegrationType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_72b3da91aae1398d, []int{13, 0}
}

// Enum that represents the possible challenge frequency and difficulty
// configurations for a web key.
type WebKeySettings_ChallengeSecurityPreference int32

const (
	// Default type that indicates this enum hasn't been specified.
	WebKeySettings_CHALLENGE_SECURITY_PREFERENCE_UNSPECIFIED WebKeySettings_ChallengeSecurityPreference = 0
	// Key tends to show fewer and easier challenges.
	WebKeySettings_USABILITY WebKeySettings_ChallengeSecurityPreference = 1
	// Key tends to show balanced (in amount and difficulty) challenges.
	WebKeySettings_BALANCED WebKeySettings_ChallengeSecurityPreference = 2
	// Key tends to show more and harder challenges.
	WebKeySettings_SECURITY WebKeySettings_ChallengeSecurityPreference = 3
)

var WebKeySettings_ChallengeSecurityPreference_name = map[int32]string{
	0: "CHALLENGE_SECURITY_PREFERENCE_UNSPECIFIED",
	1: "USABILITY",
	2: "BALANCED",
	3: "SECURITY",
}

var WebKeySettings_ChallengeSecurityPreference_value = map[string]int32{
	"CHALLENGE_SECURITY_PREFERENCE_UNSPECIFIED": 0,
	"USABILITY": 1,
	"BALANCED":  2,
	"SECURITY":  3,
}

func (x WebKeySettings_ChallengeSecurityPreference) String() string {
	return proto.EnumName(WebKeySettings_ChallengeSecurityPreference_name, int32(x))
}

func (WebKeySettings_ChallengeSecurityPreference) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_72b3da91aae1398d, []int{13, 1}
}

// The create assessment request message.
type CreateAssessmentRequest struct {
	// Required. The name of the project in which the assessment will be created,
	// in the format "projects/{project_number}".
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The assessment details.
	Assessment           *Assessment `protobuf:"bytes,2,opt,name=assessment,proto3" json:"assessment,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_CreateAssessmentRequest proto.InternalMessageInfo

func (m *CreateAssessmentRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateAssessmentRequest) GetAssessment() *Assessment {
	if m != nil {
		return m.Assessment
	}
	return nil
}

// The request message to annotate an Assessment.
type AnnotateAssessmentRequest struct {
	// Required. The resource name of the Assessment, in the format
	// "projects/{project_number}/assessments/{assessment_id}".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Required. The annotation that will be assigned to the Event.
	Annotation           AnnotateAssessmentRequest_Annotation `protobuf:"varint,2,opt,name=annotation,proto3,enum=google.cloud.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest_Annotation" json:"annotation,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

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

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

var xxx_messageInfo_AnnotateAssessmentRequest proto.InternalMessageInfo

func (m *AnnotateAssessmentRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *AnnotateAssessmentRequest) GetAnnotation() AnnotateAssessmentRequest_Annotation {
	if m != nil {
		return m.Annotation
	}
	return AnnotateAssessmentRequest_ANNOTATION_UNSPECIFIED
}

// Empty response for AnnotateAssessment.
type AnnotateAssessmentResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AnnotateAssessmentResponse proto.InternalMessageInfo

// A recaptcha assessment resource.
type Assessment struct {
	// Output only. The resource name for the Assessment in the format
	// "projects/{project_number}/assessments/{assessment_id}".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The event being assessed.
	Event *Event `protobuf:"bytes,2,opt,name=event,proto3" json:"event,omitempty"`
	// Output only. Legitimate event score from 0.0 to 1.0.
	// (1.0 means very likely legitimate traffic while 0.0 means very likely
	// non-legitimate traffic).
	Score float32 `protobuf:"fixed32,3,opt,name=score,proto3" json:"score,omitempty"`
	// Output only. Properties of the provided event token.
	TokenProperties *TokenProperties `protobuf:"bytes,4,opt,name=token_properties,json=tokenProperties,proto3" json:"token_properties,omitempty"`
	// Output only. Reasons contributing to the risk analysis verdict.
	Reasons              []Assessment_ClassificationReason `protobuf:"varint,5,rep,packed,name=reasons,proto3,enum=google.cloud.recaptchaenterprise.v1beta1.Assessment_ClassificationReason" json:"reasons,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

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

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

var xxx_messageInfo_Assessment proto.InternalMessageInfo

func (m *Assessment) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Assessment) GetEvent() *Event {
	if m != nil {
		return m.Event
	}
	return nil
}

func (m *Assessment) GetScore() float32 {
	if m != nil {
		return m.Score
	}
	return 0
}

func (m *Assessment) GetTokenProperties() *TokenProperties {
	if m != nil {
		return m.TokenProperties
	}
	return nil
}

func (m *Assessment) GetReasons() []Assessment_ClassificationReason {
	if m != nil {
		return m.Reasons
	}
	return nil
}

type Event struct {
	// Optional. The user response token provided by the reCAPTCHA client-side integration
	// on your site.
	Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
	// Optional. The site key that was used to invoke reCAPTCHA on your site and generate
	// the token.
	SiteKey string `protobuf:"bytes,2,opt,name=site_key,json=siteKey,proto3" json:"site_key,omitempty"`
	// Optional. The user agent present in the request from the user's device related to
	// this event.
	UserAgent string `protobuf:"bytes,3,opt,name=user_agent,json=userAgent,proto3" json:"user_agent,omitempty"`
	// Optional. The IP address in the request from the user's device related to this event.
	UserIpAddress string `protobuf:"bytes,4,opt,name=user_ip_address,json=userIpAddress,proto3" json:"user_ip_address,omitempty"`
	// Optional. The expected action for this type of event. This should be the same action
	// provided at token generation time on client-side platforms already
	// integrated with recaptcha enterprise.
	ExpectedAction       string   `protobuf:"bytes,5,opt,name=expected_action,json=expectedAction,proto3" json:"expected_action,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Event proto.InternalMessageInfo

func (m *Event) GetToken() string {
	if m != nil {
		return m.Token
	}
	return ""
}

func (m *Event) GetSiteKey() string {
	if m != nil {
		return m.SiteKey
	}
	return ""
}

func (m *Event) GetUserAgent() string {
	if m != nil {
		return m.UserAgent
	}
	return ""
}

func (m *Event) GetUserIpAddress() string {
	if m != nil {
		return m.UserIpAddress
	}
	return ""
}

func (m *Event) GetExpectedAction() string {
	if m != nil {
		return m.ExpectedAction
	}
	return ""
}

type TokenProperties struct {
	// Whether the provided user response token is valid.
	Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"`
	// Reason associated with the response when valid = false.
	InvalidReason TokenProperties_InvalidReason `protobuf:"varint,2,opt,name=invalid_reason,json=invalidReason,proto3,enum=google.cloud.recaptchaenterprise.v1beta1.TokenProperties_InvalidReason" json:"invalid_reason,omitempty"`
	// The timestamp corresponding to the generation of the token.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// The hostname of the page on which the token was generated.
	Hostname string `protobuf:"bytes,4,opt,name=hostname,proto3" json:"hostname,omitempty"`
	// Action name provided at token generation.
	Action               string   `protobuf:"bytes,5,opt,name=action,proto3" json:"action,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TokenProperties proto.InternalMessageInfo

func (m *TokenProperties) GetValid() bool {
	if m != nil {
		return m.Valid
	}
	return false
}

func (m *TokenProperties) GetInvalidReason() TokenProperties_InvalidReason {
	if m != nil {
		return m.InvalidReason
	}
	return TokenProperties_INVALID_REASON_UNSPECIFIED
}

func (m *TokenProperties) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *TokenProperties) GetHostname() string {
	if m != nil {
		return m.Hostname
	}
	return ""
}

func (m *TokenProperties) GetAction() string {
	if m != nil {
		return m.Action
	}
	return ""
}

// The create key request message.
type CreateKeyRequest struct {
	// Required. The name of the project in which the key will be created, in the
	// format "projects/{project_number}".
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. Information to create a reCAPTCHA Enterprise key.
	Key                  *Key     `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CreateKeyRequest proto.InternalMessageInfo

func (m *CreateKeyRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *CreateKeyRequest) GetKey() *Key {
	if m != nil {
		return m.Key
	}
	return nil
}

// The list keys request message.
type ListKeysRequest struct {
	// Required. The name of the project that contains the keys that will be
	// listed, in the format "projects/{project_number}".
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Optional. The maximum number of keys to return. Default is 10. Max limit is
	// 1000.
	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Optional. The next_page_token value returned from a previous.
	// ListKeysRequest, if any.
	PageToken            string   `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListKeysRequest proto.InternalMessageInfo

func (m *ListKeysRequest) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *ListKeysRequest) GetPageSize() int32 {
	if m != nil {
		return m.PageSize
	}
	return 0
}

func (m *ListKeysRequest) GetPageToken() string {
	if m != nil {
		return m.PageToken
	}
	return ""
}

// Response to request to list keys in a project.
type ListKeysResponse struct {
	// Key details.
	Keys []*Key `protobuf:"bytes,1,rep,name=keys,proto3" json:"keys,omitempty"`
	// Token to retrieve the next page of results. It is set to empty if no keys
	// remain in results.
	NextPageToken        string   `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ListKeysResponse proto.InternalMessageInfo

func (m *ListKeysResponse) GetKeys() []*Key {
	if m != nil {
		return m.Keys
	}
	return nil
}

func (m *ListKeysResponse) GetNextPageToken() string {
	if m != nil {
		return m.NextPageToken
	}
	return ""
}

// The get key request message.
type GetKeyRequest struct {
	// Required. The name of the requested key, in the format
	// "projects/{project_number}/keys/{key_id}".
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetKeyRequest proto.InternalMessageInfo

func (m *GetKeyRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// The update key request message.
type UpdateKeyRequest struct {
	// Required. The key to update.
	Key *Key `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	// Optional. The mask to control which field of the key get updated. If the mask is not
	// present, all fields will be updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_UpdateKeyRequest proto.InternalMessageInfo

func (m *UpdateKeyRequest) GetKey() *Key {
	if m != nil {
		return m.Key
	}
	return nil
}

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

// The delete key request message.
type DeleteKeyRequest struct {
	// Required. The name of the key to be deleted, in the format
	// "projects/{project_number}/keys/{key_id}".
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DeleteKeyRequest proto.InternalMessageInfo

func (m *DeleteKeyRequest) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// A key used to identify and configure applications (web and/or mobile) that
// use reCAPTCHA Enterprise.
type Key struct {
	// The resource name for the Key in the format
	// "projects/{project_number}/keys/{key_id}".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Human-readable display name of this key. Modifiable by user.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Platform specific settings for this key. The key can only be used on one
	// platform, the one it has settings for.
	//
	// Types that are valid to be assigned to PlatformSettings:
	//	*Key_WebSettings
	//	*Key_AndroidSettings
	//	*Key_IosSettings
	PlatformSettings     isKey_PlatformSettings `protobuf_oneof:"platform_settings"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_Key proto.InternalMessageInfo

func (m *Key) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Key) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

type isKey_PlatformSettings interface {
	isKey_PlatformSettings()
}

type Key_WebSettings struct {
	WebSettings *WebKeySettings `protobuf:"bytes,3,opt,name=web_settings,json=webSettings,proto3,oneof"`
}

type Key_AndroidSettings struct {
	AndroidSettings *AndroidKeySettings `protobuf:"bytes,4,opt,name=android_settings,json=androidSettings,proto3,oneof"`
}

type Key_IosSettings struct {
	IosSettings *IOSKeySettings `protobuf:"bytes,5,opt,name=ios_settings,json=iosSettings,proto3,oneof"`
}

func (*Key_WebSettings) isKey_PlatformSettings() {}

func (*Key_AndroidSettings) isKey_PlatformSettings() {}

func (*Key_IosSettings) isKey_PlatformSettings() {}

func (m *Key) GetPlatformSettings() isKey_PlatformSettings {
	if m != nil {
		return m.PlatformSettings
	}
	return nil
}

func (m *Key) GetWebSettings() *WebKeySettings {
	if x, ok := m.GetPlatformSettings().(*Key_WebSettings); ok {
		return x.WebSettings
	}
	return nil
}

func (m *Key) GetAndroidSettings() *AndroidKeySettings {
	if x, ok := m.GetPlatformSettings().(*Key_AndroidSettings); ok {
		return x.AndroidSettings
	}
	return nil
}

func (m *Key) GetIosSettings() *IOSKeySettings {
	if x, ok := m.GetPlatformSettings().(*Key_IosSettings); ok {
		return x.IosSettings
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Key) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Key_WebSettings)(nil),
		(*Key_AndroidSettings)(nil),
		(*Key_IosSettings)(nil),
	}
}

// Settings specific to keys that can be used by websites.
type WebKeySettings struct {
	// Whether allowed_domains is enforced or not.
	EnforceAllowedDomains bool `protobuf:"varint,3,opt,name=enforce_allowed_domains,json=enforceAllowedDomains,proto3" json:"enforce_allowed_domains,omitempty"`
	// Domains or subdomains of websites allowed to use the key. All subdomains
	// of an allowed domain are automatically allowed. A valid domain requires a
	// host and must not include any path, port, query or fragment.
	// Examples: 'example.com' or 'subdomain.example.com'
	AllowedDomains []string `protobuf:"bytes,1,rep,name=allowed_domains,json=allowedDomains,proto3" json:"allowed_domains,omitempty"`
	// Whether this key can be used on AMP (Accelerated Mobile Pages) websites.
	AllowAmpTraffic bool `protobuf:"varint,2,opt,name=allow_amp_traffic,json=allowAmpTraffic,proto3" json:"allow_amp_traffic,omitempty"`
	// Required. Describes how this key is integrated with the website.
	IntegrationType WebKeySettings_IntegrationType `protobuf:"varint,4,opt,name=integration_type,json=integrationType,proto3,enum=google.cloud.recaptchaenterprise.v1beta1.WebKeySettings_IntegrationType" json:"integration_type,omitempty"`
	// Settings for the frequency and difficulty at which this key triggers
	// captcha challenges. This should only be specified for IntegrationTypes
	// CHECKBOX_CHALLENGE and INVISIBLE_CHALLENGE.
	ChallengeSecurityPreference WebKeySettings_ChallengeSecurityPreference `protobuf:"varint,5,opt,name=challenge_security_preference,json=challengeSecurityPreference,proto3,enum=google.cloud.recaptchaenterprise.v1beta1.WebKeySettings_ChallengeSecurityPreference" json:"challenge_security_preference,omitempty"`
	XXX_NoUnkeyedLiteral        struct{}                                   `json:"-"`
	XXX_unrecognized            []byte                                     `json:"-"`
	XXX_sizecache               int32                                      `json:"-"`
}

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

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

var xxx_messageInfo_WebKeySettings proto.InternalMessageInfo

func (m *WebKeySettings) GetEnforceAllowedDomains() bool {
	if m != nil {
		return m.EnforceAllowedDomains
	}
	return false
}

func (m *WebKeySettings) GetAllowedDomains() []string {
	if m != nil {
		return m.AllowedDomains
	}
	return nil
}

func (m *WebKeySettings) GetAllowAmpTraffic() bool {
	if m != nil {
		return m.AllowAmpTraffic
	}
	return false
}

func (m *WebKeySettings) GetIntegrationType() WebKeySettings_IntegrationType {
	if m != nil {
		return m.IntegrationType
	}
	return WebKeySettings_INTEGRATION_TYPE_UNSPECIFIED
}

func (m *WebKeySettings) GetChallengeSecurityPreference() WebKeySettings_ChallengeSecurityPreference {
	if m != nil {
		return m.ChallengeSecurityPreference
	}
	return WebKeySettings_CHALLENGE_SECURITY_PREFERENCE_UNSPECIFIED
}

// Settings specific to keys that can be used by Android apps.
type AndroidKeySettings struct {
	// Android package names of apps allowed to use the key.
	// Example: 'com.companyname.appname'
	AllowedPackageNames  []string `protobuf:"bytes,1,rep,name=allowed_package_names,json=allowedPackageNames,proto3" json:"allowed_package_names,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AndroidKeySettings) Reset()         { *m = AndroidKeySettings{} }
func (m *AndroidKeySettings) String() string { return proto.CompactTextString(m) }
func (*AndroidKeySettings) ProtoMessage()    {}
func (*AndroidKeySettings) Descriptor() ([]byte, []int) {
	return fileDescriptor_72b3da91aae1398d, []int{14}
}

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

var xxx_messageInfo_AndroidKeySettings proto.InternalMessageInfo

func (m *AndroidKeySettings) GetAllowedPackageNames() []string {
	if m != nil {
		return m.AllowedPackageNames
	}
	return nil
}

// Settings specific to keys that can be used by iOS apps.
type IOSKeySettings struct {
	// iOS bundle ids of apps allowed to use the key.
	// Example: 'com.companyname.productname.appname'
	AllowedBundleIds     []string `protobuf:"bytes,1,rep,name=allowed_bundle_ids,json=allowedBundleIds,proto3" json:"allowed_bundle_ids,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *IOSKeySettings) Reset()         { *m = IOSKeySettings{} }
func (m *IOSKeySettings) String() string { return proto.CompactTextString(m) }
func (*IOSKeySettings) ProtoMessage()    {}
func (*IOSKeySettings) Descriptor() ([]byte, []int) {
	return fileDescriptor_72b3da91aae1398d, []int{15}
}

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

var xxx_messageInfo_IOSKeySettings proto.InternalMessageInfo

func (m *IOSKeySettings) GetAllowedBundleIds() []string {
	if m != nil {
		return m.AllowedBundleIds
	}
	return nil
}

func init() {
	proto.RegisterEnum("google.cloud.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest_Annotation", AnnotateAssessmentRequest_Annotation_name, AnnotateAssessmentRequest_Annotation_value)
	proto.RegisterEnum("google.cloud.recaptchaenterprise.v1beta1.Assessment_ClassificationReason", Assessment_ClassificationReason_name, Assessment_ClassificationReason_value)
	proto.RegisterEnum("google.cloud.recaptchaenterprise.v1beta1.TokenProperties_InvalidReason", TokenProperties_InvalidReason_name, TokenProperties_InvalidReason_value)
	proto.RegisterEnum("google.cloud.recaptchaenterprise.v1beta1.WebKeySettings_IntegrationType", WebKeySettings_IntegrationType_name, WebKeySettings_IntegrationType_value)
	proto.RegisterEnum("google.cloud.recaptchaenterprise.v1beta1.WebKeySettings_ChallengeSecurityPreference", WebKeySettings_ChallengeSecurityPreference_name, WebKeySettings_ChallengeSecurityPreference_value)
	proto.RegisterType((*CreateAssessmentRequest)(nil), "google.cloud.recaptchaenterprise.v1beta1.CreateAssessmentRequest")
	proto.RegisterType((*AnnotateAssessmentRequest)(nil), "google.cloud.recaptchaenterprise.v1beta1.AnnotateAssessmentRequest")
	proto.RegisterType((*AnnotateAssessmentResponse)(nil), "google.cloud.recaptchaenterprise.v1beta1.AnnotateAssessmentResponse")
	proto.RegisterType((*Assessment)(nil), "google.cloud.recaptchaenterprise.v1beta1.Assessment")
	proto.RegisterType((*Event)(nil), "google.cloud.recaptchaenterprise.v1beta1.Event")
	proto.RegisterType((*TokenProperties)(nil), "google.cloud.recaptchaenterprise.v1beta1.TokenProperties")
	proto.RegisterType((*CreateKeyRequest)(nil), "google.cloud.recaptchaenterprise.v1beta1.CreateKeyRequest")
	proto.RegisterType((*ListKeysRequest)(nil), "google.cloud.recaptchaenterprise.v1beta1.ListKeysRequest")
	proto.RegisterType((*ListKeysResponse)(nil), "google.cloud.recaptchaenterprise.v1beta1.ListKeysResponse")
	proto.RegisterType((*GetKeyRequest)(nil), "google.cloud.recaptchaenterprise.v1beta1.GetKeyRequest")
	proto.RegisterType((*UpdateKeyRequest)(nil), "google.cloud.recaptchaenterprise.v1beta1.UpdateKeyRequest")
	proto.RegisterType((*DeleteKeyRequest)(nil), "google.cloud.recaptchaenterprise.v1beta1.DeleteKeyRequest")
	proto.RegisterType((*Key)(nil), "google.cloud.recaptchaenterprise.v1beta1.Key")
	proto.RegisterType((*WebKeySettings)(nil), "google.cloud.recaptchaenterprise.v1beta1.WebKeySettings")
	proto.RegisterType((*AndroidKeySettings)(nil), "google.cloud.recaptchaenterprise.v1beta1.AndroidKeySettings")
	proto.RegisterType((*IOSKeySettings)(nil), "google.cloud.recaptchaenterprise.v1beta1.IOSKeySettings")
}

func init() {
	proto.RegisterFile("google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto", fileDescriptor_72b3da91aae1398d)
}

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

// RecaptchaEnterpriseServiceV1Beta1Client is the client API for RecaptchaEnterpriseServiceV1Beta1 service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type RecaptchaEnterpriseServiceV1Beta1Client interface {
	// Creates an Assessment of the likelihood an event is legitimate.
	CreateAssessment(ctx context.Context, in *CreateAssessmentRequest, opts ...grpc.CallOption) (*Assessment, error)
	// Annotates a previously created Assessment to provide additional information
	// on whether the event turned out to be authentic or fradulent.
	AnnotateAssessment(ctx context.Context, in *AnnotateAssessmentRequest, opts ...grpc.CallOption) (*AnnotateAssessmentResponse, error)
	// Creates a new reCAPTCHA Enterprise key.
	CreateKey(ctx context.Context, in *CreateKeyRequest, opts ...grpc.CallOption) (*Key, error)
	// Returns the list of all keys that belong to a project.
	ListKeys(ctx context.Context, in *ListKeysRequest, opts ...grpc.CallOption) (*ListKeysResponse, error)
	// Returns the specified key.
	GetKey(ctx context.Context, in *GetKeyRequest, opts ...grpc.CallOption) (*Key, error)
	// Updates the specified key.
	UpdateKey(ctx context.Context, in *UpdateKeyRequest, opts ...grpc.CallOption) (*Key, error)
	// Deletes the specified key.
	DeleteKey(ctx context.Context, in *DeleteKeyRequest, opts ...grpc.CallOption) (*empty.Empty, error)
}

type recaptchaEnterpriseServiceV1Beta1Client struct {
	cc grpc.ClientConnInterface
}

func NewRecaptchaEnterpriseServiceV1Beta1Client(cc grpc.ClientConnInterface) RecaptchaEnterpriseServiceV1Beta1Client {
	return &recaptchaEnterpriseServiceV1Beta1Client{cc}
}

func (c *recaptchaEnterpriseServiceV1Beta1Client) CreateAssessment(ctx context.Context, in *CreateAssessmentRequest, opts ...grpc.CallOption) (*Assessment, error) {
	out := new(Assessment)
	err := c.cc.Invoke(ctx, "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/CreateAssessment", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *recaptchaEnterpriseServiceV1Beta1Client) AnnotateAssessment(ctx context.Context, in *AnnotateAssessmentRequest, opts ...grpc.CallOption) (*AnnotateAssessmentResponse, error) {
	out := new(AnnotateAssessmentResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/AnnotateAssessment", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *recaptchaEnterpriseServiceV1Beta1Client) CreateKey(ctx context.Context, in *CreateKeyRequest, opts ...grpc.CallOption) (*Key, error) {
	out := new(Key)
	err := c.cc.Invoke(ctx, "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/CreateKey", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *recaptchaEnterpriseServiceV1Beta1Client) ListKeys(ctx context.Context, in *ListKeysRequest, opts ...grpc.CallOption) (*ListKeysResponse, error) {
	out := new(ListKeysResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/ListKeys", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *recaptchaEnterpriseServiceV1Beta1Client) GetKey(ctx context.Context, in *GetKeyRequest, opts ...grpc.CallOption) (*Key, error) {
	out := new(Key)
	err := c.cc.Invoke(ctx, "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/GetKey", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *recaptchaEnterpriseServiceV1Beta1Client) UpdateKey(ctx context.Context, in *UpdateKeyRequest, opts ...grpc.CallOption) (*Key, error) {
	out := new(Key)
	err := c.cc.Invoke(ctx, "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/UpdateKey", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *recaptchaEnterpriseServiceV1Beta1Client) DeleteKey(ctx context.Context, in *DeleteKeyRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/DeleteKey", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// RecaptchaEnterpriseServiceV1Beta1Server is the server API for RecaptchaEnterpriseServiceV1Beta1 service.
type RecaptchaEnterpriseServiceV1Beta1Server interface {
	// Creates an Assessment of the likelihood an event is legitimate.
	CreateAssessment(context.Context, *CreateAssessmentRequest) (*Assessment, error)
	// Annotates a previously created Assessment to provide additional information
	// on whether the event turned out to be authentic or fradulent.
	AnnotateAssessment(context.Context, *AnnotateAssessmentRequest) (*AnnotateAssessmentResponse, error)
	// Creates a new reCAPTCHA Enterprise key.
	CreateKey(context.Context, *CreateKeyRequest) (*Key, error)
	// Returns the list of all keys that belong to a project.
	ListKeys(context.Context, *ListKeysRequest) (*ListKeysResponse, error)
	// Returns the specified key.
	GetKey(context.Context, *GetKeyRequest) (*Key, error)
	// Updates the specified key.
	UpdateKey(context.Context, *UpdateKeyRequest) (*Key, error)
	// Deletes the specified key.
	DeleteKey(context.Context, *DeleteKeyRequest) (*empty.Empty, error)
}

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

func (*UnimplementedRecaptchaEnterpriseServiceV1Beta1Server) CreateAssessment(ctx context.Context, req *CreateAssessmentRequest) (*Assessment, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CreateAssessment not implemented")
}
func (*UnimplementedRecaptchaEnterpriseServiceV1Beta1Server) AnnotateAssessment(ctx context.Context, req *AnnotateAssessmentRequest) (*AnnotateAssessmentResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method AnnotateAssessment not implemented")
}
func (*UnimplementedRecaptchaEnterpriseServiceV1Beta1Server) CreateKey(ctx context.Context, req *CreateKeyRequest) (*Key, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CreateKey not implemented")
}
func (*UnimplementedRecaptchaEnterpriseServiceV1Beta1Server) ListKeys(ctx context.Context, req *ListKeysRequest) (*ListKeysResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ListKeys not implemented")
}
func (*UnimplementedRecaptchaEnterpriseServiceV1Beta1Server) GetKey(ctx context.Context, req *GetKeyRequest) (*Key, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetKey not implemented")
}
func (*UnimplementedRecaptchaEnterpriseServiceV1Beta1Server) UpdateKey(ctx context.Context, req *UpdateKeyRequest) (*Key, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UpdateKey not implemented")
}
func (*UnimplementedRecaptchaEnterpriseServiceV1Beta1Server) DeleteKey(ctx context.Context, req *DeleteKeyRequest) (*empty.Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method DeleteKey not implemented")
}

func RegisterRecaptchaEnterpriseServiceV1Beta1Server(s *grpc.Server, srv RecaptchaEnterpriseServiceV1Beta1Server) {
	s.RegisterService(&_RecaptchaEnterpriseServiceV1Beta1_serviceDesc, srv)
}

func _RecaptchaEnterpriseServiceV1Beta1_CreateAssessment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateAssessmentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).CreateAssessment(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/CreateAssessment",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).CreateAssessment(ctx, req.(*CreateAssessmentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _RecaptchaEnterpriseServiceV1Beta1_AnnotateAssessment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AnnotateAssessmentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).AnnotateAssessment(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/AnnotateAssessment",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).AnnotateAssessment(ctx, req.(*AnnotateAssessmentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _RecaptchaEnterpriseServiceV1Beta1_CreateKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateKeyRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).CreateKey(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/CreateKey",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).CreateKey(ctx, req.(*CreateKeyRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _RecaptchaEnterpriseServiceV1Beta1_ListKeys_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListKeysRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).ListKeys(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/ListKeys",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).ListKeys(ctx, req.(*ListKeysRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _RecaptchaEnterpriseServiceV1Beta1_GetKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetKeyRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).GetKey(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/GetKey",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).GetKey(ctx, req.(*GetKeyRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _RecaptchaEnterpriseServiceV1Beta1_UpdateKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateKeyRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).UpdateKey(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/UpdateKey",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).UpdateKey(ctx, req.(*UpdateKeyRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _RecaptchaEnterpriseServiceV1Beta1_DeleteKey_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteKeyRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).DeleteKey(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1/DeleteKey",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(RecaptchaEnterpriseServiceV1Beta1Server).DeleteKey(ctx, req.(*DeleteKeyRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _RecaptchaEnterpriseServiceV1Beta1_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.cloud.recaptchaenterprise.v1beta1.RecaptchaEnterpriseServiceV1Beta1",
	HandlerType: (*RecaptchaEnterpriseServiceV1Beta1Server)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "CreateAssessment",
			Handler:    _RecaptchaEnterpriseServiceV1Beta1_CreateAssessment_Handler,
		},
		{
			MethodName: "AnnotateAssessment",
			Handler:    _RecaptchaEnterpriseServiceV1Beta1_AnnotateAssessment_Handler,
		},
		{
			MethodName: "CreateKey",
			Handler:    _RecaptchaEnterpriseServiceV1Beta1_CreateKey_Handler,
		},
		{
			MethodName: "ListKeys",
			Handler:    _RecaptchaEnterpriseServiceV1Beta1_ListKeys_Handler,
		},
		{
			MethodName: "GetKey",
			Handler:    _RecaptchaEnterpriseServiceV1Beta1_GetKey_Handler,
		},
		{
			MethodName: "UpdateKey",
			Handler:    _RecaptchaEnterpriseServiceV1Beta1_UpdateKey_Handler,
		},
		{
			MethodName: "DeleteKey",
			Handler:    _RecaptchaEnterpriseServiceV1Beta1_DeleteKey_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/cloud/recaptchaenterprise/v1beta1/recaptchaenterprise.proto",
}
