// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/privacy/dlp/v2/dlp.proto

package dlp

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

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

// Operators available for comparing the value of fields.
type RelationalOperator int32

const (
	// Unused
	RelationalOperator_RELATIONAL_OPERATOR_UNSPECIFIED RelationalOperator = 0
	// Equal. Attempts to match even with incompatible types.
	RelationalOperator_EQUAL_TO RelationalOperator = 1
	// Not equal to. Attempts to match even with incompatible types.
	RelationalOperator_NOT_EQUAL_TO RelationalOperator = 2
	// Greater than.
	RelationalOperator_GREATER_THAN RelationalOperator = 3
	// Less than.
	RelationalOperator_LESS_THAN RelationalOperator = 4
	// Greater than or equals.
	RelationalOperator_GREATER_THAN_OR_EQUALS RelationalOperator = 5
	// Less than or equals.
	RelationalOperator_LESS_THAN_OR_EQUALS RelationalOperator = 6
	// Exists
	RelationalOperator_EXISTS RelationalOperator = 7
)

var RelationalOperator_name = map[int32]string{
	0: "RELATIONAL_OPERATOR_UNSPECIFIED",
	1: "EQUAL_TO",
	2: "NOT_EQUAL_TO",
	3: "GREATER_THAN",
	4: "LESS_THAN",
	5: "GREATER_THAN_OR_EQUALS",
	6: "LESS_THAN_OR_EQUALS",
	7: "EXISTS",
}

var RelationalOperator_value = map[string]int32{
	"RELATIONAL_OPERATOR_UNSPECIFIED": 0,
	"EQUAL_TO":                        1,
	"NOT_EQUAL_TO":                    2,
	"GREATER_THAN":                    3,
	"LESS_THAN":                       4,
	"GREATER_THAN_OR_EQUALS":          5,
	"LESS_THAN_OR_EQUALS":             6,
	"EXISTS":                          7,
}

func (x RelationalOperator) String() string {
	return proto.EnumName(RelationalOperator_name, int32(x))
}

func (RelationalOperator) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{0}
}

// Type of the match which can be applied to different ways of matching, like
// Dictionary, regular expression and intersecting with findings of another
// info type.
type MatchingType int32

const (
	// Invalid.
	MatchingType_MATCHING_TYPE_UNSPECIFIED MatchingType = 0
	// Full match.
	//
	// - Dictionary: join of Dictionary results matched complete finding quote
	// - Regex: all regex matches fill a finding quote start to end
	// - Exclude info type: completely inside affecting info types findings
	MatchingType_MATCHING_TYPE_FULL_MATCH MatchingType = 1
	// Partial match.
	//
	// - Dictionary: at least one of the tokens in the finding matches
	// - Regex: substring of the finding matches
	// - Exclude info type: intersects with affecting info types findings
	MatchingType_MATCHING_TYPE_PARTIAL_MATCH MatchingType = 2
	// Inverse match.
	//
	// - Dictionary: no tokens in the finding match the dictionary
	// - Regex: finding doesn't match the regex
	// - Exclude info type: no intersection with affecting info types findings
	MatchingType_MATCHING_TYPE_INVERSE_MATCH MatchingType = 3
)

var MatchingType_name = map[int32]string{
	0: "MATCHING_TYPE_UNSPECIFIED",
	1: "MATCHING_TYPE_FULL_MATCH",
	2: "MATCHING_TYPE_PARTIAL_MATCH",
	3: "MATCHING_TYPE_INVERSE_MATCH",
}

var MatchingType_value = map[string]int32{
	"MATCHING_TYPE_UNSPECIFIED":   0,
	"MATCHING_TYPE_FULL_MATCH":    1,
	"MATCHING_TYPE_PARTIAL_MATCH": 2,
	"MATCHING_TYPE_INVERSE_MATCH": 3,
}

func (x MatchingType) String() string {
	return proto.EnumName(MatchingType_name, int32(x))
}

func (MatchingType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{1}
}

// Options describing which parts of the provided content should be scanned.
type ContentOption int32

const (
	// Includes entire content of a file or a data stream.
	ContentOption_CONTENT_UNSPECIFIED ContentOption = 0
	// Text content within the data, excluding any metadata.
	ContentOption_CONTENT_TEXT ContentOption = 1
	// Images found in the data.
	ContentOption_CONTENT_IMAGE ContentOption = 2
)

var ContentOption_name = map[int32]string{
	0: "CONTENT_UNSPECIFIED",
	1: "CONTENT_TEXT",
	2: "CONTENT_IMAGE",
}

var ContentOption_value = map[string]int32{
	"CONTENT_UNSPECIFIED": 0,
	"CONTENT_TEXT":        1,
	"CONTENT_IMAGE":       2,
}

func (x ContentOption) String() string {
	return proto.EnumName(ContentOption_name, int32(x))
}

func (ContentOption) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{2}
}

// Parts of the APIs which use certain infoTypes.
type InfoTypeSupportedBy int32

const (
	// Unused.
	InfoTypeSupportedBy_ENUM_TYPE_UNSPECIFIED InfoTypeSupportedBy = 0
	// Supported by the inspect operations.
	InfoTypeSupportedBy_INSPECT InfoTypeSupportedBy = 1
	// Supported by the risk analysis operations.
	InfoTypeSupportedBy_RISK_ANALYSIS InfoTypeSupportedBy = 2
)

var InfoTypeSupportedBy_name = map[int32]string{
	0: "ENUM_TYPE_UNSPECIFIED",
	1: "INSPECT",
	2: "RISK_ANALYSIS",
}

var InfoTypeSupportedBy_value = map[string]int32{
	"ENUM_TYPE_UNSPECIFIED": 0,
	"INSPECT":               1,
	"RISK_ANALYSIS":         2,
}

func (x InfoTypeSupportedBy) String() string {
	return proto.EnumName(InfoTypeSupportedBy_name, int32(x))
}

func (InfoTypeSupportedBy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{3}
}

// An enum to represent the various types of DLP jobs.
type DlpJobType int32

const (
	// Unused
	DlpJobType_DLP_JOB_TYPE_UNSPECIFIED DlpJobType = 0
	// The job inspected Google Cloud for sensitive data.
	DlpJobType_INSPECT_JOB DlpJobType = 1
	// The job executed a Risk Analysis computation.
	DlpJobType_RISK_ANALYSIS_JOB DlpJobType = 2
)

var DlpJobType_name = map[int32]string{
	0: "DLP_JOB_TYPE_UNSPECIFIED",
	1: "INSPECT_JOB",
	2: "RISK_ANALYSIS_JOB",
}

var DlpJobType_value = map[string]int32{
	"DLP_JOB_TYPE_UNSPECIFIED": 0,
	"INSPECT_JOB":              1,
	"RISK_ANALYSIS_JOB":        2,
}

func (x DlpJobType) String() string {
	return proto.EnumName(DlpJobType_name, int32(x))
}

func (DlpJobType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{4}
}

// State of a StoredInfoType version.
type StoredInfoTypeState int32

const (
	// Unused
	StoredInfoTypeState_STORED_INFO_TYPE_STATE_UNSPECIFIED StoredInfoTypeState = 0
	// StoredInfoType version is being created.
	StoredInfoTypeState_PENDING StoredInfoTypeState = 1
	// StoredInfoType version is ready for use.
	StoredInfoTypeState_READY StoredInfoTypeState = 2
	// StoredInfoType creation failed. All relevant error messages are returned in
	// the `StoredInfoTypeVersion` message.
	StoredInfoTypeState_FAILED StoredInfoTypeState = 3
	// StoredInfoType is no longer valid because artifacts stored in
	// user-controlled storage were modified. To fix an invalid StoredInfoType,
	// use the `UpdateStoredInfoType` method to create a new version.
	StoredInfoTypeState_INVALID StoredInfoTypeState = 4
)

var StoredInfoTypeState_name = map[int32]string{
	0: "STORED_INFO_TYPE_STATE_UNSPECIFIED",
	1: "PENDING",
	2: "READY",
	3: "FAILED",
	4: "INVALID",
}

var StoredInfoTypeState_value = map[string]int32{
	"STORED_INFO_TYPE_STATE_UNSPECIFIED": 0,
	"PENDING":                            1,
	"READY":                              2,
	"FAILED":                             3,
	"INVALID":                            4,
}

func (x StoredInfoTypeState) String() string {
	return proto.EnumName(StoredInfoTypeState_name, int32(x))
}

func (StoredInfoTypeState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{5}
}

// The type of data being sent to in data.
type ByteContentItem_BytesType int32

const (
	// Unused
	ByteContentItem_BYTES_TYPE_UNSPECIFIED ByteContentItem_BytesType = 0
	// Any image type.
	ByteContentItem_IMAGE ByteContentItem_BytesType = 6
	// jpeg
	ByteContentItem_IMAGE_JPEG ByteContentItem_BytesType = 1
	// bmp
	ByteContentItem_IMAGE_BMP ByteContentItem_BytesType = 2
	// png
	ByteContentItem_IMAGE_PNG ByteContentItem_BytesType = 3
	// svg
	ByteContentItem_IMAGE_SVG ByteContentItem_BytesType = 4
	// plain text
	ByteContentItem_TEXT_UTF8 ByteContentItem_BytesType = 5
	// avro
	ByteContentItem_AVRO ByteContentItem_BytesType = 11
)

var ByteContentItem_BytesType_name = map[int32]string{
	0:  "BYTES_TYPE_UNSPECIFIED",
	6:  "IMAGE",
	1:  "IMAGE_JPEG",
	2:  "IMAGE_BMP",
	3:  "IMAGE_PNG",
	4:  "IMAGE_SVG",
	5:  "TEXT_UTF8",
	11: "AVRO",
}

var ByteContentItem_BytesType_value = map[string]int32{
	"BYTES_TYPE_UNSPECIFIED": 0,
	"IMAGE":                  6,
	"IMAGE_JPEG":             1,
	"IMAGE_BMP":              2,
	"IMAGE_PNG":              3,
	"IMAGE_SVG":              4,
	"TEXT_UTF8":              5,
	"AVRO":                   11,
}

func (x ByteContentItem_BytesType) String() string {
	return proto.EnumName(ByteContentItem_BytesType_name, int32(x))
}

func (ByteContentItem_BytesType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{5, 0}
}

// Predefined schemas for storing findings.
type OutputStorageConfig_OutputSchema int32

const (
	// Unused.
	OutputStorageConfig_OUTPUT_SCHEMA_UNSPECIFIED OutputStorageConfig_OutputSchema = 0
	// Basic schema including only `info_type`, `quote`, `certainty`, and
	// `timestamp`.
	OutputStorageConfig_BASIC_COLUMNS OutputStorageConfig_OutputSchema = 1
	// Schema tailored to findings from scanning Google Cloud Storage.
	OutputStorageConfig_GCS_COLUMNS OutputStorageConfig_OutputSchema = 2
	// Schema tailored to findings from scanning Google Datastore.
	OutputStorageConfig_DATASTORE_COLUMNS OutputStorageConfig_OutputSchema = 3
	// Schema tailored to findings from scanning Google BigQuery.
	OutputStorageConfig_BIG_QUERY_COLUMNS OutputStorageConfig_OutputSchema = 4
	// Schema containing all columns.
	OutputStorageConfig_ALL_COLUMNS OutputStorageConfig_OutputSchema = 5
)

var OutputStorageConfig_OutputSchema_name = map[int32]string{
	0: "OUTPUT_SCHEMA_UNSPECIFIED",
	1: "BASIC_COLUMNS",
	2: "GCS_COLUMNS",
	3: "DATASTORE_COLUMNS",
	4: "BIG_QUERY_COLUMNS",
	5: "ALL_COLUMNS",
}

var OutputStorageConfig_OutputSchema_value = map[string]int32{
	"OUTPUT_SCHEMA_UNSPECIFIED": 0,
	"BASIC_COLUMNS":             1,
	"GCS_COLUMNS":               2,
	"DATASTORE_COLUMNS":         3,
	"BIG_QUERY_COLUMNS":         4,
	"ALL_COLUMNS":               5,
}

func (x OutputStorageConfig_OutputSchema) String() string {
	return proto.EnumName(OutputStorageConfig_OutputSchema_name, int32(x))
}

func (OutputStorageConfig_OutputSchema) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{27, 0}
}

// Components that make up time.
type TimePartConfig_TimePart int32

const (
	// Unused
	TimePartConfig_TIME_PART_UNSPECIFIED TimePartConfig_TimePart = 0
	// [0-9999]
	TimePartConfig_YEAR TimePartConfig_TimePart = 1
	// [1-12]
	TimePartConfig_MONTH TimePartConfig_TimePart = 2
	// [1-31]
	TimePartConfig_DAY_OF_MONTH TimePartConfig_TimePart = 3
	// [1-7]
	TimePartConfig_DAY_OF_WEEK TimePartConfig_TimePart = 4
	// [1-53]
	TimePartConfig_WEEK_OF_YEAR TimePartConfig_TimePart = 5
	// [0-23]
	TimePartConfig_HOUR_OF_DAY TimePartConfig_TimePart = 6
)

var TimePartConfig_TimePart_name = map[int32]string{
	0: "TIME_PART_UNSPECIFIED",
	1: "YEAR",
	2: "MONTH",
	3: "DAY_OF_MONTH",
	4: "DAY_OF_WEEK",
	5: "WEEK_OF_YEAR",
	6: "HOUR_OF_DAY",
}

var TimePartConfig_TimePart_value = map[string]int32{
	"TIME_PART_UNSPECIFIED": 0,
	"YEAR":                  1,
	"MONTH":                 2,
	"DAY_OF_MONTH":          3,
	"DAY_OF_WEEK":           4,
	"WEEK_OF_YEAR":          5,
	"HOUR_OF_DAY":           6,
}

func (x TimePartConfig_TimePart) String() string {
	return proto.EnumName(TimePartConfig_TimePart_name, int32(x))
}

func (TimePartConfig_TimePart) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{44, 0}
}

// Convenience enum for indication common characters to not transform.
type CharsToIgnore_CommonCharsToIgnore int32

const (
	// Unused.
	CharsToIgnore_COMMON_CHARS_TO_IGNORE_UNSPECIFIED CharsToIgnore_CommonCharsToIgnore = 0
	// 0-9
	CharsToIgnore_NUMERIC CharsToIgnore_CommonCharsToIgnore = 1
	// A-Z
	CharsToIgnore_ALPHA_UPPER_CASE CharsToIgnore_CommonCharsToIgnore = 2
	// a-z
	CharsToIgnore_ALPHA_LOWER_CASE CharsToIgnore_CommonCharsToIgnore = 3
	// US Punctuation, one of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
	CharsToIgnore_PUNCTUATION CharsToIgnore_CommonCharsToIgnore = 4
	// Whitespace character, one of [ \t\n\x0B\f\r]
	CharsToIgnore_WHITESPACE CharsToIgnore_CommonCharsToIgnore = 5
)

var CharsToIgnore_CommonCharsToIgnore_name = map[int32]string{
	0: "COMMON_CHARS_TO_IGNORE_UNSPECIFIED",
	1: "NUMERIC",
	2: "ALPHA_UPPER_CASE",
	3: "ALPHA_LOWER_CASE",
	4: "PUNCTUATION",
	5: "WHITESPACE",
}

var CharsToIgnore_CommonCharsToIgnore_value = map[string]int32{
	"COMMON_CHARS_TO_IGNORE_UNSPECIFIED": 0,
	"NUMERIC":                            1,
	"ALPHA_UPPER_CASE":                   2,
	"ALPHA_LOWER_CASE":                   3,
	"PUNCTUATION":                        4,
	"WHITESPACE":                         5,
}

func (x CharsToIgnore_CommonCharsToIgnore) String() string {
	return proto.EnumName(CharsToIgnore_CommonCharsToIgnore_name, int32(x))
}

func (CharsToIgnore_CommonCharsToIgnore) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{50, 0}
}

// These are commonly used subsets of the alphabet that the FFX mode
// natively supports. In the algorithm, the alphabet is selected using
// the "radix". Therefore each corresponds to particular radix.
type CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet int32

const (
	// Unused.
	CryptoReplaceFfxFpeConfig_FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 0
	// [0-9] (radix of 10)
	CryptoReplaceFfxFpeConfig_NUMERIC CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 1
	// [0-9A-F] (radix of 16)
	CryptoReplaceFfxFpeConfig_HEXADECIMAL CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 2
	// [0-9A-Z] (radix of 36)
	CryptoReplaceFfxFpeConfig_UPPER_CASE_ALPHA_NUMERIC CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 3
	// [0-9A-Za-z] (radix of 62)
	CryptoReplaceFfxFpeConfig_ALPHA_NUMERIC CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet = 4
)

var CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_name = map[int32]string{
	0: "FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED",
	1: "NUMERIC",
	2: "HEXADECIMAL",
	3: "UPPER_CASE_ALPHA_NUMERIC",
	4: "ALPHA_NUMERIC",
}

var CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_value = map[string]int32{
	"FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED": 0,
	"NUMERIC":                                1,
	"HEXADECIMAL":                            2,
	"UPPER_CASE_ALPHA_NUMERIC":               3,
	"ALPHA_NUMERIC":                          4,
}

func (x CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet) String() string {
	return proto.EnumName(CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_name, int32(x))
}

func (CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{54, 0}
}

// Logical operators for conditional checks.
type RecordCondition_Expressions_LogicalOperator int32

const (
	// Unused
	RecordCondition_Expressions_LOGICAL_OPERATOR_UNSPECIFIED RecordCondition_Expressions_LogicalOperator = 0
	// Conditional AND
	RecordCondition_Expressions_AND RecordCondition_Expressions_LogicalOperator = 1
)

var RecordCondition_Expressions_LogicalOperator_name = map[int32]string{
	0: "LOGICAL_OPERATOR_UNSPECIFIED",
	1: "AND",
}

var RecordCondition_Expressions_LogicalOperator_value = map[string]int32{
	"LOGICAL_OPERATOR_UNSPECIFIED": 0,
	"AND":                          1,
}

func (x RecordCondition_Expressions_LogicalOperator) String() string {
	return proto.EnumName(RecordCondition_Expressions_LogicalOperator_name, int32(x))
}

func (RecordCondition_Expressions_LogicalOperator) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{64, 2, 0}
}

// Possible outcomes of transformations.
type TransformationSummary_TransformationResultCode int32

const (
	// Unused
	TransformationSummary_TRANSFORMATION_RESULT_CODE_UNSPECIFIED TransformationSummary_TransformationResultCode = 0
	// Transformation completed without an error.
	TransformationSummary_SUCCESS TransformationSummary_TransformationResultCode = 1
	// Transformation had an error.
	TransformationSummary_ERROR TransformationSummary_TransformationResultCode = 2
)

var TransformationSummary_TransformationResultCode_name = map[int32]string{
	0: "TRANSFORMATION_RESULT_CODE_UNSPECIFIED",
	1: "SUCCESS",
	2: "ERROR",
}

var TransformationSummary_TransformationResultCode_value = map[string]int32{
	"TRANSFORMATION_RESULT_CODE_UNSPECIFIED": 0,
	"SUCCESS":                                1,
	"ERROR":                                  2,
}

func (x TransformationSummary_TransformationResultCode) String() string {
	return proto.EnumName(TransformationSummary_TransformationResultCode_name, int32(x))
}

func (TransformationSummary_TransformationResultCode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{66, 0}
}

// Whether the trigger is currently active. If PAUSED or CANCELLED, no jobs
// will be created with this configuration. The service may automatically
// pause triggers experiencing frequent errors. To restart a job, set the
// status to HEALTHY after correcting user errors.
type JobTrigger_Status int32

const (
	// Unused.
	JobTrigger_STATUS_UNSPECIFIED JobTrigger_Status = 0
	// Trigger is healthy.
	JobTrigger_HEALTHY JobTrigger_Status = 1
	// Trigger is temporarily paused.
	JobTrigger_PAUSED JobTrigger_Status = 2
	// Trigger is cancelled and can not be resumed.
	JobTrigger_CANCELLED JobTrigger_Status = 3
)

var JobTrigger_Status_name = map[int32]string{
	0: "STATUS_UNSPECIFIED",
	1: "HEALTHY",
	2: "PAUSED",
	3: "CANCELLED",
}

var JobTrigger_Status_value = map[string]int32{
	"STATUS_UNSPECIFIED": 0,
	"HEALTHY":            1,
	"PAUSED":             2,
	"CANCELLED":          3,
}

func (x JobTrigger_Status) String() string {
	return proto.EnumName(JobTrigger_Status_name, int32(x))
}

func (JobTrigger_Status) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{71, 0}
}

// Possible states of a job.
type DlpJob_JobState int32

const (
	// Unused.
	DlpJob_JOB_STATE_UNSPECIFIED DlpJob_JobState = 0
	// The job has not yet started.
	DlpJob_PENDING DlpJob_JobState = 1
	// The job is currently running.
	DlpJob_RUNNING DlpJob_JobState = 2
	// The job is no longer running.
	DlpJob_DONE DlpJob_JobState = 3
	// The job was canceled before it could complete.
	DlpJob_CANCELED DlpJob_JobState = 4
	// The job had an error and did not complete.
	DlpJob_FAILED DlpJob_JobState = 5
)

var DlpJob_JobState_name = map[int32]string{
	0: "JOB_STATE_UNSPECIFIED",
	1: "PENDING",
	2: "RUNNING",
	3: "DONE",
	4: "CANCELED",
	5: "FAILED",
}

var DlpJob_JobState_value = map[string]int32{
	"JOB_STATE_UNSPECIFIED": 0,
	"PENDING":               1,
	"RUNNING":               2,
	"DONE":                  3,
	"CANCELED":              4,
	"FAILED":                5,
}

func (x DlpJob_JobState) String() string {
	return proto.EnumName(DlpJob_JobState_name, int32(x))
}

func (DlpJob_JobState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{88, 0}
}

// List of exclude infoTypes.
type ExcludeInfoTypes struct {
	// InfoType list in ExclusionRule rule drops a finding when it overlaps or
	// contained within with a finding of an infoType from this list. For
	// example, for `InspectionRuleSet.info_types` containing "PHONE_NUMBER"` and
	// `exclusion_rule` containing `exclude_info_types.info_types` with
	// "EMAIL_ADDRESS" the phone number findings are dropped if they overlap
	// with EMAIL_ADDRESS finding.
	// That leads to "555-222-2222@example.org" to generate only a single
	// finding, namely email address.
	InfoTypes            []*InfoType `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_ExcludeInfoTypes proto.InternalMessageInfo

func (m *ExcludeInfoTypes) GetInfoTypes() []*InfoType {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

// The rule that specifies conditions when findings of infoTypes specified in
// `InspectionRuleSet` are removed from results.
type ExclusionRule struct {
	// Exclusion rule types.
	//
	// Types that are valid to be assigned to Type:
	//	*ExclusionRule_Dictionary
	//	*ExclusionRule_Regex
	//	*ExclusionRule_ExcludeInfoTypes
	Type isExclusionRule_Type `protobuf_oneof:"type"`
	// How the rule is applied, see MatchingType documentation for details.
	MatchingType         MatchingType `protobuf:"varint,4,opt,name=matching_type,json=matchingType,proto3,enum=google.privacy.dlp.v2.MatchingType" json:"matching_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_ExclusionRule proto.InternalMessageInfo

type isExclusionRule_Type interface {
	isExclusionRule_Type()
}

type ExclusionRule_Dictionary struct {
	Dictionary *CustomInfoType_Dictionary `protobuf:"bytes,1,opt,name=dictionary,proto3,oneof"`
}

type ExclusionRule_Regex struct {
	Regex *CustomInfoType_Regex `protobuf:"bytes,2,opt,name=regex,proto3,oneof"`
}

type ExclusionRule_ExcludeInfoTypes struct {
	ExcludeInfoTypes *ExcludeInfoTypes `protobuf:"bytes,3,opt,name=exclude_info_types,json=excludeInfoTypes,proto3,oneof"`
}

func (*ExclusionRule_Dictionary) isExclusionRule_Type() {}

func (*ExclusionRule_Regex) isExclusionRule_Type() {}

func (*ExclusionRule_ExcludeInfoTypes) isExclusionRule_Type() {}

func (m *ExclusionRule) GetType() isExclusionRule_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *ExclusionRule) GetDictionary() *CustomInfoType_Dictionary {
	if x, ok := m.GetType().(*ExclusionRule_Dictionary); ok {
		return x.Dictionary
	}
	return nil
}

func (m *ExclusionRule) GetRegex() *CustomInfoType_Regex {
	if x, ok := m.GetType().(*ExclusionRule_Regex); ok {
		return x.Regex
	}
	return nil
}

func (m *ExclusionRule) GetExcludeInfoTypes() *ExcludeInfoTypes {
	if x, ok := m.GetType().(*ExclusionRule_ExcludeInfoTypes); ok {
		return x.ExcludeInfoTypes
	}
	return nil
}

func (m *ExclusionRule) GetMatchingType() MatchingType {
	if m != nil {
		return m.MatchingType
	}
	return MatchingType_MATCHING_TYPE_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ExclusionRule) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ExclusionRule_Dictionary)(nil),
		(*ExclusionRule_Regex)(nil),
		(*ExclusionRule_ExcludeInfoTypes)(nil),
	}
}

// A single inspection rule to be applied to infoTypes, specified in
// `InspectionRuleSet`.
type InspectionRule struct {
	// Inspection rule types.
	//
	// Types that are valid to be assigned to Type:
	//	*InspectionRule_HotwordRule
	//	*InspectionRule_ExclusionRule
	Type                 isInspectionRule_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_InspectionRule proto.InternalMessageInfo

type isInspectionRule_Type interface {
	isInspectionRule_Type()
}

type InspectionRule_HotwordRule struct {
	HotwordRule *CustomInfoType_DetectionRule_HotwordRule `protobuf:"bytes,1,opt,name=hotword_rule,json=hotwordRule,proto3,oneof"`
}

type InspectionRule_ExclusionRule struct {
	ExclusionRule *ExclusionRule `protobuf:"bytes,2,opt,name=exclusion_rule,json=exclusionRule,proto3,oneof"`
}

func (*InspectionRule_HotwordRule) isInspectionRule_Type() {}

func (*InspectionRule_ExclusionRule) isInspectionRule_Type() {}

func (m *InspectionRule) GetType() isInspectionRule_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *InspectionRule) GetHotwordRule() *CustomInfoType_DetectionRule_HotwordRule {
	if x, ok := m.GetType().(*InspectionRule_HotwordRule); ok {
		return x.HotwordRule
	}
	return nil
}

func (m *InspectionRule) GetExclusionRule() *ExclusionRule {
	if x, ok := m.GetType().(*InspectionRule_ExclusionRule); ok {
		return x.ExclusionRule
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*InspectionRule) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*InspectionRule_HotwordRule)(nil),
		(*InspectionRule_ExclusionRule)(nil),
	}
}

// Rule set for modifying a set of infoTypes to alter behavior under certain
// circumstances, depending on the specific details of the rules within the set.
type InspectionRuleSet struct {
	// List of infoTypes this rule set is applied to.
	InfoTypes []*InfoType `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	// Set of rules to be applied to infoTypes. The rules are applied in order.
	Rules                []*InspectionRule `protobuf:"bytes,2,rep,name=rules,proto3" json:"rules,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_InspectionRuleSet proto.InternalMessageInfo

func (m *InspectionRuleSet) GetInfoTypes() []*InfoType {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

func (m *InspectionRuleSet) GetRules() []*InspectionRule {
	if m != nil {
		return m.Rules
	}
	return nil
}

// Configuration description of the scanning process.
// When used with redactContent only info_types and min_likelihood are currently
// used.
type InspectConfig struct {
	// Restricts what info_types to look for. The values must correspond to
	// InfoType values returned by ListInfoTypes or listed at
	// https://cloud.google.com/dlp/docs/infotypes-reference.
	//
	// When no InfoTypes or CustomInfoTypes are specified in a request, the
	// system may automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	//
	// If you need precise control and predictability as to what detectors are
	// run you should specify specific InfoTypes listed in the reference,
	// otherwise a default list will be used, which may change over time.
	InfoTypes []*InfoType `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	// Only returns findings equal or above this threshold. The default is
	// POSSIBLE.
	// See https://cloud.google.com/dlp/docs/likelihood to learn more.
	MinLikelihood Likelihood `protobuf:"varint,2,opt,name=min_likelihood,json=minLikelihood,proto3,enum=google.privacy.dlp.v2.Likelihood" json:"min_likelihood,omitempty"`
	// Configuration to control the number of findings returned.
	Limits *InspectConfig_FindingLimits `protobuf:"bytes,3,opt,name=limits,proto3" json:"limits,omitempty"`
	// When true, a contextual quote from the data that triggered a finding is
	// included in the response; see Finding.quote.
	IncludeQuote bool `protobuf:"varint,4,opt,name=include_quote,json=includeQuote,proto3" json:"include_quote,omitempty"`
	// When true, excludes type information of the findings.
	ExcludeInfoTypes bool `protobuf:"varint,5,opt,name=exclude_info_types,json=excludeInfoTypes,proto3" json:"exclude_info_types,omitempty"`
	// CustomInfoTypes provided by the user. See
	// https://cloud.google.com/dlp/docs/creating-custom-infotypes to learn more.
	CustomInfoTypes []*CustomInfoType `protobuf:"bytes,6,rep,name=custom_info_types,json=customInfoTypes,proto3" json:"custom_info_types,omitempty"`
	// List of options defining data content to scan.
	// If empty, text, images, and other content will be included.
	ContentOptions []ContentOption `protobuf:"varint,8,rep,packed,name=content_options,json=contentOptions,proto3,enum=google.privacy.dlp.v2.ContentOption" json:"content_options,omitempty"`
	// Set of rules to apply to the findings for this InspectConfig.
	// Exclusion rules, contained in the set are executed in the end, other
	// rules are executed in the order they are specified for each info type.
	RuleSet              []*InspectionRuleSet `protobuf:"bytes,10,rep,name=rule_set,json=ruleSet,proto3" json:"rule_set,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_InspectConfig proto.InternalMessageInfo

func (m *InspectConfig) GetInfoTypes() []*InfoType {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

func (m *InspectConfig) GetMinLikelihood() Likelihood {
	if m != nil {
		return m.MinLikelihood
	}
	return Likelihood_LIKELIHOOD_UNSPECIFIED
}

func (m *InspectConfig) GetLimits() *InspectConfig_FindingLimits {
	if m != nil {
		return m.Limits
	}
	return nil
}

func (m *InspectConfig) GetIncludeQuote() bool {
	if m != nil {
		return m.IncludeQuote
	}
	return false
}

func (m *InspectConfig) GetExcludeInfoTypes() bool {
	if m != nil {
		return m.ExcludeInfoTypes
	}
	return false
}

func (m *InspectConfig) GetCustomInfoTypes() []*CustomInfoType {
	if m != nil {
		return m.CustomInfoTypes
	}
	return nil
}

func (m *InspectConfig) GetContentOptions() []ContentOption {
	if m != nil {
		return m.ContentOptions
	}
	return nil
}

func (m *InspectConfig) GetRuleSet() []*InspectionRuleSet {
	if m != nil {
		return m.RuleSet
	}
	return nil
}

// Configuration to control the number of findings returned.
type InspectConfig_FindingLimits struct {
	// Max number of findings that will be returned for each item scanned.
	// When set within `InspectDataSourceRequest`,
	// the maximum returned is 2000 regardless if this is set higher.
	// When set within `InspectContentRequest`, this field is ignored.
	MaxFindingsPerItem int32 `protobuf:"varint,1,opt,name=max_findings_per_item,json=maxFindingsPerItem,proto3" json:"max_findings_per_item,omitempty"`
	// Max number of findings that will be returned per request/job.
	// When set within `InspectContentRequest`, the maximum returned is 2000
	// regardless if this is set higher.
	MaxFindingsPerRequest int32 `protobuf:"varint,2,opt,name=max_findings_per_request,json=maxFindingsPerRequest,proto3" json:"max_findings_per_request,omitempty"`
	// Configuration of findings limit given for specified infoTypes.
	MaxFindingsPerInfoType []*InspectConfig_FindingLimits_InfoTypeLimit `protobuf:"bytes,3,rep,name=max_findings_per_info_type,json=maxFindingsPerInfoType,proto3" json:"max_findings_per_info_type,omitempty"`
	XXX_NoUnkeyedLiteral   struct{}                                     `json:"-"`
	XXX_unrecognized       []byte                                       `json:"-"`
	XXX_sizecache          int32                                        `json:"-"`
}

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

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

var xxx_messageInfo_InspectConfig_FindingLimits proto.InternalMessageInfo

func (m *InspectConfig_FindingLimits) GetMaxFindingsPerItem() int32 {
	if m != nil {
		return m.MaxFindingsPerItem
	}
	return 0
}

func (m *InspectConfig_FindingLimits) GetMaxFindingsPerRequest() int32 {
	if m != nil {
		return m.MaxFindingsPerRequest
	}
	return 0
}

func (m *InspectConfig_FindingLimits) GetMaxFindingsPerInfoType() []*InspectConfig_FindingLimits_InfoTypeLimit {
	if m != nil {
		return m.MaxFindingsPerInfoType
	}
	return nil
}

// Max findings configuration per infoType, per content item or long
// running DlpJob.
type InspectConfig_FindingLimits_InfoTypeLimit struct {
	// Type of information the findings limit applies to. Only one limit per
	// info_type should be provided. If InfoTypeLimit does not have an
	// info_type, the DLP API applies the limit against all info_types that
	// are found but not specified in another InfoTypeLimit.
	InfoType *InfoType `protobuf:"bytes,1,opt,name=info_type,json=infoType,proto3" json:"info_type,omitempty"`
	// Max findings limit for the given infoType.
	MaxFindings          int32    `protobuf:"varint,2,opt,name=max_findings,json=maxFindings,proto3" json:"max_findings,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_InspectConfig_FindingLimits_InfoTypeLimit proto.InternalMessageInfo

func (m *InspectConfig_FindingLimits_InfoTypeLimit) GetInfoType() *InfoType {
	if m != nil {
		return m.InfoType
	}
	return nil
}

func (m *InspectConfig_FindingLimits_InfoTypeLimit) GetMaxFindings() int32 {
	if m != nil {
		return m.MaxFindings
	}
	return 0
}

// Container for bytes to inspect or redact.
type ByteContentItem struct {
	// The type of data stored in the bytes string. Default will be TEXT_UTF8.
	Type ByteContentItem_BytesType `protobuf:"varint,1,opt,name=type,proto3,enum=google.privacy.dlp.v2.ByteContentItem_BytesType" json:"type,omitempty"`
	// Content data to inspect or redact.
	Data                 []byte   `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ByteContentItem proto.InternalMessageInfo

func (m *ByteContentItem) GetType() ByteContentItem_BytesType {
	if m != nil {
		return m.Type
	}
	return ByteContentItem_BYTES_TYPE_UNSPECIFIED
}

func (m *ByteContentItem) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

// Container structure for the content to inspect.
type ContentItem struct {
	// Data of the item either in the byte array or UTF-8 string form, or table.
	//
	// Types that are valid to be assigned to DataItem:
	//	*ContentItem_Value
	//	*ContentItem_Table
	//	*ContentItem_ByteItem
	DataItem             isContentItem_DataItem `protobuf_oneof:"data_item"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_ContentItem proto.InternalMessageInfo

type isContentItem_DataItem interface {
	isContentItem_DataItem()
}

type ContentItem_Value struct {
	Value string `protobuf:"bytes,3,opt,name=value,proto3,oneof"`
}

type ContentItem_Table struct {
	Table *Table `protobuf:"bytes,4,opt,name=table,proto3,oneof"`
}

type ContentItem_ByteItem struct {
	ByteItem *ByteContentItem `protobuf:"bytes,5,opt,name=byte_item,json=byteItem,proto3,oneof"`
}

func (*ContentItem_Value) isContentItem_DataItem() {}

func (*ContentItem_Table) isContentItem_DataItem() {}

func (*ContentItem_ByteItem) isContentItem_DataItem() {}

func (m *ContentItem) GetDataItem() isContentItem_DataItem {
	if m != nil {
		return m.DataItem
	}
	return nil
}

func (m *ContentItem) GetValue() string {
	if x, ok := m.GetDataItem().(*ContentItem_Value); ok {
		return x.Value
	}
	return ""
}

func (m *ContentItem) GetTable() *Table {
	if x, ok := m.GetDataItem().(*ContentItem_Table); ok {
		return x.Table
	}
	return nil
}

func (m *ContentItem) GetByteItem() *ByteContentItem {
	if x, ok := m.GetDataItem().(*ContentItem_ByteItem); ok {
		return x.ByteItem
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ContentItem) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ContentItem_Value)(nil),
		(*ContentItem_Table)(nil),
		(*ContentItem_ByteItem)(nil),
	}
}

// Structured content to inspect. Up to 50,000 `Value`s per request allowed.
// See https://cloud.google.com/dlp/docs/inspecting-text#inspecting_a_table to
// learn more.
type Table struct {
	// Headers of the table.
	Headers []*FieldId `protobuf:"bytes,1,rep,name=headers,proto3" json:"headers,omitempty"`
	// Rows of the table.
	Rows                 []*Table_Row `protobuf:"bytes,2,rep,name=rows,proto3" json:"rows,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_Table proto.InternalMessageInfo

func (m *Table) GetHeaders() []*FieldId {
	if m != nil {
		return m.Headers
	}
	return nil
}

func (m *Table) GetRows() []*Table_Row {
	if m != nil {
		return m.Rows
	}
	return nil
}

// Values of the row.
type Table_Row struct {
	// Individual cells.
	Values               []*Value `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Table_Row proto.InternalMessageInfo

func (m *Table_Row) GetValues() []*Value {
	if m != nil {
		return m.Values
	}
	return nil
}

// All the findings for a single scanned item.
type InspectResult struct {
	// List of findings for an item.
	Findings []*Finding `protobuf:"bytes,1,rep,name=findings,proto3" json:"findings,omitempty"`
	// If true, then this item might have more findings than were returned,
	// and the findings returned are an arbitrary subset of all findings.
	// The findings list might be truncated because the input items were too
	// large, or because the server reached the maximum amount of resources
	// allowed for a single API call. For best results, divide the input into
	// smaller batches.
	FindingsTruncated    bool     `protobuf:"varint,2,opt,name=findings_truncated,json=findingsTruncated,proto3" json:"findings_truncated,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_InspectResult proto.InternalMessageInfo

func (m *InspectResult) GetFindings() []*Finding {
	if m != nil {
		return m.Findings
	}
	return nil
}

func (m *InspectResult) GetFindingsTruncated() bool {
	if m != nil {
		return m.FindingsTruncated
	}
	return false
}

// Represents a piece of potentially sensitive content.
type Finding struct {
	// The content that was found. Even if the content is not textual, it
	// may be converted to a textual representation here.
	// Provided if `include_quote` is true and the finding is
	// less than or equal to 4096 bytes long. If the finding exceeds 4096 bytes
	// in length, the quote may be omitted.
	Quote string `protobuf:"bytes,1,opt,name=quote,proto3" json:"quote,omitempty"`
	// The type of content that might have been found.
	// Provided if `excluded_types` is false.
	InfoType *InfoType `protobuf:"bytes,2,opt,name=info_type,json=infoType,proto3" json:"info_type,omitempty"`
	// Confidence of how likely it is that the `info_type` is correct.
	Likelihood Likelihood `protobuf:"varint,3,opt,name=likelihood,proto3,enum=google.privacy.dlp.v2.Likelihood" json:"likelihood,omitempty"`
	// Where the content was found.
	Location *Location `protobuf:"bytes,4,opt,name=location,proto3" json:"location,omitempty"`
	// Timestamp when finding was detected.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Contains data parsed from quotes. Only populated if include_quote was set
	// to true and a supported infoType was requested. Currently supported
	// infoTypes: DATE, DATE_OF_BIRTH and TIME.
	QuoteInfo            *QuoteInfo `protobuf:"bytes,7,opt,name=quote_info,json=quoteInfo,proto3" json:"quote_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Finding proto.InternalMessageInfo

func (m *Finding) GetQuote() string {
	if m != nil {
		return m.Quote
	}
	return ""
}

func (m *Finding) GetInfoType() *InfoType {
	if m != nil {
		return m.InfoType
	}
	return nil
}

func (m *Finding) GetLikelihood() Likelihood {
	if m != nil {
		return m.Likelihood
	}
	return Likelihood_LIKELIHOOD_UNSPECIFIED
}

func (m *Finding) GetLocation() *Location {
	if m != nil {
		return m.Location
	}
	return nil
}

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

func (m *Finding) GetQuoteInfo() *QuoteInfo {
	if m != nil {
		return m.QuoteInfo
	}
	return nil
}

// Specifies the location of the finding.
type Location struct {
	// Zero-based byte offsets delimiting the finding.
	// These are relative to the finding's containing element.
	// Note that when the content is not textual, this references
	// the UTF-8 encoded textual representation of the content.
	// Omitted if content is an image.
	ByteRange *Range `protobuf:"bytes,1,opt,name=byte_range,json=byteRange,proto3" json:"byte_range,omitempty"`
	// Unicode character offsets delimiting the finding.
	// These are relative to the finding's containing element.
	// Provided when the content is text.
	CodepointRange *Range `protobuf:"bytes,2,opt,name=codepoint_range,json=codepointRange,proto3" json:"codepoint_range,omitempty"`
	// List of nested objects pointing to the precise location of the finding
	// within the file or record.
	ContentLocations     []*ContentLocation `protobuf:"bytes,7,rep,name=content_locations,json=contentLocations,proto3" json:"content_locations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_Location proto.InternalMessageInfo

func (m *Location) GetByteRange() *Range {
	if m != nil {
		return m.ByteRange
	}
	return nil
}

func (m *Location) GetCodepointRange() *Range {
	if m != nil {
		return m.CodepointRange
	}
	return nil
}

func (m *Location) GetContentLocations() []*ContentLocation {
	if m != nil {
		return m.ContentLocations
	}
	return nil
}

// Findings container location data.
type ContentLocation struct {
	// Name of the container where the finding is located.
	// The top level name is the source file name or table name. Names of some
	// common storage containers are formatted as follows:
	//
	// * BigQuery tables:  `{project_id}:{dataset_id}.{table_id}`
	// * Cloud Storage files: `gs://{bucket}/{path}`
	// * Datastore namespace: {namespace}
	//
	// Nested names could be absent if the embedded object has no string
	// identifier (for an example an image contained within a document).
	ContainerName string `protobuf:"bytes,1,opt,name=container_name,json=containerName,proto3" json:"container_name,omitempty"`
	// Type of the container within the file with location of the finding.
	//
	// Types that are valid to be assigned to Location:
	//	*ContentLocation_RecordLocation
	//	*ContentLocation_ImageLocation
	//	*ContentLocation_DocumentLocation
	Location isContentLocation_Location `protobuf_oneof:"location"`
	// Findings container modification timestamp, if applicable.
	// For Google Cloud Storage contains last file modification timestamp.
	// For BigQuery table contains last_modified_time property.
	// For Datastore - not populated.
	ContainerTimestamp *timestamp.Timestamp `protobuf:"bytes,6,opt,name=container_timestamp,json=containerTimestamp,proto3" json:"container_timestamp,omitempty"`
	// Findings container version, if available
	// ("generation" for Google Cloud Storage).
	ContainerVersion     string   `protobuf:"bytes,7,opt,name=container_version,json=containerVersion,proto3" json:"container_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ContentLocation proto.InternalMessageInfo

func (m *ContentLocation) GetContainerName() string {
	if m != nil {
		return m.ContainerName
	}
	return ""
}

type isContentLocation_Location interface {
	isContentLocation_Location()
}

type ContentLocation_RecordLocation struct {
	RecordLocation *RecordLocation `protobuf:"bytes,2,opt,name=record_location,json=recordLocation,proto3,oneof"`
}

type ContentLocation_ImageLocation struct {
	ImageLocation *ImageLocation `protobuf:"bytes,3,opt,name=image_location,json=imageLocation,proto3,oneof"`
}

type ContentLocation_DocumentLocation struct {
	DocumentLocation *DocumentLocation `protobuf:"bytes,5,opt,name=document_location,json=documentLocation,proto3,oneof"`
}

func (*ContentLocation_RecordLocation) isContentLocation_Location() {}

func (*ContentLocation_ImageLocation) isContentLocation_Location() {}

func (*ContentLocation_DocumentLocation) isContentLocation_Location() {}

func (m *ContentLocation) GetLocation() isContentLocation_Location {
	if m != nil {
		return m.Location
	}
	return nil
}

func (m *ContentLocation) GetRecordLocation() *RecordLocation {
	if x, ok := m.GetLocation().(*ContentLocation_RecordLocation); ok {
		return x.RecordLocation
	}
	return nil
}

func (m *ContentLocation) GetImageLocation() *ImageLocation {
	if x, ok := m.GetLocation().(*ContentLocation_ImageLocation); ok {
		return x.ImageLocation
	}
	return nil
}

func (m *ContentLocation) GetDocumentLocation() *DocumentLocation {
	if x, ok := m.GetLocation().(*ContentLocation_DocumentLocation); ok {
		return x.DocumentLocation
	}
	return nil
}

func (m *ContentLocation) GetContainerTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.ContainerTimestamp
	}
	return nil
}

func (m *ContentLocation) GetContainerVersion() string {
	if m != nil {
		return m.ContainerVersion
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ContentLocation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ContentLocation_RecordLocation)(nil),
		(*ContentLocation_ImageLocation)(nil),
		(*ContentLocation_DocumentLocation)(nil),
	}
}

// Location of a finding within a document.
type DocumentLocation struct {
	// Offset of the line, from the beginning of the file, where the finding
	// is located.
	FileOffset           int64    `protobuf:"varint,1,opt,name=file_offset,json=fileOffset,proto3" json:"file_offset,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DocumentLocation proto.InternalMessageInfo

func (m *DocumentLocation) GetFileOffset() int64 {
	if m != nil {
		return m.FileOffset
	}
	return 0
}

// Location of a finding within a row or record.
type RecordLocation struct {
	// Key of the finding.
	RecordKey *RecordKey `protobuf:"bytes,1,opt,name=record_key,json=recordKey,proto3" json:"record_key,omitempty"`
	// Field id of the field containing the finding.
	FieldId *FieldId `protobuf:"bytes,2,opt,name=field_id,json=fieldId,proto3" json:"field_id,omitempty"`
	// Location within a `ContentItem.Table`.
	TableLocation        *TableLocation `protobuf:"bytes,3,opt,name=table_location,json=tableLocation,proto3" json:"table_location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_RecordLocation proto.InternalMessageInfo

func (m *RecordLocation) GetRecordKey() *RecordKey {
	if m != nil {
		return m.RecordKey
	}
	return nil
}

func (m *RecordLocation) GetFieldId() *FieldId {
	if m != nil {
		return m.FieldId
	}
	return nil
}

func (m *RecordLocation) GetTableLocation() *TableLocation {
	if m != nil {
		return m.TableLocation
	}
	return nil
}

// Location of a finding within a table.
type TableLocation struct {
	// The zero-based index of the row where the finding is located.
	RowIndex             int64    `protobuf:"varint,1,opt,name=row_index,json=rowIndex,proto3" json:"row_index,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TableLocation proto.InternalMessageInfo

func (m *TableLocation) GetRowIndex() int64 {
	if m != nil {
		return m.RowIndex
	}
	return 0
}

// Generic half-open interval [start, end)
type Range struct {
	// Index of the first character of the range (inclusive).
	Start int64 `protobuf:"varint,1,opt,name=start,proto3" json:"start,omitempty"`
	// Index of the last character of the range (exclusive).
	End                  int64    `protobuf:"varint,2,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Range proto.InternalMessageInfo

func (m *Range) GetStart() int64 {
	if m != nil {
		return m.Start
	}
	return 0
}

func (m *Range) GetEnd() int64 {
	if m != nil {
		return m.End
	}
	return 0
}

// Location of the finding within an image.
type ImageLocation struct {
	// Bounding boxes locating the pixels within the image containing the finding.
	BoundingBoxes        []*BoundingBox `protobuf:"bytes,1,rep,name=bounding_boxes,json=boundingBoxes,proto3" json:"bounding_boxes,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *ImageLocation) Reset()         { *m = ImageLocation{} }
func (m *ImageLocation) String() string { return proto.CompactTextString(m) }
func (*ImageLocation) ProtoMessage()    {}
func (*ImageLocation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{16}
}

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

var xxx_messageInfo_ImageLocation proto.InternalMessageInfo

func (m *ImageLocation) GetBoundingBoxes() []*BoundingBox {
	if m != nil {
		return m.BoundingBoxes
	}
	return nil
}

// Bounding box encompassing detected text within an image.
type BoundingBox struct {
	// Top coordinate of the bounding box. (0,0) is upper left.
	Top int32 `protobuf:"varint,1,opt,name=top,proto3" json:"top,omitempty"`
	// Left coordinate of the bounding box. (0,0) is upper left.
	Left int32 `protobuf:"varint,2,opt,name=left,proto3" json:"left,omitempty"`
	// Width of the bounding box in pixels.
	Width int32 `protobuf:"varint,3,opt,name=width,proto3" json:"width,omitempty"`
	// Height of the bounding box in pixels.
	Height               int32    `protobuf:"varint,4,opt,name=height,proto3" json:"height,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BoundingBox) Reset()         { *m = BoundingBox{} }
func (m *BoundingBox) String() string { return proto.CompactTextString(m) }
func (*BoundingBox) ProtoMessage()    {}
func (*BoundingBox) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{17}
}

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

var xxx_messageInfo_BoundingBox proto.InternalMessageInfo

func (m *BoundingBox) GetTop() int32 {
	if m != nil {
		return m.Top
	}
	return 0
}

func (m *BoundingBox) GetLeft() int32 {
	if m != nil {
		return m.Left
	}
	return 0
}

func (m *BoundingBox) GetWidth() int32 {
	if m != nil {
		return m.Width
	}
	return 0
}

func (m *BoundingBox) GetHeight() int32 {
	if m != nil {
		return m.Height
	}
	return 0
}

// Request to search for potentially sensitive info in an image and redact it
// by covering it with a colored rectangle.
type RedactImageRequest struct {
	// The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The geographic location to process the request. Reserved for future
	// extensions.
	LocationId string `protobuf:"bytes,8,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	// Configuration for the inspector.
	InspectConfig *InspectConfig `protobuf:"bytes,2,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// The configuration for specifying what content to redact from images.
	ImageRedactionConfigs []*RedactImageRequest_ImageRedactionConfig `protobuf:"bytes,5,rep,name=image_redaction_configs,json=imageRedactionConfigs,proto3" json:"image_redaction_configs,omitempty"`
	// Whether the response should include findings along with the redacted
	// image.
	IncludeFindings bool `protobuf:"varint,6,opt,name=include_findings,json=includeFindings,proto3" json:"include_findings,omitempty"`
	// The content must be PNG, JPEG, SVG or BMP.
	ByteItem             *ByteContentItem `protobuf:"bytes,7,opt,name=byte_item,json=byteItem,proto3" json:"byte_item,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *RedactImageRequest) Reset()         { *m = RedactImageRequest{} }
func (m *RedactImageRequest) String() string { return proto.CompactTextString(m) }
func (*RedactImageRequest) ProtoMessage()    {}
func (*RedactImageRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{18}
}

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

var xxx_messageInfo_RedactImageRequest proto.InternalMessageInfo

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

func (m *RedactImageRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

func (m *RedactImageRequest) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *RedactImageRequest) GetImageRedactionConfigs() []*RedactImageRequest_ImageRedactionConfig {
	if m != nil {
		return m.ImageRedactionConfigs
	}
	return nil
}

func (m *RedactImageRequest) GetIncludeFindings() bool {
	if m != nil {
		return m.IncludeFindings
	}
	return false
}

func (m *RedactImageRequest) GetByteItem() *ByteContentItem {
	if m != nil {
		return m.ByteItem
	}
	return nil
}

// Configuration for determining how redaction of images should occur.
type RedactImageRequest_ImageRedactionConfig struct {
	// Type of information to redact from images.
	//
	// Types that are valid to be assigned to Target:
	//	*RedactImageRequest_ImageRedactionConfig_InfoType
	//	*RedactImageRequest_ImageRedactionConfig_RedactAllText
	Target isRedactImageRequest_ImageRedactionConfig_Target `protobuf_oneof:"target"`
	// The color to use when redacting content from an image. If not specified,
	// the default is black.
	RedactionColor       *Color   `protobuf:"bytes,3,opt,name=redaction_color,json=redactionColor,proto3" json:"redaction_color,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RedactImageRequest_ImageRedactionConfig proto.InternalMessageInfo

type isRedactImageRequest_ImageRedactionConfig_Target interface {
	isRedactImageRequest_ImageRedactionConfig_Target()
}

type RedactImageRequest_ImageRedactionConfig_InfoType struct {
	InfoType *InfoType `protobuf:"bytes,1,opt,name=info_type,json=infoType,proto3,oneof"`
}

type RedactImageRequest_ImageRedactionConfig_RedactAllText struct {
	RedactAllText bool `protobuf:"varint,2,opt,name=redact_all_text,json=redactAllText,proto3,oneof"`
}

func (*RedactImageRequest_ImageRedactionConfig_InfoType) isRedactImageRequest_ImageRedactionConfig_Target() {
}

func (*RedactImageRequest_ImageRedactionConfig_RedactAllText) isRedactImageRequest_ImageRedactionConfig_Target() {
}

func (m *RedactImageRequest_ImageRedactionConfig) GetTarget() isRedactImageRequest_ImageRedactionConfig_Target {
	if m != nil {
		return m.Target
	}
	return nil
}

func (m *RedactImageRequest_ImageRedactionConfig) GetInfoType() *InfoType {
	if x, ok := m.GetTarget().(*RedactImageRequest_ImageRedactionConfig_InfoType); ok {
		return x.InfoType
	}
	return nil
}

func (m *RedactImageRequest_ImageRedactionConfig) GetRedactAllText() bool {
	if x, ok := m.GetTarget().(*RedactImageRequest_ImageRedactionConfig_RedactAllText); ok {
		return x.RedactAllText
	}
	return false
}

func (m *RedactImageRequest_ImageRedactionConfig) GetRedactionColor() *Color {
	if m != nil {
		return m.RedactionColor
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*RedactImageRequest_ImageRedactionConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*RedactImageRequest_ImageRedactionConfig_InfoType)(nil),
		(*RedactImageRequest_ImageRedactionConfig_RedactAllText)(nil),
	}
}

// Represents a color in the RGB color space.
type Color struct {
	// The amount of red in the color as a value in the interval [0, 1].
	Red float32 `protobuf:"fixed32,1,opt,name=red,proto3" json:"red,omitempty"`
	// The amount of green in the color as a value in the interval [0, 1].
	Green float32 `protobuf:"fixed32,2,opt,name=green,proto3" json:"green,omitempty"`
	// The amount of blue in the color as a value in the interval [0, 1].
	Blue                 float32  `protobuf:"fixed32,3,opt,name=blue,proto3" json:"blue,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Color) Reset()         { *m = Color{} }
func (m *Color) String() string { return proto.CompactTextString(m) }
func (*Color) ProtoMessage()    {}
func (*Color) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{19}
}

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

var xxx_messageInfo_Color proto.InternalMessageInfo

func (m *Color) GetRed() float32 {
	if m != nil {
		return m.Red
	}
	return 0
}

func (m *Color) GetGreen() float32 {
	if m != nil {
		return m.Green
	}
	return 0
}

func (m *Color) GetBlue() float32 {
	if m != nil {
		return m.Blue
	}
	return 0
}

// Results of redacting an image.
type RedactImageResponse struct {
	// The redacted image. The type will be the same as the original image.
	RedactedImage []byte `protobuf:"bytes,1,opt,name=redacted_image,json=redactedImage,proto3" json:"redacted_image,omitempty"`
	// If an image was being inspected and the InspectConfig's include_quote was
	// set to true, then this field will include all text, if any, that was found
	// in the image.
	ExtractedText string `protobuf:"bytes,2,opt,name=extracted_text,json=extractedText,proto3" json:"extracted_text,omitempty"`
	// The findings. Populated when include_findings in the request is true.
	InspectResult        *InspectResult `protobuf:"bytes,3,opt,name=inspect_result,json=inspectResult,proto3" json:"inspect_result,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *RedactImageResponse) Reset()         { *m = RedactImageResponse{} }
func (m *RedactImageResponse) String() string { return proto.CompactTextString(m) }
func (*RedactImageResponse) ProtoMessage()    {}
func (*RedactImageResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{20}
}

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

var xxx_messageInfo_RedactImageResponse proto.InternalMessageInfo

func (m *RedactImageResponse) GetRedactedImage() []byte {
	if m != nil {
		return m.RedactedImage
	}
	return nil
}

func (m *RedactImageResponse) GetExtractedText() string {
	if m != nil {
		return m.ExtractedText
	}
	return ""
}

func (m *RedactImageResponse) GetInspectResult() *InspectResult {
	if m != nil {
		return m.InspectResult
	}
	return nil
}

// Request to de-identify a list of items.
type DeidentifyContentRequest struct {
	// The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Configuration for the de-identification of the content item.
	// Items specified here will override the template referenced by the
	// deidentify_template_name argument.
	DeidentifyConfig *DeidentifyConfig `protobuf:"bytes,2,opt,name=deidentify_config,json=deidentifyConfig,proto3" json:"deidentify_config,omitempty"`
	// Configuration for the inspector.
	// Items specified here will override the template referenced by the
	// inspect_template_name argument.
	InspectConfig *InspectConfig `protobuf:"bytes,3,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// The item to de-identify. Will be treated as text.
	Item *ContentItem `protobuf:"bytes,4,opt,name=item,proto3" json:"item,omitempty"`
	// Template to use. Any configuration directly specified in
	// inspect_config will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	InspectTemplateName string `protobuf:"bytes,5,opt,name=inspect_template_name,json=inspectTemplateName,proto3" json:"inspect_template_name,omitempty"`
	// Template to use. Any configuration directly specified in
	// deidentify_config will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	DeidentifyTemplateName string `protobuf:"bytes,6,opt,name=deidentify_template_name,json=deidentifyTemplateName,proto3" json:"deidentify_template_name,omitempty"`
	// The geographic location to process de-identification. Reserved for future
	// extensions.
	LocationId           string   `protobuf:"bytes,7,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DeidentifyContentRequest) Reset()         { *m = DeidentifyContentRequest{} }
func (m *DeidentifyContentRequest) String() string { return proto.CompactTextString(m) }
func (*DeidentifyContentRequest) ProtoMessage()    {}
func (*DeidentifyContentRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{21}
}

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

var xxx_messageInfo_DeidentifyContentRequest proto.InternalMessageInfo

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

func (m *DeidentifyContentRequest) GetDeidentifyConfig() *DeidentifyConfig {
	if m != nil {
		return m.DeidentifyConfig
	}
	return nil
}

func (m *DeidentifyContentRequest) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *DeidentifyContentRequest) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *DeidentifyContentRequest) GetInspectTemplateName() string {
	if m != nil {
		return m.InspectTemplateName
	}
	return ""
}

func (m *DeidentifyContentRequest) GetDeidentifyTemplateName() string {
	if m != nil {
		return m.DeidentifyTemplateName
	}
	return ""
}

func (m *DeidentifyContentRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Results of de-identifying a ContentItem.
type DeidentifyContentResponse struct {
	// The de-identified item.
	Item *ContentItem `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"`
	// An overview of the changes that were made on the `item`.
	Overview             *TransformationOverview `protobuf:"bytes,2,opt,name=overview,proto3" json:"overview,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *DeidentifyContentResponse) Reset()         { *m = DeidentifyContentResponse{} }
func (m *DeidentifyContentResponse) String() string { return proto.CompactTextString(m) }
func (*DeidentifyContentResponse) ProtoMessage()    {}
func (*DeidentifyContentResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{22}
}

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

var xxx_messageInfo_DeidentifyContentResponse proto.InternalMessageInfo

func (m *DeidentifyContentResponse) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *DeidentifyContentResponse) GetOverview() *TransformationOverview {
	if m != nil {
		return m.Overview
	}
	return nil
}

// Request to re-identify an item.
type ReidentifyContentRequest struct {
	// Required. The parent resource name.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Configuration for the re-identification of the content item.
	// This field shares the same proto message type that is used for
	// de-identification, however its usage here is for the reversal of the
	// previous de-identification. Re-identification is performed by examining
	// the transformations used to de-identify the items and executing the
	// reverse. This requires that only reversible transformations
	// be provided here. The reversible transformations are:
	//
	//  - `CryptoDeterministicConfig`
	//  - `CryptoReplaceFfxFpeConfig`
	ReidentifyConfig *DeidentifyConfig `protobuf:"bytes,2,opt,name=reidentify_config,json=reidentifyConfig,proto3" json:"reidentify_config,omitempty"`
	// Configuration for the inspector.
	InspectConfig *InspectConfig `protobuf:"bytes,3,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// The item to re-identify. Will be treated as text.
	Item *ContentItem `protobuf:"bytes,4,opt,name=item,proto3" json:"item,omitempty"`
	// Template to use. Any configuration directly specified in
	// `inspect_config` will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	InspectTemplateName string `protobuf:"bytes,5,opt,name=inspect_template_name,json=inspectTemplateName,proto3" json:"inspect_template_name,omitempty"`
	// Template to use. References an instance of `DeidentifyTemplate`.
	// Any configuration directly specified in `reidentify_config` or
	// `inspect_config` will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	ReidentifyTemplateName string `protobuf:"bytes,6,opt,name=reidentify_template_name,json=reidentifyTemplateName,proto3" json:"reidentify_template_name,omitempty"`
	// The geographic location to process content reidentification.  Reserved for
	// future extensions.
	LocationId           string   `protobuf:"bytes,7,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ReidentifyContentRequest) Reset()         { *m = ReidentifyContentRequest{} }
func (m *ReidentifyContentRequest) String() string { return proto.CompactTextString(m) }
func (*ReidentifyContentRequest) ProtoMessage()    {}
func (*ReidentifyContentRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{23}
}

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

var xxx_messageInfo_ReidentifyContentRequest proto.InternalMessageInfo

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

func (m *ReidentifyContentRequest) GetReidentifyConfig() *DeidentifyConfig {
	if m != nil {
		return m.ReidentifyConfig
	}
	return nil
}

func (m *ReidentifyContentRequest) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *ReidentifyContentRequest) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *ReidentifyContentRequest) GetInspectTemplateName() string {
	if m != nil {
		return m.InspectTemplateName
	}
	return ""
}

func (m *ReidentifyContentRequest) GetReidentifyTemplateName() string {
	if m != nil {
		return m.ReidentifyTemplateName
	}
	return ""
}

func (m *ReidentifyContentRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Results of re-identifying a item.
type ReidentifyContentResponse struct {
	// The re-identified item.
	Item *ContentItem `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"`
	// An overview of the changes that were made to the `item`.
	Overview             *TransformationOverview `protobuf:"bytes,2,opt,name=overview,proto3" json:"overview,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *ReidentifyContentResponse) Reset()         { *m = ReidentifyContentResponse{} }
func (m *ReidentifyContentResponse) String() string { return proto.CompactTextString(m) }
func (*ReidentifyContentResponse) ProtoMessage()    {}
func (*ReidentifyContentResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{24}
}

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

var xxx_messageInfo_ReidentifyContentResponse proto.InternalMessageInfo

func (m *ReidentifyContentResponse) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *ReidentifyContentResponse) GetOverview() *TransformationOverview {
	if m != nil {
		return m.Overview
	}
	return nil
}

// Request to search for potentially sensitive info in a ContentItem.
type InspectContentRequest struct {
	// The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Configuration for the inspector. What specified here will override
	// the template referenced by the inspect_template_name argument.
	InspectConfig *InspectConfig `protobuf:"bytes,2,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// The item to inspect.
	Item *ContentItem `protobuf:"bytes,3,opt,name=item,proto3" json:"item,omitempty"`
	// Template to use. Any configuration directly specified in
	// inspect_config will override those set in the template. Singular fields
	// that are set in this request will replace their corresponding fields in the
	// template. Repeated fields are appended. Singular sub-messages and groups
	// are recursively merged.
	InspectTemplateName string `protobuf:"bytes,4,opt,name=inspect_template_name,json=inspectTemplateName,proto3" json:"inspect_template_name,omitempty"`
	// The geographic location to process content inspection. Reserved for future
	// extensions.
	LocationId           string   `protobuf:"bytes,5,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InspectContentRequest) Reset()         { *m = InspectContentRequest{} }
func (m *InspectContentRequest) String() string { return proto.CompactTextString(m) }
func (*InspectContentRequest) ProtoMessage()    {}
func (*InspectContentRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{25}
}

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

var xxx_messageInfo_InspectContentRequest proto.InternalMessageInfo

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

func (m *InspectContentRequest) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *InspectContentRequest) GetItem() *ContentItem {
	if m != nil {
		return m.Item
	}
	return nil
}

func (m *InspectContentRequest) GetInspectTemplateName() string {
	if m != nil {
		return m.InspectTemplateName
	}
	return ""
}

func (m *InspectContentRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Results of inspecting an item.
type InspectContentResponse struct {
	// The findings.
	Result               *InspectResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *InspectContentResponse) Reset()         { *m = InspectContentResponse{} }
func (m *InspectContentResponse) String() string { return proto.CompactTextString(m) }
func (*InspectContentResponse) ProtoMessage()    {}
func (*InspectContentResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{26}
}

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

var xxx_messageInfo_InspectContentResponse proto.InternalMessageInfo

func (m *InspectContentResponse) GetResult() *InspectResult {
	if m != nil {
		return m.Result
	}
	return nil
}

// Cloud repository for storing output.
type OutputStorageConfig struct {
	// Output storage types.
	//
	// Types that are valid to be assigned to Type:
	//	*OutputStorageConfig_Table
	Type isOutputStorageConfig_Type `protobuf_oneof:"type"`
	// Schema used for writing the findings for Inspect jobs. This field is only
	// used for Inspect and must be unspecified for Risk jobs. Columns are derived
	// from the `Finding` object. If appending to an existing table, any columns
	// from the predefined schema that are missing will be added. No columns in
	// the existing table will be deleted.
	//
	// If unspecified, then all available columns will be used for a new table or
	// an (existing) table with no schema, and no changes will be made to an
	// existing table that has a schema.
	OutputSchema         OutputStorageConfig_OutputSchema `protobuf:"varint,3,opt,name=output_schema,json=outputSchema,proto3,enum=google.privacy.dlp.v2.OutputStorageConfig_OutputSchema" json:"output_schema,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

func (m *OutputStorageConfig) Reset()         { *m = OutputStorageConfig{} }
func (m *OutputStorageConfig) String() string { return proto.CompactTextString(m) }
func (*OutputStorageConfig) ProtoMessage()    {}
func (*OutputStorageConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{27}
}

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

var xxx_messageInfo_OutputStorageConfig proto.InternalMessageInfo

type isOutputStorageConfig_Type interface {
	isOutputStorageConfig_Type()
}

type OutputStorageConfig_Table struct {
	Table *BigQueryTable `protobuf:"bytes,1,opt,name=table,proto3,oneof"`
}

func (*OutputStorageConfig_Table) isOutputStorageConfig_Type() {}

func (m *OutputStorageConfig) GetType() isOutputStorageConfig_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *OutputStorageConfig) GetTable() *BigQueryTable {
	if x, ok := m.GetType().(*OutputStorageConfig_Table); ok {
		return x.Table
	}
	return nil
}

func (m *OutputStorageConfig) GetOutputSchema() OutputStorageConfig_OutputSchema {
	if m != nil {
		return m.OutputSchema
	}
	return OutputStorageConfig_OUTPUT_SCHEMA_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OutputStorageConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OutputStorageConfig_Table)(nil),
	}
}

// Statistics regarding a specific InfoType.
type InfoTypeStats struct {
	// The type of finding this stat is for.
	InfoType *InfoType `protobuf:"bytes,1,opt,name=info_type,json=infoType,proto3" json:"info_type,omitempty"`
	// Number of findings for this infoType.
	Count                int64    `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InfoTypeStats) Reset()         { *m = InfoTypeStats{} }
func (m *InfoTypeStats) String() string { return proto.CompactTextString(m) }
func (*InfoTypeStats) ProtoMessage()    {}
func (*InfoTypeStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{28}
}

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

var xxx_messageInfo_InfoTypeStats proto.InternalMessageInfo

func (m *InfoTypeStats) GetInfoType() *InfoType {
	if m != nil {
		return m.InfoType
	}
	return nil
}

func (m *InfoTypeStats) GetCount() int64 {
	if m != nil {
		return m.Count
	}
	return 0
}

// The results of an inspect DataSource job.
type InspectDataSourceDetails struct {
	// The configuration used for this job.
	RequestedOptions *InspectDataSourceDetails_RequestedOptions `protobuf:"bytes,2,opt,name=requested_options,json=requestedOptions,proto3" json:"requested_options,omitempty"`
	// A summary of the outcome of this inspect job.
	Result               *InspectDataSourceDetails_Result `protobuf:"bytes,3,opt,name=result,proto3" json:"result,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

func (m *InspectDataSourceDetails) Reset()         { *m = InspectDataSourceDetails{} }
func (m *InspectDataSourceDetails) String() string { return proto.CompactTextString(m) }
func (*InspectDataSourceDetails) ProtoMessage()    {}
func (*InspectDataSourceDetails) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{29}
}

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

var xxx_messageInfo_InspectDataSourceDetails proto.InternalMessageInfo

func (m *InspectDataSourceDetails) GetRequestedOptions() *InspectDataSourceDetails_RequestedOptions {
	if m != nil {
		return m.RequestedOptions
	}
	return nil
}

func (m *InspectDataSourceDetails) GetResult() *InspectDataSourceDetails_Result {
	if m != nil {
		return m.Result
	}
	return nil
}

// Snapshot of the inspection configuration.
type InspectDataSourceDetails_RequestedOptions struct {
	// If run with an InspectTemplate, a snapshot of its state at the time of
	// this run.
	SnapshotInspectTemplate *InspectTemplate `protobuf:"bytes,1,opt,name=snapshot_inspect_template,json=snapshotInspectTemplate,proto3" json:"snapshot_inspect_template,omitempty"`
	// Inspect config.
	JobConfig            *InspectJobConfig `protobuf:"bytes,3,opt,name=job_config,json=jobConfig,proto3" json:"job_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_InspectDataSourceDetails_RequestedOptions proto.InternalMessageInfo

func (m *InspectDataSourceDetails_RequestedOptions) GetSnapshotInspectTemplate() *InspectTemplate {
	if m != nil {
		return m.SnapshotInspectTemplate
	}
	return nil
}

func (m *InspectDataSourceDetails_RequestedOptions) GetJobConfig() *InspectJobConfig {
	if m != nil {
		return m.JobConfig
	}
	return nil
}

// All result fields mentioned below are updated while the job is processing.
type InspectDataSourceDetails_Result struct {
	// Total size in bytes that were processed.
	ProcessedBytes int64 `protobuf:"varint,1,opt,name=processed_bytes,json=processedBytes,proto3" json:"processed_bytes,omitempty"`
	// Estimate of the number of bytes to process.
	TotalEstimatedBytes int64 `protobuf:"varint,2,opt,name=total_estimated_bytes,json=totalEstimatedBytes,proto3" json:"total_estimated_bytes,omitempty"`
	// Statistics of how many instances of each info type were found during
	// inspect job.
	InfoTypeStats        []*InfoTypeStats `protobuf:"bytes,3,rep,name=info_type_stats,json=infoTypeStats,proto3" json:"info_type_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_InspectDataSourceDetails_Result proto.InternalMessageInfo

func (m *InspectDataSourceDetails_Result) GetProcessedBytes() int64 {
	if m != nil {
		return m.ProcessedBytes
	}
	return 0
}

func (m *InspectDataSourceDetails_Result) GetTotalEstimatedBytes() int64 {
	if m != nil {
		return m.TotalEstimatedBytes
	}
	return 0
}

func (m *InspectDataSourceDetails_Result) GetInfoTypeStats() []*InfoTypeStats {
	if m != nil {
		return m.InfoTypeStats
	}
	return nil
}

// InfoType description.
type InfoTypeDescription struct {
	// Internal name of the infoType.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Human readable form of the infoType name.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Which parts of the API supports this InfoType.
	SupportedBy []InfoTypeSupportedBy `protobuf:"varint,3,rep,packed,name=supported_by,json=supportedBy,proto3,enum=google.privacy.dlp.v2.InfoTypeSupportedBy" json:"supported_by,omitempty"`
	// Description of the infotype. Translated when language is provided in the
	// request.
	Description          string   `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *InfoTypeDescription) Reset()         { *m = InfoTypeDescription{} }
func (m *InfoTypeDescription) String() string { return proto.CompactTextString(m) }
func (*InfoTypeDescription) ProtoMessage()    {}
func (*InfoTypeDescription) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{30}
}

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

var xxx_messageInfo_InfoTypeDescription proto.InternalMessageInfo

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

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

func (m *InfoTypeDescription) GetSupportedBy() []InfoTypeSupportedBy {
	if m != nil {
		return m.SupportedBy
	}
	return nil
}

func (m *InfoTypeDescription) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

// Request for the list of infoTypes.
type ListInfoTypesRequest struct {
	// BCP-47 language code for localized infoType friendly
	// names. If omitted, or if localized strings are not available,
	// en-US strings will be returned.
	LanguageCode string `protobuf:"bytes,1,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// filter to only return infoTypes supported by certain parts of the
	// API. Defaults to supported_by=INSPECT.
	Filter string `protobuf:"bytes,2,opt,name=filter,proto3" json:"filter,omitempty"`
	// The geographic location to list info types. Reserved for future
	// extensions.
	LocationId           string   `protobuf:"bytes,3,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListInfoTypesRequest) Reset()         { *m = ListInfoTypesRequest{} }
func (m *ListInfoTypesRequest) String() string { return proto.CompactTextString(m) }
func (*ListInfoTypesRequest) ProtoMessage()    {}
func (*ListInfoTypesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{31}
}

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

var xxx_messageInfo_ListInfoTypesRequest proto.InternalMessageInfo

func (m *ListInfoTypesRequest) GetLanguageCode() string {
	if m != nil {
		return m.LanguageCode
	}
	return ""
}

func (m *ListInfoTypesRequest) GetFilter() string {
	if m != nil {
		return m.Filter
	}
	return ""
}

func (m *ListInfoTypesRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Response to the ListInfoTypes request.
type ListInfoTypesResponse struct {
	// Set of sensitive infoTypes.
	InfoTypes            []*InfoTypeDescription `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *ListInfoTypesResponse) Reset()         { *m = ListInfoTypesResponse{} }
func (m *ListInfoTypesResponse) String() string { return proto.CompactTextString(m) }
func (*ListInfoTypesResponse) ProtoMessage()    {}
func (*ListInfoTypesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{32}
}

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

var xxx_messageInfo_ListInfoTypesResponse proto.InternalMessageInfo

func (m *ListInfoTypesResponse) GetInfoTypes() []*InfoTypeDescription {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

// Configuration for a risk analysis job. See
// https://cloud.google.com/dlp/docs/concepts-risk-analysis to learn more.
type RiskAnalysisJobConfig struct {
	// Privacy metric to compute.
	PrivacyMetric *PrivacyMetric `protobuf:"bytes,1,opt,name=privacy_metric,json=privacyMetric,proto3" json:"privacy_metric,omitempty"`
	// Input dataset to compute metrics over.
	SourceTable *BigQueryTable `protobuf:"bytes,2,opt,name=source_table,json=sourceTable,proto3" json:"source_table,omitempty"`
	// Actions to execute at the completion of the job. Are executed in the order
	// provided.
	Actions              []*Action `protobuf:"bytes,3,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *RiskAnalysisJobConfig) Reset()         { *m = RiskAnalysisJobConfig{} }
func (m *RiskAnalysisJobConfig) String() string { return proto.CompactTextString(m) }
func (*RiskAnalysisJobConfig) ProtoMessage()    {}
func (*RiskAnalysisJobConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{33}
}

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

var xxx_messageInfo_RiskAnalysisJobConfig proto.InternalMessageInfo

func (m *RiskAnalysisJobConfig) GetPrivacyMetric() *PrivacyMetric {
	if m != nil {
		return m.PrivacyMetric
	}
	return nil
}

func (m *RiskAnalysisJobConfig) GetSourceTable() *BigQueryTable {
	if m != nil {
		return m.SourceTable
	}
	return nil
}

func (m *RiskAnalysisJobConfig) GetActions() []*Action {
	if m != nil {
		return m.Actions
	}
	return nil
}

// A column with a semantic tag attached.
type QuasiId struct {
	// Required. Identifies the column.
	Field *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	// Semantic tag that identifies what a column contains, to determine which
	// statistical model to use to estimate the reidentifiability of each
	// value. [required]
	//
	// Types that are valid to be assigned to Tag:
	//	*QuasiId_InfoType
	//	*QuasiId_CustomTag
	//	*QuasiId_Inferred
	Tag                  isQuasiId_Tag `protobuf_oneof:"tag"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *QuasiId) Reset()         { *m = QuasiId{} }
func (m *QuasiId) String() string { return proto.CompactTextString(m) }
func (*QuasiId) ProtoMessage()    {}
func (*QuasiId) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{34}
}

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

var xxx_messageInfo_QuasiId proto.InternalMessageInfo

func (m *QuasiId) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

type isQuasiId_Tag interface {
	isQuasiId_Tag()
}

type QuasiId_InfoType struct {
	InfoType *InfoType `protobuf:"bytes,2,opt,name=info_type,json=infoType,proto3,oneof"`
}

type QuasiId_CustomTag struct {
	CustomTag string `protobuf:"bytes,3,opt,name=custom_tag,json=customTag,proto3,oneof"`
}

type QuasiId_Inferred struct {
	Inferred *empty.Empty `protobuf:"bytes,4,opt,name=inferred,proto3,oneof"`
}

func (*QuasiId_InfoType) isQuasiId_Tag() {}

func (*QuasiId_CustomTag) isQuasiId_Tag() {}

func (*QuasiId_Inferred) isQuasiId_Tag() {}

func (m *QuasiId) GetTag() isQuasiId_Tag {
	if m != nil {
		return m.Tag
	}
	return nil
}

func (m *QuasiId) GetInfoType() *InfoType {
	if x, ok := m.GetTag().(*QuasiId_InfoType); ok {
		return x.InfoType
	}
	return nil
}

func (m *QuasiId) GetCustomTag() string {
	if x, ok := m.GetTag().(*QuasiId_CustomTag); ok {
		return x.CustomTag
	}
	return ""
}

func (m *QuasiId) GetInferred() *empty.Empty {
	if x, ok := m.GetTag().(*QuasiId_Inferred); ok {
		return x.Inferred
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*QuasiId) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*QuasiId_InfoType)(nil),
		(*QuasiId_CustomTag)(nil),
		(*QuasiId_Inferred)(nil),
	}
}

// An auxiliary table containing statistical information on the relative
// frequency of different quasi-identifiers values. It has one or several
// quasi-identifiers columns, and one column that indicates the relative
// frequency of each quasi-identifier tuple.
// If a tuple is present in the data but not in the auxiliary table, the
// corresponding relative frequency is assumed to be zero (and thus, the
// tuple is highly reidentifiable).
type StatisticalTable struct {
	// Required. Auxiliary table location.
	Table *BigQueryTable `protobuf:"bytes,3,opt,name=table,proto3" json:"table,omitempty"`
	// Required. Quasi-identifier columns.
	QuasiIds []*StatisticalTable_QuasiIdentifierField `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// Required. The relative frequency column must contain a floating-point number
	// between 0 and 1 (inclusive). Null values are assumed to be zero.
	RelativeFrequency    *FieldId `protobuf:"bytes,2,opt,name=relative_frequency,json=relativeFrequency,proto3" json:"relative_frequency,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StatisticalTable) Reset()         { *m = StatisticalTable{} }
func (m *StatisticalTable) String() string { return proto.CompactTextString(m) }
func (*StatisticalTable) ProtoMessage()    {}
func (*StatisticalTable) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{35}
}

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

var xxx_messageInfo_StatisticalTable proto.InternalMessageInfo

func (m *StatisticalTable) GetTable() *BigQueryTable {
	if m != nil {
		return m.Table
	}
	return nil
}

func (m *StatisticalTable) GetQuasiIds() []*StatisticalTable_QuasiIdentifierField {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *StatisticalTable) GetRelativeFrequency() *FieldId {
	if m != nil {
		return m.RelativeFrequency
	}
	return nil
}

// A quasi-identifier column has a custom_tag, used to know which column
// in the data corresponds to which column in the statistical model.
type StatisticalTable_QuasiIdentifierField struct {
	// Identifies the column.
	Field *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	// A column can be tagged with a custom tag. In this case, the user must
	// indicate an auxiliary table that contains statistical information on
	// the possible values of this column (below).
	CustomTag            string   `protobuf:"bytes,2,opt,name=custom_tag,json=customTag,proto3" json:"custom_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_StatisticalTable_QuasiIdentifierField proto.InternalMessageInfo

func (m *StatisticalTable_QuasiIdentifierField) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *StatisticalTable_QuasiIdentifierField) GetCustomTag() string {
	if m != nil {
		return m.CustomTag
	}
	return ""
}

// Privacy metric to compute for reidentification risk analysis.
type PrivacyMetric struct {
	// Types of analysis.
	//
	// Types that are valid to be assigned to Type:
	//	*PrivacyMetric_NumericalStatsConfig_
	//	*PrivacyMetric_CategoricalStatsConfig_
	//	*PrivacyMetric_KAnonymityConfig_
	//	*PrivacyMetric_LDiversityConfig_
	//	*PrivacyMetric_KMapEstimationConfig_
	//	*PrivacyMetric_DeltaPresenceEstimationConfig_
	Type                 isPrivacyMetric_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *PrivacyMetric) Reset()         { *m = PrivacyMetric{} }
func (m *PrivacyMetric) String() string { return proto.CompactTextString(m) }
func (*PrivacyMetric) ProtoMessage()    {}
func (*PrivacyMetric) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36}
}

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

var xxx_messageInfo_PrivacyMetric proto.InternalMessageInfo

type isPrivacyMetric_Type interface {
	isPrivacyMetric_Type()
}

type PrivacyMetric_NumericalStatsConfig_ struct {
	NumericalStatsConfig *PrivacyMetric_NumericalStatsConfig `protobuf:"bytes,1,opt,name=numerical_stats_config,json=numericalStatsConfig,proto3,oneof"`
}

type PrivacyMetric_CategoricalStatsConfig_ struct {
	CategoricalStatsConfig *PrivacyMetric_CategoricalStatsConfig `protobuf:"bytes,2,opt,name=categorical_stats_config,json=categoricalStatsConfig,proto3,oneof"`
}

type PrivacyMetric_KAnonymityConfig_ struct {
	KAnonymityConfig *PrivacyMetric_KAnonymityConfig `protobuf:"bytes,3,opt,name=k_anonymity_config,json=kAnonymityConfig,proto3,oneof"`
}

type PrivacyMetric_LDiversityConfig_ struct {
	LDiversityConfig *PrivacyMetric_LDiversityConfig `protobuf:"bytes,4,opt,name=l_diversity_config,json=lDiversityConfig,proto3,oneof"`
}

type PrivacyMetric_KMapEstimationConfig_ struct {
	KMapEstimationConfig *PrivacyMetric_KMapEstimationConfig `protobuf:"bytes,5,opt,name=k_map_estimation_config,json=kMapEstimationConfig,proto3,oneof"`
}

type PrivacyMetric_DeltaPresenceEstimationConfig_ struct {
	DeltaPresenceEstimationConfig *PrivacyMetric_DeltaPresenceEstimationConfig `protobuf:"bytes,6,opt,name=delta_presence_estimation_config,json=deltaPresenceEstimationConfig,proto3,oneof"`
}

func (*PrivacyMetric_NumericalStatsConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_CategoricalStatsConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_KAnonymityConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_LDiversityConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_KMapEstimationConfig_) isPrivacyMetric_Type() {}

func (*PrivacyMetric_DeltaPresenceEstimationConfig_) isPrivacyMetric_Type() {}

func (m *PrivacyMetric) GetType() isPrivacyMetric_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *PrivacyMetric) GetNumericalStatsConfig() *PrivacyMetric_NumericalStatsConfig {
	if x, ok := m.GetType().(*PrivacyMetric_NumericalStatsConfig_); ok {
		return x.NumericalStatsConfig
	}
	return nil
}

func (m *PrivacyMetric) GetCategoricalStatsConfig() *PrivacyMetric_CategoricalStatsConfig {
	if x, ok := m.GetType().(*PrivacyMetric_CategoricalStatsConfig_); ok {
		return x.CategoricalStatsConfig
	}
	return nil
}

func (m *PrivacyMetric) GetKAnonymityConfig() *PrivacyMetric_KAnonymityConfig {
	if x, ok := m.GetType().(*PrivacyMetric_KAnonymityConfig_); ok {
		return x.KAnonymityConfig
	}
	return nil
}

func (m *PrivacyMetric) GetLDiversityConfig() *PrivacyMetric_LDiversityConfig {
	if x, ok := m.GetType().(*PrivacyMetric_LDiversityConfig_); ok {
		return x.LDiversityConfig
	}
	return nil
}

func (m *PrivacyMetric) GetKMapEstimationConfig() *PrivacyMetric_KMapEstimationConfig {
	if x, ok := m.GetType().(*PrivacyMetric_KMapEstimationConfig_); ok {
		return x.KMapEstimationConfig
	}
	return nil
}

func (m *PrivacyMetric) GetDeltaPresenceEstimationConfig() *PrivacyMetric_DeltaPresenceEstimationConfig {
	if x, ok := m.GetType().(*PrivacyMetric_DeltaPresenceEstimationConfig_); ok {
		return x.DeltaPresenceEstimationConfig
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PrivacyMetric) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PrivacyMetric_NumericalStatsConfig_)(nil),
		(*PrivacyMetric_CategoricalStatsConfig_)(nil),
		(*PrivacyMetric_KAnonymityConfig_)(nil),
		(*PrivacyMetric_LDiversityConfig_)(nil),
		(*PrivacyMetric_KMapEstimationConfig_)(nil),
		(*PrivacyMetric_DeltaPresenceEstimationConfig_)(nil),
	}
}

// Compute numerical stats over an individual column, including
// min, max, and quantiles.
type PrivacyMetric_NumericalStatsConfig struct {
	// Field to compute numerical stats on. Supported types are
	// integer, float, date, datetime, timestamp, time.
	Field                *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_NumericalStatsConfig proto.InternalMessageInfo

func (m *PrivacyMetric_NumericalStatsConfig) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

// Compute numerical stats over an individual column, including
// number of distinct values and value count distribution.
type PrivacyMetric_CategoricalStatsConfig struct {
	// Field to compute categorical stats on. All column types are
	// supported except for arrays and structs. However, it may be more
	// informative to use NumericalStats when the field type is supported,
	// depending on the data.
	Field                *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_CategoricalStatsConfig proto.InternalMessageInfo

func (m *PrivacyMetric_CategoricalStatsConfig) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

// k-anonymity metric, used for analysis of reidentification risk.
type PrivacyMetric_KAnonymityConfig struct {
	// Set of fields to compute k-anonymity over. When multiple fields are
	// specified, they are considered a single composite key. Structs and
	// repeated data types are not supported; however, nested fields are
	// supported so long as they are not structs themselves or nested within
	// a repeated field.
	QuasiIds []*FieldId `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// Message indicating that multiple rows might be associated to a
	// single individual. If the same entity_id is associated to multiple
	// quasi-identifier tuples over distinct rows, we consider the entire
	// collection of tuples as the composite quasi-identifier. This collection
	// is a multiset: the order in which the different tuples appear in the
	// dataset is ignored, but their frequency is taken into account.
	//
	// Important note: a maximum of 1000 rows can be associated to a single
	// entity ID. If more rows are associated with the same entity ID, some
	// might be ignored.
	EntityId             *EntityId `protobuf:"bytes,2,opt,name=entity_id,json=entityId,proto3" json:"entity_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_KAnonymityConfig proto.InternalMessageInfo

func (m *PrivacyMetric_KAnonymityConfig) GetQuasiIds() []*FieldId {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_KAnonymityConfig) GetEntityId() *EntityId {
	if m != nil {
		return m.EntityId
	}
	return nil
}

// l-diversity metric, used for analysis of reidentification risk.
type PrivacyMetric_LDiversityConfig struct {
	// Set of quasi-identifiers indicating how equivalence classes are
	// defined for the l-diversity computation. When multiple fields are
	// specified, they are considered a single composite key.
	QuasiIds []*FieldId `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// Sensitive field for computing the l-value.
	SensitiveAttribute   *FieldId `protobuf:"bytes,2,opt,name=sensitive_attribute,json=sensitiveAttribute,proto3" json:"sensitive_attribute,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_LDiversityConfig proto.InternalMessageInfo

func (m *PrivacyMetric_LDiversityConfig) GetQuasiIds() []*FieldId {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_LDiversityConfig) GetSensitiveAttribute() *FieldId {
	if m != nil {
		return m.SensitiveAttribute
	}
	return nil
}

// Reidentifiability metric. This corresponds to a risk model similar to what
// is called "journalist risk" in the literature, except the attack dataset is
// statistically modeled instead of being perfectly known. This can be done
// using publicly available data (like the US Census), or using a custom
// statistical model (indicated as one or several BigQuery tables), or by
// extrapolating from the distribution of values in the input dataset.
type PrivacyMetric_KMapEstimationConfig struct {
	// Required. Fields considered to be quasi-identifiers. No two columns can have the
	// same tag.
	QuasiIds []*PrivacyMetric_KMapEstimationConfig_TaggedField `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// ISO 3166-1 alpha-2 region code to use in the statistical modeling.
	// Set if no column is tagged with a region-specific InfoType (like
	// US_ZIP_5) or a region code.
	RegionCode string `protobuf:"bytes,2,opt,name=region_code,json=regionCode,proto3" json:"region_code,omitempty"`
	// Several auxiliary tables can be used in the analysis. Each custom_tag
	// used to tag a quasi-identifiers column must appear in exactly one column
	// of one auxiliary table.
	AuxiliaryTables      []*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable `protobuf:"bytes,3,rep,name=auxiliary_tables,json=auxiliaryTables,proto3" json:"auxiliary_tables,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                             `json:"-"`
	XXX_unrecognized     []byte                                               `json:"-"`
	XXX_sizecache        int32                                                `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_KMapEstimationConfig proto.InternalMessageInfo

func (m *PrivacyMetric_KMapEstimationConfig) GetQuasiIds() []*PrivacyMetric_KMapEstimationConfig_TaggedField {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig) GetRegionCode() string {
	if m != nil {
		return m.RegionCode
	}
	return ""
}

func (m *PrivacyMetric_KMapEstimationConfig) GetAuxiliaryTables() []*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable {
	if m != nil {
		return m.AuxiliaryTables
	}
	return nil
}

// A column with a semantic tag attached.
type PrivacyMetric_KMapEstimationConfig_TaggedField struct {
	// Required. Identifies the column.
	Field *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	// Semantic tag that identifies what a column contains, to determine which
	// statistical model to use to estimate the reidentifiability of each
	// value. [required]
	//
	// Types that are valid to be assigned to Tag:
	//	*PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType
	//	*PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag
	//	*PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred
	Tag                  isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag `protobuf_oneof:"tag"`
	XXX_NoUnkeyedLiteral struct{}                                             `json:"-"`
	XXX_unrecognized     []byte                                               `json:"-"`
	XXX_sizecache        int32                                                `json:"-"`
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) Reset() {
	*m = PrivacyMetric_KMapEstimationConfig_TaggedField{}
}
func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) String() string {
	return proto.CompactTextString(m)
}
func (*PrivacyMetric_KMapEstimationConfig_TaggedField) ProtoMessage() {}
func (*PrivacyMetric_KMapEstimationConfig_TaggedField) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36, 4, 0}
}

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

var xxx_messageInfo_PrivacyMetric_KMapEstimationConfig_TaggedField proto.InternalMessageInfo

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

type isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag interface {
	isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag()
}

type PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType struct {
	InfoType *InfoType `protobuf:"bytes,2,opt,name=info_type,json=infoType,proto3,oneof"`
}

type PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag struct {
	CustomTag string `protobuf:"bytes,3,opt,name=custom_tag,json=customTag,proto3,oneof"`
}

type PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred struct {
	Inferred *empty.Empty `protobuf:"bytes,4,opt,name=inferred,proto3,oneof"`
}

func (*PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType) isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag() {
}

func (*PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag) isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag() {
}

func (*PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred) isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag() {
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetTag() isPrivacyMetric_KMapEstimationConfig_TaggedField_Tag {
	if m != nil {
		return m.Tag
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetInfoType() *InfoType {
	if x, ok := m.GetTag().(*PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType); ok {
		return x.InfoType
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetCustomTag() string {
	if x, ok := m.GetTag().(*PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag); ok {
		return x.CustomTag
	}
	return ""
}

func (m *PrivacyMetric_KMapEstimationConfig_TaggedField) GetInferred() *empty.Empty {
	if x, ok := m.GetTag().(*PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred); ok {
		return x.Inferred
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PrivacyMetric_KMapEstimationConfig_TaggedField) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PrivacyMetric_KMapEstimationConfig_TaggedField_InfoType)(nil),
		(*PrivacyMetric_KMapEstimationConfig_TaggedField_CustomTag)(nil),
		(*PrivacyMetric_KMapEstimationConfig_TaggedField_Inferred)(nil),
	}
}

// An auxiliary table contains statistical information on the relative
// frequency of different quasi-identifiers values. It has one or several
// quasi-identifiers columns, and one column that indicates the relative
// frequency of each quasi-identifier tuple.
// If a tuple is present in the data but not in the auxiliary table, the
// corresponding relative frequency is assumed to be zero (and thus, the
// tuple is highly reidentifiable).
type PrivacyMetric_KMapEstimationConfig_AuxiliaryTable struct {
	// Required. Auxiliary table location.
	Table *BigQueryTable `protobuf:"bytes,3,opt,name=table,proto3" json:"table,omitempty"`
	// Required. Quasi-identifier columns.
	QuasiIds []*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// Required. The relative frequency column must contain a floating-point number
	// between 0 and 1 (inclusive). Null values are assumed to be zero.
	RelativeFrequency    *FieldId `protobuf:"bytes,2,opt,name=relative_frequency,json=relativeFrequency,proto3" json:"relative_frequency,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) Reset() {
	*m = PrivacyMetric_KMapEstimationConfig_AuxiliaryTable{}
}
func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) String() string {
	return proto.CompactTextString(m)
}
func (*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) ProtoMessage() {}
func (*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36, 4, 1}
}

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

var xxx_messageInfo_PrivacyMetric_KMapEstimationConfig_AuxiliaryTable proto.InternalMessageInfo

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) GetTable() *BigQueryTable {
	if m != nil {
		return m.Table
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) GetQuasiIds() []*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable) GetRelativeFrequency() *FieldId {
	if m != nil {
		return m.RelativeFrequency
	}
	return nil
}

// A quasi-identifier column has a custom_tag, used to know which column
// in the data corresponds to which column in the statistical model.
type PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField struct {
	// Identifies the column.
	Field *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	// A auxiliary field.
	CustomTag            string   `protobuf:"bytes,2,opt,name=custom_tag,json=customTag,proto3" json:"custom_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField) Reset() {
	*m = PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField{}
}
func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField) String() string {
	return proto.CompactTextString(m)
}
func (*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField) ProtoMessage() {}
func (*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{36, 4, 1, 0}
}

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

var xxx_messageInfo_PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField proto.InternalMessageInfo

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField) GetCustomTag() string {
	if m != nil {
		return m.CustomTag
	}
	return ""
}

// δ-presence metric, used to estimate how likely it is for an attacker to
// figure out that one given individual appears in a de-identified dataset.
// Similarly to the k-map metric, we cannot compute δ-presence exactly without
// knowing the attack dataset, so we use a statistical model instead.
type PrivacyMetric_DeltaPresenceEstimationConfig struct {
	// Required. Fields considered to be quasi-identifiers. No two fields can have the
	// same tag.
	QuasiIds []*QuasiId `protobuf:"bytes,1,rep,name=quasi_ids,json=quasiIds,proto3" json:"quasi_ids,omitempty"`
	// ISO 3166-1 alpha-2 region code to use in the statistical modeling.
	// Set if no column is tagged with a region-specific InfoType (like
	// US_ZIP_5) or a region code.
	RegionCode string `protobuf:"bytes,2,opt,name=region_code,json=regionCode,proto3" json:"region_code,omitempty"`
	// Several auxiliary tables can be used in the analysis. Each custom_tag
	// used to tag a quasi-identifiers field must appear in exactly one
	// field of one auxiliary table.
	AuxiliaryTables      []*StatisticalTable `protobuf:"bytes,3,rep,name=auxiliary_tables,json=auxiliaryTables,proto3" json:"auxiliary_tables,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_PrivacyMetric_DeltaPresenceEstimationConfig proto.InternalMessageInfo

func (m *PrivacyMetric_DeltaPresenceEstimationConfig) GetQuasiIds() []*QuasiId {
	if m != nil {
		return m.QuasiIds
	}
	return nil
}

func (m *PrivacyMetric_DeltaPresenceEstimationConfig) GetRegionCode() string {
	if m != nil {
		return m.RegionCode
	}
	return ""
}

func (m *PrivacyMetric_DeltaPresenceEstimationConfig) GetAuxiliaryTables() []*StatisticalTable {
	if m != nil {
		return m.AuxiliaryTables
	}
	return nil
}

// Result of a risk analysis operation request.
type AnalyzeDataSourceRiskDetails struct {
	// Privacy metric to compute.
	RequestedPrivacyMetric *PrivacyMetric `protobuf:"bytes,1,opt,name=requested_privacy_metric,json=requestedPrivacyMetric,proto3" json:"requested_privacy_metric,omitempty"`
	// Input dataset to compute metrics over.
	RequestedSourceTable *BigQueryTable `protobuf:"bytes,2,opt,name=requested_source_table,json=requestedSourceTable,proto3" json:"requested_source_table,omitempty"`
	// Values associated with this metric.
	//
	// Types that are valid to be assigned to Result:
	//	*AnalyzeDataSourceRiskDetails_NumericalStatsResult_
	//	*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_
	//	*AnalyzeDataSourceRiskDetails_KAnonymityResult_
	//	*AnalyzeDataSourceRiskDetails_LDiversityResult_
	//	*AnalyzeDataSourceRiskDetails_KMapEstimationResult_
	//	*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_
	Result               isAnalyzeDataSourceRiskDetails_Result `protobuf_oneof:"result"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails) Reset()         { *m = AnalyzeDataSourceRiskDetails{} }
func (m *AnalyzeDataSourceRiskDetails) String() string { return proto.CompactTextString(m) }
func (*AnalyzeDataSourceRiskDetails) ProtoMessage()    {}
func (*AnalyzeDataSourceRiskDetails) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails) GetRequestedPrivacyMetric() *PrivacyMetric {
	if m != nil {
		return m.RequestedPrivacyMetric
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetRequestedSourceTable() *BigQueryTable {
	if m != nil {
		return m.RequestedSourceTable
	}
	return nil
}

type isAnalyzeDataSourceRiskDetails_Result interface {
	isAnalyzeDataSourceRiskDetails_Result()
}

type AnalyzeDataSourceRiskDetails_NumericalStatsResult_ struct {
	NumericalStatsResult *AnalyzeDataSourceRiskDetails_NumericalStatsResult `protobuf:"bytes,3,opt,name=numerical_stats_result,json=numericalStatsResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_CategoricalStatsResult_ struct {
	CategoricalStatsResult *AnalyzeDataSourceRiskDetails_CategoricalStatsResult `protobuf:"bytes,4,opt,name=categorical_stats_result,json=categoricalStatsResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_KAnonymityResult_ struct {
	KAnonymityResult *AnalyzeDataSourceRiskDetails_KAnonymityResult `protobuf:"bytes,5,opt,name=k_anonymity_result,json=kAnonymityResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_LDiversityResult_ struct {
	LDiversityResult *AnalyzeDataSourceRiskDetails_LDiversityResult `protobuf:"bytes,6,opt,name=l_diversity_result,json=lDiversityResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_KMapEstimationResult_ struct {
	KMapEstimationResult *AnalyzeDataSourceRiskDetails_KMapEstimationResult `protobuf:"bytes,7,opt,name=k_map_estimation_result,json=kMapEstimationResult,proto3,oneof"`
}

type AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_ struct {
	DeltaPresenceEstimationResult *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult `protobuf:"bytes,9,opt,name=delta_presence_estimation_result,json=deltaPresenceEstimationResult,proto3,oneof"`
}

func (*AnalyzeDataSourceRiskDetails_NumericalStatsResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_LDiversityResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_) isAnalyzeDataSourceRiskDetails_Result() {}

func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_) isAnalyzeDataSourceRiskDetails_Result() {
}

func (m *AnalyzeDataSourceRiskDetails) GetResult() isAnalyzeDataSourceRiskDetails_Result {
	if m != nil {
		return m.Result
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetNumericalStatsResult() *AnalyzeDataSourceRiskDetails_NumericalStatsResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_NumericalStatsResult_); ok {
		return x.NumericalStatsResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetCategoricalStatsResult() *AnalyzeDataSourceRiskDetails_CategoricalStatsResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_); ok {
		return x.CategoricalStatsResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetKAnonymityResult() *AnalyzeDataSourceRiskDetails_KAnonymityResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_KAnonymityResult_); ok {
		return x.KAnonymityResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetLDiversityResult() *AnalyzeDataSourceRiskDetails_LDiversityResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_LDiversityResult_); ok {
		return x.LDiversityResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetKMapEstimationResult() *AnalyzeDataSourceRiskDetails_KMapEstimationResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_KMapEstimationResult_); ok {
		return x.KMapEstimationResult
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails) GetDeltaPresenceEstimationResult() *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult {
	if x, ok := m.GetResult().(*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_); ok {
		return x.DeltaPresenceEstimationResult
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*AnalyzeDataSourceRiskDetails) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*AnalyzeDataSourceRiskDetails_NumericalStatsResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_KAnonymityResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_LDiversityResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_KMapEstimationResult_)(nil),
		(*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_)(nil),
	}
}

// Result of the numerical stats computation.
type AnalyzeDataSourceRiskDetails_NumericalStatsResult struct {
	// Minimum value appearing in the column.
	MinValue *Value `protobuf:"bytes,1,opt,name=min_value,json=minValue,proto3" json:"min_value,omitempty"`
	// Maximum value appearing in the column.
	MaxValue *Value `protobuf:"bytes,2,opt,name=max_value,json=maxValue,proto3" json:"max_value,omitempty"`
	// List of 99 values that partition the set of field values into 100 equal
	// sized buckets.
	QuantileValues       []*Value `protobuf:"bytes,4,rep,name=quantile_values,json=quantileValues,proto3" json:"quantile_values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_NumericalStatsResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_NumericalStatsResult) GetMinValue() *Value {
	if m != nil {
		return m.MinValue
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_NumericalStatsResult) GetMaxValue() *Value {
	if m != nil {
		return m.MaxValue
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_NumericalStatsResult) GetQuantileValues() []*Value {
	if m != nil {
		return m.QuantileValues
	}
	return nil
}

// Result of the categorical stats computation.
type AnalyzeDataSourceRiskDetails_CategoricalStatsResult struct {
	// Histogram of value frequencies in the column.
	ValueFrequencyHistogramBuckets []*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket `protobuf:"bytes,5,rep,name=value_frequency_histogram_buckets,json=valueFrequencyHistogramBuckets,proto3" json:"value_frequency_histogram_buckets,omitempty"`
	XXX_NoUnkeyedLiteral           struct{}                                                                               `json:"-"`
	XXX_unrecognized               []byte                                                                                 `json:"-"`
	XXX_sizecache                  int32                                                                                  `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_CategoricalStatsResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult) GetValueFrequencyHistogramBuckets() []*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket {
	if m != nil {
		return m.ValueFrequencyHistogramBuckets
	}
	return nil
}

// Histogram of value frequencies in the column.
type AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket struct {
	// Lower bound on the value frequency of the values in this bucket.
	ValueFrequencyLowerBound int64 `protobuf:"varint,1,opt,name=value_frequency_lower_bound,json=valueFrequencyLowerBound,proto3" json:"value_frequency_lower_bound,omitempty"`
	// Upper bound on the value frequency of the values in this bucket.
	ValueFrequencyUpperBound int64 `protobuf:"varint,2,opt,name=value_frequency_upper_bound,json=valueFrequencyUpperBound,proto3" json:"value_frequency_upper_bound,omitempty"`
	// Total number of values in this bucket.
	BucketSize int64 `protobuf:"varint,3,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of value frequencies in this bucket. The total number of
	// values returned per bucket is capped at 20.
	BucketValues []*ValueFrequency `protobuf:"bytes,4,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct values in this bucket.
	BucketValueCount     int64    `protobuf:"varint,5,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) Reset() {
	*m = AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket{}
}
func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) ProtoMessage() {
}
func (*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 1, 0}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetValueFrequencyLowerBound() int64 {
	if m != nil {
		return m.ValueFrequencyLowerBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetValueFrequencyUpperBound() int64 {
	if m != nil {
		return m.ValueFrequencyUpperBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetBucketValues() []*ValueFrequency {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// Result of the k-anonymity computation.
type AnalyzeDataSourceRiskDetails_KAnonymityResult struct {
	// Histogram of k-anonymity equivalence classes.
	EquivalenceClassHistogramBuckets []*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket `protobuf:"bytes,5,rep,name=equivalence_class_histogram_buckets,json=equivalenceClassHistogramBuckets,proto3" json:"equivalence_class_histogram_buckets,omitempty"`
	XXX_NoUnkeyedLiteral             struct{}                                                                   `json:"-"`
	XXX_unrecognized                 []byte                                                                     `json:"-"`
	XXX_sizecache                    int32                                                                      `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KAnonymityResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult) GetEquivalenceClassHistogramBuckets() []*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket {
	if m != nil {
		return m.EquivalenceClassHistogramBuckets
	}
	return nil
}

// The set of columns' values that share the same ldiversity value
type AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass struct {
	// Set of values defining the equivalence class. One value per
	// quasi-identifier column in the original KAnonymity metric message.
	// The order is always the same as the original request.
	QuasiIdsValues []*Value `protobuf:"bytes,1,rep,name=quasi_ids_values,json=quasiIdsValues,proto3" json:"quasi_ids_values,omitempty"`
	// Size of the equivalence class, for example number of rows with the
	// above set of values.
	EquivalenceClassSize int64    `protobuf:"varint,2,opt,name=equivalence_class_size,json=equivalenceClassSize,proto3" json:"equivalence_class_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) Reset() {
	*m = AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass{}
}
func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 2, 0}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) GetQuasiIdsValues() []*Value {
	if m != nil {
		return m.QuasiIdsValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass) GetEquivalenceClassSize() int64 {
	if m != nil {
		return m.EquivalenceClassSize
	}
	return 0
}

// Histogram of k-anonymity equivalence classes.
type AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket struct {
	// Lower bound on the size of the equivalence classes in this bucket.
	EquivalenceClassSizeLowerBound int64 `protobuf:"varint,1,opt,name=equivalence_class_size_lower_bound,json=equivalenceClassSizeLowerBound,proto3" json:"equivalence_class_size_lower_bound,omitempty"`
	// Upper bound on the size of the equivalence classes in this bucket.
	EquivalenceClassSizeUpperBound int64 `protobuf:"varint,2,opt,name=equivalence_class_size_upper_bound,json=equivalenceClassSizeUpperBound,proto3" json:"equivalence_class_size_upper_bound,omitempty"`
	// Total number of equivalence classes in this bucket.
	BucketSize int64 `protobuf:"varint,3,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of equivalence classes in this bucket. The total number of
	// classes returned per bucket is capped at 20.
	BucketValues []*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass `protobuf:"bytes,4,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct equivalence classes in this bucket.
	BucketValueCount     int64    `protobuf:"varint,5,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) Reset() {
	*m = AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket{}
}
func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 2, 1}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetEquivalenceClassSizeLowerBound() int64 {
	if m != nil {
		return m.EquivalenceClassSizeLowerBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetEquivalenceClassSizeUpperBound() int64 {
	if m != nil {
		return m.EquivalenceClassSizeUpperBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetBucketValues() []*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// Result of the l-diversity computation.
type AnalyzeDataSourceRiskDetails_LDiversityResult struct {
	// Histogram of l-diversity equivalence class sensitive value frequencies.
	SensitiveValueFrequencyHistogramBuckets []*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket `protobuf:"bytes,5,rep,name=sensitive_value_frequency_histogram_buckets,json=sensitiveValueFrequencyHistogramBuckets,proto3" json:"sensitive_value_frequency_histogram_buckets,omitempty"`
	XXX_NoUnkeyedLiteral                    struct{}                                                                   `json:"-"`
	XXX_unrecognized                        []byte                                                                     `json:"-"`
	XXX_sizecache                           int32                                                                      `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_LDiversityResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult) GetSensitiveValueFrequencyHistogramBuckets() []*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket {
	if m != nil {
		return m.SensitiveValueFrequencyHistogramBuckets
	}
	return nil
}

// The set of columns' values that share the same ldiversity value.
type AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass struct {
	// Quasi-identifier values defining the k-anonymity equivalence
	// class. The order is always the same as the original request.
	QuasiIdsValues []*Value `protobuf:"bytes,1,rep,name=quasi_ids_values,json=quasiIdsValues,proto3" json:"quasi_ids_values,omitempty"`
	// Size of the k-anonymity equivalence class.
	EquivalenceClassSize int64 `protobuf:"varint,2,opt,name=equivalence_class_size,json=equivalenceClassSize,proto3" json:"equivalence_class_size,omitempty"`
	// Number of distinct sensitive values in this equivalence class.
	NumDistinctSensitiveValues int64 `protobuf:"varint,3,opt,name=num_distinct_sensitive_values,json=numDistinctSensitiveValues,proto3" json:"num_distinct_sensitive_values,omitempty"`
	// Estimated frequencies of top sensitive values.
	TopSensitiveValues   []*ValueFrequency `protobuf:"bytes,4,rep,name=top_sensitive_values,json=topSensitiveValues,proto3" json:"top_sensitive_values,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) Reset() {
	*m = AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass{}
}
func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 3, 0}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) GetQuasiIdsValues() []*Value {
	if m != nil {
		return m.QuasiIdsValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) GetEquivalenceClassSize() int64 {
	if m != nil {
		return m.EquivalenceClassSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) GetNumDistinctSensitiveValues() int64 {
	if m != nil {
		return m.NumDistinctSensitiveValues
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass) GetTopSensitiveValues() []*ValueFrequency {
	if m != nil {
		return m.TopSensitiveValues
	}
	return nil
}

// Histogram of l-diversity equivalence class sensitive value frequencies.
type AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket struct {
	// Lower bound on the sensitive value frequencies of the equivalence
	// classes in this bucket.
	SensitiveValueFrequencyLowerBound int64 `protobuf:"varint,1,opt,name=sensitive_value_frequency_lower_bound,json=sensitiveValueFrequencyLowerBound,proto3" json:"sensitive_value_frequency_lower_bound,omitempty"`
	// Upper bound on the sensitive value frequencies of the equivalence
	// classes in this bucket.
	SensitiveValueFrequencyUpperBound int64 `protobuf:"varint,2,opt,name=sensitive_value_frequency_upper_bound,json=sensitiveValueFrequencyUpperBound,proto3" json:"sensitive_value_frequency_upper_bound,omitempty"`
	// Total number of equivalence classes in this bucket.
	BucketSize int64 `protobuf:"varint,3,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of equivalence classes in this bucket. The total number of
	// classes returned per bucket is capped at 20.
	BucketValues []*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass `protobuf:"bytes,4,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct equivalence classes in this bucket.
	BucketValueCount     int64    `protobuf:"varint,5,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) Reset() {
	*m = AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket{}
}
func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 3, 1}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetSensitiveValueFrequencyLowerBound() int64 {
	if m != nil {
		return m.SensitiveValueFrequencyLowerBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetSensitiveValueFrequencyUpperBound() int64 {
	if m != nil {
		return m.SensitiveValueFrequencyUpperBound
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetBucketValues() []*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// Result of the reidentifiability analysis. Note that these results are an
// estimation, not exact values.
type AnalyzeDataSourceRiskDetails_KMapEstimationResult struct {
	// The intervals [min_anonymity, max_anonymity] do not overlap. If a value
	// doesn't correspond to any such interval, the associated frequency is
	// zero. For example, the following records:
	//   {min_anonymity: 1, max_anonymity: 1, frequency: 17}
	//   {min_anonymity: 2, max_anonymity: 3, frequency: 42}
	//   {min_anonymity: 5, max_anonymity: 10, frequency: 99}
	// mean that there are no record with an estimated anonymity of 4, 5, or
	// larger than 10.
	KMapEstimationHistogram []*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket `protobuf:"bytes,1,rep,name=k_map_estimation_histogram,json=kMapEstimationHistogram,proto3" json:"k_map_estimation_histogram,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                                                                           `json:"-"`
	XXX_unrecognized        []byte                                                                             `json:"-"`
	XXX_sizecache           int32                                                                              `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KMapEstimationResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult) GetKMapEstimationHistogram() []*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket {
	if m != nil {
		return m.KMapEstimationHistogram
	}
	return nil
}

// A tuple of values for the quasi-identifier columns.
type AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues struct {
	// The quasi-identifier values.
	QuasiIdsValues []*Value `protobuf:"bytes,1,rep,name=quasi_ids_values,json=quasiIdsValues,proto3" json:"quasi_ids_values,omitempty"`
	// The estimated anonymity for these quasi-identifier values.
	EstimatedAnonymity   int64    `protobuf:"varint,2,opt,name=estimated_anonymity,json=estimatedAnonymity,proto3" json:"estimated_anonymity,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) Reset() {
	*m = AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues{}
}
func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) ProtoMessage() {}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 4, 0}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) GetQuasiIdsValues() []*Value {
	if m != nil {
		return m.QuasiIdsValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues) GetEstimatedAnonymity() int64 {
	if m != nil {
		return m.EstimatedAnonymity
	}
	return 0
}

// A KMapEstimationHistogramBucket message with the following values:
//   min_anonymity: 3
//   max_anonymity: 5
//   frequency: 42
// means that there are 42 records whose quasi-identifier values correspond
// to 3, 4 or 5 people in the overlying population. An important particular
// case is when min_anonymity = max_anonymity = 1: the frequency field then
// corresponds to the number of uniquely identifiable records.
type AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket struct {
	// Always positive.
	MinAnonymity int64 `protobuf:"varint,1,opt,name=min_anonymity,json=minAnonymity,proto3" json:"min_anonymity,omitempty"`
	// Always greater than or equal to min_anonymity.
	MaxAnonymity int64 `protobuf:"varint,2,opt,name=max_anonymity,json=maxAnonymity,proto3" json:"max_anonymity,omitempty"`
	// Number of records within these anonymity bounds.
	BucketSize int64 `protobuf:"varint,5,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of quasi-identifier tuple values in this bucket. The total
	// number of classes returned per bucket is capped at 20.
	BucketValues []*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues `protobuf:"bytes,6,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct quasi-identifier tuple values in this bucket.
	BucketValueCount     int64    `protobuf:"varint,7,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) Reset() {
	*m = AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket{}
}
func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) ProtoMessage() {
}
func (*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 4, 1}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetMinAnonymity() int64 {
	if m != nil {
		return m.MinAnonymity
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetMaxAnonymity() int64 {
	if m != nil {
		return m.MaxAnonymity
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetBucketValues() []*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// Result of the δ-presence computation. Note that these results are an
// estimation, not exact values.
type AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult struct {
	// The intervals [min_probability, max_probability) do not overlap. If a
	// value doesn't correspond to any such interval, the associated frequency
	// is zero. For example, the following records:
	//   {min_probability: 0, max_probability: 0.1, frequency: 17}
	//   {min_probability: 0.2, max_probability: 0.3, frequency: 42}
	//   {min_probability: 0.3, max_probability: 0.4, frequency: 99}
	// mean that there are no record with an estimated probability in [0.1, 0.2)
	// nor larger or equal to 0.4.
	DeltaPresenceEstimationHistogram []*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket `protobuf:"bytes,1,rep,name=delta_presence_estimation_histogram,json=deltaPresenceEstimationHistogram,proto3" json:"delta_presence_estimation_histogram,omitempty"`
	XXX_NoUnkeyedLiteral             struct{}                                                                                             `json:"-"`
	XXX_unrecognized                 []byte                                                                                               `json:"-"`
	XXX_sizecache                    int32                                                                                                `json:"-"`
}

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

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult) GetDeltaPresenceEstimationHistogram() []*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket {
	if m != nil {
		return m.DeltaPresenceEstimationHistogram
	}
	return nil
}

// A tuple of values for the quasi-identifier columns.
type AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues struct {
	// The quasi-identifier values.
	QuasiIdsValues []*Value `protobuf:"bytes,1,rep,name=quasi_ids_values,json=quasiIdsValues,proto3" json:"quasi_ids_values,omitempty"`
	// The estimated probability that a given individual sharing these
	// quasi-identifier values is in the dataset. This value, typically called
	// δ, is the ratio between the number of records in the dataset with these
	// quasi-identifier values, and the total number of individuals (inside
	// *and* outside the dataset) with these quasi-identifier values.
	// For example, if there are 15 individuals in the dataset who share the
	// same quasi-identifier values, and an estimated 100 people in the entire
	// population with these values, then δ is 0.15.
	EstimatedProbability float64  `protobuf:"fixed64,2,opt,name=estimated_probability,json=estimatedProbability,proto3" json:"estimated_probability,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) Reset() {
	*m = AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues{}
}
func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) ProtoMessage() {
}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 5, 0}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) GetQuasiIdsValues() []*Value {
	if m != nil {
		return m.QuasiIdsValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues) GetEstimatedProbability() float64 {
	if m != nil {
		return m.EstimatedProbability
	}
	return 0
}

// A DeltaPresenceEstimationHistogramBucket message with the following
// values:
//   min_probability: 0.1
//   max_probability: 0.2
//   frequency: 42
// means that there are 42 records for which δ is in [0.1, 0.2). An
// important particular case is when min_probability = max_probability = 1:
// then, every individual who shares this quasi-identifier combination is in
// the dataset.
type AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket struct {
	// Between 0 and 1.
	MinProbability float64 `protobuf:"fixed64,1,opt,name=min_probability,json=minProbability,proto3" json:"min_probability,omitempty"`
	// Always greater than or equal to min_probability.
	MaxProbability float64 `protobuf:"fixed64,2,opt,name=max_probability,json=maxProbability,proto3" json:"max_probability,omitempty"`
	// Number of records within these probability bounds.
	BucketSize int64 `protobuf:"varint,5,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	// Sample of quasi-identifier tuple values in this bucket. The total
	// number of classes returned per bucket is capped at 20.
	BucketValues []*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues `protobuf:"bytes,6,rep,name=bucket_values,json=bucketValues,proto3" json:"bucket_values,omitempty"`
	// Total number of distinct quasi-identifier tuple values in this bucket.
	BucketValueCount     int64    `protobuf:"varint,7,opt,name=bucket_value_count,json=bucketValueCount,proto3" json:"bucket_value_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) Reset() {
	*m = AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket{}
}
func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) String() string {
	return proto.CompactTextString(m)
}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) ProtoMessage() {
}
func (*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{37, 5, 1}
}

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

var xxx_messageInfo_AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket proto.InternalMessageInfo

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetMinProbability() float64 {
	if m != nil {
		return m.MinProbability
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetMaxProbability() float64 {
	if m != nil {
		return m.MaxProbability
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetBucketSize() int64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetBucketValues() []*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues {
	if m != nil {
		return m.BucketValues
	}
	return nil
}

func (m *AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket) GetBucketValueCount() int64 {
	if m != nil {
		return m.BucketValueCount
	}
	return 0
}

// A value of a field, including its frequency.
type ValueFrequency struct {
	// A value contained in the field in question.
	Value *Value `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	// How many times the value is contained in the field.
	Count                int64    `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ValueFrequency) Reset()         { *m = ValueFrequency{} }
func (m *ValueFrequency) String() string { return proto.CompactTextString(m) }
func (*ValueFrequency) ProtoMessage()    {}
func (*ValueFrequency) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{38}
}

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

var xxx_messageInfo_ValueFrequency proto.InternalMessageInfo

func (m *ValueFrequency) GetValue() *Value {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *ValueFrequency) GetCount() int64 {
	if m != nil {
		return m.Count
	}
	return 0
}

// Set of primitive values supported by the system.
// Note that for the purposes of inspection or transformation, the number
// of bytes considered to comprise a 'Value' is based on its representation
// as a UTF-8 encoded string. For example, if 'integer_value' is set to
// 123456789, the number of bytes would be counted as 9, even though an
// int64 only holds up to 8 bytes of data.
type Value struct {
	// Value types
	//
	// Types that are valid to be assigned to Type:
	//	*Value_IntegerValue
	//	*Value_FloatValue
	//	*Value_StringValue
	//	*Value_BooleanValue
	//	*Value_TimestampValue
	//	*Value_TimeValue
	//	*Value_DateValue
	//	*Value_DayOfWeekValue
	Type                 isValue_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

func (m *Value) Reset()         { *m = Value{} }
func (m *Value) String() string { return proto.CompactTextString(m) }
func (*Value) ProtoMessage()    {}
func (*Value) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{39}
}

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

var xxx_messageInfo_Value proto.InternalMessageInfo

type isValue_Type interface {
	isValue_Type()
}

type Value_IntegerValue struct {
	IntegerValue int64 `protobuf:"varint,1,opt,name=integer_value,json=integerValue,proto3,oneof"`
}

type Value_FloatValue struct {
	FloatValue float64 `protobuf:"fixed64,2,opt,name=float_value,json=floatValue,proto3,oneof"`
}

type Value_StringValue struct {
	StringValue string `protobuf:"bytes,3,opt,name=string_value,json=stringValue,proto3,oneof"`
}

type Value_BooleanValue struct {
	BooleanValue bool `protobuf:"varint,4,opt,name=boolean_value,json=booleanValue,proto3,oneof"`
}

type Value_TimestampValue struct {
	TimestampValue *timestamp.Timestamp `protobuf:"bytes,5,opt,name=timestamp_value,json=timestampValue,proto3,oneof"`
}

type Value_TimeValue struct {
	TimeValue *timeofday.TimeOfDay `protobuf:"bytes,6,opt,name=time_value,json=timeValue,proto3,oneof"`
}

type Value_DateValue struct {
	DateValue *date.Date `protobuf:"bytes,7,opt,name=date_value,json=dateValue,proto3,oneof"`
}

type Value_DayOfWeekValue struct {
	DayOfWeekValue dayofweek.DayOfWeek `protobuf:"varint,8,opt,name=day_of_week_value,json=dayOfWeekValue,proto3,enum=google.type.DayOfWeek,oneof"`
}

func (*Value_IntegerValue) isValue_Type() {}

func (*Value_FloatValue) isValue_Type() {}

func (*Value_StringValue) isValue_Type() {}

func (*Value_BooleanValue) isValue_Type() {}

func (*Value_TimestampValue) isValue_Type() {}

func (*Value_TimeValue) isValue_Type() {}

func (*Value_DateValue) isValue_Type() {}

func (*Value_DayOfWeekValue) isValue_Type() {}

func (m *Value) GetType() isValue_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *Value) GetIntegerValue() int64 {
	if x, ok := m.GetType().(*Value_IntegerValue); ok {
		return x.IntegerValue
	}
	return 0
}

func (m *Value) GetFloatValue() float64 {
	if x, ok := m.GetType().(*Value_FloatValue); ok {
		return x.FloatValue
	}
	return 0
}

func (m *Value) GetStringValue() string {
	if x, ok := m.GetType().(*Value_StringValue); ok {
		return x.StringValue
	}
	return ""
}

func (m *Value) GetBooleanValue() bool {
	if x, ok := m.GetType().(*Value_BooleanValue); ok {
		return x.BooleanValue
	}
	return false
}

func (m *Value) GetTimestampValue() *timestamp.Timestamp {
	if x, ok := m.GetType().(*Value_TimestampValue); ok {
		return x.TimestampValue
	}
	return nil
}

func (m *Value) GetTimeValue() *timeofday.TimeOfDay {
	if x, ok := m.GetType().(*Value_TimeValue); ok {
		return x.TimeValue
	}
	return nil
}

func (m *Value) GetDateValue() *date.Date {
	if x, ok := m.GetType().(*Value_DateValue); ok {
		return x.DateValue
	}
	return nil
}

func (m *Value) GetDayOfWeekValue() dayofweek.DayOfWeek {
	if x, ok := m.GetType().(*Value_DayOfWeekValue); ok {
		return x.DayOfWeekValue
	}
	return dayofweek.DayOfWeek_DAY_OF_WEEK_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Value) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Value_IntegerValue)(nil),
		(*Value_FloatValue)(nil),
		(*Value_StringValue)(nil),
		(*Value_BooleanValue)(nil),
		(*Value_TimestampValue)(nil),
		(*Value_TimeValue)(nil),
		(*Value_DateValue)(nil),
		(*Value_DayOfWeekValue)(nil),
	}
}

// Message for infoType-dependent details parsed from quote.
type QuoteInfo struct {
	// Object representation of the quote.
	//
	// Types that are valid to be assigned to ParsedQuote:
	//	*QuoteInfo_DateTime
	ParsedQuote          isQuoteInfo_ParsedQuote `protobuf_oneof:"parsed_quote"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *QuoteInfo) Reset()         { *m = QuoteInfo{} }
func (m *QuoteInfo) String() string { return proto.CompactTextString(m) }
func (*QuoteInfo) ProtoMessage()    {}
func (*QuoteInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{40}
}

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

var xxx_messageInfo_QuoteInfo proto.InternalMessageInfo

type isQuoteInfo_ParsedQuote interface {
	isQuoteInfo_ParsedQuote()
}

type QuoteInfo_DateTime struct {
	DateTime *DateTime `protobuf:"bytes,2,opt,name=date_time,json=dateTime,proto3,oneof"`
}

func (*QuoteInfo_DateTime) isQuoteInfo_ParsedQuote() {}

func (m *QuoteInfo) GetParsedQuote() isQuoteInfo_ParsedQuote {
	if m != nil {
		return m.ParsedQuote
	}
	return nil
}

func (m *QuoteInfo) GetDateTime() *DateTime {
	if x, ok := m.GetParsedQuote().(*QuoteInfo_DateTime); ok {
		return x.DateTime
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*QuoteInfo) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*QuoteInfo_DateTime)(nil),
	}
}

// Message for a date time object.
// e.g. 2018-01-01, 5th August.
type DateTime struct {
	// One or more of the following must be set.
	// Must be a valid date or time value.
	Date *date.Date `protobuf:"bytes,1,opt,name=date,proto3" json:"date,omitempty"`
	// Day of week
	DayOfWeek dayofweek.DayOfWeek `protobuf:"varint,2,opt,name=day_of_week,json=dayOfWeek,proto3,enum=google.type.DayOfWeek" json:"day_of_week,omitempty"`
	// Time of day
	Time *timeofday.TimeOfDay `protobuf:"bytes,3,opt,name=time,proto3" json:"time,omitempty"`
	// Time zone
	TimeZone             *DateTime_TimeZone `protobuf:"bytes,4,opt,name=time_zone,json=timeZone,proto3" json:"time_zone,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *DateTime) Reset()         { *m = DateTime{} }
func (m *DateTime) String() string { return proto.CompactTextString(m) }
func (*DateTime) ProtoMessage()    {}
func (*DateTime) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{41}
}

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

var xxx_messageInfo_DateTime proto.InternalMessageInfo

func (m *DateTime) GetDate() *date.Date {
	if m != nil {
		return m.Date
	}
	return nil
}

func (m *DateTime) GetDayOfWeek() dayofweek.DayOfWeek {
	if m != nil {
		return m.DayOfWeek
	}
	return dayofweek.DayOfWeek_DAY_OF_WEEK_UNSPECIFIED
}

func (m *DateTime) GetTime() *timeofday.TimeOfDay {
	if m != nil {
		return m.Time
	}
	return nil
}

func (m *DateTime) GetTimeZone() *DateTime_TimeZone {
	if m != nil {
		return m.TimeZone
	}
	return nil
}

// Time zone of the date time object.
type DateTime_TimeZone struct {
	// Set only if the offset can be determined. Positive for time ahead of UTC.
	// E.g. For "UTC-9", this value is -540.
	OffsetMinutes        int32    `protobuf:"varint,1,opt,name=offset_minutes,json=offsetMinutes,proto3" json:"offset_minutes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DateTime_TimeZone proto.InternalMessageInfo

func (m *DateTime_TimeZone) GetOffsetMinutes() int32 {
	if m != nil {
		return m.OffsetMinutes
	}
	return 0
}

// The configuration that controls how the data will change.
type DeidentifyConfig struct {
	// Types that are valid to be assigned to Transformation:
	//	*DeidentifyConfig_InfoTypeTransformations
	//	*DeidentifyConfig_RecordTransformations
	Transformation       isDeidentifyConfig_Transformation `protobuf_oneof:"transformation"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

func (m *DeidentifyConfig) Reset()         { *m = DeidentifyConfig{} }
func (m *DeidentifyConfig) String() string { return proto.CompactTextString(m) }
func (*DeidentifyConfig) ProtoMessage()    {}
func (*DeidentifyConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{42}
}

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

var xxx_messageInfo_DeidentifyConfig proto.InternalMessageInfo

type isDeidentifyConfig_Transformation interface {
	isDeidentifyConfig_Transformation()
}

type DeidentifyConfig_InfoTypeTransformations struct {
	InfoTypeTransformations *InfoTypeTransformations `protobuf:"bytes,1,opt,name=info_type_transformations,json=infoTypeTransformations,proto3,oneof"`
}

type DeidentifyConfig_RecordTransformations struct {
	RecordTransformations *RecordTransformations `protobuf:"bytes,2,opt,name=record_transformations,json=recordTransformations,proto3,oneof"`
}

func (*DeidentifyConfig_InfoTypeTransformations) isDeidentifyConfig_Transformation() {}

func (*DeidentifyConfig_RecordTransformations) isDeidentifyConfig_Transformation() {}

func (m *DeidentifyConfig) GetTransformation() isDeidentifyConfig_Transformation {
	if m != nil {
		return m.Transformation
	}
	return nil
}

func (m *DeidentifyConfig) GetInfoTypeTransformations() *InfoTypeTransformations {
	if x, ok := m.GetTransformation().(*DeidentifyConfig_InfoTypeTransformations); ok {
		return x.InfoTypeTransformations
	}
	return nil
}

func (m *DeidentifyConfig) GetRecordTransformations() *RecordTransformations {
	if x, ok := m.GetTransformation().(*DeidentifyConfig_RecordTransformations); ok {
		return x.RecordTransformations
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*DeidentifyConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*DeidentifyConfig_InfoTypeTransformations)(nil),
		(*DeidentifyConfig_RecordTransformations)(nil),
	}
}

// A rule for transforming a value.
type PrimitiveTransformation struct {
	// Types that are valid to be assigned to Transformation:
	//	*PrimitiveTransformation_ReplaceConfig
	//	*PrimitiveTransformation_RedactConfig
	//	*PrimitiveTransformation_CharacterMaskConfig
	//	*PrimitiveTransformation_CryptoReplaceFfxFpeConfig
	//	*PrimitiveTransformation_FixedSizeBucketingConfig
	//	*PrimitiveTransformation_BucketingConfig
	//	*PrimitiveTransformation_ReplaceWithInfoTypeConfig
	//	*PrimitiveTransformation_TimePartConfig
	//	*PrimitiveTransformation_CryptoHashConfig
	//	*PrimitiveTransformation_DateShiftConfig
	//	*PrimitiveTransformation_CryptoDeterministicConfig
	Transformation       isPrimitiveTransformation_Transformation `protobuf_oneof:"transformation"`
	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
	XXX_unrecognized     []byte                                   `json:"-"`
	XXX_sizecache        int32                                    `json:"-"`
}

func (m *PrimitiveTransformation) Reset()         { *m = PrimitiveTransformation{} }
func (m *PrimitiveTransformation) String() string { return proto.CompactTextString(m) }
func (*PrimitiveTransformation) ProtoMessage()    {}
func (*PrimitiveTransformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{43}
}

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

var xxx_messageInfo_PrimitiveTransformation proto.InternalMessageInfo

type isPrimitiveTransformation_Transformation interface {
	isPrimitiveTransformation_Transformation()
}

type PrimitiveTransformation_ReplaceConfig struct {
	ReplaceConfig *ReplaceValueConfig `protobuf:"bytes,1,opt,name=replace_config,json=replaceConfig,proto3,oneof"`
}

type PrimitiveTransformation_RedactConfig struct {
	RedactConfig *RedactConfig `protobuf:"bytes,2,opt,name=redact_config,json=redactConfig,proto3,oneof"`
}

type PrimitiveTransformation_CharacterMaskConfig struct {
	CharacterMaskConfig *CharacterMaskConfig `protobuf:"bytes,3,opt,name=character_mask_config,json=characterMaskConfig,proto3,oneof"`
}

type PrimitiveTransformation_CryptoReplaceFfxFpeConfig struct {
	CryptoReplaceFfxFpeConfig *CryptoReplaceFfxFpeConfig `protobuf:"bytes,4,opt,name=crypto_replace_ffx_fpe_config,json=cryptoReplaceFfxFpeConfig,proto3,oneof"`
}

type PrimitiveTransformation_FixedSizeBucketingConfig struct {
	FixedSizeBucketingConfig *FixedSizeBucketingConfig `protobuf:"bytes,5,opt,name=fixed_size_bucketing_config,json=fixedSizeBucketingConfig,proto3,oneof"`
}

type PrimitiveTransformation_BucketingConfig struct {
	BucketingConfig *BucketingConfig `protobuf:"bytes,6,opt,name=bucketing_config,json=bucketingConfig,proto3,oneof"`
}

type PrimitiveTransformation_ReplaceWithInfoTypeConfig struct {
	ReplaceWithInfoTypeConfig *ReplaceWithInfoTypeConfig `protobuf:"bytes,7,opt,name=replace_with_info_type_config,json=replaceWithInfoTypeConfig,proto3,oneof"`
}

type PrimitiveTransformation_TimePartConfig struct {
	TimePartConfig *TimePartConfig `protobuf:"bytes,8,opt,name=time_part_config,json=timePartConfig,proto3,oneof"`
}

type PrimitiveTransformation_CryptoHashConfig struct {
	CryptoHashConfig *CryptoHashConfig `protobuf:"bytes,9,opt,name=crypto_hash_config,json=cryptoHashConfig,proto3,oneof"`
}

type PrimitiveTransformation_DateShiftConfig struct {
	DateShiftConfig *DateShiftConfig `protobuf:"bytes,11,opt,name=date_shift_config,json=dateShiftConfig,proto3,oneof"`
}

type PrimitiveTransformation_CryptoDeterministicConfig struct {
	CryptoDeterministicConfig *CryptoDeterministicConfig `protobuf:"bytes,12,opt,name=crypto_deterministic_config,json=cryptoDeterministicConfig,proto3,oneof"`
}

func (*PrimitiveTransformation_ReplaceConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_RedactConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_CharacterMaskConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_CryptoReplaceFfxFpeConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_FixedSizeBucketingConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_BucketingConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_ReplaceWithInfoTypeConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_TimePartConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_CryptoHashConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_DateShiftConfig) isPrimitiveTransformation_Transformation() {}

func (*PrimitiveTransformation_CryptoDeterministicConfig) isPrimitiveTransformation_Transformation() {}

func (m *PrimitiveTransformation) GetTransformation() isPrimitiveTransformation_Transformation {
	if m != nil {
		return m.Transformation
	}
	return nil
}

func (m *PrimitiveTransformation) GetReplaceConfig() *ReplaceValueConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_ReplaceConfig); ok {
		return x.ReplaceConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetRedactConfig() *RedactConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_RedactConfig); ok {
		return x.RedactConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetCharacterMaskConfig() *CharacterMaskConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_CharacterMaskConfig); ok {
		return x.CharacterMaskConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetCryptoReplaceFfxFpeConfig() *CryptoReplaceFfxFpeConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_CryptoReplaceFfxFpeConfig); ok {
		return x.CryptoReplaceFfxFpeConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetFixedSizeBucketingConfig() *FixedSizeBucketingConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_FixedSizeBucketingConfig); ok {
		return x.FixedSizeBucketingConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetBucketingConfig() *BucketingConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_BucketingConfig); ok {
		return x.BucketingConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetReplaceWithInfoTypeConfig() *ReplaceWithInfoTypeConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_ReplaceWithInfoTypeConfig); ok {
		return x.ReplaceWithInfoTypeConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetTimePartConfig() *TimePartConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_TimePartConfig); ok {
		return x.TimePartConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetCryptoHashConfig() *CryptoHashConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_CryptoHashConfig); ok {
		return x.CryptoHashConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetDateShiftConfig() *DateShiftConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_DateShiftConfig); ok {
		return x.DateShiftConfig
	}
	return nil
}

func (m *PrimitiveTransformation) GetCryptoDeterministicConfig() *CryptoDeterministicConfig {
	if x, ok := m.GetTransformation().(*PrimitiveTransformation_CryptoDeterministicConfig); ok {
		return x.CryptoDeterministicConfig
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PrimitiveTransformation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PrimitiveTransformation_ReplaceConfig)(nil),
		(*PrimitiveTransformation_RedactConfig)(nil),
		(*PrimitiveTransformation_CharacterMaskConfig)(nil),
		(*PrimitiveTransformation_CryptoReplaceFfxFpeConfig)(nil),
		(*PrimitiveTransformation_FixedSizeBucketingConfig)(nil),
		(*PrimitiveTransformation_BucketingConfig)(nil),
		(*PrimitiveTransformation_ReplaceWithInfoTypeConfig)(nil),
		(*PrimitiveTransformation_TimePartConfig)(nil),
		(*PrimitiveTransformation_CryptoHashConfig)(nil),
		(*PrimitiveTransformation_DateShiftConfig)(nil),
		(*PrimitiveTransformation_CryptoDeterministicConfig)(nil),
	}
}

// For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
// portion of the value.
type TimePartConfig struct {
	// The part of the time to keep.
	PartToExtract        TimePartConfig_TimePart `protobuf:"varint,1,opt,name=part_to_extract,json=partToExtract,proto3,enum=google.privacy.dlp.v2.TimePartConfig_TimePart" json:"part_to_extract,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *TimePartConfig) Reset()         { *m = TimePartConfig{} }
func (m *TimePartConfig) String() string { return proto.CompactTextString(m) }
func (*TimePartConfig) ProtoMessage()    {}
func (*TimePartConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{44}
}

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

var xxx_messageInfo_TimePartConfig proto.InternalMessageInfo

func (m *TimePartConfig) GetPartToExtract() TimePartConfig_TimePart {
	if m != nil {
		return m.PartToExtract
	}
	return TimePartConfig_TIME_PART_UNSPECIFIED
}

// Pseudonymization method that generates surrogates via cryptographic hashing.
// Uses SHA-256.
// The key size must be either 32 or 64 bytes.
// Outputs a base64 encoded representation of the hashed output
// (for example, L7k0BHmF1ha5U3NfGykjro4xWi1MPVQPjhMAZbSV9mM=).
// Currently, only string and integer values can be hashed.
// See https://cloud.google.com/dlp/docs/pseudonymization to learn more.
type CryptoHashConfig struct {
	// The key used by the hash function.
	CryptoKey            *CryptoKey `protobuf:"bytes,1,opt,name=crypto_key,json=cryptoKey,proto3" json:"crypto_key,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *CryptoHashConfig) Reset()         { *m = CryptoHashConfig{} }
func (m *CryptoHashConfig) String() string { return proto.CompactTextString(m) }
func (*CryptoHashConfig) ProtoMessage()    {}
func (*CryptoHashConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{45}
}

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

var xxx_messageInfo_CryptoHashConfig proto.InternalMessageInfo

func (m *CryptoHashConfig) GetCryptoKey() *CryptoKey {
	if m != nil {
		return m.CryptoKey
	}
	return nil
}

// Pseudonymization method that generates deterministic encryption for the given
// input. Outputs a base64 encoded representation of the encrypted output.
// Uses AES-SIV based on the RFC https://tools.ietf.org/html/rfc5297.
type CryptoDeterministicConfig struct {
	// The key used by the encryption function.
	CryptoKey *CryptoKey `protobuf:"bytes,1,opt,name=crypto_key,json=cryptoKey,proto3" json:"crypto_key,omitempty"`
	// The custom info type to annotate the surrogate with.
	// This annotation will be applied to the surrogate by prefixing it with
	// the name of the custom info type followed by the number of
	// characters comprising the surrogate. The following scheme defines the
	// format: {info type name}({surrogate character count}):{surrogate}
	//
	// For example, if the name of custom info type is 'MY_TOKEN_INFO_TYPE' and
	// the surrogate is 'abc', the full replacement value
	// will be: 'MY_TOKEN_INFO_TYPE(3):abc'
	//
	// This annotation identifies the surrogate when inspecting content using the
	// custom info type 'Surrogate'. This facilitates reversal of the
	// surrogate when it occurs in free text.
	//
	// Note: For record transformations where the entire cell in a table is being
	// transformed, surrogates are not mandatory. Surrogates are used to denote
	// the location of the token and are necessary for re-identification in free
	// form text.
	//
	// In order for inspection to work properly, the name of this info type must
	// not occur naturally anywhere in your data; otherwise, inspection may either
	//
	// - reverse a surrogate that does not correspond to an actual identifier
	// - be unable to parse the surrogate and result in an error
	//
	// Therefore, choose your custom info type name carefully after considering
	// what your data looks like. One way to select a name that has a high chance
	// of yielding reliable detection is to include one or more unicode characters
	// that are highly improbable to exist in your data.
	// For example, assuming your data is entered from a regular ASCII keyboard,
	// the symbol with the hex code point 29DD might be used like so:
	// ⧝MY_TOKEN_TYPE.
	SurrogateInfoType *InfoType `protobuf:"bytes,2,opt,name=surrogate_info_type,json=surrogateInfoType,proto3" json:"surrogate_info_type,omitempty"`
	// A context may be used for higher security and maintaining
	// referential integrity such that the same identifier in two different
	// contexts will be given a distinct surrogate. The context is appended to
	// plaintext value being encrypted. On decryption the provided context is
	// validated against the value used during encryption. If a context was
	// provided during encryption, same context must be provided during decryption
	// as well.
	//
	// If the context is not set, plaintext would be used as is for encryption.
	// If the context is set but:
	//
	// 1. there is no record present when transforming a given value or
	// 2. the field is not present when transforming a given value,
	//
	// plaintext would be used as is for encryption.
	//
	// Note that case (1) is expected when an `InfoTypeTransformation` is
	// applied to both structured and non-structured `ContentItem`s.
	Context              *FieldId `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CryptoDeterministicConfig) Reset()         { *m = CryptoDeterministicConfig{} }
func (m *CryptoDeterministicConfig) String() string { return proto.CompactTextString(m) }
func (*CryptoDeterministicConfig) ProtoMessage()    {}
func (*CryptoDeterministicConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{46}
}

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

var xxx_messageInfo_CryptoDeterministicConfig proto.InternalMessageInfo

func (m *CryptoDeterministicConfig) GetCryptoKey() *CryptoKey {
	if m != nil {
		return m.CryptoKey
	}
	return nil
}

func (m *CryptoDeterministicConfig) GetSurrogateInfoType() *InfoType {
	if m != nil {
		return m.SurrogateInfoType
	}
	return nil
}

func (m *CryptoDeterministicConfig) GetContext() *FieldId {
	if m != nil {
		return m.Context
	}
	return nil
}

// Replace each input value with a given `Value`.
type ReplaceValueConfig struct {
	// Value to replace it with.
	NewValue             *Value   `protobuf:"bytes,1,opt,name=new_value,json=newValue,proto3" json:"new_value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ReplaceValueConfig) Reset()         { *m = ReplaceValueConfig{} }
func (m *ReplaceValueConfig) String() string { return proto.CompactTextString(m) }
func (*ReplaceValueConfig) ProtoMessage()    {}
func (*ReplaceValueConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{47}
}

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

var xxx_messageInfo_ReplaceValueConfig proto.InternalMessageInfo

func (m *ReplaceValueConfig) GetNewValue() *Value {
	if m != nil {
		return m.NewValue
	}
	return nil
}

// Replace each matching finding with the name of the info_type.
type ReplaceWithInfoTypeConfig struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ReplaceWithInfoTypeConfig) Reset()         { *m = ReplaceWithInfoTypeConfig{} }
func (m *ReplaceWithInfoTypeConfig) String() string { return proto.CompactTextString(m) }
func (*ReplaceWithInfoTypeConfig) ProtoMessage()    {}
func (*ReplaceWithInfoTypeConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{48}
}

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

var xxx_messageInfo_ReplaceWithInfoTypeConfig proto.InternalMessageInfo

// Redact a given value. For example, if used with an `InfoTypeTransformation`
// transforming PHONE_NUMBER, and input 'My phone number is 206-555-0123', the
// output would be 'My phone number is '.
type RedactConfig struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *RedactConfig) Reset()         { *m = RedactConfig{} }
func (m *RedactConfig) String() string { return proto.CompactTextString(m) }
func (*RedactConfig) ProtoMessage()    {}
func (*RedactConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{49}
}

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

var xxx_messageInfo_RedactConfig proto.InternalMessageInfo

// Characters to skip when doing deidentification of a value. These will be left
// alone and skipped.
type CharsToIgnore struct {
	// Types that are valid to be assigned to Characters:
	//	*CharsToIgnore_CharactersToSkip
	//	*CharsToIgnore_CommonCharactersToIgnore
	Characters           isCharsToIgnore_Characters `protobuf_oneof:"characters"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *CharsToIgnore) Reset()         { *m = CharsToIgnore{} }
func (m *CharsToIgnore) String() string { return proto.CompactTextString(m) }
func (*CharsToIgnore) ProtoMessage()    {}
func (*CharsToIgnore) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{50}
}

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

var xxx_messageInfo_CharsToIgnore proto.InternalMessageInfo

type isCharsToIgnore_Characters interface {
	isCharsToIgnore_Characters()
}

type CharsToIgnore_CharactersToSkip struct {
	CharactersToSkip string `protobuf:"bytes,1,opt,name=characters_to_skip,json=charactersToSkip,proto3,oneof"`
}

type CharsToIgnore_CommonCharactersToIgnore struct {
	CommonCharactersToIgnore CharsToIgnore_CommonCharsToIgnore `protobuf:"varint,2,opt,name=common_characters_to_ignore,json=commonCharactersToIgnore,proto3,enum=google.privacy.dlp.v2.CharsToIgnore_CommonCharsToIgnore,oneof"`
}

func (*CharsToIgnore_CharactersToSkip) isCharsToIgnore_Characters() {}

func (*CharsToIgnore_CommonCharactersToIgnore) isCharsToIgnore_Characters() {}

func (m *CharsToIgnore) GetCharacters() isCharsToIgnore_Characters {
	if m != nil {
		return m.Characters
	}
	return nil
}

func (m *CharsToIgnore) GetCharactersToSkip() string {
	if x, ok := m.GetCharacters().(*CharsToIgnore_CharactersToSkip); ok {
		return x.CharactersToSkip
	}
	return ""
}

func (m *CharsToIgnore) GetCommonCharactersToIgnore() CharsToIgnore_CommonCharsToIgnore {
	if x, ok := m.GetCharacters().(*CharsToIgnore_CommonCharactersToIgnore); ok {
		return x.CommonCharactersToIgnore
	}
	return CharsToIgnore_COMMON_CHARS_TO_IGNORE_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CharsToIgnore) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CharsToIgnore_CharactersToSkip)(nil),
		(*CharsToIgnore_CommonCharactersToIgnore)(nil),
	}
}

// Partially mask a string by replacing a given number of characters with a
// fixed character. Masking can start from the beginning or end of the string.
// This can be used on data of any type (numbers, longs, and so on) and when
// de-identifying structured data we'll attempt to preserve the original data's
// type. (This allows you to take a long like 123 and modify it to a string like
// **3.
type CharacterMaskConfig struct {
	// Character to use to mask the sensitive values&mdash;for example, `*` for an
	// alphabetic string such as a name, or `0` for a numeric string such as ZIP
	// code or credit card number. This string must have a length of 1. If not
	// supplied, this value defaults to `*` for strings, and `0` for digits.
	MaskingCharacter string `protobuf:"bytes,1,opt,name=masking_character,json=maskingCharacter,proto3" json:"masking_character,omitempty"`
	// Number of characters to mask. If not set, all matching chars will be
	// masked. Skipped characters do not count towards this tally.
	NumberToMask int32 `protobuf:"varint,2,opt,name=number_to_mask,json=numberToMask,proto3" json:"number_to_mask,omitempty"`
	// Mask characters in reverse order. For example, if `masking_character` is
	// `0`, `number_to_mask` is `14`, and `reverse_order` is `false`, then the
	// input string `1234-5678-9012-3456` is masked as `00000000000000-3456`.
	// If `masking_character` is `*`, `number_to_mask` is `3`, and `reverse_order`
	// is `true`, then the string `12345` is masked as `12***`.
	ReverseOrder bool `protobuf:"varint,3,opt,name=reverse_order,json=reverseOrder,proto3" json:"reverse_order,omitempty"`
	// When masking a string, items in this list will be skipped when replacing
	// characters. For example, if the input string is `555-555-5555` and you
	// instruct Cloud DLP to skip `-` and mask 5 characters with `*`, Cloud DLP
	// returns `***-**5-5555`.
	CharactersToIgnore   []*CharsToIgnore `protobuf:"bytes,4,rep,name=characters_to_ignore,json=charactersToIgnore,proto3" json:"characters_to_ignore,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *CharacterMaskConfig) Reset()         { *m = CharacterMaskConfig{} }
func (m *CharacterMaskConfig) String() string { return proto.CompactTextString(m) }
func (*CharacterMaskConfig) ProtoMessage()    {}
func (*CharacterMaskConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{51}
}

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

var xxx_messageInfo_CharacterMaskConfig proto.InternalMessageInfo

func (m *CharacterMaskConfig) GetMaskingCharacter() string {
	if m != nil {
		return m.MaskingCharacter
	}
	return ""
}

func (m *CharacterMaskConfig) GetNumberToMask() int32 {
	if m != nil {
		return m.NumberToMask
	}
	return 0
}

func (m *CharacterMaskConfig) GetReverseOrder() bool {
	if m != nil {
		return m.ReverseOrder
	}
	return false
}

func (m *CharacterMaskConfig) GetCharactersToIgnore() []*CharsToIgnore {
	if m != nil {
		return m.CharactersToIgnore
	}
	return nil
}

// Buckets values based on fixed size ranges. The
// Bucketing transformation can provide all of this functionality,
// but requires more configuration. This message is provided as a convenience to
// the user for simple bucketing strategies.
//
// The transformed value will be a hyphenated string of
// {lower_bound}-{upper_bound}, i.e if lower_bound = 10 and upper_bound = 20
// all values that are within this bucket will be replaced with "10-20".
//
// This can be used on data of type: double, long.
//
// If the bound Value type differs from the type of data
// being transformed, we will first attempt converting the type of the data to
// be transformed to match the type of the bound before comparing.
//
// See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
type FixedSizeBucketingConfig struct {
	// Required. Lower bound value of buckets. All values less than `lower_bound` are
	// grouped together into a single bucket; for example if `lower_bound` = 10,
	// then all values less than 10 are replaced with the value “-10”.
	LowerBound *Value `protobuf:"bytes,1,opt,name=lower_bound,json=lowerBound,proto3" json:"lower_bound,omitempty"`
	// Required. Upper bound value of buckets. All values greater than upper_bound are
	// grouped together into a single bucket; for example if `upper_bound` = 89,
	// then all values greater than 89 are replaced with the value “89+”.
	UpperBound *Value `protobuf:"bytes,2,opt,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty"`
	// Required. Size of each bucket (except for minimum and maximum buckets). So if
	// `lower_bound` = 10, `upper_bound` = 89, and `bucket_size` = 10, then the
	// following buckets would be used: -10, 10-20, 20-30, 30-40, 40-50, 50-60,
	// 60-70, 70-80, 80-89, 89+. Precision up to 2 decimals works.
	BucketSize           float64  `protobuf:"fixed64,3,opt,name=bucket_size,json=bucketSize,proto3" json:"bucket_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FixedSizeBucketingConfig) Reset()         { *m = FixedSizeBucketingConfig{} }
func (m *FixedSizeBucketingConfig) String() string { return proto.CompactTextString(m) }
func (*FixedSizeBucketingConfig) ProtoMessage()    {}
func (*FixedSizeBucketingConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{52}
}

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

var xxx_messageInfo_FixedSizeBucketingConfig proto.InternalMessageInfo

func (m *FixedSizeBucketingConfig) GetLowerBound() *Value {
	if m != nil {
		return m.LowerBound
	}
	return nil
}

func (m *FixedSizeBucketingConfig) GetUpperBound() *Value {
	if m != nil {
		return m.UpperBound
	}
	return nil
}

func (m *FixedSizeBucketingConfig) GetBucketSize() float64 {
	if m != nil {
		return m.BucketSize
	}
	return 0
}

// Generalization function that buckets values based on ranges. The ranges and
// replacement values are dynamically provided by the user for custom behavior,
// such as 1-30 -> LOW 31-65 -> MEDIUM 66-100 -> HIGH
// This can be used on
// data of type: number, long, string, timestamp.
// If the bound `Value` type differs from the type of data being transformed, we
// will first attempt converting the type of the data to be transformed to match
// the type of the bound before comparing.
// See https://cloud.google.com/dlp/docs/concepts-bucketing to learn more.
type BucketingConfig struct {
	// Set of buckets. Ranges must be non-overlapping.
	Buckets              []*BucketingConfig_Bucket `protobuf:"bytes,1,rep,name=buckets,proto3" json:"buckets,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *BucketingConfig) Reset()         { *m = BucketingConfig{} }
func (m *BucketingConfig) String() string { return proto.CompactTextString(m) }
func (*BucketingConfig) ProtoMessage()    {}
func (*BucketingConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{53}
}

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

var xxx_messageInfo_BucketingConfig proto.InternalMessageInfo

func (m *BucketingConfig) GetBuckets() []*BucketingConfig_Bucket {
	if m != nil {
		return m.Buckets
	}
	return nil
}

// Bucket is represented as a range, along with replacement values.
type BucketingConfig_Bucket struct {
	// Lower bound of the range, inclusive. Type should be the same as max if
	// used.
	Min *Value `protobuf:"bytes,1,opt,name=min,proto3" json:"min,omitempty"`
	// Upper bound of the range, exclusive; type must match min.
	Max *Value `protobuf:"bytes,2,opt,name=max,proto3" json:"max,omitempty"`
	// Replacement value for this bucket. If not provided
	// the default behavior will be to hyphenate the min-max range.
	ReplacementValue     *Value   `protobuf:"bytes,3,opt,name=replacement_value,json=replacementValue,proto3" json:"replacement_value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BucketingConfig_Bucket proto.InternalMessageInfo

func (m *BucketingConfig_Bucket) GetMin() *Value {
	if m != nil {
		return m.Min
	}
	return nil
}

func (m *BucketingConfig_Bucket) GetMax() *Value {
	if m != nil {
		return m.Max
	}
	return nil
}

func (m *BucketingConfig_Bucket) GetReplacementValue() *Value {
	if m != nil {
		return m.ReplacementValue
	}
	return nil
}

// Replaces an identifier with a surrogate using Format Preserving Encryption
// (FPE) with the FFX mode of operation; however when used in the
// `ReidentifyContent` API method, it serves the opposite function by reversing
// the surrogate back into the original identifier. The identifier must be
// encoded as ASCII. For a given crypto key and context, the same identifier
// will be replaced with the same surrogate. Identifiers must be at least two
// characters long. In the case that the identifier is the empty string, it will
// be skipped. See https://cloud.google.com/dlp/docs/pseudonymization to learn
// more.
//
// Note: We recommend using  CryptoDeterministicConfig for all use cases which
// do not require preserving the input alphabet space and size, plus warrant
// referential integrity.
type CryptoReplaceFfxFpeConfig struct {
	// Required. The key used by the encryption algorithm.
	CryptoKey *CryptoKey `protobuf:"bytes,1,opt,name=crypto_key,json=cryptoKey,proto3" json:"crypto_key,omitempty"`
	// The 'tweak', a context may be used for higher security since the same
	// identifier in two different contexts won't be given the same surrogate. If
	// the context is not set, a default tweak will be used.
	//
	// If the context is set but:
	//
	// 1. there is no record present when transforming a given value or
	// 1. the field is not present when transforming a given value,
	//
	// a default tweak will be used.
	//
	// Note that case (1) is expected when an `InfoTypeTransformation` is
	// applied to both structured and non-structured `ContentItem`s.
	// Currently, the referenced field may be of value type integer or string.
	//
	// The tweak is constructed as a sequence of bytes in big endian byte order
	// such that:
	//
	// - a 64 bit integer is encoded followed by a single byte of value 1
	// - a string is encoded in UTF-8 format followed by a single byte of value 2
	Context *FieldId `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"`
	// Choose an alphabet which the data being transformed will be made up of.
	//
	// Types that are valid to be assigned to Alphabet:
	//	*CryptoReplaceFfxFpeConfig_CommonAlphabet
	//	*CryptoReplaceFfxFpeConfig_CustomAlphabet
	//	*CryptoReplaceFfxFpeConfig_Radix
	Alphabet isCryptoReplaceFfxFpeConfig_Alphabet `protobuf_oneof:"alphabet"`
	// The custom infoType to annotate the surrogate with.
	// This annotation will be applied to the surrogate by prefixing it with
	// the name of the custom infoType followed by the number of
	// characters comprising the surrogate. The following scheme defines the
	// format: info_type_name(surrogate_character_count):surrogate
	//
	// For example, if the name of custom infoType is 'MY_TOKEN_INFO_TYPE' and
	// the surrogate is 'abc', the full replacement value
	// will be: 'MY_TOKEN_INFO_TYPE(3):abc'
	//
	// This annotation identifies the surrogate when inspecting content using the
	// custom infoType
	// [`SurrogateType`](/dlp/docs/reference/rest/v2/InspectConfig#surrogatetype).
	// This facilitates reversal of the surrogate when it occurs in free text.
	//
	// In order for inspection to work properly, the name of this infoType must
	// not occur naturally anywhere in your data; otherwise, inspection may
	// find a surrogate that does not correspond to an actual identifier.
	// Therefore, choose your custom infoType name carefully after considering
	// what your data looks like. One way to select a name that has a high chance
	// of yielding reliable detection is to include one or more unicode characters
	// that are highly improbable to exist in your data.
	// For example, assuming your data is entered from a regular ASCII keyboard,
	// the symbol with the hex code point 29DD might be used like so:
	// ⧝MY_TOKEN_TYPE
	SurrogateInfoType    *InfoType `protobuf:"bytes,8,opt,name=surrogate_info_type,json=surrogateInfoType,proto3" json:"surrogate_info_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *CryptoReplaceFfxFpeConfig) Reset()         { *m = CryptoReplaceFfxFpeConfig{} }
func (m *CryptoReplaceFfxFpeConfig) String() string { return proto.CompactTextString(m) }
func (*CryptoReplaceFfxFpeConfig) ProtoMessage()    {}
func (*CryptoReplaceFfxFpeConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{54}
}

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

var xxx_messageInfo_CryptoReplaceFfxFpeConfig proto.InternalMessageInfo

func (m *CryptoReplaceFfxFpeConfig) GetCryptoKey() *CryptoKey {
	if m != nil {
		return m.CryptoKey
	}
	return nil
}

func (m *CryptoReplaceFfxFpeConfig) GetContext() *FieldId {
	if m != nil {
		return m.Context
	}
	return nil
}

type isCryptoReplaceFfxFpeConfig_Alphabet interface {
	isCryptoReplaceFfxFpeConfig_Alphabet()
}

type CryptoReplaceFfxFpeConfig_CommonAlphabet struct {
	CommonAlphabet CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet `protobuf:"varint,4,opt,name=common_alphabet,json=commonAlphabet,proto3,enum=google.privacy.dlp.v2.CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet,oneof"`
}

type CryptoReplaceFfxFpeConfig_CustomAlphabet struct {
	CustomAlphabet string `protobuf:"bytes,5,opt,name=custom_alphabet,json=customAlphabet,proto3,oneof"`
}

type CryptoReplaceFfxFpeConfig_Radix struct {
	Radix int32 `protobuf:"varint,6,opt,name=radix,proto3,oneof"`
}

func (*CryptoReplaceFfxFpeConfig_CommonAlphabet) isCryptoReplaceFfxFpeConfig_Alphabet() {}

func (*CryptoReplaceFfxFpeConfig_CustomAlphabet) isCryptoReplaceFfxFpeConfig_Alphabet() {}

func (*CryptoReplaceFfxFpeConfig_Radix) isCryptoReplaceFfxFpeConfig_Alphabet() {}

func (m *CryptoReplaceFfxFpeConfig) GetAlphabet() isCryptoReplaceFfxFpeConfig_Alphabet {
	if m != nil {
		return m.Alphabet
	}
	return nil
}

func (m *CryptoReplaceFfxFpeConfig) GetCommonAlphabet() CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet {
	if x, ok := m.GetAlphabet().(*CryptoReplaceFfxFpeConfig_CommonAlphabet); ok {
		return x.CommonAlphabet
	}
	return CryptoReplaceFfxFpeConfig_FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED
}

func (m *CryptoReplaceFfxFpeConfig) GetCustomAlphabet() string {
	if x, ok := m.GetAlphabet().(*CryptoReplaceFfxFpeConfig_CustomAlphabet); ok {
		return x.CustomAlphabet
	}
	return ""
}

func (m *CryptoReplaceFfxFpeConfig) GetRadix() int32 {
	if x, ok := m.GetAlphabet().(*CryptoReplaceFfxFpeConfig_Radix); ok {
		return x.Radix
	}
	return 0
}

func (m *CryptoReplaceFfxFpeConfig) GetSurrogateInfoType() *InfoType {
	if m != nil {
		return m.SurrogateInfoType
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CryptoReplaceFfxFpeConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CryptoReplaceFfxFpeConfig_CommonAlphabet)(nil),
		(*CryptoReplaceFfxFpeConfig_CustomAlphabet)(nil),
		(*CryptoReplaceFfxFpeConfig_Radix)(nil),
	}
}

// This is a data encryption key (DEK) (as opposed to
// a key encryption key (KEK) stored by KMS).
// When using KMS to wrap/unwrap DEKs, be sure to set an appropriate
// IAM policy on the KMS CryptoKey (KEK) to ensure an attacker cannot
// unwrap the data crypto key.
type CryptoKey struct {
	// Sources of crypto keys.
	//
	// Types that are valid to be assigned to Source:
	//	*CryptoKey_Transient
	//	*CryptoKey_Unwrapped
	//	*CryptoKey_KmsWrapped
	Source               isCryptoKey_Source `protobuf_oneof:"source"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *CryptoKey) Reset()         { *m = CryptoKey{} }
func (m *CryptoKey) String() string { return proto.CompactTextString(m) }
func (*CryptoKey) ProtoMessage()    {}
func (*CryptoKey) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{55}
}

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

var xxx_messageInfo_CryptoKey proto.InternalMessageInfo

type isCryptoKey_Source interface {
	isCryptoKey_Source()
}

type CryptoKey_Transient struct {
	Transient *TransientCryptoKey `protobuf:"bytes,1,opt,name=transient,proto3,oneof"`
}

type CryptoKey_Unwrapped struct {
	Unwrapped *UnwrappedCryptoKey `protobuf:"bytes,2,opt,name=unwrapped,proto3,oneof"`
}

type CryptoKey_KmsWrapped struct {
	KmsWrapped *KmsWrappedCryptoKey `protobuf:"bytes,3,opt,name=kms_wrapped,json=kmsWrapped,proto3,oneof"`
}

func (*CryptoKey_Transient) isCryptoKey_Source() {}

func (*CryptoKey_Unwrapped) isCryptoKey_Source() {}

func (*CryptoKey_KmsWrapped) isCryptoKey_Source() {}

func (m *CryptoKey) GetSource() isCryptoKey_Source {
	if m != nil {
		return m.Source
	}
	return nil
}

func (m *CryptoKey) GetTransient() *TransientCryptoKey {
	if x, ok := m.GetSource().(*CryptoKey_Transient); ok {
		return x.Transient
	}
	return nil
}

func (m *CryptoKey) GetUnwrapped() *UnwrappedCryptoKey {
	if x, ok := m.GetSource().(*CryptoKey_Unwrapped); ok {
		return x.Unwrapped
	}
	return nil
}

func (m *CryptoKey) GetKmsWrapped() *KmsWrappedCryptoKey {
	if x, ok := m.GetSource().(*CryptoKey_KmsWrapped); ok {
		return x.KmsWrapped
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CryptoKey) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CryptoKey_Transient)(nil),
		(*CryptoKey_Unwrapped)(nil),
		(*CryptoKey_KmsWrapped)(nil),
	}
}

// Use this to have a random data crypto key generated.
// It will be discarded after the request finishes.
type TransientCryptoKey struct {
	// Required. Name of the key.
	// This is an arbitrary string used to differentiate different keys.
	// A unique key is generated per name: two separate `TransientCryptoKey`
	// protos share the same generated key if their names are the same.
	// When the data crypto key is generated, this name is not used in any way
	// (repeating the api call will result in a different key being generated).
	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 *TransientCryptoKey) Reset()         { *m = TransientCryptoKey{} }
func (m *TransientCryptoKey) String() string { return proto.CompactTextString(m) }
func (*TransientCryptoKey) ProtoMessage()    {}
func (*TransientCryptoKey) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{56}
}

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

var xxx_messageInfo_TransientCryptoKey proto.InternalMessageInfo

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

// Using raw keys is prone to security risks due to accidentally
// leaking the key. Choose another type of key if possible.
type UnwrappedCryptoKey struct {
	// Required. A 128/192/256 bit key.
	Key                  []byte   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UnwrappedCryptoKey) Reset()         { *m = UnwrappedCryptoKey{} }
func (m *UnwrappedCryptoKey) String() string { return proto.CompactTextString(m) }
func (*UnwrappedCryptoKey) ProtoMessage()    {}
func (*UnwrappedCryptoKey) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{57}
}

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

var xxx_messageInfo_UnwrappedCryptoKey proto.InternalMessageInfo

func (m *UnwrappedCryptoKey) GetKey() []byte {
	if m != nil {
		return m.Key
	}
	return nil
}

// Include to use an existing data crypto key wrapped by KMS.
// The wrapped key must be a 128/192/256 bit key.
// Authorization requires the following IAM permissions when sending a request
// to perform a crypto transformation using a kms-wrapped crypto key:
// dlp.kms.encrypt
type KmsWrappedCryptoKey struct {
	// Required. The wrapped data crypto key.
	WrappedKey []byte `protobuf:"bytes,1,opt,name=wrapped_key,json=wrappedKey,proto3" json:"wrapped_key,omitempty"`
	// Required. The resource name of the KMS CryptoKey to use for unwrapping.
	CryptoKeyName        string   `protobuf:"bytes,2,opt,name=crypto_key_name,json=cryptoKeyName,proto3" json:"crypto_key_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *KmsWrappedCryptoKey) Reset()         { *m = KmsWrappedCryptoKey{} }
func (m *KmsWrappedCryptoKey) String() string { return proto.CompactTextString(m) }
func (*KmsWrappedCryptoKey) ProtoMessage()    {}
func (*KmsWrappedCryptoKey) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{58}
}

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

var xxx_messageInfo_KmsWrappedCryptoKey proto.InternalMessageInfo

func (m *KmsWrappedCryptoKey) GetWrappedKey() []byte {
	if m != nil {
		return m.WrappedKey
	}
	return nil
}

func (m *KmsWrappedCryptoKey) GetCryptoKeyName() string {
	if m != nil {
		return m.CryptoKeyName
	}
	return ""
}

// Shifts dates by random number of days, with option to be consistent for the
// same context. See https://cloud.google.com/dlp/docs/concepts-date-shifting
// to learn more.
type DateShiftConfig struct {
	// Required. Range of shift in days. Actual shift will be selected at random within this
	// range (inclusive ends). Negative means shift to earlier in time. Must not
	// be more than 365250 days (1000 years) each direction.
	//
	// For example, 3 means shift date to at most 3 days into the future.
	UpperBoundDays int32 `protobuf:"varint,1,opt,name=upper_bound_days,json=upperBoundDays,proto3" json:"upper_bound_days,omitempty"`
	// Required. For example, -5 means shift date to at most 5 days back in the past.
	LowerBoundDays int32 `protobuf:"varint,2,opt,name=lower_bound_days,json=lowerBoundDays,proto3" json:"lower_bound_days,omitempty"`
	// Points to the field that contains the context, for example, an entity id.
	// If set, must also set cryptoKey. If set, shift will be consistent for the
	// given context.
	Context *FieldId `protobuf:"bytes,3,opt,name=context,proto3" json:"context,omitempty"`
	// Method for calculating shift that takes context into consideration. If
	// set, must also set context. Can only be applied to table items.
	//
	// Types that are valid to be assigned to Method:
	//	*DateShiftConfig_CryptoKey
	Method               isDateShiftConfig_Method `protobuf_oneof:"method"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *DateShiftConfig) Reset()         { *m = DateShiftConfig{} }
func (m *DateShiftConfig) String() string { return proto.CompactTextString(m) }
func (*DateShiftConfig) ProtoMessage()    {}
func (*DateShiftConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{59}
}

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

var xxx_messageInfo_DateShiftConfig proto.InternalMessageInfo

func (m *DateShiftConfig) GetUpperBoundDays() int32 {
	if m != nil {
		return m.UpperBoundDays
	}
	return 0
}

func (m *DateShiftConfig) GetLowerBoundDays() int32 {
	if m != nil {
		return m.LowerBoundDays
	}
	return 0
}

func (m *DateShiftConfig) GetContext() *FieldId {
	if m != nil {
		return m.Context
	}
	return nil
}

type isDateShiftConfig_Method interface {
	isDateShiftConfig_Method()
}

type DateShiftConfig_CryptoKey struct {
	CryptoKey *CryptoKey `protobuf:"bytes,4,opt,name=crypto_key,json=cryptoKey,proto3,oneof"`
}

func (*DateShiftConfig_CryptoKey) isDateShiftConfig_Method() {}

func (m *DateShiftConfig) GetMethod() isDateShiftConfig_Method {
	if m != nil {
		return m.Method
	}
	return nil
}

func (m *DateShiftConfig) GetCryptoKey() *CryptoKey {
	if x, ok := m.GetMethod().(*DateShiftConfig_CryptoKey); ok {
		return x.CryptoKey
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*DateShiftConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*DateShiftConfig_CryptoKey)(nil),
	}
}

// A type of transformation that will scan unstructured text and
// apply various `PrimitiveTransformation`s to each finding, where the
// transformation is applied to only values that were identified as a specific
// info_type.
type InfoTypeTransformations struct {
	// Required. Transformation for each infoType. Cannot specify more than one
	// for a given infoType.
	Transformations      []*InfoTypeTransformations_InfoTypeTransformation `protobuf:"bytes,1,rep,name=transformations,proto3" json:"transformations,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                          `json:"-"`
	XXX_unrecognized     []byte                                            `json:"-"`
	XXX_sizecache        int32                                             `json:"-"`
}

func (m *InfoTypeTransformations) Reset()         { *m = InfoTypeTransformations{} }
func (m *InfoTypeTransformations) String() string { return proto.CompactTextString(m) }
func (*InfoTypeTransformations) ProtoMessage()    {}
func (*InfoTypeTransformations) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{60}
}

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

var xxx_messageInfo_InfoTypeTransformations proto.InternalMessageInfo

func (m *InfoTypeTransformations) GetTransformations() []*InfoTypeTransformations_InfoTypeTransformation {
	if m != nil {
		return m.Transformations
	}
	return nil
}

// A transformation to apply to text that is identified as a specific
// info_type.
type InfoTypeTransformations_InfoTypeTransformation struct {
	// InfoTypes to apply the transformation to. An empty list will cause
	// this transformation to apply to all findings that correspond to
	// infoTypes that were requested in `InspectConfig`.
	InfoTypes []*InfoType `protobuf:"bytes,1,rep,name=info_types,json=infoTypes,proto3" json:"info_types,omitempty"`
	// Required. Primitive transformation to apply to the infoType.
	PrimitiveTransformation *PrimitiveTransformation `protobuf:"bytes,2,opt,name=primitive_transformation,json=primitiveTransformation,proto3" json:"primitive_transformation,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                 `json:"-"`
	XXX_unrecognized        []byte                   `json:"-"`
	XXX_sizecache           int32                    `json:"-"`
}

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

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

var xxx_messageInfo_InfoTypeTransformations_InfoTypeTransformation proto.InternalMessageInfo

func (m *InfoTypeTransformations_InfoTypeTransformation) GetInfoTypes() []*InfoType {
	if m != nil {
		return m.InfoTypes
	}
	return nil
}

func (m *InfoTypeTransformations_InfoTypeTransformation) GetPrimitiveTransformation() *PrimitiveTransformation {
	if m != nil {
		return m.PrimitiveTransformation
	}
	return nil
}

// The transformation to apply to the field.
type FieldTransformation struct {
	// Required. Input field(s) to apply the transformation to.
	Fields []*FieldId `protobuf:"bytes,1,rep,name=fields,proto3" json:"fields,omitempty"`
	// Only apply the transformation if the condition evaluates to true for the
	// given `RecordCondition`. The conditions are allowed to reference fields
	// that are not used in the actual transformation.
	//
	// Example Use Cases:
	//
	// - Apply a different bucket transformation to an age column if the zip code
	// column for the same record is within a specific range.
	// - Redact a field if the date of birth field is greater than 85.
	Condition *RecordCondition `protobuf:"bytes,3,opt,name=condition,proto3" json:"condition,omitempty"`
	// Transformation to apply. [required]
	//
	// Types that are valid to be assigned to Transformation:
	//	*FieldTransformation_PrimitiveTransformation
	//	*FieldTransformation_InfoTypeTransformations
	Transformation       isFieldTransformation_Transformation `protobuf_oneof:"transformation"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

func (m *FieldTransformation) Reset()         { *m = FieldTransformation{} }
func (m *FieldTransformation) String() string { return proto.CompactTextString(m) }
func (*FieldTransformation) ProtoMessage()    {}
func (*FieldTransformation) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{61}
}

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

var xxx_messageInfo_FieldTransformation proto.InternalMessageInfo

func (m *FieldTransformation) GetFields() []*FieldId {
	if m != nil {
		return m.Fields
	}
	return nil
}

func (m *FieldTransformation) GetCondition() *RecordCondition {
	if m != nil {
		return m.Condition
	}
	return nil
}

type isFieldTransformation_Transformation interface {
	isFieldTransformation_Transformation()
}

type FieldTransformation_PrimitiveTransformation struct {
	PrimitiveTransformation *PrimitiveTransformation `protobuf:"bytes,4,opt,name=primitive_transformation,json=primitiveTransformation,proto3,oneof"`
}

type FieldTransformation_InfoTypeTransformations struct {
	InfoTypeTransformations *InfoTypeTransformations `protobuf:"bytes,5,opt,name=info_type_transformations,json=infoTypeTransformations,proto3,oneof"`
}

func (*FieldTransformation_PrimitiveTransformation) isFieldTransformation_Transformation() {}

func (*FieldTransformation_InfoTypeTransformations) isFieldTransformation_Transformation() {}

func (m *FieldTransformation) GetTransformation() isFieldTransformation_Transformation {
	if m != nil {
		return m.Transformation
	}
	return nil
}

func (m *FieldTransformation) GetPrimitiveTransformation() *PrimitiveTransformation {
	if x, ok := m.GetTransformation().(*FieldTransformation_PrimitiveTransformation); ok {
		return x.PrimitiveTransformation
	}
	return nil
}

func (m *FieldTransformation) GetInfoTypeTransformations() *InfoTypeTransformations {
	if x, ok := m.GetTransformation().(*FieldTransformation_InfoTypeTransformations); ok {
		return x.InfoTypeTransformations
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*FieldTransformation) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*FieldTransformation_PrimitiveTransformation)(nil),
		(*FieldTransformation_InfoTypeTransformations)(nil),
	}
}

// A type of transformation that is applied over structured data such as a
// table.
type RecordTransformations struct {
	// Transform the record by applying various field transformations.
	FieldTransformations []*FieldTransformation `protobuf:"bytes,1,rep,name=field_transformations,json=fieldTransformations,proto3" json:"field_transformations,omitempty"`
	// Configuration defining which records get suppressed entirely. Records that
	// match any suppression rule are omitted from the output.
	RecordSuppressions   []*RecordSuppression `protobuf:"bytes,2,rep,name=record_suppressions,json=recordSuppressions,proto3" json:"record_suppressions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *RecordTransformations) Reset()         { *m = RecordTransformations{} }
func (m *RecordTransformations) String() string { return proto.CompactTextString(m) }
func (*RecordTransformations) ProtoMessage()    {}
func (*RecordTransformations) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{62}
}

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

var xxx_messageInfo_RecordTransformations proto.InternalMessageInfo

func (m *RecordTransformations) GetFieldTransformations() []*FieldTransformation {
	if m != nil {
		return m.FieldTransformations
	}
	return nil
}

func (m *RecordTransformations) GetRecordSuppressions() []*RecordSuppression {
	if m != nil {
		return m.RecordSuppressions
	}
	return nil
}

// Configuration to suppress records whose suppression conditions evaluate to
// true.
type RecordSuppression struct {
	// A condition that when it evaluates to true will result in the record being
	// evaluated to be suppressed from the transformed content.
	Condition            *RecordCondition `protobuf:"bytes,1,opt,name=condition,proto3" json:"condition,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *RecordSuppression) Reset()         { *m = RecordSuppression{} }
func (m *RecordSuppression) String() string { return proto.CompactTextString(m) }
func (*RecordSuppression) ProtoMessage()    {}
func (*RecordSuppression) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{63}
}

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

var xxx_messageInfo_RecordSuppression proto.InternalMessageInfo

func (m *RecordSuppression) GetCondition() *RecordCondition {
	if m != nil {
		return m.Condition
	}
	return nil
}

// A condition for determining whether a transformation should be applied to
// a field.
type RecordCondition struct {
	// An expression.
	Expressions          *RecordCondition_Expressions `protobuf:"bytes,3,opt,name=expressions,proto3" json:"expressions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

func (m *RecordCondition) Reset()         { *m = RecordCondition{} }
func (m *RecordCondition) String() string { return proto.CompactTextString(m) }
func (*RecordCondition) ProtoMessage()    {}
func (*RecordCondition) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{64}
}

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

var xxx_messageInfo_RecordCondition proto.InternalMessageInfo

func (m *RecordCondition) GetExpressions() *RecordCondition_Expressions {
	if m != nil {
		return m.Expressions
	}
	return nil
}

// The field type of `value` and `field` do not need to match to be
// considered equal, but not all comparisons are possible.
// EQUAL_TO and NOT_EQUAL_TO attempt to compare even with incompatible types,
// but all other comparisons are invalid with incompatible types.
// A `value` of type:
//
// - `string` can be compared against all other types
// - `boolean` can only be compared against other booleans
// - `integer` can be compared against doubles or a string if the string value
// can be parsed as an integer.
// - `double` can be compared against integers or a string if the string can
// be parsed as a double.
// - `Timestamp` can be compared against strings in RFC 3339 date string
// format.
// - `TimeOfDay` can be compared against timestamps and strings in the format
// of 'HH:mm:ss'.
//
// If we fail to compare do to type mismatch, a warning will be given and
// the condition will evaluate to false.
type RecordCondition_Condition struct {
	// Required. Field within the record this condition is evaluated against.
	Field *FieldId `protobuf:"bytes,1,opt,name=field,proto3" json:"field,omitempty"`
	// Required. Operator used to compare the field or infoType to the value.
	Operator RelationalOperator `protobuf:"varint,3,opt,name=operator,proto3,enum=google.privacy.dlp.v2.RelationalOperator" json:"operator,omitempty"`
	// Value to compare against. [Mandatory, except for `EXISTS` tests.]
	Value                *Value   `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RecordCondition_Condition proto.InternalMessageInfo

func (m *RecordCondition_Condition) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *RecordCondition_Condition) GetOperator() RelationalOperator {
	if m != nil {
		return m.Operator
	}
	return RelationalOperator_RELATIONAL_OPERATOR_UNSPECIFIED
}

func (m *RecordCondition_Condition) GetValue() *Value {
	if m != nil {
		return m.Value
	}
	return nil
}

// A collection of conditions.
type RecordCondition_Conditions struct {
	// A collection of conditions.
	Conditions           []*RecordCondition_Condition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_RecordCondition_Conditions proto.InternalMessageInfo

func (m *RecordCondition_Conditions) GetConditions() []*RecordCondition_Condition {
	if m != nil {
		return m.Conditions
	}
	return nil
}

// An expression, consisting or an operator and conditions.
type RecordCondition_Expressions struct {
	// The operator to apply to the result of conditions. Default and currently
	// only supported value is `AND`.
	LogicalOperator RecordCondition_Expressions_LogicalOperator `protobuf:"varint,1,opt,name=logical_operator,json=logicalOperator,proto3,enum=google.privacy.dlp.v2.RecordCondition_Expressions_LogicalOperator" json:"logical_operator,omitempty"`
	// Expression types.
	//
	// Types that are valid to be assigned to Type:
	//	*RecordCondition_Expressions_Conditions
	Type                 isRecordCondition_Expressions_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

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

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

var xxx_messageInfo_RecordCondition_Expressions proto.InternalMessageInfo

func (m *RecordCondition_Expressions) GetLogicalOperator() RecordCondition_Expressions_LogicalOperator {
	if m != nil {
		return m.LogicalOperator
	}
	return RecordCondition_Expressions_LOGICAL_OPERATOR_UNSPECIFIED
}

type isRecordCondition_Expressions_Type interface {
	isRecordCondition_Expressions_Type()
}

type RecordCondition_Expressions_Conditions struct {
	Conditions *RecordCondition_Conditions `protobuf:"bytes,3,opt,name=conditions,proto3,oneof"`
}

func (*RecordCondition_Expressions_Conditions) isRecordCondition_Expressions_Type() {}

func (m *RecordCondition_Expressions) GetType() isRecordCondition_Expressions_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *RecordCondition_Expressions) GetConditions() *RecordCondition_Conditions {
	if x, ok := m.GetType().(*RecordCondition_Expressions_Conditions); ok {
		return x.Conditions
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*RecordCondition_Expressions) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*RecordCondition_Expressions_Conditions)(nil),
	}
}

// Overview of the modifications that occurred.
type TransformationOverview struct {
	// Total size in bytes that were transformed in some way.
	TransformedBytes int64 `protobuf:"varint,2,opt,name=transformed_bytes,json=transformedBytes,proto3" json:"transformed_bytes,omitempty"`
	// Transformations applied to the dataset.
	TransformationSummaries []*TransformationSummary `protobuf:"bytes,3,rep,name=transformation_summaries,json=transformationSummaries,proto3" json:"transformation_summaries,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                 `json:"-"`
	XXX_unrecognized        []byte                   `json:"-"`
	XXX_sizecache           int32                    `json:"-"`
}

func (m *TransformationOverview) Reset()         { *m = TransformationOverview{} }
func (m *TransformationOverview) String() string { return proto.CompactTextString(m) }
func (*TransformationOverview) ProtoMessage()    {}
func (*TransformationOverview) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{65}
}

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

var xxx_messageInfo_TransformationOverview proto.InternalMessageInfo

func (m *TransformationOverview) GetTransformedBytes() int64 {
	if m != nil {
		return m.TransformedBytes
	}
	return 0
}

func (m *TransformationOverview) GetTransformationSummaries() []*TransformationSummary {
	if m != nil {
		return m.TransformationSummaries
	}
	return nil
}

// Summary of a single transformation.
// Only one of 'transformation', 'field_transformation', or 'record_suppress'
// will be set.
type TransformationSummary struct {
	// Set if the transformation was limited to a specific InfoType.
	InfoType *InfoType `protobuf:"bytes,1,opt,name=info_type,json=infoType,proto3" json:"info_type,omitempty"`
	// Set if the transformation was limited to a specific FieldId.
	Field *FieldId `protobuf:"bytes,2,opt,name=field,proto3" json:"field,omitempty"`
	// The specific transformation these stats apply to.
	Transformation *PrimitiveTransformation `protobuf:"bytes,3,opt,name=transformation,proto3" json:"transformation,omitempty"`
	// The field transformation that was applied.
	// If multiple field transformations are requested for a single field,
	// this list will contain all of them; otherwise, only one is supplied.
	FieldTransformations []*FieldTransformation `protobuf:"bytes,5,rep,name=field_transformations,json=fieldTransformations,proto3" json:"field_transformations,omitempty"`
	// The specific suppression option these stats apply to.
	RecordSuppress *RecordSuppression `protobuf:"bytes,6,opt,name=record_suppress,json=recordSuppress,proto3" json:"record_suppress,omitempty"`
	// Collection of all transformations that took place or had an error.
	Results []*TransformationSummary_SummaryResult `protobuf:"bytes,4,rep,name=results,proto3" json:"results,omitempty"`
	// Total size in bytes that were transformed in some way.
	TransformedBytes     int64    `protobuf:"varint,7,opt,name=transformed_bytes,json=transformedBytes,proto3" json:"transformed_bytes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TransformationSummary) Reset()         { *m = TransformationSummary{} }
func (m *TransformationSummary) String() string { return proto.CompactTextString(m) }
func (*TransformationSummary) ProtoMessage()    {}
func (*TransformationSummary) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{66}
}

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

var xxx_messageInfo_TransformationSummary proto.InternalMessageInfo

func (m *TransformationSummary) GetInfoType() *InfoType {
	if m != nil {
		return m.InfoType
	}
	return nil
}

func (m *TransformationSummary) GetField() *FieldId {
	if m != nil {
		return m.Field
	}
	return nil
}

func (m *TransformationSummary) GetTransformation() *PrimitiveTransformation {
	if m != nil {
		return m.Transformation
	}
	return nil
}

func (m *TransformationSummary) GetFieldTransformations() []*FieldTransformation {
	if m != nil {
		return m.FieldTransformations
	}
	return nil
}

func (m *TransformationSummary) GetRecordSuppress() *RecordSuppression {
	if m != nil {
		return m.RecordSuppress
	}
	return nil
}

func (m *TransformationSummary) GetResults() []*TransformationSummary_SummaryResult {
	if m != nil {
		return m.Results
	}
	return nil
}

func (m *TransformationSummary) GetTransformedBytes() int64 {
	if m != nil {
		return m.TransformedBytes
	}
	return 0
}

// A collection that informs the user the number of times a particular
// `TransformationResultCode` and error details occurred.
type TransformationSummary_SummaryResult struct {
	// Number of transformations counted by this result.
	Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
	// Outcome of the transformation.
	Code TransformationSummary_TransformationResultCode `protobuf:"varint,2,opt,name=code,proto3,enum=google.privacy.dlp.v2.TransformationSummary_TransformationResultCode" json:"code,omitempty"`
	// A place for warnings or errors to show up if a transformation didn't
	// work as expected.
	Details              string   `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TransformationSummary_SummaryResult proto.InternalMessageInfo

func (m *TransformationSummary_SummaryResult) GetCount() int64 {
	if m != nil {
		return m.Count
	}
	return 0
}

func (m *TransformationSummary_SummaryResult) GetCode() TransformationSummary_TransformationResultCode {
	if m != nil {
		return m.Code
	}
	return TransformationSummary_TRANSFORMATION_RESULT_CODE_UNSPECIFIED
}

func (m *TransformationSummary_SummaryResult) GetDetails() string {
	if m != nil {
		return m.Details
	}
	return ""
}

// Schedule for triggeredJobs.
type Schedule struct {
	// Types that are valid to be assigned to Option:
	//	*Schedule_RecurrencePeriodDuration
	Option               isSchedule_Option `protobuf_oneof:"option"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *Schedule) Reset()         { *m = Schedule{} }
func (m *Schedule) String() string { return proto.CompactTextString(m) }
func (*Schedule) ProtoMessage()    {}
func (*Schedule) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{67}
}

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

var xxx_messageInfo_Schedule proto.InternalMessageInfo

type isSchedule_Option interface {
	isSchedule_Option()
}

type Schedule_RecurrencePeriodDuration struct {
	RecurrencePeriodDuration *duration.Duration `protobuf:"bytes,1,opt,name=recurrence_period_duration,json=recurrencePeriodDuration,proto3,oneof"`
}

func (*Schedule_RecurrencePeriodDuration) isSchedule_Option() {}

func (m *Schedule) GetOption() isSchedule_Option {
	if m != nil {
		return m.Option
	}
	return nil
}

func (m *Schedule) GetRecurrencePeriodDuration() *duration.Duration {
	if x, ok := m.GetOption().(*Schedule_RecurrencePeriodDuration); ok {
		return x.RecurrencePeriodDuration
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Schedule) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Schedule_RecurrencePeriodDuration)(nil),
	}
}

// The inspectTemplate contains a configuration (set of types of sensitive data
// to be detected) to be used anywhere you otherwise would normally specify
// InspectConfig. See https://cloud.google.com/dlp/docs/concepts-templates
// to learn more.
type InspectTemplate struct {
	// Output only. The template name.
	//
	// The template will have one of the following formats:
	// `projects/PROJECT_ID/inspectTemplates/TEMPLATE_ID` OR
	// `organizations/ORGANIZATION_ID/inspectTemplates/TEMPLATE_ID`;
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Display name (max 256 chars).
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Short description (max 256 chars).
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// Output only. The creation timestamp of an inspectTemplate.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Output only. The last update timestamp of an inspectTemplate.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// The core content of the template. Configuration of the scanning process.
	InspectConfig        *InspectConfig `protobuf:"bytes,6,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *InspectTemplate) Reset()         { *m = InspectTemplate{} }
func (m *InspectTemplate) String() string { return proto.CompactTextString(m) }
func (*InspectTemplate) ProtoMessage()    {}
func (*InspectTemplate) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{68}
}

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

var xxx_messageInfo_InspectTemplate proto.InternalMessageInfo

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

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

func (m *InspectTemplate) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

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

func (m *InspectTemplate) GetUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.UpdateTime
	}
	return nil
}

func (m *InspectTemplate) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

// DeidentifyTemplates contains instructions on how to de-identify content.
// See https://cloud.google.com/dlp/docs/concepts-templates to learn more.
type DeidentifyTemplate struct {
	// Output only. The template name.
	//
	// The template will have one of the following formats:
	// `projects/PROJECT_ID/deidentifyTemplates/TEMPLATE_ID` OR
	// `organizations/ORGANIZATION_ID/deidentifyTemplates/TEMPLATE_ID`
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Display name (max 256 chars).
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Short description (max 256 chars).
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// Output only. The creation timestamp of an inspectTemplate.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Output only. The last update timestamp of an inspectTemplate.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// ///////////// // The core content of the template  // ///////////////
	DeidentifyConfig     *DeidentifyConfig `protobuf:"bytes,6,opt,name=deidentify_config,json=deidentifyConfig,proto3" json:"deidentify_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *DeidentifyTemplate) Reset()         { *m = DeidentifyTemplate{} }
func (m *DeidentifyTemplate) String() string { return proto.CompactTextString(m) }
func (*DeidentifyTemplate) ProtoMessage()    {}
func (*DeidentifyTemplate) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{69}
}

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

var xxx_messageInfo_DeidentifyTemplate proto.InternalMessageInfo

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

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

func (m *DeidentifyTemplate) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

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

func (m *DeidentifyTemplate) GetUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.UpdateTime
	}
	return nil
}

func (m *DeidentifyTemplate) GetDeidentifyConfig() *DeidentifyConfig {
	if m != nil {
		return m.DeidentifyConfig
	}
	return nil
}

// Details information about an error encountered during job execution or
// the results of an unsuccessful activation of the JobTrigger.
type Error struct {
	// Detailed error codes and messages.
	Details *status.Status `protobuf:"bytes,1,opt,name=details,proto3" json:"details,omitempty"`
	// The times the error occurred.
	Timestamps           []*timestamp.Timestamp `protobuf:"bytes,2,rep,name=timestamps,proto3" json:"timestamps,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *Error) Reset()         { *m = Error{} }
func (m *Error) String() string { return proto.CompactTextString(m) }
func (*Error) ProtoMessage()    {}
func (*Error) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{70}
}

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

var xxx_messageInfo_Error proto.InternalMessageInfo

func (m *Error) GetDetails() *status.Status {
	if m != nil {
		return m.Details
	}
	return nil
}

func (m *Error) GetTimestamps() []*timestamp.Timestamp {
	if m != nil {
		return m.Timestamps
	}
	return nil
}

// Contains a configuration to make dlp api calls on a repeating basis.
// See https://cloud.google.com/dlp/docs/concepts-job-triggers to learn more.
type JobTrigger struct {
	// Unique resource name for the triggeredJob, assigned by the service when the
	// triggeredJob is created, for example
	// `projects/dlp-test-project/jobTriggers/53234423`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Display name (max 100 chars)
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// User provided description (max 256 chars)
	Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The configuration details for the specific type of job to run.
	//
	// Types that are valid to be assigned to Job:
	//	*JobTrigger_InspectJob
	Job isJobTrigger_Job `protobuf_oneof:"job"`
	// A list of triggers which will be OR'ed together. Only one in the list
	// needs to trigger for a job to be started. The list may contain only
	// a single Schedule trigger and must have at least one object.
	Triggers []*JobTrigger_Trigger `protobuf:"bytes,5,rep,name=triggers,proto3" json:"triggers,omitempty"`
	// Output only. A stream of errors encountered when the trigger was activated. Repeated
	// errors may result in the JobTrigger automatically being paused.
	// Will return the last 100 errors. Whenever the JobTrigger is modified
	// this list will be cleared.
	Errors []*Error `protobuf:"bytes,6,rep,name=errors,proto3" json:"errors,omitempty"`
	// Output only. The creation timestamp of a triggeredJob.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,7,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Output only. The last update timestamp of a triggeredJob.
	UpdateTime *timestamp.Timestamp `protobuf:"bytes,8,opt,name=update_time,json=updateTime,proto3" json:"update_time,omitempty"`
	// Output only. The timestamp of the last time this trigger executed.
	LastRunTime *timestamp.Timestamp `protobuf:"bytes,9,opt,name=last_run_time,json=lastRunTime,proto3" json:"last_run_time,omitempty"`
	// Required. A status for this trigger.
	Status               JobTrigger_Status `protobuf:"varint,10,opt,name=status,proto3,enum=google.privacy.dlp.v2.JobTrigger_Status" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *JobTrigger) Reset()         { *m = JobTrigger{} }
func (m *JobTrigger) String() string { return proto.CompactTextString(m) }
func (*JobTrigger) ProtoMessage()    {}
func (*JobTrigger) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{71}
}

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

var xxx_messageInfo_JobTrigger proto.InternalMessageInfo

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

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

func (m *JobTrigger) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

type isJobTrigger_Job interface {
	isJobTrigger_Job()
}

type JobTrigger_InspectJob struct {
	InspectJob *InspectJobConfig `protobuf:"bytes,4,opt,name=inspect_job,json=inspectJob,proto3,oneof"`
}

func (*JobTrigger_InspectJob) isJobTrigger_Job() {}

func (m *JobTrigger) GetJob() isJobTrigger_Job {
	if m != nil {
		return m.Job
	}
	return nil
}

func (m *JobTrigger) GetInspectJob() *InspectJobConfig {
	if x, ok := m.GetJob().(*JobTrigger_InspectJob); ok {
		return x.InspectJob
	}
	return nil
}

func (m *JobTrigger) GetTriggers() []*JobTrigger_Trigger {
	if m != nil {
		return m.Triggers
	}
	return nil
}

func (m *JobTrigger) GetErrors() []*Error {
	if m != nil {
		return m.Errors
	}
	return nil
}

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

func (m *JobTrigger) GetUpdateTime() *timestamp.Timestamp {
	if m != nil {
		return m.UpdateTime
	}
	return nil
}

func (m *JobTrigger) GetLastRunTime() *timestamp.Timestamp {
	if m != nil {
		return m.LastRunTime
	}
	return nil
}

func (m *JobTrigger) GetStatus() JobTrigger_Status {
	if m != nil {
		return m.Status
	}
	return JobTrigger_STATUS_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*JobTrigger) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*JobTrigger_InspectJob)(nil),
	}
}

// What event needs to occur for a new job to be started.
type JobTrigger_Trigger struct {
	// Types that are valid to be assigned to Trigger:
	//	*JobTrigger_Trigger_Schedule
	Trigger              isJobTrigger_Trigger_Trigger `protobuf_oneof:"trigger"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_JobTrigger_Trigger proto.InternalMessageInfo

type isJobTrigger_Trigger_Trigger interface {
	isJobTrigger_Trigger_Trigger()
}

type JobTrigger_Trigger_Schedule struct {
	Schedule *Schedule `protobuf:"bytes,1,opt,name=schedule,proto3,oneof"`
}

func (*JobTrigger_Trigger_Schedule) isJobTrigger_Trigger_Trigger() {}

func (m *JobTrigger_Trigger) GetTrigger() isJobTrigger_Trigger_Trigger {
	if m != nil {
		return m.Trigger
	}
	return nil
}

func (m *JobTrigger_Trigger) GetSchedule() *Schedule {
	if x, ok := m.GetTrigger().(*JobTrigger_Trigger_Schedule); ok {
		return x.Schedule
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*JobTrigger_Trigger) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*JobTrigger_Trigger_Schedule)(nil),
	}
}

// A task to execute on the completion of a job.
// See https://cloud.google.com/dlp/docs/concepts-actions to learn more.
type Action struct {
	// Types that are valid to be assigned to Action:
	//	*Action_SaveFindings_
	//	*Action_PubSub
	//	*Action_PublishSummaryToCscc_
	//	*Action_PublishFindingsToCloudDataCatalog_
	//	*Action_JobNotificationEmails_
	//	*Action_PublishToStackdriver_
	Action               isAction_Action `protobuf_oneof:"action"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *Action) Reset()         { *m = Action{} }
func (m *Action) String() string { return proto.CompactTextString(m) }
func (*Action) ProtoMessage()    {}
func (*Action) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{72}
}

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

var xxx_messageInfo_Action proto.InternalMessageInfo

type isAction_Action interface {
	isAction_Action()
}

type Action_SaveFindings_ struct {
	SaveFindings *Action_SaveFindings `protobuf:"bytes,1,opt,name=save_findings,json=saveFindings,proto3,oneof"`
}

type Action_PubSub struct {
	PubSub *Action_PublishToPubSub `protobuf:"bytes,2,opt,name=pub_sub,json=pubSub,proto3,oneof"`
}

type Action_PublishSummaryToCscc_ struct {
	PublishSummaryToCscc *Action_PublishSummaryToCscc `protobuf:"bytes,3,opt,name=publish_summary_to_cscc,json=publishSummaryToCscc,proto3,oneof"`
}

type Action_PublishFindingsToCloudDataCatalog_ struct {
	PublishFindingsToCloudDataCatalog *Action_PublishFindingsToCloudDataCatalog `protobuf:"bytes,5,opt,name=publish_findings_to_cloud_data_catalog,json=publishFindingsToCloudDataCatalog,proto3,oneof"`
}

type Action_JobNotificationEmails_ struct {
	JobNotificationEmails *Action_JobNotificationEmails `protobuf:"bytes,8,opt,name=job_notification_emails,json=jobNotificationEmails,proto3,oneof"`
}

type Action_PublishToStackdriver_ struct {
	PublishToStackdriver *Action_PublishToStackdriver `protobuf:"bytes,9,opt,name=publish_to_stackdriver,json=publishToStackdriver,proto3,oneof"`
}

func (*Action_SaveFindings_) isAction_Action() {}

func (*Action_PubSub) isAction_Action() {}

func (*Action_PublishSummaryToCscc_) isAction_Action() {}

func (*Action_PublishFindingsToCloudDataCatalog_) isAction_Action() {}

func (*Action_JobNotificationEmails_) isAction_Action() {}

func (*Action_PublishToStackdriver_) isAction_Action() {}

func (m *Action) GetAction() isAction_Action {
	if m != nil {
		return m.Action
	}
	return nil
}

func (m *Action) GetSaveFindings() *Action_SaveFindings {
	if x, ok := m.GetAction().(*Action_SaveFindings_); ok {
		return x.SaveFindings
	}
	return nil
}

func (m *Action) GetPubSub() *Action_PublishToPubSub {
	if x, ok := m.GetAction().(*Action_PubSub); ok {
		return x.PubSub
	}
	return nil
}

func (m *Action) GetPublishSummaryToCscc() *Action_PublishSummaryToCscc {
	if x, ok := m.GetAction().(*Action_PublishSummaryToCscc_); ok {
		return x.PublishSummaryToCscc
	}
	return nil
}

func (m *Action) GetPublishFindingsToCloudDataCatalog() *Action_PublishFindingsToCloudDataCatalog {
	if x, ok := m.GetAction().(*Action_PublishFindingsToCloudDataCatalog_); ok {
		return x.PublishFindingsToCloudDataCatalog
	}
	return nil
}

func (m *Action) GetJobNotificationEmails() *Action_JobNotificationEmails {
	if x, ok := m.GetAction().(*Action_JobNotificationEmails_); ok {
		return x.JobNotificationEmails
	}
	return nil
}

func (m *Action) GetPublishToStackdriver() *Action_PublishToStackdriver {
	if x, ok := m.GetAction().(*Action_PublishToStackdriver_); ok {
		return x.PublishToStackdriver
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Action) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Action_SaveFindings_)(nil),
		(*Action_PubSub)(nil),
		(*Action_PublishSummaryToCscc_)(nil),
		(*Action_PublishFindingsToCloudDataCatalog_)(nil),
		(*Action_JobNotificationEmails_)(nil),
		(*Action_PublishToStackdriver_)(nil),
	}
}

// If set, the detailed findings will be persisted to the specified
// OutputStorageConfig. Only a single instance of this action can be
// specified.
// Compatible with: Inspect, Risk
type Action_SaveFindings struct {
	// Location to store findings outside of DLP.
	OutputConfig         *OutputStorageConfig `protobuf:"bytes,1,opt,name=output_config,json=outputConfig,proto3" json:"output_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Action_SaveFindings proto.InternalMessageInfo

func (m *Action_SaveFindings) GetOutputConfig() *OutputStorageConfig {
	if m != nil {
		return m.OutputConfig
	}
	return nil
}

// Publish a message into given Pub/Sub topic when DlpJob has completed. The
// message contains a single field, `DlpJobName`, which is equal to the
// finished job's
// [`DlpJob.name`](/dlp/docs/reference/rest/v2/projects.dlpJobs#DlpJob).
// Compatible with: Inspect, Risk
type Action_PublishToPubSub struct {
	// Cloud Pub/Sub topic to send notifications to. The topic must have given
	// publishing access rights to the DLP API service account executing
	// the long running DlpJob sending the notifications.
	// Format is projects/{project}/topics/{topic}.
	Topic                string   `protobuf:"bytes,1,opt,name=topic,proto3" json:"topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Action_PublishToPubSub proto.InternalMessageInfo

func (m *Action_PublishToPubSub) GetTopic() string {
	if m != nil {
		return m.Topic
	}
	return ""
}

// Publish the result summary of a DlpJob to the Cloud Security
// Command Center (CSCC Alpha).
// This action is only available for projects which are parts of
// an organization and whitelisted for the alpha Cloud Security Command
// Center.
// The action will publish count of finding instances and their info types.
// The summary of findings will be persisted in CSCC and are governed by CSCC
// service-specific policy, see https://cloud.google.com/terms/service-terms
// Only a single instance of this action can be specified.
// Compatible with: Inspect
type Action_PublishSummaryToCscc struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Action_PublishSummaryToCscc proto.InternalMessageInfo

// Publish findings of a DlpJob to Cloud Data Catalog. Labels summarizing the
// results of the DlpJob will be applied to the entry for the resource scanned
// in Cloud Data Catalog. Any labels previously written by another DlpJob will
// be deleted. InfoType naming patterns are strictly enforced when using this
// feature. Note that the findings will be persisted in Cloud Data Catalog
// storage and are governed by Data Catalog service-specific policy, see
// https://cloud.google.com/terms/service-terms
// Only a single instance of this action can be specified and only allowed if
// all resources being scanned are BigQuery tables.
// Compatible with: Inspect
type Action_PublishFindingsToCloudDataCatalog struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Action_PublishFindingsToCloudDataCatalog proto.InternalMessageInfo

// Enable email notification to project owners and editors on jobs's
// completion/failure.
type Action_JobNotificationEmails struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Action_JobNotificationEmails proto.InternalMessageInfo

// Enable Stackdriver metric dlp.googleapis.com/finding_count. This
// will publish a metric to stack driver on each infotype requested and
// how many findings were found for it. CustomDetectors will be bucketed
// as 'Custom' under the Stackdriver label 'info_type'.
type Action_PublishToStackdriver struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Action_PublishToStackdriver proto.InternalMessageInfo

// Request message for CreateInspectTemplate.
type CreateInspectTemplateRequest struct {
	// Required. The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The InspectTemplate to create.
	InspectTemplate *InspectTemplate `protobuf:"bytes,2,opt,name=inspect_template,json=inspectTemplate,proto3" json:"inspect_template,omitempty"`
	// The template id can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	TemplateId string `protobuf:"bytes,3,opt,name=template_id,json=templateId,proto3" json:"template_id,omitempty"`
	// The geographic location to store the inspection template. Reserved for
	// future extensions.
	LocationId           string   `protobuf:"bytes,4,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateInspectTemplateRequest) Reset()         { *m = CreateInspectTemplateRequest{} }
func (m *CreateInspectTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*CreateInspectTemplateRequest) ProtoMessage()    {}
func (*CreateInspectTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{73}
}

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

var xxx_messageInfo_CreateInspectTemplateRequest proto.InternalMessageInfo

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

func (m *CreateInspectTemplateRequest) GetInspectTemplate() *InspectTemplate {
	if m != nil {
		return m.InspectTemplate
	}
	return nil
}

func (m *CreateInspectTemplateRequest) GetTemplateId() string {
	if m != nil {
		return m.TemplateId
	}
	return ""
}

func (m *CreateInspectTemplateRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Request message for UpdateInspectTemplate.
type UpdateInspectTemplateRequest struct {
	// Required. Resource name of organization and inspectTemplate to be updated, for
	// example `organizations/433245324/inspectTemplates/432452342` or
	// projects/project-id/inspectTemplates/432452342.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// New InspectTemplate value.
	InspectTemplate *InspectTemplate `protobuf:"bytes,2,opt,name=inspect_template,json=inspectTemplate,proto3" json:"inspect_template,omitempty"`
	// Mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,3,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 *UpdateInspectTemplateRequest) Reset()         { *m = UpdateInspectTemplateRequest{} }
func (m *UpdateInspectTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateInspectTemplateRequest) ProtoMessage()    {}
func (*UpdateInspectTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{74}
}

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

var xxx_messageInfo_UpdateInspectTemplateRequest proto.InternalMessageInfo

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

func (m *UpdateInspectTemplateRequest) GetInspectTemplate() *InspectTemplate {
	if m != nil {
		return m.InspectTemplate
	}
	return nil
}

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

// Request message for GetInspectTemplate.
type GetInspectTemplateRequest struct {
	// Required. Resource name of the organization and inspectTemplate to be read, for
	// example `organizations/433245324/inspectTemplates/432452342` or
	// projects/project-id/inspectTemplates/432452342.
	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 *GetInspectTemplateRequest) Reset()         { *m = GetInspectTemplateRequest{} }
func (m *GetInspectTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*GetInspectTemplateRequest) ProtoMessage()    {}
func (*GetInspectTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{75}
}

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

var xxx_messageInfo_GetInspectTemplateRequest proto.InternalMessageInfo

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

// Request message for ListInspectTemplates.
type ListInspectTemplatesRequest struct {
	// Required. The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Page token to continue retrieval. Comes from previous call
	// to `ListInspectTemplates`.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Size of the page, can be limited by server. If zero server returns
	// a page of max size 100.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Comma separated list of fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc,update_time, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the template was created.
	// - `update_time`: corresponds to time the template was last updated.
	// - `name`: corresponds to template's name.
	// - `display_name`: corresponds to template's display name.
	OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	// The geographic location where inspection templates will be retrieved from.
	// Use `-` for all locations. Reserved for future extensions.
	LocationId           string   `protobuf:"bytes,5,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListInspectTemplatesRequest) Reset()         { *m = ListInspectTemplatesRequest{} }
func (m *ListInspectTemplatesRequest) String() string { return proto.CompactTextString(m) }
func (*ListInspectTemplatesRequest) ProtoMessage()    {}
func (*ListInspectTemplatesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{76}
}

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

var xxx_messageInfo_ListInspectTemplatesRequest proto.InternalMessageInfo

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

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

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

func (m *ListInspectTemplatesRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

func (m *ListInspectTemplatesRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Response message for ListInspectTemplates.
type ListInspectTemplatesResponse struct {
	// List of inspectTemplates, up to page_size in ListInspectTemplatesRequest.
	InspectTemplates []*InspectTemplate `protobuf:"bytes,1,rep,name=inspect_templates,json=inspectTemplates,proto3" json:"inspect_templates,omitempty"`
	// If the next page is available then the next page token to be used
	// in following ListInspectTemplates request.
	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 *ListInspectTemplatesResponse) Reset()         { *m = ListInspectTemplatesResponse{} }
func (m *ListInspectTemplatesResponse) String() string { return proto.CompactTextString(m) }
func (*ListInspectTemplatesResponse) ProtoMessage()    {}
func (*ListInspectTemplatesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{77}
}

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

var xxx_messageInfo_ListInspectTemplatesResponse proto.InternalMessageInfo

func (m *ListInspectTemplatesResponse) GetInspectTemplates() []*InspectTemplate {
	if m != nil {
		return m.InspectTemplates
	}
	return nil
}

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

// Request message for DeleteInspectTemplate.
type DeleteInspectTemplateRequest struct {
	// Required. Resource name of the organization and inspectTemplate to be deleted, for
	// example `organizations/433245324/inspectTemplates/432452342` or
	// projects/project-id/inspectTemplates/432452342.
	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 *DeleteInspectTemplateRequest) Reset()         { *m = DeleteInspectTemplateRequest{} }
func (m *DeleteInspectTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteInspectTemplateRequest) ProtoMessage()    {}
func (*DeleteInspectTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{78}
}

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

var xxx_messageInfo_DeleteInspectTemplateRequest proto.InternalMessageInfo

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

// Request message for CreateJobTrigger.
type CreateJobTriggerRequest struct {
	// Required. The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The JobTrigger to create.
	JobTrigger *JobTrigger `protobuf:"bytes,2,opt,name=job_trigger,json=jobTrigger,proto3" json:"job_trigger,omitempty"`
	// The trigger id can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	TriggerId string `protobuf:"bytes,3,opt,name=trigger_id,json=triggerId,proto3" json:"trigger_id,omitempty"`
	// The geographic location to store the job trigger. Reserved for
	// future extensions.
	LocationId           string   `protobuf:"bytes,4,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateJobTriggerRequest) Reset()         { *m = CreateJobTriggerRequest{} }
func (m *CreateJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*CreateJobTriggerRequest) ProtoMessage()    {}
func (*CreateJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{79}
}

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

var xxx_messageInfo_CreateJobTriggerRequest proto.InternalMessageInfo

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

func (m *CreateJobTriggerRequest) GetJobTrigger() *JobTrigger {
	if m != nil {
		return m.JobTrigger
	}
	return nil
}

func (m *CreateJobTriggerRequest) GetTriggerId() string {
	if m != nil {
		return m.TriggerId
	}
	return ""
}

func (m *CreateJobTriggerRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Request message for ActivateJobTrigger.
type ActivateJobTriggerRequest struct {
	// Required. Resource name of the trigger to activate, for example
	// `projects/dlp-test-project/jobTriggers/53234423`.
	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 *ActivateJobTriggerRequest) Reset()         { *m = ActivateJobTriggerRequest{} }
func (m *ActivateJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*ActivateJobTriggerRequest) ProtoMessage()    {}
func (*ActivateJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{80}
}

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

var xxx_messageInfo_ActivateJobTriggerRequest proto.InternalMessageInfo

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

// Request message for UpdateJobTrigger.
type UpdateJobTriggerRequest struct {
	// Required. Resource name of the project and the triggeredJob, for example
	// `projects/dlp-test-project/jobTriggers/53234423`.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// New JobTrigger value.
	JobTrigger *JobTrigger `protobuf:"bytes,2,opt,name=job_trigger,json=jobTrigger,proto3" json:"job_trigger,omitempty"`
	// Mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,3,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 *UpdateJobTriggerRequest) Reset()         { *m = UpdateJobTriggerRequest{} }
func (m *UpdateJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateJobTriggerRequest) ProtoMessage()    {}
func (*UpdateJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{81}
}

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

var xxx_messageInfo_UpdateJobTriggerRequest proto.InternalMessageInfo

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

func (m *UpdateJobTriggerRequest) GetJobTrigger() *JobTrigger {
	if m != nil {
		return m.JobTrigger
	}
	return nil
}

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

// Request message for GetJobTrigger.
type GetJobTriggerRequest struct {
	// Required. Resource name of the project and the triggeredJob, for example
	// `projects/dlp-test-project/jobTriggers/53234423`.
	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 *GetJobTriggerRequest) Reset()         { *m = GetJobTriggerRequest{} }
func (m *GetJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*GetJobTriggerRequest) ProtoMessage()    {}
func (*GetJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{82}
}

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

var xxx_messageInfo_GetJobTriggerRequest proto.InternalMessageInfo

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

// Request message for CreateDlpJobRequest. Used to initiate long running
// jobs such as calculating risk metrics or inspecting Google Cloud
// Storage.
type CreateDlpJobRequest struct {
	// Required. The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// The configuration details for the specific type of job to run.
	//
	// Types that are valid to be assigned to Job:
	//	*CreateDlpJobRequest_InspectJob
	//	*CreateDlpJobRequest_RiskJob
	Job isCreateDlpJobRequest_Job `protobuf_oneof:"job"`
	// The job id can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	JobId string `protobuf:"bytes,4,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"`
	// The geographic location to store and process the job. Reserved for
	// future extensions.
	LocationId           string   `protobuf:"bytes,5,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateDlpJobRequest) Reset()         { *m = CreateDlpJobRequest{} }
func (m *CreateDlpJobRequest) String() string { return proto.CompactTextString(m) }
func (*CreateDlpJobRequest) ProtoMessage()    {}
func (*CreateDlpJobRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{83}
}

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

var xxx_messageInfo_CreateDlpJobRequest proto.InternalMessageInfo

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

type isCreateDlpJobRequest_Job interface {
	isCreateDlpJobRequest_Job()
}

type CreateDlpJobRequest_InspectJob struct {
	InspectJob *InspectJobConfig `protobuf:"bytes,2,opt,name=inspect_job,json=inspectJob,proto3,oneof"`
}

type CreateDlpJobRequest_RiskJob struct {
	RiskJob *RiskAnalysisJobConfig `protobuf:"bytes,3,opt,name=risk_job,json=riskJob,proto3,oneof"`
}

func (*CreateDlpJobRequest_InspectJob) isCreateDlpJobRequest_Job() {}

func (*CreateDlpJobRequest_RiskJob) isCreateDlpJobRequest_Job() {}

func (m *CreateDlpJobRequest) GetJob() isCreateDlpJobRequest_Job {
	if m != nil {
		return m.Job
	}
	return nil
}

func (m *CreateDlpJobRequest) GetInspectJob() *InspectJobConfig {
	if x, ok := m.GetJob().(*CreateDlpJobRequest_InspectJob); ok {
		return x.InspectJob
	}
	return nil
}

func (m *CreateDlpJobRequest) GetRiskJob() *RiskAnalysisJobConfig {
	if x, ok := m.GetJob().(*CreateDlpJobRequest_RiskJob); ok {
		return x.RiskJob
	}
	return nil
}

func (m *CreateDlpJobRequest) GetJobId() string {
	if m != nil {
		return m.JobId
	}
	return ""
}

func (m *CreateDlpJobRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*CreateDlpJobRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*CreateDlpJobRequest_InspectJob)(nil),
		(*CreateDlpJobRequest_RiskJob)(nil),
	}
}

// Request message for ListJobTriggers.
type ListJobTriggersRequest struct {
	// Required. The parent resource name, for example `projects/my-project-id`.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Page token to continue retrieval. Comes from previous call
	// to ListJobTriggers. `order_by` field must not
	// change for subsequent calls.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Size of the page, can be limited by a server.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Comma separated list of triggeredJob fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc,update_time, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the JobTrigger was created.
	// - `update_time`: corresponds to time the JobTrigger was last updated.
	// - `last_run_time`: corresponds to the last time the JobTrigger ran.
	// - `name`: corresponds to JobTrigger's name.
	// - `display_name`: corresponds to JobTrigger's display name.
	// - `status`: corresponds to JobTrigger's status.
	OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	// Allows filtering.
	//
	// Supported syntax:
	//
	// * Filter expressions are made up of one or more restrictions.
	// * Restrictions can be combined by `AND` or `OR` logical operators. A
	// sequence of restrictions implicitly uses `AND`.
	// * A restriction has the form of `{field} {operator} {value}`.
	// * Supported fields/values for inspect jobs:
	//     - `status` - HEALTHY|PAUSED|CANCELLED
	//     - `inspected_storage` - DATASTORE|CLOUD_STORAGE|BIGQUERY
	//     - 'last_run_time` - RFC 3339 formatted timestamp, surrounded by
	//     quotation marks. Nanoseconds are ignored.
	//     - 'error_count' - Number of errors that have occurred while running.
	// * The operator must be `=` or `!=` for status and inspected_storage.
	//
	// Examples:
	//
	// * inspected_storage = cloud_storage AND status = HEALTHY
	// * inspected_storage = cloud_storage OR inspected_storage = bigquery
	// * inspected_storage = cloud_storage AND (state = PAUSED OR state = HEALTHY)
	// * last_run_time > \"2017-12-12T00:00:00+00:00\"
	//
	// The length of this field should be no more than 500 characters.
	Filter string `protobuf:"bytes,5,opt,name=filter,proto3" json:"filter,omitempty"`
	// The geographic location where job triggers will be retrieved from.
	// Use `-` for all locations. Reserved for future extensions.
	LocationId           string   `protobuf:"bytes,7,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListJobTriggersRequest) Reset()         { *m = ListJobTriggersRequest{} }
func (m *ListJobTriggersRequest) String() string { return proto.CompactTextString(m) }
func (*ListJobTriggersRequest) ProtoMessage()    {}
func (*ListJobTriggersRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{84}
}

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

var xxx_messageInfo_ListJobTriggersRequest proto.InternalMessageInfo

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

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

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

func (m *ListJobTriggersRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

func (m *ListJobTriggersRequest) GetFilter() string {
	if m != nil {
		return m.Filter
	}
	return ""
}

func (m *ListJobTriggersRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Response message for ListJobTriggers.
type ListJobTriggersResponse struct {
	// List of triggeredJobs, up to page_size in ListJobTriggersRequest.
	JobTriggers []*JobTrigger `protobuf:"bytes,1,rep,name=job_triggers,json=jobTriggers,proto3" json:"job_triggers,omitempty"`
	// If the next page is available then the next page token to be used
	// in following ListJobTriggers request.
	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 *ListJobTriggersResponse) Reset()         { *m = ListJobTriggersResponse{} }
func (m *ListJobTriggersResponse) String() string { return proto.CompactTextString(m) }
func (*ListJobTriggersResponse) ProtoMessage()    {}
func (*ListJobTriggersResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{85}
}

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

var xxx_messageInfo_ListJobTriggersResponse proto.InternalMessageInfo

func (m *ListJobTriggersResponse) GetJobTriggers() []*JobTrigger {
	if m != nil {
		return m.JobTriggers
	}
	return nil
}

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

// Request message for DeleteJobTrigger.
type DeleteJobTriggerRequest struct {
	// Required. Resource name of the project and the triggeredJob, for example
	// `projects/dlp-test-project/jobTriggers/53234423`.
	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 *DeleteJobTriggerRequest) Reset()         { *m = DeleteJobTriggerRequest{} }
func (m *DeleteJobTriggerRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteJobTriggerRequest) ProtoMessage()    {}
func (*DeleteJobTriggerRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{86}
}

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

var xxx_messageInfo_DeleteJobTriggerRequest proto.InternalMessageInfo

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

// Controls what and how to inspect for findings.
type InspectJobConfig struct {
	// The data to scan.
	StorageConfig *StorageConfig `protobuf:"bytes,1,opt,name=storage_config,json=storageConfig,proto3" json:"storage_config,omitempty"`
	// How and what to scan for.
	InspectConfig *InspectConfig `protobuf:"bytes,2,opt,name=inspect_config,json=inspectConfig,proto3" json:"inspect_config,omitempty"`
	// If provided, will be used as the default for all values in InspectConfig.
	// `inspect_config` will be merged into the values persisted as part of the
	// template.
	InspectTemplateName string `protobuf:"bytes,3,opt,name=inspect_template_name,json=inspectTemplateName,proto3" json:"inspect_template_name,omitempty"`
	// Actions to execute at the completion of the job.
	Actions              []*Action `protobuf:"bytes,4,rep,name=actions,proto3" json:"actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *InspectJobConfig) Reset()         { *m = InspectJobConfig{} }
func (m *InspectJobConfig) String() string { return proto.CompactTextString(m) }
func (*InspectJobConfig) ProtoMessage()    {}
func (*InspectJobConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{87}
}

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

var xxx_messageInfo_InspectJobConfig proto.InternalMessageInfo

func (m *InspectJobConfig) GetStorageConfig() *StorageConfig {
	if m != nil {
		return m.StorageConfig
	}
	return nil
}

func (m *InspectJobConfig) GetInspectConfig() *InspectConfig {
	if m != nil {
		return m.InspectConfig
	}
	return nil
}

func (m *InspectJobConfig) GetInspectTemplateName() string {
	if m != nil {
		return m.InspectTemplateName
	}
	return ""
}

func (m *InspectJobConfig) GetActions() []*Action {
	if m != nil {
		return m.Actions
	}
	return nil
}

// Combines all of the information about a DLP job.
type DlpJob struct {
	// The server-assigned name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The type of job.
	Type DlpJobType `protobuf:"varint,2,opt,name=type,proto3,enum=google.privacy.dlp.v2.DlpJobType" json:"type,omitempty"`
	// State of a job.
	State DlpJob_JobState `protobuf:"varint,3,opt,name=state,proto3,enum=google.privacy.dlp.v2.DlpJob_JobState" json:"state,omitempty"`
	// Types that are valid to be assigned to Details:
	//	*DlpJob_RiskDetails
	//	*DlpJob_InspectDetails
	Details isDlpJob_Details `protobuf_oneof:"details"`
	// Time when the job was created.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Time when the job started.
	StartTime *timestamp.Timestamp `protobuf:"bytes,7,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
	// Time when the job finished.
	EndTime *timestamp.Timestamp `protobuf:"bytes,8,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
	// If created by a job trigger, the resource name of the trigger that
	// instantiated the job.
	JobTriggerName string `protobuf:"bytes,10,opt,name=job_trigger_name,json=jobTriggerName,proto3" json:"job_trigger_name,omitempty"`
	// A stream of errors encountered running the job.
	Errors               []*Error `protobuf:"bytes,11,rep,name=errors,proto3" json:"errors,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DlpJob) Reset()         { *m = DlpJob{} }
func (m *DlpJob) String() string { return proto.CompactTextString(m) }
func (*DlpJob) ProtoMessage()    {}
func (*DlpJob) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{88}
}

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

var xxx_messageInfo_DlpJob proto.InternalMessageInfo

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

func (m *DlpJob) GetType() DlpJobType {
	if m != nil {
		return m.Type
	}
	return DlpJobType_DLP_JOB_TYPE_UNSPECIFIED
}

func (m *DlpJob) GetState() DlpJob_JobState {
	if m != nil {
		return m.State
	}
	return DlpJob_JOB_STATE_UNSPECIFIED
}

type isDlpJob_Details interface {
	isDlpJob_Details()
}

type DlpJob_RiskDetails struct {
	RiskDetails *AnalyzeDataSourceRiskDetails `protobuf:"bytes,4,opt,name=risk_details,json=riskDetails,proto3,oneof"`
}

type DlpJob_InspectDetails struct {
	InspectDetails *InspectDataSourceDetails `protobuf:"bytes,5,opt,name=inspect_details,json=inspectDetails,proto3,oneof"`
}

func (*DlpJob_RiskDetails) isDlpJob_Details() {}

func (*DlpJob_InspectDetails) isDlpJob_Details() {}

func (m *DlpJob) GetDetails() isDlpJob_Details {
	if m != nil {
		return m.Details
	}
	return nil
}

func (m *DlpJob) GetRiskDetails() *AnalyzeDataSourceRiskDetails {
	if x, ok := m.GetDetails().(*DlpJob_RiskDetails); ok {
		return x.RiskDetails
	}
	return nil
}

func (m *DlpJob) GetInspectDetails() *InspectDataSourceDetails {
	if x, ok := m.GetDetails().(*DlpJob_InspectDetails); ok {
		return x.InspectDetails
	}
	return nil
}

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

func (m *DlpJob) GetStartTime() *timestamp.Timestamp {
	if m != nil {
		return m.StartTime
	}
	return nil
}

func (m *DlpJob) GetEndTime() *timestamp.Timestamp {
	if m != nil {
		return m.EndTime
	}
	return nil
}

func (m *DlpJob) GetJobTriggerName() string {
	if m != nil {
		return m.JobTriggerName
	}
	return ""
}

func (m *DlpJob) GetErrors() []*Error {
	if m != nil {
		return m.Errors
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*DlpJob) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*DlpJob_RiskDetails)(nil),
		(*DlpJob_InspectDetails)(nil),
	}
}

// The request message for [DlpJobs.GetDlpJob][].
type GetDlpJobRequest struct {
	// Required. The name of the DlpJob resource.
	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 *GetDlpJobRequest) Reset()         { *m = GetDlpJobRequest{} }
func (m *GetDlpJobRequest) String() string { return proto.CompactTextString(m) }
func (*GetDlpJobRequest) ProtoMessage()    {}
func (*GetDlpJobRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{89}
}

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

var xxx_messageInfo_GetDlpJobRequest proto.InternalMessageInfo

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

// The request message for listing DLP jobs.
type ListDlpJobsRequest struct {
	// Required. The parent resource name, for example projects/my-project-id.
	Parent string `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"`
	// Allows filtering.
	//
	// Supported syntax:
	//
	// * Filter expressions are made up of one or more restrictions.
	// * Restrictions can be combined by `AND` or `OR` logical operators. A
	// sequence of restrictions implicitly uses `AND`.
	// * A restriction has the form of `{field} {operator} {value}`.
	// * Supported fields/values for inspect jobs:
	//     - `state` - PENDING|RUNNING|CANCELED|FINISHED|FAILED
	//     - `inspected_storage` - DATASTORE|CLOUD_STORAGE|BIGQUERY
	//     - `trigger_name` - The resource name of the trigger that created job.
	//     - 'end_time` - Corresponds to time the job finished.
	//     - 'start_time` - Corresponds to time the job finished.
	// * Supported fields for risk analysis jobs:
	//     - `state` - RUNNING|CANCELED|FINISHED|FAILED
	//     - 'end_time` - Corresponds to time the job finished.
	//     - 'start_time` - Corresponds to time the job finished.
	// * The operator must be `=` or `!=`.
	//
	// Examples:
	//
	// * inspected_storage = cloud_storage AND state = done
	// * inspected_storage = cloud_storage OR inspected_storage = bigquery
	// * inspected_storage = cloud_storage AND (state = done OR state = canceled)
	// * end_time > \"2017-12-12T00:00:00+00:00\"
	//
	// The length of this field should be no more than 500 characters.
	Filter string `protobuf:"bytes,1,opt,name=filter,proto3" json:"filter,omitempty"`
	// The standard list page size.
	PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// The standard list page token.
	PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// The type of job. Defaults to `DlpJobType.INSPECT`
	Type DlpJobType `protobuf:"varint,5,opt,name=type,proto3,enum=google.privacy.dlp.v2.DlpJobType" json:"type,omitempty"`
	// Comma separated list of fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc, end_time asc, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the job was created.
	// - `end_time`: corresponds to time the job ended.
	// - `name`: corresponds to job's name.
	// - `state`: corresponds to `state`
	OrderBy string `protobuf:"bytes,6,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	// The geographic location where jobs will be retrieved from.
	// Use `-` for all locations. Reserved for future extensions.
	LocationId           string   `protobuf:"bytes,7,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListDlpJobsRequest) Reset()         { *m = ListDlpJobsRequest{} }
func (m *ListDlpJobsRequest) String() string { return proto.CompactTextString(m) }
func (*ListDlpJobsRequest) ProtoMessage()    {}
func (*ListDlpJobsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{90}
}

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

var xxx_messageInfo_ListDlpJobsRequest proto.InternalMessageInfo

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

func (m *ListDlpJobsRequest) GetFilter() string {
	if m != nil {
		return m.Filter
	}
	return ""
}

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

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

func (m *ListDlpJobsRequest) GetType() DlpJobType {
	if m != nil {
		return m.Type
	}
	return DlpJobType_DLP_JOB_TYPE_UNSPECIFIED
}

func (m *ListDlpJobsRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

func (m *ListDlpJobsRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// The response message for listing DLP jobs.
type ListDlpJobsResponse struct {
	// A list of DlpJobs that matches the specified filter in the request.
	Jobs []*DlpJob `protobuf:"bytes,1,rep,name=jobs,proto3" json:"jobs,omitempty"`
	// The standard List next-page token.
	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 *ListDlpJobsResponse) Reset()         { *m = ListDlpJobsResponse{} }
func (m *ListDlpJobsResponse) String() string { return proto.CompactTextString(m) }
func (*ListDlpJobsResponse) ProtoMessage()    {}
func (*ListDlpJobsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{91}
}

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

var xxx_messageInfo_ListDlpJobsResponse proto.InternalMessageInfo

func (m *ListDlpJobsResponse) GetJobs() []*DlpJob {
	if m != nil {
		return m.Jobs
	}
	return nil
}

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

// The request message for canceling a DLP job.
type CancelDlpJobRequest struct {
	// Required. The name of the DlpJob resource to be cancelled.
	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 *CancelDlpJobRequest) Reset()         { *m = CancelDlpJobRequest{} }
func (m *CancelDlpJobRequest) String() string { return proto.CompactTextString(m) }
func (*CancelDlpJobRequest) ProtoMessage()    {}
func (*CancelDlpJobRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{92}
}

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

var xxx_messageInfo_CancelDlpJobRequest proto.InternalMessageInfo

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

// The request message for deleting a DLP job.
type DeleteDlpJobRequest struct {
	// Required. The name of the DlpJob resource to be deleted.
	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 *DeleteDlpJobRequest) Reset()         { *m = DeleteDlpJobRequest{} }
func (m *DeleteDlpJobRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteDlpJobRequest) ProtoMessage()    {}
func (*DeleteDlpJobRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{93}
}

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

var xxx_messageInfo_DeleteDlpJobRequest proto.InternalMessageInfo

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

// Request message for CreateDeidentifyTemplate.
type CreateDeidentifyTemplateRequest struct {
	// Required. The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. The DeidentifyTemplate to create.
	DeidentifyTemplate *DeidentifyTemplate `protobuf:"bytes,2,opt,name=deidentify_template,json=deidentifyTemplate,proto3" json:"deidentify_template,omitempty"`
	// The template id can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	TemplateId string `protobuf:"bytes,3,opt,name=template_id,json=templateId,proto3" json:"template_id,omitempty"`
	// The geographic location to store the deidentification template. Reserved
	// for future extensions.
	LocationId           string   `protobuf:"bytes,4,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateDeidentifyTemplateRequest) Reset()         { *m = CreateDeidentifyTemplateRequest{} }
func (m *CreateDeidentifyTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*CreateDeidentifyTemplateRequest) ProtoMessage()    {}
func (*CreateDeidentifyTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{94}
}

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

var xxx_messageInfo_CreateDeidentifyTemplateRequest proto.InternalMessageInfo

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

func (m *CreateDeidentifyTemplateRequest) GetDeidentifyTemplate() *DeidentifyTemplate {
	if m != nil {
		return m.DeidentifyTemplate
	}
	return nil
}

func (m *CreateDeidentifyTemplateRequest) GetTemplateId() string {
	if m != nil {
		return m.TemplateId
	}
	return ""
}

func (m *CreateDeidentifyTemplateRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Request message for UpdateDeidentifyTemplate.
type UpdateDeidentifyTemplateRequest struct {
	// Required. Resource name of organization and deidentify template to be updated, for
	// example `organizations/433245324/deidentifyTemplates/432452342` or
	// projects/project-id/deidentifyTemplates/432452342.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// New DeidentifyTemplate value.
	DeidentifyTemplate *DeidentifyTemplate `protobuf:"bytes,2,opt,name=deidentify_template,json=deidentifyTemplate,proto3" json:"deidentify_template,omitempty"`
	// Mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,3,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 *UpdateDeidentifyTemplateRequest) Reset()         { *m = UpdateDeidentifyTemplateRequest{} }
func (m *UpdateDeidentifyTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateDeidentifyTemplateRequest) ProtoMessage()    {}
func (*UpdateDeidentifyTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{95}
}

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

var xxx_messageInfo_UpdateDeidentifyTemplateRequest proto.InternalMessageInfo

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

func (m *UpdateDeidentifyTemplateRequest) GetDeidentifyTemplate() *DeidentifyTemplate {
	if m != nil {
		return m.DeidentifyTemplate
	}
	return nil
}

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

// Request message for GetDeidentifyTemplate.
type GetDeidentifyTemplateRequest struct {
	// Required. Resource name of the organization and deidentify template to be read, for
	// example `organizations/433245324/deidentifyTemplates/432452342` or
	// projects/project-id/deidentifyTemplates/432452342.
	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 *GetDeidentifyTemplateRequest) Reset()         { *m = GetDeidentifyTemplateRequest{} }
func (m *GetDeidentifyTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*GetDeidentifyTemplateRequest) ProtoMessage()    {}
func (*GetDeidentifyTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{96}
}

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

var xxx_messageInfo_GetDeidentifyTemplateRequest proto.InternalMessageInfo

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

// Request message for ListDeidentifyTemplates.
type ListDeidentifyTemplatesRequest struct {
	// Required. The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Page token to continue retrieval. Comes from previous call
	// to `ListDeidentifyTemplates`.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Size of the page, can be limited by server. If zero server returns
	// a page of max size 100.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Comma separated list of fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc,update_time, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the template was created.
	// - `update_time`: corresponds to time the template was last updated.
	// - `name`: corresponds to template's name.
	// - `display_name`: corresponds to template's display name.
	OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	// The geographic location where deidentifications templates will be retrieved
	// from. Use `-` for all locations. Reserved for future extensions.
	LocationId           string   `protobuf:"bytes,5,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListDeidentifyTemplatesRequest) Reset()         { *m = ListDeidentifyTemplatesRequest{} }
func (m *ListDeidentifyTemplatesRequest) String() string { return proto.CompactTextString(m) }
func (*ListDeidentifyTemplatesRequest) ProtoMessage()    {}
func (*ListDeidentifyTemplatesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{97}
}

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

var xxx_messageInfo_ListDeidentifyTemplatesRequest proto.InternalMessageInfo

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

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

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

func (m *ListDeidentifyTemplatesRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

func (m *ListDeidentifyTemplatesRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Response message for ListDeidentifyTemplates.
type ListDeidentifyTemplatesResponse struct {
	// List of deidentify templates, up to page_size in
	// ListDeidentifyTemplatesRequest.
	DeidentifyTemplates []*DeidentifyTemplate `protobuf:"bytes,1,rep,name=deidentify_templates,json=deidentifyTemplates,proto3" json:"deidentify_templates,omitempty"`
	// If the next page is available then the next page token to be used
	// in following ListDeidentifyTemplates request.
	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 *ListDeidentifyTemplatesResponse) Reset()         { *m = ListDeidentifyTemplatesResponse{} }
func (m *ListDeidentifyTemplatesResponse) String() string { return proto.CompactTextString(m) }
func (*ListDeidentifyTemplatesResponse) ProtoMessage()    {}
func (*ListDeidentifyTemplatesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{98}
}

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

var xxx_messageInfo_ListDeidentifyTemplatesResponse proto.InternalMessageInfo

func (m *ListDeidentifyTemplatesResponse) GetDeidentifyTemplates() []*DeidentifyTemplate {
	if m != nil {
		return m.DeidentifyTemplates
	}
	return nil
}

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

// Request message for DeleteDeidentifyTemplate.
type DeleteDeidentifyTemplateRequest struct {
	// Required. Resource name of the organization and deidentify template to be deleted,
	// for example `organizations/433245324/deidentifyTemplates/432452342` or
	// projects/project-id/deidentifyTemplates/432452342.
	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 *DeleteDeidentifyTemplateRequest) Reset()         { *m = DeleteDeidentifyTemplateRequest{} }
func (m *DeleteDeidentifyTemplateRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteDeidentifyTemplateRequest) ProtoMessage()    {}
func (*DeleteDeidentifyTemplateRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{99}
}

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

var xxx_messageInfo_DeleteDeidentifyTemplateRequest proto.InternalMessageInfo

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

// Configuration for a custom dictionary created from a data source of any size
// up to the maximum size defined in the
// [limits](https://cloud.google.com/dlp/limits) page. The artifacts of
// dictionary creation are stored in the specified Google Cloud Storage
// location. Consider using `CustomInfoType.Dictionary` for smaller dictionaries
// that satisfy the size requirements.
type LargeCustomDictionaryConfig struct {
	// Location to store dictionary artifacts in Google Cloud Storage. These files
	// will only be accessible by project owners and the DLP API. If any of these
	// artifacts are modified, the dictionary is considered invalid and can no
	// longer be used.
	OutputPath *CloudStoragePath `protobuf:"bytes,1,opt,name=output_path,json=outputPath,proto3" json:"output_path,omitempty"`
	// Types that are valid to be assigned to Source:
	//	*LargeCustomDictionaryConfig_CloudStorageFileSet
	//	*LargeCustomDictionaryConfig_BigQueryField
	Source               isLargeCustomDictionaryConfig_Source `protobuf_oneof:"source"`
	XXX_NoUnkeyedLiteral struct{}                             `json:"-"`
	XXX_unrecognized     []byte                               `json:"-"`
	XXX_sizecache        int32                                `json:"-"`
}

func (m *LargeCustomDictionaryConfig) Reset()         { *m = LargeCustomDictionaryConfig{} }
func (m *LargeCustomDictionaryConfig) String() string { return proto.CompactTextString(m) }
func (*LargeCustomDictionaryConfig) ProtoMessage()    {}
func (*LargeCustomDictionaryConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{100}
}

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

var xxx_messageInfo_LargeCustomDictionaryConfig proto.InternalMessageInfo

func (m *LargeCustomDictionaryConfig) GetOutputPath() *CloudStoragePath {
	if m != nil {
		return m.OutputPath
	}
	return nil
}

type isLargeCustomDictionaryConfig_Source interface {
	isLargeCustomDictionaryConfig_Source()
}

type LargeCustomDictionaryConfig_CloudStorageFileSet struct {
	CloudStorageFileSet *CloudStorageFileSet `protobuf:"bytes,2,opt,name=cloud_storage_file_set,json=cloudStorageFileSet,proto3,oneof"`
}

type LargeCustomDictionaryConfig_BigQueryField struct {
	BigQueryField *BigQueryField `protobuf:"bytes,3,opt,name=big_query_field,json=bigQueryField,proto3,oneof"`
}

func (*LargeCustomDictionaryConfig_CloudStorageFileSet) isLargeCustomDictionaryConfig_Source() {}

func (*LargeCustomDictionaryConfig_BigQueryField) isLargeCustomDictionaryConfig_Source() {}

func (m *LargeCustomDictionaryConfig) GetSource() isLargeCustomDictionaryConfig_Source {
	if m != nil {
		return m.Source
	}
	return nil
}

func (m *LargeCustomDictionaryConfig) GetCloudStorageFileSet() *CloudStorageFileSet {
	if x, ok := m.GetSource().(*LargeCustomDictionaryConfig_CloudStorageFileSet); ok {
		return x.CloudStorageFileSet
	}
	return nil
}

func (m *LargeCustomDictionaryConfig) GetBigQueryField() *BigQueryField {
	if x, ok := m.GetSource().(*LargeCustomDictionaryConfig_BigQueryField); ok {
		return x.BigQueryField
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*LargeCustomDictionaryConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*LargeCustomDictionaryConfig_CloudStorageFileSet)(nil),
		(*LargeCustomDictionaryConfig_BigQueryField)(nil),
	}
}

// Summary statistics of a custom dictionary.
type LargeCustomDictionaryStats struct {
	// Approximate number of distinct phrases in the dictionary.
	ApproxNumPhrases     int64    `protobuf:"varint,1,opt,name=approx_num_phrases,json=approxNumPhrases,proto3" json:"approx_num_phrases,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LargeCustomDictionaryStats) Reset()         { *m = LargeCustomDictionaryStats{} }
func (m *LargeCustomDictionaryStats) String() string { return proto.CompactTextString(m) }
func (*LargeCustomDictionaryStats) ProtoMessage()    {}
func (*LargeCustomDictionaryStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{101}
}

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

var xxx_messageInfo_LargeCustomDictionaryStats proto.InternalMessageInfo

func (m *LargeCustomDictionaryStats) GetApproxNumPhrases() int64 {
	if m != nil {
		return m.ApproxNumPhrases
	}
	return 0
}

// Configuration for stored infoTypes. All fields and subfield are provided
// by the user. For more information, see
// https://cloud.google.com/dlp/docs/creating-custom-infotypes.
type StoredInfoTypeConfig struct {
	// Display name of the StoredInfoType (max 256 characters).
	DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Description of the StoredInfoType (max 256 characters).
	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
	// Stored infotype types.
	//
	// Types that are valid to be assigned to Type:
	//	*StoredInfoTypeConfig_LargeCustomDictionary
	Type                 isStoredInfoTypeConfig_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *StoredInfoTypeConfig) Reset()         { *m = StoredInfoTypeConfig{} }
func (m *StoredInfoTypeConfig) String() string { return proto.CompactTextString(m) }
func (*StoredInfoTypeConfig) ProtoMessage()    {}
func (*StoredInfoTypeConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{102}
}

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

var xxx_messageInfo_StoredInfoTypeConfig proto.InternalMessageInfo

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

func (m *StoredInfoTypeConfig) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

type isStoredInfoTypeConfig_Type interface {
	isStoredInfoTypeConfig_Type()
}

type StoredInfoTypeConfig_LargeCustomDictionary struct {
	LargeCustomDictionary *LargeCustomDictionaryConfig `protobuf:"bytes,3,opt,name=large_custom_dictionary,json=largeCustomDictionary,proto3,oneof"`
}

func (*StoredInfoTypeConfig_LargeCustomDictionary) isStoredInfoTypeConfig_Type() {}

func (m *StoredInfoTypeConfig) GetType() isStoredInfoTypeConfig_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *StoredInfoTypeConfig) GetLargeCustomDictionary() *LargeCustomDictionaryConfig {
	if x, ok := m.GetType().(*StoredInfoTypeConfig_LargeCustomDictionary); ok {
		return x.LargeCustomDictionary
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*StoredInfoTypeConfig) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*StoredInfoTypeConfig_LargeCustomDictionary)(nil),
	}
}

// Statistics for a StoredInfoType.
type StoredInfoTypeStats struct {
	// Stat types
	//
	// Types that are valid to be assigned to Type:
	//	*StoredInfoTypeStats_LargeCustomDictionary
	Type                 isStoredInfoTypeStats_Type `protobuf_oneof:"type"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *StoredInfoTypeStats) Reset()         { *m = StoredInfoTypeStats{} }
func (m *StoredInfoTypeStats) String() string { return proto.CompactTextString(m) }
func (*StoredInfoTypeStats) ProtoMessage()    {}
func (*StoredInfoTypeStats) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{103}
}

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

var xxx_messageInfo_StoredInfoTypeStats proto.InternalMessageInfo

type isStoredInfoTypeStats_Type interface {
	isStoredInfoTypeStats_Type()
}

type StoredInfoTypeStats_LargeCustomDictionary struct {
	LargeCustomDictionary *LargeCustomDictionaryStats `protobuf:"bytes,1,opt,name=large_custom_dictionary,json=largeCustomDictionary,proto3,oneof"`
}

func (*StoredInfoTypeStats_LargeCustomDictionary) isStoredInfoTypeStats_Type() {}

func (m *StoredInfoTypeStats) GetType() isStoredInfoTypeStats_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (m *StoredInfoTypeStats) GetLargeCustomDictionary() *LargeCustomDictionaryStats {
	if x, ok := m.GetType().(*StoredInfoTypeStats_LargeCustomDictionary); ok {
		return x.LargeCustomDictionary
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*StoredInfoTypeStats) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*StoredInfoTypeStats_LargeCustomDictionary)(nil),
	}
}

// Version of a StoredInfoType, including the configuration used to build it,
// create timestamp, and current state.
type StoredInfoTypeVersion struct {
	// StoredInfoType configuration.
	Config *StoredInfoTypeConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	// Create timestamp of the version. Read-only, determined by the system
	// when the version is created.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Stored info type version state. Read-only, updated by the system
	// during dictionary creation.
	State StoredInfoTypeState `protobuf:"varint,3,opt,name=state,proto3,enum=google.privacy.dlp.v2.StoredInfoTypeState" json:"state,omitempty"`
	// Errors that occurred when creating this storedInfoType version, or
	// anomalies detected in the storedInfoType data that render it unusable. Only
	// the five most recent errors will be displayed, with the most recent error
	// appearing first.
	//
	// For example, some of the data for stored custom dictionaries is put in
	// the user's Google Cloud Storage bucket, and if this data is modified or
	// deleted by the user or another system, the dictionary becomes invalid.
	//
	// If any errors occur, fix the problem indicated by the error message and
	// use the UpdateStoredInfoType API method to create another version of the
	// storedInfoType to continue using it, reusing the same `config` if it was
	// not the source of the error.
	Errors []*Error `protobuf:"bytes,4,rep,name=errors,proto3" json:"errors,omitempty"`
	// Statistics about this storedInfoType version.
	Stats                *StoredInfoTypeStats `protobuf:"bytes,5,opt,name=stats,proto3" json:"stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *StoredInfoTypeVersion) Reset()         { *m = StoredInfoTypeVersion{} }
func (m *StoredInfoTypeVersion) String() string { return proto.CompactTextString(m) }
func (*StoredInfoTypeVersion) ProtoMessage()    {}
func (*StoredInfoTypeVersion) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{104}
}

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

var xxx_messageInfo_StoredInfoTypeVersion proto.InternalMessageInfo

func (m *StoredInfoTypeVersion) GetConfig() *StoredInfoTypeConfig {
	if m != nil {
		return m.Config
	}
	return nil
}

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

func (m *StoredInfoTypeVersion) GetState() StoredInfoTypeState {
	if m != nil {
		return m.State
	}
	return StoredInfoTypeState_STORED_INFO_TYPE_STATE_UNSPECIFIED
}

func (m *StoredInfoTypeVersion) GetErrors() []*Error {
	if m != nil {
		return m.Errors
	}
	return nil
}

func (m *StoredInfoTypeVersion) GetStats() *StoredInfoTypeStats {
	if m != nil {
		return m.Stats
	}
	return nil
}

// StoredInfoType resource message that contains information about the current
// version and any pending updates.
type StoredInfoType struct {
	// Resource name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Current version of the stored info type.
	CurrentVersion *StoredInfoTypeVersion `protobuf:"bytes,2,opt,name=current_version,json=currentVersion,proto3" json:"current_version,omitempty"`
	// Pending versions of the stored info type. Empty if no versions are
	// pending.
	PendingVersions      []*StoredInfoTypeVersion `protobuf:"bytes,3,rep,name=pending_versions,json=pendingVersions,proto3" json:"pending_versions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *StoredInfoType) Reset()         { *m = StoredInfoType{} }
func (m *StoredInfoType) String() string { return proto.CompactTextString(m) }
func (*StoredInfoType) ProtoMessage()    {}
func (*StoredInfoType) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{105}
}

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

var xxx_messageInfo_StoredInfoType proto.InternalMessageInfo

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

func (m *StoredInfoType) GetCurrentVersion() *StoredInfoTypeVersion {
	if m != nil {
		return m.CurrentVersion
	}
	return nil
}

func (m *StoredInfoType) GetPendingVersions() []*StoredInfoTypeVersion {
	if m != nil {
		return m.PendingVersions
	}
	return nil
}

// Request message for CreateStoredInfoType.
type CreateStoredInfoTypeRequest struct {
	// Required. The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Required. Configuration of the storedInfoType to create.
	Config *StoredInfoTypeConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
	// The storedInfoType ID can contain uppercase and lowercase letters,
	// numbers, and hyphens; that is, it must match the regular
	// expression: `[a-zA-Z\\d-_]+`. The maximum length is 100
	// characters. Can be empty to allow the system to generate one.
	StoredInfoTypeId string `protobuf:"bytes,3,opt,name=stored_info_type_id,json=storedInfoTypeId,proto3" json:"stored_info_type_id,omitempty"`
	// The geographic location to store the stored infoType. Reserved for
	// future extensions.
	LocationId           string   `protobuf:"bytes,4,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CreateStoredInfoTypeRequest) Reset()         { *m = CreateStoredInfoTypeRequest{} }
func (m *CreateStoredInfoTypeRequest) String() string { return proto.CompactTextString(m) }
func (*CreateStoredInfoTypeRequest) ProtoMessage()    {}
func (*CreateStoredInfoTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{106}
}

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

var xxx_messageInfo_CreateStoredInfoTypeRequest proto.InternalMessageInfo

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

func (m *CreateStoredInfoTypeRequest) GetConfig() *StoredInfoTypeConfig {
	if m != nil {
		return m.Config
	}
	return nil
}

func (m *CreateStoredInfoTypeRequest) GetStoredInfoTypeId() string {
	if m != nil {
		return m.StoredInfoTypeId
	}
	return ""
}

func (m *CreateStoredInfoTypeRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Request message for UpdateStoredInfoType.
type UpdateStoredInfoTypeRequest struct {
	// Required. Resource name of organization and storedInfoType to be updated, for
	// example `organizations/433245324/storedInfoTypes/432452342` or
	// projects/project-id/storedInfoTypes/432452342.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Updated configuration for the storedInfoType. If not provided, a new
	// version of the storedInfoType will be created with the existing
	// configuration.
	Config *StoredInfoTypeConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
	// Mask to control which fields get updated.
	UpdateMask           *field_mask.FieldMask `protobuf:"bytes,3,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 *UpdateStoredInfoTypeRequest) Reset()         { *m = UpdateStoredInfoTypeRequest{} }
func (m *UpdateStoredInfoTypeRequest) String() string { return proto.CompactTextString(m) }
func (*UpdateStoredInfoTypeRequest) ProtoMessage()    {}
func (*UpdateStoredInfoTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{107}
}

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

var xxx_messageInfo_UpdateStoredInfoTypeRequest proto.InternalMessageInfo

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

func (m *UpdateStoredInfoTypeRequest) GetConfig() *StoredInfoTypeConfig {
	if m != nil {
		return m.Config
	}
	return nil
}

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

// Request message for GetStoredInfoType.
type GetStoredInfoTypeRequest struct {
	// Required. Resource name of the organization and storedInfoType to be read, for
	// example `organizations/433245324/storedInfoTypes/432452342` or
	// projects/project-id/storedInfoTypes/432452342.
	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 *GetStoredInfoTypeRequest) Reset()         { *m = GetStoredInfoTypeRequest{} }
func (m *GetStoredInfoTypeRequest) String() string { return proto.CompactTextString(m) }
func (*GetStoredInfoTypeRequest) ProtoMessage()    {}
func (*GetStoredInfoTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{108}
}

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

var xxx_messageInfo_GetStoredInfoTypeRequest proto.InternalMessageInfo

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

// Request message for ListStoredInfoTypes.
type ListStoredInfoTypesRequest struct {
	// Required. The parent resource name, for example projects/my-project-id or
	// organizations/my-org-id.
	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
	// Page token to continue retrieval. Comes from previous call
	// to `ListStoredInfoTypes`.
	PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"`
	// Size of the page, can be limited by server. If zero server returns
	// a page of max size 100.
	PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"`
	// Comma separated list of fields to order by,
	// followed by `asc` or `desc` postfix. This list is case-insensitive,
	// default sorting order is ascending, redundant space characters are
	// insignificant.
	//
	// Example: `name asc, display_name, create_time desc`
	//
	// Supported fields are:
	//
	// - `create_time`: corresponds to time the most recent version of the
	// resource was created.
	// - `state`: corresponds to the state of the resource.
	// - `name`: corresponds to resource name.
	// - `display_name`: corresponds to info type's display name.
	OrderBy string `protobuf:"bytes,4,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
	// The geographic location where stored infoTypes will be retrieved from.
	// Use `-` for all locations. Reserved for future extensions.
	LocationId           string   `protobuf:"bytes,5,opt,name=location_id,json=locationId,proto3" json:"location_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ListStoredInfoTypesRequest) Reset()         { *m = ListStoredInfoTypesRequest{} }
func (m *ListStoredInfoTypesRequest) String() string { return proto.CompactTextString(m) }
func (*ListStoredInfoTypesRequest) ProtoMessage()    {}
func (*ListStoredInfoTypesRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{109}
}

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

var xxx_messageInfo_ListStoredInfoTypesRequest proto.InternalMessageInfo

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

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

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

func (m *ListStoredInfoTypesRequest) GetOrderBy() string {
	if m != nil {
		return m.OrderBy
	}
	return ""
}

func (m *ListStoredInfoTypesRequest) GetLocationId() string {
	if m != nil {
		return m.LocationId
	}
	return ""
}

// Response message for ListStoredInfoTypes.
type ListStoredInfoTypesResponse struct {
	// List of storedInfoTypes, up to page_size in ListStoredInfoTypesRequest.
	StoredInfoTypes []*StoredInfoType `protobuf:"bytes,1,rep,name=stored_info_types,json=storedInfoTypes,proto3" json:"stored_info_types,omitempty"`
	// If the next page is available then the next page token to be used
	// in following ListStoredInfoTypes request.
	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 *ListStoredInfoTypesResponse) Reset()         { *m = ListStoredInfoTypesResponse{} }
func (m *ListStoredInfoTypesResponse) String() string { return proto.CompactTextString(m) }
func (*ListStoredInfoTypesResponse) ProtoMessage()    {}
func (*ListStoredInfoTypesResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{110}
}

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

var xxx_messageInfo_ListStoredInfoTypesResponse proto.InternalMessageInfo

func (m *ListStoredInfoTypesResponse) GetStoredInfoTypes() []*StoredInfoType {
	if m != nil {
		return m.StoredInfoTypes
	}
	return nil
}

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

// Request message for DeleteStoredInfoType.
type DeleteStoredInfoTypeRequest struct {
	// Required. Resource name of the organization and storedInfoType to be deleted, for
	// example `organizations/433245324/storedInfoTypes/432452342` or
	// projects/project-id/storedInfoTypes/432452342.
	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 *DeleteStoredInfoTypeRequest) Reset()         { *m = DeleteStoredInfoTypeRequest{} }
func (m *DeleteStoredInfoTypeRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteStoredInfoTypeRequest) ProtoMessage()    {}
func (*DeleteStoredInfoTypeRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6872a91dcb80f8dc, []int{111}
}

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

var xxx_messageInfo_DeleteStoredInfoTypeRequest proto.InternalMessageInfo

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

func init() {
	proto.RegisterEnum("google.privacy.dlp.v2.RelationalOperator", RelationalOperator_name, RelationalOperator_value)
	proto.RegisterEnum("google.privacy.dlp.v2.MatchingType", MatchingType_name, MatchingType_value)
	proto.RegisterEnum("google.privacy.dlp.v2.ContentOption", ContentOption_name, ContentOption_value)
	proto.RegisterEnum("google.privacy.dlp.v2.InfoTypeSupportedBy", InfoTypeSupportedBy_name, InfoTypeSupportedBy_value)
	proto.RegisterEnum("google.privacy.dlp.v2.DlpJobType", DlpJobType_name, DlpJobType_value)
	proto.RegisterEnum("google.privacy.dlp.v2.StoredInfoTypeState", StoredInfoTypeState_name, StoredInfoTypeState_value)
	proto.RegisterEnum("google.privacy.dlp.v2.ByteContentItem_BytesType", ByteContentItem_BytesType_name, ByteContentItem_BytesType_value)
	proto.RegisterEnum("google.privacy.dlp.v2.OutputStorageConfig_OutputSchema", OutputStorageConfig_OutputSchema_name, OutputStorageConfig_OutputSchema_value)
	proto.RegisterEnum("google.privacy.dlp.v2.TimePartConfig_TimePart", TimePartConfig_TimePart_name, TimePartConfig_TimePart_value)
	proto.RegisterEnum("google.privacy.dlp.v2.CharsToIgnore_CommonCharsToIgnore", CharsToIgnore_CommonCharsToIgnore_name, CharsToIgnore_CommonCharsToIgnore_value)
	proto.RegisterEnum("google.privacy.dlp.v2.CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet", CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_name, CryptoReplaceFfxFpeConfig_FfxCommonNativeAlphabet_value)
	proto.RegisterEnum("google.privacy.dlp.v2.RecordCondition_Expressions_LogicalOperator", RecordCondition_Expressions_LogicalOperator_name, RecordCondition_Expressions_LogicalOperator_value)
	proto.RegisterEnum("google.privacy.dlp.v2.TransformationSummary_TransformationResultCode", TransformationSummary_TransformationResultCode_name, TransformationSummary_TransformationResultCode_value)
	proto.RegisterEnum("google.privacy.dlp.v2.JobTrigger_Status", JobTrigger_Status_name, JobTrigger_Status_value)
	proto.RegisterEnum("google.privacy.dlp.v2.DlpJob_JobState", DlpJob_JobState_name, DlpJob_JobState_value)
	proto.RegisterType((*ExcludeInfoTypes)(nil), "google.privacy.dlp.v2.ExcludeInfoTypes")
	proto.RegisterType((*ExclusionRule)(nil), "google.privacy.dlp.v2.ExclusionRule")
	proto.RegisterType((*InspectionRule)(nil), "google.privacy.dlp.v2.InspectionRule")
	proto.RegisterType((*InspectionRuleSet)(nil), "google.privacy.dlp.v2.InspectionRuleSet")
	proto.RegisterType((*InspectConfig)(nil), "google.privacy.dlp.v2.InspectConfig")
	proto.RegisterType((*InspectConfig_FindingLimits)(nil), "google.privacy.dlp.v2.InspectConfig.FindingLimits")
	proto.RegisterType((*InspectConfig_FindingLimits_InfoTypeLimit)(nil), "google.privacy.dlp.v2.InspectConfig.FindingLimits.InfoTypeLimit")
	proto.RegisterType((*ByteContentItem)(nil), "google.privacy.dlp.v2.ByteContentItem")
	proto.RegisterType((*ContentItem)(nil), "google.privacy.dlp.v2.ContentItem")
	proto.RegisterType((*Table)(nil), "google.privacy.dlp.v2.Table")
	proto.RegisterType((*Table_Row)(nil), "google.privacy.dlp.v2.Table.Row")
	proto.RegisterType((*InspectResult)(nil), "google.privacy.dlp.v2.InspectResult")
	proto.RegisterType((*Finding)(nil), "google.privacy.dlp.v2.Finding")
	proto.RegisterType((*Location)(nil), "google.privacy.dlp.v2.Location")
	proto.RegisterType((*ContentLocation)(nil), "google.privacy.dlp.v2.ContentLocation")
	proto.RegisterType((*DocumentLocation)(nil), "google.privacy.dlp.v2.DocumentLocation")
	proto.RegisterType((*RecordLocation)(nil), "google.privacy.dlp.v2.RecordLocation")
	proto.RegisterType((*TableLocation)(nil), "google.privacy.dlp.v2.TableLocation")
	proto.RegisterType((*Range)(nil), "google.privacy.dlp.v2.Range")
	proto.RegisterType((*ImageLocation)(nil), "google.privacy.dlp.v2.ImageLocation")
	proto.RegisterType((*BoundingBox)(nil), "google.privacy.dlp.v2.BoundingBox")
	proto.RegisterType((*RedactImageRequest)(nil), "google.privacy.dlp.v2.RedactImageRequest")
	proto.RegisterType((*RedactImageRequest_ImageRedactionConfig)(nil), "google.privacy.dlp.v2.RedactImageRequest.ImageRedactionConfig")
	proto.RegisterType((*Color)(nil), "google.privacy.dlp.v2.Color")
	proto.RegisterType((*RedactImageResponse)(nil), "google.privacy.dlp.v2.RedactImageResponse")
	proto.RegisterType((*DeidentifyContentRequest)(nil), "google.privacy.dlp.v2.DeidentifyContentRequest")
	proto.RegisterType((*DeidentifyContentResponse)(nil), "google.privacy.dlp.v2.DeidentifyContentResponse")
	proto.RegisterType((*ReidentifyContentRequest)(nil), "google.privacy.dlp.v2.ReidentifyContentRequest")
	proto.RegisterType((*ReidentifyContentResponse)(nil), "google.privacy.dlp.v2.ReidentifyContentResponse")
	proto.RegisterType((*InspectContentRequest)(nil), "google.privacy.dlp.v2.InspectContentRequest")
	proto.RegisterType((*InspectContentResponse)(nil), "google.privacy.dlp.v2.InspectContentResponse")
	proto.RegisterType((*OutputStorageConfig)(nil), "google.privacy.dlp.v2.OutputStorageConfig")
	proto.RegisterType((*InfoTypeStats)(nil), "google.privacy.dlp.v2.InfoTypeStats")
	proto.RegisterType((*InspectDataSourceDetails)(nil), "google.privacy.dlp.v2.InspectDataSourceDetails")
	proto.RegisterType((*InspectDataSourceDetails_RequestedOptions)(nil), "google.privacy.dlp.v2.InspectDataSourceDetails.RequestedOptions")
	proto.RegisterType((*InspectDataSourceDetails_Result)(nil), "google.privacy.dlp.v2.InspectDataSourceDetails.Result")
	proto.RegisterType((*InfoTypeDescription)(nil), "google.privacy.dlp.v2.InfoTypeDescription")
	proto.RegisterType((*ListInfoTypesRequest)(nil), "google.privacy.dlp.v2.ListInfoTypesRequest")
	proto.RegisterType((*ListInfoTypesResponse)(nil), "google.privacy.dlp.v2.ListInfoTypesResponse")
	proto.RegisterType((*RiskAnalysisJobConfig)(nil), "google.privacy.dlp.v2.RiskAnalysisJobConfig")
	proto.RegisterType((*QuasiId)(nil), "google.privacy.dlp.v2.QuasiId")
	proto.RegisterType((*StatisticalTable)(nil), "google.privacy.dlp.v2.StatisticalTable")
	proto.RegisterType((*StatisticalTable_QuasiIdentifierField)(nil), "google.privacy.dlp.v2.StatisticalTable.QuasiIdentifierField")
	proto.RegisterType((*PrivacyMetric)(nil), "google.privacy.dlp.v2.PrivacyMetric")
	proto.RegisterType((*PrivacyMetric_NumericalStatsConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.NumericalStatsConfig")
	proto.RegisterType((*PrivacyMetric_CategoricalStatsConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.CategoricalStatsConfig")
	proto.RegisterType((*PrivacyMetric_KAnonymityConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.KAnonymityConfig")
	proto.RegisterType((*PrivacyMetric_LDiversityConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.LDiversityConfig")
	proto.RegisterType((*PrivacyMetric_KMapEstimationConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.KMapEstimationConfig")
	proto.RegisterType((*PrivacyMetric_KMapEstimationConfig_TaggedField)(nil), "google.privacy.dlp.v2.PrivacyMetric.KMapEstimationConfig.TaggedField")
	proto.RegisterType((*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable)(nil), "google.privacy.dlp.v2.PrivacyMetric.KMapEstimationConfig.AuxiliaryTable")
	proto.RegisterType((*PrivacyMetric_KMapEstimationConfig_AuxiliaryTable_QuasiIdField)(nil), "google.privacy.dlp.v2.PrivacyMetric.KMapEstimationConfig.AuxiliaryTable.QuasiIdField")
	proto.RegisterType((*PrivacyMetric_DeltaPresenceEstimationConfig)(nil), "google.privacy.dlp.v2.PrivacyMetric.DeltaPresenceEstimationConfig")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_NumericalStatsResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.NumericalStatsResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_CategoricalStatsResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.CategoricalStatsResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_CategoricalStatsResult_CategoricalStatsHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.CategoricalStatsResult.CategoricalStatsHistogramBucket")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KAnonymityResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KAnonymityResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityEquivalenceClass)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KAnonymityResult.KAnonymityEquivalenceClass")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KAnonymityResult_KAnonymityHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KAnonymityResult.KAnonymityHistogramBucket")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_LDiversityResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.LDiversityResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityEquivalenceClass)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.LDiversityResult.LDiversityEquivalenceClass")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_LDiversityResult_LDiversityHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.LDiversityResult.LDiversityHistogramBucket")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KMapEstimationResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KMapEstimationResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationQuasiIdValues)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KMapEstimationResult.KMapEstimationQuasiIdValues")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_KMapEstimationResult_KMapEstimationHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.KMapEstimationResult.KMapEstimationHistogramBucket")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.DeltaPresenceEstimationResult")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationQuasiIdValues)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.DeltaPresenceEstimationResult.DeltaPresenceEstimationQuasiIdValues")
	proto.RegisterType((*AnalyzeDataSourceRiskDetails_DeltaPresenceEstimationResult_DeltaPresenceEstimationHistogramBucket)(nil), "google.privacy.dlp.v2.AnalyzeDataSourceRiskDetails.DeltaPresenceEstimationResult.DeltaPresenceEstimationHistogramBucket")
	proto.RegisterType((*ValueFrequency)(nil), "google.privacy.dlp.v2.ValueFrequency")
	proto.RegisterType((*Value)(nil), "google.privacy.dlp.v2.Value")
	proto.RegisterType((*QuoteInfo)(nil), "google.privacy.dlp.v2.QuoteInfo")
	proto.RegisterType((*DateTime)(nil), "google.privacy.dlp.v2.DateTime")
	proto.RegisterType((*DateTime_TimeZone)(nil), "google.privacy.dlp.v2.DateTime.TimeZone")
	proto.RegisterType((*DeidentifyConfig)(nil), "google.privacy.dlp.v2.DeidentifyConfig")
	proto.RegisterType((*PrimitiveTransformation)(nil), "google.privacy.dlp.v2.PrimitiveTransformation")
	proto.RegisterType((*TimePartConfig)(nil), "google.privacy.dlp.v2.TimePartConfig")
	proto.RegisterType((*CryptoHashConfig)(nil), "google.privacy.dlp.v2.CryptoHashConfig")
	proto.RegisterType((*CryptoDeterministicConfig)(nil), "google.privacy.dlp.v2.CryptoDeterministicConfig")
	proto.RegisterType((*ReplaceValueConfig)(nil), "google.privacy.dlp.v2.ReplaceValueConfig")
	proto.RegisterType((*ReplaceWithInfoTypeConfig)(nil), "google.privacy.dlp.v2.ReplaceWithInfoTypeConfig")
	proto.RegisterType((*RedactConfig)(nil), "google.privacy.dlp.v2.RedactConfig")
	proto.RegisterType((*CharsToIgnore)(nil), "google.privacy.dlp.v2.CharsToIgnore")
	proto.RegisterType((*CharacterMaskConfig)(nil), "google.privacy.dlp.v2.CharacterMaskConfig")
	proto.RegisterType((*FixedSizeBucketingConfig)(nil), "google.privacy.dlp.v2.FixedSizeBucketingConfig")
	proto.RegisterType((*BucketingConfig)(nil), "google.privacy.dlp.v2.BucketingConfig")
	proto.RegisterType((*BucketingConfig_Bucket)(nil), "google.privacy.dlp.v2.BucketingConfig.Bucket")
	proto.RegisterType((*CryptoReplaceFfxFpeConfig)(nil), "google.privacy.dlp.v2.CryptoReplaceFfxFpeConfig")
	proto.RegisterType((*CryptoKey)(nil), "google.privacy.dlp.v2.CryptoKey")
	proto.RegisterType((*TransientCryptoKey)(nil), "google.privacy.dlp.v2.TransientCryptoKey")
	proto.RegisterType((*UnwrappedCryptoKey)(nil), "google.privacy.dlp.v2.UnwrappedCryptoKey")
	proto.RegisterType((*KmsWrappedCryptoKey)(nil), "google.privacy.dlp.v2.KmsWrappedCryptoKey")
	proto.RegisterType((*DateShiftConfig)(nil), "google.privacy.dlp.v2.DateShiftConfig")
	proto.RegisterType((*InfoTypeTransformations)(nil), "google.privacy.dlp.v2.InfoTypeTransformations")
	proto.RegisterType((*InfoTypeTransformations_InfoTypeTransformation)(nil), "google.privacy.dlp.v2.InfoTypeTransformations.InfoTypeTransformation")
	proto.RegisterType((*FieldTransformation)(nil), "google.privacy.dlp.v2.FieldTransformation")
	proto.RegisterType((*RecordTransformations)(nil), "google.privacy.dlp.v2.RecordTransformations")
	proto.RegisterType((*RecordSuppression)(nil), "google.privacy.dlp.v2.RecordSuppression")
	proto.RegisterType((*RecordCondition)(nil), "google.privacy.dlp.v2.RecordCondition")
	proto.RegisterType((*RecordCondition_Condition)(nil), "google.privacy.dlp.v2.RecordCondition.Condition")
	proto.RegisterType((*RecordCondition_Conditions)(nil), "google.privacy.dlp.v2.RecordCondition.Conditions")
	proto.RegisterType((*RecordCondition_Expressions)(nil), "google.privacy.dlp.v2.RecordCondition.Expressions")
	proto.RegisterType((*TransformationOverview)(nil), "google.privacy.dlp.v2.TransformationOverview")
	proto.RegisterType((*TransformationSummary)(nil), "google.privacy.dlp.v2.TransformationSummary")
	proto.RegisterType((*TransformationSummary_SummaryResult)(nil), "google.privacy.dlp.v2.TransformationSummary.SummaryResult")
	proto.RegisterType((*Schedule)(nil), "google.privacy.dlp.v2.Schedule")
	proto.RegisterType((*InspectTemplate)(nil), "google.privacy.dlp.v2.InspectTemplate")
	proto.RegisterType((*DeidentifyTemplate)(nil), "google.privacy.dlp.v2.DeidentifyTemplate")
	proto.RegisterType((*Error)(nil), "google.privacy.dlp.v2.Error")
	proto.RegisterType((*JobTrigger)(nil), "google.privacy.dlp.v2.JobTrigger")
	proto.RegisterType((*JobTrigger_Trigger)(nil), "google.privacy.dlp.v2.JobTrigger.Trigger")
	proto.RegisterType((*Action)(nil), "google.privacy.dlp.v2.Action")
	proto.RegisterType((*Action_SaveFindings)(nil), "google.privacy.dlp.v2.Action.SaveFindings")
	proto.RegisterType((*Action_PublishToPubSub)(nil), "google.privacy.dlp.v2.Action.PublishToPubSub")
	proto.RegisterType((*Action_PublishSummaryToCscc)(nil), "google.privacy.dlp.v2.Action.PublishSummaryToCscc")
	proto.RegisterType((*Action_PublishFindingsToCloudDataCatalog)(nil), "google.privacy.dlp.v2.Action.PublishFindingsToCloudDataCatalog")
	proto.RegisterType((*Action_JobNotificationEmails)(nil), "google.privacy.dlp.v2.Action.JobNotificationEmails")
	proto.RegisterType((*Action_PublishToStackdriver)(nil), "google.privacy.dlp.v2.Action.PublishToStackdriver")
	proto.RegisterType((*CreateInspectTemplateRequest)(nil), "google.privacy.dlp.v2.CreateInspectTemplateRequest")
	proto.RegisterType((*UpdateInspectTemplateRequest)(nil), "google.privacy.dlp.v2.UpdateInspectTemplateRequest")
	proto.RegisterType((*GetInspectTemplateRequest)(nil), "google.privacy.dlp.v2.GetInspectTemplateRequest")
	proto.RegisterType((*ListInspectTemplatesRequest)(nil), "google.privacy.dlp.v2.ListInspectTemplatesRequest")
	proto.RegisterType((*ListInspectTemplatesResponse)(nil), "google.privacy.dlp.v2.ListInspectTemplatesResponse")
	proto.RegisterType((*DeleteInspectTemplateRequest)(nil), "google.privacy.dlp.v2.DeleteInspectTemplateRequest")
	proto.RegisterType((*CreateJobTriggerRequest)(nil), "google.privacy.dlp.v2.CreateJobTriggerRequest")
	proto.RegisterType((*ActivateJobTriggerRequest)(nil), "google.privacy.dlp.v2.ActivateJobTriggerRequest")
	proto.RegisterType((*UpdateJobTriggerRequest)(nil), "google.privacy.dlp.v2.UpdateJobTriggerRequest")
	proto.RegisterType((*GetJobTriggerRequest)(nil), "google.privacy.dlp.v2.GetJobTriggerRequest")
	proto.RegisterType((*CreateDlpJobRequest)(nil), "google.privacy.dlp.v2.CreateDlpJobRequest")
	proto.RegisterType((*ListJobTriggersRequest)(nil), "google.privacy.dlp.v2.ListJobTriggersRequest")
	proto.RegisterType((*ListJobTriggersResponse)(nil), "google.privacy.dlp.v2.ListJobTriggersResponse")
	proto.RegisterType((*DeleteJobTriggerRequest)(nil), "google.privacy.dlp.v2.DeleteJobTriggerRequest")
	proto.RegisterType((*InspectJobConfig)(nil), "google.privacy.dlp.v2.InspectJobConfig")
	proto.RegisterType((*DlpJob)(nil), "google.privacy.dlp.v2.DlpJob")
	proto.RegisterType((*GetDlpJobRequest)(nil), "google.privacy.dlp.v2.GetDlpJobRequest")
	proto.RegisterType((*ListDlpJobsRequest)(nil), "google.privacy.dlp.v2.ListDlpJobsRequest")
	proto.RegisterType((*ListDlpJobsResponse)(nil), "google.privacy.dlp.v2.ListDlpJobsResponse")
	proto.RegisterType((*CancelDlpJobRequest)(nil), "google.privacy.dlp.v2.CancelDlpJobRequest")
	proto.RegisterType((*DeleteDlpJobRequest)(nil), "google.privacy.dlp.v2.DeleteDlpJobRequest")
	proto.RegisterType((*CreateDeidentifyTemplateRequest)(nil), "google.privacy.dlp.v2.CreateDeidentifyTemplateRequest")
	proto.RegisterType((*UpdateDeidentifyTemplateRequest)(nil), "google.privacy.dlp.v2.UpdateDeidentifyTemplateRequest")
	proto.RegisterType((*GetDeidentifyTemplateRequest)(nil), "google.privacy.dlp.v2.GetDeidentifyTemplateRequest")
	proto.RegisterType((*ListDeidentifyTemplatesRequest)(nil), "google.privacy.dlp.v2.ListDeidentifyTemplatesRequest")
	proto.RegisterType((*ListDeidentifyTemplatesResponse)(nil), "google.privacy.dlp.v2.ListDeidentifyTemplatesResponse")
	proto.RegisterType((*DeleteDeidentifyTemplateRequest)(nil), "google.privacy.dlp.v2.DeleteDeidentifyTemplateRequest")
	proto.RegisterType((*LargeCustomDictionaryConfig)(nil), "google.privacy.dlp.v2.LargeCustomDictionaryConfig")
	proto.RegisterType((*LargeCustomDictionaryStats)(nil), "google.privacy.dlp.v2.LargeCustomDictionaryStats")
	proto.RegisterType((*StoredInfoTypeConfig)(nil), "google.privacy.dlp.v2.StoredInfoTypeConfig")
	proto.RegisterType((*StoredInfoTypeStats)(nil), "google.privacy.dlp.v2.StoredInfoTypeStats")
	proto.RegisterType((*StoredInfoTypeVersion)(nil), "google.privacy.dlp.v2.StoredInfoTypeVersion")
	proto.RegisterType((*StoredInfoType)(nil), "google.privacy.dlp.v2.StoredInfoType")
	proto.RegisterType((*CreateStoredInfoTypeRequest)(nil), "google.privacy.dlp.v2.CreateStoredInfoTypeRequest")
	proto.RegisterType((*UpdateStoredInfoTypeRequest)(nil), "google.privacy.dlp.v2.UpdateStoredInfoTypeRequest")
	proto.RegisterType((*GetStoredInfoTypeRequest)(nil), "google.privacy.dlp.v2.GetStoredInfoTypeRequest")
	proto.RegisterType((*ListStoredInfoTypesRequest)(nil), "google.privacy.dlp.v2.ListStoredInfoTypesRequest")
	proto.RegisterType((*ListStoredInfoTypesResponse)(nil), "google.privacy.dlp.v2.ListStoredInfoTypesResponse")
	proto.RegisterType((*DeleteStoredInfoTypeRequest)(nil), "google.privacy.dlp.v2.DeleteStoredInfoTypeRequest")
}

func init() {
	proto.RegisterFile("google/privacy/dlp/v2/dlp.proto", fileDescriptor_6872a91dcb80f8dc)
}

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

// DlpServiceClient is the client API for DlpService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type DlpServiceClient interface {
	// Finds potentially sensitive info in content.
	// This method has limits on input size, processing time, and output size.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	//
	// For how to guides, see https://cloud.google.com/dlp/docs/inspecting-images
	// and https://cloud.google.com/dlp/docs/inspecting-text,
	InspectContent(ctx context.Context, in *InspectContentRequest, opts ...grpc.CallOption) (*InspectContentResponse, error)
	// Redacts potentially sensitive info from an image.
	// This method has limits on input size, processing time, and output size.
	// See https://cloud.google.com/dlp/docs/redacting-sensitive-data-images to
	// learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	RedactImage(ctx context.Context, in *RedactImageRequest, opts ...grpc.CallOption) (*RedactImageResponse, error)
	// De-identifies potentially sensitive info from a ContentItem.
	// This method has limits on input size and output size.
	// See https://cloud.google.com/dlp/docs/deidentify-sensitive-data to
	// learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	DeidentifyContent(ctx context.Context, in *DeidentifyContentRequest, opts ...grpc.CallOption) (*DeidentifyContentResponse, error)
	// Re-identifies content that has been de-identified.
	// See
	// https://cloud.google.com/dlp/docs/pseudonymization#re-identification_in_free_text_code_example
	// to learn more.
	ReidentifyContent(ctx context.Context, in *ReidentifyContentRequest, opts ...grpc.CallOption) (*ReidentifyContentResponse, error)
	// Returns a list of the sensitive information types that the DLP API
	// supports. See https://cloud.google.com/dlp/docs/infotypes-reference to
	// learn more.
	ListInfoTypes(ctx context.Context, in *ListInfoTypesRequest, opts ...grpc.CallOption) (*ListInfoTypesResponse, error)
	// Creates an InspectTemplate for re-using frequently used configuration
	// for inspecting content, images, and storage.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	CreateInspectTemplate(ctx context.Context, in *CreateInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error)
	// Updates the InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	UpdateInspectTemplate(ctx context.Context, in *UpdateInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error)
	// Gets an InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	GetInspectTemplate(ctx context.Context, in *GetInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error)
	// Lists InspectTemplates.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	ListInspectTemplates(ctx context.Context, in *ListInspectTemplatesRequest, opts ...grpc.CallOption) (*ListInspectTemplatesResponse, error)
	// Deletes an InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	DeleteInspectTemplate(ctx context.Context, in *DeleteInspectTemplateRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Creates a DeidentifyTemplate for re-using frequently used configuration
	// for de-identifying content, images, and storage.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	CreateDeidentifyTemplate(ctx context.Context, in *CreateDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error)
	// Updates the DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	UpdateDeidentifyTemplate(ctx context.Context, in *UpdateDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error)
	// Gets a DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	GetDeidentifyTemplate(ctx context.Context, in *GetDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error)
	// Lists DeidentifyTemplates.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	ListDeidentifyTemplates(ctx context.Context, in *ListDeidentifyTemplatesRequest, opts ...grpc.CallOption) (*ListDeidentifyTemplatesResponse, error)
	// Deletes a DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	DeleteDeidentifyTemplate(ctx context.Context, in *DeleteDeidentifyTemplateRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Creates a job trigger to run DLP actions such as scanning storage for
	// sensitive information on a set schedule.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	CreateJobTrigger(ctx context.Context, in *CreateJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error)
	// Updates a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	UpdateJobTrigger(ctx context.Context, in *UpdateJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error)
	// Gets a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	GetJobTrigger(ctx context.Context, in *GetJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error)
	// Lists job triggers.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	ListJobTriggers(ctx context.Context, in *ListJobTriggersRequest, opts ...grpc.CallOption) (*ListJobTriggersResponse, error)
	// Deletes a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	DeleteJobTrigger(ctx context.Context, in *DeleteJobTriggerRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Activate a job trigger. Causes the immediate execute of a trigger
	// instead of waiting on the trigger event to occur.
	ActivateJobTrigger(ctx context.Context, in *ActivateJobTriggerRequest, opts ...grpc.CallOption) (*DlpJob, error)
	// Creates a new job to inspect storage or calculate risk metrics.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in inspect jobs, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	CreateDlpJob(ctx context.Context, in *CreateDlpJobRequest, opts ...grpc.CallOption) (*DlpJob, error)
	// Lists DlpJobs that match the specified filter in the request.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	ListDlpJobs(ctx context.Context, in *ListDlpJobsRequest, opts ...grpc.CallOption) (*ListDlpJobsResponse, error)
	// Gets the latest state of a long-running DlpJob.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	GetDlpJob(ctx context.Context, in *GetDlpJobRequest, opts ...grpc.CallOption) (*DlpJob, error)
	// Deletes a long-running DlpJob. This method indicates that the client is
	// no longer interested in the DlpJob result. The job will be cancelled if
	// possible.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	DeleteDlpJob(ctx context.Context, in *DeleteDlpJobRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Starts asynchronous cancellation on a long-running DlpJob. The server
	// makes a best effort to cancel the DlpJob, but success is not
	// guaranteed.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	CancelDlpJob(ctx context.Context, in *CancelDlpJobRequest, opts ...grpc.CallOption) (*empty.Empty, error)
	// Creates a pre-built stored infoType to be used for inspection.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	CreateStoredInfoType(ctx context.Context, in *CreateStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error)
	// Updates the stored infoType by creating a new version. The existing version
	// will continue to be used until the new version is ready.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	UpdateStoredInfoType(ctx context.Context, in *UpdateStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error)
	// Gets a stored infoType.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	GetStoredInfoType(ctx context.Context, in *GetStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error)
	// Lists stored infoTypes.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	ListStoredInfoTypes(ctx context.Context, in *ListStoredInfoTypesRequest, opts ...grpc.CallOption) (*ListStoredInfoTypesResponse, error)
	// Deletes a stored infoType.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	DeleteStoredInfoType(ctx context.Context, in *DeleteStoredInfoTypeRequest, opts ...grpc.CallOption) (*empty.Empty, error)
}

type dlpServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewDlpServiceClient(cc grpc.ClientConnInterface) DlpServiceClient {
	return &dlpServiceClient{cc}
}

func (c *dlpServiceClient) InspectContent(ctx context.Context, in *InspectContentRequest, opts ...grpc.CallOption) (*InspectContentResponse, error) {
	out := new(InspectContentResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/InspectContent", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) RedactImage(ctx context.Context, in *RedactImageRequest, opts ...grpc.CallOption) (*RedactImageResponse, error) {
	out := new(RedactImageResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/RedactImage", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeidentifyContent(ctx context.Context, in *DeidentifyContentRequest, opts ...grpc.CallOption) (*DeidentifyContentResponse, error) {
	out := new(DeidentifyContentResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeidentifyContent", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ReidentifyContent(ctx context.Context, in *ReidentifyContentRequest, opts ...grpc.CallOption) (*ReidentifyContentResponse, error) {
	out := new(ReidentifyContentResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ReidentifyContent", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListInfoTypes(ctx context.Context, in *ListInfoTypesRequest, opts ...grpc.CallOption) (*ListInfoTypesResponse, error) {
	out := new(ListInfoTypesResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListInfoTypes", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateInspectTemplate(ctx context.Context, in *CreateInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error) {
	out := new(InspectTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateInspectTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) UpdateInspectTemplate(ctx context.Context, in *UpdateInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error) {
	out := new(InspectTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/UpdateInspectTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetInspectTemplate(ctx context.Context, in *GetInspectTemplateRequest, opts ...grpc.CallOption) (*InspectTemplate, error) {
	out := new(InspectTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetInspectTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListInspectTemplates(ctx context.Context, in *ListInspectTemplatesRequest, opts ...grpc.CallOption) (*ListInspectTemplatesResponse, error) {
	out := new(ListInspectTemplatesResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListInspectTemplates", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteInspectTemplate(ctx context.Context, in *DeleteInspectTemplateRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteInspectTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateDeidentifyTemplate(ctx context.Context, in *CreateDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error) {
	out := new(DeidentifyTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateDeidentifyTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) UpdateDeidentifyTemplate(ctx context.Context, in *UpdateDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error) {
	out := new(DeidentifyTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/UpdateDeidentifyTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetDeidentifyTemplate(ctx context.Context, in *GetDeidentifyTemplateRequest, opts ...grpc.CallOption) (*DeidentifyTemplate, error) {
	out := new(DeidentifyTemplate)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetDeidentifyTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListDeidentifyTemplates(ctx context.Context, in *ListDeidentifyTemplatesRequest, opts ...grpc.CallOption) (*ListDeidentifyTemplatesResponse, error) {
	out := new(ListDeidentifyTemplatesResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListDeidentifyTemplates", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteDeidentifyTemplate(ctx context.Context, in *DeleteDeidentifyTemplateRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteDeidentifyTemplate", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateJobTrigger(ctx context.Context, in *CreateJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error) {
	out := new(JobTrigger)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) UpdateJobTrigger(ctx context.Context, in *UpdateJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error) {
	out := new(JobTrigger)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/UpdateJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetJobTrigger(ctx context.Context, in *GetJobTriggerRequest, opts ...grpc.CallOption) (*JobTrigger, error) {
	out := new(JobTrigger)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListJobTriggers(ctx context.Context, in *ListJobTriggersRequest, opts ...grpc.CallOption) (*ListJobTriggersResponse, error) {
	out := new(ListJobTriggersResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListJobTriggers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteJobTrigger(ctx context.Context, in *DeleteJobTriggerRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ActivateJobTrigger(ctx context.Context, in *ActivateJobTriggerRequest, opts ...grpc.CallOption) (*DlpJob, error) {
	out := new(DlpJob)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ActivateJobTrigger", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateDlpJob(ctx context.Context, in *CreateDlpJobRequest, opts ...grpc.CallOption) (*DlpJob, error) {
	out := new(DlpJob)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateDlpJob", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListDlpJobs(ctx context.Context, in *ListDlpJobsRequest, opts ...grpc.CallOption) (*ListDlpJobsResponse, error) {
	out := new(ListDlpJobsResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListDlpJobs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetDlpJob(ctx context.Context, in *GetDlpJobRequest, opts ...grpc.CallOption) (*DlpJob, error) {
	out := new(DlpJob)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetDlpJob", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteDlpJob(ctx context.Context, in *DeleteDlpJobRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteDlpJob", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CancelDlpJob(ctx context.Context, in *CancelDlpJobRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CancelDlpJob", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) CreateStoredInfoType(ctx context.Context, in *CreateStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error) {
	out := new(StoredInfoType)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/CreateStoredInfoType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) UpdateStoredInfoType(ctx context.Context, in *UpdateStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error) {
	out := new(StoredInfoType)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/UpdateStoredInfoType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) GetStoredInfoType(ctx context.Context, in *GetStoredInfoTypeRequest, opts ...grpc.CallOption) (*StoredInfoType, error) {
	out := new(StoredInfoType)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/GetStoredInfoType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) ListStoredInfoTypes(ctx context.Context, in *ListStoredInfoTypesRequest, opts ...grpc.CallOption) (*ListStoredInfoTypesResponse, error) {
	out := new(ListStoredInfoTypesResponse)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/ListStoredInfoTypes", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *dlpServiceClient) DeleteStoredInfoType(ctx context.Context, in *DeleteStoredInfoTypeRequest, opts ...grpc.CallOption) (*empty.Empty, error) {
	out := new(empty.Empty)
	err := c.cc.Invoke(ctx, "/google.privacy.dlp.v2.DlpService/DeleteStoredInfoType", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// DlpServiceServer is the server API for DlpService service.
type DlpServiceServer interface {
	// Finds potentially sensitive info in content.
	// This method has limits on input size, processing time, and output size.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	//
	// For how to guides, see https://cloud.google.com/dlp/docs/inspecting-images
	// and https://cloud.google.com/dlp/docs/inspecting-text,
	InspectContent(context.Context, *InspectContentRequest) (*InspectContentResponse, error)
	// Redacts potentially sensitive info from an image.
	// This method has limits on input size, processing time, and output size.
	// See https://cloud.google.com/dlp/docs/redacting-sensitive-data-images to
	// learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	RedactImage(context.Context, *RedactImageRequest) (*RedactImageResponse, error)
	// De-identifies potentially sensitive info from a ContentItem.
	// This method has limits on input size and output size.
	// See https://cloud.google.com/dlp/docs/deidentify-sensitive-data to
	// learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in this request, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	DeidentifyContent(context.Context, *DeidentifyContentRequest) (*DeidentifyContentResponse, error)
	// Re-identifies content that has been de-identified.
	// See
	// https://cloud.google.com/dlp/docs/pseudonymization#re-identification_in_free_text_code_example
	// to learn more.
	ReidentifyContent(context.Context, *ReidentifyContentRequest) (*ReidentifyContentResponse, error)
	// Returns a list of the sensitive information types that the DLP API
	// supports. See https://cloud.google.com/dlp/docs/infotypes-reference to
	// learn more.
	ListInfoTypes(context.Context, *ListInfoTypesRequest) (*ListInfoTypesResponse, error)
	// Creates an InspectTemplate for re-using frequently used configuration
	// for inspecting content, images, and storage.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	CreateInspectTemplate(context.Context, *CreateInspectTemplateRequest) (*InspectTemplate, error)
	// Updates the InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	UpdateInspectTemplate(context.Context, *UpdateInspectTemplateRequest) (*InspectTemplate, error)
	// Gets an InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	GetInspectTemplate(context.Context, *GetInspectTemplateRequest) (*InspectTemplate, error)
	// Lists InspectTemplates.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	ListInspectTemplates(context.Context, *ListInspectTemplatesRequest) (*ListInspectTemplatesResponse, error)
	// Deletes an InspectTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates to learn more.
	DeleteInspectTemplate(context.Context, *DeleteInspectTemplateRequest) (*empty.Empty, error)
	// Creates a DeidentifyTemplate for re-using frequently used configuration
	// for de-identifying content, images, and storage.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	CreateDeidentifyTemplate(context.Context, *CreateDeidentifyTemplateRequest) (*DeidentifyTemplate, error)
	// Updates the DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	UpdateDeidentifyTemplate(context.Context, *UpdateDeidentifyTemplateRequest) (*DeidentifyTemplate, error)
	// Gets a DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	GetDeidentifyTemplate(context.Context, *GetDeidentifyTemplateRequest) (*DeidentifyTemplate, error)
	// Lists DeidentifyTemplates.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	ListDeidentifyTemplates(context.Context, *ListDeidentifyTemplatesRequest) (*ListDeidentifyTemplatesResponse, error)
	// Deletes a DeidentifyTemplate.
	// See https://cloud.google.com/dlp/docs/creating-templates-deid to learn
	// more.
	DeleteDeidentifyTemplate(context.Context, *DeleteDeidentifyTemplateRequest) (*empty.Empty, error)
	// Creates a job trigger to run DLP actions such as scanning storage for
	// sensitive information on a set schedule.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	CreateJobTrigger(context.Context, *CreateJobTriggerRequest) (*JobTrigger, error)
	// Updates a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	UpdateJobTrigger(context.Context, *UpdateJobTriggerRequest) (*JobTrigger, error)
	// Gets a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	GetJobTrigger(context.Context, *GetJobTriggerRequest) (*JobTrigger, error)
	// Lists job triggers.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	ListJobTriggers(context.Context, *ListJobTriggersRequest) (*ListJobTriggersResponse, error)
	// Deletes a job trigger.
	// See https://cloud.google.com/dlp/docs/creating-job-triggers to learn more.
	DeleteJobTrigger(context.Context, *DeleteJobTriggerRequest) (*empty.Empty, error)
	// Activate a job trigger. Causes the immediate execute of a trigger
	// instead of waiting on the trigger event to occur.
	ActivateJobTrigger(context.Context, *ActivateJobTriggerRequest) (*DlpJob, error)
	// Creates a new job to inspect storage or calculate risk metrics.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	//
	// When no InfoTypes or CustomInfoTypes are specified in inspect jobs, the
	// system will automatically choose what detectors to run. By default this may
	// be all types, but may change over time as detectors are updated.
	CreateDlpJob(context.Context, *CreateDlpJobRequest) (*DlpJob, error)
	// Lists DlpJobs that match the specified filter in the request.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	ListDlpJobs(context.Context, *ListDlpJobsRequest) (*ListDlpJobsResponse, error)
	// Gets the latest state of a long-running DlpJob.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	GetDlpJob(context.Context, *GetDlpJobRequest) (*DlpJob, error)
	// Deletes a long-running DlpJob. This method indicates that the client is
	// no longer interested in the DlpJob result. The job will be cancelled if
	// possible.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	DeleteDlpJob(context.Context, *DeleteDlpJobRequest) (*empty.Empty, error)
	// Starts asynchronous cancellation on a long-running DlpJob. The server
	// makes a best effort to cancel the DlpJob, but success is not
	// guaranteed.
	// See https://cloud.google.com/dlp/docs/inspecting-storage and
	// https://cloud.google.com/dlp/docs/compute-risk-analysis to learn more.
	CancelDlpJob(context.Context, *CancelDlpJobRequest) (*empty.Empty, error)
	// Creates a pre-built stored infoType to be used for inspection.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	CreateStoredInfoType(context.Context, *CreateStoredInfoTypeRequest) (*StoredInfoType, error)
	// Updates the stored infoType by creating a new version. The existing version
	// will continue to be used until the new version is ready.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	UpdateStoredInfoType(context.Context, *UpdateStoredInfoTypeRequest) (*StoredInfoType, error)
	// Gets a stored infoType.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	GetStoredInfoType(context.Context, *GetStoredInfoTypeRequest) (*StoredInfoType, error)
	// Lists stored infoTypes.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	ListStoredInfoTypes(context.Context, *ListStoredInfoTypesRequest) (*ListStoredInfoTypesResponse, error)
	// Deletes a stored infoType.
	// See https://cloud.google.com/dlp/docs/creating-stored-infotypes to
	// learn more.
	DeleteStoredInfoType(context.Context, *DeleteStoredInfoTypeRequest) (*empty.Empty, error)
}

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

func (*UnimplementedDlpServiceServer) InspectContent(ctx context.Context, req *InspectContentRequest) (*InspectContentResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method InspectContent not implemented")
}
func (*UnimplementedDlpServiceServer) RedactImage(ctx context.Context, req *RedactImageRequest) (*RedactImageResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method RedactImage not implemented")
}
func (*UnimplementedDlpServiceServer) DeidentifyContent(ctx context.Context, req *DeidentifyContentRequest) (*DeidentifyContentResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeidentifyContent not implemented")
}
func (*UnimplementedDlpServiceServer) ReidentifyContent(ctx context.Context, req *ReidentifyContentRequest) (*ReidentifyContentResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ReidentifyContent not implemented")
}
func (*UnimplementedDlpServiceServer) ListInfoTypes(ctx context.Context, req *ListInfoTypesRequest) (*ListInfoTypesResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListInfoTypes not implemented")
}
func (*UnimplementedDlpServiceServer) CreateInspectTemplate(ctx context.Context, req *CreateInspectTemplateRequest) (*InspectTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateInspectTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) UpdateInspectTemplate(ctx context.Context, req *UpdateInspectTemplateRequest) (*InspectTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method UpdateInspectTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) GetInspectTemplate(ctx context.Context, req *GetInspectTemplateRequest) (*InspectTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetInspectTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) ListInspectTemplates(ctx context.Context, req *ListInspectTemplatesRequest) (*ListInspectTemplatesResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListInspectTemplates not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteInspectTemplate(ctx context.Context, req *DeleteInspectTemplateRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteInspectTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) CreateDeidentifyTemplate(ctx context.Context, req *CreateDeidentifyTemplateRequest) (*DeidentifyTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateDeidentifyTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) UpdateDeidentifyTemplate(ctx context.Context, req *UpdateDeidentifyTemplateRequest) (*DeidentifyTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method UpdateDeidentifyTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) GetDeidentifyTemplate(ctx context.Context, req *GetDeidentifyTemplateRequest) (*DeidentifyTemplate, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetDeidentifyTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) ListDeidentifyTemplates(ctx context.Context, req *ListDeidentifyTemplatesRequest) (*ListDeidentifyTemplatesResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListDeidentifyTemplates not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteDeidentifyTemplate(ctx context.Context, req *DeleteDeidentifyTemplateRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteDeidentifyTemplate not implemented")
}
func (*UnimplementedDlpServiceServer) CreateJobTrigger(ctx context.Context, req *CreateJobTriggerRequest) (*JobTrigger, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) UpdateJobTrigger(ctx context.Context, req *UpdateJobTriggerRequest) (*JobTrigger, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method UpdateJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) GetJobTrigger(ctx context.Context, req *GetJobTriggerRequest) (*JobTrigger, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) ListJobTriggers(ctx context.Context, req *ListJobTriggersRequest) (*ListJobTriggersResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListJobTriggers not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteJobTrigger(ctx context.Context, req *DeleteJobTriggerRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) ActivateJobTrigger(ctx context.Context, req *ActivateJobTriggerRequest) (*DlpJob, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ActivateJobTrigger not implemented")
}
func (*UnimplementedDlpServiceServer) CreateDlpJob(ctx context.Context, req *CreateDlpJobRequest) (*DlpJob, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateDlpJob not implemented")
}
func (*UnimplementedDlpServiceServer) ListDlpJobs(ctx context.Context, req *ListDlpJobsRequest) (*ListDlpJobsResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListDlpJobs not implemented")
}
func (*UnimplementedDlpServiceServer) GetDlpJob(ctx context.Context, req *GetDlpJobRequest) (*DlpJob, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetDlpJob not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteDlpJob(ctx context.Context, req *DeleteDlpJobRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteDlpJob not implemented")
}
func (*UnimplementedDlpServiceServer) CancelDlpJob(ctx context.Context, req *CancelDlpJobRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CancelDlpJob not implemented")
}
func (*UnimplementedDlpServiceServer) CreateStoredInfoType(ctx context.Context, req *CreateStoredInfoTypeRequest) (*StoredInfoType, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method CreateStoredInfoType not implemented")
}
func (*UnimplementedDlpServiceServer) UpdateStoredInfoType(ctx context.Context, req *UpdateStoredInfoTypeRequest) (*StoredInfoType, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method UpdateStoredInfoType not implemented")
}
func (*UnimplementedDlpServiceServer) GetStoredInfoType(ctx context.Context, req *GetStoredInfoTypeRequest) (*StoredInfoType, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method GetStoredInfoType not implemented")
}
func (*UnimplementedDlpServiceServer) ListStoredInfoTypes(ctx context.Context, req *ListStoredInfoTypesRequest) (*ListStoredInfoTypesResponse, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method ListStoredInfoTypes not implemented")
}
func (*UnimplementedDlpServiceServer) DeleteStoredInfoType(ctx context.Context, req *DeleteStoredInfoTypeRequest) (*empty.Empty, error) {
	return nil, status1.Errorf(codes.Unimplemented, "method DeleteStoredInfoType not implemented")
}

func RegisterDlpServiceServer(s *grpc.Server, srv DlpServiceServer) {
	s.RegisterService(&_DlpService_serviceDesc, srv)
}

func _DlpService_InspectContent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(InspectContentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).InspectContent(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/InspectContent",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).InspectContent(ctx, req.(*InspectContentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_RedactImage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(RedactImageRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).RedactImage(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/RedactImage",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).RedactImage(ctx, req.(*RedactImageRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeidentifyContent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeidentifyContentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeidentifyContent(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeidentifyContent",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeidentifyContent(ctx, req.(*DeidentifyContentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ReidentifyContent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ReidentifyContentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ReidentifyContent(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ReidentifyContent",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ReidentifyContent(ctx, req.(*ReidentifyContentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListInfoTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListInfoTypesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListInfoTypes(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListInfoTypes",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListInfoTypes(ctx, req.(*ListInfoTypesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateInspectTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateInspectTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateInspectTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateInspectTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateInspectTemplate(ctx, req.(*CreateInspectTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_UpdateInspectTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateInspectTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).UpdateInspectTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/UpdateInspectTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).UpdateInspectTemplate(ctx, req.(*UpdateInspectTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetInspectTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetInspectTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetInspectTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetInspectTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetInspectTemplate(ctx, req.(*GetInspectTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListInspectTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListInspectTemplatesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListInspectTemplates(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListInspectTemplates",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListInspectTemplates(ctx, req.(*ListInspectTemplatesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteInspectTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteInspectTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteInspectTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteInspectTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteInspectTemplate(ctx, req.(*DeleteInspectTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateDeidentifyTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateDeidentifyTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateDeidentifyTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateDeidentifyTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateDeidentifyTemplate(ctx, req.(*CreateDeidentifyTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_UpdateDeidentifyTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateDeidentifyTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).UpdateDeidentifyTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/UpdateDeidentifyTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).UpdateDeidentifyTemplate(ctx, req.(*UpdateDeidentifyTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetDeidentifyTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetDeidentifyTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetDeidentifyTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetDeidentifyTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetDeidentifyTemplate(ctx, req.(*GetDeidentifyTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListDeidentifyTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListDeidentifyTemplatesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListDeidentifyTemplates(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListDeidentifyTemplates",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListDeidentifyTemplates(ctx, req.(*ListDeidentifyTemplatesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteDeidentifyTemplate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteDeidentifyTemplateRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteDeidentifyTemplate(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteDeidentifyTemplate",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteDeidentifyTemplate(ctx, req.(*DeleteDeidentifyTemplateRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateJobTrigger(ctx, req.(*CreateJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_UpdateJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).UpdateJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/UpdateJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).UpdateJobTrigger(ctx, req.(*UpdateJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetJobTrigger(ctx, req.(*GetJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListJobTriggers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListJobTriggersRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListJobTriggers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListJobTriggers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListJobTriggers(ctx, req.(*ListJobTriggersRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteJobTrigger(ctx, req.(*DeleteJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ActivateJobTrigger_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ActivateJobTriggerRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ActivateJobTrigger(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ActivateJobTrigger",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ActivateJobTrigger(ctx, req.(*ActivateJobTriggerRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateDlpJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateDlpJobRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateDlpJob(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateDlpJob",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateDlpJob(ctx, req.(*CreateDlpJobRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListDlpJobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListDlpJobsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListDlpJobs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListDlpJobs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListDlpJobs(ctx, req.(*ListDlpJobsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetDlpJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetDlpJobRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetDlpJob(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetDlpJob",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetDlpJob(ctx, req.(*GetDlpJobRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteDlpJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteDlpJobRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteDlpJob(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteDlpJob",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteDlpJob(ctx, req.(*DeleteDlpJobRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CancelDlpJob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CancelDlpJobRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CancelDlpJob(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CancelDlpJob",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CancelDlpJob(ctx, req.(*CancelDlpJobRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_CreateStoredInfoType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CreateStoredInfoTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).CreateStoredInfoType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/CreateStoredInfoType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).CreateStoredInfoType(ctx, req.(*CreateStoredInfoTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_UpdateStoredInfoType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UpdateStoredInfoTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).UpdateStoredInfoType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/UpdateStoredInfoType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).UpdateStoredInfoType(ctx, req.(*UpdateStoredInfoTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_GetStoredInfoType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetStoredInfoTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).GetStoredInfoType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/GetStoredInfoType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).GetStoredInfoType(ctx, req.(*GetStoredInfoTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_ListStoredInfoTypes_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ListStoredInfoTypesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).ListStoredInfoTypes(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/ListStoredInfoTypes",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).ListStoredInfoTypes(ctx, req.(*ListStoredInfoTypesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _DlpService_DeleteStoredInfoType_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DeleteStoredInfoTypeRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(DlpServiceServer).DeleteStoredInfoType(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.privacy.dlp.v2.DlpService/DeleteStoredInfoType",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(DlpServiceServer).DeleteStoredInfoType(ctx, req.(*DeleteStoredInfoTypeRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _DlpService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.privacy.dlp.v2.DlpService",
	HandlerType: (*DlpServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "InspectContent",
			Handler:    _DlpService_InspectContent_Handler,
		},
		{
			MethodName: "RedactImage",
			Handler:    _DlpService_RedactImage_Handler,
		},
		{
			MethodName: "DeidentifyContent",
			Handler:    _DlpService_DeidentifyContent_Handler,
		},
		{
			MethodName: "ReidentifyContent",
			Handler:    _DlpService_ReidentifyContent_Handler,
		},
		{
			MethodName: "ListInfoTypes",
			Handler:    _DlpService_ListInfoTypes_Handler,
		},
		{
			MethodName: "CreateInspectTemplate",
			Handler:    _DlpService_CreateInspectTemplate_Handler,
		},
		{
			MethodName: "UpdateInspectTemplate",
			Handler:    _DlpService_UpdateInspectTemplate_Handler,
		},
		{
			MethodName: "GetInspectTemplate",
			Handler:    _DlpService_GetInspectTemplate_Handler,
		},
		{
			MethodName: "ListInspectTemplates",
			Handler:    _DlpService_ListInspectTemplates_Handler,
		},
		{
			MethodName: "DeleteInspectTemplate",
			Handler:    _DlpService_DeleteInspectTemplate_Handler,
		},
		{
			MethodName: "CreateDeidentifyTemplate",
			Handler:    _DlpService_CreateDeidentifyTemplate_Handler,
		},
		{
			MethodName: "UpdateDeidentifyTemplate",
			Handler:    _DlpService_UpdateDeidentifyTemplate_Handler,
		},
		{
			MethodName: "GetDeidentifyTemplate",
			Handler:    _DlpService_GetDeidentifyTemplate_Handler,
		},
		{
			MethodName: "ListDeidentifyTemplates",
			Handler:    _DlpService_ListDeidentifyTemplates_Handler,
		},
		{
			MethodName: "DeleteDeidentifyTemplate",
			Handler:    _DlpService_DeleteDeidentifyTemplate_Handler,
		},
		{
			MethodName: "CreateJobTrigger",
			Handler:    _DlpService_CreateJobTrigger_Handler,
		},
		{
			MethodName: "UpdateJobTrigger",
			Handler:    _DlpService_UpdateJobTrigger_Handler,
		},
		{
			MethodName: "GetJobTrigger",
			Handler:    _DlpService_GetJobTrigger_Handler,
		},
		{
			MethodName: "ListJobTriggers",
			Handler:    _DlpService_ListJobTriggers_Handler,
		},
		{
			MethodName: "DeleteJobTrigger",
			Handler:    _DlpService_DeleteJobTrigger_Handler,
		},
		{
			MethodName: "ActivateJobTrigger",
			Handler:    _DlpService_ActivateJobTrigger_Handler,
		},
		{
			MethodName: "CreateDlpJob",
			Handler:    _DlpService_CreateDlpJob_Handler,
		},
		{
			MethodName: "ListDlpJobs",
			Handler:    _DlpService_ListDlpJobs_Handler,
		},
		{
			MethodName: "GetDlpJob",
			Handler:    _DlpService_GetDlpJob_Handler,
		},
		{
			MethodName: "DeleteDlpJob",
			Handler:    _DlpService_DeleteDlpJob_Handler,
		},
		{
			MethodName: "CancelDlpJob",
			Handler:    _DlpService_CancelDlpJob_Handler,
		},
		{
			MethodName: "CreateStoredInfoType",
			Handler:    _DlpService_CreateStoredInfoType_Handler,
		},
		{
			MethodName: "UpdateStoredInfoType",
			Handler:    _DlpService_UpdateStoredInfoType_Handler,
		},
		{
			MethodName: "GetStoredInfoType",
			Handler:    _DlpService_GetStoredInfoType_Handler,
		},
		{
			MethodName: "ListStoredInfoTypes",
			Handler:    _DlpService_ListStoredInfoTypes_Handler,
		},
		{
			MethodName: "DeleteStoredInfoType",
			Handler:    _DlpService_DeleteStoredInfoType_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/privacy/dlp/v2/dlp.proto",
}
