// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.privacy.dlp.v2;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/privacy/dlp/v2/storage.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "google/rpc/status.proto";
import "google/type/date.proto";
import "google/type/dayofweek.proto";
import "google/type/timeofday.proto";

option csharp_namespace = "Google.Cloud.Dlp.V2";
option go_package = "cloud.google.com/go/dlp/apiv2/dlppb;dlppb";
option java_multiple_files = true;
option java_outer_classname = "DlpProto";
option java_package = "com.google.privacy.dlp.v2";
option php_namespace = "Google\\Cloud\\Dlp\\V2";
option ruby_package = "Google::Cloud::Dlp::V2";
option (google.api.resource_definition) = {
  type: "dlp.googleapis.com/DlpContent"
  pattern: "projects/{project}/dlpContent"
  pattern: "projects/{project}/locations/{location}/dlpContent"
};
option (google.api.resource_definition) = {
  type: "dlp.googleapis.com/OrganizationLocation"
  pattern: "organizations/{organization}/locations/{location}"
};

// The Cloud Data Loss Prevention (DLP) API is a service that allows clients
// to detect the presence of Personally Identifiable Information (PII) and other
// privacy-sensitive data in user-supplied, unstructured data streams, like text
// blocks or images.
// The service also includes methods for sensitive data redaction and
// scheduling of data scans on Google Cloud Platform based data sets.
//
// To learn more about concepts and find how-to guides see
// https://cloud.google.com/sensitive-data-protection/docs/.
service DlpService {
  option (google.api.default_host) = "dlp.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // 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/sensitive-data-protection/docs/inspecting-images
  // and
  // https://cloud.google.com/sensitive-data-protection/docs/inspecting-text,
  rpc InspectContent(InspectContentRequest) returns (InspectContentResponse) {
    option (google.api.http) = {
      post: "/v2/{parent=projects/*}/content:inspect"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/content:inspect"
        body: "*"
      }
    };
  }

  // Redacts potentially sensitive info from an image.
  // This method has limits on input size, processing time, and output size.
  // See
  // https://cloud.google.com/sensitive-data-protection/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.
  rpc RedactImage(RedactImageRequest) returns (RedactImageResponse) {
    option (google.api.http) = {
      post: "/v2/{parent=projects/*}/image:redact"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/image:redact"
        body: "*"
      }
    };
  }

  // De-identifies potentially sensitive info from a ContentItem.
  // This method has limits on input size and output size.
  // See
  // https://cloud.google.com/sensitive-data-protection/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.
  rpc DeidentifyContent(DeidentifyContentRequest)
      returns (DeidentifyContentResponse) {
    option (google.api.http) = {
      post: "/v2/{parent=projects/*}/content:deidentify"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/content:deidentify"
        body: "*"
      }
    };
  }

  // Re-identifies content that has been de-identified.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/pseudonymization#re-identification_in_free_text_code_example
  // to learn more.
  rpc ReidentifyContent(ReidentifyContentRequest)
      returns (ReidentifyContentResponse) {
    option (google.api.http) = {
      post: "/v2/{parent=projects/*}/content:reidentify"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/content:reidentify"
        body: "*"
      }
    };
  }

  // Returns a list of the sensitive information types that DLP API
  // supports. See
  // https://cloud.google.com/sensitive-data-protection/docs/infotypes-reference
  // to learn more.
  rpc ListInfoTypes(ListInfoTypesRequest) returns (ListInfoTypesResponse) {
    option (google.api.http) = {
      get: "/v2/infoTypes"
      additional_bindings { get: "/v2/{parent=locations/*}/infoTypes" }
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates an InspectTemplate for reusing frequently used configuration
  // for inspecting content, images, and storage.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates
  // to learn more.
  rpc CreateInspectTemplate(CreateInspectTemplateRequest)
      returns (InspectTemplate) {
    option (google.api.http) = {
      post: "/v2/{parent=organizations/*}/inspectTemplates"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=organizations/*/locations/*}/inspectTemplates"
        body: "*"
      }
      additional_bindings {
        post: "/v2/{parent=projects/*}/inspectTemplates"
        body: "*"
      }
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/inspectTemplates"
        body: "*"
      }
    };
    option (google.api.method_signature) = "parent,inspect_template";
  }

  // Updates the InspectTemplate.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates
  // to learn more.
  rpc UpdateInspectTemplate(UpdateInspectTemplateRequest)
      returns (InspectTemplate) {
    option (google.api.http) = {
      patch: "/v2/{name=organizations/*/inspectTemplates/*}"
      body: "*"
      additional_bindings {
        patch: "/v2/{name=organizations/*/locations/*/inspectTemplates/*}"
        body: "*"
      }
      additional_bindings {
        patch: "/v2/{name=projects/*/inspectTemplates/*}"
        body: "*"
      }
      additional_bindings {
        patch: "/v2/{name=projects/*/locations/*/inspectTemplates/*}"
        body: "*"
      }
    };
    option (google.api.method_signature) = "name,inspect_template,update_mask";
  }

  // Gets an InspectTemplate.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates
  // to learn more.
  rpc GetInspectTemplate(GetInspectTemplateRequest) returns (InspectTemplate) {
    option (google.api.http) = {
      get: "/v2/{name=organizations/*/inspectTemplates/*}"
      additional_bindings {
        get: "/v2/{name=organizations/*/locations/*/inspectTemplates/*}"
      }
      additional_bindings { get: "/v2/{name=projects/*/inspectTemplates/*}" }
      additional_bindings {
        get: "/v2/{name=projects/*/locations/*/inspectTemplates/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Lists InspectTemplates.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates
  // to learn more.
  rpc ListInspectTemplates(ListInspectTemplatesRequest)
      returns (ListInspectTemplatesResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=organizations/*}/inspectTemplates"
      additional_bindings {
        get: "/v2/{parent=organizations/*/locations/*}/inspectTemplates"
      }
      additional_bindings { get: "/v2/{parent=projects/*}/inspectTemplates" }
      additional_bindings {
        get: "/v2/{parent=projects/*/locations/*}/inspectTemplates"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Deletes an InspectTemplate.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates
  // to learn more.
  rpc DeleteInspectTemplate(DeleteInspectTemplateRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v2/{name=organizations/*/inspectTemplates/*}"
      additional_bindings {
        delete: "/v2/{name=organizations/*/locations/*/inspectTemplates/*}"
      }
      additional_bindings { delete: "/v2/{name=projects/*/inspectTemplates/*}" }
      additional_bindings {
        delete: "/v2/{name=projects/*/locations/*/inspectTemplates/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a DeidentifyTemplate for reusing frequently used configuration
  // for de-identifying content, images, and storage.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates-deid
  // to learn more.
  rpc CreateDeidentifyTemplate(CreateDeidentifyTemplateRequest)
      returns (DeidentifyTemplate) {
    option (google.api.http) = {
      post: "/v2/{parent=organizations/*}/deidentifyTemplates"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=organizations/*/locations/*}/deidentifyTemplates"
        body: "*"
      }
      additional_bindings {
        post: "/v2/{parent=projects/*}/deidentifyTemplates"
        body: "*"
      }
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/deidentifyTemplates"
        body: "*"
      }
    };
    option (google.api.method_signature) = "parent,deidentify_template";
  }

  // Updates the DeidentifyTemplate.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates-deid
  // to learn more.
  rpc UpdateDeidentifyTemplate(UpdateDeidentifyTemplateRequest)
      returns (DeidentifyTemplate) {
    option (google.api.http) = {
      patch: "/v2/{name=organizations/*/deidentifyTemplates/*}"
      body: "*"
      additional_bindings {
        patch: "/v2/{name=organizations/*/locations/*/deidentifyTemplates/*}"
        body: "*"
      }
      additional_bindings {
        patch: "/v2/{name=projects/*/deidentifyTemplates/*}"
        body: "*"
      }
      additional_bindings {
        patch: "/v2/{name=projects/*/locations/*/deidentifyTemplates/*}"
        body: "*"
      }
    };
    option (google.api.method_signature) =
        "name,deidentify_template,update_mask";
  }

  // Gets a DeidentifyTemplate.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates-deid
  // to learn more.
  rpc GetDeidentifyTemplate(GetDeidentifyTemplateRequest)
      returns (DeidentifyTemplate) {
    option (google.api.http) = {
      get: "/v2/{name=organizations/*/deidentifyTemplates/*}"
      additional_bindings {
        get: "/v2/{name=organizations/*/locations/*/deidentifyTemplates/*}"
      }
      additional_bindings { get: "/v2/{name=projects/*/deidentifyTemplates/*}" }
      additional_bindings {
        get: "/v2/{name=projects/*/locations/*/deidentifyTemplates/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Lists DeidentifyTemplates.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates-deid
  // to learn more.
  rpc ListDeidentifyTemplates(ListDeidentifyTemplatesRequest)
      returns (ListDeidentifyTemplatesResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=organizations/*}/deidentifyTemplates"
      additional_bindings {
        get: "/v2/{parent=organizations/*/locations/*}/deidentifyTemplates"
      }
      additional_bindings { get: "/v2/{parent=projects/*}/deidentifyTemplates" }
      additional_bindings {
        get: "/v2/{parent=projects/*/locations/*}/deidentifyTemplates"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Deletes a DeidentifyTemplate.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-templates-deid
  // to learn more.
  rpc DeleteDeidentifyTemplate(DeleteDeidentifyTemplateRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v2/{name=organizations/*/deidentifyTemplates/*}"
      additional_bindings {
        delete: "/v2/{name=organizations/*/locations/*/deidentifyTemplates/*}"
      }
      additional_bindings {
        delete: "/v2/{name=projects/*/deidentifyTemplates/*}"
      }
      additional_bindings {
        delete: "/v2/{name=projects/*/locations/*/deidentifyTemplates/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a job trigger to run DLP actions such as scanning storage for
  // sensitive information on a set schedule.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-job-triggers
  // to learn more.
  rpc CreateJobTrigger(CreateJobTriggerRequest) returns (JobTrigger) {
    option (google.api.http) = {
      post: "/v2/{parent=projects/*}/jobTriggers"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/jobTriggers"
        body: "*"
      }
      additional_bindings {
        post: "/v2/{parent=organizations/*/locations/*}/jobTriggers"
        body: "*"
      }
    };
    option (google.api.method_signature) = "parent,job_trigger";
  }

  // Updates a job trigger.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-job-triggers
  // to learn more.
  rpc UpdateJobTrigger(UpdateJobTriggerRequest) returns (JobTrigger) {
    option (google.api.http) = {
      patch: "/v2/{name=projects/*/jobTriggers/*}"
      body: "*"
      additional_bindings {
        patch: "/v2/{name=projects/*/locations/*/jobTriggers/*}"
        body: "*"
      }
      additional_bindings {
        patch: "/v2/{name=organizations/*/locations/*/jobTriggers/*}"
        body: "*"
      }
    };
    option (google.api.method_signature) = "name,job_trigger,update_mask";
  }

  // Inspect hybrid content and store findings to a trigger. The inspection
  // will be processed asynchronously. To review the findings monitor the
  // jobs within the trigger.
  rpc HybridInspectJobTrigger(HybridInspectJobTriggerRequest)
      returns (HybridInspectResponse) {
    option (google.api.http) = {
      post: "/v2/{name=projects/*/locations/*/jobTriggers/*}:hybridInspect"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Gets a job trigger.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-job-triggers
  // to learn more.
  rpc GetJobTrigger(GetJobTriggerRequest) returns (JobTrigger) {
    option (google.api.http) = {
      get: "/v2/{name=projects/*/jobTriggers/*}"
      additional_bindings {
        get: "/v2/{name=projects/*/locations/*/jobTriggers/*}"
      }
      additional_bindings {
        get: "/v2/{name=organizations/*/locations/*/jobTriggers/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Lists job triggers.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-job-triggers
  // to learn more.
  rpc ListJobTriggers(ListJobTriggersRequest)
      returns (ListJobTriggersResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=projects/*}/jobTriggers"
      additional_bindings {
        get: "/v2/{parent=projects/*/locations/*}/jobTriggers"
      }
      additional_bindings {
        get: "/v2/{parent=organizations/*/locations/*}/jobTriggers"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Deletes a job trigger.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-job-triggers
  // to learn more.
  rpc DeleteJobTrigger(DeleteJobTriggerRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v2/{name=projects/*/jobTriggers/*}"
      additional_bindings {
        delete: "/v2/{name=projects/*/locations/*/jobTriggers/*}"
      }
      additional_bindings {
        delete: "/v2/{name=organizations/*/locations/*/jobTriggers/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Activate a job trigger. Causes the immediate execute of a trigger
  // instead of waiting on the trigger event to occur.
  rpc ActivateJobTrigger(ActivateJobTriggerRequest) returns (DlpJob) {
    option (google.api.http) = {
      post: "/v2/{name=projects/*/jobTriggers/*}:activate"
      body: "*"
      additional_bindings {
        post: "/v2/{name=projects/*/locations/*/jobTriggers/*}:activate"
        body: "*"
      }
    };
  }

  // Creates a config for discovery to scan and profile storage.
  rpc CreateDiscoveryConfig(CreateDiscoveryConfigRequest)
      returns (DiscoveryConfig) {
    option (google.api.http) = {
      post: "/v2/{parent=projects/*/locations/*}/discoveryConfigs"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=organizations/*/locations/*}/discoveryConfigs"
        body: "*"
      }
    };
    option (google.api.method_signature) = "parent,discovery_config";
  }

  // Updates a discovery configuration.
  rpc UpdateDiscoveryConfig(UpdateDiscoveryConfigRequest)
      returns (DiscoveryConfig) {
    option (google.api.http) = {
      patch: "/v2/{name=projects/*/locations/*/discoveryConfigs/*}"
      body: "*"
      additional_bindings {
        patch: "/v2/{name=organizations/*/locations/*/discoveryConfigs/*}"
        body: "*"
      }
    };
    option (google.api.method_signature) = "name,discovery_config,update_mask";
  }

  // Gets a discovery configuration.
  rpc GetDiscoveryConfig(GetDiscoveryConfigRequest) returns (DiscoveryConfig) {
    option (google.api.http) = {
      get: "/v2/{name=projects/*/locations/*/discoveryConfigs/*}"
      additional_bindings {
        get: "/v2/{name=organizations/*/locations/*/discoveryConfigs/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Lists discovery configurations.
  rpc ListDiscoveryConfigs(ListDiscoveryConfigsRequest)
      returns (ListDiscoveryConfigsResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=projects/*/locations/*}/discoveryConfigs"
      additional_bindings {
        get: "/v2/{parent=organizations/*/locations/*}/discoveryConfigs"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Deletes a discovery configuration.
  rpc DeleteDiscoveryConfig(DeleteDiscoveryConfigRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v2/{name=projects/*/locations/*/discoveryConfigs/*}"
      additional_bindings {
        delete: "/v2/{name=organizations/*/locations/*/discoveryConfigs/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new job to inspect storage or calculate risk metrics.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/inspecting-storage
  // and
  // https://cloud.google.com/sensitive-data-protection/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.
  rpc CreateDlpJob(CreateDlpJobRequest) returns (DlpJob) {
    option (google.api.http) = {
      post: "/v2/{parent=projects/*}/dlpJobs"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/dlpJobs"
        body: "*"
      }
    };
    option (google.api.method_signature) = "parent,inspect_job";
    option (google.api.method_signature) = "parent,risk_job";
  }

  // Lists DlpJobs that match the specified filter in the request.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/inspecting-storage
  // and
  // https://cloud.google.com/sensitive-data-protection/docs/compute-risk-analysis
  // to learn more.
  rpc ListDlpJobs(ListDlpJobsRequest) returns (ListDlpJobsResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=projects/*}/dlpJobs"
      additional_bindings { get: "/v2/{parent=projects/*/locations/*}/dlpJobs" }
      additional_bindings {
        get: "/v2/{parent=organizations/*/locations/*}/dlpJobs"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the latest state of a long-running DlpJob.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/inspecting-storage
  // and
  // https://cloud.google.com/sensitive-data-protection/docs/compute-risk-analysis
  // to learn more.
  rpc GetDlpJob(GetDlpJobRequest) returns (DlpJob) {
    option (google.api.http) = {
      get: "/v2/{name=projects/*/dlpJobs/*}"
      additional_bindings { get: "/v2/{name=projects/*/locations/*/dlpJobs/*}" }
    };
    option (google.api.method_signature) = "name";
  }

  // Deletes a long-running DlpJob. This method indicates that the client is
  // no longer interested in the DlpJob result. The job will be canceled if
  // possible.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/inspecting-storage
  // and
  // https://cloud.google.com/sensitive-data-protection/docs/compute-risk-analysis
  // to learn more.
  rpc DeleteDlpJob(DeleteDlpJobRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v2/{name=projects/*/dlpJobs/*}"
      additional_bindings {
        delete: "/v2/{name=projects/*/locations/*/dlpJobs/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // 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/sensitive-data-protection/docs/inspecting-storage
  // and
  // https://cloud.google.com/sensitive-data-protection/docs/compute-risk-analysis
  // to learn more.
  rpc CancelDlpJob(CancelDlpJobRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post: "/v2/{name=projects/*/dlpJobs/*}:cancel"
      body: "*"
      additional_bindings {
        post: "/v2/{name=projects/*/locations/*/dlpJobs/*}:cancel"
        body: "*"
      }
    };
  }

  // Creates a pre-built stored infoType to be used for inspection.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-stored-infotypes
  // to learn more.
  rpc CreateStoredInfoType(CreateStoredInfoTypeRequest)
      returns (StoredInfoType) {
    option (google.api.http) = {
      post: "/v2/{parent=organizations/*}/storedInfoTypes"
      body: "*"
      additional_bindings {
        post: "/v2/{parent=organizations/*/locations/*}/storedInfoTypes"
        body: "*"
      }
      additional_bindings {
        post: "/v2/{parent=projects/*}/storedInfoTypes"
        body: "*"
      }
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/storedInfoTypes"
        body: "*"
      }
    };
    option (google.api.method_signature) = "parent,config";
  }

  // 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/sensitive-data-protection/docs/creating-stored-infotypes
  // to learn more.
  rpc UpdateStoredInfoType(UpdateStoredInfoTypeRequest)
      returns (StoredInfoType) {
    option (google.api.http) = {
      patch: "/v2/{name=organizations/*/storedInfoTypes/*}"
      body: "*"
      additional_bindings {
        patch: "/v2/{name=organizations/*/locations/*/storedInfoTypes/*}"
        body: "*"
      }
      additional_bindings {
        patch: "/v2/{name=projects/*/storedInfoTypes/*}"
        body: "*"
      }
      additional_bindings {
        patch: "/v2/{name=projects/*/locations/*/storedInfoTypes/*}"
        body: "*"
      }
    };
    option (google.api.method_signature) = "name,config,update_mask";
  }

  // Gets a stored infoType.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-stored-infotypes
  // to learn more.
  rpc GetStoredInfoType(GetStoredInfoTypeRequest) returns (StoredInfoType) {
    option (google.api.http) = {
      get: "/v2/{name=organizations/*/storedInfoTypes/*}"
      additional_bindings {
        get: "/v2/{name=organizations/*/locations/*/storedInfoTypes/*}"
      }
      additional_bindings { get: "/v2/{name=projects/*/storedInfoTypes/*}" }
      additional_bindings {
        get: "/v2/{name=projects/*/locations/*/storedInfoTypes/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Lists stored infoTypes.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-stored-infotypes
  // to learn more.
  rpc ListStoredInfoTypes(ListStoredInfoTypesRequest)
      returns (ListStoredInfoTypesResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=organizations/*}/storedInfoTypes"
      additional_bindings {
        get: "/v2/{parent=organizations/*/locations/*}/storedInfoTypes"
      }
      additional_bindings { get: "/v2/{parent=projects/*}/storedInfoTypes" }
      additional_bindings {
        get: "/v2/{parent=projects/*/locations/*}/storedInfoTypes"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Deletes a stored infoType.
  // See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-stored-infotypes
  // to learn more.
  rpc DeleteStoredInfoType(DeleteStoredInfoTypeRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v2/{name=organizations/*/storedInfoTypes/*}"
      additional_bindings {
        delete: "/v2/{name=organizations/*/locations/*/storedInfoTypes/*}"
      }
      additional_bindings { delete: "/v2/{name=projects/*/storedInfoTypes/*}" }
      additional_bindings {
        delete: "/v2/{name=projects/*/locations/*/storedInfoTypes/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Lists data profiles for an organization.
  rpc ListProjectDataProfiles(ListProjectDataProfilesRequest)
      returns (ListProjectDataProfilesResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=organizations/*/locations/*}/projectDataProfiles"
      additional_bindings {
        get: "/v2/{parent=projects/*/locations/*}/projectDataProfiles"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Lists data profiles for an organization.
  rpc ListTableDataProfiles(ListTableDataProfilesRequest)
      returns (ListTableDataProfilesResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=organizations/*/locations/*}/tableDataProfiles"
      additional_bindings {
        get: "/v2/{parent=projects/*/locations/*}/tableDataProfiles"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Lists data profiles for an organization.
  rpc ListColumnDataProfiles(ListColumnDataProfilesRequest)
      returns (ListColumnDataProfilesResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=organizations/*/locations/*}/columnDataProfiles"
      additional_bindings {
        get: "/v2/{parent=projects/*/locations/*}/columnDataProfiles"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets a project data profile.
  rpc GetProjectDataProfile(GetProjectDataProfileRequest)
      returns (ProjectDataProfile) {
    option (google.api.http) = {
      get: "/v2/{name=organizations/*/locations/*/projectDataProfiles/*}"
      additional_bindings {
        get: "/v2/{name=projects/*/locations/*/projectDataProfiles/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Gets a table data profile.
  rpc GetTableDataProfile(GetTableDataProfileRequest)
      returns (TableDataProfile) {
    option (google.api.http) = {
      get: "/v2/{name=organizations/*/locations/*/tableDataProfiles/*}"
      additional_bindings {
        get: "/v2/{name=projects/*/locations/*/tableDataProfiles/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Gets a column data profile.
  rpc GetColumnDataProfile(GetColumnDataProfileRequest)
      returns (ColumnDataProfile) {
    option (google.api.http) = {
      get: "/v2/{name=organizations/*/locations/*/columnDataProfiles/*}"
      additional_bindings {
        get: "/v2/{name=projects/*/locations/*/columnDataProfiles/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Inspect hybrid content and store findings to a job.
  // To review the findings, inspect the job. Inspection will occur
  // asynchronously.
  rpc HybridInspectDlpJob(HybridInspectDlpJobRequest)
      returns (HybridInspectResponse) {
    option (google.api.http) = {
      post: "/v2/{name=projects/*/locations/*/dlpJobs/*}:hybridInspect"
      body: "*"
    };
    option (google.api.method_signature) = "name";
  }

  // Finish a running hybrid DlpJob. Triggers the finalization steps and running
  // of any enabled actions that have not yet run.
  rpc FinishDlpJob(FinishDlpJobRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post: "/v2/{name=projects/*/locations/*/dlpJobs/*}:finish"
      body: "*"
    };
  }
}

// List of excluded infoTypes.
message ExcludeInfoTypes {
  // 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.
  repeated InfoType info_types = 1;
}

// The rule to exclude findings based on a hotword. For record inspection of
// tables, column names are considered hotwords. An example of this is to
// exclude a finding if it belongs to a BigQuery column that matches a specific
// pattern.
message ExcludeByHotword {
  // Regular expression pattern defining what qualifies as a hotword.
  CustomInfoType.Regex hotword_regex = 1;

  // Range of characters within which the entire hotword must reside.
  // The total length of the window cannot exceed 1000 characters.
  // The windowBefore property in proximity should be set to 1 if the hotword
  // needs to be included in a column header.
  CustomInfoType.DetectionRule.Proximity proximity = 2;
}

// The rule that specifies conditions when findings of infoTypes specified in
// `InspectionRuleSet` are removed from results.
message ExclusionRule {
  // Exclusion rule types.
  oneof type {
    // Dictionary which defines the rule.
    CustomInfoType.Dictionary dictionary = 1;

    // Regular expression which defines the rule.
    CustomInfoType.Regex regex = 2;

    // Set of infoTypes for which findings would affect this rule.
    ExcludeInfoTypes exclude_info_types = 3;

    // Drop if the hotword rule is contained in the proximate context. For
    // tabular data, the context includes the column name.
    ExcludeByHotword exclude_by_hotword = 5;
  }

  // How the rule is applied, see MatchingType documentation for details.
  MatchingType matching_type = 4;
}

// A single inspection rule to be applied to infoTypes, specified in
// `InspectionRuleSet`.
message InspectionRule {
  // Inspection rule types.
  oneof type {
    // Hotword-based detection rule.
    CustomInfoType.DetectionRule.HotwordRule hotword_rule = 1;

    // Exclusion rule.
    ExclusionRule exclusion_rule = 2;
  }
}

// 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.
message InspectionRuleSet {
  // List of infoTypes this rule set is applied to.
  repeated InfoType info_types = 1;

  // Set of rules to be applied to infoTypes. The rules are applied in order.
  repeated InspectionRule rules = 2;
}

// Configuration description of the scanning process.
// When used with redactContent only info_types and min_likelihood are currently
// used.
message InspectConfig {
  // Configuration for setting a minimum likelihood per infotype. Used to
  // customize the minimum likelihood level for specific infotypes in the
  // request. For example, use this if you want to lower the precision for
  // PERSON_NAME without lowering the precision for the other infotypes in the
  // request.
  message InfoTypeLikelihood {
    // Type of information the likelihood threshold applies to. Only one
    // likelihood per info_type should be provided. If InfoTypeLikelihood does
    // not have an info_type, the configuration fails.
    InfoType info_type = 1;

    // Only returns findings equal to or above this threshold. This field is
    // required or else the configuration fails.
    Likelihood min_likelihood = 2;
  }

  // Configuration to control the number of findings returned for inspection.
  // This is not used for de-identification or data profiling.
  //
  // When redacting sensitive data from images, finding limits don't apply. They
  // can cause unexpected or inconsistent results, where only some data is
  // redacted. Don't include finding limits in
  // [RedactImage][google.privacy.dlp.v2.DlpService.RedactImage]
  // requests. Otherwise, Cloud DLP returns an error.
  message FindingLimits {
    // Max findings configuration per infoType, per content item or long
    // running DlpJob.
    message InfoTypeLimit {
      // 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 info_type = 1;

      // Max findings limit for the given infoType.
      int32 max_findings = 2;
    }

    // Max number of findings that are returned for each item scanned.
    //
    // When set within an
    // [InspectContentRequest][google.privacy.dlp.v2.InspectContentRequest],
    // this field is ignored.
    //
    // This value isn't a hard limit. If the number of findings for an item
    // reaches this limit, the inspection of that item ends gradually, not
    // abruptly. Therefore, the actual number of findings that Cloud DLP returns
    // for the item can be multiple times higher than this value.
    int32 max_findings_per_item = 1;

    // Max number of findings that are returned per request or job.
    //
    // If you set this field in an
    // [InspectContentRequest][google.privacy.dlp.v2.InspectContentRequest], the
    // resulting maximum value is the value that you set or 3,000, whichever is
    // lower.
    //
    // This value isn't a hard limit. If an inspection reaches this limit, the
    // inspection ends gradually, not abruptly. Therefore, the actual number of
    // findings that Cloud DLP returns can be multiple times higher than this
    // value.
    int32 max_findings_per_request = 2;

    // Configuration of findings limit given for specified infoTypes.
    repeated InfoTypeLimit max_findings_per_info_type = 3;
  }

  // Restricts what info_types to look for. The values must correspond to
  // InfoType values returned by ListInfoTypes or listed at
  // https://cloud.google.com/sensitive-data-protection/docs/infotypes-reference.
  //
  // When no InfoTypes or CustomInfoTypes are specified in a request, the
  // system may automatically choose a default list of detectors to run, which
  // may change over time.
  //
  // 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.
  repeated InfoType info_types = 1;

  // Only returns findings equal to or above this threshold. The default is
  // POSSIBLE.
  //
  // In general, the highest likelihood setting yields the fewest findings in
  // results and the lowest chance of a false positive. For more information,
  // see [Match
  // likelihood](https://cloud.google.com/sensitive-data-protection/docs/likelihood).
  Likelihood min_likelihood = 2;

  // Minimum likelihood per infotype. For each infotype, a user can specify a
  // minimum likelihood. The system only returns a finding if its likelihood is
  // above this threshold. If this field is not set, the system uses the
  // InspectConfig min_likelihood.
  repeated InfoTypeLikelihood min_likelihood_per_info_type = 11;

  // Configuration to control the number of findings returned.
  // This is not used for data profiling.
  //
  // When redacting sensitive data from images, finding limits don't apply. They
  // can cause unexpected or inconsistent results, where only some data is
  // redacted. Don't include finding limits in
  // [RedactImage][google.privacy.dlp.v2.DlpService.RedactImage]
  // requests. Otherwise, Cloud DLP returns an error.
  //
  // When set within an
  // [InspectJobConfig][google.privacy.dlp.v2.InspectJobConfig], the specified
  // maximum values aren't hard limits. If an inspection job reaches these
  // limits, the job ends gradually, not abruptly. Therefore, the actual number
  // of findings that Cloud DLP returns can be multiple times higher than these
  // maximum values.
  FindingLimits limits = 3;

  // When true, a contextual quote from the data that triggered a finding is
  // included in the response; see
  // [Finding.quote][google.privacy.dlp.v2.Finding.quote]. This is not used for
  // data profiling.
  bool include_quote = 4;

  // When true, excludes type information of the findings.
  // This is not used for data profiling.
  bool exclude_info_types = 5;

  // CustomInfoTypes provided by the user. See
  // https://cloud.google.com/sensitive-data-protection/docs/creating-custom-infotypes
  // to learn more.
  repeated CustomInfoType custom_info_types = 6;

  // Deprecated and unused.
  repeated ContentOption content_options = 8;

  // 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.
  repeated InspectionRuleSet rule_set = 10;
}

// Container for bytes to inspect or redact.
message ByteContentItem {
  // The type of data being sent for inspection. To learn more, see
  // [Supported file
  // types](https://cloud.google.com/sensitive-data-protection/docs/supported-file-types).
  enum BytesType {
    // Unused
    BYTES_TYPE_UNSPECIFIED = 0;

    // Any image type.
    IMAGE = 6;

    // jpeg
    IMAGE_JPEG = 1;

    // bmp
    IMAGE_BMP = 2;

    // png
    IMAGE_PNG = 3;

    // svg
    IMAGE_SVG = 4;

    // plain text
    TEXT_UTF8 = 5;

    // docx, docm, dotx, dotm
    WORD_DOCUMENT = 7;

    // pdf
    PDF = 8;

    // pptx, pptm, potx, potm, pot
    POWERPOINT_DOCUMENT = 9;

    // xlsx, xlsm, xltx, xltm
    EXCEL_DOCUMENT = 10;

    // avro
    AVRO = 11;

    // csv
    CSV = 12;

    // tsv
    TSV = 13;
  }

  // The type of data stored in the bytes string. Default will be TEXT_UTF8.
  BytesType type = 1;

  // Content data to inspect or redact.
  bytes data = 2;
}

// Type of content to inspect.
message ContentItem {
  // Data of the item either in the byte array or UTF-8 string form, or table.
  oneof data_item {
    // String data to inspect or redact.
    string value = 3;

    // Structured content for inspection. See
    // https://cloud.google.com/sensitive-data-protection/docs/inspecting-text#inspecting_a_table
    // to learn more.
    Table table = 4;

    // Content data to inspect or redact. Replaces `type` and `data`.
    ByteContentItem byte_item = 5;
  }
}

// Structured content to inspect. Up to 50,000 `Value`s per request allowed. See
// https://cloud.google.com/sensitive-data-protection/docs/inspecting-structured-text#inspecting_a_table
// to learn more.
message Table {
  // Values of the row.
  message Row {
    // Individual cells.
    repeated Value values = 1;
  }

  // Headers of the table.
  repeated FieldId headers = 1;

  // Rows of the table.
  repeated Row rows = 2;
}

// All the findings for a single scanned item.
message InspectResult {
  // List of findings for an item.
  repeated Finding findings = 1;

  // 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.
  bool findings_truncated = 2;
}

// Represents a piece of potentially sensitive content.
message Finding {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/Finding"
    pattern: "projects/{project}/locations/{location}/findings/{finding}"
  };

  // Resource name in format
  // projects/{project}/locations/{location}/findings/{finding} Populated only
  // when viewing persisted findings.
  string name = 14;

  // 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.
  string quote = 1;

  // The type of content that might have been found.
  // Provided if `excluded_types` is false.
  InfoType info_type = 2;

  // Confidence of how likely it is that the `info_type` is correct.
  Likelihood likelihood = 3;

  // Where the content was found.
  Location location = 4;

  // Timestamp when finding was detected.
  google.protobuf.Timestamp create_time = 6;

  // 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 quote_info = 7;

  // The job that stored the finding.
  string resource_name = 8
      [(google.api.resource_reference) = { type: "dlp.googleapis.com/DlpJob" }];

  // Job trigger name, if applicable, for this finding.
  string trigger_name = 9 [
    (google.api.resource_reference) = { type: "dlp.googleapis.com/JobTrigger" }
  ];

  // The labels associated with this `Finding`.
  //
  // Label keys must be between 1 and 63 characters long and must conform
  // to the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
  //
  // Label values must be between 0 and 63 characters long and must conform
  // to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
  //
  // No more than 10 labels can be associated with a given finding.
  //
  // Examples:
  // * `"environment" : "production"`
  // * `"pipeline" : "etl"`
  map<string, string> labels = 10;

  // Time the job started that produced this finding.
  google.protobuf.Timestamp job_create_time = 11;

  // The job that stored the finding.
  string job_name = 13
      [(google.api.resource_reference) = { type: "dlp.googleapis.com/DlpJob" }];

  // The unique finding id.
  string finding_id = 15;
}

// Specifies the location of the finding.
message Location {
  // 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.
  Range byte_range = 1;

  // Unicode character offsets delimiting the finding.
  // These are relative to the finding's containing element.
  // Provided when the content is text.
  Range codepoint_range = 2;

  // List of nested objects pointing to the precise location of the finding
  // within the file or record.
  repeated ContentLocation content_locations = 7;

  // Information about the container where this finding occurred, if available.
  Container container = 8;
}

// Precise location of the finding within a document, record, image, or metadata
// container.
message ContentLocation {
  // 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 example, an image contained within a document).
  string container_name = 1;

  // Type of the container within the file with location of the finding.
  oneof location {
    // Location within a row or record of a database table.
    RecordLocation record_location = 2;

    // Location within an image's pixels.
    ImageLocation image_location = 3;

    // Location data for document files.
    DocumentLocation document_location = 5;

    // Location within the metadata for inspected content.
    MetadataLocation metadata_location = 8;
  }

  // Finding container modification timestamp, if applicable. For Cloud Storage,
  // this field contains the last file modification timestamp. For a BigQuery
  // table, this field contains the last_modified_time property. For Datastore,
  // this field isn't populated.
  google.protobuf.Timestamp container_timestamp = 6;

  // Finding container version, if available
  // ("generation" for Cloud Storage).
  string container_version = 7;
}

// Metadata Location
message MetadataLocation {
  // Type of metadata containing the finding.
  MetadataType type = 1;

  // Label of the piece of metadata containing the finding, for example -
  // latitude, author, caption.
  oneof label {
    // Storage metadata.
    StorageMetadataLabel storage_label = 3;
  }
}

// Storage metadata label to indicate which metadata entry contains findings.
message StorageMetadataLabel {
  // Label name.
  string key = 1;
}

// Location of a finding within a document.
message DocumentLocation {
  // Offset of the line, from the beginning of the file, where the finding
  // is located.
  int64 file_offset = 1;
}

// Location of a finding within a row or record.
message RecordLocation {
  // Key of the finding.
  RecordKey record_key = 1;

  // Field id of the field containing the finding.
  FieldId field_id = 2;

  // Location within a `ContentItem.Table`.
  TableLocation table_location = 3;
}

// Location of a finding within a table.
message TableLocation {
  // The zero-based index of the row where the finding is located. Only
  // populated for resources that have a natural ordering, not BigQuery. In
  // BigQuery, to identify the row a finding came from, populate
  // BigQueryOptions.identifying_fields with your primary key column names and
  // when you store the findings the value of those columns will be stored
  // inside of Finding.
  int64 row_index = 1;
}

// Represents a container that may contain DLP findings.
// Examples of a container include a file, table, or database record.
message Container {
  // Container type, for example BigQuery or Cloud Storage.
  string type = 1;

  // Project where the finding was found.
  // Can be different from the project that owns the finding.
  string project_id = 2;

  // A string representation of the full container name.
  // Examples:
  // - BigQuery: 'Project:DataSetId.TableId'
  // - Cloud Storage: 'gs://Bucket/folders/filename.txt'
  string full_path = 3;

  // The root of the container.
  // Examples:
  //
  // - For BigQuery table `project_id:dataset_id.table_id`, the root is
  //  `dataset_id`
  // - For Cloud Storage file `gs://bucket/folder/filename.txt`, the root
  //  is `gs://bucket`
  string root_path = 4;

  // The rest of the path after the root.
  // Examples:
  //
  // - For BigQuery table `project_id:dataset_id.table_id`, the relative path is
  //  `table_id`
  // - For Cloud Storage file `gs://bucket/folder/filename.txt`, the relative
  //  path is `folder/filename.txt`
  string relative_path = 5;

  // Findings container modification timestamp, if applicable. For Cloud
  // Storage, this field contains the last file modification timestamp. For a
  // BigQuery table, this field contains the last_modified_time property. For
  // Datastore, this field isn't populated.
  google.protobuf.Timestamp update_time = 6;

  // Findings container version, if available
  // ("generation" for Cloud Storage).
  string version = 7;
}

// Generic half-open interval [start, end)
message Range {
  // Index of the first character of the range (inclusive).
  int64 start = 1;

  // Index of the last character of the range (exclusive).
  int64 end = 2;
}

// Location of the finding within an image.
message ImageLocation {
  // Bounding boxes locating the pixels within the image containing the finding.
  repeated BoundingBox bounding_boxes = 1;
}

// Bounding box encompassing detected text within an image.
message BoundingBox {
  // Top coordinate of the bounding box. (0,0) is upper left.
  int32 top = 1;

  // Left coordinate of the bounding box. (0,0) is upper left.
  int32 left = 2;

  // Width of the bounding box in pixels.
  int32 width = 3;

  // Height of the bounding box in pixels.
  int32 height = 4;
}

// Request to search for potentially sensitive info in an image and redact it
// by covering it with a colored rectangle.
message RedactImageRequest {
  // Configuration for determining how redaction of images should occur.
  message ImageRedactionConfig {
    // Type of information to redact from images.
    oneof target {
      // Only one per info_type should be provided per request. If not
      // specified, and redact_all_text is false, the DLP API will redact all
      // text that it matches against all info_types that are found, but not
      // specified in another ImageRedactionConfig.
      InfoType info_type = 1;

      // If true, all text found in the image, regardless whether it matches an
      // info_type, is redacted. Only one should be provided.
      bool redact_all_text = 2;
    }

    // The color to use when redacting content from an image. If not specified,
    // the default is black.
    Color redaction_color = 3;
  }

  // Parent resource name.
  //
  // The format of this value varies depending on whether you have [specified a
  // processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [(google.api.resource_reference) = {
    child_type: "dlp.googleapis.com/DlpContent"
  }];

  // Deprecated. This field has no effect.
  string location_id = 8;

  // Configuration for the inspector.
  InspectConfig inspect_config = 2;

  // The configuration for specifying what content to redact from images.
  repeated ImageRedactionConfig image_redaction_configs = 5;

  // Whether the response should include findings along with the redacted
  // image.
  bool include_findings = 6;

  // The content must be PNG, JPEG, SVG or BMP.
  ByteContentItem byte_item = 7;
}

// Represents a color in the RGB color space.
message Color {
  // The amount of red in the color as a value in the interval [0, 1].
  float red = 1;

  // The amount of green in the color as a value in the interval [0, 1].
  float green = 2;

  // The amount of blue in the color as a value in the interval [0, 1].
  float blue = 3;
}

// Results of redacting an image.
message RedactImageResponse {
  // The redacted image. The type will be the same as the original image.
  bytes redacted_image = 1;

  // 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.
  string extracted_text = 2;

  // The findings. Populated when include_findings in the request is true.
  InspectResult inspect_result = 3;
}

// Request to de-identify a ContentItem.
message DeidentifyContentRequest {
  // Parent resource name.
  //
  // The format of this value varies depending on whether you have [specified a
  // processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [(google.api.resource_reference) = {
    child_type: "dlp.googleapis.com/DlpContent"
  }];

  // Configuration for the de-identification of the content item.
  // Items specified here will override the template referenced by the
  // deidentify_template_name argument.
  DeidentifyConfig deidentify_config = 2;

  // Configuration for the inspector.
  // Items specified here will override the template referenced by the
  // inspect_template_name argument.
  InspectConfig inspect_config = 3;

  // The item to de-identify. Will be treated as text.
  //
  // This value must be of type
  // [Table][google.privacy.dlp.v2.Table] if your
  // [deidentify_config][google.privacy.dlp.v2.DeidentifyContentRequest.deidentify_config]
  // is a
  // [RecordTransformations][google.privacy.dlp.v2.RecordTransformations]
  // object.
  ContentItem item = 4;

  // 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.
  string inspect_template_name = 5;

  // 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.
  string deidentify_template_name = 6;

  // Deprecated. This field has no effect.
  string location_id = 7;
}

// Results of de-identifying a ContentItem.
message DeidentifyContentResponse {
  // The de-identified item.
  ContentItem item = 1;

  // An overview of the changes that were made on the `item`.
  TransformationOverview overview = 2;
}

// Request to re-identify an item.
message ReidentifyContentRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on whether you have [specified a
  // processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/DlpContent"
    }
  ];

  // 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`
  DeidentifyConfig reidentify_config = 2;

  // Configuration for the inspector.
  InspectConfig inspect_config = 3;

  // The item to re-identify. Will be treated as text.
  ContentItem item = 4;

  // 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.
  string inspect_template_name = 5;

  // 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. The
  // `DeidentifyTemplate` used must include only reversible transformations.
  // 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.
  string reidentify_template_name = 6;

  // Deprecated. This field has no effect.
  string location_id = 7;
}

// Results of re-identifying an item.
message ReidentifyContentResponse {
  // The re-identified item.
  ContentItem item = 1;

  // An overview of the changes that were made to the `item`.
  TransformationOverview overview = 2;
}

// Request to search for potentially sensitive info in a ContentItem.
message InspectContentRequest {
  // Parent resource name.
  //
  // The format of this value varies depending on whether you have [specified a
  // processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [(google.api.resource_reference) = {
    child_type: "dlp.googleapis.com/DlpContent"
  }];

  // Configuration for the inspector. What specified here will override
  // the template referenced by the inspect_template_name argument.
  InspectConfig inspect_config = 2;

  // The item to inspect.
  ContentItem item = 3;

  // 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.
  string inspect_template_name = 4;

  // Deprecated. This field has no effect.
  string location_id = 5;
}

// Results of inspecting an item.
message InspectContentResponse {
  // The findings.
  InspectResult result = 1;
}

// Cloud repository for storing output.
message OutputStorageConfig {
  // Predefined schemas for storing findings.
  // Only for use with external storage.
  enum OutputSchema {
    // Unused.
    OUTPUT_SCHEMA_UNSPECIFIED = 0;

    // Basic schema including only `info_type`, `quote`, `certainty`, and
    // `timestamp`.
    BASIC_COLUMNS = 1;

    // Schema tailored to findings from scanning Cloud Storage.
    GCS_COLUMNS = 2;

    // Schema tailored to findings from scanning Google Datastore.
    DATASTORE_COLUMNS = 3;

    // Schema tailored to findings from scanning Google BigQuery.
    BIG_QUERY_COLUMNS = 4;

    // Schema containing all columns.
    ALL_COLUMNS = 5;
  }

  // Output storage types.
  oneof type {
    // Store findings in an existing table or a new table in an existing
    // dataset. If table_id is not set a new one will be generated
    // for you with the following format:
    // dlp_googleapis_yyyy_mm_dd_[dlp_job_id]. Pacific time zone will be used
    // for generating the date details.
    //
    // For Inspect, each column in an existing output table must have the same
    // name, type, and mode of a field in the `Finding` object.
    //
    // For Risk, an existing output table should be the output of a previous
    // Risk analysis job run on the same source table, with the same privacy
    // metric and quasi-identifiers. Risk jobs that analyze the same table but
    // compute a different privacy metric, or use different sets of
    // quasi-identifiers, cannot store their results in the same table.
    BigQueryTable table = 1;
  }

  // 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.
  // Only for use with external storage.
  OutputSchema output_schema = 3;
}

// Statistics regarding a specific InfoType.
message InfoTypeStats {
  // The type of finding this stat is for.
  InfoType info_type = 1;

  // Number of findings for this infoType.
  int64 count = 2;
}

// The results of an inspect DataSource job.
message InspectDataSourceDetails {
  // Snapshot of the inspection configuration.
  message RequestedOptions {
    // If run with an InspectTemplate, a snapshot of its state at the time of
    // this run.
    InspectTemplate snapshot_inspect_template = 1;

    // Inspect config.
    InspectJobConfig job_config = 3;
  }

  // All result fields mentioned below are updated while the job is processing.
  message Result {
    // Total size in bytes that were processed.
    int64 processed_bytes = 1;

    // Estimate of the number of bytes to process.
    int64 total_estimated_bytes = 2;

    // Statistics of how many instances of each info type were found during
    // inspect job.
    repeated InfoTypeStats info_type_stats = 3;

    // Statistics related to the processing of hybrid inspect.
    HybridInspectStatistics hybrid_stats = 7;
  }

  // The configuration used for this job.
  RequestedOptions requested_options = 2;

  // A summary of the outcome of this inspection job.
  Result result = 3;
}

// The schema of data to be saved to the BigQuery table when the
// `DataProfileAction` is enabled.
message DataProfileBigQueryRowSchema {
  // Data profile type.
  oneof data_profile {
    // Table data profile column
    TableDataProfile table_profile = 1;

    // Column data profile column
    ColumnDataProfile column_profile = 2;
  }
}

// Statistics related to processing hybrid inspect requests.
message HybridInspectStatistics {
  // The number of hybrid inspection requests processed within this job.
  int64 processed_count = 1;

  // The number of hybrid inspection requests aborted because the job ran
  // out of quota or was ended before they could be processed.
  int64 aborted_count = 2;

  // The number of hybrid requests currently being processed. Only populated
  // when called via method `getDlpJob`.
  // A burst of traffic may cause hybrid inspect requests to be enqueued.
  // Processing will take place as quickly as possible, but resource limitations
  // may impact how long a request is enqueued for.
  int64 pending_count = 3;
}

// The results of an [Action][google.privacy.dlp.v2.Action].
message ActionDetails {
  // Summary of what occurred in the actions.
  oneof details {
    // Outcome of a de-identification action.
    DeidentifyDataSourceDetails deidentify_details = 1;
  }
}

// Summary of what was modified during a transformation.
message DeidentifyDataSourceStats {
  // Total size in bytes that were transformed in some way.
  int64 transformed_bytes = 1;

  // Number of successfully applied transformations.
  int64 transformation_count = 2;

  // Number of errors encountered while trying to apply transformations.
  int64 transformation_error_count = 3;
}

// The results of a [Deidentify][google.privacy.dlp.v2.Action.Deidentify] action
// from an inspect job.
message DeidentifyDataSourceDetails {
  // De-identification options.
  message RequestedDeidentifyOptions {
    // Snapshot of the state of the `DeidentifyTemplate` from the
    // [Deidentify][google.privacy.dlp.v2.Action.Deidentify] action at the time
    // this job was run.
    DeidentifyTemplate snapshot_deidentify_template = 1;

    // Snapshot of the state of the structured `DeidentifyTemplate` from the
    // `Deidentify` action at the time this job was run.
    DeidentifyTemplate snapshot_structured_deidentify_template = 2;

    // Snapshot of the state of the image transformation `DeidentifyTemplate`
    // from the `Deidentify` action at the time this job was run.
    DeidentifyTemplate snapshot_image_redact_template = 3;
  }

  // De-identification config used for the request.
  RequestedDeidentifyOptions requested_options = 1;

  // Stats about the de-identification operation.
  DeidentifyDataSourceStats deidentify_stats = 2;
}

// InfoType description.
message InfoTypeDescription {
  // Internal name of the infoType.
  string name = 1;

  // Human readable form of the infoType name.
  string display_name = 2;

  // Which parts of the API supports this InfoType.
  repeated InfoTypeSupportedBy supported_by = 3;

  // Description of the infotype. Translated when language is provided in the
  // request.
  string description = 4;

  // A list of available versions for the infotype.
  repeated VersionDescription versions = 9;

  // The category of the infoType.
  repeated InfoTypeCategory categories = 10;

  // The default sensitivity of the infoType.
  SensitivityScore sensitivity_score = 11;
}

// Classification of infoTypes to organize them according to geographic
// location, industry, and data type.
message InfoTypeCategory {
  // Enum of the current locations.
  // We might add more locations in the future.
  enum LocationCategory {
    // Unused location
    LOCATION_UNSPECIFIED = 0;

    // The infoType is not issued by or tied to a specific region, but is used
    // almost everywhere.
    GLOBAL = 1;

    // The infoType is typically used in Argentina.
    ARGENTINA = 2;

    // The infoType is typically used in Australia.
    AUSTRALIA = 3;

    // The infoType is typically used in Belgium.
    BELGIUM = 4;

    // The infoType is typically used in Brazil.
    BRAZIL = 5;

    // The infoType is typically used in Canada.
    CANADA = 6;

    // The infoType is typically used in Chile.
    CHILE = 7;

    // The infoType is typically used in China.
    CHINA = 8;

    // The infoType is typically used in Colombia.
    COLOMBIA = 9;

    // The infoType is typically used in Croatia.
    CROATIA = 42;

    // The infoType is typically used in Denmark.
    DENMARK = 10;

    // The infoType is typically used in France.
    FRANCE = 11;

    // The infoType is typically used in Finland.
    FINLAND = 12;

    // The infoType is typically used in Germany.
    GERMANY = 13;

    // The infoType is typically used in Hong Kong.
    HONG_KONG = 14;

    // The infoType is typically used in India.
    INDIA = 15;

    // The infoType is typically used in Indonesia.
    INDONESIA = 16;

    // The infoType is typically used in Ireland.
    IRELAND = 17;

    // The infoType is typically used in Israel.
    ISRAEL = 18;

    // The infoType is typically used in Italy.
    ITALY = 19;

    // The infoType is typically used in Japan.
    JAPAN = 20;

    // The infoType is typically used in Korea.
    KOREA = 21;

    // The infoType is typically used in Mexico.
    MEXICO = 22;

    // The infoType is typically used in the Netherlands.
    THE_NETHERLANDS = 23;

    // The infoType is typically used in New Zealand.
    NEW_ZEALAND = 41;

    // The infoType is typically used in Norway.
    NORWAY = 24;

    // The infoType is typically used in Paraguay.
    PARAGUAY = 25;

    // The infoType is typically used in Peru.
    PERU = 26;

    // The infoType is typically used in Poland.
    POLAND = 27;

    // The infoType is typically used in Portugal.
    PORTUGAL = 28;

    // The infoType is typically used in Singapore.
    SINGAPORE = 29;

    // The infoType is typically used in South Africa.
    SOUTH_AFRICA = 30;

    // The infoType is typically used in Spain.
    SPAIN = 31;

    // The infoType is typically used in Sweden.
    SWEDEN = 32;

    // The infoType is typically used in Switzerland.
    SWITZERLAND = 43;

    // The infoType is typically used in Taiwan.
    TAIWAN = 33;

    // The infoType is typically used in Thailand.
    THAILAND = 34;

    // The infoType is typically used in Turkey.
    TURKEY = 35;

    // The infoType is typically used in the United Kingdom.
    UNITED_KINGDOM = 36;

    // The infoType is typically used in the United States.
    UNITED_STATES = 37;

    // The infoType is typically used in Uruguay.
    URUGUAY = 38;

    // The infoType is typically used in Venezuela.
    VENEZUELA = 39;

    // The infoType is typically used in Google internally.
    INTERNAL = 40;
  }

  // Enum of the current industries in the category.
  // We might add more industries in the future.
  enum IndustryCategory {
    // Unused industry
    INDUSTRY_UNSPECIFIED = 0;

    // The infoType is typically used in the finance industry.
    FINANCE = 1;

    // The infoType is typically used in the health industry.
    HEALTH = 2;

    // The infoType is typically used in the telecommunications industry.
    TELECOMMUNICATIONS = 3;
  }

  // Enum of the current types in the category.
  // We might add more types in the future.
  enum TypeCategory {
    // Unused type
    TYPE_UNSPECIFIED = 0;

    // Personally identifiable information, for example, a
    // name or phone number
    PII = 1;

    // Personally identifiable information that is especially sensitive, for
    // example, a passport number.
    SPII = 2;

    // Attributes that can partially identify someone, especially in
    // combination with other attributes, like age, height, and gender.
    DEMOGRAPHIC = 3;

    // Confidential or secret information, for example, a password.
    CREDENTIAL = 4;

    // An identification document issued by a government.
    GOVERNMENT_ID = 5;

    // A document, for example, a resume or source code.
    DOCUMENT = 6;

    // Information that is not sensitive on its own, but provides details about
    // the circumstances surrounding an entity or an event.
    CONTEXTUAL_INFORMATION = 7;
  }

  // Categories of infotypes.
  oneof category {
    // The region or country that issued the ID or document represented by the
    // infoType.
    LocationCategory location_category = 1;

    // The group of relevant businesses where this infoType is commonly used
    IndustryCategory industry_category = 2;

    // The class of identifiers where this infoType belongs
    TypeCategory type_category = 3;
  }
}

// Details about each available version for an infotype.
message VersionDescription {
  // Name of the version
  string version = 1;

  // Description of the version.
  string description = 2;
}

// Request for the list of infoTypes.
message ListInfoTypesRequest {
  // The parent resource name.
  //
  // The format of this value is as follows:
  //
  //     locations/<var>LOCATION_ID</var>
  string parent = 4;

  // BCP-47 language code for localized infoType friendly
  // names. If omitted, or if localized strings are not available,
  // en-US strings will be returned.
  string language_code = 1;

  // filter to only return infoTypes supported by certain parts of the
  // API. Defaults to supported_by=INSPECT.
  string filter = 2;

  // Deprecated. This field has no effect.
  string location_id = 3;
}

// Response to the ListInfoTypes request.
message ListInfoTypesResponse {
  // Set of sensitive infoTypes.
  repeated InfoTypeDescription info_types = 1;
}

// Configuration for a risk analysis job. See
// https://cloud.google.com/sensitive-data-protection/docs/concepts-risk-analysis
// to learn more.
message RiskAnalysisJobConfig {
  // Privacy metric to compute.
  PrivacyMetric privacy_metric = 1;

  // Input dataset to compute metrics over.
  BigQueryTable source_table = 2;

  // Actions to execute at the completion of the job. Are executed in the order
  // provided.
  repeated Action actions = 3;
}

// A column with a semantic tag attached.
message QuasiId {
  // Required. Identifies the column.
  FieldId field = 1 [(google.api.field_behavior) = REQUIRED];

  // Semantic tag that identifies what a column contains, to determine which
  // statistical model to use to estimate the reidentifiability of each
  // value. [required]
  oneof tag {
    // A column can be tagged with a InfoType to use the relevant public
    // dataset as a statistical model of population, if available. We
    // currently support US ZIP codes, region codes, ages and genders.
    // To programmatically obtain the list of supported InfoTypes, use
    // ListInfoTypes with the supported_by=RISK_ANALYSIS filter.
    InfoType info_type = 2;

    // 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).
    string custom_tag = 3;

    // If no semantic tag is indicated, we infer the statistical model from
    // the distribution of values in the input data
    google.protobuf.Empty inferred = 4;
  }
}

// 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).
message StatisticalTable {
  // A quasi-identifier column has a custom_tag, used to know which column
  // in the data corresponds to which column in the statistical model.
  message QuasiIdentifierField {
    // Identifies the column.
    FieldId field = 1;

    // 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).
    string custom_tag = 2;
  }

  // Required. Auxiliary table location.
  BigQueryTable table = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. Quasi-identifier columns.
  repeated QuasiIdentifierField quasi_ids = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The relative frequency column must contain a floating-point
  // number between 0 and 1 (inclusive). Null values are assumed to be zero.
  FieldId relative_frequency = 2 [(google.api.field_behavior) = REQUIRED];
}

// Privacy metric to compute for reidentification risk analysis.
message PrivacyMetric {
  // Compute numerical stats over an individual column, including
  // min, max, and quantiles.
  message NumericalStatsConfig {
    // Field to compute numerical stats on. Supported types are
    // integer, float, date, datetime, timestamp, time.
    FieldId field = 1;
  }

  // Compute numerical stats over an individual column, including
  // number of distinct values and value count distribution.
  message CategoricalStatsConfig {
    // 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.
    FieldId field = 1;
  }

  // k-anonymity metric, used for analysis of reidentification risk.
  message KAnonymityConfig {
    // 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.
    repeated FieldId quasi_ids = 1;

    // 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 entity_id = 2;
  }

  // l-diversity metric, used for analysis of reidentification risk.
  message LDiversityConfig {
    // 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.
    repeated FieldId quasi_ids = 1;

    // Sensitive field for computing the l-value.
    FieldId sensitive_attribute = 2;
  }

  // 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.
  message KMapEstimationConfig {
    // A column with a semantic tag attached.
    message TaggedField {
      // Required. Identifies the column.
      FieldId field = 1 [(google.api.field_behavior) = REQUIRED];

      // Semantic tag that identifies what a column contains, to determine which
      // statistical model to use to estimate the reidentifiability of each
      // value. [required]
      oneof tag {
        // A column can be tagged with a InfoType to use the relevant public
        // dataset as a statistical model of population, if available. We
        // currently support US ZIP codes, region codes, ages and genders.
        // To programmatically obtain the list of supported InfoTypes, use
        // ListInfoTypes with the supported_by=RISK_ANALYSIS filter.
        InfoType info_type = 2;

        // 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).
        string custom_tag = 3;

        // If no semantic tag is indicated, we infer the statistical model from
        // the distribution of values in the input data
        google.protobuf.Empty inferred = 4;
      }
    }

    // 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).
    message AuxiliaryTable {
      // A quasi-identifier column has a custom_tag, used to know which column
      // in the data corresponds to which column in the statistical model.
      message QuasiIdField {
        // Identifies the column.
        FieldId field = 1;

        // A auxiliary field.
        string custom_tag = 2;
      }

      // Required. Auxiliary table location.
      BigQueryTable table = 3 [(google.api.field_behavior) = REQUIRED];

      // Required. Quasi-identifier columns.
      repeated QuasiIdField quasi_ids = 1
          [(google.api.field_behavior) = REQUIRED];

      // Required. The relative frequency column must contain a floating-point
      // number between 0 and 1 (inclusive). Null values are assumed to be zero.
      FieldId relative_frequency = 2 [(google.api.field_behavior) = REQUIRED];
    }

    // Required. Fields considered to be quasi-identifiers. No two columns can
    // have the same tag.
    repeated TaggedField quasi_ids = 1 [(google.api.field_behavior) = REQUIRED];

    // 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.
    string region_code = 2;

    // 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.
    repeated AuxiliaryTable auxiliary_tables = 3;
  }

  // δ-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.
  message DeltaPresenceEstimationConfig {
    // Required. Fields considered to be quasi-identifiers. No two fields can
    // have the same tag.
    repeated QuasiId quasi_ids = 1 [(google.api.field_behavior) = REQUIRED];

    // 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.
    string region_code = 2;

    // 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.
    repeated StatisticalTable auxiliary_tables = 3;
  }

  // Types of analysis.
  oneof type {
    // Numerical stats
    NumericalStatsConfig numerical_stats_config = 1;

    // Categorical stats
    CategoricalStatsConfig categorical_stats_config = 2;

    // K-anonymity
    KAnonymityConfig k_anonymity_config = 3;

    // l-diversity
    LDiversityConfig l_diversity_config = 4;

    // k-map
    KMapEstimationConfig k_map_estimation_config = 5;

    // delta-presence
    DeltaPresenceEstimationConfig delta_presence_estimation_config = 6;
  }
}

// Result of a risk analysis operation request.
message AnalyzeDataSourceRiskDetails {
  // Result of the numerical stats computation.
  message NumericalStatsResult {
    // Minimum value appearing in the column.
    Value min_value = 1;

    // Maximum value appearing in the column.
    Value max_value = 2;

    // List of 99 values that partition the set of field values into 100 equal
    // sized buckets.
    repeated Value quantile_values = 4;
  }

  // Result of the categorical stats computation.
  message CategoricalStatsResult {
    // Histogram of value frequencies in the column.
    message CategoricalStatsHistogramBucket {
      // Lower bound on the value frequency of the values in this bucket.
      int64 value_frequency_lower_bound = 1;

      // Upper bound on the value frequency of the values in this bucket.
      int64 value_frequency_upper_bound = 2;

      // Total number of values in this bucket.
      int64 bucket_size = 3;

      // Sample of value frequencies in this bucket. The total number of
      // values returned per bucket is capped at 20.
      repeated ValueFrequency bucket_values = 4;

      // Total number of distinct values in this bucket.
      int64 bucket_value_count = 5;
    }

    // Histogram of value frequencies in the column.
    repeated CategoricalStatsHistogramBucket value_frequency_histogram_buckets =
        5;
  }

  // Result of the k-anonymity computation.
  message KAnonymityResult {
    // The set of columns' values that share the same ldiversity value
    message KAnonymityEquivalenceClass {
      // 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.
      repeated Value quasi_ids_values = 1;

      // Size of the equivalence class, for example number of rows with the
      // above set of values.
      int64 equivalence_class_size = 2;
    }

    // Histogram of k-anonymity equivalence classes.
    message KAnonymityHistogramBucket {
      // Lower bound on the size of the equivalence classes in this bucket.
      int64 equivalence_class_size_lower_bound = 1;

      // Upper bound on the size of the equivalence classes in this bucket.
      int64 equivalence_class_size_upper_bound = 2;

      // Total number of equivalence classes in this bucket.
      int64 bucket_size = 3;

      // Sample of equivalence classes in this bucket. The total number of
      // classes returned per bucket is capped at 20.
      repeated KAnonymityEquivalenceClass bucket_values = 4;

      // Total number of distinct equivalence classes in this bucket.
      int64 bucket_value_count = 5;
    }

    // Histogram of k-anonymity equivalence classes.
    repeated KAnonymityHistogramBucket equivalence_class_histogram_buckets = 5;
  }

  // Result of the l-diversity computation.
  message LDiversityResult {
    // The set of columns' values that share the same ldiversity value.
    message LDiversityEquivalenceClass {
      // Quasi-identifier values defining the k-anonymity equivalence
      // class. The order is always the same as the original request.
      repeated Value quasi_ids_values = 1;

      // Size of the k-anonymity equivalence class.
      int64 equivalence_class_size = 2;

      // Number of distinct sensitive values in this equivalence class.
      int64 num_distinct_sensitive_values = 3;

      // Estimated frequencies of top sensitive values.
      repeated ValueFrequency top_sensitive_values = 4;
    }

    // Histogram of l-diversity equivalence class sensitive value frequencies.
    message LDiversityHistogramBucket {
      // Lower bound on the sensitive value frequencies of the equivalence
      // classes in this bucket.
      int64 sensitive_value_frequency_lower_bound = 1;

      // Upper bound on the sensitive value frequencies of the equivalence
      // classes in this bucket.
      int64 sensitive_value_frequency_upper_bound = 2;

      // Total number of equivalence classes in this bucket.
      int64 bucket_size = 3;

      // Sample of equivalence classes in this bucket. The total number of
      // classes returned per bucket is capped at 20.
      repeated LDiversityEquivalenceClass bucket_values = 4;

      // Total number of distinct equivalence classes in this bucket.
      int64 bucket_value_count = 5;
    }

    // Histogram of l-diversity equivalence class sensitive value frequencies.
    repeated LDiversityHistogramBucket
        sensitive_value_frequency_histogram_buckets = 5;
  }

  // Result of the reidentifiability analysis. Note that these results are an
  // estimation, not exact values.
  message KMapEstimationResult {
    // A tuple of values for the quasi-identifier columns.
    message KMapEstimationQuasiIdValues {
      // The quasi-identifier values.
      repeated Value quasi_ids_values = 1;

      // The estimated anonymity for these quasi-identifier values.
      int64 estimated_anonymity = 2;
    }

    // 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.
    message KMapEstimationHistogramBucket {
      // Always positive.
      int64 min_anonymity = 1;

      // Always greater than or equal to min_anonymity.
      int64 max_anonymity = 2;

      // Number of records within these anonymity bounds.
      int64 bucket_size = 5;

      // Sample of quasi-identifier tuple values in this bucket. The total
      // number of classes returned per bucket is capped at 20.
      repeated KMapEstimationQuasiIdValues bucket_values = 6;

      // Total number of distinct quasi-identifier tuple values in this bucket.
      int64 bucket_value_count = 7;
    }

    // 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.
    repeated KMapEstimationHistogramBucket k_map_estimation_histogram = 1;
  }

  // Result of the δ-presence computation. Note that these results are an
  // estimation, not exact values.
  message DeltaPresenceEstimationResult {
    // A tuple of values for the quasi-identifier columns.
    message DeltaPresenceEstimationQuasiIdValues {
      // The quasi-identifier values.
      repeated Value quasi_ids_values = 1;

      // 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.
      double estimated_probability = 2;
    }

    // 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.
    message DeltaPresenceEstimationHistogramBucket {
      // Between 0 and 1.
      double min_probability = 1;

      // Always greater than or equal to min_probability.
      double max_probability = 2;

      // Number of records within these probability bounds.
      int64 bucket_size = 5;

      // Sample of quasi-identifier tuple values in this bucket. The total
      // number of classes returned per bucket is capped at 20.
      repeated DeltaPresenceEstimationQuasiIdValues bucket_values = 6;

      // Total number of distinct quasi-identifier tuple values in this bucket.
      int64 bucket_value_count = 7;
    }

    // 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.
    repeated DeltaPresenceEstimationHistogramBucket
        delta_presence_estimation_histogram = 1;
  }

  // Risk analysis options.
  message RequestedRiskAnalysisOptions {
    // The job config for the risk job.
    RiskAnalysisJobConfig job_config = 1;
  }

  // Privacy metric to compute.
  PrivacyMetric requested_privacy_metric = 1;

  // Input dataset to compute metrics over.
  BigQueryTable requested_source_table = 2;

  // Values associated with this metric.
  oneof result {
    // Numerical stats result
    NumericalStatsResult numerical_stats_result = 3;

    // Categorical stats result
    CategoricalStatsResult categorical_stats_result = 4;

    // K-anonymity result
    KAnonymityResult k_anonymity_result = 5;

    // L-divesity result
    LDiversityResult l_diversity_result = 6;

    // K-map result
    KMapEstimationResult k_map_estimation_result = 7;

    // Delta-presence result
    DeltaPresenceEstimationResult delta_presence_estimation_result = 9;
  }

  // The configuration used for this job.
  RequestedRiskAnalysisOptions requested_options = 10;
}

// A value of a field, including its frequency.
message ValueFrequency {
  // A value contained in the field in question.
  Value value = 1;

  // How many times the value is contained in the field.
  int64 count = 2;
}

// 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.
message Value {
  // Value types
  oneof type {
    // integer
    int64 integer_value = 1;

    // float
    double float_value = 2;

    // string
    string string_value = 3;

    // boolean
    bool boolean_value = 4;

    // timestamp
    google.protobuf.Timestamp timestamp_value = 5;

    // time of day
    google.type.TimeOfDay time_value = 6;

    // date
    google.type.Date date_value = 7;

    // day of week
    google.type.DayOfWeek day_of_week_value = 8;
  }
}

// Message for infoType-dependent details parsed from quote.
message QuoteInfo {
  // Object representation of the quote.
  oneof parsed_quote {
    // The date time indicated by the quote.
    DateTime date_time = 2;
  }
}

// Message for a date time object.
// e.g. 2018-01-01, 5th August.
message DateTime {
  // Time zone of the date time object.
  message TimeZone {
    // Set only if the offset can be determined. Positive for time ahead of UTC.
    // E.g. For "UTC-9", this value is -540.
    int32 offset_minutes = 1;
  }

  // One or more of the following must be set.
  // Must be a valid date or time value.
  google.type.Date date = 1;

  // Day of week
  google.type.DayOfWeek day_of_week = 2;

  // Time of day
  google.type.TimeOfDay time = 3;

  // Time zone
  TimeZone time_zone = 4;
}

// The configuration that controls how the data will change.
message DeidentifyConfig {
  // Type of transformation
  oneof transformation {
    // Treat the dataset as free-form text and apply the same free text
    // transformation everywhere.
    InfoTypeTransformations info_type_transformations = 1;

    // Treat the dataset as structured. Transformations can be applied to
    // specific locations within structured datasets, such as transforming
    // a column within a table.
    RecordTransformations record_transformations = 2;

    // Treat the dataset as an image and redact.
    ImageTransformations image_transformations = 4;
  }

  // Mode for handling transformation errors. If left unspecified, the default
  // mode is `TransformationErrorHandling.ThrowError`.
  TransformationErrorHandling transformation_error_handling = 3;
}

// A type of transformation that is applied over images.
message ImageTransformations {
  // Configuration for determining how redaction of images should occur.
  message ImageTransformation {
    // Apply transformation to the selected info_types.
    message SelectedInfoTypes {
      // Required. InfoTypes to apply the transformation to. Required. Provided
      // InfoType must be unique within the ImageTransformations message.
      repeated InfoType info_types = 5 [(google.api.field_behavior) = REQUIRED];
    }

    // Apply transformation to all findings.
    message AllInfoTypes {}

    // Apply to all text.
    message AllText {}

    // Part of the image to transform.
    oneof target {
      // Apply transformation to the selected info_types.
      SelectedInfoTypes selected_info_types = 4;

      // Apply transformation to all findings not specified in other
      // ImageTransformation's selected_info_types. Only one instance is allowed
      // within the ImageTransformations message.
      AllInfoTypes all_info_types = 5;

      // Apply transformation to all text that doesn't match an infoType. Only
      // one instance is allowed within the ImageTransformations message.
      AllText all_text = 6;
    }

    // The color to use when redacting content from an image. If not
    // specified, the default is black.
    Color redaction_color = 3;
  }

  // List of transforms to make.
  repeated ImageTransformation transforms = 2;
}

// How to handle transformation errors during de-identification. A
// transformation error occurs when the requested transformation is incompatible
// with the data. For example, trying to de-identify an IP address using a
// `DateShift` transformation would result in a transformation error, since date
// info cannot be extracted from an IP address.
// Information about any incompatible transformations, and how they were
// handled, is returned in the response as part of the
// `TransformationOverviews`.
message TransformationErrorHandling {
  // Throw an error and fail the request when a transformation error occurs.
  message ThrowError {}

  // Skips the data without modifying it if the requested transformation would
  // cause an error. For example, if a `DateShift` transformation were applied
  // an an IP address, this mode would leave the IP address unchanged in the
  // response.
  message LeaveUntransformed {}

  // How transformation errors should be handled.
  oneof mode {
    // Throw an error
    ThrowError throw_error = 1;

    // Ignore errors
    LeaveUntransformed leave_untransformed = 2;
  }
}

// A rule for transforming a value.
message PrimitiveTransformation {
  // Type of transformation.
  oneof transformation {
    // Replace with a specified value.
    ReplaceValueConfig replace_config = 1;

    // Redact
    RedactConfig redact_config = 2;

    // Mask
    CharacterMaskConfig character_mask_config = 3;

    // Ffx-Fpe
    CryptoReplaceFfxFpeConfig crypto_replace_ffx_fpe_config = 4;

    // Fixed size bucketing
    FixedSizeBucketingConfig fixed_size_bucketing_config = 5;

    // Bucketing
    BucketingConfig bucketing_config = 6;

    // Replace with infotype
    ReplaceWithInfoTypeConfig replace_with_info_type_config = 7;

    // Time extraction
    TimePartConfig time_part_config = 8;

    // Crypto
    CryptoHashConfig crypto_hash_config = 9;

    // Date Shift
    DateShiftConfig date_shift_config = 11;

    // Deterministic Crypto
    CryptoDeterministicConfig crypto_deterministic_config = 12;

    // Replace with a value randomly drawn (with replacement) from a dictionary.
    ReplaceDictionaryConfig replace_dictionary_config = 13;
  }
}

// For use with `Date`, `Timestamp`, and `TimeOfDay`, extract or preserve a
// portion of the value.
message TimePartConfig {
  // Components that make up time.
  enum TimePart {
    // Unused
    TIME_PART_UNSPECIFIED = 0;

    // [0-9999]
    YEAR = 1;

    // [1-12]
    MONTH = 2;

    // [1-31]
    DAY_OF_MONTH = 3;

    // [1-7]
    DAY_OF_WEEK = 4;

    // [1-53]
    WEEK_OF_YEAR = 5;

    // [0-23]
    HOUR_OF_DAY = 6;
  }

  // The part of the time to keep.
  TimePart part_to_extract = 1;
}

// 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/sensitive-data-protection/docs/pseudonymization
// to learn more.
message CryptoHashConfig {
  // The key used by the hash function.
  CryptoKey crypto_key = 1;
}

// 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.
message CryptoDeterministicConfig {
  // The key used by the encryption function. For deterministic encryption
  // using AES-SIV, the provided key is internally expanded to 64 bytes prior to
  // use.
  CryptoKey crypto_key = 1;

  // 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.
  InfoType surrogate_info_type = 2;

  // 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 unstructured `ContentItem`s.
  FieldId context = 3;
}

// Replace each input value with a given `Value`.
message ReplaceValueConfig {
  // Value to replace it with.
  Value new_value = 1;
}

// Replace each input value with a value randomly selected from the dictionary.
message ReplaceDictionaryConfig {
  // Type of dictionary.
  oneof type {
    // A list of words to select from for random replacement. The
    // [limits](https://cloud.google.com/sensitive-data-protection/limits) page
    // contains details about the size limits of dictionaries.
    CustomInfoType.Dictionary.WordList word_list = 1;
  }
}

// Replace each matching finding with the name of the info_type.
message ReplaceWithInfoTypeConfig {}

// 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 '.
message RedactConfig {}

// Characters to skip when doing deidentification of a value. These will be left
// alone and skipped.
message CharsToIgnore {
  // Convenience enum for indicating common characters to not transform.
  enum CommonCharsToIgnore {
    // Unused.
    COMMON_CHARS_TO_IGNORE_UNSPECIFIED = 0;

    // 0-9
    NUMERIC = 1;

    // A-Z
    ALPHA_UPPER_CASE = 2;

    // a-z
    ALPHA_LOWER_CASE = 3;

    // US Punctuation, one of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
    PUNCTUATION = 4;

    // Whitespace character, one of [ \t\n\x0B\f\r]
    WHITESPACE = 5;
  }

  // Type of characters to skip.
  oneof characters {
    // Characters to not transform when masking.
    string characters_to_skip = 1;

    // Common characters to not transform when masking. Useful to avoid removing
    // punctuation.
    CommonCharsToIgnore common_characters_to_ignore = 2;
  }
}

// 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.
message CharacterMaskConfig {
  // 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.
  string masking_character = 1;

  // Number of characters to mask. If not set, all matching chars will be
  // masked. Skipped characters do not count towards this tally.
  //
  // If `number_to_mask` is negative, this denotes inverse masking. Cloud DLP
  // masks all but a number of characters.
  // For example, suppose you have the following values:
  //
  // - `masking_character` is `*`
  // - `number_to_mask` is `-4`
  // - `reverse_order` is `false`
  // - `CharsToIgnore` includes `-`
  // - Input string is `1234-5678-9012-3456`
  //
  // The resulting de-identified string is
  // `****-****-****-3456`. Cloud DLP masks all but the last four characters.
  // If `reverse_order` is `true`, all but the first four characters are masked
  // as `1234-****-****-****`.
  int32 number_to_mask = 2;

  // 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***`.
  bool reverse_order = 3;

  // 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`.
  repeated CharsToIgnore characters_to_ignore = 4;
}

// 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}. For example, 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/sensitive-data-protection/docs/concepts-bucketing to
// learn more.
message FixedSizeBucketingConfig {
  // 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".
  Value lower_bound = 1 [(google.api.field_behavior) = REQUIRED];

  // 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+".
  Value upper_bound = 2 [(google.api.field_behavior) = REQUIRED];

  // 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.
  double bucket_size = 3 [(google.api.field_behavior) = REQUIRED];
}

// 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/sensitive-data-protection/docs/concepts-bucketing to
// learn more.
message BucketingConfig {
  // Bucket is represented as a range, along with replacement values.
  message Bucket {
    // Lower bound of the range, inclusive. Type should be the same as max if
    // used.
    Value min = 1;

    // Upper bound of the range, exclusive; type must match min.
    Value max = 2;

    // Required. Replacement value for this bucket.
    Value replacement_value = 3 [(google.api.field_behavior) = REQUIRED];
  }

  // Set of buckets. Ranges must be non-overlapping.
  repeated Bucket buckets = 1;
}

// 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/sensitive-data-protection/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.
message CryptoReplaceFfxFpeConfig {
  // 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 a particular radix.
  enum FfxCommonNativeAlphabet {
    // Unused.
    FFX_COMMON_NATIVE_ALPHABET_UNSPECIFIED = 0;

    // `[0-9]` (radix of 10)
    NUMERIC = 1;

    // `[0-9A-F]` (radix of 16)
    HEXADECIMAL = 2;

    // `[0-9A-Z]` (radix of 36)
    UPPER_CASE_ALPHA_NUMERIC = 3;

    // `[0-9A-Za-z]` (radix of 62)
    ALPHA_NUMERIC = 4;
  }

  // Required. The key used by the encryption algorithm.
  CryptoKey crypto_key = 1 [(google.api.field_behavior) = REQUIRED];

  // 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 unstructured `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
  FieldId context = 2;

  // Choose an alphabet which the data being transformed will be made up of.
  oneof alphabet {
    // Common alphabets.
    FfxCommonNativeAlphabet common_alphabet = 4;

    // This is supported by mapping these to the alphanumeric characters
    // that the FFX mode natively supports. This happens before/after
    // encryption/decryption.
    // Each character listed must appear only once.
    // Number of characters must be in the range [2, 95].
    // This must be encoded as ASCII.
    // The order of characters does not matter.
    // The full list of allowed characters is:
    // <code>0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    // ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/</code>
    string custom_alphabet = 5;

    // The native way to select the alphabet. Must be in the range [2, 95].
    int32 radix = 6;
  }

  // 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`](https://cloud.google.com/sensitive-data-protection/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
  InfoType surrogate_info_type = 8;
}

// This is a data encryption key (DEK) (as opposed to
// a key encryption key (KEK) stored by Cloud Key Management Service
// (Cloud KMS).
// When using Cloud KMS to wrap or unwrap a DEK, be sure to set an appropriate
// IAM policy on the KEK to ensure an attacker cannot
// unwrap the DEK.
message CryptoKey {
  // Sources of crypto keys.
  oneof source {
    // Transient crypto key
    TransientCryptoKey transient = 1;

    // Unwrapped crypto key
    UnwrappedCryptoKey unwrapped = 2;

    // Key wrapped using Cloud KMS
    KmsWrappedCryptoKey kms_wrapped = 3;
  }
}

// Use this to have a random data crypto key generated.
// It will be discarded after the request finishes.
message TransientCryptoKey {
  // 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).
  string name = 1 [(google.api.field_behavior) = REQUIRED];
}

// Using raw keys is prone to security risks due to accidentally
// leaking the key. Choose another type of key if possible.
message UnwrappedCryptoKey {
  // Required. A 128/192/256 bit key.
  bytes key = 1 [(google.api.field_behavior) = REQUIRED];
}

// Include to use an existing data crypto key wrapped by KMS.
// The wrapped key must be a 128-, 192-, or 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
//
// For more information, see [Creating a wrapped key]
// (https://cloud.google.com/sensitive-data-protection/docs/create-wrapped-key).
//
// Note: When you use Cloud KMS for cryptographic operations,
// [charges apply](https://cloud.google.com/kms/pricing).
message KmsWrappedCryptoKey {
  // Required. The wrapped data crypto key.
  bytes wrapped_key = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The resource name of the KMS CryptoKey to use for unwrapping.
  string crypto_key_name = 2 [(google.api.field_behavior) = REQUIRED];
}

// Shifts dates by random number of days, with option to be consistent for the
// same context. See
// https://cloud.google.com/sensitive-data-protection/docs/concepts-date-shifting
// to learn more.
message DateShiftConfig {
  // 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.
  int32 upper_bound_days = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. For example, -5 means shift date to at most 5 days back in the
  // past.
  int32 lower_bound_days = 2 [(google.api.field_behavior) = REQUIRED];

  // 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.
  FieldId context = 3;

  // Method for calculating shift that takes context into consideration. If
  // set, must also set context. Can only be applied to table items.
  oneof method {
    // Causes the shift to be computed based on this key and the context. This
    // results in the same shift for the same context and crypto_key. If
    // set, must also set context. Can only be applied to table items.
    CryptoKey crypto_key = 4;
  }
}

// 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.
message InfoTypeTransformations {
  // A transformation to apply to text that is identified as a specific
  // info_type.
  message InfoTypeTransformation {
    // 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`.
    repeated InfoType info_types = 1;

    // Required. Primitive transformation to apply to the infoType.
    PrimitiveTransformation primitive_transformation = 2
        [(google.api.field_behavior) = REQUIRED];
  }

  // Required. Transformation for each infoType. Cannot specify more than one
  // for a given infoType.
  repeated InfoTypeTransformation transformations = 1
      [(google.api.field_behavior) = REQUIRED];
}

// The transformation to apply to the field.
message FieldTransformation {
  // Required. Input field(s) to apply the transformation to.
  // When you have columns that reference their position within a list,
  // omit the index from the FieldId. FieldId name matching ignores the index.
  // For example, instead of "contact.nums[0].type", use "contact.nums.type".
  repeated FieldId fields = 1 [(google.api.field_behavior) = REQUIRED];

  // 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.
  RecordCondition condition = 3;

  // Transformation to apply. [required]
  oneof transformation {
    // Apply the transformation to the entire field.
    PrimitiveTransformation primitive_transformation = 4;

    // Treat the contents of the field as free text, and selectively
    // transform content that matches an `InfoType`.
    InfoTypeTransformations info_type_transformations = 5;
  }
}

// A type of transformation that is applied over structured data such as a
// table.
message RecordTransformations {
  // Transform the record by applying various field transformations.
  repeated FieldTransformation field_transformations = 1;

  // Configuration defining which records get suppressed entirely. Records that
  // match any suppression rule are omitted from the output.
  repeated RecordSuppression record_suppressions = 2;
}

// Configuration to suppress records whose suppression conditions evaluate to
// true.
message RecordSuppression {
  // A condition that when it evaluates to true will result in the record being
  // evaluated to be suppressed from the transformed content.
  RecordCondition condition = 1;
}

// A condition for determining whether a transformation should be applied to
// a field.
message RecordCondition {
  // 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.
  message Condition {
    // Required. Field within the record this condition is evaluated against.
    FieldId field = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. Operator used to compare the field or infoType to the value.
    RelationalOperator operator = 3 [(google.api.field_behavior) = REQUIRED];

    // Value to compare against. [Mandatory, except for `EXISTS` tests.]
    Value value = 4;
  }

  // A collection of conditions.
  message Conditions {
    // A collection of conditions.
    repeated Condition conditions = 1;
  }

  // An expression, consisting of an operator and conditions.
  message Expressions {
    // Logical operators for conditional checks.
    enum LogicalOperator {
      // Unused
      LOGICAL_OPERATOR_UNSPECIFIED = 0;

      // Conditional AND
      AND = 1;
    }

    // The operator to apply to the result of conditions. Default and currently
    // only supported value is `AND`.
    LogicalOperator logical_operator = 1;

    // Expression types.
    oneof type {
      // Conditions to apply to the expression.
      Conditions conditions = 3;
    }
  }

  // An expression.
  Expressions expressions = 3;
}

// Overview of the modifications that occurred.
message TransformationOverview {
  // Total size in bytes that were transformed in some way.
  int64 transformed_bytes = 2;

  // Transformations applied to the dataset.
  repeated TransformationSummary transformation_summaries = 3;
}

// Summary of a single transformation.
// Only one of 'transformation', 'field_transformation', or 'record_suppress'
// will be set.
message TransformationSummary {
  // Possible outcomes of transformations.
  enum TransformationResultCode {
    // Unused
    TRANSFORMATION_RESULT_CODE_UNSPECIFIED = 0;

    // Transformation completed without an error.
    SUCCESS = 1;

    // Transformation had an error.
    ERROR = 2;
  }

  // A collection that informs the user the number of times a particular
  // `TransformationResultCode` and error details occurred.
  message SummaryResult {
    // Number of transformations counted by this result.
    int64 count = 1;

    // Outcome of the transformation.
    TransformationResultCode code = 2;

    // A place for warnings or errors to show up if a transformation didn't
    // work as expected.
    string details = 3;
  }

  // Set if the transformation was limited to a specific InfoType.
  InfoType info_type = 1;

  // Set if the transformation was limited to a specific FieldId.
  FieldId field = 2;

  // The specific transformation these stats apply to.
  PrimitiveTransformation transformation = 3;

  // 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.
  repeated FieldTransformation field_transformations = 5;

  // The specific suppression option these stats apply to.
  RecordSuppression record_suppress = 6;

  // Collection of all transformations that took place or had an error.
  repeated SummaryResult results = 4;

  // Total size in bytes that were transformed in some way.
  int64 transformed_bytes = 7;
}

// A flattened description of a `PrimitiveTransformation` or
// `RecordSuppression`.
message TransformationDescription {
  // The transformation type.
  TransformationType type = 1;

  // A description of the transformation. This is empty for a
  // RECORD_SUPPRESSION, or is the output of calling toString() on the
  // `PrimitiveTransformation` protocol buffer message for any other type of
  // transformation.
  string description = 2;

  // A human-readable string representation of the `RecordCondition`
  // corresponding to this transformation. Set if a `RecordCondition` was used
  // to determine whether or not to apply this transformation.
  //
  // Examples:
  //     * (age_field > 85)
  //     * (age_field <= 18)
  //     * (zip_field exists)
  //     * (zip_field == 01234) && (city_field != "Springville")
  //     * (zip_field == 01234) && (age_field <= 18) && (city_field exists)
  string condition = 3;

  // Set if the transformation was limited to a specific `InfoType`.
  InfoType info_type = 4;
}

// Details about a single transformation. This object contains a description of
// the transformation, information about whether the transformation was
// successfully applied, and the precise location where the transformation
// occurred. These details are stored in a user-specified BigQuery table.
message TransformationDetails {
  // The name of the job that completed the transformation.
  string resource_name = 1;

  // The top level name of the container where the transformation is located
  // (this will be the source file name or table name).
  string container_name = 2;

  // Description of transformation. This would only contain more than one
  // element if there were multiple matching transformations and which one to
  // apply was ambiguous. Not set for states that contain no transformation,
  // currently only state that contains no transformation is
  // TransformationResultStateType.METADATA_UNRETRIEVABLE.
  repeated TransformationDescription transformation = 3;

  // Status of the transformation, if transformation was not successful, this
  // will specify what caused it to fail, otherwise it will show that the
  // transformation was successful.
  TransformationResultStatus status_details = 4;

  // The number of bytes that were transformed. If transformation was
  // unsuccessful or did not take place because there was no content to
  // transform, this will be zero.
  int64 transformed_bytes = 5;

  // The precise location of the transformed content in the original container.
  TransformationLocation transformation_location = 6;
}

// Specifies the location of a transformation.
message TransformationLocation {
  // Location type.
  oneof location_type {
    // For infotype transformations, link to the corresponding findings ID so
    // that location information does not need to be duplicated. Each findings
    // ID correlates to an entry in the findings output table, this table only
    // gets created when users specify to save findings (add the save findings
    // action to the request).
    string finding_id = 1;

    // For record transformations, provide a field and container information.
    RecordTransformation record_transformation = 2;
  }

  // Information about the functionality of the container where this finding
  // occurred, if available.
  TransformationContainerType container_type = 3;
}

// The field in a record to transform.
message RecordTransformation {
  // For record transformations, provide a field.
  FieldId field_id = 1;

  // Findings container modification timestamp, if applicable.
  google.protobuf.Timestamp container_timestamp = 2;

  // Container version, if available ("generation" for Cloud Storage).
  string container_version = 3;
}

// The outcome of a transformation.
message TransformationResultStatus {
  // Transformation result status type, this will be either SUCCESS, or it will
  // be the reason for why the transformation was not completely successful.
  TransformationResultStatusType result_status_type = 1;

  // Detailed error codes and messages
  google.rpc.Status details = 2;
}

// Enum of possible outcomes of transformations. SUCCESS if transformation and
// storing of transformation was successful, otherwise, reason for not
// transforming.
enum TransformationResultStatusType {
  // Unused.
  STATE_TYPE_UNSPECIFIED = 0;

  // This will be set when a finding could not be transformed (i.e. outside user
  // set bucket range).
  INVALID_TRANSFORM = 1;

  // This will be set when a BigQuery transformation was successful but could
  // not be stored back in BigQuery because the transformed row exceeds
  // BigQuery's max row size.
  BIGQUERY_MAX_ROW_SIZE_EXCEEDED = 2;

  // This will be set when there is a finding in the custom metadata of a file,
  // but at the write time of the transformed file, this key / value pair is
  // unretrievable.
  METADATA_UNRETRIEVABLE = 3;

  // This will be set when the transformation and storing of it is successful.
  SUCCESS = 4;
}

// Describes functionality of a given container in its original format.
enum TransformationContainerType {
  // Unused.
  TRANSFORM_UNKNOWN_CONTAINER = 0;

  // Body of a file.
  TRANSFORM_BODY = 1;

  // Metadata for a file.
  TRANSFORM_METADATA = 2;

  // A table.
  TRANSFORM_TABLE = 3;
}

// An enum of rules that can be used to transform a value. Can be a
// record suppression, or one of the transformation rules specified under
// `PrimitiveTransformation`.
enum TransformationType {
  // Unused
  TRANSFORMATION_TYPE_UNSPECIFIED = 0;

  // Record suppression
  RECORD_SUPPRESSION = 1;

  // Replace value
  REPLACE_VALUE = 2;

  // Replace value using a dictionary.
  REPLACE_DICTIONARY = 15;

  // Redact
  REDACT = 3;

  // Character mask
  CHARACTER_MASK = 4;

  // FFX-FPE
  CRYPTO_REPLACE_FFX_FPE = 5;

  // Fixed size bucketing
  FIXED_SIZE_BUCKETING = 6;

  // Bucketing
  BUCKETING = 7;

  // Replace with info type
  REPLACE_WITH_INFO_TYPE = 8;

  // Time part
  TIME_PART = 9;

  // Crypto hash
  CRYPTO_HASH = 10;

  // Date shift
  DATE_SHIFT = 12;

  // Deterministic crypto
  CRYPTO_DETERMINISTIC_CONFIG = 13;

  // Redact image
  REDACT_IMAGE = 14;
}

// Config for storing transformation details.
message TransformationDetailsStorageConfig {
  // Location to store the transformation summary.
  oneof type {
    // The BigQuery table in which to store the output. This may be an existing
    // table or in a new table in an existing dataset.
    // If table_id is not set a new one will be generated for you with the
    // following format:
    // dlp_googleapis_transformation_details_yyyy_mm_dd_[dlp_job_id]. Pacific
    // time zone will be used for generating the date details.
    BigQueryTable table = 1;
  }
}

// Schedule for inspect job triggers.
message Schedule {
  // Type of schedule.
  oneof option {
    // With this option a job is started on a regular periodic basis. For
    // example: every day (86400 seconds).
    //
    // A scheduled start time will be skipped if the previous
    // execution has not ended when its scheduled time occurs.
    //
    // This value must be set to a time duration greater than or equal
    // to 1 day and can be no longer than 60 days.
    google.protobuf.Duration recurrence_period_duration = 1;
  }
}

// Job trigger option for hybrid jobs. Jobs must be manually created
// and finished.
message Manual {}

// 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/sensitive-data-protection/docs/concepts-templates to
// learn more.
message InspectTemplate {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/InspectTemplate"
    pattern: "organizations/{organization}/inspectTemplates/{inspect_template}"
    pattern: "projects/{project}/inspectTemplates/{inspect_template}"
    pattern: "organizations/{organization}/locations/{location}/inspectTemplates/{inspect_template}"
    pattern: "projects/{project}/locations/{location}/inspectTemplates/{inspect_template}"
  };

  // 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`;
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Display name (max 256 chars).
  string display_name = 2;

  // Short description (max 256 chars).
  string description = 3;

  // Output only. The creation timestamp of an inspectTemplate.
  google.protobuf.Timestamp create_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The last update timestamp of an inspectTemplate.
  google.protobuf.Timestamp update_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // The core content of the template. Configuration of the scanning process.
  InspectConfig inspect_config = 6;
}

// DeidentifyTemplates contains instructions on how to de-identify content.
// See
// https://cloud.google.com/sensitive-data-protection/docs/concepts-templates to
// learn more.
message DeidentifyTemplate {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/DeidentifyTemplate"
    pattern: "organizations/{organization}/deidentifyTemplates/{deidentify_template}"
    pattern: "projects/{project}/deidentifyTemplates/{deidentify_template}"
    pattern: "organizations/{organization}/locations/{location}/deidentifyTemplates/{deidentify_template}"
    pattern: "projects/{project}/locations/{location}/deidentifyTemplates/{deidentify_template}"
  };

  // 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`
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Display name (max 256 chars).
  string display_name = 2;

  // Short description (max 256 chars).
  string description = 3;

  // Output only. The creation timestamp of an inspectTemplate.
  google.protobuf.Timestamp create_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The last update timestamp of an inspectTemplate.
  google.protobuf.Timestamp update_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // The core content of the template.
  DeidentifyConfig deidentify_config = 6;
}

// Details information about an error encountered during job execution or
// the results of an unsuccessful activation of the JobTrigger.
message Error {
  // Detailed error codes and messages.
  google.rpc.Status details = 1;

  // The times the error occurred. List includes the oldest timestamp and the
  // last 9 timestamps.
  repeated google.protobuf.Timestamp timestamps = 2;
}

// Contains a configuration to make dlp api calls on a repeating basis.
// See
// https://cloud.google.com/sensitive-data-protection/docs/concepts-job-triggers
// to learn more.
message JobTrigger {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/JobTrigger"
    pattern: "projects/{project}/jobTriggers/{job_trigger}"
    pattern: "projects/{project}/locations/{location}/jobTriggers/{job_trigger}"
  };

  // What event needs to occur for a new job to be started.
  message Trigger {
    // What event needs to occur for a new job to be started.
    oneof trigger {
      // Create a job on a repeating basis based on the elapse of time.
      Schedule schedule = 1;

      // For use with hybrid jobs. Jobs must be manually created and finished.
      Manual manual = 2;
    }
  }

  // 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.
  enum Status {
    // Unused.
    STATUS_UNSPECIFIED = 0;

    // Trigger is healthy.
    HEALTHY = 1;

    // Trigger is temporarily paused.
    PAUSED = 2;

    // Trigger is cancelled and can not be resumed.
    CANCELLED = 3;
  }

  // Unique resource name for the triggeredJob, assigned by the service when the
  // triggeredJob is created, for example
  // `projects/dlp-test-project/jobTriggers/53234423`.
  string name = 1;

  // Display name (max 100 chars)
  string display_name = 2;

  // User provided description (max 256 chars)
  string description = 3;

  // The configuration details for the specific type of job to run.
  oneof job {
    // For inspect jobs, a snapshot of the configuration.
    InspectJobConfig inspect_job = 4;
  }

  // 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.
  repeated Trigger triggers = 5;

  // 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.
  repeated Error errors = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The creation timestamp of a triggeredJob.
  google.protobuf.Timestamp create_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The last update timestamp of a triggeredJob.
  google.protobuf.Timestamp update_time = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp of the last time this trigger executed.
  google.protobuf.Timestamp last_run_time = 9
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. A status for this trigger.
  Status status = 10 [(google.api.field_behavior) = REQUIRED];
}

// A task to execute on the completion of a job.
// See https://cloud.google.com/sensitive-data-protection/docs/concepts-actions
// to learn more.
message Action {
  // 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
  message SaveFindings {
    // Location to store findings outside of DLP.
    OutputStorageConfig output_config = 1;
  }

  // Publish a message into a 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`](https://cloud.google.com/sensitive-data-protection/docs/reference/rest/v2/projects.dlpJobs#DlpJob).
  // Compatible with: Inspect, Risk
  message PublishToPubSub {
    // 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}.
    string topic = 1;
  }

  // Publish the result summary of a DlpJob to [Security Command
  // Center](https://cloud.google.com/security-command-center). This action is
  // available for only projects that belong to an organization. This action
  // publishes the count of finding instances and their infoTypes. The summary
  // of findings are persisted in Security Command Center and are governed by
  // [service-specific policies for Security Command
  // Center](https://cloud.google.com/terms/service-terms). Only a single
  // instance of this action can be specified. Compatible with: Inspect
  message PublishSummaryToCscc {}

  // Publish findings of a DlpJob to Data Catalog. In Data Catalog, tag
  // templates are applied to the resource that Cloud DLP scanned. Data
  // Catalog tag templates are stored in the same project and region where the
  // BigQuery table exists. For Cloud DLP to create and apply the tag template,
  // the Cloud DLP service agent must have the
  // `roles/datacatalog.tagTemplateOwner` permission on the project. The tag
  // template contains fields summarizing the results of the DlpJob. Any field
  // values previously written by another DlpJob are deleted. [InfoType naming
  // patterns][google.privacy.dlp.v2.InfoType] are strictly enforced when using
  // this feature.
  //
  // Findings are persisted in Data Catalog storage and are governed by
  // service-specific policies for Data Catalog. For more information, see
  // [Service Specific Terms](https://cloud.google.com/terms/service-terms).
  //
  // Only a single instance of this action can be specified. This action is
  // allowed only if all resources being scanned are BigQuery tables.
  // Compatible with: Inspect
  message PublishFindingsToCloudDataCatalog {}

  // Create a de-identified copy of the requested table or files.
  //
  // A TransformationDetail will be created for each transformation.
  //
  // If any rows in BigQuery are skipped during de-identification
  // (transformation errors or row size exceeds BigQuery insert API limits) they
  // are placed in the failure output table. If the original row exceeds
  // the BigQuery insert API limit it will be truncated when written to the
  // failure output table. The failure output table can be set in the
  // action.deidentify.output.big_query_output.deidentified_failure_output_table
  // field, if no table is set, a table will be automatically created in the
  // same project and dataset as the original table.
  //
  // Compatible with: Inspect
  message Deidentify {
    // User specified deidentify templates and configs for structured,
    // unstructured, and image files.
    TransformationConfig transformation_config = 7;

    // Config for storing transformation details. This is separate from the
    // de-identified content, and contains metadata about the successful
    // transformations and/or failures that occurred while de-identifying. This
    // needs to be set in order for users to access information about the status
    // of each transformation (see
    // [TransformationDetails][google.privacy.dlp.v2.TransformationDetails]
    // message for more information about what is noted).
    TransformationDetailsStorageConfig transformation_details_storage_config =
        3;

    // Where to store the output.
    oneof output {
      // Required. User settable Cloud Storage bucket and folders to store
      // de-identified files. This field must be set for cloud storage
      // deidentification. The output Cloud Storage bucket must be different
      // from the input bucket. De-identified files will overwrite files in the
      // output path.
      //
      // Form of: gs://bucket/folder/ or gs://bucket
      string cloud_storage_output = 9 [(google.api.field_behavior) = REQUIRED];
    }

    // List of user-specified file type groups to transform. If specified, only
    // the files with these filetypes will be transformed. If empty, all
    // supported files will be transformed. Supported types may be automatically
    // added over time. If a file type is set in this field that isn't supported
    // by the Deidentify action then the job will fail and will not be
    // successfully created/started. Currently the only filetypes supported are:
    // IMAGES, TEXT_FILES, CSV, TSV.
    repeated FileType file_types_to_transform = 8;
  }

  // Sends an email when the job completes. The email goes to IAM project owners
  // and technical [Essential
  // Contacts](https://cloud.google.com/resource-manager/docs/managing-notification-contacts).
  message JobNotificationEmails {}

  // 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'.
  message PublishToStackdriver {}

  // Extra events to execute after the job has finished.
  oneof action {
    // Save resulting findings in a provided location.
    SaveFindings save_findings = 1;

    // Publish a notification to a Pub/Sub topic.
    PublishToPubSub pub_sub = 2;

    // Publish summary to Cloud Security Command Center (Alpha).
    PublishSummaryToCscc publish_summary_to_cscc = 3;

    // Publish findings to Cloud Datahub.
    PublishFindingsToCloudDataCatalog publish_findings_to_cloud_data_catalog =
        5;

    // Create a de-identified copy of the input data.
    Deidentify deidentify = 7;

    // Sends an email when the job completes. The email goes to IAM project
    // owners and technical [Essential
    // Contacts](https://cloud.google.com/resource-manager/docs/managing-notification-contacts).
    JobNotificationEmails job_notification_emails = 8;

    // Enable Stackdriver metric dlp.googleapis.com/finding_count.
    PublishToStackdriver publish_to_stackdriver = 9;
  }
}

// User specified templates and configs for how to deidentify structured,
// unstructures, and image files. User must provide either a unstructured
// deidentify template or at least one redact image config.
message TransformationConfig {
  // De-identify template.
  // If this template is specified, it will serve as the default de-identify
  // template. This template cannot contain `record_transformations` since it
  // can be used for unstructured content such as free-form text files. If this
  // template is not set, a default `ReplaceWithInfoTypeConfig` will be used to
  // de-identify unstructured content.
  string deidentify_template = 1;

  // Structured de-identify template.
  // If this template is specified, it will serve as the de-identify template
  // for structured content such as delimited files and tables. If this template
  // is not set but the `deidentify_template` is set, then `deidentify_template`
  // will also apply to the structured content. If neither template is set, a
  // default `ReplaceWithInfoTypeConfig` will be used to de-identify structured
  // content.
  string structured_deidentify_template = 2;

  // Image redact template.
  // If this template is specified, it will serve as the de-identify template
  // for images. If this template is not set, all findings in the image will be
  // redacted with a black box.
  string image_redact_template = 4;
}

// Request message for CreateInspectTemplate.
message CreateInspectTemplateRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on the scope of the request
  // (project or organization) and whether you have [specified a processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  // + Organizations scope, location specified:<br/>
  //   `organizations/`<var>ORG_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Organizations scope, no location specified (defaults to global):<br/>
  //   `organizations/`<var>ORG_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/InspectTemplate"
    }
  ];

  // Required. The InspectTemplate to create.
  InspectTemplate inspect_template = 2 [(google.api.field_behavior) = REQUIRED];

  // 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.
  string template_id = 3;

  // Deprecated. This field has no effect.
  string location_id = 4;
}

// Request message for UpdateInspectTemplate.
message UpdateInspectTemplateRequest {
  // Required. Resource name of organization and inspectTemplate to be updated,
  // for example `organizations/433245324/inspectTemplates/432452342` or
  // projects/project-id/inspectTemplates/432452342.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/InspectTemplate"
    }
  ];

  // New InspectTemplate value.
  InspectTemplate inspect_template = 2;

  // Mask to control which fields get updated.
  google.protobuf.FieldMask update_mask = 3;
}

// Request message for GetInspectTemplate.
message GetInspectTemplateRequest {
  // Required. Resource name of the organization and inspectTemplate to be read,
  // for example `organizations/433245324/inspectTemplates/432452342` or
  // projects/project-id/inspectTemplates/432452342.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/InspectTemplate"
    }
  ];
}

// Request message for ListInspectTemplates.
message ListInspectTemplatesRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on the scope of the request
  // (project or organization) and whether you have [specified a processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  // + Organizations scope, location specified:<br/>
  //   `organizations/`<var>ORG_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Organizations scope, no location specified (defaults to global):<br/>
  //   `organizations/`<var>ORG_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/InspectTemplate"
    }
  ];

  // Page token to continue retrieval. Comes from the previous call
  // to `ListInspectTemplates`.
  string page_token = 2;

  // Size of the page. This value can be limited by the server. If zero server
  // returns a page of max size 100.
  int32 page_size = 3;

  // Comma separated list of fields to order by,
  // followed by `asc` or `desc` postfix. This list is case insensitive. The
  // 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 the time the template was created.
  // - `update_time`: corresponds to the time the template was last updated.
  // - `name`: corresponds to the template's name.
  // - `display_name`: corresponds to the template's display name.
  string order_by = 4;

  // Deprecated. This field has no effect.
  string location_id = 5;
}

// Response message for ListInspectTemplates.
message ListInspectTemplatesResponse {
  // List of inspectTemplates, up to page_size in ListInspectTemplatesRequest.
  repeated InspectTemplate inspect_templates = 1;

  // If the next page is available then the next page token to be used in the
  // following ListInspectTemplates request.
  string next_page_token = 2;
}

// Request message for DeleteInspectTemplate.
message DeleteInspectTemplateRequest {
  // Required. Resource name of the organization and inspectTemplate to be
  // deleted, for example `organizations/433245324/inspectTemplates/432452342`
  // or projects/project-id/inspectTemplates/432452342.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/InspectTemplate"
    }
  ];
}

// Request message for CreateJobTrigger.
message CreateJobTriggerRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on whether you have [specified a
  // processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/JobTrigger"
    }
  ];

  // Required. The JobTrigger to create.
  JobTrigger job_trigger = 2 [(google.api.field_behavior) = REQUIRED];

  // 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.
  string trigger_id = 3;

  // Deprecated. This field has no effect.
  string location_id = 4;
}

// Request message for ActivateJobTrigger.
message ActivateJobTriggerRequest {
  // Required. Resource name of the trigger to activate, for example
  // `projects/dlp-test-project/jobTriggers/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/JobTrigger" }
  ];
}

// Request message for UpdateJobTrigger.
message UpdateJobTriggerRequest {
  // Required. Resource name of the project and the triggeredJob, for example
  // `projects/dlp-test-project/jobTriggers/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/JobTrigger" }
  ];

  // New JobTrigger value.
  JobTrigger job_trigger = 2;

  // Mask to control which fields get updated.
  google.protobuf.FieldMask update_mask = 3;
}

// Request message for GetJobTrigger.
message GetJobTriggerRequest {
  // Required. Resource name of the project and the triggeredJob, for example
  // `projects/dlp-test-project/jobTriggers/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/JobTrigger" }
  ];
}

// Request message for CreateDiscoveryConfig.
message CreateDiscoveryConfigRequest {
  // Required. Parent resource name.
  //
  // The format of this value is as follows:
  // `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/DiscoveryConfig"
    }
  ];

  // Required. The DiscoveryConfig to create.
  DiscoveryConfig discovery_config = 2 [(google.api.field_behavior) = REQUIRED];

  // The config 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.
  string config_id = 3;
}

// Request message for UpdateDiscoveryConfig.
message UpdateDiscoveryConfigRequest {
  // Required. Resource name of the project and the configuration, for example
  // `projects/dlp-test-project/discoveryConfigs/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/DiscoveryConfig"
    }
  ];

  // Required. New DiscoveryConfig value.
  DiscoveryConfig discovery_config = 2 [(google.api.field_behavior) = REQUIRED];

  // Mask to control which fields get updated.
  google.protobuf.FieldMask update_mask = 3;
}

// Request message for GetDiscoveryConfig.
message GetDiscoveryConfigRequest {
  // Required. Resource name of the project and the configuration, for example
  // `projects/dlp-test-project/discoveryConfigs/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/DiscoveryConfig"
    }
  ];
}

// Request message for ListDiscoveryConfigs.
message ListDiscoveryConfigsRequest {
  // Required. Parent resource name.
  //
  // The format of this value is as follows:
  // `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/DiscoveryConfig"
    }
  ];

  // Page token to continue retrieval. Comes from the previous call
  // to ListDiscoveryConfigs. `order_by` field must not
  // change for subsequent calls.
  string page_token = 2;

  // Size of the page. This value can be limited by a server.
  int32 page_size = 3;

  // Comma separated list of config fields to order by,
  // followed by `asc` or `desc` postfix. This list is case insensitive. The
  // default sorting order is ascending. Redundant space characters are
  // insignificant.
  //
  // Example: `name asc,update_time, create_time desc`
  //
  // Supported fields are:
  //
  // - `last_run_time`: corresponds to the last time the DiscoveryConfig ran.
  // - `name`: corresponds to the DiscoveryConfig's name.
  // - `status`: corresponds to DiscoveryConfig's status.
  string order_by = 4;
}

// Response message for ListDiscoveryConfigs.
message ListDiscoveryConfigsResponse {
  // List of configs, up to page_size in ListDiscoveryConfigsRequest.
  repeated DiscoveryConfig discovery_configs = 1;

  // If the next page is available then this value is the next page token to be
  // used in the following ListDiscoveryConfigs request.
  string next_page_token = 2;
}

// Request message for DeleteDiscoveryConfig.
message DeleteDiscoveryConfigRequest {
  // Required. Resource name of the project and the config, for example
  // `projects/dlp-test-project/discoveryConfigs/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/DiscoveryConfig"
    }
  ];
}

// Request message for CreateDlpJobRequest. Used to initiate long running
// jobs such as calculating risk metrics or inspecting Google Cloud
// Storage.
message CreateDlpJobRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on whether you have [specified a
  // processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/DlpJob"
    }
  ];

  // The configuration details for the specific type of job to run.
  oneof job {
    // An inspection job scans a storage repository for InfoTypes.
    InspectJobConfig inspect_job = 2;

    // A risk analysis job calculates re-identification risk metrics for a
    // BigQuery table.
    RiskAnalysisJobConfig risk_job = 3;
  }

  // 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.
  string job_id = 4;

  // Deprecated. This field has no effect.
  string location_id = 5;
}

// Request message for ListJobTriggers.
message ListJobTriggersRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on whether you have [specified a
  // processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/JobTrigger"
    }
  ];

  // Page token to continue retrieval. Comes from the previous call
  // to ListJobTriggers. `order_by` field must not
  // change for subsequent calls.
  string page_token = 2;

  // Size of the page. This value can be limited by a server.
  int32 page_size = 3;

  // Comma separated list of triggeredJob fields to order by,
  // followed by `asc` or `desc` postfix. This list is case insensitive. The
  // 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 the time the JobTrigger was created.
  // - `update_time`: corresponds to the time the JobTrigger was last updated.
  // - `last_run_time`: corresponds to the last time the JobTrigger ran.
  // - `name`: corresponds to the JobTrigger's name.
  // - `display_name`: corresponds to the JobTrigger's display name.
  // - `status`: corresponds to JobTrigger's status.
  string order_by = 4;

  // 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 triggers:
  //     - `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.
  string filter = 5;

  // The type of jobs. Will use `DlpJobType.INSPECT` if not set.
  DlpJobType type = 6;

  // Deprecated. This field has no effect.
  string location_id = 7;
}

// Response message for ListJobTriggers.
message ListJobTriggersResponse {
  // List of triggeredJobs, up to page_size in ListJobTriggersRequest.
  repeated JobTrigger job_triggers = 1;

  // If the next page is available then this value is the next page token to be
  // used in the following ListJobTriggers request.
  string next_page_token = 2;
}

// Request message for DeleteJobTrigger.
message DeleteJobTriggerRequest {
  // Required. Resource name of the project and the triggeredJob, for example
  // `projects/dlp-test-project/jobTriggers/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/JobTrigger" }
  ];
}

// Controls what and how to inspect for findings.
message InspectJobConfig {
  // The data to scan.
  StorageConfig storage_config = 1;

  // How and what to scan for.
  InspectConfig inspect_config = 2;

  // 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.
  string inspect_template_name = 3;

  // Actions to execute at the completion of the job.
  repeated Action actions = 4;
}

// A task to execute when a data profile has been generated.
message DataProfileAction {
  // If set, the detailed data profiles will be persisted to the location
  // of your choice whenever updated.
  message Export {
    // Store all table and column profiles in an existing table or a new table
    // in an existing dataset. Each re-generation will result in a new row in
    // BigQuery.
    BigQueryTable profile_table = 1;
  }

  // Send a Pub/Sub message into the given Pub/Sub topic to connect other
  // systems to data profile generation. The message payload data will
  // be the byte serialization of `DataProfilePubSubMessage`.
  message PubSubNotification {
    // The levels of detail that can be included in the Pub/Sub message.
    enum DetailLevel {
      // Unused.
      DETAIL_LEVEL_UNSPECIFIED = 0;

      // The full table data profile.
      TABLE_PROFILE = 1;

      // The resource name of the table.
      RESOURCE_NAME = 2;
    }

    // Cloud Pub/Sub topic to send notifications to.
    // Format is projects/{project}/topics/{topic}.
    string topic = 1;

    // The type of event that triggers a Pub/Sub. At most one
    // `PubSubNotification` per EventType is permitted.
    EventType event = 2;

    // Conditions (e.g., data risk or sensitivity level) for triggering a
    // Pub/Sub.
    DataProfilePubSubCondition pubsub_condition = 3;

    // How much data to include in the Pub/Sub message. If the user wishes to
    // limit the size of the message, they can use resource_name and fetch the
    // profile fields they wish to. Per table profile (not per column).
    DetailLevel detail_of_message = 4;
  }

  // Types of event that can trigger an action.
  enum EventType {
    // Unused.
    EVENT_TYPE_UNSPECIFIED = 0;

    // New profile (not a re-profile).
    NEW_PROFILE = 1;

    // Changed one of the following profile metrics:
    // * Table data risk score
    // * Table sensitivity score
    // * Table resource visibility
    // * Table encryption type
    // * Table predicted infoTypes
    // * Table other infoTypes
    CHANGED_PROFILE = 2;

    // Table data risk score or sensitivity score increased.
    SCORE_INCREASED = 3;

    // A user (non-internal) error occurred.
    ERROR_CHANGED = 4;
  }

  // Type of action to execute when a profile is generated.
  oneof action {
    // Export data profiles into a provided location.
    Export export_data = 1;

    // Publish a message into the Pub/Sub topic.
    PubSubNotification pub_sub_notification = 2;
  }
}

// Configuration for setting up a job to scan resources for profile generation.
// Only one data profile configuration may exist per organization, folder,
// or project.
//
// The generated data profiles are retained according to the
// [data retention policy]
// (https://cloud.google.com/sensitive-data-protection/docs/data-profiles#retention).
message DataProfileJobConfig {
  // The data to scan.
  DataProfileLocation location = 1;

  // The project that will run the scan. The DLP service
  // account that exists within this project must have access to all resources
  // that are profiled, and the Cloud DLP API must be enabled.
  string project_id = 5;

  // Detection logic for profile generation.
  //
  // Not all template features are used by profiles. FindingLimits,
  // include_quote and exclude_info_types have no impact on
  // data profiling.
  //
  // Multiple templates may be provided if there is data in multiple regions.
  // At most one template must be specified per-region (including "global").
  // Each region is scanned using the applicable template. If no region-specific
  // template is specified, but a "global" template is specified, it will be
  // copied to that region and used instead. If no global or region-specific
  // template is provided for a region with data, that region's data will not be
  // scanned.
  //
  // For more information, see
  // https://cloud.google.com/sensitive-data-protection/docs/data-profiles#data-residency.
  repeated string inspect_templates = 7;

  // Actions to execute at the completion of the job.
  repeated DataProfileAction data_profile_actions = 6;
}

// A pattern to match against one or more tables, datasets, or projects that
// contain BigQuery tables. At least one pattern must be specified.
// Regular expressions use RE2
// [syntax](https://github.com/google/re2/wiki/Syntax); a guide can be found
// under the google/re2 repository on GitHub.
message BigQueryRegex {
  // For organizations, if unset, will match all projects. Has no effect
  // for data profile configurations created within a project.
  string project_id_regex = 1;

  // If unset, this property matches all datasets.
  string dataset_id_regex = 2;

  // If unset, this property matches all tables.
  string table_id_regex = 3;
}

// A collection of regular expressions to determine what tables to match
// against.
message BigQueryRegexes {
  // A single BigQuery regular expression pattern to match against one or more
  // tables, datasets, or projects that contain BigQuery tables.
  repeated BigQueryRegex patterns = 1;
}

// The types of BigQuery tables supported by Cloud DLP.
message BigQueryTableTypes {
  // A set of BigQuery table types.
  repeated BigQueryTableType types = 1;
}

// Over time new types may be added. Currently VIEW, MATERIALIZED_VIEW,
// and SNAPSHOT are not supported.
enum BigQueryTableTypeCollection {
  // Unused.
  BIG_QUERY_COLLECTION_UNSPECIFIED = 0;

  // Automatically generate profiles for all tables, even if the table type is
  // not yet fully supported for analysis. Profiles for unsupported tables will
  // be generated with errors to indicate their partial support. When full
  // support is added, the tables will automatically be profiled during the next
  // scheduled run.
  BIG_QUERY_COLLECTION_ALL_TYPES = 1;

  // Only those types fully supported will be profiled. Will expand
  // automatically as Cloud DLP adds support for new table types. Unsupported
  // table types will not have partial profiles generated.
  BIG_QUERY_COLLECTION_ONLY_SUPPORTED_TYPES = 2;
}

// Over time new types may be added. Currently VIEW, MATERIALIZED_VIEW,
// SNAPSHOT, and non-BigLake external tables are not supported.
enum BigQueryTableType {
  // Unused.
  BIG_QUERY_TABLE_TYPE_UNSPECIFIED = 0;

  // A normal BigQuery table.
  BIG_QUERY_TABLE_TYPE_TABLE = 1;

  // A table that references data stored in Cloud Storage.
  BIG_QUERY_TABLE_TYPE_EXTERNAL_BIG_LAKE = 2;
}

// How frequently data profiles can be updated. New options can be added at a
// later time.
enum DataProfileUpdateFrequency {
  // Unspecified.
  UPDATE_FREQUENCY_UNSPECIFIED = 0;

  // After the data profile is created, it will never be updated.
  UPDATE_FREQUENCY_NEVER = 1;

  // The data profile can be updated up to once every 24 hours.
  UPDATE_FREQUENCY_DAILY = 2;

  // The data profile can be updated up to once every 30 days. Default.
  UPDATE_FREQUENCY_MONTHLY = 4;
}

// Do not profile the tables.
message Disabled {}

// The data that will be profiled.
message DataProfileLocation {
  // The location to be scanned.
  oneof location {
    // The ID of an organization to scan.
    int64 organization_id = 1;

    // The ID of the Folder within an organization to scan.
    int64 folder_id = 2;
  }
}

// Configuration for discovery to scan resources for profile generation.
// Only one discovery configuration may exist per organization, folder,
// or project.
//
// The generated data profiles are retained according to the
// [data retention policy]
// (https://cloud.google.com/sensitive-data-protection/docs/data-profiles#retention).
message DiscoveryConfig {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/DiscoveryConfig"
    pattern: "projects/{project}/locations/{location}/discoveryConfigs/{discovery_config}"
  };

  // Project and scan location information. Only set when the parent is an org.
  message OrgConfig {
    // The data to scan: folder, org, or project
    DiscoveryStartingLocation location = 1;

    // The project that will run the scan. The DLP service
    // account that exists within this project must have access to all resources
    // that are profiled, and the Cloud DLP API must be enabled.
    string project_id = 2;
  }

  // Whether the discovery config is currently active. New options may be added
  // at a later time.
  enum Status {
    // Unused
    STATUS_UNSPECIFIED = 0;

    // The discovery config is currently active.
    RUNNING = 1;

    // The discovery config is paused temporarily.
    PAUSED = 2;
  }

  // Unique resource name for the DiscoveryConfig, assigned by the service when
  // the DiscoveryConfig is created, for example
  // `projects/dlp-test-project/locations/global/discoveryConfigs/53234423`.
  string name = 1;

  // Display name (max 100 chars)
  string display_name = 11;

  // Only set when the parent is an org.
  OrgConfig org_config = 2;

  // Detection logic for profile generation.
  //
  // Not all template features are used by Discovery. FindingLimits,
  // include_quote and exclude_info_types have no impact on
  // Discovery.
  //
  // Multiple templates may be provided if there is data in multiple regions.
  // At most one template must be specified per-region (including "global").
  // Each region is scanned using the applicable template. If no region-specific
  // template is specified, but a "global" template is specified, it will be
  // copied to that region and used instead. If no global or region-specific
  // template is provided for a region with data, that region's data will not be
  // scanned.
  //
  // For more information, see
  // https://cloud.google.com/sensitive-data-protection/docs/data-profiles#data-residency.
  repeated string inspect_templates = 3;

  // Actions to execute at the completion of scanning.
  repeated DataProfileAction actions = 4;

  // Target to match against for determining what to scan and how frequently.
  repeated DiscoveryTarget targets = 5;

  // Output only. A stream of errors encountered when the config was activated.
  // Repeated errors may result in the config automatically being paused. Output
  // only field. Will return the last 100 errors. Whenever the config is
  // modified this list will be cleared.
  repeated Error errors = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The creation timestamp of a DiscoveryConfig.
  google.protobuf.Timestamp create_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The last update timestamp of a DiscoveryConfig.
  google.protobuf.Timestamp update_time = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The timestamp of the last time this config was executed.
  google.protobuf.Timestamp last_run_time = 9
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. A status for this configuration.
  Status status = 10 [(google.api.field_behavior) = REQUIRED];
}

// Target used to match against for Discovery.
message DiscoveryTarget {
  // A target to match against for Discovery.
  oneof target {
    // BigQuery target for Discovery. The first target to match a table will be
    // the one applied.
    BigQueryDiscoveryTarget big_query_target = 1;
  }
}

// Target used to match against for discovery with BigQuery tables
message BigQueryDiscoveryTarget {
  // Required. The tables the discovery cadence applies to. The first target
  // with a matching filter will be the one to apply to a table.
  DiscoveryBigQueryFilter filter = 1 [(google.api.field_behavior) = REQUIRED];

  // In addition to matching the filter, these conditions must be true
  // before a profile is generated.
  DiscoveryBigQueryConditions conditions = 2;

  // The generation rule includes the logic on how frequently
  // to update the data profiles. If not specified, discovery will re-run and
  // update no more than once a month if new columns appear in the table.
  oneof frequency {
    // How often and when to update profiles. New tables that match both the
    // filter and conditions are scanned as quickly as possible depending on
    // system capacity.
    DiscoveryGenerationCadence cadence = 3;

    // Tables that match this filter will not have profiles created.
    Disabled disabled = 4;
  }
}

// Determines what tables will have profiles generated within an organization
// or project. Includes the ability to filter by regular expression patterns
// on project ID, dataset ID, and table ID.
message DiscoveryBigQueryFilter {
  // Catch-all for all other tables not specified by other filters. Should
  // always be last, except for single-table configurations, which will only
  // have a TableReference target.
  message AllOtherBigQueryTables {}

  // Whether the filter applies to a specific set of tables or all other tables
  // within the location being profiled. The first filter to match will be
  // applied, regardless of the condition. If none is set, will default to
  // `other_tables`.
  oneof filter {
    // A specific set of tables for this filter to apply to. A table collection
    // must be specified in only one filter per config.
    // If a table id or dataset is empty, Cloud DLP assumes all tables in that
    // collection must be profiled. Must specify a project ID.
    BigQueryTableCollection tables = 1;

    // Catch-all. This should always be the last filter in the list because
    // anything above it will apply first. Should only appear once in a
    // configuration. If none is specified, a default one will be added
    // automatically.
    AllOtherBigQueryTables other_tables = 2;
  }
}

// Specifies a collection of BigQuery tables. Used for Discovery.
message BigQueryTableCollection {
  // Maximum of 100 entries.
  // The first filter containing a pattern that matches a table will be used.
  oneof pattern {
    // A collection of regular expressions to match a BigQuery table against.
    BigQueryRegexes include_regexes = 1;
  }
}

// Requirements that must be true before a table is scanned in discovery for the
// first time. There is an AND relationship between the top-level attributes.
// Additionally, minimum conditions with an OR relationship that must be met
// before Cloud DLP scans a table can be set (like a minimum row count or a
// minimum table age).
message DiscoveryBigQueryConditions {
  // There is an OR relationship between these attributes. They are used to
  // determine if a table should be scanned or not in Discovery.
  message OrConditions {
    // Minimum number of rows that should be present before Cloud DLP
    // profiles a table
    int32 min_row_count = 1;

    // Minimum age a table must have before Cloud DLP can profile it. Value must
    // be 1 hour or greater.
    google.protobuf.Duration min_age = 2;
  }

  // BigQuery table must have been created after this date. Used to avoid
  // backfilling.
  google.protobuf.Timestamp created_after = 1;

  // The type of BigQuery tables to scan. If nothing is set the default
  // behavior is to scan only tables of type TABLE and to give errors
  // for all unsupported tables.
  oneof included_types {
    // Restrict discovery to specific table types.
    BigQueryTableTypes types = 2;

    // Restrict discovery to categories of table types.
    BigQueryTableTypeCollection type_collection = 3;
  }

  // At least one of the conditions must be true for a table to be scanned.
  OrConditions or_conditions = 4;
}

// What must take place for a profile to be updated and how
// frequently it should occur.
// New tables are scanned as quickly as possible depending on system
// capacity.
message DiscoveryGenerationCadence {
  // Governs when to update data profiles when a schema is modified.
  DiscoverySchemaModifiedCadence schema_modified_cadence = 1;

  // Governs when to update data profiles when a table is modified.
  DiscoveryTableModifiedCadence table_modified_cadence = 2;
}

// The cadence at which to update data profiles when a table is modified.
message DiscoveryTableModifiedCadence {
  // The type of events to consider when deciding if the table has been
  // modified and should have the profile updated. Defaults to
  // MODIFIED_TIMESTAMP.
  repeated BigQueryTableModification types = 1;

  // How frequently data profiles can be updated when tables are modified.
  // Defaults to never.
  DataProfileUpdateFrequency frequency = 2;
}

// Attributes evaluated to determine if a table has been modified. New values
// may be added at a later time.
enum BigQueryTableModification {
  // Unused.
  TABLE_MODIFICATION_UNSPECIFIED = 0;

  // A table will be considered modified when the last_modified_time from
  // BigQuery has been updated.
  TABLE_MODIFIED_TIMESTAMP = 1;
}

// The cadence at which to update data profiles when a schema is modified.
message DiscoverySchemaModifiedCadence {
  // The type of events to consider when deciding if the table's schema
  // has been modified and should have the profile updated. Defaults to
  // NEW_COLUMNS.
  repeated BigQuerySchemaModification types = 1;

  // How frequently profiles may be updated when schemas are
  // modified. Defaults to monthly.
  DataProfileUpdateFrequency frequency = 2;
}

// Attributes evaluated to determine if a schema has been modified. New values
// may be added at a later time.
enum BigQuerySchemaModification {
  // Unused
  SCHEMA_MODIFICATION_UNSPECIFIED = 0;

  // Profiles should be regenerated when new columns are added to the table.
  // Default.
  SCHEMA_NEW_COLUMNS = 1;

  // Profiles should be regenerated when columns are removed from the table.
  SCHEMA_REMOVED_COLUMNS = 2;
}

// The location to begin a discovery scan. Denotes an organization ID or folder
// ID within an organization.
message DiscoveryStartingLocation {
  // The location to be scanned.
  oneof location {
    // The ID of an organization to scan.
    int64 organization_id = 1;

    // The ID of the Folder within an organization to scan.
    int64 folder_id = 2;
  }
}

// Combines all of the information about a DLP job.
message DlpJob {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/DlpJob"
    pattern: "projects/{project}/dlpJobs/{dlp_job}"
    pattern: "projects/{project}/locations/{location}/dlpJobs/{dlp_job}"
  };

  // Possible states of a job. New items may be added.
  enum JobState {
    // Unused.
    JOB_STATE_UNSPECIFIED = 0;

    // The job has not yet started.
    PENDING = 1;

    // The job is currently running. Once a job has finished it will transition
    // to FAILED or DONE.
    RUNNING = 2;

    // The job is no longer running.
    DONE = 3;

    // The job was canceled before it could be completed.
    CANCELED = 4;

    // The job had an error and did not complete.
    FAILED = 5;

    // The job is currently accepting findings via hybridInspect.
    // A hybrid job in ACTIVE state may continue to have findings added to it
    // through the calling of hybridInspect. After the job has finished no more
    // calls to hybridInspect may be made. ACTIVE jobs can transition to DONE.
    ACTIVE = 6;
  }

  // The server-assigned name.
  string name = 1;

  // The type of job.
  DlpJobType type = 2;

  // State of a job.
  JobState state = 3;

  // Job details.
  oneof details {
    // Results from analyzing risk of a data source.
    AnalyzeDataSourceRiskDetails risk_details = 4;

    // Results from inspecting a data source.
    InspectDataSourceDetails inspect_details = 5;
  }

  // Time when the job was created.
  google.protobuf.Timestamp create_time = 6;

  // Time when the job started.
  google.protobuf.Timestamp start_time = 7;

  // Time when the job finished.
  google.protobuf.Timestamp end_time = 8;

  // Time when the job was last modified by the system.
  google.protobuf.Timestamp last_modified = 15;

  // If created by a job trigger, the resource name of the trigger that
  // instantiated the job.
  string job_trigger_name = 10;

  // A stream of errors encountered running the job.
  repeated Error errors = 11;

  // Events that should occur after the job has completed.
  repeated ActionDetails action_details = 12;
}

// The request message for [DlpJobs.GetDlpJob][].
message GetDlpJobRequest {
  // Required. The name of the DlpJob resource.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/DlpJob" }
  ];
}

// The request message for listing DLP jobs.
message ListDlpJobsRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on whether you have [specified a
  // processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 4 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/DlpJob"
    }
  ];

  // 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 name of the trigger that created the job.
  //     - 'end_time` - Corresponds to the time the job finished.
  //     - 'start_time` - Corresponds to the time the job finished.
  // * Supported fields for risk analysis jobs:
  //     - `state` - RUNNING|CANCELED|FINISHED|FAILED
  //     - 'end_time` - Corresponds to the time the job finished.
  //     - 'start_time` - Corresponds to the 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.
  string filter = 1;

  // The standard list page size.
  int32 page_size = 2;

  // The standard list page token.
  string page_token = 3;

  // The type of job. Defaults to `DlpJobType.INSPECT`
  DlpJobType type = 5;

  // Comma separated list of fields to order by,
  // followed by `asc` or `desc` postfix. This list is case insensitive. The
  // 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 the time the job was created.
  // - `end_time`: corresponds to the time the job ended.
  // - `name`: corresponds to the job's name.
  // - `state`: corresponds to `state`
  string order_by = 6;

  // Deprecated. This field has no effect.
  string location_id = 7;
}

// The response message for listing DLP jobs.
message ListDlpJobsResponse {
  // A list of DlpJobs that matches the specified filter in the request.
  repeated DlpJob jobs = 1;

  // The standard List next-page token.
  string next_page_token = 2;
}

// The request message for canceling a DLP job.
message CancelDlpJobRequest {
  // Required. The name of the DlpJob resource to be cancelled.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/DlpJob" }
  ];
}

// The request message for finishing a DLP hybrid job.
message FinishDlpJobRequest {
  // Required. The name of the DlpJob resource to be finished.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/DlpJob" }
  ];
}

// The request message for deleting a DLP job.
message DeleteDlpJobRequest {
  // Required. The name of the DlpJob resource to be deleted.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/DlpJob" }
  ];
}

// Request message for CreateDeidentifyTemplate.
message CreateDeidentifyTemplateRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on the scope of the request
  // (project or organization) and whether you have [specified a processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  // + Organizations scope, location specified:<br/>
  //   `organizations/`<var>ORG_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Organizations scope, no location specified (defaults to global):<br/>
  //   `organizations/`<var>ORG_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/DeidentifyTemplate"
    }
  ];

  // Required. The DeidentifyTemplate to create.
  DeidentifyTemplate deidentify_template = 2
      [(google.api.field_behavior) = REQUIRED];

  // 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.
  string template_id = 3;

  // Deprecated. This field has no effect.
  string location_id = 4;
}

// Request message for UpdateDeidentifyTemplate.
message UpdateDeidentifyTemplateRequest {
  // Required. Resource name of organization and deidentify template to be
  // updated, for example
  // `organizations/433245324/deidentifyTemplates/432452342` or
  // projects/project-id/deidentifyTemplates/432452342.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/DeidentifyTemplate"
    }
  ];

  // New DeidentifyTemplate value.
  DeidentifyTemplate deidentify_template = 2;

  // Mask to control which fields get updated.
  google.protobuf.FieldMask update_mask = 3;
}

// Request message for GetDeidentifyTemplate.
message GetDeidentifyTemplateRequest {
  // Required. Resource name of the organization and deidentify template to be
  // read, for example `organizations/433245324/deidentifyTemplates/432452342`
  // or projects/project-id/deidentifyTemplates/432452342.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/DeidentifyTemplate"
    }
  ];
}

// Request message for ListDeidentifyTemplates.
message ListDeidentifyTemplatesRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on the scope of the request
  // (project or organization) and whether you have [specified a processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  // + Organizations scope, location specified:<br/>
  //   `organizations/`<var>ORG_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Organizations scope, no location specified (defaults to global):<br/>
  //   `organizations/`<var>ORG_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/DeidentifyTemplate"
    }
  ];

  // Page token to continue retrieval. Comes from the previous call
  // to `ListDeidentifyTemplates`.
  string page_token = 2;

  // Size of the page. This value can be limited by the server. If zero server
  // returns a page of max size 100.
  int32 page_size = 3;

  // Comma separated list of fields to order by,
  // followed by `asc` or `desc` postfix. This list is case insensitive. The
  // 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 the time the template was created.
  // - `update_time`: corresponds to the time the template was last updated.
  // - `name`: corresponds to the template's name.
  // - `display_name`: corresponds to the template's display name.
  string order_by = 4;

  // Deprecated. This field has no effect.
  string location_id = 5;
}

// Response message for ListDeidentifyTemplates.
message ListDeidentifyTemplatesResponse {
  // List of deidentify templates, up to page_size in
  // ListDeidentifyTemplatesRequest.
  repeated DeidentifyTemplate deidentify_templates = 1;

  // If the next page is available then the next page token to be used in the
  // following ListDeidentifyTemplates request.
  string next_page_token = 2;
}

// Request message for DeleteDeidentifyTemplate.
message DeleteDeidentifyTemplateRequest {
  // Required. Resource name of the organization and deidentify template to be
  // deleted, for example
  // `organizations/433245324/deidentifyTemplates/432452342` or
  // projects/project-id/deidentifyTemplates/432452342.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/DeidentifyTemplate"
    }
  ];
}

// 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/sensitive-data-protection/limits) page. The
// artifacts of dictionary creation are stored in the specified Cloud Storage
// location. Consider using `CustomInfoType.Dictionary` for smaller dictionaries
// that satisfy the size requirements.
message LargeCustomDictionaryConfig {
  // Location to store dictionary artifacts in 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.
  CloudStoragePath output_path = 1;

  // Source of the dictionary.
  oneof source {
    // Set of files containing newline-delimited lists of dictionary phrases.
    CloudStorageFileSet cloud_storage_file_set = 2;

    // Field in a BigQuery table where each cell represents a dictionary phrase.
    BigQueryField big_query_field = 3;
  }
}

// Summary statistics of a custom dictionary.
message LargeCustomDictionaryStats {
  // Approximate number of distinct phrases in the dictionary.
  int64 approx_num_phrases = 1;
}

// Configuration for stored infoTypes. All fields and subfield are provided
// by the user. For more information, see
// https://cloud.google.com/sensitive-data-protection/docs/creating-custom-infotypes.
message StoredInfoTypeConfig {
  // Display name of the StoredInfoType (max 256 characters).
  string display_name = 1;

  // Description of the StoredInfoType (max 256 characters).
  string description = 2;

  // Stored infotype types.
  oneof type {
    // StoredInfoType where findings are defined by a dictionary of phrases.
    LargeCustomDictionaryConfig large_custom_dictionary = 3;

    // Store dictionary-based CustomInfoType.
    CustomInfoType.Dictionary dictionary = 4;

    // Store regular expression-based StoredInfoType.
    CustomInfoType.Regex regex = 5;
  }
}

// Statistics for a StoredInfoType.
message StoredInfoTypeStats {
  // Stat types
  oneof type {
    // StoredInfoType where findings are defined by a dictionary of phrases.
    LargeCustomDictionaryStats large_custom_dictionary = 1;
  }
}

// Version of a StoredInfoType, including the configuration used to build it,
// create timestamp, and current state.
message StoredInfoTypeVersion {
  // StoredInfoType configuration.
  StoredInfoTypeConfig config = 1;

  // Create timestamp of the version. Read-only, determined by the system
  // when the version is created.
  google.protobuf.Timestamp create_time = 2;

  // Stored info type version state. Read-only, updated by the system
  // during dictionary creation.
  StoredInfoTypeState state = 3;

  // 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 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.
  repeated Error errors = 4;

  // Statistics about this storedInfoType version.
  StoredInfoTypeStats stats = 5;
}

// StoredInfoType resource message that contains information about the current
// version and any pending updates.
message StoredInfoType {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/StoredInfoType"
    pattern: "organizations/{organization}/storedInfoTypes/{stored_info_type}"
    pattern: "projects/{project}/storedInfoTypes/{stored_info_type}"
    pattern: "organizations/{organization}/locations/{location}/storedInfoTypes/{stored_info_type}"
    pattern: "projects/{project}/locations/{location}/storedInfoTypes/{stored_info_type}"
  };

  // Resource name.
  string name = 1;

  // Current version of the stored info type.
  StoredInfoTypeVersion current_version = 2;

  // Pending versions of the stored info type. Empty if no versions are
  // pending.
  repeated StoredInfoTypeVersion pending_versions = 3;
}

// Request message for CreateStoredInfoType.
message CreateStoredInfoTypeRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on the scope of the request
  // (project or organization) and whether you have [specified a processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  // + Organizations scope, location specified:<br/>
  //   `organizations/`<var>ORG_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Organizations scope, no location specified (defaults to global):<br/>
  //   `organizations/`<var>ORG_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/StoredInfoType"
    }
  ];

  // Required. Configuration of the storedInfoType to create.
  StoredInfoTypeConfig config = 2 [(google.api.field_behavior) = REQUIRED];

  // 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.
  string stored_info_type_id = 3;

  // Deprecated. This field has no effect.
  string location_id = 4;
}

// Request message for UpdateStoredInfoType.
message UpdateStoredInfoTypeRequest {
  // Required. Resource name of organization and storedInfoType to be updated,
  // for example `organizations/433245324/storedInfoTypes/432452342` or
  // projects/project-id/storedInfoTypes/432452342.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/StoredInfoType"
    }
  ];

  // Updated configuration for the storedInfoType. If not provided, a new
  // version of the storedInfoType will be created with the existing
  // configuration.
  StoredInfoTypeConfig config = 2;

  // Mask to control which fields get updated.
  google.protobuf.FieldMask update_mask = 3;
}

// Request message for GetStoredInfoType.
message GetStoredInfoTypeRequest {
  // Required. Resource name of the organization and storedInfoType to be read,
  // for example `organizations/433245324/storedInfoTypes/432452342` or
  // projects/project-id/storedInfoTypes/432452342.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/StoredInfoType"
    }
  ];
}

// Request message for ListStoredInfoTypes.
message ListStoredInfoTypesRequest {
  // Required. Parent resource name.
  //
  // The format of this value varies depending on the scope of the request
  // (project or organization) and whether you have [specified a processing
  // location](https://cloud.google.com/sensitive-data-protection/docs/specifying-location):
  //
  // + Projects scope, location specified:<br/>
  //   `projects/`<var>PROJECT_ID</var>`/locations/`<var>LOCATION_ID</var>
  // + Projects scope, no location specified (defaults to global):<br/>
  //   `projects/`<var>PROJECT_ID</var>
  //
  // The following example `parent` string specifies a parent project with the
  // identifier `example-project`, and specifies the `europe-west3` location
  // for processing data:
  //
  //     parent=projects/example-project/locations/europe-west3
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/StoredInfoType"
    }
  ];

  // Page token to continue retrieval. Comes from the previous call
  // to `ListStoredInfoTypes`.
  string page_token = 2;

  // Size of the page. This value can be limited by the server. If zero server
  // returns a page of max size 100.
  int32 page_size = 3;

  // Comma separated list of fields to order by,
  // followed by `asc` or `desc` postfix. This list is case insensitive. The
  // 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 the 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.
  string order_by = 4;

  // Deprecated. This field has no effect.
  string location_id = 5;
}

// Response message for ListStoredInfoTypes.
message ListStoredInfoTypesResponse {
  // List of storedInfoTypes, up to page_size in ListStoredInfoTypesRequest.
  repeated StoredInfoType stored_info_types = 1;

  // If the next page is available then the next page token to be used
  // in the following ListStoredInfoTypes request.
  string next_page_token = 2;
}

// Request message for DeleteStoredInfoType.
message DeleteStoredInfoTypeRequest {
  // Required. Resource name of the organization and storedInfoType to be
  // deleted, for example `organizations/433245324/storedInfoTypes/432452342` or
  // projects/project-id/storedInfoTypes/432452342.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/StoredInfoType"
    }
  ];
}

// Request to search for potentially sensitive info in a custom location.
message HybridInspectJobTriggerRequest {
  // Required. Resource name of the trigger to execute a hybrid inspect on, for
  // example `projects/dlp-test-project/jobTriggers/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/JobTrigger" }
  ];

  // The item to inspect.
  HybridContentItem hybrid_item = 3;
}

// Request to search for potentially sensitive info in a custom location.
message HybridInspectDlpJobRequest {
  // Required. Resource name of the job to execute a hybrid inspect on, for
  // example `projects/dlp-test-project/dlpJob/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "dlp.googleapis.com/DlpJob" }
  ];

  // The item to inspect.
  HybridContentItem hybrid_item = 3;
}

// An individual hybrid item to inspect. Will be stored temporarily during
// processing.
message HybridContentItem {
  // The item to inspect.
  ContentItem item = 1;

  // Supplementary information that will be added to each finding.
  HybridFindingDetails finding_details = 2;
}

// Populate to associate additional data with each finding.
message HybridFindingDetails {
  // Details about the container where the content being inspected is from.
  Container container_details = 1;

  // Offset in bytes of the line, from the beginning of the file, where the
  // finding  is located. Populate if the item being scanned is only part of a
  // bigger item, such as a shard of a file and you want to track the absolute
  // position of the finding.
  int64 file_offset = 2;

  // Offset of the row for tables. Populate if the row(s) being scanned are
  // part of a bigger dataset and you want to keep track of their absolute
  // position.
  int64 row_offset = 3;

  // If the container is a table, additional information to make findings
  // meaningful such as the columns that are primary keys. If not known ahead
  // of time, can also be set within each inspect hybrid call and the two
  // will be merged. Note that identifying_fields will only be stored to
  // BigQuery, and only if the BigQuery action has been included.
  TableOptions table_options = 4;

  // Labels to represent user provided metadata about the data being inspected.
  // If configured by the job, some key values may be required.
  // The labels associated with `Finding`'s produced by hybrid
  // inspection.
  //
  // Label keys must be between 1 and 63 characters long and must conform
  // to the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
  //
  // Label values must be between 0 and 63 characters long and must conform
  // to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
  //
  // No more than 10 labels can be associated with a given finding.
  //
  // Examples:
  // * `"environment" : "production"`
  // * `"pipeline" : "etl"`
  map<string, string> labels = 5;
}

// Quota exceeded errors will be thrown once quota has been met.
message HybridInspectResponse {}

// Operators available for comparing the value of fields.
enum RelationalOperator {
  // Unused
  RELATIONAL_OPERATOR_UNSPECIFIED = 0;

  // Equal. Attempts to match even with incompatible types.
  EQUAL_TO = 1;

  // Not equal to. Attempts to match even with incompatible types.
  NOT_EQUAL_TO = 2;

  // Greater than.
  GREATER_THAN = 3;

  // Less than.
  LESS_THAN = 4;

  // Greater than or equals.
  GREATER_THAN_OR_EQUALS = 5;

  // Less than or equals.
  LESS_THAN_OR_EQUALS = 6;

  // Exists
  EXISTS = 7;
}

// 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.
enum MatchingType {
  // Invalid.
  MATCHING_TYPE_UNSPECIFIED = 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
  MATCHING_TYPE_FULL_MATCH = 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
  MATCHING_TYPE_PARTIAL_MATCH = 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
  MATCHING_TYPE_INVERSE_MATCH = 3;
}

// Deprecated and unused.
enum ContentOption {
  // Includes entire content of a file or a data stream.
  CONTENT_UNSPECIFIED = 0;

  // Text content within the data, excluding any metadata.
  CONTENT_TEXT = 1;

  // Images found in the data.
  CONTENT_IMAGE = 2;
}

// Type of metadata containing the finding.
enum MetadataType {
  // Unused
  METADATATYPE_UNSPECIFIED = 0;

  // General file metadata provided by Cloud Storage.
  STORAGE_METADATA = 2;
}

// Parts of the APIs which use certain infoTypes.
enum InfoTypeSupportedBy {
  // Unused.
  ENUM_TYPE_UNSPECIFIED = 0;

  // Supported by the inspect operations.
  INSPECT = 1;

  // Supported by the risk analysis operations.
  RISK_ANALYSIS = 2;
}

// An enum to represent the various types of DLP jobs.
enum DlpJobType {
  // Defaults to INSPECT_JOB.
  DLP_JOB_TYPE_UNSPECIFIED = 0;

  // The job inspected Google Cloud for sensitive data.
  INSPECT_JOB = 1;

  // The job executed a Risk Analysis computation.
  RISK_ANALYSIS_JOB = 2;
}

// State of a StoredInfoType version.
enum StoredInfoTypeState {
  // Unused
  STORED_INFO_TYPE_STATE_UNSPECIFIED = 0;

  // StoredInfoType version is being created.
  PENDING = 1;

  // StoredInfoType version is ready for use.
  READY = 2;

  // StoredInfoType creation failed. All relevant error messages are returned in
  // the `StoredInfoTypeVersion` message.
  FAILED = 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.
  INVALID = 4;
}

// Request to list the profiles generated for a given organization or project.
message ListProjectDataProfilesRequest {
  // Required. organizations/{org_id}/locations/{loc_id}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/ProjectDataProfile"
    }
  ];

  // Page token to continue retrieval.
  string page_token = 2;

  // Size of the page. This value can be limited by the server. If zero, server
  // returns a page of max size 100.
  int32 page_size = 3;

  // Comma separated list of fields to order by, followed by `asc` or `desc`
  // postfix. This list is case insensitive. The default sorting order is
  // ascending. Redundant space characters are insignificant. Only one order
  // field at a time is allowed.
  //
  // Examples:
  // * `project_id`
  // * `sensitivity_level desc`
  //
  // Supported fields are:
  //
  // - `project_id`: GCP project ID
  // - `sensitivity_level`: How sensitive the data in a project is, at most.
  // - `data_risk_level`: How much risk is associated with this data.
  // - `profile_last_generated`: When the profile was last updated in epoch
  // seconds.
  string order_by = 4;

  // 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:
  //     - `sensitivity_level` - HIGH|MODERATE|LOW
  //     - `data_risk_level` - HIGH|MODERATE|LOW
  //     - `status_code` - an RPC status code as defined in
  //     https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
  // * The operator must be `=` or `!=`.
  //
  // Examples:
  //
  // * `project_id = 12345 AND status_code = 1`
  // * `project_id = 12345 AND sensitivity_level = HIGH`
  //
  // The length of this field should be no more than 500 characters.
  string filter = 5;
}

// List of profiles generated for a given organization or project.
message ListProjectDataProfilesResponse {
  // List of data profiles.
  repeated ProjectDataProfile project_data_profiles = 1;

  // The next page token.
  string next_page_token = 2;
}

// Request to list the profiles generated for a given organization or project.
message ListTableDataProfilesRequest {
  // Required. Resource name of the organization or project, for
  // example `organizations/433245324/locations/europe` or
  // `projects/project-id/locations/asia`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/TableDataProfile"
    }
  ];

  // Page token to continue retrieval.
  string page_token = 2;

  // Size of the page. This value can be limited by the server. If zero, server
  // returns a page of max size 100.
  int32 page_size = 3;

  // Comma separated list of fields to order by, followed by `asc` or `desc`
  // postfix. This list is case insensitive. The default sorting order is
  // ascending. Redundant space characters are insignificant. Only one order
  // field at a time is allowed.
  //
  // Examples:
  // * `project_id asc`
  // * `table_id`
  // * `sensitivity_level desc`
  //
  // Supported fields are:
  //
  // - `project_id`: The GCP project ID.
  // - `dataset_id`: The ID of a BigQuery dataset.
  // - `table_id`: The ID of a BigQuery table.
  // - `sensitivity_level`: How sensitive the data in a table is, at most.
  // - `data_risk_level`: How much risk is associated with this data.
  // - `profile_last_generated`: When the profile was last updated in epoch
  // seconds.
  // - `last_modified`: The last time the resource was modified.
  // - `resource_visibility`: Visibility restriction for this resource.
  // - `row_count`: Number of rows in this resource.
  string order_by = 4;

  // 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:
  //     - `project_id` - The GCP project ID.
  //     - `dataset_id` - The BigQuery dataset ID.
  //     - `table_id` - The ID of the BigQuery table.
  //     - `sensitivity_level` - HIGH|MODERATE|LOW
  //     - `data_risk_level` - HIGH|MODERATE|LOW
  //     - `resource_visibility`: PUBLIC|RESTRICTED
  //     - `status_code` - an RPC status code as defined in
  //     https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
  // * The operator must be `=` or `!=`.
  //
  // Examples:
  //
  // * `project_id = 12345 AND status_code = 1`
  // * `project_id = 12345 AND sensitivity_level = HIGH`
  // * `project_id = 12345 AND resource_visibility = PUBLIC`
  //
  // The length of this field should be no more than 500 characters.
  string filter = 5;
}

// List of profiles generated for a given organization or project.
message ListTableDataProfilesResponse {
  // List of data profiles.
  repeated TableDataProfile table_data_profiles = 1;

  // The next page token.
  string next_page_token = 2;
}

// Request to list the profiles generated for a given organization or project.
message ListColumnDataProfilesRequest {
  // Required. Resource name of the organization or project, for
  // example `organizations/433245324/locations/europe` or
  // `projects/project-id/locations/asia`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dlp.googleapis.com/ColumnDataProfile"
    }
  ];

  // Page token to continue retrieval.
  string page_token = 2;

  // Size of the page. This value can be limited by the server. If zero, server
  // returns a page of max size 100.
  int32 page_size = 3;

  // Comma separated list of fields to order by, followed by `asc` or `desc`
  // postfix. This list is case insensitive. The default sorting order is
  // ascending. Redundant space characters are insignificant. Only one order
  // field at a time is allowed.
  //
  // Examples:
  // * `project_id asc`
  // * `table_id`
  // * `sensitivity_level desc`
  //
  // Supported fields are:
  //
  // - `project_id`: The Google Cloud project ID.
  // - `dataset_id`: The ID of a BigQuery dataset.
  // - `table_id`: The ID of a BigQuery table.
  // - `sensitivity_level`: How sensitive the data in a column is, at most.
  // - `data_risk_level`: How much risk is associated with this data.
  // - `profile_last_generated`: When the profile was last updated in epoch
  // seconds.
  string order_by = 4;

  // 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:
  //     - `table_data_profile_name` - The name of the related table data
  //     profile.
  //     - `project_id` - The Google Cloud project ID. (REQUIRED)
  //     - `dataset_id` - The BigQuery dataset ID. (REQUIRED)
  //     - `table_id` - The BigQuery table ID. (REQUIRED)
  //     - `field_id` - The ID of the BigQuery field.
  //     - `info_type` - The infotype detected in the resource.
  //     - `sensitivity_level` - HIGH|MEDIUM|LOW
  //     - `data_risk_level`: How much risk is associated with this data.
  //     - `status_code` - an RPC status code as defined in
  //     https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
  // * The operator must be `=` for project_id, dataset_id, and table_id. Other
  //   filters also support `!=`.
  //
  // Examples:
  //
  // * project_id = 12345 AND status_code = 1
  // * project_id = 12345 AND sensitivity_level = HIGH
  // * project_id = 12345 AND info_type = STREET_ADDRESS
  //
  // The length of this field should be no more than 500 characters.
  string filter = 5;
}

// List of profiles generated for a given organization or project.
message ListColumnDataProfilesResponse {
  // List of data profiles.
  repeated ColumnDataProfile column_data_profiles = 1;

  // The next page token.
  string next_page_token = 2;
}

// Score is a summary of all elements in the data profile.
// A higher number means more risk.
message DataRiskLevel {
  // Various score levels for resources.
  enum DataRiskLevelScore {
    // Unused.
    RISK_SCORE_UNSPECIFIED = 0;

    // Low risk - Lower indication of sensitive data that appears to have
    // additional access restrictions in place or no indication of sensitive
    // data found.
    RISK_LOW = 10;

    // Medium risk - Sensitive data may be present but additional access or fine
    // grain access restrictions appear to be present.  Consider limiting
    // access even further or transform data to mask.
    RISK_MODERATE = 20;

    // High risk – SPII may be present. Access controls may include public
    // ACLs. Exfiltration of data may lead to user data loss. Re-identification
    // of users may be possible. Consider limiting usage and or removing SPII.
    RISK_HIGH = 30;
  }

  // The score applied to the resource.
  DataRiskLevelScore score = 1;
}

// An aggregated profile for this project, based on the resources profiled
// within it.
message ProjectDataProfile {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/ProjectDataProfile"
    pattern: "organizations/{organization}/locations/{location}/projectDataProfiles/{project_data_profile}"
    pattern: "projects/{project}/locations/{location}/projectDataProfiles/{project_data_profile}"
  };
  // The resource name of the profile.
  string name = 1;

  // Project ID that was profiled.
  string project_id = 2;

  // The last time the profile was generated.
  google.protobuf.Timestamp profile_last_generated = 3;

  // The sensitivity score of this project.
  SensitivityScore sensitivity_score = 4;

  // The data risk level of this project.
  DataRiskLevel data_risk_level = 5;

  // Success or error status of the last attempt to profile the project.
  ProfileStatus profile_status = 7;
}

// How broadly the data in the resource has been shared. New items may be added
// over time. A higher number means more restricted.
enum ResourceVisibility {
  // Unused.
  RESOURCE_VISIBILITY_UNSPECIFIED = 0;

  // Visible to any user.
  RESOURCE_VISIBILITY_PUBLIC = 10;

  // Visible only to specific users.
  RESOURCE_VISIBILITY_RESTRICTED = 20;
}

// Snapshot of the configurations used to generate the profile.
message DataProfileConfigSnapshot {
  // A copy of the inspection config used to generate this profile. This
  // is a copy of the inspect_template specified in `DataProfileJobConfig`.
  InspectConfig inspect_config = 2;

  // A copy of the configuration used to generate this profile. This is
  // deprecated, and the DiscoveryConfig field is preferred moving forward.
  // DataProfileJobConfig will still be written here for Discovery in BigQuery
  // for backwards compatibility, but will not be updated with new fields, while
  // DiscoveryConfig will.
  DataProfileJobConfig data_profile_job = 3 [deprecated = true];

  // A copy of the configuration used to generate this profile.
  DiscoveryConfig discovery_config = 4;

  // Name of the inspection template used to generate this profile
  string inspect_template_name = 5;

  // Timestamp when the template was modified
  google.protobuf.Timestamp inspect_template_modified_time = 6;
}

// The profile for a scanned table.
message TableDataProfile {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/TableDataProfile"
    pattern: "organizations/{organization}/locations/{location}/tableDataProfiles/{table_data_profile}"
    pattern: "projects/{project}/locations/{location}/tableDataProfiles/{table_data_profile}"
  };
  // Possible states of a profile. New items may be added.
  enum State {
    // Unused.
    STATE_UNSPECIFIED = 0;

    // The profile is currently running. Once a profile has finished it will
    // transition to DONE.
    RUNNING = 1;

    // The profile is no longer generating.
    // If profile_status.status.code is 0, the profile succeeded, otherwise, it
    // failed.
    DONE = 2;
  }

  // The name of the profile.
  string name = 1;

  // The resource type that was profiled.
  DataSourceType data_source_type = 36;

  // The resource name to the project data profile for this table.
  string project_data_profile = 2;

  // The Google Cloud project ID that owns the resource.
  string dataset_project_id = 24;

  // If supported, the location where the dataset's data is stored.
  // See https://cloud.google.com/bigquery/docs/locations for supported
  // locations.
  string dataset_location = 29;

  // If the resource is BigQuery, the  dataset ID.
  string dataset_id = 25;

  // If the resource is BigQuery, the BigQuery table ID.
  string table_id = 26;

  // The resource name of the resource profiled.
  // https://cloud.google.com/apis/design/resource_names#full_resource_name
  string full_resource = 3;

  // Success or error status from the most recent profile generation attempt.
  // May be empty if the profile is still being generated.
  ProfileStatus profile_status = 21;

  // State of a profile.
  State state = 22;

  // The sensitivity score of this table.
  SensitivityScore sensitivity_score = 5;

  // The data risk level of this table.
  DataRiskLevel data_risk_level = 6;

  // The infoTypes predicted from this table's data.
  repeated InfoTypeSummary predicted_info_types = 27;

  // Other infoTypes found in this table's data.
  repeated OtherInfoTypeSummary other_info_types = 28;

  // The snapshot of the configurations used to generate the profile.
  DataProfileConfigSnapshot config_snapshot = 7;

  // The time when this table was last modified
  google.protobuf.Timestamp last_modified_time = 8;

  // Optional. The time when this table expires.
  google.protobuf.Timestamp expiration_time = 9;

  // The number of columns profiled in the table.
  int64 scanned_column_count = 10;

  // The number of columns skipped in the table because of an error.
  int64 failed_column_count = 11;

  // The size of the table when the profile was generated.
  int64 table_size_bytes = 12;

  // Number of rows in the table when the profile was generated.
  // This will not be populated for BigLake tables.
  int64 row_count = 13;

  // How the table is encrypted.
  EncryptionStatus encryption_status = 14;

  // How broadly a resource has been shared.
  ResourceVisibility resource_visibility = 15;

  // The last time the profile was generated.
  google.protobuf.Timestamp profile_last_generated = 16;

  // The labels applied to the resource at the time the profile was generated.
  map<string, string> resource_labels = 17;

  // The time at which the table was created.
  google.protobuf.Timestamp create_time = 23;
}

// Success or errors for the profile generation.
message ProfileStatus {
  // Profiling status code and optional message. The `status.code` value is 0
  // (default value) for OK.
  google.rpc.Status status = 1;

  // Time when the profile generation status was updated
  google.protobuf.Timestamp timestamp = 3;
}

// How a resource is encrypted.
enum EncryptionStatus {
  // Unused.
  ENCRYPTION_STATUS_UNSPECIFIED = 0;

  // Google manages server-side encryption keys on your behalf.
  ENCRYPTION_GOOGLE_MANAGED = 1;

  // Customer provides the key.
  ENCRYPTION_CUSTOMER_MANAGED = 2;
}

// The infoType details for this column.
message InfoTypeSummary {
  // The infoType.
  InfoType info_type = 1;

  // Not populated for predicted infotypes.
  int32 estimated_prevalence = 2 [deprecated = true];
}

// Infotype details for other infoTypes found within a column.
message OtherInfoTypeSummary {
  // The other infoType.
  InfoType info_type = 1;

  // Approximate percentage of non-null rows that contained data detected by
  // this infotype.
  int32 estimated_prevalence = 2;

  // Whether this infoType was excluded from sensitivity and risk analysis due
  // to factors such as low prevalence (subject to change).
  bool excluded_from_analysis = 3;
}

// Bucketized nullness percentage levels. A higher level means a higher
// percentage of the column is null.
enum NullPercentageLevel {
  // Unused.
  NULL_PERCENTAGE_LEVEL_UNSPECIFIED = 0;

  // Very few null entries.
  NULL_PERCENTAGE_VERY_LOW = 1;

  // Some null entries.
  NULL_PERCENTAGE_LOW = 2;

  // A few null entries.
  NULL_PERCENTAGE_MEDIUM = 3;

  // A lot of null entries.
  NULL_PERCENTAGE_HIGH = 4;
}

// Bucketized uniqueness score levels. A higher uniqueness score is a strong
// signal that the column may contain a unique identifier like user id. A low
// value indicates that the column contains few unique values like booleans or
// other classifiers.
enum UniquenessScoreLevel {
  // Some columns do not have estimated uniqueness. Possible reasons include
  // having too few values.
  UNIQUENESS_SCORE_LEVEL_UNSPECIFIED = 0;

  // Low uniqueness, possibly a boolean, enum or similiarly typed column.
  UNIQUENESS_SCORE_LOW = 1;

  // Medium uniqueness.
  UNIQUENESS_SCORE_MEDIUM = 2;

  // High uniqueness, possibly a column of free text or unique identifiers.
  UNIQUENESS_SCORE_HIGH = 3;
}

// The profile for a scanned column within a table.
message ColumnDataProfile {
  option (google.api.resource) = {
    type: "dlp.googleapis.com/ColumnDataProfile"
    pattern: "organizations/{organization}/locations/{location}/columnDataProfiles/{column_data_profile}"
    pattern: "projects/{project}/locations/{location}/columnDataProfiles/{column_data_profile}"
  };
  // Possible states of a profile. New items may be added.
  enum State {
    // Unused.
    STATE_UNSPECIFIED = 0;

    // The profile is currently running. Once a profile has finished it will
    // transition to DONE.
    RUNNING = 1;

    // The profile is no longer generating.
    // If profile_status.status.code is 0, the profile succeeded, otherwise, it
    // failed.
    DONE = 2;
  }

  // Data types of the data in a column. Types may be added over time.
  enum ColumnDataType {
    // Invalid type.
    COLUMN_DATA_TYPE_UNSPECIFIED = 0;

    // Encoded as a string in decimal format.
    TYPE_INT64 = 1;

    // Encoded as a boolean "false" or "true".
    TYPE_BOOL = 2;

    // Encoded as a number, or string "NaN", "Infinity" or "-Infinity".
    TYPE_FLOAT64 = 3;

    // Encoded as a string value.
    TYPE_STRING = 4;

    // Encoded as a base64 string per RFC 4648, section 4.
    TYPE_BYTES = 5;

    // Encoded as an RFC 3339 timestamp with mandatory "Z" time zone string:
    // 1985-04-12T23:20:50.52Z
    TYPE_TIMESTAMP = 6;

    // Encoded as RFC 3339 full-date format string: 1985-04-12
    TYPE_DATE = 7;

    // Encoded as RFC 3339 partial-time format string: 23:20:50.52
    TYPE_TIME = 8;

    // Encoded as RFC 3339 full-date "T" partial-time: 1985-04-12T23:20:50.52
    TYPE_DATETIME = 9;

    // Encoded as WKT
    TYPE_GEOGRAPHY = 10;

    // Encoded as a decimal string.
    TYPE_NUMERIC = 11;

    // Container of ordered fields, each with a type and field name.
    TYPE_RECORD = 12;

    // Decimal type.
    TYPE_BIGNUMERIC = 13;

    // Json type.
    TYPE_JSON = 14;
  }

  // The possible policy states for a column.
  enum ColumnPolicyState {
    // No policy tags.
    COLUMN_POLICY_STATE_UNSPECIFIED = 0;

    // Column has policy tag applied.
    COLUMN_POLICY_TAGGED = 1;
  }

  // The name of the profile.
  string name = 1;

  // Success or error status from the most recent profile generation attempt.
  // May be empty if the profile is still being generated.
  ProfileStatus profile_status = 17;

  // State of a profile.
  State state = 18;

  // The last time the profile was generated.
  google.protobuf.Timestamp profile_last_generated = 3;

  // The resource name of the table data profile.
  string table_data_profile = 4;

  // The resource name of the resource this column is within.
  string table_full_resource = 5;

  // The Google Cloud project ID that owns the profiled resource.
  string dataset_project_id = 19;

  // The BigQuery location where the dataset's data is stored.
  // See https://cloud.google.com/bigquery/docs/locations for supported
  // locations.
  string dataset_location = 20;

  // The BigQuery dataset ID.
  string dataset_id = 21;

  // The BigQuery table ID.
  string table_id = 22;

  // The name of the column.
  string column = 6;

  // The sensitivity of this column.
  SensitivityScore sensitivity_score = 7;

  // The data risk level for this column.
  DataRiskLevel data_risk_level = 8;

  // If it's been determined this column can be identified as a single type,
  // this will be set. Otherwise the column either has unidentifiable content
  // or mixed types.
  InfoTypeSummary column_info_type = 9;

  // Other types found within this column. List will be unordered.
  repeated OtherInfoTypeSummary other_matches = 10;

  // Approximate percentage of entries being null in the column.
  NullPercentageLevel estimated_null_percentage = 23;

  // Approximate uniqueness of the column.
  UniquenessScoreLevel estimated_uniqueness_score = 24;

  // The likelihood that this column contains free-form text.
  // A value close to 1 may indicate the column is likely to contain
  // free-form or natural language text.
  // Range in 0-1.
  double free_text_score = 13;

  // The data type of a given column.
  ColumnDataType column_type = 14;

  // Indicates if a policy tag has been applied to the column.
  ColumnPolicyState policy_state = 15;
}

// Request to get a project data profile.
message GetProjectDataProfileRequest {
  // Required. Resource name, for example
  // `organizations/12345/locations/us/projectDataProfiles/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/ProjectDataProfile"
    }
  ];
}

// Request to get a table data profile.
message GetTableDataProfileRequest {
  // Required. Resource name, for example
  // `organizations/12345/locations/us/tableDataProfiles/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/TableDataProfile"
    }
  ];
}

// Request to get a column data profile.
message GetColumnDataProfileRequest {
  // Required. Resource name, for example
  // `organizations/12345/locations/us/columnDataProfiles/53234423`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/ColumnDataProfile"
    }
  ];
}

// A condition for determining whether a Pub/Sub should be triggered.
message DataProfilePubSubCondition {
  // Various score levels for resources.
  enum ProfileScoreBucket {
    // Unused.
    PROFILE_SCORE_BUCKET_UNSPECIFIED = 0;

    // High risk/sensitivity detected.
    HIGH = 1;

    // Medium or high risk/sensitivity detected.
    MEDIUM_OR_HIGH = 2;
  }

  // A condition consisting of a value.
  message PubSubCondition {
    // The value for the condition to trigger.
    oneof value {
      // The minimum data risk score that triggers the condition.
      ProfileScoreBucket minimum_risk_score = 1;

      // The minimum sensitivity level that triggers the condition.
      ProfileScoreBucket minimum_sensitivity_score = 2;
    }
  }

  // An expression, consisting of an operator and conditions.
  message PubSubExpressions {
    // Logical operators for conditional checks.
    enum PubSubLogicalOperator {
      // Unused.
      LOGICAL_OPERATOR_UNSPECIFIED = 0;

      // Conditional OR.
      OR = 1;

      // Conditional AND.
      AND = 2;
    }

    // The operator to apply to the collection of conditions.
    PubSubLogicalOperator logical_operator = 1;

    // Conditions to apply to the expression.
    repeated PubSubCondition conditions = 2;
  }

  // An expression.
  PubSubExpressions expressions = 1;
}

// Pub/Sub topic message for a DataProfileAction.PubSubNotification event.
// To receive a message of protocol buffer schema type, convert the message data
// to an object of this proto class.
message DataProfilePubSubMessage {
  // If `DetailLevel` is `TABLE_PROFILE` this will be fully populated.
  // Otherwise, if `DetailLevel` is `RESOURCE_NAME`, then only `name` and
  // `full_resource` will be populated.
  TableDataProfile profile = 1;

  // The event that caused the Pub/Sub message to be sent.
  DataProfileAction.EventType event = 2;
}

// Message used to identify the type of resource being profiled.
message DataSourceType {
  // Output only. An identifying string to the type of resource being profiled.
  // Current values: google/bigquery/table, google/project
  string data_source = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
}
